From 050447aba9738271ada6e424bd011a831fd6d127 Mon Sep 17 00:00:00 2001 From: "S. Elliott Johnson" Date: Mon, 23 Oct 2023 10:39:11 -0400 Subject: [PATCH 0001/1135] feat: Allow bypassing `invalidateAll` in `enhance` (#9889) * feat: Allow bypassing `invalidateAll` in `enhance` * changeset * typedoc * oops * cleanup * Update .changeset/shaggy-trainers-drum.md * technically fixed, though types will have to catch up * Revert "technically fixed, though types will have to catch up" oops, wrong branch This reverts commit a9ae11b6e86d33a4de7eb10c3883404ef3395e3f. * Update .changeset/shaggy-trainers-drum.md Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * Update packages/kit/test/apps/dev-only/package.json Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * fix: Types --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> Co-authored-by: Rich Harris Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/shaggy-trainers-drum.md | 5 ++++ packages/kit/src/exports/public.d.ts | 3 ++- packages/kit/src/runtime/app/forms.js | 22 +++++++++++++--- .../routes/actions/invalidate-all/+layout.js | 5 ++++ .../actions/invalidate-all/+page.server.js | 10 +++++++ .../actions/invalidate-all/+page.svelte | 22 ++++++++++++++++ packages/kit/test/apps/basics/test/test.js | 26 +++++++++++++++++++ 7 files changed, 88 insertions(+), 5 deletions(-) create mode 100644 .changeset/shaggy-trainers-drum.md create mode 100644 packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.svelte diff --git a/.changeset/shaggy-trainers-drum.md b/.changeset/shaggy-trainers-drum.md new file mode 100644 index 000000000000..51a5a328eac3 --- /dev/null +++ b/.changeset/shaggy-trainers-drum.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add `invalidateAll` boolean option to `enhance` callback diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index a8f7751573d9..0a42aaa412ff 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1282,8 +1282,9 @@ export type SubmitFunction< /** * Call this to get the default behavior of a form submission response. * @param options Set `reset: false` if you don't want the `
` values to be reset after a successful submission. + * @param invalidateAll Set `invalidateAll: false` if you don't want the action to call `invalidateAll` after submission. */ - update(options?: { reset: boolean }): Promise; + update(options?: { reset?: boolean; invalidateAll?: boolean }): Promise; }) => void) >; diff --git a/packages/kit/src/runtime/app/forms.js b/packages/kit/src/runtime/app/forms.js index 4b34f93cbca5..d1f6d70323e4 100644 --- a/packages/kit/src/runtime/app/forms.js +++ b/packages/kit/src/runtime/app/forms.js @@ -104,17 +104,25 @@ export function enhance(form_element, submit = () => {}) { /** * @param {{ * action: URL; + * invalidateAll?: boolean; * result: import('@sveltejs/kit').ActionResult; * reset?: boolean * }} opts */ - const fallback_callback = async ({ action, result, reset }) => { + const fallback_callback = async ({ + action, + result, + reset = true, + invalidateAll: shouldInvalidateAll = true + }) => { if (result.type === 'success') { - if (reset !== false) { + if (reset) { // We call reset from the prototype to avoid DOM clobbering HTMLFormElement.prototype.reset.call(form_element); } - await invalidateAll(); + if (shouldInvalidateAll) { + await invalidateAll(); + } } // For success/failure results, only apply action if it belongs to the @@ -222,7 +230,13 @@ export function enhance(form_element, submit = () => {}) { return form_element; }, formElement: form_element, - update: (opts) => fallback_callback({ action, result, reset: opts?.reset }), + update: (opts) => + fallback_callback({ + action, + result, + reset: opts?.reset, + invalidateAll: opts?.invalidateAll + }), // @ts-expect-error generic constraints stuff we don't care about result }); diff --git a/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+layout.js b/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+layout.js new file mode 100644 index 000000000000..8d16ac271d10 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+layout.js @@ -0,0 +1,5 @@ +export function load() { + return { + changes_every_load: new Date() + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.server.js b/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.server.js new file mode 100644 index 000000000000..473c04ab224e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.server.js @@ -0,0 +1,10 @@ +export function load({ url }) { + const invalidate_all = url.searchParams.get('invalidate_all') === 'true'; + return { + invalidate_all + }; +} + +export const actions = { + default: () => {} +}; diff --git a/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.svelte b/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.svelte new file mode 100644 index 000000000000..730050023e0c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/actions/invalidate-all/+page.svelte @@ -0,0 +1,22 @@ + + + +
{data.changes_every_load.toISOString()}
+ + diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 52ac6cbcab81..1fd9e0a67d46 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -868,6 +868,32 @@ test.describe('Matchers', () => { }); test.describe('Actions', () => { + test("invalidateAll = false doesn't invalidate all", async ({ page, javaScriptEnabled }) => { + await page.goto('/actions/invalidate-all?invalidate_all=false'); + const preSubmitContent = await page.locator('pre').textContent(); + await page.click('button'); + // The value that should not change is time-based and might not have the granularity to change + // if we don't give it time to + await page.waitForTimeout(1000); + const postSubmitContent = await page.locator('pre').textContent(); + if (!javaScriptEnabled) { + expect(preSubmitContent).not.toBe(postSubmitContent); + } else { + expect(preSubmitContent).toBe(postSubmitContent); + } + }); + + test('invalidateAll = true does invalidate all', async ({ page }) => { + await page.goto('/actions/invalidate-all?invalidate_all=true'); + const preSubmitContent = await page.locator('pre').textContent(); + await page.click('button'); + // The value that should not change is time-based and might not have the granularity to change + // if we don't give it time to + await page.waitForTimeout(1000); + const postSubmitContent = await page.locator('pre').textContent(); + expect(preSubmitContent).not.toBe(postSubmitContent); + }); + test('Submitting a form with a file input but no enctype="multipart/form-data" logs a warning', async ({ page, javaScriptEnabled From 4ce50ee605a073e4f6e7eec5e7479616b1676863 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:51:07 -0400 Subject: [PATCH 0002/1135] Version Packages (#10910) Co-authored-by: github-actions[bot] --- .changeset/shaggy-trainers-drum.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/shaggy-trainers-drum.md diff --git a/.changeset/shaggy-trainers-drum.md b/.changeset/shaggy-trainers-drum.md deleted file mode 100644 index 51a5a328eac3..000000000000 --- a/.changeset/shaggy-trainers-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: add `invalidateAll` boolean option to `enhance` callback diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index b54dba757fdf..954c6709aa9d 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 1.27.0 + +### Minor Changes + +- feat: add `invalidateAll` boolean option to `enhance` callback ([#9889](https://github.com/sveltejs/kit/pull/9889)) + ## 1.26.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index fc1c00d76913..ad56e22019ff 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "1.26.0", + "version": "1.27.0", "description": "The fastest way to build Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 9446fadc350e..66f9f6e0bee1 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '1.26.0'; +export const VERSION = '1.27.0'; From 1c3b7a00af94bba417a7263dd54fa63f6935603c Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Tue, 24 Oct 2023 01:10:20 +0800 Subject: [PATCH 0003/1135] chore: additional vite 5 test compatibility (#10909) --- packages/kit/test/prerendering/paths-base/vite.config.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kit/test/prerendering/paths-base/vite.config.js b/packages/kit/test/prerendering/paths-base/vite.config.js index 4b90a7655ee5..2857b2592d11 100644 --- a/packages/kit/test/prerendering/paths-base/vite.config.js +++ b/packages/kit/test/prerendering/paths-base/vite.config.js @@ -4,7 +4,9 @@ import { sveltekit } from '@sveltejs/kit/vite'; /** @type {import('vite').UserConfig} */ const config = { build: { - minify: false + minify: false, + // disable inlining to test asset base path + assetsInlineLimit: 0 }, clearScreen: false, From 000c193798a2595e925696ca9225ef1e7a467468 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 23 Oct 2023 11:20:55 -0700 Subject: [PATCH 0004/1135] chore(deps): update actions/setup-node action to v4 (#10912) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/workflows/audit.yml | 2 +- .github/workflows/ci.yml | 8 ++++---- .github/workflows/release.yml | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/.github/workflows/audit.yml b/.github/workflows/audit.yml index 049ebc7508c9..c6f0fd940480 100644 --- a/.github/workflows/audit.yml +++ b/.github/workflows/audit.yml @@ -17,7 +17,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v2.4.0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '20.x' cache: pnpm diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 5c6bd814714b..159422c2655c 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -24,7 +24,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v2.4.0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: '16.x' cache: pnpm @@ -54,7 +54,7 @@ jobs: - run: git config --global core.autocrlf false - uses: actions/checkout@v4 - uses: pnpm/action-setup@v2.4.0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: pnpm @@ -109,7 +109,7 @@ jobs: - run: git config --global core.autocrlf false - uses: actions/checkout@v4 - uses: pnpm/action-setup@v2.4.0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} cache: pnpm @@ -132,7 +132,7 @@ jobs: steps: - uses: actions/checkout@v4 - uses: pnpm/action-setup@v2.4.0 - - uses: actions/setup-node@v3 + - uses: actions/setup-node@v4 with: node-version: 16 cache: pnpm diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7c8960ce40a9..1077995f43e9 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -23,7 +23,7 @@ jobs: fetch-depth: 0 - uses: pnpm/action-setup@v2.4.0 - name: Setup Node.js - uses: actions/setup-node@v3 + uses: actions/setup-node@v4 with: node-version: 16.x cache: pnpm From 060f47e1924235bb6b308ef3c21722cf69c3de49 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:08:39 +0200 Subject: [PATCH 0005/1135] fix: only apply some polyfills below node 18.11 (#10920) * fix: only apply some polyfills below node 18.11 related to #10918 * Update packages/kit/src/exports/node/polyfills.js Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * be more defensive * be more defensive --------- Co-authored-by: Rich Harris Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/mean-cheetahs-tell.md | 5 ++++ packages/kit/src/exports/node/polyfills.js | 28 +++++++++++++++++----- 2 files changed, 27 insertions(+), 6 deletions(-) create mode 100644 .changeset/mean-cheetahs-tell.md diff --git a/.changeset/mean-cheetahs-tell.md b/.changeset/mean-cheetahs-tell.md new file mode 100644 index 000000000000..4efcc38f35aa --- /dev/null +++ b/.changeset/mean-cheetahs-tell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: only apply some polyfills below node 18.11 diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index d1bb58d72b74..2e9f1ec569b5 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -3,11 +3,17 @@ import buffer from 'node:buffer'; import { webcrypto as crypto } from 'node:crypto'; import { fetch, Response, Request, Headers, FormData, File as UndiciFile } from 'undici'; +/** @type {Record} */ +const globals_post_node_18_11 = { + crypto +}; + // @ts-expect-error const File = buffer.File ?? UndiciFile; /** @type {Record} */ -const globals = { +// TODO: remove this once we only support Node 18.11+ (the version multipart/form-data was added) +const globals_pre_node_18_11 = { crypto, fetch, Response, @@ -21,16 +27,26 @@ const globals = { }; // exported for dev/preview and node environments -// TODO: remove this once we only support Node 18.11+ (the version multipart/form-data was added) /** * Make various web APIs available as globals: * - `crypto` - * - `fetch` - * - `Headers` - * - `Request` - * - `Response` + * - `fetch` (only in node < 18.11) + * - `Headers` (only in node < 18.11) + * - `Request` (only in node < 18.11) + * - `Response` (only in node < 18.11) */ export function installPolyfills() { + // Be defensive (we don't know in which environments this is called) and always apply if something goes wrong + let globals = globals_pre_node_18_11; + try { + const version = process.versions.node.split('.').map((n) => parseInt(n, 10)); + if ((version[0] === 18 && version[1] >= 11) || version[0] > 18) { + globals = globals_post_node_18_11; + } + } catch (e) { + // ignore + } + for (const name in globals) { Object.defineProperty(globalThis, name, { enumerable: true, From 1968e153c22f93406b65ec32d99b266c561f3b72 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 25 Oct 2023 19:17:02 +0200 Subject: [PATCH 0006/1135] Version Packages (#10921) Co-authored-by: github-actions[bot] --- .changeset/mean-cheetahs-tell.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/mean-cheetahs-tell.md diff --git a/.changeset/mean-cheetahs-tell.md b/.changeset/mean-cheetahs-tell.md deleted file mode 100644 index 4efcc38f35aa..000000000000 --- a/.changeset/mean-cheetahs-tell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: only apply some polyfills below node 18.11 diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 954c6709aa9d..fa2b344c19b9 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 1.27.1 + +### Patch Changes + +- fix: only apply some polyfills below node 18.11 ([#10920](https://github.com/sveltejs/kit/pull/10920)) + ## 1.27.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index ad56e22019ff..ce09a8c163a4 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "1.27.0", + "version": "1.27.1", "description": "The fastest way to build Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 66f9f6e0bee1..e241b7fa3656 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '1.27.0'; +export const VERSION = '1.27.1'; From 6e967ff1343631932366ae44c45d1b6575d15080 Mon Sep 17 00:00:00 2001 From: Ravi van Rooijen Date: Wed, 25 Oct 2023 19:19:17 +0200 Subject: [PATCH 0007/1135] docs: update FAQ entry on using client-only libraries (#10886) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- documentation/docs/60-appendix/01-faq.md | 37 +++++++++++++----------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/documentation/docs/60-appendix/01-faq.md b/documentation/docs/60-appendix/01-faq.md index 1dfb031c76da..77973618ea52 100644 --- a/documentation/docs/60-appendix/01-faq.md +++ b/documentation/docs/60-appendix/01-faq.md @@ -141,21 +141,24 @@ onMount(() => { }); ``` -Otherwise, if the library has side effects and you'd still prefer to use static imports, check out [vite-plugin-iso-import](https://github.com/bluwy/vite-plugin-iso-import) to support the `?client` import suffix. The import will be stripped out in SSR builds. However, note that you will lose the ability to use VS Code Intellisense if you use this method. - -```js -// @filename: ambient.d.ts -// @lib: ES2015 -declare module 'some-browser-only-library?client'; - -// @filename: index.js -// ---cut--- -import { onMount } from 'svelte'; -import { method } from 'some-browser-only-library?client'; - -onMount(() => { - method('hello world'); -}); +Finally, you may also consider using an `{#await}` block: +```svelte + + + +{#await ComponentConstructor} +

Loading...

+{:then component} + +{:catch error} +

Something went wrong: {error.message}

+{/await} ``` ### How do I use a different backend API server? @@ -234,11 +237,11 @@ yarn set version berry yarn install ``` -**Yarn 3 global cache** +#### Yarn 3 global cache One of the more interesting features of Yarn Berry is the ability to have a single global cache for packages, instead of having multiple copies for each project on the disk. However, setting `enableGlobalCache` to true causes building to fail, so it is recommended to add the following to the `.yarnrc.yml` file: -``` +```yaml nodeLinker: node-modules ``` From 799b9e7cbf29e0b428b0be1d44c6a2631cbe8788 Mon Sep 17 00:00:00 2001 From: Philipp Viereck <105976309+philippviereck@users.noreply.github.com> Date: Wed, 25 Oct 2023 23:54:10 +0200 Subject: [PATCH 0008/1135] feat: add cloudflare cf object to `platform` in `adapter-cloudflare-workers` (#10873) --- .changeset/cuddly-pigs-teach.md | 5 +++++ packages/adapter-cloudflare-workers/ambient.d.ts | 3 ++- packages/adapter-cloudflare-workers/files/entry.js | 4 +++- 3 files changed, 10 insertions(+), 2 deletions(-) create mode 100644 .changeset/cuddly-pigs-teach.md diff --git a/.changeset/cuddly-pigs-teach.md b/.changeset/cuddly-pigs-teach.md new file mode 100644 index 000000000000..a7f3e6b252a7 --- /dev/null +++ b/.changeset/cuddly-pigs-teach.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare-workers': minor +--- + +feat: add cloudflare's `request.cf` object to the `event.platform` property diff --git a/packages/adapter-cloudflare-workers/ambient.d.ts b/packages/adapter-cloudflare-workers/ambient.d.ts index 5978f0dd3850..fbd01afd6557 100644 --- a/packages/adapter-cloudflare-workers/ambient.d.ts +++ b/packages/adapter-cloudflare-workers/ambient.d.ts @@ -1,4 +1,4 @@ -import { CacheStorage } from '@cloudflare/workers-types'; +import { CacheStorage, IncomingRequestCfProperties } from '@cloudflare/workers-types'; declare global { namespace App { @@ -7,6 +7,7 @@ declare global { waitUntil(promise: Promise): void; }; caches: CacheStorage; + cf?: IncomingRequestCfProperties; } } } diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index 0969ba1bbf07..0233f9017ae1 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -71,7 +71,9 @@ export default { env, context, // @ts-expect-error lib.dom is interfering with workers-types - caches + caches, + // @ts-expect-error req is actually a Cloudflare request not a standard request + cf: req.cf }, getClientAddress() { return req.headers.get('cf-connecting-ip'); From 3dc517828c6d7fcc9850d8d2a95100587efcacc2 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 26 Oct 2023 17:05:12 -0700 Subject: [PATCH 0009/1135] chore: upgrade svelte to standardized version 4.2.2 (#10935) --- package.json | 2 +- packages/adapter-static/package.json | 2 +- .../test/apps/prerendered/package.json | 2 +- .../adapter-static/test/apps/spa/package.json | 2 +- packages/create-svelte/package.json | 2 +- .../templates/default/package.json | 2 +- packages/kit/package.json | 2 +- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- packages/kit/test/apps/writes/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../apps/private-dynamic-env/package.json | 2 +- .../package.json | 2 +- .../apps/private-static-env/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-folder/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-module/package.json | 2 +- .../apps/syntax-error/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 2 +- .../test/prerendering/options/package.json | 2 +- .../test/prerendering/paths-base/package.json | 2 +- packages/package/package.json | 2 +- playgrounds/basic/package.json | 2 +- pnpm-lock.yaml | 348 ++++++++---------- sites/kit.svelte.dev/package.json | 2 +- 33 files changed, 192 insertions(+), 220 deletions(-) diff --git a/package.json b/package.json index 26de3310fe0c..9e915598b504 100644 --- a/package.json +++ b/package.json @@ -34,7 +34,7 @@ "playwright": "1.30.0", "prettier": "^2.8.0", "rollup": "^3.7.0", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "typescript": "^4.9.4" }, "packageManager": "pnpm@8.9.2", diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 0a070b6ae962..a6229898227e 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -34,7 +34,7 @@ "@sveltejs/kit": "workspace:^", "@types/node": "^16.18.6", "sirv": "^2.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "typescript": "^4.9.4", "vite": "^4.4.9" }, diff --git a/packages/adapter-static/test/apps/prerendered/package.json b/packages/adapter-static/test/apps/prerendered/package.json index ee51a824ea8a..36e63c85a411 100644 --- a/packages/adapter-static/test/apps/prerendered/package.json +++ b/packages/adapter-static/test/apps/prerendered/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "sirv-cli": "^2.0.2", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "vite": "^4.4.9" }, "type": "module" diff --git a/packages/adapter-static/test/apps/spa/package.json b/packages/adapter-static/test/apps/spa/package.json index bfac503ef925..7b7f1e211a53 100644 --- a/packages/adapter-static/test/apps/spa/package.json +++ b/packages/adapter-static/test/apps/spa/package.json @@ -12,7 +12,7 @@ "@sveltejs/adapter-node": "workspace:^", "@sveltejs/kit": "workspace:^", "sirv-cli": "^2.0.2", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "vite": "^4.4.9" }, "type": "module" diff --git a/packages/create-svelte/package.json b/packages/create-svelte/package.json index 28d4636f3390..56bb08f84536 100644 --- a/packages/create-svelte/package.json +++ b/packages/create-svelte/package.json @@ -23,7 +23,7 @@ "prettier": "^2.8.0", "prettier-plugin-svelte": "^2.10.1", "sucrase": "^3.29.0", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "tiny-glob": "^0.2.9", "vitest": "^0.34.5" }, diff --git a/packages/create-svelte/templates/default/package.json b/packages/create-svelte/templates/default/package.json index b46793b54717..6fa4acfa75e2 100644 --- a/packages/create-svelte/templates/default/package.json +++ b/packages/create-svelte/templates/default/package.json @@ -11,7 +11,7 @@ "@neoconfetti/svelte": "^1.0.0", "@sveltejs/adapter-auto": "workspace:*", "@sveltejs/kit": "workspace:*", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "typescript": "^5.0.0", "vite": "^4.4.9" }, diff --git a/packages/kit/package.json b/packages/kit/package.json index ce09a8c163a4..c1ab45a71b51 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -34,7 +34,7 @@ "dts-buddy": "^0.2.4", "marked": "^9.0.0", "rollup": "^3.7.0", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-preprocess": "^5.0.4", "typescript": "^4.9.4", "vite": "^4.4.9", diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index e5fe6e6b97b2..868abf03f774 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -16,7 +16,7 @@ "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", "dropcss": "^1.0.16", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index bdb34c54a279..449ff21689d1 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -16,7 +16,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index bf986ecd5f35..3246845cb201 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index e44abaed4a9f..0d4e42529d78 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -14,7 +14,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index e4b9fb6697d5..4b42a07ce68a 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -15,7 +15,7 @@ "@sveltejs/adapter-node": "workspace:^", "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 829ff8053b0b..e5015447a9f3 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -14,7 +14,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index 7734357a1e6b..826e99aa909b 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -14,7 +14,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index ca443111f8ee..112a56186745 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index ca443111f8ee..112a56186745 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index 64e6938a7688..e96f1c08bb28 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index 0555ba65c743..214a74dc2e7a 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index 7abec353c7f5..4d886f665aa6 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index 87f24bd14e48..c6d833924e8b 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index 902c36033938..3cbefeb919ee 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index b04150f3ea0d..3531416c6a51 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index 3c619379378d..013f66865e23 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index c72e444292ed..a8f22244271a 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index 3867042f313f..f25eaf7c3c6c 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index 8c0fa0496bcc..4d41e4efcb3a 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -9,7 +9,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9" diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index 80cb01b1e8e7..58e061990584 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -12,7 +12,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9", diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index 424b486f2471..82f3a6061fb4 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9", diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index 4022290cb84e..8a8430aaf9a9 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", "vite": "^4.4.9", diff --git a/packages/package/package.json b/packages/package/package.json index d50adf87b986..86d96f281068 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -20,7 +20,7 @@ "devDependencies": { "@types/node": "^16.18.6", "@types/semver": "^7.5.0", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "svelte-preprocess": "^5.0.4", "typescript": "^4.9.4", "uvu": "^0.5.6" diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index ded519f8be57..b46281b7ce15 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -10,7 +10,7 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:*", "@sveltejs/kit": "workspace:*", - "svelte": "^4.0.5", + "svelte": "^4.2.2", "typescript": "^5.0.0", "vite": "^4.4.9" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e651869c041d..48fce9688bb1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,13 +22,13 @@ importers: version: 15.0.1(rollup@3.7.0) '@sveltejs/eslint-config': specifier: ^6.0.4 - version: 6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.8.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@48.0.0)(eslint@8.45.0)(typescript@4.9.4) + version: 6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@48.0.0)(eslint@8.45.0)(typescript@4.9.4) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 '@typescript-eslint/eslint-plugin': specifier: ^6.0.0 - version: 6.0.0(@typescript-eslint/parser@6.8.0)(eslint@8.45.0)(typescript@4.9.4) + version: 6.0.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@4.9.4) eslint: specifier: ^8.45.0 version: 8.45.0 @@ -37,7 +37,7 @@ importers: version: 9.0.0(eslint@8.45.0) eslint-plugin-svelte: specifier: ^2.31.0 - version: 2.31.0(eslint@8.45.0)(svelte@4.1.2) + version: 2.31.0(eslint@8.45.0)(svelte@4.2.2) eslint-plugin-unicorn: specifier: ^48.0.0 version: 48.0.0(eslint@8.45.0) @@ -51,8 +51,8 @@ importers: specifier: ^3.7.0 version: 3.7.0 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 typescript: specifier: ^4.9.4 version: 4.9.4 @@ -221,8 +221,8 @@ importers: specifier: ^2.0.3 version: 2.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 typescript: specifier: ^4.9.4 version: 4.9.4 @@ -239,8 +239,8 @@ importers: specifier: ^2.0.2 version: 2.0.2 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 vite: specifier: ^4.4.9 version: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) @@ -257,8 +257,8 @@ importers: specifier: ^2.0.2 version: 2.0.2 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 vite: specifier: ^4.4.9 version: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) @@ -317,13 +317,13 @@ importers: version: 2.8.0 prettier-plugin-svelte: specifier: ^2.10.1 - version: 2.10.1(prettier@2.8.0)(svelte@4.1.2) + version: 2.10.1(prettier@2.8.0)(svelte@4.2.2) sucrase: specifier: ^3.29.0 version: 3.29.0 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 tiny-glob: specifier: ^0.2.9 version: 0.2.9 @@ -347,8 +347,8 @@ importers: specifier: workspace:* version: link:../../../kit svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 typescript: specifier: ^5.0.0 version: 5.0.4 @@ -366,7 +366,7 @@ importers: dependencies: '@sveltejs/vite-plugin-svelte': specifier: ^2.4.1 - version: 2.4.1(svelte@4.1.2)(vite@4.4.9) + version: 2.4.1(svelte@4.2.2)(vite@4.4.9) '@types/cookie': specifier: ^0.5.1 version: 0.5.1 @@ -429,11 +429,11 @@ importers: specifier: ^3.7.0 version: 3.7.0 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(postcss@8.4.31)(svelte@4.1.2)(typescript@4.9.4) + version: 5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@4.9.4) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -459,11 +459,11 @@ importers: specifier: ^1.0.16 version: 1.0.16 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -480,11 +480,11 @@ importers: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -501,11 +501,11 @@ importers: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -522,11 +522,11 @@ importers: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -543,11 +543,11 @@ importers: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -567,11 +567,11 @@ importers: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -588,11 +588,11 @@ importers: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -615,11 +615,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -636,11 +636,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -657,11 +657,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -675,11 +675,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -693,11 +693,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -714,11 +714,11 @@ importers: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -732,11 +732,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -750,11 +750,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -768,11 +768,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -786,11 +786,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -804,11 +804,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -822,11 +822,11 @@ importers: specifier: workspace:^ version: link:../../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -840,11 +840,11 @@ importers: specifier: workspace:^ version: link:../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -861,11 +861,11 @@ importers: specifier: workspace:^ version: link:../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -882,11 +882,11 @@ importers: specifier: workspace:^ version: link:../../.. svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-check: specifier: ^3.4.4 - version: 3.4.4(postcss@8.4.31)(svelte@4.1.2) + version: 3.4.4(postcss@8.4.31)(svelte@4.2.2) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -953,7 +953,7 @@ importers: version: 7.5.3 svelte2tsx: specifier: ~0.6.19 - version: 0.6.19(svelte@4.1.2)(typescript@4.9.4) + version: 0.6.19(svelte@4.2.2)(typescript@4.9.4) devDependencies: '@types/node': specifier: ^16.18.6 @@ -962,11 +962,11 @@ importers: specifier: ^7.5.0 version: 7.5.0 svelte: - specifier: ^4.0.5 - version: 4.1.2 + specifier: ^4.2.2 + version: 4.2.2 svelte-preprocess: specifier: ^5.0.4 - version: 5.0.4(postcss@8.4.31)(svelte@4.1.2)(typescript@4.9.4) + version: 5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@4.9.4) typescript: specifier: ^4.9.4 version: 4.9.4 @@ -983,8 +983,8 @@ importers: specifier: workspace:* version: link:../../packages/kit svelte: - specifier: ^4.0.5 - version: 4.2.0 + specifier: ^4.2.2 + version: 4.2.2 typescript: specifier: ^5.0.0 version: 5.0.4 @@ -1015,7 +1015,7 @@ importers: version: link:../../packages/kit '@sveltejs/site-kit': specifier: 6.0.0-next.52 - version: 6.0.0-next.52(@sveltejs/kit@packages+kit)(svelte@4.2.0) + version: 6.0.0-next.52(@sveltejs/kit@packages+kit)(svelte@4.2.2) '@types/d3-geo': specifier: ^3.0.4 version: 3.0.4 @@ -1047,8 +1047,8 @@ importers: specifier: ^3.1.2 version: 3.1.2(typescript@5.0.4) svelte: - specifier: ^4.2.0 - version: 4.2.0 + specifier: ^4.2.2 + version: 4.2.2 tiny-glob: specifier: ^0.2.9 version: 0.2.9 @@ -2000,7 +2000,7 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sveltejs/eslint-config@6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.8.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@48.0.0)(eslint@8.45.0)(typescript@4.9.4): + /@sveltejs/eslint-config@6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@48.0.0)(eslint@8.45.0)(typescript@4.9.4): resolution: {integrity: sha512-U9pwmDs+DbmsnCgTfu6Bacdwqn0DuI1IQNSiQqTgzVyYfaaj+zy9ZoQCiJfxFBGXHkklyXuRHp0KMx346N0lcQ==} peerDependencies: '@typescript-eslint/eslint-plugin': '>= 5' @@ -2011,16 +2011,16 @@ packages: eslint-plugin-unicorn: '>= 47' typescript: '>= 4' dependencies: - '@typescript-eslint/eslint-plugin': 6.0.0(@typescript-eslint/parser@6.8.0)(eslint@8.45.0)(typescript@4.9.4) - '@typescript-eslint/parser': 6.8.0(eslint@8.45.0)(typescript@4.9.4) + '@typescript-eslint/eslint-plugin': 6.0.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.9.0(eslint@8.45.0)(typescript@4.9.4) eslint: 8.45.0 eslint-config-prettier: 9.0.0(eslint@8.45.0) - eslint-plugin-svelte: 2.31.0(eslint@8.45.0)(svelte@4.1.2) + eslint-plugin-svelte: 2.31.0(eslint@8.45.0)(svelte@4.2.2) eslint-plugin-unicorn: 48.0.0(eslint@8.45.0) typescript: 4.9.4 dev: true - /@sveltejs/site-kit@6.0.0-next.52(@sveltejs/kit@packages+kit)(svelte@4.2.0): + /@sveltejs/site-kit@6.0.0-next.52(@sveltejs/kit@packages+kit)(svelte@4.2.2): resolution: {integrity: sha512-r/VoVllvrr9So9LcYT7XRXDK38Q6Fx062gosuTkDztENBw+qGp3hMq1vg9qSomJastmavRzze1cjJnQFgacWMw==} peerDependencies: '@sveltejs/kit': ^1.20.0 @@ -2028,11 +2028,11 @@ packages: dependencies: '@sveltejs/kit': link:packages/kit esm-env: 1.0.0 - svelte: 4.2.0 - svelte-local-storage-store: 0.6.0(svelte@4.2.0) + svelte: 4.2.2 + svelte-local-storage-store: 0.6.0(svelte@4.2.2) dev: true - /@sveltejs/vite-plugin-svelte-inspector@1.0.3(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.1.2)(vite@4.4.9): + /@sveltejs/vite-plugin-svelte-inspector@1.0.3(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.2.2)(vite@4.4.9): resolution: {integrity: sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==} engines: {node: ^14.18.0 || >= 16} peerDependencies: @@ -2040,28 +2040,28 @@ packages: svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@4.1.2)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@4.2.2)(vite@4.4.9) debug: 4.3.4 - svelte: 4.1.2 + svelte: 4.2.2 vite: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) transitivePeerDependencies: - supports-color dev: false - /@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.1.2)(vite@4.4.9): + /@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.2.2)(vite@4.4.9): resolution: {integrity: sha512-bNNKvoRY89ptY7udeBSCmTdCVwkjmMcZ0j/z9J5MuedT8jPjq0zrknAo/jF1sToAza4NVaAgR9AkZoD9oJJmnA==} engines: {node: ^14.18.0 || >= 16} peerDependencies: svelte: ^3.54.0 || ^4.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.3(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.1.2)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte-inspector': 1.0.3(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.2.2)(vite@4.4.9) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.2 - svelte: 4.1.2 - svelte-hmr: 0.15.3(svelte@4.1.2) + svelte: 4.2.2 + svelte-hmr: 0.15.3(svelte@4.2.2) vite: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) vitefu: 0.2.4(vite@4.4.9) transitivePeerDependencies: @@ -2200,7 +2200,7 @@ packages: '@types/node': 16.18.6 dev: true - /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.8.0)(eslint@8.45.0)(typescript@4.9.4): + /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@4.9.4): resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -2212,7 +2212,7 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.8.0(eslint@8.45.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.9.0(eslint@8.45.0)(typescript@4.9.4) '@typescript-eslint/scope-manager': 6.0.0 '@typescript-eslint/type-utils': 6.0.0(eslint@8.45.0)(typescript@4.9.4) '@typescript-eslint/utils': 6.0.0(eslint@8.45.0)(typescript@4.9.4) @@ -2231,8 +2231,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.8.0(eslint@8.45.0)(typescript@4.9.4): - resolution: {integrity: sha512-5tNs6Bw0j6BdWuP8Fx+VH4G9fEPDxnVI7yH1IAPkQH5RUtvKwRoqdecAPdQXv4rSOADAaz1LFBZvZG7VbXivSg==} + /@typescript-eslint/parser@6.9.0(eslint@8.45.0)(typescript@4.9.4): + resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2241,10 +2241,10 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.8.0 - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/typescript-estree': 6.8.0(typescript@4.9.4) - '@typescript-eslint/visitor-keys': 6.8.0 + '@typescript-eslint/scope-manager': 6.9.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/typescript-estree': 6.9.0(typescript@4.9.4) + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 eslint: 8.45.0 typescript: 4.9.4 @@ -2260,12 +2260,12 @@ packages: '@typescript-eslint/visitor-keys': 6.0.0 dev: true - /@typescript-eslint/scope-manager@6.8.0: - resolution: {integrity: sha512-xe0HNBVwCph7rak+ZHcFD6A+q50SMsFwcmfdjs9Kz4qDh5hWhaPhFjRs/SODEhroBI5Ruyvyz9LfwUJ624O40g==} + /@typescript-eslint/scope-manager@6.9.0: + resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/visitor-keys': 6.8.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 dev: true /@typescript-eslint/type-utils@6.0.0(eslint@8.45.0)(typescript@4.9.4): @@ -2293,8 +2293,8 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@6.8.0: - resolution: {integrity: sha512-p5qOxSum7W3k+llc7owEStXlGmSl8FcGvhYt8Vjy7FqEnmkCVlM3P57XQEGj58oqaBWDQXbJDZxwUWMS/EAPNQ==} + /@typescript-eslint/types@6.9.0: + resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -2319,8 +2319,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.8.0(typescript@4.9.4): - resolution: {integrity: sha512-ISgV0lQ8XgW+mvv5My/+iTUdRmGspducmQcDw5JxznasXNnZn3SKNrTRuMsEXv+V/O+Lw9AGcQCfVaOPCAk/Zg==} + /@typescript-eslint/typescript-estree@6.9.0(typescript@4.9.4): + resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2328,8 +2328,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.8.0 - '@typescript-eslint/visitor-keys': 6.8.0 + '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/visitor-keys': 6.9.0 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2368,11 +2368,11 @@ packages: eslint-visitor-keys: 3.4.2 dev: true - /@typescript-eslint/visitor-keys@6.8.0: - resolution: {integrity: sha512-oqAnbA7c+pgOhW2OhGvxm0t1BULX5peQI/rLsNDpGM78EebV3C9IGbX5HNZabuZ6UQrYveCLjKo8Iy/lLlBkkg==} + /@typescript-eslint/visitor-keys@6.9.0: + resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.8.0 + '@typescript-eslint/types': 6.9.0 eslint-visitor-keys: 3.4.3 dev: true @@ -2879,16 +2879,6 @@ packages: estree-walker: 3.0.3 periscopic: 3.1.0 - /code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - dependencies: - '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.1 - acorn: 8.10.0 - estree-walker: 3.0.3 - periscopic: 3.1.0 - dev: true - /color-convert@1.9.3: resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} dependencies: @@ -3383,7 +3373,7 @@ packages: eslint: 8.45.0 dev: true - /eslint-plugin-svelte@2.31.0(eslint@8.45.0)(svelte@4.1.2): + /eslint-plugin-svelte@2.31.0(eslint@8.45.0)(svelte@4.2.2): resolution: {integrity: sha512-Q70jPFRraTkc/giPSfY7yuatmJcb5fPelWNplevqd45gfaJDjc3qXRtWQ6m9U5tWVVYERU9dcdUod294vwD8Gw==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -3403,8 +3393,8 @@ packages: postcss-load-config: 3.1.4(postcss@8.4.31) postcss-safe-parser: 6.0.0(postcss@8.4.31) postcss-selector-parser: 6.0.13 - svelte: 4.1.2 - svelte-eslint-parser: 0.31.0(svelte@4.1.2) + svelte: 4.2.2 + svelte-eslint-parser: 0.31.0(svelte@4.2.2) transitivePeerDependencies: - supports-color - ts-node @@ -4158,12 +4148,6 @@ packages: dependencies: '@types/estree': 1.0.1 - /is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - dependencies: - '@types/estree': 1.0.1 - dev: true - /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} engines: {node: '>= 0.4'} @@ -4519,6 +4503,13 @@ packages: engines: {node: '>=12'} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /magic-string@0.30.5: + resolution: {integrity: sha512-7xlpfBaQaP/T6Vh8MO/EqXSW5En6INHEvEXQiuff7Gku0PWjU3uf6w/j9o7O+SpB5fOAkrI5HeoNgwjEO0pFsA==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/sourcemap-codec': 1.4.15 /make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} @@ -5100,14 +5091,14 @@ packages: engines: {node: '>= 0.8.0'} dev: true - /prettier-plugin-svelte@2.10.1(prettier@2.8.0)(svelte@4.1.2): + /prettier-plugin-svelte@2.10.1(prettier@2.8.0)(svelte@4.2.2): resolution: {integrity: sha512-Wlq7Z5v2ueCubWo0TZzKc9XHcm7TDxqcuzRuGd0gcENfzfT4JZ9yDlCbEgxWgiPmLHkBjfOtpAWkcT28MCDpUQ==} peerDependencies: prettier: ^1.16.4 || ^2.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 dependencies: prettier: 2.8.0 - svelte: 4.1.2 + svelte: 4.2.2 dev: true /prettier@2.8.0: @@ -5725,7 +5716,7 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - /svelte-check@3.4.4(postcss@8.4.31)(svelte@4.1.2): + /svelte-check@3.4.4(postcss@8.4.31)(svelte@4.2.2): resolution: {integrity: sha512-Uys9+R65cj8TmP8f5UpS7B2xKpNLYNxEWJsA5ZoKcWq/uwvABFF7xS6iPQGLoa7hxz0DS6xU60YFpmq06E4JxA==} hasBin: true peerDependencies: @@ -5737,8 +5728,8 @@ packages: import-fresh: 3.3.0 picocolors: 1.0.0 sade: 1.8.1 - svelte: 4.1.2 - svelte-preprocess: 5.0.4(postcss@8.4.31)(svelte@4.1.2)(typescript@5.2.2) + svelte: 4.2.2 + svelte-preprocess: 5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2) typescript: 5.2.2 transitivePeerDependencies: - '@babel/core' @@ -5752,7 +5743,7 @@ packages: - sugarss dev: true - /svelte-eslint-parser@0.31.0(svelte@4.1.2): + /svelte-eslint-parser@0.31.0(svelte@4.2.2): resolution: {integrity: sha512-/31RpBf/e3YjoFphjsyo3JRyN1r4UalGAGafXrZ6EJK4h4COOO0rbfBoen5byGsXnIJKsrlC1lkEd2Vzpq2IDg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: @@ -5766,28 +5757,28 @@ packages: espree: 9.6.1 postcss: 8.4.31 postcss-scss: 4.0.6(postcss@8.4.31) - svelte: 4.1.2 + svelte: 4.2.2 dev: true - /svelte-hmr@0.15.3(svelte@4.1.2): + /svelte-hmr@0.15.3(svelte@4.2.2): resolution: {integrity: sha512-41snaPswvSf8TJUhlkoJBekRrABDXDMdpNpT2tfHIv4JuhgvHqLMhEPGtaQn0BmbNSTkuz2Ed20DF2eHw0SmBQ==} engines: {node: ^12.20 || ^14.13.1 || >= 16} peerDependencies: svelte: ^3.19.0 || ^4.0.0 dependencies: - svelte: 4.1.2 + svelte: 4.2.2 dev: false - /svelte-local-storage-store@0.6.0(svelte@4.2.0): + /svelte-local-storage-store@0.6.0(svelte@4.2.2): resolution: {integrity: sha512-UbCY/yT/YUadU5IX/gZkoRQnA+ebFZHKKQjlJvfWHnBj3CPe9sNn8ndxYz/xy4LUzGjuBLq8+wH5RYK54ba3wA==} engines: {node: '>=0.14'} peerDependencies: svelte: ^3.48.0 || ^4.0.0 dependencies: - svelte: 4.2.0 + svelte: 4.2.2 dev: true - /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.1.2)(typescript@4.9.4): + /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@4.9.4): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -5831,11 +5822,11 @@ packages: postcss: 8.4.31 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.1.2 + svelte: 4.2.2 typescript: 4.9.4 dev: true - /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.1.2)(typescript@5.2.2): + /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -5879,11 +5870,11 @@ packages: postcss: 8.4.31 sorcery: 0.11.0 strip-indent: 3.0.0 - svelte: 4.1.2 + svelte: 4.2.2 typescript: 5.2.2 dev: true - /svelte2tsx@0.6.19(svelte@4.1.2)(typescript@4.9.4): + /svelte2tsx@0.6.19(svelte@4.2.2)(typescript@4.9.4): resolution: {integrity: sha512-h3b5OtcO8zyVL/RiB2zsDwCopeo/UH+887uyhgb2mjnewOFwiTxu+4IGuVwrrlyuh2onM2ktfUemNrNmQwXONQ==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 @@ -5891,12 +5882,12 @@ packages: dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 4.1.2 + svelte: 4.2.2 typescript: 4.9.4 dev: false - /svelte@4.1.2: - resolution: {integrity: sha512-/evA8U6CgOHe5ZD1C1W3va9iJG7mWflcCdghBORJaAhD2JzrVERJty/2gl0pIPrJYBGZwZycH6onYf+64XXF9g==} + /svelte@4.2.2: + resolution: {integrity: sha512-My2tytF2e2NnHSpn2M7/3VdXT4JdTglYVUuSuK/mXL2XtulPYbeBfl8Dm1QiaKRn0zoULRnL+EtfZHHP0k4H3A==} engines: {node: '>=16'} dependencies: '@ampproject/remapping': 2.2.1 @@ -5910,27 +5901,8 @@ packages: estree-walker: 3.0.3 is-reference: 3.0.1 locate-character: 3.0.0 - magic-string: 0.30.3 - periscopic: 3.1.0 - - /svelte@4.2.0: - resolution: {integrity: sha512-kVsdPjDbLrv74SmLSUzAsBGquMs4MPgWGkGLpH+PjOYnFOziAvENVzgJmyOCV2gntxE32aNm8/sqNKD6LbIpeQ==} - engines: {node: '>=16'} - dependencies: - '@ampproject/remapping': 2.2.1 - '@jridgewell/sourcemap-codec': 1.4.15 - '@jridgewell/trace-mapping': 0.3.19 - acorn: 8.10.0 - aria-query: 5.3.0 - axobject-query: 3.2.1 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.2 - locate-character: 3.0.0 - magic-string: 0.30.3 + magic-string: 0.30.5 periscopic: 3.1.0 - dev: true /tar-fs@2.1.1: resolution: {integrity: sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==} diff --git a/sites/kit.svelte.dev/package.json b/sites/kit.svelte.dev/package.json index fa824f97bb25..0896125d469b 100644 --- a/sites/kit.svelte.dev/package.json +++ b/sites/kit.svelte.dev/package.json @@ -27,7 +27,7 @@ "prism-svelte": "^0.5.0", "prismjs": "^1.29.0", "shiki-twoslash": "^3.1.2", - "svelte": "^4.2.0", + "svelte": "^4.2.2", "tiny-glob": "^0.2.9", "typescript": "5.0.4", "vite": "^4.4.9", From daa68148b4351039971caff0b2dc9ab44a73b1d4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Oct 2023 22:40:39 -0700 Subject: [PATCH 0010/1135] Version Packages (#10923) Co-authored-by: github-actions[bot] --- .changeset/cuddly-pigs-teach.md | 5 ----- packages/adapter-cloudflare-workers/CHANGELOG.md | 6 ++++++ packages/adapter-cloudflare-workers/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/cuddly-pigs-teach.md diff --git a/.changeset/cuddly-pigs-teach.md b/.changeset/cuddly-pigs-teach.md deleted file mode 100644 index a7f3e6b252a7..000000000000 --- a/.changeset/cuddly-pigs-teach.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare-workers': minor ---- - -feat: add cloudflare's `request.cf` object to the `event.platform` property diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md index 7ee49c4401af..f681e4b3dea9 100644 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ b/packages/adapter-cloudflare-workers/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-cloudflare-workers +## 1.2.0 + +### Minor Changes + +- feat: add cloudflare's `request.cf` object to the `event.platform` property ([#10873](https://github.com/sveltejs/kit/pull/10873)) + ## 1.1.4 ### Patch Changes diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 2af2481474b2..e50206402c6f 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare-workers", - "version": "1.1.4", + "version": "1.2.0", "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", "repository": { "type": "git", From 8724fa9a119f0cf6bb7fc779110c92278efada01 Mon Sep 17 00:00:00 2001 From: Romain l'Ourson Date: Fri, 27 Oct 2023 16:24:20 +0200 Subject: [PATCH 0011/1135] fix typos in type definition descriptions (#10944) --- packages/kit/src/exports/public.d.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 0a42aaa412ff..d3bbaed15469 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -203,7 +203,7 @@ export interface Cookies { /** * Gets all cookies that were previously set with `cookies.set`, or from the request headers. - * @param opts the options, passed directily to `cookie.parse`. See documentation [here](https://github.com/jshttp/cookie#cookieparsestr-options) + * @param opts the options, passed directly to `cookie.parse`. See documentation [here](https://github.com/jshttp/cookie#cookieparsestr-options) */ getAll(opts?: import('cookie').CookieParseOptions): Array<{ name: string; value: string }>; @@ -215,7 +215,7 @@ export interface Cookies { * By default, the `path` of a cookie is the 'directory' of the current pathname. In most cases you should explicitly set `path: '/'` to make the cookie available throughout your app. * @param name the name of the cookie * @param value the cookie value - * @param opts the options, passed directory to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) + * @param opts the options, passed directly to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ set(name: string, value: string, opts?: import('cookie').CookieSerializeOptions): void; @@ -224,7 +224,7 @@ export interface Cookies { * * By default, the `path` of a cookie is the 'directory' of the current pathname. In most cases you should explicitly set `path: '/'` to make the cookie available throughout your app. * @param name the name of the cookie - * @param opts the options, passed directory to `cookie.serialize`. The `path` must match the path of the cookie you want to delete. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) + * @param opts the options, passed directly to `cookie.serialize`. The `path` must match the path of the cookie you want to delete. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ delete(name: string, opts?: import('cookie').CookieSerializeOptions): void; @@ -237,7 +237,7 @@ export interface Cookies { * * @param name the name of the cookie * @param value the cookie value - * @param opts the options, passed directory to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) + * @param opts the options, passed directly to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ serialize(name: string, value: string, opts?: import('cookie').CookieSerializeOptions): string; } From f706ac544329084f3cf764ebb3fa3f40017d44bb Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sat, 28 Oct 2023 22:20:17 +0800 Subject: [PATCH 0012/1135] fix: ensure `File` is pollyfilled for Node 18.11+ (#10948) --- .changeset/tricky-radios-stare.md | 5 +++++ packages/kit/src/exports/node/polyfills.js | 9 +++++---- 2 files changed, 10 insertions(+), 4 deletions(-) create mode 100644 .changeset/tricky-radios-stare.md diff --git a/.changeset/tricky-radios-stare.md b/.changeset/tricky-radios-stare.md new file mode 100644 index 000000000000..f1d43d426843 --- /dev/null +++ b/.changeset/tricky-radios-stare.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: missing `File` Node polyfill for Node version 18.11.0+ diff --git a/packages/kit/src/exports/node/polyfills.js b/packages/kit/src/exports/node/polyfills.js index 2e9f1ec569b5..46d5e71bce02 100644 --- a/packages/kit/src/exports/node/polyfills.js +++ b/packages/kit/src/exports/node/polyfills.js @@ -3,14 +3,15 @@ import buffer from 'node:buffer'; import { webcrypto as crypto } from 'node:crypto'; import { fetch, Response, Request, Headers, FormData, File as UndiciFile } from 'undici'; +// `buffer.File` was added in Node 18.13.0 while the `File` global was added in Node 20.0.0 +const File = /** @type {import('node:buffer') & { File?: File}} */ (buffer).File ?? UndiciFile; + /** @type {Record} */ const globals_post_node_18_11 = { - crypto + crypto, + File }; -// @ts-expect-error -const File = buffer.File ?? UndiciFile; - /** @type {Record} */ // TODO: remove this once we only support Node 18.11+ (the version multipart/form-data was added) const globals_pre_node_18_11 = { From f9f2b8f12009a070c8154e95ef73e3bfc4407ea0 Mon Sep 17 00:00:00 2001 From: Jac <127185476+Jackesque@users.noreply.github.com> Date: Sun, 29 Oct 2023 23:46:34 +0700 Subject: [PATCH 0013/1135] docs: update recommended GitHub pages config (#10941) Co-authored-by: Tee Ming --- .../docs/25-build-and-deploy/50-adapter-static.md | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/50-adapter-static.md b/documentation/docs/25-build-and-deploy/50-adapter-static.md index ad2a2ce63be8..479ce083f469 100644 --- a/documentation/docs/25-build-and-deploy/50-adapter-static.md +++ b/documentation/docs/25-build-and-deploy/50-adapter-static.md @@ -82,7 +82,9 @@ By default, `adapter-static` checks that either all pages and endpoints (if any) ## GitHub Pages -When building for GitHub Pages, make sure to update [`paths.base`](configuration#paths) to match your repo name, since the site will be served from rather than from the root. +When building for [GitHub Pages](https://docs.github.com/en/pages/getting-started-with-github-pages/about-github-pages), if your repo name is not equivalent to `your-username.github.io`, make sure to update [`config.kit.paths.base`](configuration#paths) to match your repo name. This is because the site will be served from `https://your-username.github.io/your-repo-name` rather than from the root. + +You'll also want to generate a fallback `404.html` page to replace the default 404 page shown by GitHub Pages. A config for GitHub Pages might look like the following: @@ -94,12 +96,15 @@ import adapter from '@sveltejs/adapter-static'; /** @type {import('@sveltejs/kit').Config} */ const config = { kit: { - adapter: adapter() + adapter: adapter({ + fallback: '404.html' + }), + paths: { + base: process.argv.includes('dev') ? '' : process.env.BASE_PATH + } } }; -config.paths = { base: process.argv.includes('dev') ? '' : process.env.BASE_PATH } - export default config; ``` From e08d7936ad41b186553d712f83060f268a618d5c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 09:42:10 +0100 Subject: [PATCH 0014/1135] Version Packages (#10949) Co-authored-by: github-actions[bot] --- .changeset/tricky-radios-stare.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/tricky-radios-stare.md diff --git a/.changeset/tricky-radios-stare.md b/.changeset/tricky-radios-stare.md deleted file mode 100644 index f1d43d426843..000000000000 --- a/.changeset/tricky-radios-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: missing `File` Node polyfill for Node version 18.11.0+ diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index fa2b344c19b9..b97fcfc655ac 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 1.27.2 + +### Patch Changes + +- fix: missing `File` Node polyfill for Node version 18.11.0+ ([#10948](https://github.com/sveltejs/kit/pull/10948)) + ## 1.27.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index c1ab45a71b51..0d28dc9fdfd9 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "1.27.1", + "version": "1.27.2", "description": "The fastest way to build Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index e241b7fa3656..95fa175bb962 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '1.27.1'; +export const VERSION = '1.27.2'; From 8b759b80f9f96f8c6f9bde7441e9b9ea67cf825f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 06:41:42 -0700 Subject: [PATCH 0015/1135] chore(deps): update dependency eslint-plugin-unicorn to v49 (#10957) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- pnpm-lock.yaml | 29 ++++++++++++----------------- 2 files changed, 13 insertions(+), 18 deletions(-) diff --git a/package.json b/package.json index 9e915598b504..c917b53c39b5 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "eslint": "^8.45.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-svelte": "^2.31.0", - "eslint-plugin-unicorn": "^48.0.0", + "eslint-plugin-unicorn": "^49.0.0", "playwright": "1.30.0", "prettier": "^2.8.0", "rollup": "^3.7.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 48fce9688bb1..db148d8d536f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -22,7 +22,7 @@ importers: version: 15.0.1(rollup@3.7.0) '@sveltejs/eslint-config': specifier: ^6.0.4 - version: 6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@48.0.0)(eslint@8.45.0)(typescript@4.9.4) + version: 6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@49.0.0)(eslint@8.45.0)(typescript@4.9.4) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 @@ -39,8 +39,8 @@ importers: specifier: ^2.31.0 version: 2.31.0(eslint@8.45.0)(svelte@4.2.2) eslint-plugin-unicorn: - specifier: ^48.0.0 - version: 48.0.0(eslint@8.45.0) + specifier: ^49.0.0 + version: 49.0.0(eslint@8.45.0) playwright: specifier: 1.30.0 version: 1.30.0 @@ -1087,8 +1087,8 @@ packages: chalk: 2.4.2 dev: true - /@babel/helper-validator-identifier@7.22.5: - resolution: {integrity: sha512-aJXu+6lErq8ltp+JhkJUfk1MTGyuA4v7f3pA+BJ5HLfNC6nAQ0Cpi9uOquUj8Hehg0aUiHzWQbOVJGao6ztBAQ==} + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} engines: {node: '>=6.9.0'} dev: true @@ -1096,7 +1096,7 @@ packages: resolution: {integrity: sha512-78aUtVcT7MUscr0K5mIEnkwxPE0MaxkR5RxRwuHaQ+JuU5AmTPhY+do2mdzVTnIJJpyBglql2pehuBIWHug+WQ==} engines: {node: '>=6.9.0'} dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 chalk: 2.4.2 js-tokens: 4.0.0 dev: true @@ -2000,7 +2000,7 @@ packages: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sveltejs/eslint-config@6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@48.0.0)(eslint@8.45.0)(typescript@4.9.4): + /@sveltejs/eslint-config@6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@49.0.0)(eslint@8.45.0)(typescript@4.9.4): resolution: {integrity: sha512-U9pwmDs+DbmsnCgTfu6Bacdwqn0DuI1IQNSiQqTgzVyYfaaj+zy9ZoQCiJfxFBGXHkklyXuRHp0KMx346N0lcQ==} peerDependencies: '@typescript-eslint/eslint-plugin': '>= 5' @@ -2016,7 +2016,7 @@ packages: eslint: 8.45.0 eslint-config-prettier: 9.0.0(eslint@8.45.0) eslint-plugin-svelte: 2.31.0(eslint@8.45.0)(svelte@4.2.2) - eslint-plugin-unicorn: 48.0.0(eslint@8.45.0) + eslint-plugin-unicorn: 49.0.0(eslint@8.45.0) typescript: 4.9.4 dev: true @@ -3400,13 +3400,13 @@ packages: - ts-node dev: true - /eslint-plugin-unicorn@48.0.0(eslint@8.45.0): - resolution: {integrity: sha512-8fk/v3p1ro34JSVDBEmtOq6EEQRpMR0iTir79q69KnXFZ6DJyPkT3RAi+ZoTqhQMdDSpGh8BGR68ne1sP5cnAA==} + /eslint-plugin-unicorn@49.0.0(eslint@8.45.0): + resolution: {integrity: sha512-0fHEa/8Pih5cmzFW5L7xMEfUTvI9WKeQtjmKpTUmY+BiFCDxkxrTdnURJOHKykhtwIeyYsxnecbGvDCml++z4Q==} engines: {node: '>=16'} peerDependencies: - eslint: '>=8.44.0' + eslint: '>=8.52.0' dependencies: - '@babel/helper-validator-identifier': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) ci-info: 3.8.0 clean-regexp: 1.0.0 @@ -3415,7 +3415,6 @@ packages: indent-string: 4.0.0 is-builtin-module: 3.2.1 jsesc: 3.0.2 - lodash: 4.17.21 pluralize: 8.0.0 read-pkg-up: 7.0.1 regexp-tree: 0.1.27 @@ -4451,10 +4450,6 @@ packages: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} dev: true - /lodash@4.17.21: - resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} - dev: true - /loupe@2.3.6: resolution: {integrity: sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==} dependencies: From 8c4b74cdb9f9bc4de16e7a7cb2dfe38fc9e92db6 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 30 Oct 2023 11:32:50 -0700 Subject: [PATCH 0016/1135] chore: upgrade rollup and eslint (#10960) --- package.json | 6 +- packages/adapter-netlify/package.json | 2 +- packages/kit/package.json | 2 +- pnpm-lock.yaml | 237 +++++++++++++------------- 4 files changed, 120 insertions(+), 127 deletions(-) diff --git a/package.json b/package.json index c917b53c39b5..d640fbab5b08 100644 --- a/package.json +++ b/package.json @@ -27,17 +27,17 @@ "@sveltejs/eslint-config": "^6.0.4", "@svitejs/changesets-changelog-github-compact": "^1.1.0", "@typescript-eslint/eslint-plugin": "^6.0.0", - "eslint": "^8.45.0", + "eslint": "^8.52.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-svelte": "^2.31.0", "eslint-plugin-unicorn": "^49.0.0", "playwright": "1.30.0", "prettier": "^2.8.0", - "rollup": "^3.7.0", + "rollup": "^3.29.4", "svelte": "^4.2.2", "typescript": "^4.9.4" }, - "packageManager": "pnpm@8.9.2", + "packageManager": "pnpm@8.10.0", "engines": { "pnpm": "^8.0.0" } diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index f690d3c931a8..b15c395f5c01 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -45,7 +45,7 @@ "@sveltejs/kit": "workspace:^", "@types/node": "^16.18.6", "@types/set-cookie-parser": "^2.4.2", - "rollup": "^3.7.0", + "rollup": "^3.29.4", "typescript": "^4.9.4", "vitest": "^0.34.5" }, diff --git a/packages/kit/package.json b/packages/kit/package.json index 0d28dc9fdfd9..762e420918d4 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -33,7 +33,7 @@ "@types/set-cookie-parser": "^2.4.2", "dts-buddy": "^0.2.4", "marked": "^9.0.0", - "rollup": "^3.7.0", + "rollup": "^3.29.4", "svelte": "^4.2.2", "svelte-preprocess": "^5.0.4", "typescript": "^4.9.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index db148d8d536f..286c62a5cd0d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,34 +13,34 @@ importers: version: 2.26.0 '@rollup/plugin-commonjs': specifier: ^25.0.0 - version: 25.0.0(rollup@3.7.0) + version: 25.0.0(rollup@3.29.4) '@rollup/plugin-json': specifier: ^6.0.0 - version: 6.0.0(rollup@3.7.0) + version: 6.0.0(rollup@3.29.4) '@rollup/plugin-node-resolve': specifier: ^15.0.1 - version: 15.0.1(rollup@3.7.0) + version: 15.0.1(rollup@3.29.4) '@sveltejs/eslint-config': specifier: ^6.0.4 - version: 6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@49.0.0)(eslint@8.45.0)(typescript@4.9.4) + version: 6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@49.0.0)(eslint@8.52.0)(typescript@4.9.4) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 '@typescript-eslint/eslint-plugin': specifier: ^6.0.0 - version: 6.0.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@4.9.4) + version: 6.0.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@4.9.4) eslint: - specifier: ^8.45.0 - version: 8.45.0 + specifier: ^8.52.0 + version: 8.52.0 eslint-config-prettier: specifier: ^9.0.0 - version: 9.0.0(eslint@8.45.0) + version: 9.0.0(eslint@8.52.0) eslint-plugin-svelte: specifier: ^2.31.0 - version: 2.31.0(eslint@8.45.0)(svelte@4.2.2) + version: 2.31.0(eslint@8.52.0)(svelte@4.2.2) eslint-plugin-unicorn: specifier: ^49.0.0 - version: 49.0.0(eslint@8.45.0) + version: 49.0.0(eslint@8.52.0) playwright: specifier: 1.30.0 version: 1.30.0 @@ -48,8 +48,8 @@ importers: specifier: ^2.8.0 version: 2.8.0 rollup: - specifier: ^3.7.0 - version: 3.7.0 + specifier: ^3.29.4 + version: 3.29.4 svelte: specifier: ^4.2.2 version: 4.2.2 @@ -140,13 +140,13 @@ importers: version: 2.0.2 '@rollup/plugin-commonjs': specifier: ^25.0.0 - version: 25.0.0(rollup@3.7.0) + version: 25.0.0(rollup@3.29.4) '@rollup/plugin-json': specifier: ^6.0.0 - version: 6.0.0(rollup@3.7.0) + version: 6.0.0(rollup@3.29.4) '@rollup/plugin-node-resolve': specifier: ^15.0.1 - version: 15.0.1(rollup@3.7.0) + version: 15.0.1(rollup@3.29.4) '@sveltejs/kit': specifier: workspace:^ version: link:../kit @@ -157,8 +157,8 @@ importers: specifier: ^2.4.2 version: 2.4.2 rollup: - specifier: ^3.7.0 - version: 3.7.0 + specifier: ^3.29.4 + version: 3.29.4 typescript: specifier: ^4.9.4 version: 4.9.4 @@ -170,16 +170,16 @@ importers: dependencies: '@rollup/plugin-commonjs': specifier: ^25.0.0 - version: 25.0.0(rollup@3.7.0) + version: 25.0.0(rollup@3.29.4) '@rollup/plugin-json': specifier: ^6.0.0 - version: 6.0.0(rollup@3.7.0) + version: 6.0.0(rollup@3.29.4) '@rollup/plugin-node-resolve': specifier: ^15.0.1 - version: 15.0.1(rollup@3.7.0) + version: 15.0.1(rollup@3.29.4) rollup: specifier: ^3.7.0 - version: 3.7.0 + version: 3.29.4 devDependencies: '@polka/url': specifier: ^1.0.0-next.21 @@ -426,8 +426,8 @@ importers: specifier: ^9.0.0 version: 9.0.0 rollup: - specifier: ^3.7.0 - version: 3.7.0 + specifier: ^3.29.4 + version: 3.29.4 svelte: specifier: ^4.2.2 version: 4.2.2 @@ -1060,7 +1060,7 @@ importers: version: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) vite-imagetools: specifier: ^6.0.0 - version: 6.0.0(rollup@3.7.0) + version: 6.0.0(rollup@3.29.4) vitest: specifier: ^0.34.5 version: 0.34.5(lightningcss@1.21.8)(playwright@1.30.0) @@ -1706,14 +1706,14 @@ packages: requiresBuild: true optional: true - /@eslint-community/eslint-utils@4.4.0(eslint@8.45.0): + /@eslint-community/eslint-utils@4.4.0(eslint@8.52.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.45.0 - eslint-visitor-keys: 3.4.2 + eslint: 8.52.0 + eslint-visitor-keys: 3.4.3 dev: true /@eslint-community/regexpp@4.6.2: @@ -1721,8 +1721,8 @@ packages: engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} dev: true - /@eslint/eslintrc@2.1.1: - resolution: {integrity: sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==} + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 @@ -1738,8 +1738,8 @@ packages: - supports-color dev: true - /@eslint/js@8.44.0: - resolution: {integrity: sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==} + /@eslint/js@8.52.0: + resolution: {integrity: sha512-mjZVbpaeMZludF2fsWLD0Z9gCref1Tk4i9+wddjRvpUNqqcndPkBD09N/Mapey0b3jaXbLm2kICwFv2E64QinA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true @@ -1752,11 +1752,11 @@ packages: resolution: {integrity: sha512-R5HaONNjI8zzZgjATOrtDhhl58U19OslqNOanPpiHqXV8XWKmFqRF1hIekrWemLfpSTK1WO3wyNcFMZMwkKhlA==} dev: false - /@humanwhocodes/config-array@0.11.10: - resolution: {integrity: sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==} + /@humanwhocodes/config-array@0.11.13: + resolution: {integrity: sha512-JSBDMiDKSzQVngfRjOdFXgFfklaXI4K9nLF49Auh21lmBWRLIK3+xTErTWD4KU54pb6coM6ESE7Awz/FNU3zgQ==} engines: {node: '>=10.10.0'} dependencies: - '@humanwhocodes/object-schema': 1.2.1 + '@humanwhocodes/object-schema': 2.0.1 debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: @@ -1768,8 +1768,8 @@ packages: engines: {node: '>=12.22'} dev: true - /@humanwhocodes/object-schema@1.2.1: - resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + /@humanwhocodes/object-schema@2.0.1: + resolution: {integrity: sha512-dvuCeX5fC9dXgJn9t+X5atfmgQAzUOWqS1254Gh0m6i8wKd10ebXkfNKiRK+1GWi/yTvvLDHpoxLr0xxxeslWw==} dev: true /@iarna/toml@2.2.5: @@ -1913,7 +1913,7 @@ packages: /@polka/url@1.0.0-next.21: resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} - /@rollup/plugin-commonjs@25.0.0(rollup@3.7.0): + /@rollup/plugin-commonjs@25.0.0(rollup@3.29.4): resolution: {integrity: sha512-hoho2Kay9TZrLu0bnDsTTCaj4Npa+THk9snajP/XDNb9a9mmjTjh52EQM9sKl3HD1LsnihX7js+eA2sd2uKAhw==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1922,15 +1922,15 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.7.0) + '@rollup/pluginutils': 5.0.2(rollup@3.29.4) commondir: 1.0.1 estree-walker: 2.0.2 glob: 8.1.0 is-reference: 1.2.1 magic-string: 0.27.0 - rollup: 3.7.0 + rollup: 3.29.4 - /@rollup/plugin-json@6.0.0(rollup@3.7.0): + /@rollup/plugin-json@6.0.0(rollup@3.29.4): resolution: {integrity: sha512-i/4C5Jrdr1XUarRhVu27EEwjt4GObltD7c+MkCIpO2QIbojw8MUs+CCTqOphQi3Qtg1FLmYt+l+6YeoIf51J7w==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1939,10 +1939,10 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.7.0) - rollup: 3.7.0 + '@rollup/pluginutils': 5.0.2(rollup@3.29.4) + rollup: 3.29.4 - /@rollup/plugin-node-resolve@15.0.1(rollup@3.7.0): + /@rollup/plugin-node-resolve@15.0.1(rollup@3.29.4): resolution: {integrity: sha512-ReY88T7JhJjeRVbfCyNj+NXAG3IIsVMsX9b5/9jC98dRP8/yxlZdz7mHZbHk5zHr24wZZICS5AcXsFZAXYUQEg==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1951,13 +1951,13 @@ packages: rollup: optional: true dependencies: - '@rollup/pluginutils': 5.0.2(rollup@3.7.0) + '@rollup/pluginutils': 5.0.2(rollup@3.29.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-builtin-module: 3.2.1 is-module: 1.0.0 resolve: 1.22.4 - rollup: 3.7.0 + rollup: 3.29.4 /@rollup/pluginutils@4.2.1: resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} @@ -1967,7 +1967,7 @@ packages: picomatch: 2.3.1 dev: false - /@rollup/pluginutils@5.0.2(rollup@3.7.0): + /@rollup/pluginutils@5.0.2(rollup@3.29.4): resolution: {integrity: sha512-pTd9rIsP92h+B6wWwFbW8RkZv4hiR/xKsqre4SIuAOaOEQRxi0lqLke9k2/7WegC85GgUs9pjmOjCUi3In4vwA==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1979,9 +1979,9 @@ packages: '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.7.0 + rollup: 3.29.4 - /@rollup/pluginutils@5.0.4(rollup@3.7.0): + /@rollup/pluginutils@5.0.4(rollup@3.29.4): resolution: {integrity: sha512-0KJnIoRI8A+a1dqOYLxH8vBf8bphDmty5QvIm2hqm7oFCFYKCAZWWd2hXgMibaPsNDhI0AtpYfQZJG47pt/k4g==} engines: {node: '>=14.0.0'} peerDependencies: @@ -1993,14 +1993,14 @@ packages: '@types/estree': 1.0.1 estree-walker: 2.0.2 picomatch: 2.3.1 - rollup: 3.7.0 + rollup: 3.29.4 dev: true /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} dev: true - /@sveltejs/eslint-config@6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.0)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@49.0.0)(eslint@8.45.0)(typescript@4.9.4): + /@sveltejs/eslint-config@6.0.4(@typescript-eslint/eslint-plugin@6.0.0)(@typescript-eslint/parser@6.9.1)(eslint-config-prettier@9.0.0)(eslint-plugin-svelte@2.31.0)(eslint-plugin-unicorn@49.0.0)(eslint@8.52.0)(typescript@4.9.4): resolution: {integrity: sha512-U9pwmDs+DbmsnCgTfu6Bacdwqn0DuI1IQNSiQqTgzVyYfaaj+zy9ZoQCiJfxFBGXHkklyXuRHp0KMx346N0lcQ==} peerDependencies: '@typescript-eslint/eslint-plugin': '>= 5' @@ -2011,12 +2011,12 @@ packages: eslint-plugin-unicorn: '>= 47' typescript: '>= 4' dependencies: - '@typescript-eslint/eslint-plugin': 6.0.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@4.9.4) - '@typescript-eslint/parser': 6.9.0(eslint@8.45.0)(typescript@4.9.4) - eslint: 8.45.0 - eslint-config-prettier: 9.0.0(eslint@8.45.0) - eslint-plugin-svelte: 2.31.0(eslint@8.45.0)(svelte@4.2.2) - eslint-plugin-unicorn: 49.0.0(eslint@8.45.0) + '@typescript-eslint/eslint-plugin': 6.0.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@4.9.4) + eslint: 8.52.0 + eslint-config-prettier: 9.0.0(eslint@8.52.0) + eslint-plugin-svelte: 2.31.0(eslint@8.52.0)(svelte@4.2.2) + eslint-plugin-unicorn: 49.0.0(eslint@8.52.0) typescript: 4.9.4 dev: true @@ -2200,7 +2200,7 @@ packages: '@types/node': 16.18.6 dev: true - /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.9.0)(eslint@8.45.0)(typescript@4.9.4): + /@typescript-eslint/eslint-plugin@6.0.0(@typescript-eslint/parser@6.9.1)(eslint@8.52.0)(typescript@4.9.4): resolution: {integrity: sha512-xuv6ghKGoiq856Bww/yVYnXGsKa588kY3M0XK7uUW/3fJNNULKRfZfSBkMTSpqGG/8ZCXCadfh8G/z/B4aqS/A==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -2212,13 +2212,13 @@ packages: optional: true dependencies: '@eslint-community/regexpp': 4.6.2 - '@typescript-eslint/parser': 6.9.0(eslint@8.45.0)(typescript@4.9.4) + '@typescript-eslint/parser': 6.9.1(eslint@8.52.0)(typescript@4.9.4) '@typescript-eslint/scope-manager': 6.0.0 - '@typescript-eslint/type-utils': 6.0.0(eslint@8.45.0)(typescript@4.9.4) - '@typescript-eslint/utils': 6.0.0(eslint@8.45.0)(typescript@4.9.4) + '@typescript-eslint/type-utils': 6.0.0(eslint@8.52.0)(typescript@4.9.4) + '@typescript-eslint/utils': 6.0.0(eslint@8.52.0)(typescript@4.9.4) '@typescript-eslint/visitor-keys': 6.0.0 debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.52.0 grapheme-splitter: 1.0.4 graphemer: 1.4.0 ignore: 5.2.4 @@ -2231,8 +2231,8 @@ packages: - supports-color dev: true - /@typescript-eslint/parser@6.9.0(eslint@8.45.0)(typescript@4.9.4): - resolution: {integrity: sha512-GZmjMh4AJ/5gaH4XF2eXA8tMnHWP+Pm1mjQR2QN4Iz+j/zO04b9TOvJYOX2sCNIQHtRStKTxRY1FX7LhpJT4Gw==} + /@typescript-eslint/parser@6.9.1(eslint@8.52.0)(typescript@4.9.4): + resolution: {integrity: sha512-C7AK2wn43GSaCUZ9do6Ksgi2g3mwFkMO3Cis96kzmgudoVaKyt62yNzJOktP0HDLb/iO2O0n2lBOzJgr6Q/cyg==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 @@ -2241,12 +2241,12 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/scope-manager': 6.9.0 - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/typescript-estree': 6.9.0(typescript@4.9.4) - '@typescript-eslint/visitor-keys': 6.9.0 + '@typescript-eslint/scope-manager': 6.9.1 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/typescript-estree': 6.9.1(typescript@4.9.4) + '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.52.0 typescript: 4.9.4 transitivePeerDependencies: - supports-color @@ -2260,15 +2260,15 @@ packages: '@typescript-eslint/visitor-keys': 6.0.0 dev: true - /@typescript-eslint/scope-manager@6.9.0: - resolution: {integrity: sha512-1R8A9Mc39n4pCCz9o79qRO31HGNDvC7UhPhv26TovDsWPBDx+Sg3rOZdCELIA3ZmNoWAuxaMOT7aWtGRSYkQxw==} + /@typescript-eslint/scope-manager@6.9.1: + resolution: {integrity: sha512-38IxvKB6NAne3g/+MyXMs2Cda/Sz+CEpmm+KLGEM8hx/CvnSRuw51i8ukfwB/B/sESdeTGet1NH1Wj7I0YXswg==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 dev: true - /@typescript-eslint/type-utils@6.0.0(eslint@8.45.0)(typescript@4.9.4): + /@typescript-eslint/type-utils@6.0.0(eslint@8.52.0)(typescript@4.9.4): resolution: {integrity: sha512-ah6LJvLgkoZ/pyJ9GAdFkzeuMZ8goV6BH7eC9FPmojrnX9yNCIsfjB+zYcnex28YO3RFvBkV6rMV6WpIqkPvoQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: @@ -2279,9 +2279,9 @@ packages: optional: true dependencies: '@typescript-eslint/typescript-estree': 6.0.0(typescript@4.9.4) - '@typescript-eslint/utils': 6.0.0(eslint@8.45.0)(typescript@4.9.4) + '@typescript-eslint/utils': 6.0.0(eslint@8.52.0)(typescript@4.9.4) debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.52.0 ts-api-utils: 1.0.1(typescript@4.9.4) typescript: 4.9.4 transitivePeerDependencies: @@ -2293,8 +2293,8 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dev: true - /@typescript-eslint/types@6.9.0: - resolution: {integrity: sha512-+KB0lbkpxBkBSiVCuQvduqMJy+I1FyDbdwSpM3IoBS7APl4Bu15lStPjgBIdykdRqQNYqYNMa8Kuidax6phaEw==} + /@typescript-eslint/types@6.9.1: + resolution: {integrity: sha512-BUGslGOb14zUHOUmDB2FfT6SI1CcZEJYfF3qFwBeUrU6srJfzANonwRYHDpLBuzbq3HaoF2XL2hcr01c8f8OaQ==} engines: {node: ^16.0.0 || >=18.0.0} dev: true @@ -2319,8 +2319,8 @@ packages: - supports-color dev: true - /@typescript-eslint/typescript-estree@6.9.0(typescript@4.9.4): - resolution: {integrity: sha512-NJM2BnJFZBEAbCfBP00zONKXvMqihZCrmwCaik0UhLr0vAgb6oguXxLX1k00oQyD+vZZ+CJn3kocvv2yxm4awQ==} + /@typescript-eslint/typescript-estree@6.9.1(typescript@4.9.4): + resolution: {integrity: sha512-U+mUylTHfcqeO7mLWVQ5W/tMLXqVpRv61wm9ZtfE5egz7gtnmqVIw9ryh0mgIlkKk9rZLY3UHygsBSdB9/ftyw==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: typescript: '*' @@ -2328,8 +2328,8 @@ packages: typescript: optional: true dependencies: - '@typescript-eslint/types': 6.9.0 - '@typescript-eslint/visitor-keys': 6.9.0 + '@typescript-eslint/types': 6.9.1 + '@typescript-eslint/visitor-keys': 6.9.1 debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 @@ -2340,19 +2340,19 @@ packages: - supports-color dev: true - /@typescript-eslint/utils@6.0.0(eslint@8.45.0)(typescript@4.9.4): + /@typescript-eslint/utils@6.0.0(eslint@8.52.0)(typescript@4.9.4): resolution: {integrity: sha512-SOr6l4NB6HE4H/ktz0JVVWNXqCJTOo/mHnvIte1ZhBQ0Cvd04x5uKZa3zT6tiodL06zf5xxdK8COiDvPnQ27JQ==} engines: {node: ^16.0.0 || >=18.0.0} peerDependencies: eslint: ^7.0.0 || ^8.0.0 dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@types/json-schema': 7.0.12 '@types/semver': 7.5.0 '@typescript-eslint/scope-manager': 6.0.0 '@typescript-eslint/types': 6.0.0 '@typescript-eslint/typescript-estree': 6.0.0(typescript@4.9.4) - eslint: 8.45.0 + eslint: 8.52.0 eslint-scope: 5.1.1 semver: 7.5.4 transitivePeerDependencies: @@ -2365,14 +2365,14 @@ packages: engines: {node: ^16.0.0 || >=18.0.0} dependencies: '@typescript-eslint/types': 6.0.0 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 dev: true - /@typescript-eslint/visitor-keys@6.9.0: - resolution: {integrity: sha512-dGtAfqjV6RFOtIP8I0B4ZTBRrlTT8NHHlZZSchQx3qReaoDeXhYM++M4So2AgFK9ZB0emRPA6JI1HkafzA2Ibg==} + /@typescript-eslint/visitor-keys@6.9.1: + resolution: {integrity: sha512-MUaPUe/QRLEffARsmNfmpghuQkW436DvESW+h+M52w0coICHRfD6Np9/K6PdACwnrq1HmuLl+cSPZaJmeVPkSw==} engines: {node: ^16.0.0 || >=18.0.0} dependencies: - '@typescript-eslint/types': 6.9.0 + '@typescript-eslint/types': 6.9.1 eslint-visitor-keys: 3.4.3 dev: true @@ -2402,6 +2402,10 @@ packages: - supports-color dev: true + /@ungap/structured-clone@1.2.0: + resolution: {integrity: sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==} + dev: true + /@vercel/nft@0.24.0: resolution: {integrity: sha512-6TaZleggfN0zsT8QVyOGStYAfKgvfinhpj8jEcdN6Hx6BSWpfkipoM7IVmQd4rCnEgPUFx9zLU2Di6iA0nstUA==} engines: {node: '>=16'} @@ -3364,16 +3368,16 @@ packages: engines: {node: '>=10'} dev: true - /eslint-config-prettier@9.0.0(eslint@8.45.0): + /eslint-config-prettier@9.0.0(eslint@8.52.0): resolution: {integrity: sha512-IcJsTkJae2S35pRsRAwoCE+925rJJStOdkKnLVgtE+tEpqU0EVVM7OqrwxqgptKdX29NUwC82I5pXsGFIgSevw==} hasBin: true peerDependencies: eslint: '>=7.0.0' dependencies: - eslint: 8.45.0 + eslint: 8.52.0 dev: true - /eslint-plugin-svelte@2.31.0(eslint@8.45.0)(svelte@4.2.2): + /eslint-plugin-svelte@2.31.0(eslint@8.52.0)(svelte@4.2.2): resolution: {integrity: sha512-Q70jPFRraTkc/giPSfY7yuatmJcb5fPelWNplevqd45gfaJDjc3qXRtWQ6m9U5tWVVYERU9dcdUod294vwD8Gw==} engines: {node: ^14.17.0 || >=16.0.0} peerDependencies: @@ -3383,10 +3387,10 @@ packages: svelte: optional: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@jridgewell/sourcemap-codec': 1.4.15 debug: 4.3.4 - eslint: 8.45.0 + eslint: 8.52.0 esutils: 2.0.3 known-css-properties: 0.27.0 postcss: 8.4.31 @@ -3400,17 +3404,17 @@ packages: - ts-node dev: true - /eslint-plugin-unicorn@49.0.0(eslint@8.45.0): + /eslint-plugin-unicorn@49.0.0(eslint@8.52.0): resolution: {integrity: sha512-0fHEa/8Pih5cmzFW5L7xMEfUTvI9WKeQtjmKpTUmY+BiFCDxkxrTdnURJOHKykhtwIeyYsxnecbGvDCml++z4Q==} engines: {node: '>=16'} peerDependencies: eslint: '>=8.52.0' dependencies: '@babel/helper-validator-identifier': 7.22.20 - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) ci-info: 3.8.0 clean-regexp: 1.0.0 - eslint: 8.45.0 + eslint: 8.52.0 esquery: 1.5.0 indent-string: 4.0.0 is-builtin-module: 3.2.1 @@ -3439,28 +3443,24 @@ packages: estraverse: 5.3.0 dev: true - /eslint-visitor-keys@3.4.2: - resolution: {integrity: sha512-8drBzUEyZ2llkpCA67iYrgEssKDUu68V8ChqqOfFupIaG/LCVPUT+CoGJpT77zJprs4T/W7p07LP7zAIMuweVw==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - dev: true - /eslint-visitor-keys@3.4.3: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dev: true - /eslint@8.45.0: - resolution: {integrity: sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==} + /eslint@8.52.0: + resolution: {integrity: sha512-zh/JHnaixqHZsolRB/w9/02akBk9EPrOs9JwcTP2ek7yL5bVvXuRariiaAjjoJ5DvuwQ1WAE/HsMz+w17YgBCg==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} hasBin: true dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@8.45.0) + '@eslint-community/eslint-utils': 4.4.0(eslint@8.52.0) '@eslint-community/regexpp': 4.6.2 - '@eslint/eslintrc': 2.1.1 - '@eslint/js': 8.44.0 - '@humanwhocodes/config-array': 0.11.10 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.52.0 + '@humanwhocodes/config-array': 0.11.13 '@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 @@ -3468,7 +3468,7 @@ packages: doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 esquery: 1.5.0 esutils: 2.0.3 @@ -3504,7 +3504,7 @@ packages: dependencies: acorn: 8.10.0 acorn-jsx: 5.3.2(acorn@8.10.0) - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 dev: true /esprima@4.0.1: @@ -5305,15 +5305,8 @@ packages: dependencies: glob: 7.2.3 - /rollup@3.27.2: - resolution: {integrity: sha512-YGwmHf7h2oUHkVBT248x0yt6vZkYQ3/rvE5iQuVBh3WO8GcJ6BNeOkpoX1yMHIiBm18EMLjBPIoUDkhgnyxGOQ==} - engines: {node: '>=14.18.0', npm: '>=8.0.0'} - hasBin: true - optionalDependencies: - fsevents: 2.3.3 - - /rollup@3.7.0: - resolution: {integrity: sha512-FIJe0msW9P7L9BTfvaJyvn1U1BVCNTL3w8O+PKIrCyiMLg+rIUGb4MbcgVZ10Lnm1uWXOTOWRNARjfXC1+M12Q==} + /rollup@3.29.4: + resolution: {integrity: sha512-oWzmBZwvYrU0iJHtDmhsm662rC15FRXmcjCk1xD771dFDx5jJ02ufAQQTn0etB2emNk4J9EZg/yWKpsn9BWGRw==} engines: {node: '>=14.18.0', npm: '>=8.0.0'} hasBin: true optionalDependencies: @@ -5748,7 +5741,7 @@ packages: optional: true dependencies: eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.2 + eslint-visitor-keys: 3.4.3 espree: 9.6.1 postcss: 8.4.31 postcss-scss: 4.0.6(postcss@8.4.31) @@ -6266,11 +6259,11 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-imagetools@6.0.0(rollup@3.7.0): + /vite-imagetools@6.0.0(rollup@3.29.4): resolution: {integrity: sha512-t/k4LXN6+V+otKRM3EAsqG/iHS2Ja8S+biEJWBJk5IKeyQpJ2KZKR5hAn7n5UlNC7J5EzUpiBkUyUFKxGr90fw==} engines: {node: '>=12.0.0'} dependencies: - '@rollup/pluginutils': 5.0.4(rollup@3.7.0) + '@rollup/pluginutils': 5.0.4(rollup@3.29.4) imagetools-core: 5.0.0 transitivePeerDependencies: - rollup @@ -6330,7 +6323,7 @@ packages: esbuild: 0.18.20 lightningcss: 1.21.8 postcss: 8.4.31 - rollup: 3.27.2 + rollup: 3.29.4 optionalDependencies: fsevents: 2.3.3 From a02cc58dc98168509febcef5c00d762d3c6740a3 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 2 Nov 2023 15:30:26 -0700 Subject: [PATCH 0017/1135] chore(site): run prettier on .svelte files (#10971) --- pnpm-lock.yaml | 13 +++++++++++++ sites/kit.svelte.dev/package.json | 5 +++-- .../src/routes/docs/[slug]/+page.svelte | 5 ++++- sites/kit.svelte.dev/src/routes/home/Hero.svelte | 4 +++- sites/kit.svelte.dev/src/routes/search/+page.svelte | 9 ++++++++- 5 files changed, 31 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 286c62a5cd0d..229296e81fb1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1037,6 +1037,9 @@ importers: prettier: specifier: ^3.0.3 version: 3.0.3 + prettier-plugin-svelte: + specifier: ^3.0.3 + version: 3.0.3(prettier@3.0.3)(svelte@4.2.2) prism-svelte: specifier: ^0.5.0 version: 0.5.0 @@ -5096,6 +5099,16 @@ packages: svelte: 4.2.2 dev: true + /prettier-plugin-svelte@3.0.3(prettier@3.0.3)(svelte@4.2.2): + resolution: {integrity: sha512-dLhieh4obJEK1hnZ6koxF+tMUrZbV5YGvRpf2+OADyanjya5j0z1Llo8iGwiHmFWZVG/hLEw/AJD5chXd9r3XA==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 + dependencies: + prettier: 3.0.3 + svelte: 4.2.2 + dev: true + /prettier@2.8.0: resolution: {integrity: sha512-9Lmg8hTFZKG0Asr/kW9Bp8tJjRVluO8EJQVfY2T7FMw9T5jy4I/Uvx0Rca/XWf50QQ1/SS48+6IJWnrb+2yemA==} engines: {node: '>=10.13.0'} diff --git a/sites/kit.svelte.dev/package.json b/sites/kit.svelte.dev/package.json index 0896125d469b..79366dbc8bb8 100644 --- a/sites/kit.svelte.dev/package.json +++ b/sites/kit.svelte.dev/package.json @@ -3,8 +3,8 @@ "private": true, "version": "0.0.1", "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore --ignore-path .prettierignore", - "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore --ignore-path .prettierignore", + "lint": "prettier --plugin prettier-plugin-svelte --check . --config ../../.prettierrc --ignore-path .gitignore --ignore-path .prettierignore", + "format": "prettier --plugin prettier-plugin-svelte --write . --config ../../.prettierrc --ignore-path .gitignore --ignore-path .prettierignore", "update": "node scripts/types", "dev": "pnpm run update && vite dev", "build": "pnpm run update && vite build", @@ -24,6 +24,7 @@ "lightningcss": "^1.21.8", "marked": "^9.0.0", "prettier": "^3.0.3", + "prettier-plugin-svelte": "^3.0.3", "prism-svelte": "^0.5.0", "prismjs": "^1.29.0", "shiki-twoslash": "^3.1.2", diff --git a/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte b/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte index 1be4f9d55175..7b264006d0c6 100644 --- a/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte +++ b/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte @@ -51,7 +51,10 @@

{data.page.title}

- + Edit this page on GitHub diff --git a/sites/kit.svelte.dev/src/routes/home/Hero.svelte b/sites/kit.svelte.dev/src/routes/home/Hero.svelte index 212f655223d2..751f398e6b10 100644 --- a/sites/kit.svelte.dev/src/routes/home/Hero.svelte +++ b/sites/kit.svelte.dev/src/routes/home/Hero.svelte @@ -124,7 +124,9 @@ .cta:hover { text-decoration: none; - box-shadow: 0px 0.8px 3.8px rgba(0, 0, 0, 0.115), 0px 6px 30px rgba(0, 0, 0, 0.23); + box-shadow: + 0px 0.8px 3.8px rgba(0, 0, 0, 0.115), + 0px 6px 30px rgba(0, 0, 0, 0.23); } @media (min-width: 400px) { diff --git a/sites/kit.svelte.dev/src/routes/search/+page.svelte b/sites/kit.svelte.dev/src/routes/search/+page.svelte index 2102ef99d59c..5056715cd8a8 100644 --- a/sites/kit.svelte.dev/src/routes/search/+page.svelte +++ b/sites/kit.svelte.dev/src/routes/search/+page.svelte @@ -11,7 +11,14 @@

Search

- +
From 072430ec5c64782cd25c750f40534fea9cab4b40 Mon Sep 17 00:00:00 2001 From: Markus Wendorf Date: Fri, 3 Nov 2023 00:24:50 +0100 Subject: [PATCH 0018/1135] fix: use correct environment file for rendering spa fallback page (#10963) Co-authored-by: Tee Ming --- .changeset/slow-olives-mix.md | 5 +++++ .../adapter-static/test/apps/spa/.env.production | 1 + .../adapter-static/test/apps/spa/.env.staging | 1 + .../adapter-static/test/apps/spa/package.json | 2 +- .../src/routes/fallback/[...rest]/+page.svelte | 6 ++++++ .../adapter-static/test/apps/spa/test/test.js | 5 +++++ packages/kit/src/core/adapt/builder.js | 6 ++++-- packages/kit/src/core/adapt/index.js | 15 +++++++++++++-- packages/kit/src/exports/vite/index.js | 10 +++++++++- 9 files changed, 45 insertions(+), 6 deletions(-) create mode 100644 .changeset/slow-olives-mix.md create mode 100644 packages/adapter-static/test/apps/spa/.env.production create mode 100644 packages/adapter-static/test/apps/spa/.env.staging diff --git a/.changeset/slow-olives-mix.md b/.changeset/slow-olives-mix.md new file mode 100644 index 000000000000..b6001577ccc2 --- /dev/null +++ b/.changeset/slow-olives-mix.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: use correct environment file for rendering spa fallback page diff --git a/packages/adapter-static/test/apps/spa/.env.production b/packages/adapter-static/test/apps/spa/.env.production new file mode 100644 index 000000000000..79d571855ca8 --- /dev/null +++ b/packages/adapter-static/test/apps/spa/.env.production @@ -0,0 +1 @@ +PUBLIC_VALUE="a .env.production variable should NOT be included in a mode=staging build" \ No newline at end of file diff --git a/packages/adapter-static/test/apps/spa/.env.staging b/packages/adapter-static/test/apps/spa/.env.staging new file mode 100644 index 000000000000..8483bf2722dd --- /dev/null +++ b/packages/adapter-static/test/apps/spa/.env.staging @@ -0,0 +1 @@ +PUBLIC_VALUE=42 \ No newline at end of file diff --git a/packages/adapter-static/test/apps/spa/package.json b/packages/adapter-static/test/apps/spa/package.json index 7b7f1e211a53..4b6230e448a8 100644 --- a/packages/adapter-static/test/apps/spa/package.json +++ b/packages/adapter-static/test/apps/spa/package.json @@ -4,7 +4,7 @@ "private": true, "scripts": { "dev": "vite dev", - "build": "vite build", + "build": "vite build --mode staging", "preview": "sirv -p 5173 -s 200.html build", "test": "playwright test" }, diff --git a/packages/adapter-static/test/apps/spa/src/routes/fallback/[...rest]/+page.svelte b/packages/adapter-static/test/apps/spa/src/routes/fallback/[...rest]/+page.svelte index 671b43ec7195..8950feed162a 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/fallback/[...rest]/+page.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/fallback/[...rest]/+page.svelte @@ -1 +1,7 @@ + +

the fallback page was rendered

+ +{env.PUBLIC_VALUE} diff --git a/packages/adapter-static/test/apps/spa/test/test.js b/packages/adapter-static/test/apps/spa/test/test.js index 70f18670ea1b..f8f941ea2a2c 100644 --- a/packages/adapter-static/test/apps/spa/test/test.js +++ b/packages/adapter-static/test/apps/spa/test/test.js @@ -27,3 +27,8 @@ test('renders error page for missing page', async ({ page }) => { await page.goto('/nosuchpage'); expect(await page.textContent('h1')).toEqual('404'); }); + +test('uses correct environment variables for fallback page (mode = staging)', async ({ page }) => { + await page.goto('/fallback/x/y/z'); + expect(await page.textContent('b')).toEqual('42'); +}); diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index c7e57bd9ab29..cc99e8da8555 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -24,6 +24,7 @@ const extensions = ['.html', '.js', '.mjs', '.json', '.css', '.svg', '.xml', '.w * prerendered: import('types').Prerendered; * prerender_map: import('types').PrerenderMap; * log: import('types').Logger; + * vite_config: import('vite').ResolvedConfig; * }} opts * @returns {import('@sveltejs/kit').Builder} */ @@ -34,7 +35,8 @@ export function create_builder({ route_data, prerendered, prerender_map, - log + log, + vite_config }) { /** @type {Map} */ const lookup = new Map(); @@ -144,7 +146,7 @@ export function create_builder({ async generateFallback(dest) { const manifest_path = `${config.kit.outDir}/output/server/manifest-full.js`; - const env = get_env(config.kit.env, 'production'); + const env = get_env(config.kit.env, vite_config.mode); const fallback = await generate_fallback({ manifest_path, diff --git a/packages/kit/src/core/adapt/index.js b/packages/kit/src/core/adapt/index.js index b5b3d151887b..235d18526687 100644 --- a/packages/kit/src/core/adapt/index.js +++ b/packages/kit/src/core/adapt/index.js @@ -8,8 +8,17 @@ import { create_builder } from './builder.js'; * @param {import('types').Prerendered} prerendered * @param {import('types').PrerenderMap} prerender_map * @param {import('types').Logger} log + * @param {import('vite').ResolvedConfig} vite_config */ -export async function adapt(config, build_data, server_metadata, prerendered, prerender_map, log) { +export async function adapt( + config, + build_data, + server_metadata, + prerendered, + prerender_map, + log, + vite_config +) { const { name, adapt } = config.kit.adapter; console.log(colors.bold().cyan(`\n> Using ${name}`)); @@ -21,8 +30,10 @@ export async function adapt(config, build_data, server_metadata, prerendered, pr route_data: build_data.manifest_data.routes.filter((route) => route.page || route.endpoint), prerendered, prerender_map, - log + log, + vite_config }); + await adapt(builder); log.success('done'); diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 426dd36d265d..ddaa9e4ab74f 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -807,7 +807,15 @@ function kit({ svelte_config }) { if (kit.adapter) { const { adapt } = await import('../../core/adapt/index.js'); - await adapt(svelte_config, build_data, metadata, prerendered, prerender_map, log); + await adapt( + svelte_config, + build_data, + metadata, + prerendered, + prerender_map, + log, + vite_config + ); } else { console.log(colors.bold().yellow('\nNo adapter specified')); From c16561d83f640f5ed5c51b4583c6093e74bf2808 Mon Sep 17 00:00:00 2001 From: Dominik G Date: Fri, 3 Nov 2023 16:22:08 +0100 Subject: [PATCH 0019/1135] fix: bump pnpm to 8.10.2 to avoid issue with broken arborist in 8.10.0 (#10975) --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d640fbab5b08..bea268651f67 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ "svelte": "^4.2.2", "typescript": "^4.9.4" }, - "packageManager": "pnpm@8.10.0", + "packageManager": "pnpm@8.10.2", "engines": { "pnpm": "^8.0.0" } From 5b4a95d323bcb5ae0dcc8bb440c02e3bd81c49c4 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 08:55:09 -0700 Subject: [PATCH 0020/1135] chore(deps): update dependency import-meta-resolve to v4 (#10970) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/serious-papayas-laugh.md | 5 +++++ packages/adapter-auto/package.json | 2 +- pnpm-lock.yaml | 8 ++++---- 3 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/serious-papayas-laugh.md diff --git a/.changeset/serious-papayas-laugh.md b/.changeset/serious-papayas-laugh.md new file mode 100644 index 000000000000..07a669045994 --- /dev/null +++ b/.changeset/serious-papayas-laugh.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/adapter-auto": patch +--- + +chore(deps): update dependency `import-meta-resolve` to v4 diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index 856e80a17038..f2ab24374085 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -35,7 +35,7 @@ "typescript": "^4.9.4" }, "dependencies": { - "import-meta-resolve": "^3.0.0" + "import-meta-resolve": "^4.0.0" }, "peerDependencies": { "@sveltejs/kit": "^1.0.0" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 229296e81fb1..64c6d9b58e67 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,8 +60,8 @@ importers: packages/adapter-auto: dependencies: import-meta-resolve: - specifier: ^3.0.0 - version: 3.0.0 + specifier: ^4.0.0 + version: 4.0.0 devDependencies: '@sveltejs/kit': specifier: workspace:^ @@ -3986,8 +3986,8 @@ packages: resolve-from: 4.0.0 dev: true - /import-meta-resolve@3.0.0: - resolution: {integrity: sha512-4IwhLhNNA8yy445rPjD/lWh++7hMDOml2eHtd58eG7h+qK3EryMuuRbsHGPikCoAgIkkDnckKfWSk2iDla/ejg==} + /import-meta-resolve@4.0.0: + resolution: {integrity: sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==} dev: false /imurmurhash@0.1.4: From ce4fd764e271b1a461979dfaf9698af6f36e3714 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 3 Nov 2023 09:09:39 -0700 Subject: [PATCH 0021/1135] Version Packages (#10972) Co-authored-by: github-actions[bot] --- .changeset/serious-papayas-laugh.md | 5 ----- .changeset/slow-olives-mix.md | 5 ----- packages/adapter-auto/CHANGELOG.md | 9 +++++++++ packages/adapter-auto/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 7 files changed, 18 insertions(+), 13 deletions(-) delete mode 100644 .changeset/serious-papayas-laugh.md delete mode 100644 .changeset/slow-olives-mix.md diff --git a/.changeset/serious-papayas-laugh.md b/.changeset/serious-papayas-laugh.md deleted file mode 100644 index 07a669045994..000000000000 --- a/.changeset/serious-papayas-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/adapter-auto": patch ---- - -chore(deps): update dependency `import-meta-resolve` to v4 diff --git a/.changeset/slow-olives-mix.md b/.changeset/slow-olives-mix.md deleted file mode 100644 index b6001577ccc2..000000000000 --- a/.changeset/slow-olives-mix.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: use correct environment file for rendering spa fallback page diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index ac7c9c066087..dd9fbbdd15e1 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-auto +## 2.1.1 + +### Patch Changes + +- chore(deps): update dependency `import-meta-resolve` to v4 ([#10970](https://github.com/sveltejs/kit/pull/10970)) + +- Updated dependencies [[`072430ec5`](https://github.com/sveltejs/kit/commit/072430ec5c64782cd25c750f40534fea9cab4b40)]: + - @sveltejs/kit@1.27.3 + ## 2.1.0 ### Minor Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index f2ab24374085..193ea74b0f9c 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-auto", - "version": "2.1.0", + "version": "2.1.1", "description": "Automatically chooses the SvelteKit adapter for your current environment, if possible.", "repository": { "type": "git", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index b97fcfc655ac..43e02ed11a7f 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 1.27.3 + +### Patch Changes + +- fix: use correct environment file for rendering spa fallback page ([#10963](https://github.com/sveltejs/kit/pull/10963)) + ## 1.27.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 762e420918d4..394681a4d74b 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "1.27.2", + "version": "1.27.3", "description": "The fastest way to build Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 95fa175bb962..00f34d1c388f 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '1.27.2'; +export const VERSION = '1.27.3'; From 0c44f858f25b455b57b7af3d989b34956131ed57 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 9 Nov 2023 00:17:11 +0800 Subject: [PATCH 0022/1135] docs: update create-svelte template README.md (#10976) --- packages/create-svelte/templates/default/README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/create-svelte/templates/default/README.md b/packages/create-svelte/templates/default/README.md index 9c8dc797a0be..1e62abc5a555 100644 --- a/packages/create-svelte/templates/default/README.md +++ b/packages/create-svelte/templates/default/README.md @@ -2,11 +2,10 @@ This README isn't part of the template; it is ignored, and replaced with [the shared README](../../shared/README.md) when a project is created. -The default template is automatically deployed to Cloudflare Pages, Netlify and Vercel on every commit. Commits to `master` will update production deployments: +The default template is automatically deployed to Cloudflare Pages and Vercel on every commit. Commits to `master` will update production deployments: - https://cloudflare.demo.svelte.dev -- https://kit-demo.netlify.app -- https://kit-demo.vercel.app +- https://kit-default-template-svelte.vercel.app/ ## Cloudflare Pages settings From 7f4199c38a261d4aabaca24932bf3aef0d1c9bf1 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Thu, 9 Nov 2023 13:09:07 +0100 Subject: [PATCH 0023/1135] chore: add support for Svelte 5 (#11002) Adds a check for Svelte 5 to use the backwards compatibility from svelte/legacy so it works with SvelteKit without changes to other code --- .changeset/nine-seas-decide.md | 5 +++++ packages/kit/package.json | 4 ++-- packages/kit/src/core/sync/utils.js | 5 +++++ .../src/core/sync/write_client_manifest.js | 4 ++-- packages/kit/src/core/sync/write_root.js | 13 +++++++++++- packages/kit/src/core/sync/write_server.js | 4 ++-- packages/kit/src/exports/vite/index.js | 4 ++-- packages/kit/src/runtime/client/types.d.ts | 3 ++- pnpm-lock.yaml | 20 +++++++++---------- 9 files changed, 42 insertions(+), 20 deletions(-) create mode 100644 .changeset/nine-seas-decide.md diff --git a/.changeset/nine-seas-decide.md b/.changeset/nine-seas-decide.md new file mode 100644 index 000000000000..30c02b08e7fa --- /dev/null +++ b/.changeset/nine-seas-decide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +chore: cleanup diff --git a/packages/kit/package.json b/packages/kit/package.json index 394681a4d74b..67a90d133cd7 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -11,7 +11,7 @@ "homepage": "https://kit.svelte.dev", "type": "module", "dependencies": { - "@sveltejs/vite-plugin-svelte": "^2.4.1", + "@sveltejs/vite-plugin-svelte": "^2.5.0", "@types/cookie": "^0.5.1", "cookie": "^0.5.0", "devalue": "^4.3.1", @@ -41,7 +41,7 @@ "vitest": "^0.34.5" }, "peerDependencies": { - "svelte": "^3.54.0 || ^4.0.0-next.0", + "svelte": "^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0", "vite": "^4.0.0" }, "bin": { diff --git a/packages/kit/src/core/sync/utils.js b/packages/kit/src/core/sync/utils.js index 0e0181366f9d..9e75fc074ce2 100644 --- a/packages/kit/src/core/sync/utils.js +++ b/packages/kit/src/core/sync/utils.js @@ -1,5 +1,6 @@ import fs from 'node:fs'; import path from 'node:path'; +import { VERSION } from 'svelte/compiler'; import { mkdirp } from '../../utils/filesystem.js'; /** @type {Map} */ @@ -68,3 +69,7 @@ export function dedent(strings, ...values) { return str; } + +export function isSvelte5Plus() { + return Number(VERSION[0]) >= 5; +} diff --git a/packages/kit/src/core/sync/write_client_manifest.js b/packages/kit/src/core/sync/write_client_manifest.js index 7e65baf2caf4..b8b920ffb5f1 100644 --- a/packages/kit/src/core/sync/write_client_manifest.js +++ b/packages/kit/src/core/sync/write_client_manifest.js @@ -1,7 +1,7 @@ import path from 'node:path'; import { relative_path, resolve_entry } from '../../utils/filesystem.js'; import { s } from '../../utils/misc.js'; -import { dedent, write_if_changed } from './utils.js'; +import { dedent, isSvelte5Plus, write_if_changed } from './utils.js'; import colors from 'kleur'; /** @@ -143,7 +143,7 @@ export function write_client_manifest(kit, manifest_data, output, metadata) { }(({ error }) => { console.error(error) }), }; - export { default as root } from '../root.svelte'; + export { default as root } from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}'; ` ); diff --git a/packages/kit/src/core/sync/write_root.js b/packages/kit/src/core/sync/write_root.js index 04caa81a34f7..a332664d95c1 100644 --- a/packages/kit/src/core/sync/write_root.js +++ b/packages/kit/src/core/sync/write_root.js @@ -1,4 +1,4 @@ -import { dedent, write_if_changed } from './utils.js'; +import { dedent, isSvelte5Plus, write_if_changed } from './utils.js'; /** * @param {import('types').ManifestData} manifest_data @@ -89,4 +89,15 @@ export function write_root(manifest_data, output) { {/if} ` ); + + if (isSvelte5Plus()) { + write_if_changed( + `${output}/root.js`, + dedent` + import { asClassComponent } from 'svelte/legacy'; + import Root from './root.svelte'; + export default asClassComponent(Root); + ` + ); + } } diff --git a/packages/kit/src/core/sync/write_server.js b/packages/kit/src/core/sync/write_server.js index 976417f504f7..f3d29dfbb20b 100644 --- a/packages/kit/src/core/sync/write_server.js +++ b/packages/kit/src/core/sync/write_server.js @@ -4,7 +4,7 @@ import { posixify, resolve_entry } from '../../utils/filesystem.js'; import { s } from '../../utils/misc.js'; import { load_error_page, load_template } from '../config/index.js'; import { runtime_directory } from '../utils.js'; -import { write_if_changed } from './utils.js'; +import { isSvelte5Plus, write_if_changed } from './utils.js'; import colors from 'kleur'; /** @@ -25,7 +25,7 @@ const server_template = ({ template, error_page }) => ` -import root from '../root.svelte'; +import root from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}'; import { set_building } from '__sveltekit/environment'; import { set_assets } from '__sveltekit/paths'; import { set_private_env, set_public_env } from '${runtime_directory}/shared-server.js'; diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index ddaa9e4ab74f..fcbf4c3401c3 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -24,7 +24,7 @@ import prerender from '../../core/postbuild/prerender.js'; import analyse from '../../core/postbuild/analyse.js'; import { s } from '../../utils/misc.js'; import { hash } from '../../runtime/hash.js'; -import { dedent } from '../../core/sync/utils.js'; +import { dedent, isSvelte5Plus } from '../../core/sync/utils.js'; export { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; @@ -136,7 +136,7 @@ export async function sveltekit() { onwarn: svelte_config.onwarn, compilerOptions: { // @ts-expect-error SvelteKit requires hydratable true by default - hydratable: true, + hydratable: isSvelte5Plus() ? undefined : true, ...svelte_config.compilerOptions }, ...svelte_config.vitePlugin diff --git a/packages/kit/src/runtime/client/types.d.ts b/packages/kit/src/runtime/client/types.d.ts index 2517eb8ad052..af8619c54862 100644 --- a/packages/kit/src/runtime/client/types.d.ts +++ b/packages/kit/src/runtime/client/types.d.ts @@ -90,7 +90,8 @@ export type NavigationFinished = { type: 'loaded'; state: NavigationState; props: { - components: Array; + constructors: Array; + components?: Array; page?: Page; form?: Record | null; [key: `data_${number}`]: Record; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 64c6d9b58e67..a9e8258a5689 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -365,8 +365,8 @@ importers: packages/kit: dependencies: '@sveltejs/vite-plugin-svelte': - specifier: ^2.4.1 - version: 2.4.1(svelte@4.2.2)(vite@4.4.9) + specifier: ^2.5.0 + version: 2.5.0(svelte@4.2.2)(vite@4.4.9) '@types/cookie': specifier: ^0.5.1 version: 0.5.1 @@ -2035,15 +2035,15 @@ packages: svelte-local-storage-store: 0.6.0(svelte@4.2.2) dev: true - /@sveltejs/vite-plugin-svelte-inspector@1.0.3(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.2.2)(vite@4.4.9): - resolution: {integrity: sha512-Khdl5jmmPN6SUsVuqSXatKpQTMIifoQPDanaxC84m9JxIibWvSABJyHpyys0Z+1yYrxY5TTEQm+6elh0XCMaOA==} + /@sveltejs/vite-plugin-svelte-inspector@1.0.4(@sveltejs/vite-plugin-svelte@2.5.0)(svelte@4.2.2)(vite@4.4.9): + resolution: {integrity: sha512-zjiuZ3yydBtwpF3bj0kQNV0YXe+iKE545QGZVTaylW3eAzFr+pJ/cwK8lZEaRp4JtaJXhD5DyWAV4AxLh6DgaQ==} engines: {node: ^14.18.0 || >= 16} peerDependencies: '@sveltejs/vite-plugin-svelte': ^2.2.0 svelte: ^3.54.0 || ^4.0.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte': 2.4.1(svelte@4.2.2)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte': 2.5.0(svelte@4.2.2)(vite@4.4.9) debug: 4.3.4 svelte: 4.2.2 vite: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) @@ -2051,18 +2051,18 @@ packages: - supports-color dev: false - /@sveltejs/vite-plugin-svelte@2.4.1(svelte@4.2.2)(vite@4.4.9): - resolution: {integrity: sha512-bNNKvoRY89ptY7udeBSCmTdCVwkjmMcZ0j/z9J5MuedT8jPjq0zrknAo/jF1sToAza4NVaAgR9AkZoD9oJJmnA==} + /@sveltejs/vite-plugin-svelte@2.5.0(svelte@4.2.2)(vite@4.4.9): + resolution: {integrity: sha512-FxLZLVfFA2soGw7ej8Ohuav7+AOsJILiPlL8FgY5MABDDmDqb637o8Xd/QGkrXLC1qXyG1bnteOw5Z5yrA2lHA==} engines: {node: ^14.18.0 || >= 16} peerDependencies: - svelte: ^3.54.0 || ^4.0.0-next.0 + svelte: ^3.54.0 || ^4.0.0 || ^5.0.0-next.0 vite: ^4.0.0 dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 1.0.3(@sveltejs/vite-plugin-svelte@2.4.1)(svelte@4.2.2)(vite@4.4.9) + '@sveltejs/vite-plugin-svelte-inspector': 1.0.4(@sveltejs/vite-plugin-svelte@2.5.0)(svelte@4.2.2)(vite@4.4.9) debug: 4.3.4 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.2 + magic-string: 0.30.5 svelte: 4.2.2 svelte-hmr: 0.15.3(svelte@4.2.2) vite: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) From b3504eb64242a6504ae8bbf89596572156c145b2 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 9 Nov 2023 20:10:45 +0800 Subject: [PATCH 0024/1135] check if prerendering when ssr is turned off before responding (#10988) fixes #10983 This PR adds a check to see if we're prerendering and SSR is turned off to avoid responding with CSR only too early. With this check in place, the should_prerender check can now be reached and generate the __data.json file. --- .changeset/eight-moons-kick.md | 5 +++++ packages/kit/src/runtime/server/page/index.js | 2 +- .../routes/shadowed-get/ssr-off/+page.server.js | 7 +++++++ .../src/routes/shadowed-get/ssr-off/+page.svelte | 6 ++++++ .../test/prerendering/basics/test/tests.spec.js | 15 +++++++++++++++ 5 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 .changeset/eight-moons-kick.md create mode 100644 packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.server.js create mode 100644 packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.svelte diff --git a/.changeset/eight-moons-kick.md b/.changeset/eight-moons-kick.md new file mode 100644 index 000000000000..560517572200 --- /dev/null +++ b/.changeset/eight-moons-kick.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: generate `__data.json` for prerendered pages when SSR is turned off diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 6ba98410d50f..f99391b1365f 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -99,7 +99,7 @@ export async function render_page(event, page, options, manifest, state, resolve /** @type {import('./types').Fetched[]} */ const fetched = []; - if (get_option(nodes, 'ssr') === false) { + if (get_option(nodes, 'ssr') === false && !state.prerendering) { return await render_response({ branch: [], fetched, diff --git a/packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.server.js b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.server.js new file mode 100644 index 000000000000..ac41ba4b7e77 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.server.js @@ -0,0 +1,7 @@ +export const ssr = false; + +export function load() { + return { + answer: 42 + }; +} diff --git a/packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.svelte b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.svelte new file mode 100644 index 000000000000..a475b1237f27 --- /dev/null +++ b/packages/kit/test/prerendering/basics/src/routes/shadowed-get/ssr-off/+page.svelte @@ -0,0 +1,6 @@ + + +

The answer is {data.answer}

diff --git a/packages/kit/test/prerendering/basics/test/tests.spec.js b/packages/kit/test/prerendering/basics/test/tests.spec.js index 993f4f022dfd..3a830c97e96e 100644 --- a/packages/kit/test/prerendering/basics/test/tests.spec.js +++ b/packages/kit/test/prerendering/basics/test/tests.spec.js @@ -114,6 +114,21 @@ test('generates __data.json file for shadow endpoints', () => { }); }); +test('generates __data.json file for shadow endpoints with ssr turned off', () => { + const data = JSON.parse(read('shadowed-get/ssr-off/__data.json')); + expect(data).toEqual({ + type: 'data', + nodes: [ + null, + { + type: 'data', + data: [{ answer: 1 }, 42], + uses: {} + } + ] + }); +}); + test('does not prerender page with shadow endpoint with non-load handler', () => { assert.isFalse(fs.existsSync(`${build}/shadowed-post.html`)); assert.isFalse(fs.existsSync(`${build}/shadowed-post/__data.json`)); From 8528cbc7d2f6b4f6d767f1916c6f09921137b44c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 9 Nov 2023 13:11:48 +0100 Subject: [PATCH 0025/1135] Version Packages (#11003) Co-authored-by: github-actions[bot] --- .changeset/eight-moons-kick.md | 5 ----- .changeset/nine-seas-decide.md | 5 ----- packages/kit/CHANGELOG.md | 8 ++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 10 insertions(+), 12 deletions(-) delete mode 100644 .changeset/eight-moons-kick.md delete mode 100644 .changeset/nine-seas-decide.md diff --git a/.changeset/eight-moons-kick.md b/.changeset/eight-moons-kick.md deleted file mode 100644 index 560517572200..000000000000 --- a/.changeset/eight-moons-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: generate `__data.json` for prerendered pages when SSR is turned off diff --git a/.changeset/nine-seas-decide.md b/.changeset/nine-seas-decide.md deleted file mode 100644 index 30c02b08e7fa..000000000000 --- a/.changeset/nine-seas-decide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -chore: cleanup diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 43e02ed11a7f..e8a589bcee41 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,13 @@ # @sveltejs/kit +## 1.27.4 + +### Patch Changes + +- fix: generate `__data.json` for prerendered pages when SSR is turned off ([#10988](https://github.com/sveltejs/kit/pull/10988)) + +- chore: cleanup ([#11002](https://github.com/sveltejs/kit/pull/11002)) + ## 1.27.3 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 67a90d133cd7..b845e82cd184 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "1.27.3", + "version": "1.27.4", "description": "The fastest way to build Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 00f34d1c388f..27e75808fdc9 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '1.27.3'; +export const VERSION = '1.27.4'; From dba649f44591a4c3b06e7458d97a773f01d0cda7 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 9 Nov 2023 12:28:58 -0500 Subject: [PATCH 0026/1135] cache location.origin on startup (#11004) * cache location.origin on startup * try this --------- Co-authored-by: Rich Harris --- .changeset/small-readers-decide.md | 5 +++++ packages/kit/src/runtime/client/client.js | 7 ++++--- packages/kit/src/runtime/client/utils.js | 6 ++++-- 3 files changed, 13 insertions(+), 5 deletions(-) create mode 100644 .changeset/small-readers-decide.md diff --git a/.changeset/small-readers-decide.md b/.changeset/small-readers-decide.md new file mode 100644 index 000000000000..4866f35a25ec --- /dev/null +++ b/.changeset/small-readers-decide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: cache location.origin on startup diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 6c7e723c71e7..852b09a7446e 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -22,7 +22,8 @@ import { get_link_info, get_router_options, is_external_url, - scroll_state + scroll_state, + origin } from './utils.js'; import { base } from '__sveltekit/paths'; @@ -843,7 +844,7 @@ export function create_client(app, target) { } catch { // at this point we have no choice but to fall back to the server, if it wouldn't // bring us right back here, turning this into an endless loop - if (url.origin !== location.origin || url.pathname !== location.pathname || hydrated) { + if (url.origin !== origin || url.pathname !== location.pathname || hydrated) { await native_navigation(url); } } @@ -1173,7 +1174,7 @@ export function create_client(app, target) { * @returns {Promise} */ async function server_fallback(url, route, error, status) { - if (url.origin === location.origin && url.pathname === location.pathname && !hydrated) { + if (url.origin === origin && url.pathname === location.pathname && !hydrated) { // We would reload the same page we're currently on, which isn't hydrated, // which means no SSR, which means we would end up in an endless loop return await load_root_error_page({ diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 8af6102cd93f..d330ff8c0c64 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -6,6 +6,8 @@ import { PRELOAD_PRIORITIES } from './constants.js'; /* global __SVELTEKIT_APP_VERSION_FILE__, __SVELTEKIT_APP_VERSION_POLL_INTERVAL__ */ +export const origin = BROWSER ? location.origin : ''; + /** @param {HTMLDocument} doc */ export function get_base_uri(doc) { let baseURI = doc.baseURI; @@ -135,7 +137,7 @@ export function get_link_info(a, base) { is_external_url(url, base) || (a.getAttribute('rel') || '').split(/\s+/).includes('external'); - const download = url?.origin === location.origin && a.hasAttribute('download'); + const download = url?.origin === origin && a.hasAttribute('download'); return { url, external, target, download }; } @@ -290,5 +292,5 @@ export function create_updated_store() { * @param {string} base */ export function is_external_url(url, base) { - return url.origin !== location.origin || !url.pathname.startsWith(base); + return url.origin !== origin || !url.pathname.startsWith(base); } From 43c5f2ccec0e702e245d8d90c939e2bfe8efafc7 Mon Sep 17 00:00:00 2001 From: Bjorn Lu Date: Fri, 10 Nov 2023 01:35:07 +0800 Subject: [PATCH 0027/1135] chore: update types resolution setup (#10997) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- packages/adapter-auto/tsconfig.json | 5 +- packages/adapter-cloudflare-workers/index.js | 2 +- .../adapter-cloudflare-workers/tsconfig.json | 5 +- packages/adapter-cloudflare/index.js | 6 +-- .../{placeholders.ts => placeholders.d.ts} | 0 packages/adapter-cloudflare/tsconfig.json | 7 +-- packages/adapter-netlify/index.js | 2 +- packages/adapter-netlify/src/serverless.js | 2 +- packages/adapter-netlify/tsconfig.json | 4 +- packages/adapter-node/index.js | 2 +- packages/adapter-node/package.json | 4 +- packages/adapter-node/tsconfig.json | 7 ++- packages/adapter-static/index.js | 4 +- packages/adapter-static/platforms.js | 2 +- packages/adapter-static/tsconfig.json | 4 +- packages/adapter-vercel/tsconfig.json | 4 +- packages/create-svelte/index.js | 16 +++--- packages/create-svelte/tsconfig.json | 9 ++-- packages/create-svelte/types/index.d.ts | 2 +- packages/kit/src/core/config/options.js | 2 +- .../core/sync/create_manifest_data/index.js | 2 +- .../src/exports/vite/build/build_server.js | 2 +- .../src/exports/vite/graph_analysis/index.js | 2 +- .../exports/vite/graph_analysis/index.spec.js | 2 +- packages/kit/src/exports/vite/index.js | 8 +-- .../kit/src/exports/vite/preview/index.js | 5 +- packages/kit/src/runtime/client/client.js | 54 +++++++++---------- packages/kit/src/runtime/client/parse.js | 2 +- packages/kit/src/runtime/client/singletons.js | 4 +- packages/kit/src/runtime/client/start.js | 4 +- packages/kit/src/runtime/client/types.d.ts | 4 +- packages/kit/src/runtime/server/cookie.js | 4 +- packages/kit/src/runtime/server/page/csp.js | 4 +- packages/kit/src/runtime/server/page/index.js | 2 +- .../kit/src/runtime/server/page/load_data.js | 4 +- .../kit/src/runtime/server/page/render.js | 4 +- .../runtime/server/page/respond_with_error.js | 2 +- packages/kit/src/runtime/server/respond.js | 2 +- packages/kit/src/types/internal.d.ts | 2 +- .../tsconfig.json | 1 - .../apps/private-dynamic-env/tsconfig.json | 1 - .../tsconfig.json | 1 - .../apps/private-static-env/tsconfig.json | 1 - .../tsconfig.json | 1 - .../apps/server-only-folder/tsconfig.json | 1 - .../tsconfig.json | 1 - .../apps/server-only-module/tsconfig.json | 1 - .../apps/syntax-error/tsconfig.json | 1 - packages/kit/tsconfig.json | 8 +-- packages/migrate/tsconfig.json | 6 +-- packages/package/src/cli.js | 2 +- packages/package/src/config.js | 2 +- packages/package/src/index.js | 12 ++--- packages/package/src/typescript.js | 2 +- packages/package/src/utils.js | 4 +- packages/package/src/validate.js | 4 +- packages/package/test/index.js | 2 +- packages/package/tsconfig.json | 6 +-- pnpm-lock.yaml | 20 +++---- .../src/lib/server/docs/index.js | 12 ++--- sites/kit.svelte.dev/tsconfig.json | 1 + 61 files changed, 143 insertions(+), 149 deletions(-) rename packages/adapter-cloudflare/{placeholders.ts => placeholders.d.ts} (100%) diff --git a/packages/adapter-auto/tsconfig.json b/packages/adapter-auto/tsconfig.json index d42c1c9c4b32..c1f396b255ce 100644 --- a/packages/adapter-auto/tsconfig.json +++ b/packages/adapter-auto/tsconfig.json @@ -4,9 +4,8 @@ "checkJs": true, "noEmit": true, "noImplicitAny": true, - "module": "esnext", - "target": "esnext", - "skipLibCheck": true, + "target": "es2022", + "module": "node16", "moduleResolution": "node16", "baseUrl": "." }, diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index 6ab595989024..78ed40939dc2 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -14,7 +14,7 @@ import { fileURLToPath } from 'node:url'; * }} WranglerConfig */ -/** @type {import('.').default} */ +/** @type {import('./index.js').default} */ export default function ({ config = 'wrangler.toml' } = {}) { return { name: '@sveltejs/adapter-cloudflare-workers', diff --git a/packages/adapter-cloudflare-workers/tsconfig.json b/packages/adapter-cloudflare-workers/tsconfig.json index f4c98fd3be96..1cb740d0614c 100644 --- a/packages/adapter-cloudflare-workers/tsconfig.json +++ b/packages/adapter-cloudflare-workers/tsconfig.json @@ -4,8 +4,9 @@ "checkJs": true, "noEmit": true, "noImplicitAny": true, - "module": "es2020", - "moduleResolution": "node", + "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "allowSyntheticDefaultImports": true, "baseUrl": ".", "paths": { diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 1dd0abd06470..a9e3f98405c1 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -3,7 +3,7 @@ import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; import * as esbuild from 'esbuild'; -/** @type {import('.').default} */ +/** @type {import('./index.js').default} */ export default function (options = {}) { return { name: '@sveltejs/adapter-cloudflare', @@ -67,8 +67,8 @@ export default function (options = {}) { /** * @param {import('@sveltejs/kit').Builder} builder * @param {string[]} assets - * @param {import('./index').AdapterOptions['routes']} routes - * @returns {import('.').RoutesJSONSpec} + * @param {import('./index.js').AdapterOptions['routes']} routes + * @returns {import('./index.js').RoutesJSONSpec} */ function get_routes_json(builder, assets, { include = ['/*'], exclude = [''] }) { if (!Array.isArray(include) || !Array.isArray(exclude)) { diff --git a/packages/adapter-cloudflare/placeholders.ts b/packages/adapter-cloudflare/placeholders.d.ts similarity index 100% rename from packages/adapter-cloudflare/placeholders.ts rename to packages/adapter-cloudflare/placeholders.d.ts diff --git a/packages/adapter-cloudflare/tsconfig.json b/packages/adapter-cloudflare/tsconfig.json index 4a37ad69ac8c..7ebf502ced9e 100644 --- a/packages/adapter-cloudflare/tsconfig.json +++ b/packages/adapter-cloudflare/tsconfig.json @@ -4,12 +4,13 @@ "checkJs": true, "noEmit": true, "noImplicitAny": true, - "module": "es2020", - "moduleResolution": "node", + "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "baseUrl": ".", "paths": { "@sveltejs/kit": ["../kit/types/index"] } }, - "include": ["index.js", "placeholders.ts", "src/worker.js"] + "include": ["index.js", "placeholders.d.ts", "src/worker.js"] } diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js index 3307a730935e..fafcecfea75a 100644 --- a/packages/adapter-netlify/index.js +++ b/packages/adapter-netlify/index.js @@ -35,7 +35,7 @@ const edge_set_in_env_var = const FUNCTION_PREFIX = 'sveltekit-'; -/** @type {import('.').default} */ +/** @type {import('./index.js').default} */ export default function ({ split = false, edge = edge_set_in_env_var } = {}) { return { name: '@sveltejs/adapter-netlify', diff --git a/packages/adapter-netlify/src/serverless.js b/packages/adapter-netlify/src/serverless.js index f898796b8902..db394a888302 100644 --- a/packages/adapter-netlify/src/serverless.js +++ b/packages/adapter-netlify/src/serverless.js @@ -1,6 +1,6 @@ import './shims'; import { Server } from '0SERVER'; -import { split_headers } from './headers'; +import { split_headers } from './headers.js'; /** * @param {import('@sveltejs/kit').SSRManifest} manifest diff --git a/packages/adapter-netlify/tsconfig.json b/packages/adapter-netlify/tsconfig.json index 0a6b886c8407..050c14d467ea 100644 --- a/packages/adapter-netlify/tsconfig.json +++ b/packages/adapter-netlify/tsconfig.json @@ -4,8 +4,10 @@ "checkJs": true, "noEmit": true, "noImplicitAny": true, - "module": "es2022", "target": "es2022", + "module": "es2022", + // `@netlify/function` > `@netlify/serverless-functions-api` types are not compatible, + // so using this moduleResolution for now "moduleResolution": "node", "allowSyntheticDefaultImports": true, "baseUrl": ".", diff --git a/packages/adapter-node/index.js b/packages/adapter-node/index.js index 8d5c1629a4cf..2d34cfb22d29 100644 --- a/packages/adapter-node/index.js +++ b/packages/adapter-node/index.js @@ -7,7 +7,7 @@ import json from '@rollup/plugin-json'; const files = fileURLToPath(new URL('./files', import.meta.url).href); -/** @type {import('.').default} */ +/** @type {import('./index.js').default} */ export default function (opts = {}) { const { out = 'build', precompress, envPrefix = '', polyfill = true } = opts; diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 6b13c7272a30..3588e72581fa 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -33,11 +33,11 @@ "prepublishOnly": "pnpm build" }, "devDependencies": { - "@polka/url": "^1.0.0-next.21", + "@polka/url": "^1.0.0-next.23", "@sveltejs/kit": "workspace:^", "@types/node": "^16.18.6", "c8": "^8.0.0", - "polka": "^1.0.0-next.22", + "polka": "^1.0.0-next.23", "sirv": "^2.0.3", "typescript": "^4.9.4", "vitest": "^0.34.5" diff --git a/packages/adapter-node/tsconfig.json b/packages/adapter-node/tsconfig.json index 63ea97316689..7d320c09f70c 100644 --- a/packages/adapter-node/tsconfig.json +++ b/packages/adapter-node/tsconfig.json @@ -5,9 +5,12 @@ "noEmit": true, "noImplicitAny": true, "allowSyntheticDefaultImports": true, - "moduleResolution": "node", + "target": "es2022", "module": "es2022", - "target": "es2017", + // Can't use moduleResolution: node16 because of these issues: + // https://github.com/rollup/plugins/issues/1329 + // https://github.com/lukeed/polka/issues/199 + "moduleResolution": "node", "baseUrl": ".", "paths": { "@sveltejs/kit": ["../kit/types/index"] diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js index 96ccf731dd98..4b4fb8465924 100644 --- a/packages/adapter-static/index.js +++ b/packages/adapter-static/index.js @@ -1,7 +1,7 @@ import path from 'node:path'; import { platforms } from './platforms.js'; -/** @type {import('.').default} */ +/** @type {import('./index.js').default} */ export default function (options) { return { name: '@sveltejs/adapter-static', @@ -56,7 +56,7 @@ See https://kit.svelte.dev/docs/page-options#prerender for more details` assets = pages, fallback, precompress - } = options ?? platform?.defaults ?? /** @type {import('./index').AdapterOptions} */ ({}); + } = options ?? platform?.defaults ?? /** @type {import('./index.js').AdapterOptions} */ ({}); builder.rimraf(assets); builder.rimraf(pages); diff --git a/packages/adapter-static/platforms.js b/packages/adapter-static/platforms.js index 189865b106b8..908e74b29a86 100644 --- a/packages/adapter-static/platforms.js +++ b/packages/adapter-static/platforms.js @@ -4,7 +4,7 @@ import fs from 'node:fs'; * @typedef {{ * name: string; * test: () => boolean; - * defaults: import('./index').AdapterOptions; + * defaults: import('./index.js').AdapterOptions; * done: (builder: import('@sveltejs/kit').Builder) => void; * }} * Platform */ diff --git a/packages/adapter-static/tsconfig.json b/packages/adapter-static/tsconfig.json index 7953ec985e76..1723393334d7 100644 --- a/packages/adapter-static/tsconfig.json +++ b/packages/adapter-static/tsconfig.json @@ -4,9 +4,9 @@ "checkJs": true, "noEmit": true, "noImplicitAny": true, - "module": "es2022", "target": "es2022", - "moduleResolution": "node", + "module": "node16", + "moduleResolution": "node16", "allowSyntheticDefaultImports": true, "baseUrl": ".", "paths": { diff --git a/packages/adapter-vercel/tsconfig.json b/packages/adapter-vercel/tsconfig.json index f93d6d1bbcc8..8aa63e3d2a76 100644 --- a/packages/adapter-vercel/tsconfig.json +++ b/packages/adapter-vercel/tsconfig.json @@ -5,9 +5,9 @@ "strict": true, "noEmit": true, "noImplicitAny": true, - "module": "es2022", - "moduleResolution": "node", "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "allowSyntheticDefaultImports": true, "baseUrl": ".", "paths": { diff --git a/packages/create-svelte/index.js b/packages/create-svelte/index.js index d6888950c337..74eab9b63e8d 100755 --- a/packages/create-svelte/index.js +++ b/packages/create-svelte/index.js @@ -2,7 +2,7 @@ import fs from 'node:fs'; import path from 'node:path'; import { mkdirp, copy, dist } from './utils.js'; -/** @type {import('./types/index').create} */ +/** @type {import('./types/index.js').create} */ export async function create(cwd, options) { mkdirp(cwd); @@ -22,7 +22,7 @@ function write_template_files(template, types, name, cwd) { copy(`${dir}/package.json`, `${cwd}/package.json`); const manifest = `${dir}/files.types=${types}.json`; - const files = /** @type {import('./types/internal').File[]} */ ( + const files = /** @type {import('./types/internal.js').File[]} */ ( JSON.parse(fs.readFileSync(manifest, 'utf-8')) ); @@ -37,12 +37,12 @@ function write_template_files(template, types, name, cwd) { /** * * @param {string} cwd - * @param {import('./types/internal').Options} options + * @param {import('./types/internal.js').Options} options * @param {string} name */ function write_common_files(cwd, options, name) { const shared = dist('shared.json'); - const { files } = /** @type {import('./types/internal').Common} */ ( + const { files } = /** @type {import('./types/internal.js').Common} */ ( JSON.parse(fs.readFileSync(shared, 'utf-8')) ); @@ -73,8 +73,8 @@ function write_common_files(cwd, options, name) { } /** - * @param {import('./types/internal').Condition} condition - * @param {import('./types/internal').Options} options + * @param {import('./types/internal.js').Condition} condition + * @param {import('./types/internal.js').Options} options * @returns {boolean} */ function matches_condition(condition, options) { @@ -134,8 +134,8 @@ function sort_keys(obj) { * Sort files so that those which apply more generically come first so they * can be overwritten by files for more precise cases later. * - * @param files {import('./types/internal').Common['files']} - * */ + * @param {import('./types/internal.js').Common['files']} files + */ function sort_files(files) { return files.sort((f1, f2) => { const f1_more_generic = diff --git a/packages/create-svelte/tsconfig.json b/packages/create-svelte/tsconfig.json index a5d5c18dc879..41f0745444fe 100644 --- a/packages/create-svelte/tsconfig.json +++ b/packages/create-svelte/tsconfig.json @@ -3,12 +3,11 @@ "allowJs": true, "checkJs": true, "noEmit": true, - "target": "esnext", - "module": "esnext", - "moduleResolution": "node", + "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "allowSyntheticDefaultImports": true, - "strict": true, - "skipLibCheck": true + "strict": true }, "include": ["./scripts/**/*", "./test/*.js", "./*.js"] } diff --git a/packages/create-svelte/types/index.d.ts b/packages/create-svelte/types/index.d.ts index ef78af4797b1..1f1a4a6191bc 100644 --- a/packages/create-svelte/types/index.d.ts +++ b/packages/create-svelte/types/index.d.ts @@ -1,4 +1,4 @@ -import { Options } from './internal'; +import { Options } from './internal.js'; /** * Create a new SvelteKit project. diff --git a/packages/kit/src/core/config/options.js b/packages/kit/src/core/config/options.js index 7d7351023e61..2d0c928d9290 100644 --- a/packages/kit/src/core/config/options.js +++ b/packages/kit/src/core/config/options.js @@ -1,6 +1,6 @@ import { join } from 'node:path'; -/** @typedef {import('./types').Validator} Validator */ +/** @typedef {import('./types.js').Validator} Validator */ const directives = object({ 'child-src': string_array(), diff --git a/packages/kit/src/core/sync/create_manifest_data/index.js b/packages/kit/src/core/sync/create_manifest_data/index.js index 9ca662b78f58..5d72686db746 100644 --- a/packages/kit/src/core/sync/create_manifest_data/index.js +++ b/packages/kit/src/core/sync/create_manifest_data/index.js @@ -444,7 +444,7 @@ function create_routes_and_nodes(cwd, config, fallback) { * @param {string} file * @param {string[]} component_extensions * @param {string[]} module_extensions - * @returns {import('./types').RouteFile} + * @returns {import('./types.js').RouteFile} */ function analyze(project_relative, file, component_extensions, module_extensions) { const component_extension = component_extensions.find((ext) => file.endsWith(ext)); diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index cebe5f7f6c2b..f13c29872e38 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -10,7 +10,7 @@ import { normalizePath } from 'vite'; * @param {import('types').ManifestData} manifest_data * @param {import('vite').Manifest} server_manifest * @param {import('vite').Manifest | null} client_manifest - * @param {import('rollup').OutputAsset[] | null} css + * @param {import('vite').Rollup.OutputAsset[] | null} css */ export function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, css) { mkdirp(`${out}/server/nodes`); diff --git a/packages/kit/src/exports/vite/graph_analysis/index.js b/packages/kit/src/exports/vite/graph_analysis/index.js index 63d807669ce7..6dc6860a0a3c 100644 --- a/packages/kit/src/exports/vite/graph_analysis/index.js +++ b/packages/kit/src/exports/vite/graph_analysis/index.js @@ -25,7 +25,7 @@ export function is_illegal(id, dirs) { /** * Creates a guard that checks that no id imports a module that is not allowed to be imported into client-side code. - * @param {import('rollup').PluginContext} context + * @param {import('vite').Rollup.PluginContext} context * @param {{ cwd: string; lib: string }} paths */ export function module_guard(context, { cwd, lib }) { diff --git a/packages/kit/src/exports/vite/graph_analysis/index.spec.js b/packages/kit/src/exports/vite/graph_analysis/index.spec.js index 292de805944f..d149111f36af 100644 --- a/packages/kit/src/exports/vite/graph_analysis/index.spec.js +++ b/packages/kit/src/exports/vite/graph_analysis/index.spec.js @@ -8,7 +8,7 @@ import { module_guard } from './index.js'; */ function check(graph, expected_error) { // @ts-expect-error - const context = /** @type {import('rollup').PluginContext} */ ({ + const context = /** @type {import('vite').Rollup.PluginContext} */ ({ /** @param {string} id */ getModuleInfo(id) { return { diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index fcbf4c3401c3..a7a886d6d745 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -30,7 +30,7 @@ export { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; const cwd = process.cwd(); -/** @type {import('./types').EnforcedConfig} */ +/** @type {import('./types.js').EnforcedConfig} */ const enforced_config = { appType: true, base: true, @@ -702,7 +702,7 @@ function kit({ svelte_config }) { secondary_build_started = true; - const { output } = /** @type {import('rollup').RollupOutput} */ ( + const { output } = /** @type {import('vite').Rollup.RollupOutput} */ ( await vite.build({ configFile: vite_config.configFile, // CLI args @@ -742,7 +742,7 @@ function kit({ svelte_config }) { }; const css = output.filter( - /** @type {(value: any) => value is import('rollup').OutputAsset} */ + /** @type {(value: any) => value is import('vite').Rollup.OutputAsset} */ (value) => value.type === 'asset' && value.fileName.endsWith('.css') ); @@ -863,7 +863,7 @@ function warn_overridden_config(config, resolved_config) { /** * @param {Record} config * @param {Record} resolved_config - * @param {import('./types').EnforcedConfig} enforced_config + * @param {import('./types.js').EnforcedConfig} enforced_config * @param {string} path * @param {string[]} out used locally to compute the return value */ diff --git a/packages/kit/src/exports/vite/preview/index.js b/packages/kit/src/exports/vite/preview/index.js index 445334635d2c..b6a849093909 100644 --- a/packages/kit/src/exports/vite/preview/index.js +++ b/packages/kit/src/exports/vite/preview/index.js @@ -15,10 +15,7 @@ import { not_found } from '../utils.js'; /** @typedef {(req: Req, res: Res, next: () => void) => void} Handler */ /** - * @param {{ - * middlewares: import('connect').Server; - * httpServer: import('http').Server; - * }} vite + * @param {{ middlewares: import('connect').Server }} vite * @param {import('vite').ResolvedConfig} vite_config * @param {import('types').ValidatedConfig} svelte_config */ diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 852b09a7446e..80abcfd65742 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -56,9 +56,9 @@ function update_scroll_positions(index) { } /** - * @param {import('./types').SvelteKitApp} app + * @param {import('./types.js').SvelteKitApp} app * @param {HTMLElement} target - * @returns {import('./types').Client} + * @returns {import('./types.js').Client} */ export function create_client(app, target) { const routes = parse(app); @@ -83,7 +83,7 @@ export function create_client(app, target) { */ const components = []; - /** @type {{id: string, promise: Promise} | null} */ + /** @type {{id: string, promise: Promise} | null} */ let load_cache = null; const callbacks = { @@ -97,7 +97,7 @@ export function create_client(app, target) { after_navigate: [] }; - /** @type {import('./types').NavigationState} */ + /** @type {import('./types.js').NavigationState} */ let current = { branch: [], error: null, @@ -248,7 +248,7 @@ export function create_client(app, target) { }); } - /** @param {import('./types').NavigationIntent} intent */ + /** @param {import('./types.js').NavigationIntent} intent */ async function preload_data(intent) { load_cache = { id: intent.id, @@ -275,7 +275,7 @@ export function create_client(app, target) { await Promise.all(promises); } - /** @param {import('./types').NavigationFinished} result */ + /** @param {import('./types.js').NavigationFinished} result */ function initialize(result) { if (DEV && result.state.error && document.querySelector('vite-error-overlay')) return; @@ -316,7 +316,7 @@ export function create_client(app, target) { * @param {{ * url: URL; * params: Record; - * branch: Array; + * branch: Array; * status: number; * error: App.Error | null; * route: import('types').CSRRoute | null; @@ -341,7 +341,7 @@ export function create_client(app, target) { // eslint-disable-next-line url.search = url.search; // turn `/?` into `/` - /** @type {import('./types').NavigationFinished} */ + /** @type {import('./types.js').NavigationFinished} */ const result = { type: 'loaded', state: { @@ -418,9 +418,9 @@ export function create_client(app, target) { * url: URL; * params: Record; * route: { id: string | null }; - * server_data_node: import('./types').DataNode | null; + * server_data_node: import('./types.js').DataNode | null; * }} options - * @returns {Promise} + * @returns {Promise} */ async function load_node({ loader, parent, url, params, route, server_data_node }) { /** @type {Record | null} */ @@ -590,8 +590,8 @@ export function create_client(app, target) { /** * @param {import('types').ServerDataNode | import('types').ServerDataSkippedNode | null} node - * @param {import('./types').DataNode | null} [previous] - * @returns {import('./types').DataNode | null} + * @param {import('./types.js').DataNode | null} [previous] + * @returns {import('./types.js').DataNode | null} */ function create_data_node(node, previous) { if (node?.type === 'data') return node; @@ -600,8 +600,8 @@ export function create_client(app, target) { } /** - * @param {import('./types').NavigationIntent} intent - * @returns {Promise} + * @param {import('./types.js').NavigationIntent} intent + * @returns {Promise} */ async function load_route({ id, invalidating, url, params, route }) { if (load_cache?.id === id) { @@ -665,7 +665,7 @@ export function create_client(app, target) { const branch_promises = loaders.map(async (loader, i) => { if (!loader) return; - /** @type {import('./types').BranchNode | undefined} */ + /** @type {import('./types.js').BranchNode | undefined} */ const previous = current.branch[i]; const server_data_node = server_data_nodes?.[i]; @@ -708,7 +708,7 @@ export function create_client(app, target) { // if we don't do this, rejections will be unhandled for (const p of branch_promises) p.catch(() => {}); - /** @type {Array} */ + /** @type {Array} */ const branch = []; for (let i = 0; i < loaders.length; i += 1) { @@ -782,9 +782,9 @@ export function create_client(app, target) { /** * @param {number} i Start index to backtrack from - * @param {Array} branch Branch to backtrack + * @param {Array} branch Branch to backtrack * @param {Array} errors All error pages for this branch - * @returns {Promise<{idx: number; node: import('./types').BranchNode} | undefined>} + * @returns {Promise<{idx: number; node: import('./types.js').BranchNode} | undefined>} */ async function load_nearest_error_page(i, branch, errors) { while (i--) { @@ -816,7 +816,7 @@ export function create_client(app, target) { * url: URL; * route: { id: string | null } * }} opts - * @returns {Promise} + * @returns {Promise} */ async function load_root_error_page({ status, error, url, route }) { /** @type {Record} */ @@ -859,7 +859,7 @@ export function create_client(app, target) { server_data_node: create_data_node(server_data_node) }); - /** @type {import('./types').BranchNode} */ + /** @type {import('./types.js').BranchNode} */ const root_error = { node: await default_error_loader(), loader: default_error_loader, @@ -892,7 +892,7 @@ export function create_client(app, target) { if (params) { const id = url.pathname + url.search; - /** @type {import('./types').NavigationIntent} */ + /** @type {import('./types.js').NavigationIntent} */ const intent = { id, invalidating, route, params: decode_params(params), url }; return intent; } @@ -908,7 +908,7 @@ export function create_client(app, target) { * @param {{ * url: URL; * type: import('@sveltejs/kit').Navigation["type"]; - * intent?: import('./types').NavigationIntent; + * intent?: import('./types.js').NavigationIntent; * delta?: number; * }} opts */ @@ -1171,7 +1171,7 @@ export function create_client(app, target) { * @param {{ id: string | null }} route * @param {App.Error} error * @param {number} status - * @returns {Promise} + * @returns {Promise} */ async function server_fallback(url, route, error, status) { if (url.origin === origin && url.pathname === location.pathname && !hydrated) { @@ -1766,7 +1766,7 @@ export function create_client(app, target) { ({ params = {}, route = { id: null } } = get_navigation_intent(url, false) || {}); } - /** @type {import('./types').NavigationFinished | undefined} */ + /** @type {import('./types.js').NavigationFinished | undefined} */ let result; try { @@ -1793,7 +1793,7 @@ export function create_client(app, target) { }); }); - /** @type {Array} */ + /** @type {Array} */ const branch = await Promise.all(branch_promises); const parsed_route = routes.find(({ id }) => id === route.id); @@ -2019,8 +2019,8 @@ function reset_focus() { } /** - * @param {import('./types').NavigationState} current - * @param {import('./types').NavigationIntent | undefined} intent + * @param {import('./types.js').NavigationState} current + * @param {import('./types.js').NavigationIntent | undefined} intent * @param {URL | null} url * @param {Exclude} type */ diff --git a/packages/kit/src/runtime/client/parse.js b/packages/kit/src/runtime/client/parse.js index d148b2888c72..5abf1a7e38d3 100644 --- a/packages/kit/src/runtime/client/parse.js +++ b/packages/kit/src/runtime/client/parse.js @@ -1,7 +1,7 @@ import { exec, parse_route_id } from '../../utils/routing.js'; /** - * @param {import('./types').SvelteKitApp} app + * @param {import('./types.js').SvelteKitApp} app * @returns {import('types').CSRRoute[]} */ export function parse({ nodes, server_loads, dictionary, matchers }) { diff --git a/packages/kit/src/runtime/client/singletons.js b/packages/kit/src/runtime/client/singletons.js index 2d2d15095f1b..e6bf5808eef9 100644 --- a/packages/kit/src/runtime/client/singletons.js +++ b/packages/kit/src/runtime/client/singletons.js @@ -2,12 +2,12 @@ import { writable } from 'svelte/store'; import { create_updated_store, notifiable_store } from './utils.js'; import { BROWSER } from 'esm-env'; -/** @type {import('./types').Client} */ +/** @type {import('./types.js').Client} */ export let client; /** * @param {{ - * client: import('./types').Client; + * client: import('./types.js').Client; * }} opts */ export function init(opts) { diff --git a/packages/kit/src/runtime/client/start.js b/packages/kit/src/runtime/client/start.js index 70e0d73476f8..0ef12e627131 100644 --- a/packages/kit/src/runtime/client/start.js +++ b/packages/kit/src/runtime/client/start.js @@ -3,9 +3,9 @@ import { create_client } from './client.js'; import { init } from './singletons.js'; /** - * @param {import('./types').SvelteKitApp} app + * @param {import('./types.js').SvelteKitApp} app * @param {HTMLElement} target - * @param {Parameters[0]} [hydrate] + * @param {Parameters[0]} [hydrate] */ export async function start(app, target, hydrate) { if (DEV && target === document.body) { diff --git a/packages/kit/src/runtime/client/types.d.ts b/packages/kit/src/runtime/client/types.d.ts index af8619c54862..6466bd916447 100644 --- a/packages/kit/src/runtime/client/types.d.ts +++ b/packages/kit/src/runtime/client/types.d.ts @@ -1,4 +1,4 @@ -import { applyAction } from '../app/forms'; +import { applyAction } from '../app/forms.js'; import { afterNavigate, beforeNavigate, @@ -8,7 +8,7 @@ import { invalidateAll, preloadCode, preloadData -} from '../app/navigation'; +} from '../app/navigation.js'; import { SvelteComponent } from 'svelte'; import { ClientHooks, CSRPageNode, CSRPageNodeLoader, CSRRoute, TrailingSlash, Uses } from 'types'; import { Page, ParamMatcher } from '@sveltejs/kit'; diff --git a/packages/kit/src/runtime/server/cookie.js b/packages/kit/src/runtime/server/cookie.js index 644e41b733e3..90fb9e7c126e 100644 --- a/packages/kit/src/runtime/server/cookie.js +++ b/packages/kit/src/runtime/server/cookie.js @@ -27,7 +27,7 @@ export function get_cookies(request, url, trailing_slash) { // Emulate browser-behavior: if the cookie is set at '/foo/bar', its path is '/foo' const default_path = normalized_url.split('/').slice(0, -1).join('/') || '/'; - /** @type {Record} */ + /** @type {Record} */ const new_cookies = {}; /** @type {import('cookie').CookieSerializeOptions} */ @@ -232,7 +232,7 @@ export function path_matches(path, constraint) { /** * @param {Headers} headers - * @param {import('./page/types').Cookie[]} cookies + * @param {import('./page/types.js').Cookie[]} cookies */ export function add_cookies_to_headers(headers, cookies) { for (const new_cookie of cookies) { diff --git a/packages/kit/src/runtime/server/page/csp.js b/packages/kit/src/runtime/server/page/csp.js index 77cde16c9ef4..a1a530d9d62e 100644 --- a/packages/kit/src/runtime/server/page/csp.js +++ b/packages/kit/src/runtime/server/page/csp.js @@ -223,8 +223,8 @@ export class Csp { report_only_provider; /** - * @param {import('./types').CspConfig} config - * @param {import('./types').CspOpts} opts + * @param {import('./types.js').CspConfig} config + * @param {import('./types.js').CspOpts} opts */ constructor({ mode, directives, reportOnly }, { prerender }) { const use_hashes = mode === 'hash' || (mode === 'auto' && prerender); diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index f99391b1365f..dbc3b29905f5 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -96,7 +96,7 @@ export async function render_page(event, page, options, manifest, state, resolve // inherit the prerender option of the page state.prerender_default = should_prerender; - /** @type {import('./types').Fetched[]} */ + /** @type {import('./types.js').Fetched[]} */ const fetched = []; if (get_option(nodes, 'ssr') === false && !state.prerendering) { diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index bcc2443aede6..1dbabbe2766c 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -144,7 +144,7 @@ export async function load_server_data({ * Calls the user's `load` function. * @param {{ * event: import('@sveltejs/kit').RequestEvent; - * fetched: import('./types').Fetched[]; + * fetched: import('./types.js').Fetched[]; * node: import('types').SSRNode | undefined; * parent: () => Promise>; * resolve_opts: import('types').RequiredResolveOptions; @@ -192,7 +192,7 @@ export async function load_data({ /** * @param {Pick} event * @param {import('types').SSRState} state - * @param {import('./types').Fetched[]} fetched + * @param {import('./types.js').Fetched[]} fetched * @param {boolean} csr * @param {Pick, 'filterSerializedResponseHeaders'>} resolve_opts */ diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 102a61204754..dbc558151fd2 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -26,8 +26,8 @@ const encoder = new TextEncoder(); /** * Creates the HTML response. * @param {{ - * branch: Array; - * fetched: Array; + * branch: Array; + * fetched: Array; * options: import('types').SSROptions; * manifest: import('@sveltejs/kit').SSRManifest; * state: import('types').SSRState; diff --git a/packages/kit/src/runtime/server/page/respond_with_error.js b/packages/kit/src/runtime/server/page/respond_with_error.js index f1475cc5bb76..59e3697896e1 100644 --- a/packages/kit/src/runtime/server/page/respond_with_error.js +++ b/packages/kit/src/runtime/server/page/respond_with_error.js @@ -33,7 +33,7 @@ export async function respond_with_error({ return static_error_page(options, status, /** @type {Error} */ (error).message); } - /** @type {import('./types').Fetched[]} */ + /** @type {import('./types.js').Fetched[]} */ const fetched = []; try { diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 7967658c77f1..44b0e19a6975 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -134,7 +134,7 @@ export async function respond(request, options, manifest, state) { /** @type {Record} */ const headers = {}; - /** @type {Record} */ + /** @type {Record} */ let cookies_to_add = {}; /** @type {import('@sveltejs/kit').RequestEvent} */ diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 84ffcd4bc4ef..ea3023245503 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -414,5 +414,5 @@ export type ValidatedConfig = RecursiveRequired; export type ValidatedKitConfig = RecursiveRequired; -export * from '../exports/index'; +export * from '../exports/index.js'; export * from './private.js'; diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/tsconfig.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/tsconfig.json index c7b5481da90e..f183bec09bb0 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/tsconfig.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/tsconfig.json b/packages/kit/test/build-errors/apps/private-dynamic-env/tsconfig.json index c7b5481da90e..f183bec09bb0 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/tsconfig.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/tsconfig.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/tsconfig.json index c7b5481da90e..f183bec09bb0 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/tsconfig.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/private-static-env/tsconfig.json b/packages/kit/test/build-errors/apps/private-static-env/tsconfig.json index c7b5481da90e..f183bec09bb0 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/tsconfig.json +++ b/packages/kit/test/build-errors/apps/private-static-env/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/tsconfig.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/tsconfig.json index 3688e97000b5..c35fe0130e1e 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/tsconfig.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/server-only-folder/tsconfig.json b/packages/kit/test/build-errors/apps/server-only-folder/tsconfig.json index 3688e97000b5..c35fe0130e1e 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/tsconfig.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/tsconfig.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/tsconfig.json index 3688e97000b5..c35fe0130e1e 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/tsconfig.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/server-only-module/tsconfig.json b/packages/kit/test/build-errors/apps/server-only-module/tsconfig.json index 3688e97000b5..c35fe0130e1e 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/tsconfig.json +++ b/packages/kit/test/build-errors/apps/server-only-module/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/test/build-errors/apps/syntax-error/tsconfig.json b/packages/kit/test/build-errors/apps/syntax-error/tsconfig.json index 3688e97000b5..c35fe0130e1e 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/tsconfig.json +++ b/packages/kit/test/build-errors/apps/syntax-error/tsconfig.json @@ -6,7 +6,6 @@ "esModuleInterop": true, "forceConsistentCasingInFileNames": true, "resolveJsonModule": true, - "skipLibCheck": true, "sourceMap": true, "strict": true, "noEmit": true, diff --git a/packages/kit/tsconfig.json b/packages/kit/tsconfig.json index a8546e14e52c..8425dc63819c 100644 --- a/packages/kit/tsconfig.json +++ b/packages/kit/tsconfig.json @@ -4,15 +4,15 @@ "checkJs": true, "noEmit": true, "strict": true, - "target": "es2020", - "module": "es2022", - "moduleResolution": "node", + "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "allowSyntheticDefaultImports": true, "paths": { "@sveltejs/kit": ["./src/exports/public.d.ts"], "@sveltejs/kit/node": ["./src/exports/node/index.js"], // internal use only - "types": ["./src/types/internal"] + "types": ["./src/types/internal.d.ts"] }, "noUnusedLocals": true, "noUnusedParameters": true diff --git a/packages/migrate/tsconfig.json b/packages/migrate/tsconfig.json index 1bd4194a49b1..26ec8077781d 100644 --- a/packages/migrate/tsconfig.json +++ b/packages/migrate/tsconfig.json @@ -4,9 +4,9 @@ "checkJs": true, "noEmit": true, "strict": true, - "target": "esnext", - "module": "esnext", - "moduleResolution": "node", + "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "allowSyntheticDefaultImports": true }, "include": ["./migrations/**/*", "./utils.js", "./bin.js"] diff --git a/packages/package/src/cli.js b/packages/package/src/cli.js index 6c0239c6d455..cc464eddfe33 100644 --- a/packages/package/src/cli.js +++ b/packages/package/src/cli.js @@ -37,7 +37,7 @@ prog const packaging = await import('./index.js'); - /** @type {import('./types').Options} */ + /** @type {import('./types.js').Options} */ const options = { cwd: process.cwd(), input: args.input ?? config.kit?.files?.lib ?? 'src/lib', diff --git a/packages/package/src/config.js b/packages/package/src/config.js index 4483c303948d..81d9756d7772 100644 --- a/packages/package/src/config.js +++ b/packages/package/src/config.js @@ -5,7 +5,7 @@ import url from 'node:url'; /** * Loads and validates svelte.config.js * @param {{ cwd?: string }} options - * @returns {Promise} + * @returns {Promise} */ export async function load_config({ cwd = process.cwd() } = {}) { const config_file = path.join(cwd, 'svelte.config.js'); diff --git a/packages/package/src/index.js b/packages/package/src/index.js index 8e0165513323..1970464779bc 100644 --- a/packages/package/src/index.js +++ b/packages/package/src/index.js @@ -9,7 +9,7 @@ import { emit_dts, transpile_ts } from './typescript.js'; import { create_validator } from './validate.js'; /** - * @param {import('./types').Options} options + * @param {import('./types.js').Options} options */ export async function build(options) { const { analyse_code, validate } = create_validator(options); @@ -18,7 +18,7 @@ export async function build(options) { } /** - * @param {import('./types').Options} options + * @param {import('./types.js').Options} options * @param {(name: string, code: string) => void} analyse_code */ async function do_build(options, analyse_code) { @@ -53,7 +53,7 @@ async function do_build(options, analyse_code) { } /** - * @param {import('./types').Options} options + * @param {import('./types.js').Options} options */ export async function watch(options) { const { analyse_code, validate } = create_validator(options); @@ -68,7 +68,7 @@ export async function watch(options) { console.log(message); - /** @type {Array<{ file: import('./types').File, type: string }>} */ + /** @type {Array<{ file: import('./types.js').File, type: string }>} */ const pending = []; /** @type {Array<(value?: any) => void>} */ @@ -159,7 +159,7 @@ export async function watch(options) { } /** - * @param {import('./types').Options} options + * @param {import('./types.js').Options} options */ function normalize_options(options) { const input = path.resolve(options.cwd, options.input); @@ -188,7 +188,7 @@ function normalize_options(options) { /** * @param {string} input * @param {string} output - * @param {import('./types').File} file + * @param {import('./types.js').File} file * @param {import('svelte/types/compiler/preprocess').PreprocessorGroup | undefined} preprocessor * @param {Record} aliases * @param {(name: string, code: string) => void} analyse_code diff --git a/packages/package/src/typescript.js b/packages/package/src/typescript.js index ff43e5be035e..7c02e63ffc5a 100644 --- a/packages/package/src/typescript.js +++ b/packages/package/src/typescript.js @@ -16,7 +16,7 @@ import { load_pkg_json } from './config.js'; * @param {string} output * @param {string} cwd * @param {Record} alias - * @param {import('./types').File[]} files + * @param {import('./types.js').File[]} files */ export async function emit_dts(input, output, cwd, alias, files) { const tmp = `${output}/__package_types_tmp__`; diff --git a/packages/package/src/utils.js b/packages/package/src/utils.js index 26605fbbdee7..e299509e78b5 100644 --- a/packages/package/src/utils.js +++ b/packages/package/src/utils.js @@ -63,7 +63,7 @@ export function write(file, contents) { /** * @param {string} input * @param {string[]} extensions - * @returns {import('./types').File[]} + * @returns {import('./types.js').File[]} */ export function scan(input, extensions) { return walk(input).map((file) => analyze(file, extensions)); @@ -72,7 +72,7 @@ export function scan(input, extensions) { /** * @param {string} file * @param {string[]} extensions - * @returns {import('./types').File} + * @returns {import('./types.js').File} */ export function analyze(file, extensions) { const name = posixify(file); diff --git a/packages/package/src/validate.js b/packages/package/src/validate.js index c0276aef7d90..808e99c01fdd 100644 --- a/packages/package/src/validate.js +++ b/packages/package/src/validate.js @@ -3,7 +3,7 @@ import { join } from 'node:path'; import colors from 'kleur'; /** - * @param {import("./types").Options} options + * @param {import("./types.js").Options} options */ export function create_validator(options) { const { analyse_code, validate } = _create_validator(options); @@ -38,7 +38,7 @@ export function create_validator(options) { }; } /** - * @param {import("./types").Options} options + * @param {import("./types.js").Options} options */ export function _create_validator(options) { /** @type {Set} */ diff --git a/packages/package/test/index.js b/packages/package/test/index.js index 2048bcf3a4e2..1dafa5da097b 100644 --- a/packages/package/test/index.js +++ b/packages/package/test/index.js @@ -16,7 +16,7 @@ const __dirname = join(__filename, '..'); /** * @param {string} path - * @param {Partial} [options] + * @param {Partial} [options] */ async function test_make_package(path, options) { const cwd = join(__dirname, 'fixtures', path); diff --git a/packages/package/tsconfig.json b/packages/package/tsconfig.json index 50f204450e75..c9e5965e3660 100644 --- a/packages/package/tsconfig.json +++ b/packages/package/tsconfig.json @@ -4,9 +4,9 @@ "checkJs": true, "noEmit": true, "strict": true, - "target": "es2020", - "module": "es2022", - "moduleResolution": "node", + "target": "es2022", + "module": "node16", + "moduleResolution": "node16", "allowSyntheticDefaultImports": true, "paths": { // internal use only diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9e8258a5689..2432619a3f17 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -182,8 +182,8 @@ importers: version: 3.29.4 devDependencies: '@polka/url': - specifier: ^1.0.0-next.21 - version: 1.0.0-next.21 + specifier: ^1.0.0-next.23 + version: 1.0.0-next.23 '@sveltejs/kit': specifier: workspace:^ version: link:../kit @@ -194,8 +194,8 @@ importers: specifier: ^8.0.0 version: 8.0.0 polka: - specifier: ^1.0.0-next.22 - version: 1.0.0-next.22 + specifier: ^1.0.0-next.23 + version: 1.0.0-next.23 sirv: specifier: ^2.0.3 version: 2.0.3 @@ -1913,8 +1913,8 @@ packages: playwright-core: 1.30.0 dev: true - /@polka/url@1.0.0-next.21: - resolution: {integrity: sha512-a5Sab1C4/icpTZVzZc5Ghpz88yQtGOyNqYXcZgOssB2uuAr+wF/MvN6bgtW32q7HHrvBki+BsZ0OuNv6EV3K9g==} + /@polka/url@1.0.0-next.23: + resolution: {integrity: sha512-C16M+IYz0rgRhWZdCmK+h58JMv8vijAA61gmz2rspCSwKwzBebpdcsiUmwrtJRdphuY30i6BSLEOP8ppbNLyLg==} /@rollup/plugin-commonjs@25.0.0(rollup@3.29.4): resolution: {integrity: sha512-hoho2Kay9TZrLu0bnDsTTCaj4Npa+THk9snajP/XDNb9a9mmjTjh52EQM9sKl3HD1LsnihX7js+eA2sd2uKAhw==} @@ -4996,11 +4996,11 @@ packages: engines: {node: '>=4'} dev: true - /polka@1.0.0-next.22: - resolution: {integrity: sha512-a7tsZy5gFbJr0aUltZS97xCkbPglXuD67AMvTyZX7BTDBH384FWf0ZQF6rPvdutSxnO1vUlXM2zSLf5tCKk5RA==} + /polka@1.0.0-next.23: + resolution: {integrity: sha512-19z2ny2aGdx+dns3icsQy6G7sWe0Dg7QTqSGE4B010EFbxvGzjjn37gBBjM8T0K2p6rthZ6+oXoBF3DcFceOPA==} engines: {node: '>=8'} dependencies: - '@polka/url': 1.0.0-next.21 + '@polka/url': 1.0.0-next.23 trouter: 3.2.1 dev: true @@ -5520,7 +5520,7 @@ packages: resolution: {integrity: sha512-O9jm9BsID1P+0HOi81VpXPoDxYP374pkOLzACAoyUQ/3OUVndNpsz6wMnY2z+yOxzbllCKZrM+9QrWsv4THnyA==} engines: {node: '>= 10'} dependencies: - '@polka/url': 1.0.0-next.21 + '@polka/url': 1.0.0-next.23 mrmime: 1.0.1 totalist: 3.0.1 diff --git a/sites/kit.svelte.dev/src/lib/server/docs/index.js b/sites/kit.svelte.dev/src/lib/server/docs/index.js index eac02fb567ce..d78eba9b767b 100644 --- a/sites/kit.svelte.dev/src/lib/server/docs/index.js +++ b/sites/kit.svelte.dev/src/lib/server/docs/index.js @@ -13,7 +13,7 @@ import { CONTENT_BASE_PATHS } from '../../../constants.js'; import { render_content } from '../renderer'; /** - * @param {import('./types').DocsData} docs_data + * @param {import('./types.js').DocsData} docs_data * @param {string} slug */ export async function get_parsed_docs(docs_data, slug) { @@ -29,9 +29,9 @@ export async function get_parsed_docs(docs_data, slug) { } } -/** @return {Promise} */ +/** @return {Promise} */ export async function get_docs_data(base = CONTENT_BASE_PATHS.DOCS) { - /** @type {import('./types').DocsData} */ + /** @type {import('./types.js').DocsData} */ const docs_data = []; for (const category_dir of await readdir(base)) { @@ -47,7 +47,7 @@ export async function get_docs_data(base = CONTENT_BASE_PATHS.DOCS) { if (draft === 'true') continue; - /** @type {import('./types').Category} */ + /** @type {import('./types.js').Category} */ const category = { title: category_title, slug: category_slug, @@ -88,7 +88,7 @@ export async function get_docs_data(base = CONTENT_BASE_PATHS.DOCS) { return docs_data; } -/** @param {import('./types').DocsData} docs_data */ +/** @param {import('./types.js').DocsData} docs_data */ export function get_docs_list(docs_data) { return docs_data.map((category) => ({ title: category.title, @@ -102,7 +102,7 @@ export function get_docs_list(docs_data) { /** @param {string} markdown */ async function get_sections(markdown) { const headingRegex = /^##\s+(.*)$/gm; - /** @type {import('./types').Section[]} */ + /** @type {import('./types.js').Section[]} */ const secondLevelHeadings = []; let match; diff --git a/sites/kit.svelte.dev/tsconfig.json b/sites/kit.svelte.dev/tsconfig.json index db9370bd28e1..b7507e5607cf 100644 --- a/sites/kit.svelte.dev/tsconfig.json +++ b/sites/kit.svelte.dev/tsconfig.json @@ -4,6 +4,7 @@ "allowJs": true, "checkJs": true, "allowSyntheticDefaultImports": true, + "module": "es2022", "moduleResolution": "bundler", "outDir": "build" } From c52aab6e8932420dff6671dc1028fadb8647c24a Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 11 Nov 2023 06:33:00 -0800 Subject: [PATCH 0028/1135] feat: image preprocessor (#10788) --- .changeset/eighty-timers-exist.md | 5 + .changeset/rare-owls-tease.md | 5 + documentation/docs/30-advanced/60-assets.md | 23 -- documentation/docs/30-advanced/60-images.md | 150 ++++++++++ packages/enhanced-img/README.md | 17 ++ packages/enhanced-img/package.json | 42 +++ packages/enhanced-img/src/index.js | 135 +++++++++ packages/enhanced-img/src/preprocessor.js | 277 ++++++++++++++++++ packages/enhanced-img/test/Input.svelte | 43 +++ packages/enhanced-img/test/Output.svelte | 52 ++++ .../enhanced-img/test/preprocessor.spec.js | 58 ++++ packages/enhanced-img/tsconfig.json | 19 ++ packages/enhanced-img/types/ambient.d.ts | 4 + packages/enhanced-img/types/index.d.ts | 12 + packages/kit/src/core/sync/write_tsconfig.js | 1 + .../kit/src/core/sync/write_tsconfig.spec.js | 1 + pnpm-lock.yaml | 181 +++++++----- sites/kit.svelte.dev/package.json | 2 +- sites/kit.svelte.dev/src/app.d.ts | 12 + sites/kit.svelte.dev/src/globals.d.ts | 54 ---- sites/kit.svelte.dev/src/hooks.server.js | 5 +- sites/kit.svelte.dev/src/lib/Image.svelte | 18 -- .../src/routes/home/Hero.svelte | 20 +- .../src/routes/home/Showcase.svelte | 19 +- sites/kit.svelte.dev/vite.config.js | 25 +- 25 files changed, 968 insertions(+), 212 deletions(-) create mode 100644 .changeset/eighty-timers-exist.md create mode 100644 .changeset/rare-owls-tease.md delete mode 100644 documentation/docs/30-advanced/60-assets.md create mode 100644 documentation/docs/30-advanced/60-images.md create mode 100644 packages/enhanced-img/README.md create mode 100644 packages/enhanced-img/package.json create mode 100644 packages/enhanced-img/src/index.js create mode 100644 packages/enhanced-img/src/preprocessor.js create mode 100644 packages/enhanced-img/test/Input.svelte create mode 100644 packages/enhanced-img/test/Output.svelte create mode 100644 packages/enhanced-img/test/preprocessor.spec.js create mode 100644 packages/enhanced-img/tsconfig.json create mode 100644 packages/enhanced-img/types/ambient.d.ts create mode 100644 packages/enhanced-img/types/index.d.ts create mode 100644 sites/kit.svelte.dev/src/app.d.ts delete mode 100644 sites/kit.svelte.dev/src/globals.d.ts delete mode 100644 sites/kit.svelte.dev/src/lib/Image.svelte diff --git a/.changeset/eighty-timers-exist.md b/.changeset/eighty-timers-exist.md new file mode 100644 index 000000000000..090626a7c083 --- /dev/null +++ b/.changeset/eighty-timers-exist.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/static-img': patch +--- + +feat: add experimental `@sveltejs/enhanced-img` package diff --git a/.changeset/rare-owls-tease.md b/.changeset/rare-owls-tease.md new file mode 100644 index 000000000000..a09f81679d8b --- /dev/null +++ b/.changeset/rare-owls-tease.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: add vite.config.js to included files in generated tsconfig diff --git a/documentation/docs/30-advanced/60-assets.md b/documentation/docs/30-advanced/60-assets.md deleted file mode 100644 index 98edc45dd91b..000000000000 --- a/documentation/docs/30-advanced/60-assets.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Asset handling ---- - -## Caching and inlining - -[Vite will automatically process imported assets](https://vitejs.dev/guide/assets.html) for improved performance. Hashes will be added to the filenames so that they can be cached and assets smaller than `assetsInlineLimit` will be inlined. - -```html - - -The project logo -``` - -If you prefer to reference assets directly in the markup, you can use a preprocessor such as [svelte-preprocess-import-assets](https://github.com/bluwy/svelte-preprocess-import-assets). - -For assets included via the CSS `url()` function, you may find [`vitePreprocess`](https://kit.svelte.dev/docs/integrations#preprocessors-vitepreprocess) useful. - -## Transforming - -You may wish to transform your images to output compressed image formats such as `.webp` or `.avif`, responsive images with different sizes for different devices, or images with the EXIF data stripped for privacy. For images that are included statically, you may use a Vite plugin such as [vite-imagetools](https://github.com/JonasKruckenberg/imagetools). You may also consider a CDN, which can serve the appropriate transformed image based on the `Accept` HTTP header and query string parameters. diff --git a/documentation/docs/30-advanced/60-images.md b/documentation/docs/30-advanced/60-images.md new file mode 100644 index 000000000000..53a9e5fe4996 --- /dev/null +++ b/documentation/docs/30-advanced/60-images.md @@ -0,0 +1,150 @@ +--- +title: Images +--- + +Images can have a big impact on your app's performance. For best results, you should optimize them by doing the following: + +- generate optimal formats like `.avif` and `.webp` +- create different sizes for different screens +- ensure that assets can be cached effectively + +Doing this manually is tedious. There are a variety of techniques you can use, depending on your needs and preferences. + +## Vite's built-in handling + +[Vite will automatically process imported assets](https://vitejs.dev/guide/assets.html) for improved performance. This includes assets referenced via the CSS `url()` function. Hashes will be added to the filenames so that they can be cached, and assets smaller than `assetsInlineLimit` will be inlined. Vite's asset handling is most often used for images, but is also useful for video, audio, etc. + +```svelte + + +The project logo +``` + +## @sveltejs/enhanced-img + +> **WARNING**: The `@sveltejs/enhanced-img` package is experimental. It uses pre-1.0 versioning and may introduce breaking changes with every minor version release. + +`@sveltejs/enhanced-img` builds on top of Vite's built-in asset handling. It offers plug and play image processing that serves smaller file formats like `avif` or `webp`, automatically sets the intrinsic `width` and `height` of the image to avoid layout shift, creates images of multiple sizes for various devices, and strips EXIF data for privacy. It will work in any Vite-based project including, but not limited to, SvelteKit projects. + +### Setup + +Install: + +```bash +npm install --save-dev @sveltejs/enhanced-img +``` + +Adjust `vite.config.js`: + +```diff +import { sveltekit } from '@sveltejs/kit/vite'; ++import { enhancedImages } from '@sveltejs/enhanced-img'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [ ++ enhancedImages(), + sveltekit() + ] +}); +``` + +### Basic usage + +Use in your `.svelte` components by using `` rather than `` and referencing the image file with a [Vite asset import](https://vitejs.dev/guide/assets.html#static-asset-handling) path: + +```svelte + +``` + +At build time, your `` tag will be replaced with an `` wrapped by a `` providing multiple image types and sizes. It's only possible to downscale images without losing quality, which means that you should provide the highest resolution image that you need — smaller versions will be generated for the various device types that may request an image. + +You should provide your image at 2x resolution for HiDPI displays (a.k.a. retina displays). `` will automatically take care of serving smaller versions to smaller devices. + +If you wish to add styles to your ``, you should add a `class` and target that. + +### Dynamically choosing an image + +You can also manually import an image asset and pass it to an ``. This is useful when you have a collection of static images and would like to dynamically choose one or [iterate over them](https://github.com/sveltejs/kit/blob/master/sites/kit.svelte.dev/src/routes/home/Showcase.svelte). In this case you will need to update both the `import` statement and `` element as shown below to indicate you'd like process them. + +```svelte + + + +``` + +You can also use [Vite's `import.meta.glob`](https://vitejs.dev/guide/features.html#glob-import). Note that you will have to specify `enhanced` via a [custom query](https://vitejs.dev/guide/features.html#custom-queries): + +```js +const pictures = import.meta.glob( + '/path/to/assets/*.{avif,gif,heif,jpeg,jpg,png,tiff,webp}', + { + query: { + enhanced: true + } + } +); +``` + +### Intrinsic Dimensions + +`width` and `height` are optional as they can be inferred from the source image and will be automatically added when the `` tag is preprocessed. With these attributes, the browser can reserve the correct amount of space, preventing [layout shift](https://web.dev/articles/cls). If you'd like to use a different `width` and `height` you can style the image with CSS. Because the preprocessor adds a `width` and `height` for you, if you'd like one of the dimensions to be automatically calculated then you will need to specify that: + +```svelte + +``` + +### `srcset` and `sizes` + +If you have a large image, such as a hero image taking the width of the design, you should specify `sizes` so that smaller versions are requested on smaller devices. E.g. if you have a 1280px image you may want to specify something like: + +```svelte + +``` + +If `sizes` is specified, `` will generate small images for smaller devices and populate the `srcset` attribute. + +The smallest picture generated automatically will have a width of 540px. If you'd like smaller images or would otherwise like to specify custom widths, you can do that with the `w` query parameter: +```svelte + +``` + +If `sizes` is not provided, then a HiDPI/Retina image and a standard resolution image will be generated. The image you provide should be 2x the resolution you wish to display so that the browser can display that image on devices with a high [device pixel ratio](https://developer.mozilla.org/en-US/docs/Web/API/Window/devicePixelRatio). + +### Per-image transforms + +By default, enhanced images will be transformed to more efficient formats. However, you may wish to apply other transforms such as a blur, quality, flatten, or rotate operation. You can run per-image transforms by appending a query string: + +```svelte + +``` + +[See the imagetools repo for the full list of directives](https://github.com/JonasKruckenberg/imagetools/blob/main/docs/directives.md). + +## Loading images dynamically from a CDN + +In some cases, the images may not be accessible at build time — e.g. they may live inside a content management system or elsewhere. + +Using a content delivery network (CDN) can allow you to optimize these images dynamically, and provides more flexibility with regards to sizes, but it may involve some setup overhead and usage costs. Depending on caching strategy, the browser may not be able to use a cached copy of the asset until a [304 response](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status/304) is received from the CDN. Building HTML to target CDNs may result in slightly smaller and simpler HTML because they can serve the appropriate file format for an `` tag based on the `User-Agent` header whereas build-time optimizations must produce `` tags with multiple sources. Finally, some CDNs may generate images lazily, which could have a negative performance impact for sites with low traffic and frequently changing images. We do not currently offer any tools for dynamic image transforms, but we may offer such utilities in the future. + +## Best practices + +- For each image type, use the appropriate solution from those discussed above. You can mix and match all three solutions in one project. For example, you may use Vite's built-in handling to provide images for `` tags, display images on your homepage with `@sveltejs/enhanced-img`, and display user-submitted content with a dynamic approach. +- Consider serving all images via CDN regardless of the image optimization types you use. CDNs reduce latency by distributing copies of static assets globally. +- Your original images should have a good quality/resolution and should have 2x the width it will be displayed at to serve HiDPI devices. Image processing can size images down to save bandwidth when serving smaller screens, but it would be a waste of bandwidth to invent pixels to size images up. +- For images which are much larger than the width of a mobile device (roughly 400px), such as a hero image taking the width of the page design, specify `sizes` so that smaller images can be served on smaller devices. +- Choose one image per page which is the most important/largest one and give it `priority` so it loads faster. This gives you better web vitals scores (largest contentful paint in particular). +- Give the image a container or styling so that it is constrained and does not jump around. `width` and `height` help the browser reserving space while the image is still loading. `@sveltejs/enhanced-img` will add a `width` and `height` for you. +- Always provide a good `alt` text. The Svelte compiler will warn you if you don't do this. diff --git a/packages/enhanced-img/README.md b/packages/enhanced-img/README.md new file mode 100644 index 000000000000..7116c7695808 --- /dev/null +++ b/packages/enhanced-img/README.md @@ -0,0 +1,17 @@ +# `@sveltejs/enhanced-img` + +A Vite plugin which runs a Svelte preprocessor to locate images and then transform them at build-time. + +**WARNING**: This package is experimental. It uses pre-1.0 versioning and may introduce breaking changes with every minor version release. + +## Docs + +[Docs](https://kit.svelte.dev/docs/images) + +## Changelog + +[The Changelog for this package is available on GitHub](https://github.com/sveltejs/kit/blob/master/packages/enhanced-img/CHANGELOG.md). + +## Acknowledgements + +We'd like to thank the author of `svelte-preprocess-import-assets`, which this code is partially based off of. We'd also like to thank the authors of `vite-imagetools` which is used in `@sveltejs/enhanced-img`. diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json new file mode 100644 index 000000000000..7381a8fdbfc4 --- /dev/null +++ b/packages/enhanced-img/package.json @@ -0,0 +1,42 @@ +{ + "name": "@sveltejs/enhanced-img", + "version": "0.1.0", + "description": "Image optimization for your Svelte apps", + "repository": { + "type": "git", + "url": "https://github.com/sveltejs/kit", + "directory": "packages/image" + }, + "license": "MIT", + "homepage": "https://kit.svelte.dev", + "type": "module", + "scripts": { + "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "check": "tsc", + "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", + "test": "vitest" + }, + "files": [ + "src", + "types" + ], + "exports": { + "types": "./types/index.d.ts", + "import": "./src/index.js" + }, + "types": "types/index.d.ts", + "dependencies": { + "magic-string": "^0.30.0", + "svelte-parse-markup": "^0.1.1", + "vite-imagetools": "^6.2.3" + }, + "devDependencies": { + "@types/estree": "^1.0.2", + "@types/node": "^16.18.6", + "estree-walker": "^3.0.3", + "svelte": "^4.0.5", + "typescript": "^4.9.4", + "vite": "^4.4.2", + "vitest": "^0.34.0" + } +} diff --git a/packages/enhanced-img/src/index.js b/packages/enhanced-img/src/index.js new file mode 100644 index 000000000000..438b1ced6260 --- /dev/null +++ b/packages/enhanced-img/src/index.js @@ -0,0 +1,135 @@ +import path from 'node:path'; +import { image } from './preprocessor.js'; + +/** + * @returns {Promise} + */ +export async function enhancedImages() { + const imagetools_plugin = await imagetools(); + if (!imagetools_plugin) { + console.error( + '@sveltejs/enhanced-img: vite-imagetools is not installed. Skipping build-time optimizations' + ); + } + return imagetools_plugin && !process.versions.webcontainer + ? [image_plugin(imagetools_plugin), imagetools_plugin] + : []; +} + +/** + * Creates the Svelte image plugin which provides the preprocessor. + * @param {import('vite').Plugin} imagetools_plugin + * @returns {import('vite').Plugin} + */ +function image_plugin(imagetools_plugin) { + /** + * @type {{ + * plugin_context: import('rollup').PluginContext + * imagetools_plugin: import('vite').Plugin + * }} + */ + const opts = { + // @ts-expect-error populated when build starts so we cheat on type + plugin_context: undefined, + imagetools_plugin + }; + const preprocessor = image(opts); + + return { + name: 'vite-plugin-enhanced-img', + api: { + sveltePreprocess: preprocessor + }, + buildStart() { + opts.plugin_context = this; + } + }; +} + +/** @type {Record} */ +const fallback = { + '.avif': 'png', + '.gif': 'gif', + '.heif': 'jpg', + '.jpeg': 'jpg', + '.jpg': 'jpg', + '.png': 'png', + '.tiff': 'jpg', + '.webp': 'png' +}; + +async function imagetools() { + /** @type {typeof import('vite-imagetools').imagetools} */ + let imagetools; + try { + ({ imagetools } = await import('vite-imagetools')); + } catch (err) { + return; + } + + /** @type {Partial} */ + const imagetools_opts = { + defaultDirectives: async ({ pathname, searchParams: qs }, metadata) => { + if (!qs.has('enhanced')) return new URLSearchParams(); + + const img_width = qs.get('imgWidth'); + const width = img_width ? parseInt(img_width) : (await metadata()).width; + if (!width) { + console.warn(`Could not determine width of image ${pathname}`); + return new URLSearchParams(); + } + + const { widths, kind } = get_widths(width, qs.get('imgSizes')); + return new URLSearchParams({ + as: 'picture', + format: `avif;webp;${fallback[path.extname(pathname)] ?? 'png'}`, + w: widths.join(';'), + ...(kind === 'x' && !qs.has('w') && { basePixels: widths[0].toString() }) + }); + }, + namedExports: false + }; + + // TODO: should we make formats or sizes configurable besides just letting people override defaultDirectives? + // TODO: generate img rather than picture if only a single format is provided + // by resolving the directives for the URL in the preprocessor + return imagetools(imagetools_opts); +} + +/** + * @param {number} width + * @param {string | null} sizes + * @returns {{ widths: number[]; kind: 'w' | 'x' }} + */ +function get_widths(width, sizes) { + // We don't really know what the user wants here. But if they have an image that's really big + // then we can probably assume they're always displaying it full viewport/breakpoint. + // If the user is displaying a responsive image then the size usually doesn't change that much + // Instead, the number of columns in the design may reduce and the image may take a greater + // fraction of the screen. + // Assume if they're bothering to specify sizes that it's going to take most of the screen + // as that's the case where an image may be rendered at very different sizes. Otherwise, it's + // probably a responsive image and a single size is okay (two when accounting for HiDPI). + if (sizes) { + // Use common device sizes. Doesn't hurt to include larger sizes as the user will rarely + // provide an image that large. + // https://screensiz.es/ + // https://gs.statcounter.com/screen-resolution-stats (note: logical. we want physical) + // Include 1080 because lighthouse uses a moto g4 with 360 logical pixels and 3x pixel ratio. + const widths = [540, 768, 1080, 1366, 1536, 1920, 2560, 3000, 4096, 5120]; + widths.push(width); + return { widths, kind: 'w' }; + } + + // Don't need more than 2x resolution. Note that due to this optimization, pixel density + // descriptors will often end up being cheaper as many mobile devices have pixel density ratios + // near 3 which would cause larger images to be chosen on mobile when using sizes. + + // Most OLED screens that say they are 3x resolution, are actually 3x in the green color, but + // only 1.5x in the red and blue colors. Showing a 3x resolution image in the app vs a 2x + // resolution image will be visually the same, though the 3x image takes significantly more + // data. Even true 3x resolution screens are wasteful as the human eye cannot see that level of + // detail without something like a magnifying glass. + // https://blog.twitter.com/engineering/en_us/topics/infrastructure/2019/capping-image-fidelity-on-ultra-high-resolution-devices.html + return { widths: [Math.round(width / 2), width], kind: 'x' }; +} diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js new file mode 100644 index 000000000000..15b050a87393 --- /dev/null +++ b/packages/enhanced-img/src/preprocessor.js @@ -0,0 +1,277 @@ +import MagicString from 'magic-string'; +import { asyncWalk } from 'estree-walker'; +import { parse } from 'svelte-parse-markup'; + +const ASSET_PREFIX = '___ASSET___'; + +// TODO: expose this in vite-imagetools rather than duplicating it +const OPTIMIZABLE = /^[^?]+\.(avif|heif|gif|jpeg|jpg|png|tiff|webp)(\?.*)?$/; + +/** + * @param {{ + * plugin_context: import('rollup').PluginContext + * imagetools_plugin: import('vite').Plugin + * }} opts + * @returns {import('svelte/types/compiler/preprocess').PreprocessorGroup} + */ +export function image(opts) { + // TODO: clear this map in dev mode to avoid memory leak + /** + * URL to image details + * @type {Map} + */ + const images = new Map(); + + return { + async markup({ content, filename }) { + if (!content.includes('} + */ + async function update_element(node, src_attribute) { + // TODO: this will become ExpressionTag in Svelte 5 + if (src_attribute.type === 'MustacheTag') { + const src_var_name = content + .substring(src_attribute.start + 1, src_attribute.end - 1) + .trim(); + s.update(node.start, node.end, dynamic_img_to_picture(content, node, src_var_name)); + return; + } + + let url = src_attribute.raw.trim(); + + const sizes = get_attr_value(node, 'sizes'); + const width = get_attr_value(node, 'width'); + url += url.includes('?') ? '&' : '?'; + if (sizes) { + url += 'imgSizes=' + encodeURIComponent(sizes.raw) + '&'; + } + if (width) { + url += 'imgWidth=' + encodeURIComponent(width.raw) + '&'; + } + url += 'enhanced'; + + let details = images.get(url); + if (!details) { + // resolves the import so that we can build the entire picture template string and don't + // need any logic blocks + const image = await resolve(opts, url, filename); + if (!image) { + return; + } + details = images.get(url) || { name: ASSET_PREFIX + images.size, image }; + images.set(url, details); + } + + if (OPTIMIZABLE.test(url)) { + s.update(node.start, node.end, img_to_picture(content, node, details)); + } else { + // e.g. => + s.update(src_attribute.start, src_attribute.end, `{${details}}`); + } + } + + // TODO: switch to zimmerframe with Svelte 5 + // @ts-ignore + await asyncWalk(ast.html, { + /** + * @param {import('svelte/types/compiler/interfaces').TemplateNode} node + */ + async enter(node) { + if (node.type === 'Element') { + // Compare node tag match + if (node.name === 'enhanced:img') { + const src = get_attr_value(node, 'src'); + if (!src) return; + await update_element(node, src); + } + } + } + }); + + return { + code: s.toString(), + map: s.generateMap() + }; + } + }; +} + +/** + * @param {{ + * plugin_context: import('rollup').PluginContext + * imagetools_plugin: import('vite').Plugin + * }} opts + * @param {string} url + * @param {string | undefined} importer + * @returns {Promise} + */ +async function resolve(opts, url, importer) { + const resolved = await opts.plugin_context.resolve(url, importer); + const id = resolved?.id; + if (!id) { + return; + } + if (!opts.imagetools_plugin.load) { + throw new Error('Invalid instance of vite-imagetools. Could not find load method.'); + } + const hook = opts.imagetools_plugin.load; + const handler = typeof hook === 'object' ? hook.handler : hook; + const module_info = await handler.call(opts.plugin_context, id); + if (!module_info) { + throw new Error(`Could not load ${id}`); + } + const code = typeof module_info === 'string' ? module_info : module_info.code; + return parseObject(code.replace('export default', '').replace(/;$/, '').trim()); +} + +/** + * @param {string} str + */ +export function parseObject(str) { + const updated = str + .replaceAll(/{(\n\s*)?/gm, '{"') + .replaceAll(':', '":') + .replaceAll(/,(\n\s*)?([^ ])/g, ',"$2'); + try { + return JSON.parse(updated); + } catch (err) { + throw new Error(`Failed parsing string to object: ${str}`); + } +} + +/** + * @param {import('svelte/types/compiler/interfaces').TemplateNode} node + * @param {string} attr + */ +function get_attr_value(node, attr) { + const attribute = node.attributes.find( + /** @param {any} v */ (v) => v.type === 'Attribute' && v.name === attr + ); + + if (!attribute) return; + + return attribute.value[0]; +} + +/** + * @param {string} content + * @param {Array} attributes + * @param {{ + * src: string, + * width: string | number, + * height: string | number + * }} details + */ +function img_attributes_to_markdown(content, attributes, details) { + const attribute_strings = attributes.map((attribute) => { + if (attribute.name === 'src') { + return `src=${details.src}`; + } + return content.substring(attribute.start, attribute.end); + }); + + /** @type {number | undefined} */ + let user_width; + /** @type {number | undefined} */ + let user_height; + for (const attribute of attributes) { + if (attribute.name === 'width') user_width = parseInt(attribute.value[0]); + if (attribute.name === 'height') user_height = parseInt(attribute.value[0]); + } + if (!user_width && !user_height) { + attribute_strings.push(`width=${details.width}`); + attribute_strings.push(`height=${details.height}`); + } else if (!user_width && user_height) { + attribute_strings.push( + `width=${Math.round( + (stringToNumber(details.width) * user_height) / stringToNumber(details.height) + )}` + ); + } else if (!user_height && user_width) { + attribute_strings.push( + `height=${Math.round( + (stringToNumber(details.height) * user_width) / stringToNumber(details.width) + )}` + ); + } + + return attribute_strings.join(' '); +} + +/** + * @param {string|number} param + */ +function stringToNumber(param) { + return typeof param === 'string' ? parseInt(param) : param; +} + +/** + * @param {string} content + * @param {import('svelte/types/compiler/interfaces').TemplateNode} node + * @param {{ image: import('vite-imagetools').Picture, name: string }} details + */ +function img_to_picture(content, node, details) { + /** @type {Array} attributes */ + const attributes = node.attributes; + const index = attributes.findIndex((attribute) => attribute.name === 'sizes'); + let sizes_string = ''; + if (index >= 0) { + sizes_string = ' ' + content.substring(attributes[index].start, attributes[index].end); + attributes.splice(index, 1); + } + + let res = ''; + for (const [format, srcset] of Object.entries(details.image.sources)) { + res += ``; + } + res += ``; + res += ''; + return res; +} + +/** + * For images like `` + * @param {string} content + * @param {import('svelte/types/compiler/interfaces').TemplateNode} node + * @param {string} src_var_name + */ +function dynamic_img_to_picture(content, node, src_var_name) { + /** @type {Array} attributes */ + const attributes = node.attributes; + const index = attributes.findIndex((attribute) => attribute.name === 'sizes'); + let sizes_string = ''; + if (index >= 0) { + sizes_string = ' ' + content.substring(attributes[index].start, attributes[index].end); + attributes.splice(index, 1); + } + + const details = { + src: `{${src_var_name}.img.src}`, + width: `{${src_var_name}.img.w}`, + height: `{${src_var_name}.img.h}` + }; + + return `{#if typeof ${src_var_name} === 'string'} + +{:else} + + {#each Object.entries(${src_var_name}.sources) as [format, srcset]} + + {/each} + + +{/if}`; +} diff --git a/packages/enhanced-img/test/Input.svelte b/packages/enhanced-img/test/Input.svelte new file mode 100644 index 000000000000..5c16263938ee --- /dev/null +++ b/packages/enhanced-img/test/Input.svelte @@ -0,0 +1,43 @@ + + +{foo} + +non-enhanced test + + + + + + + + + + + + + + + + + + + +{#each images as image} + +{/each} + + + + + + diff --git a/packages/enhanced-img/test/Output.svelte b/packages/enhanced-img/test/Output.svelte new file mode 100644 index 000000000000..29aee1fb6def --- /dev/null +++ b/packages/enhanced-img/test/Output.svelte @@ -0,0 +1,52 @@ + + +{foo} + +non-enhanced test + +basic test + +dimensions test + +unquoted dimensions test + +directive test + +spread attributes test + +sizes test + +event handler test + +alias test + +absolute path test + +{#each images as image} + {#if typeof image === 'string'} + opt-in test +{:else} + + {#each Object.entries(image.sources) as [format, srcset]} + + {/each} + opt-in test + +{/if} +{/each} + + + + + + diff --git a/packages/enhanced-img/test/preprocessor.spec.js b/packages/enhanced-img/test/preprocessor.spec.js new file mode 100644 index 000000000000..d090b17739e3 --- /dev/null +++ b/packages/enhanced-img/test/preprocessor.spec.js @@ -0,0 +1,58 @@ +import fs from 'node:fs/promises'; +import path from 'node:path'; +import { preprocess } from 'svelte/compiler'; +import { expect, it } from 'vitest'; +import { image, parseObject } from '../src/preprocessor.js'; + +const resolve = /** @param {string} file */ (file) => path.resolve(__dirname, file); + +it('Image preprocess snapshot test', async () => { + const filename = 'Input.svelte'; + const processed = await preprocess( + await fs.readFile(resolve(filename), { encoding: 'utf-8' }), + [ + image({ + plugin_context: { + // @ts-ignore + resolve(url) { + return { id: url }; + } + }, + // @ts-ignore + imagetools_plugin: { + load() { + return 'export default {sources:{avif:"/1 1440w, /2 960w",webp:"/3 1440w, /4 960w",png:"5 1440w, /6 960w"},img:{src:"/7",w:1440,h:1440}};'; + } + } + }) + ], + { filename } + ); + + expect(processed.code).toMatchFileSnapshot('./Output.svelte'); +}); + +it('parses a minimized object', () => { + const parsed = parseObject( + '{sources:{avif:"/@imagetools/aa851ecbdef6d98bef38810ea9212d3d4cd9712c 1440w, /@imagetools/f5bc22df4071ea198fea2206d55b7bf5f5fc83e6 960w",webp:"/@imagetools/e8afd7da22a03ee0ae914cbfac6c714bded6daaf 1440w, /@imagetools/a5a1cd19d9fdd0754c3dc5122798c31ad3586041 960w",png:"/@imagetools/216a9a139bef55f2d6d70f91bcffe8584152136b 1440w, /@imagetools/e060ca6e665a6e50a24d00e3a7be2a7c96fdeb64 960w"},img:{src:"/@imagetools/216a9a139bef55f2d6d70f91bcffe8584152136b",w:1440,h:1440}}' + ); + expect(parsed).toBeDefined(); +}); + +it('parses a non-minimized object', () => { + const parsed = parseObject( + `{ + sources: { + avif: "__VITE_ASSET__f63692be__ 1440w, __VITE_ASSET__7c12aaf8__ 960w", + webp: "__VITE_ASSET__60e1d553__ 1440w, __VITE_ASSET__d0e3c982__ 960w", + png: "__VITE_ASSET__ac99f329__ 1440w, __VITE_ASSET__33d52b23__ 960w" + }, + img: { + src: "__VITE_ASSET__ac99f329__", + w: 1440, + h: 1440 + } + }` + ); + expect(parsed).toBeDefined(); +}); diff --git a/packages/enhanced-img/tsconfig.json b/packages/enhanced-img/tsconfig.json new file mode 100644 index 000000000000..638484204f12 --- /dev/null +++ b/packages/enhanced-img/tsconfig.json @@ -0,0 +1,19 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noEmit": true, + "strict": true, + "target": "es2022", + "module": "es2022", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true, + "paths": { + "types": ["./types/index"], + "types/*": ["./types/*"] + }, + "noUnusedLocals": true, + "noUnusedParameters": true + }, + "include": ["src/**/*", "types/**/*", "test/**/*"] +} diff --git a/packages/enhanced-img/types/ambient.d.ts b/packages/enhanced-img/types/ambient.d.ts new file mode 100644 index 000000000000..d8ca61bcf8a8 --- /dev/null +++ b/packages/enhanced-img/types/ambient.d.ts @@ -0,0 +1,4 @@ +declare module '*?enhanced' { + const value: string; + export default value; +} diff --git a/packages/enhanced-img/types/index.d.ts b/packages/enhanced-img/types/index.d.ts new file mode 100644 index 000000000000..05bf05b76a32 --- /dev/null +++ b/packages/enhanced-img/types/index.d.ts @@ -0,0 +1,12 @@ +import type { Plugin } from 'vite'; +import './ambient.js'; +import { HTMLImgAttributes } from 'svelte/elements'; + +// https://svelte.dev/docs/typescript#enhancing-built-in-dom-types +declare module 'svelte/elements' { + export interface SvelteHTMLElements { + 'enhanced:img': HTMLImgAttributes; + } +} + +export function enhancedImages(): Promise; diff --git a/packages/kit/src/core/sync/write_tsconfig.js b/packages/kit/src/core/sync/write_tsconfig.js index 9f3a083649fe..871117b18127 100644 --- a/packages/kit/src/core/sync/write_tsconfig.js +++ b/packages/kit/src/core/sync/write_tsconfig.js @@ -88,6 +88,7 @@ export function get_tsconfig(kit, include_base_url) { const include = new Set([ 'ambient.d.ts', './types/**/$types.d.ts', + config_relative('vite.config.js'), config_relative('vite.config.ts') ]); // TODO(v2): find a better way to include all src files. We can't just use routes/lib only because diff --git a/packages/kit/src/core/sync/write_tsconfig.spec.js b/packages/kit/src/core/sync/write_tsconfig.spec.js index 3921ecd51703..6efa9368791e 100644 --- a/packages/kit/src/core/sync/write_tsconfig.spec.js +++ b/packages/kit/src/core/sync/write_tsconfig.spec.js @@ -99,6 +99,7 @@ test('Creates tsconfig include from kit.files', () => { expect(include).toEqual([ 'ambient.d.ts', './types/**/$types.d.ts', + '../vite.config.js', '../vite.config.ts', '../app/**/*.js', '../app/**/*.ts', diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2432619a3f17..6ea91503bf9a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -362,6 +362,40 @@ importers: specifier: workspace:* version: link:../../../adapter-auto + packages/enhanced-img: + dependencies: + magic-string: + specifier: ^0.30.0 + version: 0.30.5 + svelte-parse-markup: + specifier: ^0.1.1 + version: 0.1.2(svelte@4.2.2) + vite-imagetools: + specifier: ^6.2.3 + version: 6.2.3(rollup@3.29.4) + devDependencies: + '@types/estree': + specifier: ^1.0.2 + version: 1.0.3 + '@types/node': + specifier: ^16.18.6 + version: 16.18.6 + estree-walker: + specifier: ^3.0.3 + version: 3.0.3 + svelte: + specifier: ^4.0.5 + version: 4.2.2 + typescript: + specifier: ^4.9.4 + version: 4.9.4 + vite: + specifier: ^4.4.2 + version: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) + vitest: + specifier: ^0.34.0 + version: 0.34.5(lightningcss@1.21.8)(playwright@1.30.0) + packages/kit: dependencies: '@sveltejs/vite-plugin-svelte': @@ -1010,6 +1044,9 @@ importers: '@sveltejs/amp': specifier: workspace:^ version: link:../../packages/amp + '@sveltejs/enhanced-img': + specifier: workspace:^ + version: link:../../packages/enhanced-img '@sveltejs/kit': specifier: workspace:^ version: link:../../packages/kit @@ -1061,9 +1098,6 @@ importers: vite: specifier: ^4.4.9 version: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) - vite-imagetools: - specifier: ^6.0.0 - version: 6.0.0(rollup@3.29.4) vitest: specifier: ^0.34.5 version: 0.34.5(lightningcss@1.21.8)(playwright@1.30.0) @@ -1979,7 +2013,7 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 @@ -1993,11 +2027,11 @@ packages: rollup: optional: true dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 estree-walker: 2.0.2 picomatch: 2.3.1 rollup: 3.29.4 - dev: true + dev: false /@sinclair/typebox@0.27.8: resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} @@ -2116,8 +2150,8 @@ packages: '@types/geojson': 7946.0.10 dev: true - /@types/estree@1.0.1: - resolution: {integrity: sha512-LG4opVs2ANWZ1TJoKc937iMmNstM/d0ae1vNbnBvBhqCSezgVUOzcLCqbI5elV8Vy6WKwKjaqR+zO9VKirBBCA==} + /@types/estree@1.0.3: + resolution: {integrity: sha512-CS2rOaoQ/eAgAfcTfq6amKG7bsN+EMcgGY4FAFQdvSj2y1ixvOZTUA9mOtCai7E1SYu283XNw7urKK30nP3wkQ==} /@types/geojson@7946.0.10: resolution: {integrity: sha512-Nmh0K3iWQJzniTuPRcJn5hxXkfB1T1pgB89SBig5PlJQU5yocazeu4jATJlaA0GYFKWMqDdvYemoSnF2pXgLVA==} @@ -2449,7 +2483,7 @@ packages: /@vitest/snapshot@0.34.5: resolution: {integrity: sha512-+ikwSbhu6z2yOdtKmk/aeoDZ9QPm2g/ZO5rXT58RR9Vmu/kB2MamyDSx77dctqdZfP3Diqv4mbc/yw2kPT8rmA==} dependencies: - magic-string: 0.30.3 + magic-string: 0.30.5 pathe: 1.1.1 pretty-format: 29.7.0 dev: true @@ -2633,14 +2667,14 @@ packages: /b4a@1.6.4: resolution: {integrity: sha512-fpWrvyVHEKyeEvbKZTVOeZF3VSKKWtJxFIxX/jaVPf+cLbGUSitjb49pHLqPV2BUNNZ0LcoeEGfE/YCpyDYHIw==} - dev: true + dev: false /balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} /base64-js@1.5.1: resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} - dev: true + dev: false /better-path-resolve@1.0.0: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} @@ -2665,7 +2699,7 @@ packages: buffer: 5.7.1 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true + dev: false /brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -2710,7 +2744,7 @@ packages: dependencies: base64-js: 1.5.1 ieee754: 1.2.1 - dev: true + dev: false /builtin-modules@3.3.0: resolution: {integrity: sha512-zhaCDicdLuWN5UbN5IMnFqNMhNfo919sH85y2/ea+5Yg9TsTkeZxpL+JLbp6cgYFS4sRLp3YV4S6yDuqVWHYOw==} @@ -2824,7 +2858,7 @@ packages: /chownr@1.1.4: resolution: {integrity: sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==} - dev: true + dev: false /chownr@2.0.0: resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} @@ -2881,7 +2915,7 @@ packages: resolution: {integrity: sha512-kVwJELqiILQyG5aeuyKFbdsI1fmQy1Cmf7dQ8eGmVuJoaRVdwey7WaMknr2ZFeVSYSKT0rExsa8EGw0aoI/1QQ==} dependencies: '@jridgewell/sourcemap-codec': 1.4.15 - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 acorn: 8.10.0 estree-walker: 3.0.3 periscopic: 3.1.0 @@ -2897,7 +2931,6 @@ packages: engines: {node: '>=7.0.0'} dependencies: color-name: 1.1.4 - dev: true /color-name@1.1.3: resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} @@ -2905,14 +2938,13 @@ packages: /color-name@1.1.4: resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} - dev: true /color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} dependencies: color-name: 1.1.4 simple-swizzle: 0.2.2 - dev: true + dev: false /color-support@1.1.3: resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} @@ -2925,7 +2957,7 @@ packages: dependencies: color-convert: 2.0.1 color-string: 1.9.1 - dev: true + dev: false /commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} @@ -3082,7 +3114,7 @@ packages: engines: {node: '>=10'} dependencies: mimic-response: 3.1.0 - dev: true + dev: false /dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} @@ -3098,7 +3130,7 @@ packages: /deep-extend@0.6.0: resolution: {integrity: sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==} engines: {node: '>=4.0.0'} - dev: true + dev: false /deep-is@0.1.4: resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} @@ -3143,6 +3175,7 @@ packages: /detect-libc@2.0.2: resolution: {integrity: sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==} engines: {node: '>=8'} + dev: false /devalue@4.3.1: resolution: {integrity: sha512-Kc0TSP9IUU9eg55au5Q3YtqaYI2cgntVpunJV9Exbm9nvlBeTE5p2NqYHfpuXK6+VF2hF5PI+BPFPUti7e2N1g==} @@ -3190,7 +3223,7 @@ packages: globrex: 0.1.2 kleur: 4.1.5 locate-character: 3.0.0 - magic-string: 0.30.3 + magic-string: 0.30.5 sade: 1.8.1 tiny-glob: 0.2.9 ts-api-utils: 1.0.2(typescript@5.0.4) @@ -3208,7 +3241,7 @@ packages: resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} dependencies: once: 1.4.0 - dev: true + dev: false /enquirer@2.4.1: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} @@ -3546,7 +3579,7 @@ packages: /estree-walker@3.0.3: resolution: {integrity: sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 /esutils@2.0.3: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} @@ -3556,7 +3589,7 @@ packages: /expand-template@2.0.3: resolution: {integrity: sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==} engines: {node: '>=6'} - dev: true + dev: false /extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -3577,7 +3610,7 @@ packages: /fast-fifo@1.3.2: resolution: {integrity: sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==} - dev: true + dev: false /fast-glob@3.3.1: resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} @@ -3679,7 +3712,7 @@ packages: /fs-constants@1.0.0: resolution: {integrity: sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==} - dev: true + dev: false /fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} @@ -3781,7 +3814,7 @@ packages: /github-from-package@0.0.0: resolution: {integrity: sha1-l/tdlr/eiXMxPyDoKI75oWf6ZM4=} - dev: true + dev: false /gitignore-parser@0.0.2: resolution: {integrity: sha512-X6mpqUv59uWLGD4n3hZ8Cu8KbF2PMWPSFYmxZjdkpm3yOU7hSUYnzTkZI1mcWqchphvqyuz3/BhgBR4E/JtkCg==} @@ -3964,19 +3997,19 @@ packages: /ieee754@1.2.1: resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} - dev: true + dev: false /ignore@5.2.4: resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} engines: {node: '>= 4'} dev: true - /imagetools-core@5.0.0: - resolution: {integrity: sha512-BCtqtjFoFo0C423IaeoKxS2SYp3s7+Oilu9ToRG9q5OBmT/wx0kEeHEiW87Ly2er2jX2fChFDuckQGzb3gFwFQ==} + /imagetools-core@5.1.1: + resolution: {integrity: sha512-NragdIrgxecFO8nRKy8uAYvDxe0QLEW5ToMEviAoNXpEnDQ6I4vs+npRa+z5fNB5nIku+jr11L+MuSkk7XzsKw==} engines: {node: '>=12.0.0'} dependencies: sharp: 0.32.5 - dev: true + dev: false /import-fresh@3.3.0: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} @@ -4011,7 +4044,7 @@ packages: /ini@1.3.8: resolution: {integrity: sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==} - dev: true + dev: false /internal-slot@1.0.5: resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} @@ -4041,7 +4074,7 @@ packages: /is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - dev: true + dev: false /is-bigint@1.0.4: resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} @@ -4143,12 +4176,12 @@ packages: /is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 /is-reference@3.0.1: resolution: {integrity: sha512-baJJdQLiYaJdvFbJqXrcGv3WU3QCzBlUcI5QhbesIm6/xPsvmO+2CDoi/GMOFBQEQm+PXkwOPrp9KK5ozZsp2w==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 /is-regex@1.1.4: resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} @@ -4579,7 +4612,7 @@ packages: /mimic-response@3.1.0: resolution: {integrity: sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==} engines: {node: '>=10'} - dev: true + dev: false /min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} @@ -4615,7 +4648,6 @@ packages: /minimist@1.2.8: resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} - dev: true /minipass@3.3.6: resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} @@ -4644,7 +4676,7 @@ packages: /mkdirp-classic@0.5.3: resolution: {integrity: sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==} - dev: true + dev: false /mkdirp@0.5.6: resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} @@ -4700,7 +4732,7 @@ packages: /napi-build-utils@1.0.2: resolution: {integrity: sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==} - dev: true + dev: false /natural-compare-lite@1.4.0: resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} @@ -4722,11 +4754,11 @@ packages: engines: {node: '>=10'} dependencies: semver: 7.5.4 - dev: true + dev: false /node-addon-api@6.1.0: resolution: {integrity: sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==} - dev: true + dev: false /node-fetch@2.6.12: resolution: {integrity: sha512-C/fGU2E8ToujUivIO0H+tpQ6HWo4eEmchoPIoXtxCrVghxdKq+QOHqEZW7tuP3KlV3bC8FRMO5nMCC7Zm1VP6g==} @@ -4940,7 +4972,7 @@ packages: /periscopic@3.1.0: resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} dependencies: - '@types/estree': 1.0.1 + '@types/estree': 1.0.3 estree-walker: 3.0.3 is-reference: 3.0.1 @@ -5072,7 +5104,7 @@ packages: simple-get: 4.0.1 tar-fs: 2.1.1 tunnel-agent: 0.6.0 - dev: true + dev: false /preferred-pm@3.0.3: resolution: {integrity: sha512-+wZgbxNES/KlJs9q40F/1sfOd/j7f1O9JaHcW5Dsn3aUUOZg3L2bjpVUcKV2jvtElYfoTuQiNeMfQJ4kwUAhCQ==} @@ -5156,7 +5188,7 @@ packages: dependencies: end-of-stream: 1.4.4 once: 1.4.0 - dev: true + dev: false /punycode@2.3.0: resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} @@ -5168,7 +5200,7 @@ packages: /queue-tick@1.0.1: resolution: {integrity: sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==} - dev: true + dev: false /quick-lru@4.0.1: resolution: {integrity: sha512-ARhCpm70fzdcvNQfPoy49IaanKkTlRWF2JMzqhcJbhSFRZv7nPTvZJdcY7301IPmvW+/p0RgIWnQDLJxifsQ7g==} @@ -5183,7 +5215,7 @@ packages: ini: 1.3.8 minimist: 1.2.8 strip-json-comments: 2.0.1 - dev: true + dev: false /react-is@18.2.0: resolution: {integrity: sha512-xWGDIW6x921xtzPkhiULtthJHoJvBbF3q26fzloPCK0hsvxtPVelvftw3zjbHWSkR2km9Z+4uxbDDK/6Zw9B8w==} @@ -5225,6 +5257,7 @@ packages: inherits: 2.0.4 string_decoder: 1.3.0 util-deprecate: 1.0.2 + dev: false /readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} @@ -5348,6 +5381,7 @@ packages: /safe-buffer@5.2.1: resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + dev: false /safe-regex-test@1.0.0: resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} @@ -5420,7 +5454,7 @@ packages: simple-get: 4.0.1 tar-fs: 3.0.4 tunnel-agent: 0.6.0 - dev: true + dev: false /shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -5485,7 +5519,7 @@ packages: /simple-concat@1.0.1: resolution: {integrity: sha512-cSFtAPtRhljv69IK0hTVZQ+OfE9nePi/rtJmw5UjHeVyVroEqJXP1sFztKUy1qU+xvz3u/sfYJLa947b7nAN2Q==} - dev: true + dev: false /simple-get@4.0.1: resolution: {integrity: sha512-brv7p5WgH0jmQJr1ZDDfKDOSeWWg+OVypG99A/5vYGPqJ6pxiaHLy8nxtFjBA7oMa01ebA9gfh1uMCFqOuXxvA==} @@ -5493,13 +5527,13 @@ packages: decompress-response: 6.0.0 once: 1.4.0 simple-concat: 1.0.1 - dev: true + dev: false /simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} dependencies: is-arrayish: 0.3.2 - dev: true + dev: false /sirv-cli@2.0.2: resolution: {integrity: sha512-OtSJDwxsF1NWHc7ps3Sa0s+dPtP15iQNJzfKVz+MxkEo3z72mCD+yu30ct79rPr0CaV1HXSOBp+MIY5uIhHZ1A==} @@ -5612,7 +5646,7 @@ packages: dependencies: fast-fifo: 1.3.2 queue-tick: 1.0.1 - dev: true + dev: false /string-width@4.2.3: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} @@ -5651,6 +5685,7 @@ packages: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} dependencies: safe-buffer: 5.2.1 + dev: false /strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} @@ -5673,7 +5708,7 @@ packages: /strip-json-comments@2.0.1: resolution: {integrity: sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==} engines: {node: '>=0.10.0'} - dev: true + dev: false /strip-json-comments@3.1.1: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} @@ -5730,8 +5765,8 @@ packages: picocolors: 1.0.0 sade: 1.8.1 svelte: 4.2.2 - svelte-preprocess: 5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2) - typescript: 5.2.2 + svelte-preprocess: 5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.0.4) + typescript: 5.0.4 transitivePeerDependencies: - '@babel/core' - coffeescript @@ -5779,6 +5814,14 @@ packages: svelte: 4.2.2 dev: true + /svelte-parse-markup@0.1.2(svelte@4.2.2): + resolution: {integrity: sha512-DycY7DJr7VqofiJ63ut1/NEG92HrWWL56VWITn/cJCu+LlZhMoBkBXT4opUitPEEwbq1nMQbv4vTKUfbOqIW1g==} + peerDependencies: + svelte: ^3.0.0 || ^4.0.0 + dependencies: + svelte: 4.2.2 + dev: false + /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@4.9.4): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} @@ -5827,7 +5870,7 @@ packages: typescript: 4.9.4 dev: true - /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.2.2): + /svelte-preprocess@5.0.4(postcss@8.4.31)(svelte@4.2.2)(typescript@5.0.4): resolution: {integrity: sha512-ABia2QegosxOGsVlsSBJvoWeXy1wUKSfF7SWJdTjLAbx/Y3SrVevvvbFNQqrSJw89+lNSsM58SipmZJ5SRi5iw==} engines: {node: '>= 14.10.0'} requiresBuild: true @@ -5872,7 +5915,7 @@ packages: sorcery: 0.11.0 strip-indent: 3.0.0 svelte: 4.2.2 - typescript: 5.2.2 + typescript: 5.0.4 dev: true /svelte2tsx@0.6.19(svelte@4.2.2)(typescript@4.9.4): @@ -5912,7 +5955,7 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 2.2.0 - dev: true + dev: false /tar-fs@3.0.4: resolution: {integrity: sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==} @@ -5920,7 +5963,7 @@ packages: mkdirp-classic: 0.5.3 pump: 3.0.0 tar-stream: 3.1.6 - dev: true + dev: false /tar-stream@2.2.0: resolution: {integrity: sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==} @@ -5931,7 +5974,7 @@ packages: fs-constants: 1.0.0 inherits: 2.0.4 readable-stream: 3.6.2 - dev: true + dev: false /tar-stream@3.1.6: resolution: {integrity: sha512-B/UyjYwPpMBv+PaFSWAmtYjwdrlEaZQEhMIBFNC5oEG8lpiW8XjcSdmEaClj28ArfKScKHs2nshz3k2le6crsg==} @@ -5939,7 +5982,7 @@ packages: b4a: 1.6.4 fast-fifo: 1.3.2 streamx: 2.15.1 - dev: true + dev: false /tar@6.1.15: resolution: {integrity: sha512-/zKt9UyngnxIT/EAGYuxaMYgOIJiP81ab9ZfkILq4oNLPFX50qyYmu7jRj9qeXoxmJHjGlbH0+cm2uy1WCs10A==} @@ -6108,7 +6151,7 @@ packages: resolution: {integrity: sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==} dependencies: safe-buffer: 5.2.1 - dev: true + dev: false /type-check@0.4.0: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} @@ -6190,12 +6233,6 @@ packages: engines: {node: '>=12.20'} hasBin: true - /typescript@5.2.2: - resolution: {integrity: sha512-mI4WrpHsbCIcwT9cF4FZvr80QUeKvsUsUvKDoR+X/7XHQH98xYD8YHZg7ANtz2GtZt/CBq2QJ0thkGJMHfqc1w==} - engines: {node: '>=14.17'} - hasBin: true - dev: true - /ufo@1.3.0: resolution: {integrity: sha512-bRn3CsoojyNStCZe0BG0Mt4Nr/4KF+rhFlnNXybgqt5pXHNFRlqinSoQaTrGyzE4X8aHplSb+TorH+COin9Yxw==} dev: true @@ -6272,15 +6309,15 @@ packages: spdx-expression-parse: 3.0.1 dev: true - /vite-imagetools@6.0.0(rollup@3.29.4): - resolution: {integrity: sha512-t/k4LXN6+V+otKRM3EAsqG/iHS2Ja8S+biEJWBJk5IKeyQpJ2KZKR5hAn7n5UlNC7J5EzUpiBkUyUFKxGr90fw==} + /vite-imagetools@6.2.3(rollup@3.29.4): + resolution: {integrity: sha512-VZTJOXDTw/Nfah2ayQCWEvNc0b2Q7uGSUCczjx0N7ULd7VZDFH3PxcqyKIRxFOenKcSTYTna1OMzdGlcRBTk+g==} engines: {node: '>=12.0.0'} dependencies: '@rollup/pluginutils': 5.0.4(rollup@3.29.4) - imagetools-core: 5.0.0 + imagetools-core: 5.1.1 transitivePeerDependencies: - rollup - dev: true + dev: false /vite-node@0.34.5(@types/node@16.18.6)(lightningcss@1.21.8): resolution: {integrity: sha512-RNZ+DwbCvDoI5CbCSQSyRyzDTfFvFauvMs6Yq4ObJROKlIKuat1KgSX/Ako5rlDMfVCyMcpMRMTkJBxd6z8YRA==} diff --git a/sites/kit.svelte.dev/package.json b/sites/kit.svelte.dev/package.json index 79366dbc8bb8..f6ea2d33410c 100644 --- a/sites/kit.svelte.dev/package.json +++ b/sites/kit.svelte.dev/package.json @@ -15,6 +15,7 @@ "devDependencies": { "@sveltejs/adapter-vercel": "workspace:^", "@sveltejs/amp": "workspace:^", + "@sveltejs/enhanced-img": "workspace:^", "@sveltejs/kit": "workspace:^", "@sveltejs/site-kit": "6.0.0-next.52", "@types/d3-geo": "^3.0.4", @@ -32,7 +33,6 @@ "tiny-glob": "^0.2.9", "typescript": "5.0.4", "vite": "^4.4.9", - "vite-imagetools": "^6.0.0", "vitest": "^0.34.5" }, "type": "module", diff --git a/sites/kit.svelte.dev/src/app.d.ts b/sites/kit.svelte.dev/src/app.d.ts new file mode 100644 index 000000000000..f59b884c51ed --- /dev/null +++ b/sites/kit.svelte.dev/src/app.d.ts @@ -0,0 +1,12 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface Platform {} + } +} + +export {}; diff --git a/sites/kit.svelte.dev/src/globals.d.ts b/sites/kit.svelte.dev/src/globals.d.ts deleted file mode 100644 index 7878fb0a3465..000000000000 --- a/sites/kit.svelte.dev/src/globals.d.ts +++ /dev/null @@ -1,54 +0,0 @@ -/// - -//#region Ensure Svelte file endings have a type for TypeScript -/** - * These declarations tell TypeScript that we allow import of Svelte files in TS files, e.g. - * ``` - import Component from './Component.svelte'; - ``` - */ -declare module '*.svelte' { - export { SvelteComponent as default } from 'svelte'; -} -//#endregion - -//#region Ensure image file endings have a type for TypeScript -/** - * These declarations tell TypeScript that we allow import of images, e.g. - * ``` - - - ``` - */ -declare module '*.gif' { - const value: string; - export = value; -} - -declare module '*.jpg' { - const value: string; - export = value; -} - -declare module '*.jpeg' { - const value: string; - export = value; -} - -declare module '*.png' { - const value: string; - export = value; -} - -declare module '*.svg' { - const value: string; - export = value; -} - -declare module '*.webp' { - const value: string; - export = value; -} -//#endregion diff --git a/sites/kit.svelte.dev/src/hooks.server.js b/sites/kit.svelte.dev/src/hooks.server.js index c7e8742e90e9..572abb94ea5c 100644 --- a/sites/kit.svelte.dev/src/hooks.server.js +++ b/sites/kit.svelte.dev/src/hooks.server.js @@ -1,6 +1,7 @@ const redirects = { - '/docs/typescript': '/docs/types', - '/docs/amp': '/docs/seo#manual-setup-amp' + '/docs/amp': '/docs/seo#manual-setup-amp', + '/docs/assets': '/docs/images', + '/docs/typescript': '/docs/types' }; const preload_types = ['js', 'css', 'font']; diff --git a/sites/kit.svelte.dev/src/lib/Image.svelte b/sites/kit.svelte.dev/src/lib/Image.svelte deleted file mode 100644 index b28892ace9a7..000000000000 --- a/sites/kit.svelte.dev/src/lib/Image.svelte +++ /dev/null @@ -1,18 +0,0 @@ - - -{#if typeof src === 'string'} - -{:else} - - {#each Object.entries(src.sources) as [format, srcset]} - - {/each} - - -{/if} diff --git a/sites/kit.svelte.dev/src/routes/home/Hero.svelte b/sites/kit.svelte.dev/src/routes/home/Hero.svelte index 751f398e6b10..11000359ee61 100644 --- a/sites/kit.svelte.dev/src/routes/home/Hero.svelte +++ b/sites/kit.svelte.dev/src/routes/home/Hero.svelte @@ -1,8 +1,6 @@
@@ -16,8 +14,13 @@ read the docs
-
- SvelteKit illustration +
+
@@ -86,7 +89,7 @@ margin: 0 0 1rem 0; } - .hero-image { + .hero-image-wrapper { --size: 64rem; position: absolute; left: calc(50% - 0.53 * var(--size)); @@ -94,10 +97,9 @@ pointer-events: none; } - /* this sucks but it's the best we can do. - https://github.com/sveltejs/svelte/issues/2870#issuecomment-1161082065 */ - .hero-image :global(img) { + .hero-image { width: var(--size); + height: auto; aspect-ratio: 4 / 3; object-fit: cover; } @@ -148,7 +150,7 @@ text-align: left; } - .hero-image { + .hero-image-wrapper { --size: min(100vw, 108rem); left: auto; right: -20rem; diff --git a/sites/kit.svelte.dev/src/routes/home/Showcase.svelte b/sites/kit.svelte.dev/src/routes/home/Showcase.svelte index f13b2cdd9f7e..90f4d6da1db1 100644 --- a/sites/kit.svelte.dev/src/routes/home/Showcase.svelte +++ b/sites/kit.svelte.dev/src/routes/home/Showcase.svelte @@ -1,14 +1,13 @@ From 20d2fe7dc5b9d181788889c45aea1e3745222c82 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?A=CC=B4m=CC=B4r=CC=B4=20=D8=B9=CC=B2=D9=85=D9=90=DB=92?= =?UTF-8?q?=D9=80=D8=B1=DB=85?= Date: Sun, 12 Nov 2023 07:30:16 +0300 Subject: [PATCH 0032/1135] add `@sveltejs/enhanced-img` to top-level readme (#11016) Co-authored-by: Conduitry --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 65ff09b6b9b1..e28429d87cd3 100644 --- a/README.md +++ b/README.md @@ -17,6 +17,7 @@ Web development, streamlined. Read the [documentation](https://kit.svelte.dev/do | [@sveltejs/adapter-static](packages/adapter-static) | [Changelog](packages/adapter-static/CHANGELOG.md) | | [@sveltejs/adapter-vercel](packages/adapter-vercel) | [Changelog](packages/adapter-vercel/CHANGELOG.md) | | [@sveltejs/amp](packages/amp) | [Changelog](packages/amp/CHANGELOG.md) | +| [@sveltejs/enhanced-img](packages/enhanced-img) | [Changelog](packages/enhanced-img/CHANGELOG.md) | | [@sveltejs/package](packages/package) | [Changelog](packages/package/CHANGELOG.md) | | [create-svelte](packages/create-svelte) | [Changelog](packages/create-svelte/CHANGELOG.md) | | [svelte-migrate](packages/migrate) | [Changelog](packages/migrate/CHANGELOG.md) | From 9057ac1496bccbca5790e24dfd1e3c3f24555d63 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 12 Nov 2023 11:30:27 -0800 Subject: [PATCH 0033/1135] chore(deps): update dependency marked to v10 (#11012) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .npmrc | 1 - packages/kit/package.json | 1 - packages/kit/test/apps/basics/package.json | 1 + pnpm-lock.yaml | 50 +++++++++++++++++----- sites/kit.svelte.dev/package.json | 2 +- 5 files changed, 41 insertions(+), 14 deletions(-) diff --git a/.npmrc b/.npmrc index d7445a115f87..3d5d238fe463 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1 @@ link-workspace-packages = true -engine-strict = true diff --git a/packages/kit/package.json b/packages/kit/package.json index 671a1d112fea..c786719ccf42 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -32,7 +32,6 @@ "@types/sade": "^1.7.4", "@types/set-cookie-parser": "^2.4.2", "dts-buddy": "^0.2.4", - "marked": "^9.0.0", "rollup": "^3.29.4", "svelte": "^4.2.2", "svelte-preprocess": "^5.0.4", diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index 449ff21689d1..93b2bdef667c 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -16,6 +16,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "cross-env": "^7.0.3", + "marked": "^10.0.0", "svelte": "^4.2.2", "svelte-check": "^3.4.4", "typescript": "^4.9.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ea91503bf9a..90a621b9d5e8 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -80,7 +80,7 @@ importers: version: 4.20230404.0 '@sveltejs/kit': specifier: ^1.0.0 - version: link:../kit + version: 1.27.5(svelte@4.2.2)(vite@4.4.9) esbuild: specifier: ^0.18.11 version: 0.18.11 @@ -108,7 +108,7 @@ importers: version: 2.2.5 '@sveltejs/kit': specifier: ^1.0.0 - version: link:../kit + version: 1.27.5(svelte@4.2.2)(vite@4.4.9) esbuild: specifier: ^0.18.11 version: 0.18.11 @@ -289,7 +289,7 @@ importers: dependencies: '@sveltejs/kit': specifier: ^1.0.0 - version: link:../kit + version: 1.27.5(svelte@4.2.2)(vite@4.4.9) packages/create-svelte: dependencies: @@ -456,9 +456,6 @@ importers: dts-buddy: specifier: ^0.2.4 version: 0.2.4 - marked: - specifier: ^9.0.0 - version: 9.0.0 rollup: specifier: ^3.29.4 version: 3.29.4 @@ -513,6 +510,9 @@ importers: cross-env: specifier: ^7.0.3 version: 7.0.3 + marked: + specifier: ^10.0.0 + version: 10.0.0 svelte: specifier: ^4.2.2 version: 4.2.2 @@ -1069,8 +1069,8 @@ importers: specifier: ^1.21.8 version: 1.21.8 marked: - specifier: ^9.0.0 - version: 9.0.0 + specifier: ^10.0.0 + version: 10.0.0 prettier: specifier: ^3.0.3 version: 3.0.3 @@ -2057,6 +2057,34 @@ packages: typescript: 4.9.4 dev: true + /@sveltejs/kit@1.27.5(svelte@4.2.2)(vite@4.4.9): + resolution: {integrity: sha512-+L1WPs/ZYNjXoBFoFARypD4aZOjkT51vFpRCtQI45+Fmmfi4Y0dH/8VFlmYD6VlGe89ViIPg7lgf/JpGQ2tr7A==} + engines: {node: ^16.14 || >=18} + hasBin: true + requiresBuild: true + peerDependencies: + svelte: ^3.54.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + vite: ^4.0.0 + dependencies: + '@sveltejs/vite-plugin-svelte': 2.5.0(svelte@4.2.2)(vite@4.4.9) + '@types/cookie': 0.5.1 + cookie: 0.5.0 + devalue: 4.3.1 + esm-env: 1.0.0 + kleur: 4.1.5 + magic-string: 0.30.5 + mrmime: 1.0.1 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 2.0.3 + svelte: 4.2.2 + tiny-glob: 0.2.9 + undici: 5.26.3 + vite: 4.4.9(@types/node@16.18.6)(lightningcss@1.21.8) + transitivePeerDependencies: + - supports-color + dev: false + /@sveltejs/site-kit@6.0.0-next.52(@sveltejs/kit@packages+kit)(svelte@4.2.2): resolution: {integrity: sha512-r/VoVllvrr9So9LcYT7XRXDK38Q6Fx062gosuTkDztENBw+qGp3hMq1vg9qSomJastmavRzze1cjJnQFgacWMw==} peerDependencies: @@ -4566,9 +4594,9 @@ packages: engines: {node: '>=8'} dev: true - /marked@9.0.0: - resolution: {integrity: sha512-37yoTpjU+TSXb9OBYY5n78z/CqXh76KiQj9xsKxEdztzU9fRLmbWO5YqKxgCVGKlNdexppnbKTkwB3RipVri8w==} - engines: {node: '>= 16'} + /marked@10.0.0: + resolution: {integrity: sha512-YiGcYcWj50YrwBgNzFoYhQ1hT6GmQbFG8SksnYJX1z4BXTHSOrz1GB5/Jm2yQvMg4nN1FHP4M6r03R10KrVUiA==} + engines: {node: '>= 18'} hasBin: true dev: true diff --git a/sites/kit.svelte.dev/package.json b/sites/kit.svelte.dev/package.json index f6ea2d33410c..814dbd044b67 100644 --- a/sites/kit.svelte.dev/package.json +++ b/sites/kit.svelte.dev/package.json @@ -23,7 +23,7 @@ "browserslist": "^4.21.10", "flexsearch": "^0.7.31", "lightningcss": "^1.21.8", - "marked": "^9.0.0", + "marked": "^10.0.0", "prettier": "^3.0.3", "prettier-plugin-svelte": "^3.0.3", "prism-svelte": "^0.5.0", From 87a18b71a985228c874ee8b27c6ccc650d40df14 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 13 Nov 2023 10:22:46 +0800 Subject: [PATCH 0034/1135] fix: apply `adapter-cloudflare` trailing slash fix to `adapter-cloudflare-workers` (#10968) --- .changeset/silver-suns-yell.md | 5 +++ .../adapter-cloudflare-workers/files/entry.js | 40 ++++++++++++------- 2 files changed, 31 insertions(+), 14 deletions(-) create mode 100644 .changeset/silver-suns-yell.md diff --git a/.changeset/silver-suns-yell.md b/.changeset/silver-suns-yell.md new file mode 100644 index 000000000000..3d01d5a30917 --- /dev/null +++ b/.changeset/silver-suns-yell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare-workers': patch +--- + +fix: correctly check url pathnames for trailing slashes diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js index 0233f9017ae1..a9960b4b2e12 100644 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ b/packages/adapter-cloudflare-workers/files/entry.js @@ -40,29 +40,41 @@ export default { }); } - // prerendered pages and index.html files - const pathname = url.pathname.replace(/\/$/, ''); - let file = pathname.substring(1); - + let { pathname } = url; try { - file = decodeURIComponent(file); - } catch (err) { - // ignore + pathname = decodeURIComponent(pathname); + } catch { + // ignore invalid URI + } + + const stripped_pathname = pathname.replace(/\/$/, ''); + + // prerendered pages and /static files + let is_static_asset = false; + const filename = stripped_pathname.substring(1); + if (filename) { + is_static_asset = + manifest.assets.has(filename) || manifest.assets.has(filename + '/index.html'); } - if ( - manifest.assets.has(file) || - manifest.assets.has(file + '/index.html') || - prerendered.has(pathname || '/') - ) { + const location = pathname.at(-1) === '/' ? stripped_pathname : pathname + '/'; + + if (is_static_asset || prerendered.has(pathname)) { return get_asset_from_kv(req, env, context, (request, options) => { - if (prerendered.has(pathname || '/')) { - url.pathname = '/' + prerendered.get(pathname || '/').file; + if (prerendered.has(pathname)) { + url.pathname = '/' + prerendered.get(pathname).file; return new Request(url.toString(), request); } return mapRequestToAsset(request, options); }); + } else if (location && prerendered.has(location)) { + return new Response('', { + status: 308, + headers: { + location + } + }); } // dynamically-generated pages From 977b151b776a61c1ab7fe3c3ac573b98c0e7e2d5 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Mon, 13 Nov 2023 17:05:40 +0100 Subject: [PATCH 0035/1135] feat: add option to try out Svelte 5 beta (#11026) * feat: add option to try out Svelte 5 beta * Update .changeset/shy-islands-hammer.md * fix type * avoid breaking change * gah --- .changeset/shy-islands-hammer.md | 5 +++++ packages/create-svelte/bin.js | 7 ++++++- packages/create-svelte/index.js | 2 +- packages/create-svelte/scripts/build-templates.js | 2 +- .../create-svelte/scripts/update-template-repo-contents.js | 3 ++- packages/create-svelte/shared/+checkjs/package.json | 2 +- packages/create-svelte/shared/+svelte5/package.json | 5 +++++ packages/create-svelte/shared/+typescript/package.json | 2 +- .../create-svelte/templates/default/package.template.json | 2 +- .../create-svelte/templates/skeleton/package.template.json | 2 +- .../templates/skeletonlib/package.template.json | 2 +- packages/create-svelte/test/check.js | 3 ++- packages/create-svelte/types/internal.d.ts | 4 +++- packages/kit/CHANGELOG.md | 2 +- 14 files changed, 31 insertions(+), 12 deletions(-) create mode 100644 .changeset/shy-islands-hammer.md create mode 100644 packages/create-svelte/shared/+svelte5/package.json diff --git a/.changeset/shy-islands-hammer.md b/.changeset/shy-islands-hammer.md new file mode 100644 index 000000000000..dda4c69a9ef1 --- /dev/null +++ b/.changeset/shy-islands-hammer.md @@ -0,0 +1,5 @@ +--- +'create-svelte': minor +--- + +feat: add option to try out Svelte 5 beta diff --git a/packages/create-svelte/bin.js b/packages/create-svelte/bin.js index fa5fc87cfb84..79f5f1106e5b 100755 --- a/packages/create-svelte/bin.js +++ b/packages/create-svelte/bin.js @@ -97,6 +97,10 @@ const options = await p.group( { value: 'vitest', label: 'Add Vitest for unit testing' + }, + { + value: 'svelte5', + label: 'Try out Svelte 5 beta' } ] }) @@ -111,7 +115,8 @@ await create(cwd, { prettier: options.features.includes('prettier'), eslint: options.features.includes('eslint'), playwright: options.features.includes('playwright'), - vitest: options.features.includes('vitest') + vitest: options.features.includes('vitest'), + svelte5: options.features.includes('svelte5') }); p.outro('Your project is ready!'); diff --git a/packages/create-svelte/index.js b/packages/create-svelte/index.js index 74eab9b63e8d..b247b73a1fbb 100755 --- a/packages/create-svelte/index.js +++ b/packages/create-svelte/index.js @@ -84,7 +84,7 @@ function matches_condition(condition, options) { if (condition === 'typescript' || condition === 'checkjs') { return options.types === condition; } - return options[condition]; + return !!options[condition]; } /** diff --git a/packages/create-svelte/scripts/build-templates.js b/packages/create-svelte/scripts/build-templates.js index b1181243e3e1..1371f78178f2 100644 --- a/packages/create-svelte/scripts/build-templates.js +++ b/packages/create-svelte/scripts/build-templates.js @@ -219,7 +219,7 @@ async function generate_shared() { if (file.startsWith('+') || file.startsWith('-')) { const [conditions, ...rest] = file.split(path.sep); - const pattern = /([+-])([a-z]+)/g; + const pattern = /([+-])([a-z0-9]+)/g; let match; while ((match = pattern.exec(conditions))) { const set = match[1] === '+' ? include : exclude; diff --git a/packages/create-svelte/scripts/update-template-repo-contents.js b/packages/create-svelte/scripts/update-template-repo-contents.js index 78ec904d6a66..ad2f1ad84156 100644 --- a/packages/create-svelte/scripts/update-template-repo-contents.js +++ b/packages/create-svelte/scripts/update-template-repo-contents.js @@ -20,7 +20,8 @@ await create(repo, { types: 'checkjs', prettier: true, playwright: false, - vitest: false + vitest: false, + svelte5: false }); // Remove the Sverdle from the template because it doesn't work within Stackblitz (cookies not set) diff --git a/packages/create-svelte/shared/+checkjs/package.json b/packages/create-svelte/shared/+checkjs/package.json index dd9befe46702..3d53777af116 100644 --- a/packages/create-svelte/shared/+checkjs/package.json +++ b/packages/create-svelte/shared/+checkjs/package.json @@ -5,6 +5,6 @@ }, "devDependencies": { "typescript": "^5.0.0", - "svelte-check": "^3.4.3" + "svelte-check": "^3.6.0" } } diff --git a/packages/create-svelte/shared/+svelte5/package.json b/packages/create-svelte/shared/+svelte5/package.json new file mode 100644 index 000000000000..5d2d0a1e9157 --- /dev/null +++ b/packages/create-svelte/shared/+svelte5/package.json @@ -0,0 +1,5 @@ +{ + "devDependencies": { + "svelte": "^5.0.0-next.1" + } +} diff --git a/packages/create-svelte/shared/+typescript/package.json b/packages/create-svelte/shared/+typescript/package.json index f7fe142530a8..75e7e4e43170 100644 --- a/packages/create-svelte/shared/+typescript/package.json +++ b/packages/create-svelte/shared/+typescript/package.json @@ -6,6 +6,6 @@ "devDependencies": { "typescript": "^5.0.0", "tslib": "^2.4.1", - "svelte-check": "^3.4.3" + "svelte-check": "^3.6.0" } } diff --git a/packages/create-svelte/templates/default/package.template.json b/packages/create-svelte/templates/default/package.template.json index 6e96dfb86f88..4ba7dd38a4a9 100644 --- a/packages/create-svelte/templates/default/package.template.json +++ b/packages/create-svelte/templates/default/package.template.json @@ -10,7 +10,7 @@ "@fontsource/fira-mono": "^4.5.10", "@neoconfetti/svelte": "^1.0.0", "@sveltejs/adapter-auto": "^2.0.0", - "@sveltejs/kit": "^1.20.4", + "@sveltejs/kit": "^1.27.4", "svelte": "^4.0.5", "vite": "^4.4.2" }, diff --git a/packages/create-svelte/templates/skeleton/package.template.json b/packages/create-svelte/templates/skeleton/package.template.json index 427a2face111..b4fce4c835de 100644 --- a/packages/create-svelte/templates/skeleton/package.template.json +++ b/packages/create-svelte/templates/skeleton/package.template.json @@ -9,7 +9,7 @@ }, "devDependencies": { "@sveltejs/adapter-auto": "^2.0.0", - "@sveltejs/kit": "^1.20.4", + "@sveltejs/kit": "^1.27.4", "svelte": "^4.0.5", "vite": "^4.4.2" }, diff --git a/packages/create-svelte/templates/skeletonlib/package.template.json b/packages/create-svelte/templates/skeletonlib/package.template.json index ed466f930e43..0c3a0f84a3a6 100644 --- a/packages/create-svelte/templates/skeletonlib/package.template.json +++ b/packages/create-svelte/templates/skeletonlib/package.template.json @@ -20,7 +20,7 @@ }, "devDependencies": { "@sveltejs/adapter-auto": "^2.0.0", - "@sveltejs/kit": "^1.20.4", + "@sveltejs/kit": "^1.27.4", "@sveltejs/package": "^2.0.0", "publint": "^0.1.9", "svelte": "^4.0.5", diff --git a/packages/create-svelte/test/check.js b/packages/create-svelte/test/check.js index d910ee12e29a..91e5f3361713 100644 --- a/packages/create-svelte/test/check.js +++ b/packages/create-svelte/test/check.js @@ -115,7 +115,8 @@ for (const template of templates) { prettier: true, eslint: true, playwright: false, - vitest: false + vitest: false, + svelte5: false }); const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8')); diff --git a/packages/create-svelte/types/internal.d.ts b/packages/create-svelte/types/internal.d.ts index 612d1cd3ceba..c7e6804cabf3 100644 --- a/packages/create-svelte/types/internal.d.ts +++ b/packages/create-svelte/types/internal.d.ts @@ -6,6 +6,7 @@ export type Options = { eslint: boolean; playwright: boolean; vitest: boolean; + svelte5?: boolean; // optional to not introduce a breaking change to the `create` API }; export type File = { @@ -22,7 +23,8 @@ export type Condition = | 'vitest' | 'skeleton' | 'default' - | 'skeletonlib'; + | 'skeletonlib' + | 'svelte5'; export type Common = { files: Array<{ diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index fa7796b0f1dd..412de7b64430 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -14,7 +14,7 @@ - fix: generate `__data.json` for prerendered pages when SSR is turned off ([#10988](https://github.com/sveltejs/kit/pull/10988)) -- chore: cleanup ([#11002](https://github.com/sveltejs/kit/pull/11002)) +- chore: add experimental compatibility for Svelte 5 ([#11002](https://github.com/sveltejs/kit/pull/11002)) ## 1.27.3 From 2903eb9d0a27fbb1fa95d46bbdb522914bde5083 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 13 Nov 2023 11:21:25 -0500 Subject: [PATCH 0036/1135] Version Packages (#11024) Co-authored-by: github-actions[bot] --- .changeset/shy-islands-hammer.md | 5 ----- .changeset/silver-suns-yell.md | 5 ----- packages/adapter-cloudflare-workers/CHANGELOG.md | 6 ++++++ packages/adapter-cloudflare-workers/package.json | 2 +- packages/create-svelte/CHANGELOG.md | 6 ++++++ packages/create-svelte/package.json | 2 +- 6 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 .changeset/shy-islands-hammer.md delete mode 100644 .changeset/silver-suns-yell.md diff --git a/.changeset/shy-islands-hammer.md b/.changeset/shy-islands-hammer.md deleted file mode 100644 index dda4c69a9ef1..000000000000 --- a/.changeset/shy-islands-hammer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'create-svelte': minor ---- - -feat: add option to try out Svelte 5 beta diff --git a/.changeset/silver-suns-yell.md b/.changeset/silver-suns-yell.md deleted file mode 100644 index 3d01d5a30917..000000000000 --- a/.changeset/silver-suns-yell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare-workers': patch ---- - -fix: correctly check url pathnames for trailing slashes diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md index f681e4b3dea9..8189068235ad 100644 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ b/packages/adapter-cloudflare-workers/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-cloudflare-workers +## 1.2.1 + +### Patch Changes + +- fix: correctly check url pathnames for trailing slashes ([#10968](https://github.com/sveltejs/kit/pull/10968)) + ## 1.2.0 ### Minor Changes diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index e50206402c6f..faf029f014ca 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare-workers", - "version": "1.2.0", + "version": "1.2.1", "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", "repository": { "type": "git", diff --git a/packages/create-svelte/CHANGELOG.md b/packages/create-svelte/CHANGELOG.md index 92a8d4a3f20d..4089d94cf8be 100644 --- a/packages/create-svelte/CHANGELOG.md +++ b/packages/create-svelte/CHANGELOG.md @@ -1,5 +1,11 @@ # create-svelte +## 5.2.0 + +### Minor Changes + +- feat: add option to try out Svelte 5 beta ([#11026](https://github.com/sveltejs/kit/pull/11026)) + ## 5.1.1 ### Patch Changes diff --git a/packages/create-svelte/package.json b/packages/create-svelte/package.json index 56bb08f84536..e73b7e89f17c 100644 --- a/packages/create-svelte/package.json +++ b/packages/create-svelte/package.json @@ -1,6 +1,6 @@ { "name": "create-svelte", - "version": "5.1.1", + "version": "5.2.0", "description": "A CLI for creating new SvelteKit projects", "repository": { "type": "git", From cbd60cc3c787574d60bea5aa3a3119121c6d53e0 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 13 Nov 2023 12:13:55 -0800 Subject: [PATCH 0037/1135] feat: upgrade to prettier 3 and prettier-plugin-svelte 3 (#10410) This will give users the new versions via create-svelte. The rest of the change is internal closes #10751 closes #10716 --------- Co-authored-by: Tee Ming --- .changeset/ten-bats-sneeze.md | 5 + .prettierrc | 1 + package.json | 4 +- packages/adapter-auto/package.json | 2 +- .../adapter-cloudflare-workers/package.json | 2 +- packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/package.json | 2 +- packages/adapter-node/package.json | 2 +- packages/adapter-static/package.json | 2 +- .../test/apps/prerendered/src/app.html | 2 +- .../adapter-static/test/apps/spa/src/app.html | 2 +- .../test/apps/spa/src/routes/+layout.svelte | 2 +- .../test/apps/spa/src/routes/+page.svelte | 2 +- .../apps/spa/src/routes/about/+page.svelte | 2 +- packages/adapter-vercel/package.json | 2 +- packages/amp/package.json | 2 +- packages/create-svelte/.gitignore | 2 +- packages/create-svelte/package.json | 7 +- .../create-svelte/scripts/build-templates.js | 52 ++++-- .../shared/+eslint+prettier/package.json | 4 +- .../shared/+prettier/.prettierrc | 1 - .../shared/+prettier/package.json | 4 +- .../shared/-eslint+prettier/package.json | 4 +- .../templates/default/src/app.html | 2 +- .../templates/skeleton/src/app.html | 2 +- .../templates/skeletonlib/src/app.html | 2 +- packages/enhanced-img/.prettierignore | 1 + packages/enhanced-img/package.json | 4 +- packages/enhanced-img/test/Input.svelte | 19 +-- packages/enhanced-img/test/Output.svelte | 13 +- packages/kit/.prettierignore | 1 + packages/kit/package.json | 4 +- .../kit/src/core/config/default-error.html | 16 +- packages/kit/src/core/sync/write_tsconfig.js | 4 +- .../+layout.svelte | 2 +- .../nested/+layout.svelte | 2 +- .../write_types/test/slugs/+layout.svelte | 2 +- packages/kit/src/exports/public.d.ts | 16 +- packages/kit/src/runtime/client/client.js | 8 +- .../kit/src/runtime/components/layout.svelte | 2 +- .../kit/src/runtime/server/page/load_data.js | 8 +- packages/kit/src/runtime/server/respond.js | 4 +- packages/kit/test/apps/amp/src/app.html | 2 +- .../test/apps/amp/src/routes/+layout.svelte | 2 +- packages/kit/test/apps/basics/src/app.html | 2 +- packages/kit/test/apps/basics/src/error.html | 2 +- .../adjacent-error-boundary/+page.svelte | 4 +- .../anchor-afternavigate/+page.svelte | 2 +- .../src/routes/asset-import/+page.svelte | 4 +- .../basics/src/routes/css/other/+page.svelte | 2 +- .../src/routes/delete-route/+page.svelte | 2 +- .../errors/module-scope-server/+page.svelte | 3 +- .../src/routes/errors/serverside/+page.svelte | 3 +- .../routes/headers/set-cookie/+layout.svelte | 2 +- .../src/routes/imports/markdown/+page.svelte | 2 +- .../load/fetch-cache-control/+page.svelte | 1 - .../invalidation/route/shared/+layout.svelte | 6 +- .../routes/load/parent/server/+layout.svelte | 2 +- .../routes/load/parent/shared/+layout.svelte | 2 +- .../server-data-reuse/no-load/+page.svelte | 2 +- .../routes/load/url-query-param/+page.svelte | 2 +- .../src/routes/nested-layout/+layout.svelte | 2 +- .../routes/nested-layout/foo/+layout.svelte | 2 +- .../nested-layout/foo/bar/+layout.svelte | 2 +- .../nested-layout/reset/+layout@.svelte | 2 +- .../routes/nested-layout/reset/+page.svelte | 2 +- .../src/routes/no-ssr/other/+page.svelte | 2 +- .../ssr-page-config/layout/+layout.svelte | 2 +- .../apps/basics/src/routes/paths/+page.svelte | 2 +- .../basics/src/routes/routing/a/+page.svelte | 2 +- .../routing/cancellation/+layout.svelte | 2 +- .../routes/routing/cancellation/+page.svelte | 2 +- .../routing/cancellation/b/+page.svelte | 2 +- .../routes/routing/client/bar/+page.svelte | 2 +- .../routes/routing/client/bar/b/+page.svelte | 2 +- .../routes/routing/client/foo/+page.svelte | 2 +- .../src/routes/routing/const/+page.svelte | 2 +- .../src/routes/routing/dirs/foo/+page.svelte | 2 +- .../src/routes/routing/hashes/a/+page.svelte | 2 +- .../routing/hashes/pagestore/+page.svelte | 2 +- .../routing/rest/non-greedy/+layout.svelte | 4 +- .../routes/routing/rest/path/+layout.svelte | 2 +- .../routes/shadowed/parent/sub/+page.svelte | 2 +- .../shadowed/same-render-entry/+page.svelte | 2 +- .../routes/store/client-access/+page.svelte | 2 +- .../store/data/store-update/a/+page.svelte | 2 +- .../store/data/store-update/b/+page.svelte | 2 +- packages/kit/test/apps/dev-only/src/app.html | 2 +- packages/kit/test/apps/options-2/src/app.html | 2 +- .../options/source/components/Message.svelte | 2 +- .../apps/options/source/pages/+page.svelte | 2 +- .../test/apps/options/source/template.html | 2 +- packages/kit/test/apps/writes/src/app.html | 2 +- .../new-route/zzzz1662642734866/+page.svelte | 2 +- .../src/app.html | 2 +- .../src/app.html | 2 +- .../src/app.html | 2 +- .../src/app.html | 2 +- .../apps/private-dynamic-env/src/app.html | 2 +- .../src/app.html | 2 +- .../apps/private-static-env/src/app.html | 2 +- .../src/app.html | 2 +- .../apps/server-only-folder/src/app.html | 2 +- .../src/app.html | 2 +- .../apps/server-only-module/src/app.html | 2 +- .../apps/syntax-error/src/app.html | 2 +- .../kit/test/prerendering/basics/src/app.html | 2 +- .../test/prerendering/options/src/app.html | 2 +- .../test/prerendering/paths-base/src/app.html | 2 +- .../src/routes/dynamic/[slug]/+page.svelte | 2 +- packages/migrate/package.json | 2 +- packages/package/package.json | 2 +- packages/package/src/utils.js | 8 +- .../resolve-alias/src/lib/Test.svelte | 8 +- .../fixtures/typescript/src/lib/Plain.svelte | 6 +- packages/package/test/index.js | 8 +- pnpm-lock.yaml | 157 ++++++------------ sites/kit.svelte.dev/package.json | 6 +- 118 files changed, 278 insertions(+), 288 deletions(-) create mode 100644 .changeset/ten-bats-sneeze.md create mode 100644 packages/enhanced-img/.prettierignore create mode 100644 packages/kit/.prettierignore diff --git a/.changeset/ten-bats-sneeze.md b/.changeset/ten-bats-sneeze.md new file mode 100644 index 000000000000..b813b4239a54 --- /dev/null +++ b/.changeset/ten-bats-sneeze.md @@ -0,0 +1,5 @@ +--- +'create-svelte': minor +--- + +feat: upgrade to prettier 3 and prettier-plugin-svelte 3 diff --git a/.prettierrc b/.prettierrc index 72264f51e616..ee82b5c88a09 100644 --- a/.prettierrc +++ b/.prettierrc @@ -3,6 +3,7 @@ "singleQuote": true, "trailingComma": "none", "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], "overrides": [ { "files": ["*.svelte"], diff --git a/package.json b/package.json index bea268651f67..73b097d75e9d 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "postinstall": "pnpm -r generate:types" }, "devDependencies": { - "@changesets/cli": "^2.26.0", + "@changesets/cli": "^2.26.2", "@rollup/plugin-commonjs": "^25.0.0", "@rollup/plugin-json": "^6.0.0", "@rollup/plugin-node-resolve": "^15.0.1", @@ -32,7 +32,7 @@ "eslint-plugin-svelte": "^2.31.0", "eslint-plugin-unicorn": "^49.0.0", "playwright": "1.30.0", - "prettier": "^2.8.0", + "prettier": "^3.1.0", "rollup": "^3.29.4", "svelte": "^4.2.2", "typescript": "^4.9.4" diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index 193ea74b0f9c..037ba5fd38ab 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -25,7 +25,7 @@ "adapters.js" ], "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "format": "pnpm lint --write", "check": "tsc" }, diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index faf029f014ca..5c17e85c9b00 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -25,7 +25,7 @@ "index.d.ts" ], "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "format": "pnpm lint --write", "check": "tsc" }, diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index a686bfa841f3..d3e7e6a5e046 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -26,7 +26,7 @@ ], "scripts": { "build": "esbuild src/worker.js --bundle --outfile=files/worker.js --external:SERVER --external:MANIFEST --format=esm", - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "format": "pnpm lint --write", "check": "tsc --skipLibCheck", "prepublishOnly": "pnpm build" diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index b15c395f5c01..b417461d9b8f 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -28,7 +28,7 @@ "build": "node -e \"fs.rmSync('files', { force: true, recursive: true })\" && rollup -c && cp src/edge.js files/edge.js", "test": "vitest run", "check": "tsc", - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "format": "pnpm lint --write", "prepublishOnly": "pnpm build" }, diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 3588e72581fa..d18a3f1c46f1 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -28,7 +28,7 @@ "build": "node -e \"fs.rmSync('files', { force: true, recursive: true })\" && rollup -c", "test": "echo \"tests temporarily disabled\" # c8 vitest run", "check": "tsc", - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "format": "pnpm lint --write", "prepublishOnly": "pnpm build" }, diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index a6229898227e..05a10a8cdc3c 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -24,7 +24,7 @@ "platforms.js" ], "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "check": "tsc", "format": "pnpm lint --write", "test": "pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test" diff --git a/packages/adapter-static/test/apps/prerendered/src/app.html b/packages/adapter-static/test/apps/prerendered/src/app.html index 568b69b887b8..d533c5e31716 100644 --- a/packages/adapter-static/test/apps/prerendered/src/app.html +++ b/packages/adapter-static/test/apps/prerendered/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/packages/adapter-static/test/apps/spa/src/app.html b/packages/adapter-static/test/apps/spa/src/app.html index 568b69b887b8..d533c5e31716 100644 --- a/packages/adapter-static/test/apps/spa/src/app.html +++ b/packages/adapter-static/test/apps/spa/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/packages/adapter-static/test/apps/spa/src/routes/+layout.svelte b/packages/adapter-static/test/apps/spa/src/routes/+layout.svelte index d89ceb3fed43..439e52c54c97 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/+layout.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/+layout.svelte @@ -3,4 +3,4 @@ about - \ No newline at end of file + diff --git a/packages/adapter-static/test/apps/spa/src/routes/+page.svelte b/packages/adapter-static/test/apps/spa/src/routes/+page.svelte index 913f0784cbb6..aaa08e08c0a1 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/+page.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/+page.svelte @@ -1 +1 @@ -

This page was not prerendered

\ No newline at end of file +

This page was not prerendered

diff --git a/packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte b/packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte index 404fd77511d2..07dd2ffa5038 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/about/+page.svelte @@ -1 +1 @@ -

This page was prerendered

\ No newline at end of file +

This page was prerendered

diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index e9af9d7f78f2..db4239f8c618 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -25,7 +25,7 @@ "index.d.ts" ], "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "format": "pnpm lint --write", "check": "tsc", "test": "vitest run" diff --git a/packages/amp/package.json b/packages/amp/package.json index c204ba87f343..d8740cc5aeb1 100644 --- a/packages/amp/package.json +++ b/packages/amp/package.json @@ -23,7 +23,7 @@ "index.d.ts" ], "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "format": "pnpm lint --write" }, "peerDependencies": { diff --git a/packages/create-svelte/.gitignore b/packages/create-svelte/.gitignore index 46c461e5b123..14b636183d83 100644 --- a/packages/create-svelte/.gitignore +++ b/packages/create-svelte/.gitignore @@ -11,4 +11,4 @@ /templates/*/.vercel_build_output /templates/*/.netlify /templates/*/dist -/templates/*/package \ No newline at end of file +/templates/*/package diff --git a/packages/create-svelte/package.json b/packages/create-svelte/package.json index e73b7e89f17c..c6c97be09957 100644 --- a/packages/create-svelte/package.json +++ b/packages/create-svelte/package.json @@ -18,10 +18,9 @@ "devDependencies": { "@playwright/test": "1.30.0", "@types/gitignore-parser": "^0.0.2", - "@types/prettier": "^2.7.1", "gitignore-parser": "^0.0.2", - "prettier": "^2.8.0", - "prettier-plugin-svelte": "^2.10.1", + "prettier": "^3.1.0", + "prettier-plugin-svelte": "^3.0.0", "sucrase": "^3.29.0", "svelte": "^4.2.2", "tiny-glob": "^0.2.9", @@ -31,7 +30,7 @@ "build": "node scripts/build-templates", "test": "pnpm build && vitest run", "check": "tsc", - "lint": "prettier --check . --config ../../.prettierrc --ignore-path ../../.gitignore --ignore-path .gitignore --plugin prettier-plugin-svelte --plugin-search-dir=.", + "lint": "prettier --check . --config ../../.prettierrc --ignore-path ../../.gitignore --ignore-path .gitignore", "format": "pnpm lint --write", "prepublishOnly": "pnpm build", "postpublish": "echo \"Updating template repo\" && bash ./scripts/update-template-repo.sh" diff --git a/packages/create-svelte/scripts/build-templates.js b/packages/create-svelte/scripts/build-templates.js index 1371f78178f2..4e07dfa0fc99 100644 --- a/packages/create-svelte/scripts/build-templates.js +++ b/packages/create-svelte/scripts/build-templates.js @@ -7,7 +7,7 @@ import glob from 'tiny-glob/sync.js'; import { mkdirp, rimraf } from '../utils.js'; /** @param {string} content */ -function convert_typescript(content) { +async function convert_typescript(content) { let { code } = transform(content, { transforms: ['typescript'], disableESTransforms: true @@ -19,7 +19,7 @@ function convert_typescript(content) { // Prettier strips 'unnecessary' parens from .ts files, we need to hack them back in code = code.replace(/(\/\*\* @type.+? \*\/) (.+?) \/\*\*\*\//g, '$1($2)'); - return prettier.format(code, { + return await prettier.format(code, { parser: 'babel', useTabs: true, singleQuote: true, @@ -78,7 +78,8 @@ async function generate_templates(shared) { null: [] }; - glob('**/*', { cwd, filesOnly: true, dot: true }).forEach((name) => { + const files = glob('**/*', { cwd, filesOnly: true, dot: true }); + for (const name of files) { // the package.template.json thing is a bit annoying — basically we want // to be able to develop and deploy the app from here, but have a different // package.json in newly created projects (based on package.template.json) @@ -87,14 +88,14 @@ async function generate_templates(shared) { // TODO package-specific versions contents = contents.replace(/workspace:\*/g, 'next'); fs.writeFileSync(`${dir}/package.json`, contents); - return; + continue; } // ignore files that are written conditionally - if (shared.has(name)) return; + if (shared.has(name)) continue; // ignore contents of .gitignore or .ignore - if (!gitignore.accepts(name) || !ignore.accepts(name) || name === '.ignore') return; + if (!gitignore.accepts(name) || !ignore.accepts(name) || name === '.ignore') continue; if (/\.(ts|svelte)$/.test(name)) { const contents = fs.readFileSync(path.join(cwd, name), 'utf8'); @@ -103,7 +104,7 @@ async function generate_templates(shared) { if (name.endsWith('app.d.ts')) types.checkjs.push({ name, contents }); types.typescript.push({ name, contents }); } else if (name.endsWith('.ts')) { - const js = convert_typescript(contents); + const js = await convert_typescript(contents); types.typescript.push({ name, @@ -125,9 +126,14 @@ async function generate_templates(shared) { // possible (e.g. preserving double line breaks). Sucrase is the best // tool for the job because it just removes the types; Prettier then // tidies up the end result - const js_contents = contents.replace( + const js_contents = await replace_async( + contents, /]+)>([\s\S]+?)<\/script>/g, - (m, attrs, typescript) => { + async ( + /** @type {any} */ m, + /** @type {string} */ attrs, + /** @type {string} */ typescript + ) => { // Sucrase assumes 'unused' imports (which _are_ used, but only // in the markup) are type imports, and strips them. This step // prevents it from drawing that conclusion @@ -149,14 +155,15 @@ async function generate_templates(shared) { disableESTransforms: true }).code.slice(0, -suffix.length); - const contents = prettier - .format(transformed, { + const contents = ( + await prettier.format(transformed, { parser: 'babel', useTabs: true, singleQuote: true, trailingComma: 'none', printWidth: 100 }) + ) .trim() .replace(/^(.)/gm, '\t$1'); @@ -184,7 +191,7 @@ async function generate_templates(shared) { mkdirp(path.dirname(dest)); fs.copyFileSync(path.join(cwd, name), dest); } - }); + } fs.copyFileSync(meta_file, `${dir}/meta.json`); fs.writeFileSync( @@ -196,6 +203,20 @@ async function generate_templates(shared) { } } +/** + * @param {string} string + * @param {RegExp} regexp + * @param {{ (m: any, attrs: string, typescript: string): Promise; (arg0: any): any; }} replacer + */ +async function replace_async(string, regexp, replacer) { + const replacements = await Promise.all( + // @ts-ignore + Array.from(string.matchAll(regexp), (match) => replacer(...match)) + ); + let i = 0; + return string.replace(regexp, () => replacements[i++]); +} + async function generate_shared() { const cwd = path.resolve('shared'); @@ -205,7 +226,8 @@ async function generate_shared() { /** @type {Array<{ name: string, include: string[], exclude: string[], contents: string }>} */ const files = []; - glob('**/*', { cwd, filesOnly: true, dot: true }).forEach((file) => { + const globbed = glob('**/*', { cwd, filesOnly: true, dot: true }); + for (const file of globbed) { const contents = fs.readFileSync(path.join(cwd, file), 'utf8'); /** @type {string[]} */ @@ -232,7 +254,7 @@ async function generate_shared() { if (name.endsWith('.ts') && !include.includes('typescript')) { // file includes types in TypeScript and JSDoc — // create .js file, with and without JSDoc - const js = convert_typescript(contents); + const js = await convert_typescript(contents); const js_name = name.replace(/\.ts$/, '.js'); // typescript @@ -265,7 +287,7 @@ async function generate_shared() { shared.add(name); files.push({ name, include, exclude, contents }); } - }); + } files.sort((a, b) => a.include.length + a.exclude.length - (b.include.length + b.exclude.length)); diff --git a/packages/create-svelte/shared/+eslint+prettier/package.json b/packages/create-svelte/shared/+eslint+prettier/package.json index 808ff280d4b8..3dca8ba8215f 100644 --- a/packages/create-svelte/shared/+eslint+prettier/package.json +++ b/packages/create-svelte/shared/+eslint+prettier/package.json @@ -3,7 +3,7 @@ "eslint-config-prettier": "^8.5.0" }, "scripts": { - "lint": "prettier --plugin-search-dir . --check . && eslint .", - "format": "prettier --plugin-search-dir . --write ." + "lint": "prettier --check . && eslint .", + "format": "prettier --write ." } } diff --git a/packages/create-svelte/shared/+prettier/.prettierrc b/packages/create-svelte/shared/+prettier/.prettierrc index a77fddea9097..95730232b6b1 100644 --- a/packages/create-svelte/shared/+prettier/.prettierrc +++ b/packages/create-svelte/shared/+prettier/.prettierrc @@ -4,6 +4,5 @@ "trailingComma": "none", "printWidth": 100, "plugins": ["prettier-plugin-svelte"], - "pluginSearchDirs": ["."], "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] } diff --git a/packages/create-svelte/shared/+prettier/package.json b/packages/create-svelte/shared/+prettier/package.json index e368023fb43e..60af3f611a0f 100644 --- a/packages/create-svelte/shared/+prettier/package.json +++ b/packages/create-svelte/shared/+prettier/package.json @@ -1,6 +1,6 @@ { "devDependencies": { - "prettier": "^2.8.0", - "prettier-plugin-svelte": "^2.10.1" + "prettier": "^3.0.0", + "prettier-plugin-svelte": "^3.0.0" } } diff --git a/packages/create-svelte/shared/-eslint+prettier/package.json b/packages/create-svelte/shared/-eslint+prettier/package.json index 0193de97cbb4..bcdff7cf9402 100644 --- a/packages/create-svelte/shared/-eslint+prettier/package.json +++ b/packages/create-svelte/shared/-eslint+prettier/package.json @@ -1,6 +1,6 @@ { "scripts": { - "lint": "prettier --plugin-search-dir . --check .", - "format": "prettier --plugin-search-dir . --write ." + "lint": "prettier --check .", + "format": "prettier --write ." } } diff --git a/packages/create-svelte/templates/default/src/app.html b/packages/create-svelte/templates/default/src/app.html index 6769ed5e89c5..77a5ff52c923 100644 --- a/packages/create-svelte/templates/default/src/app.html +++ b/packages/create-svelte/templates/default/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/packages/create-svelte/templates/skeleton/src/app.html b/packages/create-svelte/templates/skeleton/src/app.html index 6769ed5e89c5..77a5ff52c923 100644 --- a/packages/create-svelte/templates/skeleton/src/app.html +++ b/packages/create-svelte/templates/skeleton/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/packages/create-svelte/templates/skeletonlib/src/app.html b/packages/create-svelte/templates/skeletonlib/src/app.html index d2fc6b061c6a..f22aeaad5e39 100644 --- a/packages/create-svelte/templates/skeletonlib/src/app.html +++ b/packages/create-svelte/templates/skeletonlib/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/packages/enhanced-img/.prettierignore b/packages/enhanced-img/.prettierignore new file mode 100644 index 000000000000..57a5af7f662f --- /dev/null +++ b/packages/enhanced-img/.prettierignore @@ -0,0 +1 @@ +test/Output.svelte diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index fdfaa92e588f..b8a6f5b7224c 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -11,9 +11,9 @@ "homepage": "https://kit.svelte.dev", "type": "module", "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --check .", "check": "tsc", - "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", + "format": "prettier --write .", "test": "vitest" }, "files": [ diff --git a/packages/enhanced-img/test/Input.svelte b/packages/enhanced-img/test/Input.svelte index 5c16263938ee..74f6320c9acb 100644 --- a/packages/enhanced-img/test/Input.svelte +++ b/packages/enhanced-img/test/Input.svelte @@ -2,12 +2,9 @@ import manual_image1 from './no.png'; import manual_image2 from './no.svg'; - const images = [ - manual_image1, - manual_image2 - ]; + const images = [manual_image1, manual_image2]; - let foo: string = 'bar' + let foo: string = 'bar'; {foo} @@ -18,15 +15,17 @@ - - - + - + - + diff --git a/packages/enhanced-img/test/Output.svelte b/packages/enhanced-img/test/Output.svelte index 29aee1fb6def..832e7c453b61 100644 --- a/packages/enhanced-img/test/Output.svelte +++ b/packages/enhanced-img/test/Output.svelte @@ -2,12 +2,9 @@ import manual_image1 from './no.png'; import manual_image2 from './no.svg'; - const images = [ - manual_image1, - manual_image2 - ]; + const images = [manual_image1, manual_image2]; - let foo: string = 'bar' + let foo: string = 'bar'; {foo} @@ -18,15 +15,13 @@ dimensions test -unquoted dimensions test - directive test -spread attributes test +spread attributes test sizes test -event handler test +event handler test alias test diff --git a/packages/kit/.prettierignore b/packages/kit/.prettierignore new file mode 100644 index 000000000000..8275c27b66be --- /dev/null +++ b/packages/kit/.prettierignore @@ -0,0 +1 @@ +test/build-errors/apps/syntax-error/src/routes/+page.svelte diff --git a/packages/kit/package.json b/packages/kit/package.json index c786719ccf42..cd2662661881 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -56,10 +56,10 @@ "postinstall.js" ], "scripts": { - "lint": "prettier --check . --config ../../.prettierrc --ignore-path .gitignore", + "lint": "prettier --config ../../.prettierrc --check .", "check": "tsc", "check:all": "tsc && pnpm -r --filter=\"./**\" check", - "format": "prettier --write . --config ../../.prettierrc --ignore-path .gitignore", + "format": "prettier --config ../../.prettierrc --write .", "test": "pnpm test:unit && pnpm test:integration", "test:integration": "pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test", "test:cross-platform:dev": "pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test:cross-platform:dev", diff --git a/packages/kit/src/core/config/default-error.html b/packages/kit/src/core/config/default-error.html index 12d998b4bc32..c322e1682478 100644 --- a/packages/kit/src/core/config/default-error.html +++ b/packages/kit/src/core/config/default-error.html @@ -1,4 +1,4 @@ - + @@ -11,8 +11,18 @@ --divider: #ccc; background: var(--bg); color: var(--fg); - font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, - Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; + font-family: + system-ui, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Roboto, + Oxygen, + Ubuntu, + Cantarell, + 'Open Sans', + 'Helvetica Neue', + sans-serif; display: flex; align-items: center; justify-content: center; diff --git a/packages/kit/src/core/sync/write_tsconfig.js b/packages/kit/src/core/sync/write_tsconfig.js index 871117b18127..8489b933cc3b 100644 --- a/packages/kit/src/core/sync/write_tsconfig.js +++ b/packages/kit/src/core/sync/write_tsconfig.js @@ -181,8 +181,8 @@ function validate_user_config(kit, cwd, out, config) { typeof extend === 'string' ? path.resolve(cwd, extend) === out : Array.isArray(extend) - ? extend.some((e) => path.resolve(cwd, e) === out) - : false; + ? extend.some((e) => path.resolve(cwd, e) === out) + : false; const options = config.options.compilerOptions || {}; diff --git a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/+layout.svelte b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/+layout.svelte index 23addb029828..1072c0a6c0a7 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/+layout.svelte +++ b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/+layout.svelte @@ -1 +1 @@ -export function load() {} +export function load() {} diff --git a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/nested/+layout.svelte b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/nested/+layout.svelte index 23addb029828..1072c0a6c0a7 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/nested/+layout.svelte +++ b/packages/kit/src/core/sync/write_types/test/slugs-layout-not-all-pages-have-load/nested/+layout.svelte @@ -1 +1 @@ -export function load() {} +export function load() {} diff --git a/packages/kit/src/core/sync/write_types/test/slugs/+layout.svelte b/packages/kit/src/core/sync/write_types/test/slugs/+layout.svelte index 23addb029828..1072c0a6c0a7 100644 --- a/packages/kit/src/core/sync/write_types/test/slugs/+layout.svelte +++ b/packages/kit/src/core/sync/write_types/test/slugs/+layout.svelte @@ -1 +1 @@ -export function load() {} +export function load() {} diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index d3bbaed15469..77f15a391898 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -42,12 +42,12 @@ export interface Adapter { type AwaitedPropertiesUnion | void> = input extends void ? undefined // needs to be undefined, because void will break intellisense : input extends Record - ? { - [key in keyof input]: Awaited; - } - : {} extends input // handles the any case - ? input - : unknown; + ? { + [key in keyof input]: Awaited; + } + : {} extends input // handles the any case + ? input + : unknown; export type AwaitedProperties | void> = AwaitedPropertiesUnion extends Record @@ -70,8 +70,8 @@ type OptionalUnion< type UnpackValidationError = T extends ActionFailure ? X : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 80abcfd65742..b2229b421cf4 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -535,10 +535,10 @@ export function create_client(app, target) { typeof data !== 'object' ? `a ${typeof data}` : data instanceof Response - ? 'a Response object' - : Array.isArray(data) - ? 'an array' - : 'a non-plain object' + ? 'a Response object' + : Array.isArray(data) + ? 'an array' + : 'a non-plain object' }, but must return a plain object at the top level (i.e. \`return {...}\`)` ); } diff --git a/packages/kit/src/runtime/components/layout.svelte b/packages/kit/src/runtime/components/layout.svelte index 49aeb95a1db9..4fa864ce7aa9 100644 --- a/packages/kit/src/runtime/components/layout.svelte +++ b/packages/kit/src/runtime/components/layout.svelte @@ -1 +1 @@ - \ No newline at end of file + diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 1dbabbe2766c..e24dad5b3bed 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -359,10 +359,10 @@ function validate_load_response(data, routeId) { typeof data !== 'object' ? `a ${typeof data}` : data instanceof Response - ? 'a Response object' - : Array.isArray(data) - ? 'an array' - : 'a non-plain object' + ? 'a Response object' + : Array.isArray(data) + ? 'an array' + : 'a non-plain object' }, but must return a plain object at the top level (i.e. \`return {...}\`)` ); } diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 44b0e19a6975..22fadabf38d3 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -341,8 +341,8 @@ export async function respond(request, options, manifest, state) { const response = is_data_request ? redirect_json_response(e) : route?.page && is_action_json_request(event) - ? action_json_redirect(e) - : redirect_response(e.status, e.location); + ? action_json_redirect(e) + : redirect_response(e.status, e.location); add_cookies_to_headers(response.headers, Object.values(cookies_to_add)); return response; } diff --git a/packages/kit/test/apps/amp/src/app.html b/packages/kit/test/apps/amp/src/app.html index da318e7a69d2..b8e986c5d51a 100644 --- a/packages/kit/test/apps/amp/src/app.html +++ b/packages/kit/test/apps/amp/src/app.html @@ -1,4 +1,4 @@ - + diff --git a/packages/kit/test/apps/amp/src/routes/+layout.svelte b/packages/kit/test/apps/amp/src/routes/+layout.svelte index f7c91b7e246a..3d931ed395d6 100644 --- a/packages/kit/test/apps/amp/src/routes/+layout.svelte +++ b/packages/kit/test/apps/amp/src/routes/+layout.svelte @@ -1,4 +1,4 @@ - +
footer
diff --git a/packages/create-svelte/templates/default/src/routes/+page.svelte b/packages/create-svelte/templates/default/src/routes/+page.svelte deleted file mode 100644 index 97201ef364c8..000000000000 --- a/packages/create-svelte/templates/default/src/routes/+page.svelte +++ /dev/null @@ -1,59 +0,0 @@ - - - - Home - - - -
-

- - - - Welcome - - - - to your new
SvelteKit app -

- -

- try editing src/routes/+page.svelte -

- - -
- - diff --git a/packages/create-svelte/templates/default/src/routes/+page.ts b/packages/create-svelte/templates/default/src/routes/+page.ts deleted file mode 100644 index a72419a63f41..000000000000 --- a/packages/create-svelte/templates/default/src/routes/+page.ts +++ /dev/null @@ -1,3 +0,0 @@ -// since there's no dynamic data here, we can prerender -// it so that it gets served as a static asset in production -export const prerender = true; diff --git a/packages/create-svelte/templates/default/src/routes/Counter.svelte b/packages/create-svelte/templates/default/src/routes/Counter.svelte deleted file mode 100644 index e40221d44b60..000000000000 --- a/packages/create-svelte/templates/default/src/routes/Counter.svelte +++ /dev/null @@ -1,106 +0,0 @@ - - -
- - -
-
- - {Math.floor($displayed_count)} -
-
- - -
- - diff --git a/packages/create-svelte/templates/default/src/routes/Header.svelte b/packages/create-svelte/templates/default/src/routes/Header.svelte deleted file mode 100644 index 368b721e891b..000000000000 --- a/packages/create-svelte/templates/default/src/routes/Header.svelte +++ /dev/null @@ -1,129 +0,0 @@ - - -
-
- - SvelteKit - -
- - - -
- - GitHub - -
-
- - diff --git a/packages/create-svelte/templates/default/src/routes/about/+page.svelte b/packages/create-svelte/templates/default/src/routes/about/+page.svelte deleted file mode 100644 index 7f7946d23050..000000000000 --- a/packages/create-svelte/templates/default/src/routes/about/+page.svelte +++ /dev/null @@ -1,26 +0,0 @@ - - About - - - -
-

About this app

- -

- This is a SvelteKit app. You can make your own by typing the - following into your command line and following the prompts: -

- -
npm create svelte@latest
- -

- The page you're looking at is purely static HTML, with no client-side interactivity needed. - Because of that, we don't need to load any JavaScript. Try viewing the page's source, or opening - the devtools network panel and reloading. -

- -

- The Sverdle page illustrates SvelteKit's data loading and form handling. Try - using it with JavaScript disabled! -

-
diff --git a/packages/create-svelte/templates/default/src/routes/about/+page.ts b/packages/create-svelte/templates/default/src/routes/about/+page.ts deleted file mode 100644 index e739ef4b6c11..000000000000 --- a/packages/create-svelte/templates/default/src/routes/about/+page.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { dev } from '$app/environment'; - -// we don't need any JS on this page, though we'll load -// it in dev so that we get hot module replacement -export const csr = dev; - -// since there's no dynamic data here, we can prerender -// it so that it gets served as a static asset in production -export const prerender = true; diff --git a/packages/create-svelte/templates/default/src/routes/sverdle/+page.server.ts b/packages/create-svelte/templates/default/src/routes/sverdle/+page.server.ts deleted file mode 100644 index 0f52fe8d654c..000000000000 --- a/packages/create-svelte/templates/default/src/routes/sverdle/+page.server.ts +++ /dev/null @@ -1,71 +0,0 @@ -import { fail } from '@sveltejs/kit'; -import { Game } from './game'; -import type { PageServerLoad, Actions } from './$types'; - -/** @satisfies {import('./$types').PageServerLoad} */ -export const load = (({ cookies }) => { - const game = new Game(cookies.get('sverdle')); - - return { - /** - * The player's guessed words so far - */ - guesses: game.guesses, - - /** - * An array of strings like '__x_c' corresponding to the guesses, where 'x' means - * an exact match, and 'c' means a close match (right letter, wrong place) - */ - answers: game.answers, - - /** - * The correct answer, revealed if the game is over - */ - answer: game.answers.length >= 6 ? game.answer : null - }; -}) satisfies PageServerLoad; - -/** @satisfies {import('./$types').Actions} */ -export const actions = { - /** - * Modify game state in reaction to a keypress. If client-side JavaScript - * is available, this will happen in the browser instead of here - */ - update: async ({ request, cookies }) => { - const game = new Game(cookies.get('sverdle')); - - const data = await request.formData(); - const key = data.get('key'); - - const i = game.answers.length; - - if (key === 'backspace') { - game.guesses[i] = game.guesses[i].slice(0, -1); - } else { - game.guesses[i] += key; - } - - cookies.set('sverdle', game.toString(), { path: '/' }); - }, - - /** - * Modify game state in reaction to a guessed word. This logic always runs on - * the server, so that people can't cheat by peeking at the JavaScript - */ - enter: async ({ request, cookies }) => { - const game = new Game(cookies.get('sverdle')); - - const data = await request.formData(); - const guess = /** @type {string[]} */ data.getAll('guess') /***/ as string[]; - - if (!game.enter(guess)) { - return fail(400, { badGuess: true }); - } - - cookies.set('sverdle', game.toString(), { path: '/' }); - }, - - restart: async ({ cookies }) => { - cookies.delete('sverdle', { path: '/' }); - } -} satisfies Actions; diff --git a/packages/create-svelte/templates/default/src/routes/sverdle/+page.svelte b/packages/create-svelte/templates/default/src/routes/sverdle/+page.svelte deleted file mode 100644 index 42d987106d37..000000000000 --- a/packages/create-svelte/templates/default/src/routes/sverdle/+page.svelte +++ /dev/null @@ -1,417 +0,0 @@ - - - - - - Sverdle - - - -

Sverdle

- -
{ - // prevent default callback from resetting the form - return ({ update }) => { - update({ reset: false }); - }; - }} -> - How to play - -
- {#each Array.from(Array(6).keys()) as row (row)} - {@const current = row === i} -

Row {row + 1}

-
- {#each Array.from(Array(5).keys()) as column (column)} - {@const guess = current ? currentGuess : data.guesses[row]} - {@const answer = data.answers[row]?.[column]} - {@const value = guess?.[column] ?? ''} - {@const selected = current && column === guess.length} - {@const exact = answer === 'x'} - {@const close = answer === 'c'} - {@const missing = answer === '_'} -
- {value} - - {#if exact} - (correct) - {:else if close} - (present) - {:else if missing} - (absent) - {:else} - empty - {/if} - - -
- {/each} -
- {/each} -
- -
- {#if won || data.answers.length >= 6} - {#if !won && data.answer} -

the answer was "{data.answer}"

- {/if} - - {:else} -
- - - - - {#each ['qwertyuiop', 'asdfghjkl', 'zxcvbnm'] as row} -
- {#each row as letter} - - {/each} -
- {/each} -
- {/if} -
-
- -{#if won} -
-{/if} - - diff --git a/packages/create-svelte/templates/default/src/routes/sverdle/game.ts b/packages/create-svelte/templates/default/src/routes/sverdle/game.ts deleted file mode 100644 index d5cbe932e4cb..000000000000 --- a/packages/create-svelte/templates/default/src/routes/sverdle/game.ts +++ /dev/null @@ -1,77 +0,0 @@ -import { words, allowed } from './words.server'; - -export class Game { - index: number; - guesses: string[]; - answers: string[]; - answer: string; - - /** - * Create a game object from the player's cookie, or initialise a new game - * @param {string | undefined} serialized - */ - constructor(serialized: string | undefined = undefined) { - if (serialized) { - const [index, guesses, answers] = serialized.split('-'); - - this.index = +index; - this.guesses = guesses ? guesses.split(' ') : []; - this.answers = answers ? answers.split(' ') : []; - } else { - this.index = Math.floor(Math.random() * words.length); - this.guesses = ['', '', '', '', '', '']; - this.answers = /** @type {string[]} */ [] /***/; - } - - this.answer = words[this.index]; - } - - /** - * Update game state based on a guess of a five-letter word. Returns - * true if the guess was valid, false otherwise - * @param {string[]} letters - */ - enter(letters: string[]) { - const word = letters.join(''); - const valid = allowed.has(word); - - if (!valid) return false; - - this.guesses[this.answers.length] = word; - - const available = Array.from(this.answer); - const answer = Array(5).fill('_'); - - // first, find exact matches - for (let i = 0; i < 5; i += 1) { - if (letters[i] === available[i]) { - answer[i] = 'x'; - available[i] = ' '; - } - } - - // then find close matches (this has to happen - // in a second step, otherwise an early close - // match can prevent a later exact match) - for (let i = 0; i < 5; i += 1) { - if (answer[i] === '_') { - const index = available.indexOf(letters[i]); - if (index !== -1) { - answer[i] = 'c'; - available[index] = ' '; - } - } - } - - this.answers.push(answer.join('')); - - return true; - } - - /** - * Serialize game state so it can be set as a cookie - */ - toString() { - return `${this.index}-${this.guesses.join(' ')}-${this.answers.join(' ')}`; - } -} diff --git a/packages/create-svelte/templates/default/src/routes/sverdle/how-to-play/+page.svelte b/packages/create-svelte/templates/default/src/routes/sverdle/how-to-play/+page.svelte deleted file mode 100644 index e8e2cec3198e..000000000000 --- a/packages/create-svelte/templates/default/src/routes/sverdle/how-to-play/+page.svelte +++ /dev/null @@ -1,95 +0,0 @@ - - How to play Sverdle - - - -
-

How to play Sverdle

- -

- Sverdle is a clone of Wordle, the - word guessing game. To play, enter a five-letter English word. For example: -

- -
- r - i - t - z - y -
- -

- The y is in the right place. r and - t - are the right letters, but in the wrong place. The other letters are wrong, and can be discarded. - Let's make another guess: -

- -
- p - a - r - t - y -
- -

This time we guessed right! You have six guesses to get the word.

- -

- Unlike the original Wordle, Sverdle runs on the server instead of in the browser, making it - impossible to cheat. It uses <form> and cookies to submit data, meaning you can - even play with JavaScript disabled! -

-
- - diff --git a/packages/create-svelte/templates/default/src/routes/sverdle/how-to-play/+page.ts b/packages/create-svelte/templates/default/src/routes/sverdle/how-to-play/+page.ts deleted file mode 100644 index e739ef4b6c11..000000000000 --- a/packages/create-svelte/templates/default/src/routes/sverdle/how-to-play/+page.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { dev } from '$app/environment'; - -// we don't need any JS on this page, though we'll load -// it in dev so that we get hot module replacement -export const csr = dev; - -// since there's no dynamic data here, we can prerender -// it so that it gets served as a static asset in production -export const prerender = true; diff --git a/packages/create-svelte/templates/default/src/routes/sverdle/reduced-motion.ts b/packages/create-svelte/templates/default/src/routes/sverdle/reduced-motion.ts deleted file mode 100644 index 27b9d51161d0..000000000000 --- a/packages/create-svelte/templates/default/src/routes/sverdle/reduced-motion.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { readable } from 'svelte/store'; -import { browser } from '$app/environment'; - -const reduced_motion_query = '(prefers-reduced-motion: reduce)'; - -const get_initial_motion_preference = () => { - if (!browser) return false; - return window.matchMedia(reduced_motion_query).matches; -}; - -export const reduced_motion = readable(get_initial_motion_preference(), (set) => { - if (browser) { - /** - * @param {MediaQueryListEvent} event - */ - const set_reduced_motion = (event: MediaQueryListEvent) => { - set(event.matches); - }; - const media_query_list = window.matchMedia(reduced_motion_query); - media_query_list.addEventListener('change', set_reduced_motion); - - return () => { - media_query_list.removeEventListener('change', set_reduced_motion); - }; - } -}); diff --git a/packages/create-svelte/templates/default/src/routes/sverdle/words.server.ts b/packages/create-svelte/templates/default/src/routes/sverdle/words.server.ts deleted file mode 100644 index 56082a33115d..000000000000 --- a/packages/create-svelte/templates/default/src/routes/sverdle/words.server.ts +++ /dev/null @@ -1,12980 +0,0 @@ -/** The list of possible words */ -export const words = [ - 'aback', - 'abase', - 'abate', - 'abbey', - 'abbot', - 'abhor', - 'abide', - 'abled', - 'abode', - 'abort', - 'about', - 'above', - 'abuse', - 'abyss', - 'acorn', - 'acrid', - 'actor', - 'acute', - 'adage', - 'adapt', - 'adept', - 'admin', - 'admit', - 'adobe', - 'adopt', - 'adore', - 'adorn', - 'adult', - 'affix', - 'afire', - 'afoot', - 'afoul', - 'after', - 'again', - 'agape', - 'agate', - 'agent', - 'agile', - 'aging', - 'aglow', - 'agony', - 'agora', - 'agree', - 'ahead', - 'aider', - 'aisle', - 'alarm', - 'album', - 'alert', - 'algae', - 'alibi', - 'alien', - 'align', - 'alike', - 'alive', - 'allay', - 'alley', - 'allot', - 'allow', - 'alloy', - 'aloft', - 'alone', - 'along', - 'aloof', - 'aloud', - 'alpha', - 'altar', - 'alter', - 'amass', - 'amaze', - 'amber', - 'amble', - 'amend', - 'amiss', - 'amity', - 'among', - 'ample', - 'amply', - 'amuse', - 'angel', - 'anger', - 'angle', - 'angry', - 'angst', - 'anime', - 'ankle', - 'annex', - 'annoy', - 'annul', - 'anode', - 'antic', - 'anvil', - 'aorta', - 'apart', - 'aphid', - 'aping', - 'apnea', - 'apple', - 'apply', - 'apron', - 'aptly', - 'arbor', - 'ardor', - 'arena', - 'argue', - 'arise', - 'armor', - 'aroma', - 'arose', - 'array', - 'arrow', - 'arson', - 'artsy', - 'ascot', - 'ashen', - 'aside', - 'askew', - 'assay', - 'asset', - 'atoll', - 'atone', - 'attic', - 'audio', - 'audit', - 'augur', - 'aunty', - 'avail', - 'avert', - 'avian', - 'avoid', - 'await', - 'awake', - 'award', - 'aware', - 'awash', - 'awful', - 'awoke', - 'axial', - 'axiom', - 'axion', - 'azure', - 'bacon', - 'badge', - 'badly', - 'bagel', - 'baggy', - 'baker', - 'baler', - 'balmy', - 'banal', - 'banjo', - 'barge', - 'baron', - 'basal', - 'basic', - 'basil', - 'basin', - 'basis', - 'baste', - 'batch', - 'bathe', - 'baton', - 'batty', - 'bawdy', - 'bayou', - 'beach', - 'beady', - 'beard', - 'beast', - 'beech', - 'beefy', - 'befit', - 'began', - 'begat', - 'beget', - 'begin', - 'begun', - 'being', - 'belch', - 'belie', - 'belle', - 'belly', - 'below', - 'bench', - 'beret', - 'berry', - 'berth', - 'beset', - 'betel', - 'bevel', - 'bezel', - 'bible', - 'bicep', - 'biddy', - 'bigot', - 'bilge', - 'billy', - 'binge', - 'bingo', - 'biome', - 'birch', - 'birth', - 'bison', - 'bitty', - 'black', - 'blade', - 'blame', - 'bland', - 'blank', - 'blare', - 'blast', - 'blaze', - 'bleak', - 'bleat', - 'bleed', - 'bleep', - 'blend', - 'bless', - 'blimp', - 'blind', - 'blink', - 'bliss', - 'blitz', - 'bloat', - 'block', - 'bloke', - 'blond', - 'blood', - 'bloom', - 'blown', - 'bluer', - 'bluff', - 'blunt', - 'blurb', - 'blurt', - 'blush', - 'board', - 'boast', - 'bobby', - 'boney', - 'bongo', - 'bonus', - 'booby', - 'boost', - 'booth', - 'booty', - 'booze', - 'boozy', - 'borax', - 'borne', - 'bosom', - 'bossy', - 'botch', - 'bough', - 'boule', - 'bound', - 'bowel', - 'boxer', - 'brace', - 'braid', - 'brain', - 'brake', - 'brand', - 'brash', - 'brass', - 'brave', - 'bravo', - 'brawl', - 'brawn', - 'bread', - 'break', - 'breed', - 'briar', - 'bribe', - 'brick', - 'bride', - 'brief', - 'brine', - 'bring', - 'brink', - 'briny', - 'brisk', - 'broad', - 'broil', - 'broke', - 'brood', - 'brook', - 'broom', - 'broth', - 'brown', - 'brunt', - 'brush', - 'brute', - 'buddy', - 'budge', - 'buggy', - 'bugle', - 'build', - 'built', - 'bulge', - 'bulky', - 'bully', - 'bunch', - 'bunny', - 'burly', - 'burnt', - 'burst', - 'bused', - 'bushy', - 'butch', - 'butte', - 'buxom', - 'buyer', - 'bylaw', - 'cabal', - 'cabby', - 'cabin', - 'cable', - 'cacao', - 'cache', - 'cacti', - 'caddy', - 'cadet', - 'cagey', - 'cairn', - 'camel', - 'cameo', - 'canal', - 'candy', - 'canny', - 'canoe', - 'canon', - 'caper', - 'caput', - 'carat', - 'cargo', - 'carol', - 'carry', - 'carve', - 'caste', - 'catch', - 'cater', - 'catty', - 'caulk', - 'cause', - 'cavil', - 'cease', - 'cedar', - 'cello', - 'chafe', - 'chaff', - 'chain', - 'chair', - 'chalk', - 'champ', - 'chant', - 'chaos', - 'chard', - 'charm', - 'chart', - 'chase', - 'chasm', - 'cheap', - 'cheat', - 'check', - 'cheek', - 'cheer', - 'chess', - 'chest', - 'chick', - 'chide', - 'chief', - 'child', - 'chili', - 'chill', - 'chime', - 'china', - 'chirp', - 'chock', - 'choir', - 'choke', - 'chord', - 'chore', - 'chose', - 'chuck', - 'chump', - 'chunk', - 'churn', - 'chute', - 'cider', - 'cigar', - 'cinch', - 'circa', - 'civic', - 'civil', - 'clack', - 'claim', - 'clamp', - 'clang', - 'clank', - 'clash', - 'clasp', - 'class', - 'clean', - 'clear', - 'cleat', - 'cleft', - 'clerk', - 'click', - 'cliff', - 'climb', - 'cling', - 'clink', - 'cloak', - 'clock', - 'clone', - 'close', - 'cloth', - 'cloud', - 'clout', - 'clove', - 'clown', - 'cluck', - 'clued', - 'clump', - 'clung', - 'coach', - 'coast', - 'cobra', - 'cocoa', - 'colon', - 'color', - 'comet', - 'comfy', - 'comic', - 'comma', - 'conch', - 'condo', - 'conic', - 'copse', - 'coral', - 'corer', - 'corny', - 'couch', - 'cough', - 'could', - 'count', - 'coupe', - 'court', - 'coven', - 'cover', - 'covet', - 'covey', - 'cower', - 'coyly', - 'crack', - 'craft', - 'cramp', - 'crane', - 'crank', - 'crash', - 'crass', - 'crate', - 'crave', - 'crawl', - 'craze', - 'crazy', - 'creak', - 'cream', - 'credo', - 'creed', - 'creek', - 'creep', - 'creme', - 'crepe', - 'crept', - 'cress', - 'crest', - 'crick', - 'cried', - 'crier', - 'crime', - 'crimp', - 'crisp', - 'croak', - 'crock', - 'crone', - 'crony', - 'crook', - 'cross', - 'croup', - 'crowd', - 'crown', - 'crude', - 'cruel', - 'crumb', - 'crump', - 'crush', - 'crust', - 'crypt', - 'cubic', - 'cumin', - 'curio', - 'curly', - 'curry', - 'curse', - 'curve', - 'curvy', - 'cutie', - 'cyber', - 'cycle', - 'cynic', - 'daddy', - 'daily', - 'dairy', - 'daisy', - 'dally', - 'dance', - 'dandy', - 'datum', - 'daunt', - 'dealt', - 'death', - 'debar', - 'debit', - 'debug', - 'debut', - 'decal', - 'decay', - 'decor', - 'decoy', - 'decry', - 'defer', - 'deign', - 'deity', - 'delay', - 'delta', - 'delve', - 'demon', - 'demur', - 'denim', - 'dense', - 'depot', - 'depth', - 'derby', - 'deter', - 'detox', - 'deuce', - 'devil', - 'diary', - 'dicey', - 'digit', - 'dilly', - 'dimly', - 'diner', - 'dingo', - 'dingy', - 'diode', - 'dirge', - 'dirty', - 'disco', - 'ditch', - 'ditto', - 'ditty', - 'diver', - 'dizzy', - 'dodge', - 'dodgy', - 'dogma', - 'doing', - 'dolly', - 'donor', - 'donut', - 'dopey', - 'doubt', - 'dough', - 'dowdy', - 'dowel', - 'downy', - 'dowry', - 'dozen', - 'draft', - 'drain', - 'drake', - 'drama', - 'drank', - 'drape', - 'drawl', - 'drawn', - 'dread', - 'dream', - 'dress', - 'dried', - 'drier', - 'drift', - 'drill', - 'drink', - 'drive', - 'droit', - 'droll', - 'drone', - 'drool', - 'droop', - 'dross', - 'drove', - 'drown', - 'druid', - 'drunk', - 'dryer', - 'dryly', - 'duchy', - 'dully', - 'dummy', - 'dumpy', - 'dunce', - 'dusky', - 'dusty', - 'dutch', - 'duvet', - 'dwarf', - 'dwell', - 'dwelt', - 'dying', - 'eager', - 'eagle', - 'early', - 'earth', - 'easel', - 'eaten', - 'eater', - 'ebony', - 'eclat', - 'edict', - 'edify', - 'eerie', - 'egret', - 'eight', - 'eject', - 'eking', - 'elate', - 'elbow', - 'elder', - 'elect', - 'elegy', - 'elfin', - 'elide', - 'elite', - 'elope', - 'elude', - 'email', - 'embed', - 'ember', - 'emcee', - 'empty', - 'enact', - 'endow', - 'enema', - 'enemy', - 'enjoy', - 'ennui', - 'ensue', - 'enter', - 'entry', - 'envoy', - 'epoch', - 'epoxy', - 'equal', - 'equip', - 'erase', - 'erect', - 'erode', - 'error', - 'erupt', - 'essay', - 'ester', - 'ether', - 'ethic', - 'ethos', - 'etude', - 'evade', - 'event', - 'every', - 'evict', - 'evoke', - 'exact', - 'exalt', - 'excel', - 'exert', - 'exile', - 'exist', - 'expel', - 'extol', - 'extra', - 'exult', - 'eying', - 'fable', - 'facet', - 'faint', - 'fairy', - 'faith', - 'false', - 'fancy', - 'fanny', - 'farce', - 'fatal', - 'fatty', - 'fault', - 'fauna', - 'favor', - 'feast', - 'fecal', - 'feign', - 'fella', - 'felon', - 'femme', - 'femur', - 'fence', - 'feral', - 'ferry', - 'fetal', - 'fetch', - 'fetid', - 'fetus', - 'fever', - 'fewer', - 'fiber', - 'fibre', - 'ficus', - 'field', - 'fiend', - 'fiery', - 'fifth', - 'fifty', - 'fight', - 'filer', - 'filet', - 'filly', - 'filmy', - 'filth', - 'final', - 'finch', - 'finer', - 'first', - 'fishy', - 'fixer', - 'fizzy', - 'fjord', - 'flack', - 'flail', - 'flair', - 'flake', - 'flaky', - 'flame', - 'flank', - 'flare', - 'flash', - 'flask', - 'fleck', - 'fleet', - 'flesh', - 'flick', - 'flier', - 'fling', - 'flint', - 'flirt', - 'float', - 'flock', - 'flood', - 'floor', - 'flora', - 'floss', - 'flour', - 'flout', - 'flown', - 'fluff', - 'fluid', - 'fluke', - 'flume', - 'flung', - 'flunk', - 'flush', - 'flute', - 'flyer', - 'foamy', - 'focal', - 'focus', - 'foggy', - 'foist', - 'folio', - 'folly', - 'foray', - 'force', - 'forge', - 'forgo', - 'forte', - 'forth', - 'forty', - 'forum', - 'found', - 'foyer', - 'frail', - 'frame', - 'frank', - 'fraud', - 'freak', - 'freed', - 'freer', - 'fresh', - 'friar', - 'fried', - 'frill', - 'frisk', - 'fritz', - 'frock', - 'frond', - 'front', - 'frost', - 'froth', - 'frown', - 'froze', - 'fruit', - 'fudge', - 'fugue', - 'fully', - 'fungi', - 'funky', - 'funny', - 'furor', - 'furry', - 'fussy', - 'fuzzy', - 'gaffe', - 'gaily', - 'gamer', - 'gamma', - 'gamut', - 'gassy', - 'gaudy', - 'gauge', - 'gaunt', - 'gauze', - 'gavel', - 'gawky', - 'gayer', - 'gayly', - 'gazer', - 'gecko', - 'geeky', - 'geese', - 'genie', - 'genre', - 'ghost', - 'ghoul', - 'giant', - 'giddy', - 'gipsy', - 'girly', - 'girth', - 'given', - 'giver', - 'glade', - 'gland', - 'glare', - 'glass', - 'glaze', - 'gleam', - 'glean', - 'glide', - 'glint', - 'gloat', - 'globe', - 'gloom', - 'glory', - 'gloss', - 'glove', - 'glyph', - 'gnash', - 'gnome', - 'godly', - 'going', - 'golem', - 'golly', - 'gonad', - 'goner', - 'goody', - 'gooey', - 'goofy', - 'goose', - 'gorge', - 'gouge', - 'gourd', - 'grace', - 'grade', - 'graft', - 'grail', - 'grain', - 'grand', - 'grant', - 'grape', - 'graph', - 'grasp', - 'grass', - 'grate', - 'grave', - 'gravy', - 'graze', - 'great', - 'greed', - 'green', - 'greet', - 'grief', - 'grill', - 'grime', - 'grimy', - 'grind', - 'gripe', - 'groan', - 'groin', - 'groom', - 'grope', - 'gross', - 'group', - 'grout', - 'grove', - 'growl', - 'grown', - 'gruel', - 'gruff', - 'grunt', - 'guard', - 'guava', - 'guess', - 'guest', - 'guide', - 'guild', - 'guile', - 'guilt', - 'guise', - 'gulch', - 'gully', - 'gumbo', - 'gummy', - 'guppy', - 'gusto', - 'gusty', - 'gypsy', - 'habit', - 'hairy', - 'halve', - 'handy', - 'happy', - 'hardy', - 'harem', - 'harpy', - 'harry', - 'harsh', - 'haste', - 'hasty', - 'hatch', - 'hater', - 'haunt', - 'haute', - 'haven', - 'havoc', - 'hazel', - 'heady', - 'heard', - 'heart', - 'heath', - 'heave', - 'heavy', - 'hedge', - 'hefty', - 'heist', - 'helix', - 'hello', - 'hence', - 'heron', - 'hilly', - 'hinge', - 'hippo', - 'hippy', - 'hitch', - 'hoard', - 'hobby', - 'hoist', - 'holly', - 'homer', - 'honey', - 'honor', - 'horde', - 'horny', - 'horse', - 'hotel', - 'hotly', - 'hound', - 'house', - 'hovel', - 'hover', - 'howdy', - 'human', - 'humid', - 'humor', - 'humph', - 'humus', - 'hunch', - 'hunky', - 'hurry', - 'husky', - 'hussy', - 'hutch', - 'hydro', - 'hyena', - 'hymen', - 'hyper', - 'icily', - 'icing', - 'ideal', - 'idiom', - 'idiot', - 'idler', - 'idyll', - 'igloo', - 'iliac', - 'image', - 'imbue', - 'impel', - 'imply', - 'inane', - 'inbox', - 'incur', - 'index', - 'inept', - 'inert', - 'infer', - 'ingot', - 'inlay', - 'inlet', - 'inner', - 'input', - 'inter', - 'intro', - 'ionic', - 'irate', - 'irony', - 'islet', - 'issue', - 'itchy', - 'ivory', - 'jaunt', - 'jazzy', - 'jelly', - 'jerky', - 'jetty', - 'jewel', - 'jiffy', - 'joint', - 'joist', - 'joker', - 'jolly', - 'joust', - 'judge', - 'juice', - 'juicy', - 'jumbo', - 'jumpy', - 'junta', - 'junto', - 'juror', - 'kappa', - 'karma', - 'kayak', - 'kebab', - 'khaki', - 'kinky', - 'kiosk', - 'kitty', - 'knack', - 'knave', - 'knead', - 'kneed', - 'kneel', - 'knelt', - 'knife', - 'knock', - 'knoll', - 'known', - 'koala', - 'krill', - 'label', - 'labor', - 'laden', - 'ladle', - 'lager', - 'lance', - 'lanky', - 'lapel', - 'lapse', - 'large', - 'larva', - 'lasso', - 'latch', - 'later', - 'lathe', - 'latte', - 'laugh', - 'layer', - 'leach', - 'leafy', - 'leaky', - 'leant', - 'leapt', - 'learn', - 'lease', - 'leash', - 'least', - 'leave', - 'ledge', - 'leech', - 'leery', - 'lefty', - 'legal', - 'leggy', - 'lemon', - 'lemur', - 'leper', - 'level', - 'lever', - 'libel', - 'liege', - 'light', - 'liken', - 'lilac', - 'limbo', - 'limit', - 'linen', - 'liner', - 'lingo', - 'lipid', - 'lithe', - 'liver', - 'livid', - 'llama', - 'loamy', - 'loath', - 'lobby', - 'local', - 'locus', - 'lodge', - 'lofty', - 'logic', - 'login', - 'loopy', - 'loose', - 'lorry', - 'loser', - 'louse', - 'lousy', - 'lover', - 'lower', - 'lowly', - 'loyal', - 'lucid', - 'lucky', - 'lumen', - 'lumpy', - 'lunar', - 'lunch', - 'lunge', - 'lupus', - 'lurch', - 'lurid', - 'lusty', - 'lying', - 'lymph', - 'lynch', - 'lyric', - 'macaw', - 'macho', - 'macro', - 'madam', - 'madly', - 'mafia', - 'magic', - 'magma', - 'maize', - 'major', - 'maker', - 'mambo', - 'mamma', - 'mammy', - 'manga', - 'mange', - 'mango', - 'mangy', - 'mania', - 'manic', - 'manly', - 'manor', - 'maple', - 'march', - 'marry', - 'marsh', - 'mason', - 'masse', - 'match', - 'matey', - 'mauve', - 'maxim', - 'maybe', - 'mayor', - 'mealy', - 'meant', - 'meaty', - 'mecca', - 'medal', - 'media', - 'medic', - 'melee', - 'melon', - 'mercy', - 'merge', - 'merit', - 'merry', - 'metal', - 'meter', - 'metro', - 'micro', - 'midge', - 'midst', - 'might', - 'milky', - 'mimic', - 'mince', - 'miner', - 'minim', - 'minor', - 'minty', - 'minus', - 'mirth', - 'miser', - 'missy', - 'mocha', - 'modal', - 'model', - 'modem', - 'mogul', - 'moist', - 'molar', - 'moldy', - 'money', - 'month', - 'moody', - 'moose', - 'moral', - 'moron', - 'morph', - 'mossy', - 'motel', - 'motif', - 'motor', - 'motto', - 'moult', - 'mound', - 'mount', - 'mourn', - 'mouse', - 'mouth', - 'mover', - 'movie', - 'mower', - 'mucky', - 'mucus', - 'muddy', - 'mulch', - 'mummy', - 'munch', - 'mural', - 'murky', - 'mushy', - 'music', - 'musky', - 'musty', - 'myrrh', - 'nadir', - 'naive', - 'nanny', - 'nasal', - 'nasty', - 'natal', - 'naval', - 'navel', - 'needy', - 'neigh', - 'nerdy', - 'nerve', - 'never', - 'newer', - 'newly', - 'nicer', - 'niche', - 'niece', - 'night', - 'ninja', - 'ninny', - 'ninth', - 'noble', - 'nobly', - 'noise', - 'noisy', - 'nomad', - 'noose', - 'north', - 'nosey', - 'notch', - 'novel', - 'nudge', - 'nurse', - 'nutty', - 'nylon', - 'nymph', - 'oaken', - 'obese', - 'occur', - 'ocean', - 'octal', - 'octet', - 'odder', - 'oddly', - 'offal', - 'offer', - 'often', - 'olden', - 'older', - 'olive', - 'ombre', - 'omega', - 'onion', - 'onset', - 'opera', - 'opine', - 'opium', - 'optic', - 'orbit', - 'order', - 'organ', - 'other', - 'otter', - 'ought', - 'ounce', - 'outdo', - 'outer', - 'outgo', - 'ovary', - 'ovate', - 'overt', - 'ovine', - 'ovoid', - 'owing', - 'owner', - 'oxide', - 'ozone', - 'paddy', - 'pagan', - 'paint', - 'paler', - 'palsy', - 'panel', - 'panic', - 'pansy', - 'papal', - 'paper', - 'parer', - 'parka', - 'parry', - 'parse', - 'party', - 'pasta', - 'paste', - 'pasty', - 'patch', - 'patio', - 'patsy', - 'patty', - 'pause', - 'payee', - 'payer', - 'peace', - 'peach', - 'pearl', - 'pecan', - 'pedal', - 'penal', - 'pence', - 'penne', - 'penny', - 'perch', - 'peril', - 'perky', - 'pesky', - 'pesto', - 'petal', - 'petty', - 'phase', - 'phone', - 'phony', - 'photo', - 'piano', - 'picky', - 'piece', - 'piety', - 'piggy', - 'pilot', - 'pinch', - 'piney', - 'pinky', - 'pinto', - 'piper', - 'pique', - 'pitch', - 'pithy', - 'pivot', - 'pixel', - 'pixie', - 'pizza', - 'place', - 'plaid', - 'plain', - 'plait', - 'plane', - 'plank', - 'plant', - 'plate', - 'plaza', - 'plead', - 'pleat', - 'plied', - 'plier', - 'pluck', - 'plumb', - 'plume', - 'plump', - 'plunk', - 'plush', - 'poesy', - 'point', - 'poise', - 'poker', - 'polar', - 'polka', - 'polyp', - 'pooch', - 'poppy', - 'porch', - 'poser', - 'posit', - 'posse', - 'pouch', - 'pound', - 'pouty', - 'power', - 'prank', - 'prawn', - 'preen', - 'press', - 'price', - 'prick', - 'pride', - 'pried', - 'prime', - 'primo', - 'print', - 'prior', - 'prism', - 'privy', - 'prize', - 'probe', - 'prone', - 'prong', - 'proof', - 'prose', - 'proud', - 'prove', - 'prowl', - 'proxy', - 'prude', - 'prune', - 'psalm', - 'pubic', - 'pudgy', - 'puffy', - 'pulpy', - 'pulse', - 'punch', - 'pupal', - 'pupil', - 'puppy', - 'puree', - 'purer', - 'purge', - 'purse', - 'pushy', - 'putty', - 'pygmy', - 'quack', - 'quail', - 'quake', - 'qualm', - 'quark', - 'quart', - 'quash', - 'quasi', - 'queen', - 'queer', - 'quell', - 'query', - 'quest', - 'queue', - 'quick', - 'quiet', - 'quill', - 'quilt', - 'quirk', - 'quite', - 'quota', - 'quote', - 'quoth', - 'rabbi', - 'rabid', - 'racer', - 'radar', - 'radii', - 'radio', - 'rainy', - 'raise', - 'rajah', - 'rally', - 'ralph', - 'ramen', - 'ranch', - 'randy', - 'range', - 'rapid', - 'rarer', - 'raspy', - 'ratio', - 'ratty', - 'raven', - 'rayon', - 'razor', - 'reach', - 'react', - 'ready', - 'realm', - 'rearm', - 'rebar', - 'rebel', - 'rebus', - 'rebut', - 'recap', - 'recur', - 'recut', - 'reedy', - 'refer', - 'refit', - 'regal', - 'rehab', - 'reign', - 'relax', - 'relay', - 'relic', - 'remit', - 'renal', - 'renew', - 'repay', - 'repel', - 'reply', - 'rerun', - 'reset', - 'resin', - 'retch', - 'retro', - 'retry', - 'reuse', - 'revel', - 'revue', - 'rhino', - 'rhyme', - 'rider', - 'ridge', - 'rifle', - 'right', - 'rigid', - 'rigor', - 'rinse', - 'ripen', - 'riper', - 'risen', - 'riser', - 'risky', - 'rival', - 'river', - 'rivet', - 'roach', - 'roast', - 'robin', - 'robot', - 'rocky', - 'rodeo', - 'roger', - 'rogue', - 'roomy', - 'roost', - 'rotor', - 'rouge', - 'rough', - 'round', - 'rouse', - 'route', - 'rover', - 'rowdy', - 'rower', - 'royal', - 'ruddy', - 'ruder', - 'rugby', - 'ruler', - 'rumba', - 'rumor', - 'rupee', - 'rural', - 'rusty', - 'sadly', - 'safer', - 'saint', - 'salad', - 'sally', - 'salon', - 'salsa', - 'salty', - 'salve', - 'salvo', - 'sandy', - 'saner', - 'sappy', - 'sassy', - 'satin', - 'satyr', - 'sauce', - 'saucy', - 'sauna', - 'saute', - 'savor', - 'savoy', - 'savvy', - 'scald', - 'scale', - 'scalp', - 'scaly', - 'scamp', - 'scant', - 'scare', - 'scarf', - 'scary', - 'scene', - 'scent', - 'scion', - 'scoff', - 'scold', - 'scone', - 'scoop', - 'scope', - 'score', - 'scorn', - 'scour', - 'scout', - 'scowl', - 'scram', - 'scrap', - 'scree', - 'screw', - 'scrub', - 'scrum', - 'scuba', - 'sedan', - 'seedy', - 'segue', - 'seize', - 'semen', - 'sense', - 'sepia', - 'serif', - 'serum', - 'serve', - 'setup', - 'seven', - 'sever', - 'sewer', - 'shack', - 'shade', - 'shady', - 'shaft', - 'shake', - 'shaky', - 'shale', - 'shall', - 'shalt', - 'shame', - 'shank', - 'shape', - 'shard', - 'share', - 'shark', - 'sharp', - 'shave', - 'shawl', - 'shear', - 'sheen', - 'sheep', - 'sheer', - 'sheet', - 'sheik', - 'shelf', - 'shell', - 'shied', - 'shift', - 'shine', - 'shiny', - 'shire', - 'shirk', - 'shirt', - 'shoal', - 'shock', - 'shone', - 'shook', - 'shoot', - 'shore', - 'shorn', - 'short', - 'shout', - 'shove', - 'shown', - 'showy', - 'shrew', - 'shrub', - 'shrug', - 'shuck', - 'shunt', - 'shush', - 'shyly', - 'siege', - 'sieve', - 'sight', - 'sigma', - 'silky', - 'silly', - 'since', - 'sinew', - 'singe', - 'siren', - 'sissy', - 'sixth', - 'sixty', - 'skate', - 'skier', - 'skiff', - 'skill', - 'skimp', - 'skirt', - 'skulk', - 'skull', - 'skunk', - 'slack', - 'slain', - 'slang', - 'slant', - 'slash', - 'slate', - 'slave', - 'sleek', - 'sleep', - 'sleet', - 'slept', - 'slice', - 'slick', - 'slide', - 'slime', - 'slimy', - 'sling', - 'slink', - 'sloop', - 'slope', - 'slosh', - 'sloth', - 'slump', - 'slung', - 'slunk', - 'slurp', - 'slush', - 'slyly', - 'smack', - 'small', - 'smart', - 'smash', - 'smear', - 'smell', - 'smelt', - 'smile', - 'smirk', - 'smite', - 'smith', - 'smock', - 'smoke', - 'smoky', - 'smote', - 'snack', - 'snail', - 'snake', - 'snaky', - 'snare', - 'snarl', - 'sneak', - 'sneer', - 'snide', - 'sniff', - 'snipe', - 'snoop', - 'snore', - 'snort', - 'snout', - 'snowy', - 'snuck', - 'snuff', - 'soapy', - 'sober', - 'soggy', - 'solar', - 'solid', - 'solve', - 'sonar', - 'sonic', - 'sooth', - 'sooty', - 'sorry', - 'sound', - 'south', - 'sower', - 'space', - 'spade', - 'spank', - 'spare', - 'spark', - 'spasm', - 'spawn', - 'speak', - 'spear', - 'speck', - 'speed', - 'spell', - 'spelt', - 'spend', - 'spent', - 'sperm', - 'spice', - 'spicy', - 'spied', - 'spiel', - 'spike', - 'spiky', - 'spill', - 'spilt', - 'spine', - 'spiny', - 'spire', - 'spite', - 'splat', - 'split', - 'spoil', - 'spoke', - 'spoof', - 'spook', - 'spool', - 'spoon', - 'spore', - 'sport', - 'spout', - 'spray', - 'spree', - 'sprig', - 'spunk', - 'spurn', - 'spurt', - 'squad', - 'squat', - 'squib', - 'stack', - 'staff', - 'stage', - 'staid', - 'stain', - 'stair', - 'stake', - 'stale', - 'stalk', - 'stall', - 'stamp', - 'stand', - 'stank', - 'stare', - 'stark', - 'start', - 'stash', - 'state', - 'stave', - 'stead', - 'steak', - 'steal', - 'steam', - 'steed', - 'steel', - 'steep', - 'steer', - 'stein', - 'stern', - 'stick', - 'stiff', - 'still', - 'stilt', - 'sting', - 'stink', - 'stint', - 'stock', - 'stoic', - 'stoke', - 'stole', - 'stomp', - 'stone', - 'stony', - 'stood', - 'stool', - 'stoop', - 'store', - 'stork', - 'storm', - 'story', - 'stout', - 'stove', - 'strap', - 'straw', - 'stray', - 'strip', - 'strut', - 'stuck', - 'study', - 'stuff', - 'stump', - 'stung', - 'stunk', - 'stunt', - 'style', - 'suave', - 'sugar', - 'suing', - 'suite', - 'sulky', - 'sully', - 'sumac', - 'sunny', - 'super', - 'surer', - 'surge', - 'surly', - 'sushi', - 'swami', - 'swamp', - 'swarm', - 'swash', - 'swath', - 'swear', - 'sweat', - 'sweep', - 'sweet', - 'swell', - 'swept', - 'swift', - 'swill', - 'swine', - 'swing', - 'swirl', - 'swish', - 'swoon', - 'swoop', - 'sword', - 'swore', - 'sworn', - 'swung', - 'synod', - 'syrup', - 'tabby', - 'table', - 'taboo', - 'tacit', - 'tacky', - 'taffy', - 'taint', - 'taken', - 'taker', - 'tally', - 'talon', - 'tamer', - 'tango', - 'tangy', - 'taper', - 'tapir', - 'tardy', - 'tarot', - 'taste', - 'tasty', - 'tatty', - 'taunt', - 'tawny', - 'teach', - 'teary', - 'tease', - 'teddy', - 'teeth', - 'tempo', - 'tenet', - 'tenor', - 'tense', - 'tenth', - 'tepee', - 'tepid', - 'terra', - 'terse', - 'testy', - 'thank', - 'theft', - 'their', - 'theme', - 'there', - 'these', - 'theta', - 'thick', - 'thief', - 'thigh', - 'thing', - 'think', - 'third', - 'thong', - 'thorn', - 'those', - 'three', - 'threw', - 'throb', - 'throw', - 'thrum', - 'thumb', - 'thump', - 'thyme', - 'tiara', - 'tibia', - 'tidal', - 'tiger', - 'tight', - 'tilde', - 'timer', - 'timid', - 'tipsy', - 'titan', - 'tithe', - 'title', - 'toast', - 'today', - 'toddy', - 'token', - 'tonal', - 'tonga', - 'tonic', - 'tooth', - 'topaz', - 'topic', - 'torch', - 'torso', - 'torus', - 'total', - 'totem', - 'touch', - 'tough', - 'towel', - 'tower', - 'toxic', - 'toxin', - 'trace', - 'track', - 'tract', - 'trade', - 'trail', - 'train', - 'trait', - 'tramp', - 'trash', - 'trawl', - 'tread', - 'treat', - 'trend', - 'triad', - 'trial', - 'tribe', - 'trice', - 'trick', - 'tried', - 'tripe', - 'trite', - 'troll', - 'troop', - 'trope', - 'trout', - 'trove', - 'truce', - 'truck', - 'truer', - 'truly', - 'trump', - 'trunk', - 'truss', - 'trust', - 'truth', - 'tryst', - 'tubal', - 'tuber', - 'tulip', - 'tulle', - 'tumor', - 'tunic', - 'turbo', - 'tutor', - 'twang', - 'tweak', - 'tweed', - 'tweet', - 'twice', - 'twine', - 'twirl', - 'twist', - 'twixt', - 'tying', - 'udder', - 'ulcer', - 'ultra', - 'umbra', - 'uncle', - 'uncut', - 'under', - 'undid', - 'undue', - 'unfed', - 'unfit', - 'unify', - 'union', - 'unite', - 'unity', - 'unlit', - 'unmet', - 'unset', - 'untie', - 'until', - 'unwed', - 'unzip', - 'upper', - 'upset', - 'urban', - 'urine', - 'usage', - 'usher', - 'using', - 'usual', - 'usurp', - 'utile', - 'utter', - 'vague', - 'valet', - 'valid', - 'valor', - 'value', - 'valve', - 'vapid', - 'vapor', - 'vault', - 'vaunt', - 'vegan', - 'venom', - 'venue', - 'verge', - 'verse', - 'verso', - 'verve', - 'vicar', - 'video', - 'vigil', - 'vigor', - 'villa', - 'vinyl', - 'viola', - 'viper', - 'viral', - 'virus', - 'visit', - 'visor', - 'vista', - 'vital', - 'vivid', - 'vixen', - 'vocal', - 'vodka', - 'vogue', - 'voice', - 'voila', - 'vomit', - 'voter', - 'vouch', - 'vowel', - 'vying', - 'wacky', - 'wafer', - 'wager', - 'wagon', - 'waist', - 'waive', - 'waltz', - 'warty', - 'waste', - 'watch', - 'water', - 'waver', - 'waxen', - 'weary', - 'weave', - 'wedge', - 'weedy', - 'weigh', - 'weird', - 'welch', - 'welsh', - 'wench', - 'whack', - 'whale', - 'wharf', - 'wheat', - 'wheel', - 'whelp', - 'where', - 'which', - 'whiff', - 'while', - 'whine', - 'whiny', - 'whirl', - 'whisk', - 'white', - 'whole', - 'whoop', - 'whose', - 'widen', - 'wider', - 'widow', - 'width', - 'wield', - 'wight', - 'willy', - 'wimpy', - 'wince', - 'winch', - 'windy', - 'wiser', - 'wispy', - 'witch', - 'witty', - 'woken', - 'woman', - 'women', - 'woody', - 'wooer', - 'wooly', - 'woozy', - 'wordy', - 'world', - 'worry', - 'worse', - 'worst', - 'worth', - 'would', - 'wound', - 'woven', - 'wrack', - 'wrath', - 'wreak', - 'wreck', - 'wrest', - 'wring', - 'wrist', - 'write', - 'wrong', - 'wrote', - 'wrung', - 'wryly', - 'yacht', - 'yearn', - 'yeast', - 'yield', - 'young', - 'youth', - 'zebra', - 'zesty', - 'zonal' -]; - -/** The list of valid guesses, of which the list of possible words is a subset */ -export const allowed = new Set([ - ...words, - 'aahed', - 'aalii', - 'aargh', - 'aarti', - 'abaca', - 'abaci', - 'abacs', - 'abaft', - 'abaka', - 'abamp', - 'aband', - 'abash', - 'abask', - 'abaya', - 'abbas', - 'abbed', - 'abbes', - 'abcee', - 'abeam', - 'abear', - 'abele', - 'abers', - 'abets', - 'abies', - 'abler', - 'ables', - 'ablet', - 'ablow', - 'abmho', - 'abohm', - 'aboil', - 'aboma', - 'aboon', - 'abord', - 'abore', - 'abram', - 'abray', - 'abrim', - 'abrin', - 'abris', - 'absey', - 'absit', - 'abuna', - 'abune', - 'abuts', - 'abuzz', - 'abyes', - 'abysm', - 'acais', - 'acari', - 'accas', - 'accoy', - 'acerb', - 'acers', - 'aceta', - 'achar', - 'ached', - 'aches', - 'achoo', - 'acids', - 'acidy', - 'acing', - 'acini', - 'ackee', - 'acker', - 'acmes', - 'acmic', - 'acned', - 'acnes', - 'acock', - 'acold', - 'acred', - 'acres', - 'acros', - 'acted', - 'actin', - 'acton', - 'acyls', - 'adaws', - 'adays', - 'adbot', - 'addax', - 'added', - 'adder', - 'addio', - 'addle', - 'adeem', - 'adhan', - 'adieu', - 'adios', - 'adits', - 'adman', - 'admen', - 'admix', - 'adobo', - 'adown', - 'adoze', - 'adrad', - 'adred', - 'adsum', - 'aduki', - 'adunc', - 'adust', - 'advew', - 'adyta', - 'adzed', - 'adzes', - 'aecia', - 'aedes', - 'aegis', - 'aeons', - 'aerie', - 'aeros', - 'aesir', - 'afald', - 'afara', - 'afars', - 'afear', - 'aflaj', - 'afore', - 'afrit', - 'afros', - 'agama', - 'agami', - 'agars', - 'agast', - 'agave', - 'agaze', - 'agene', - 'agers', - 'agger', - 'aggie', - 'aggri', - 'aggro', - 'aggry', - 'aghas', - 'agila', - 'agios', - 'agism', - 'agist', - 'agita', - 'aglee', - 'aglet', - 'agley', - 'agloo', - 'aglus', - 'agmas', - 'agoge', - 'agone', - 'agons', - 'agood', - 'agria', - 'agrin', - 'agros', - 'agued', - 'agues', - 'aguna', - 'aguti', - 'aheap', - 'ahent', - 'ahigh', - 'ahind', - 'ahing', - 'ahint', - 'ahold', - 'ahull', - 'ahuru', - 'aidas', - 'aided', - 'aides', - 'aidoi', - 'aidos', - 'aiery', - 'aigas', - 'aight', - 'ailed', - 'aimed', - 'aimer', - 'ainee', - 'ainga', - 'aioli', - 'aired', - 'airer', - 'airns', - 'airth', - 'airts', - 'aitch', - 'aitus', - 'aiver', - 'aiyee', - 'aizle', - 'ajies', - 'ajiva', - 'ajuga', - 'ajwan', - 'akees', - 'akela', - 'akene', - 'aking', - 'akita', - 'akkas', - 'alaap', - 'alack', - 'alamo', - 'aland', - 'alane', - 'alang', - 'alans', - 'alant', - 'alapa', - 'alaps', - 'alary', - 'alate', - 'alays', - 'albas', - 'albee', - 'alcid', - 'alcos', - 'aldea', - 'alder', - 'aldol', - 'aleck', - 'alecs', - 'alefs', - 'aleft', - 'aleph', - 'alews', - 'aleye', - 'alfas', - 'algal', - 'algas', - 'algid', - 'algin', - 'algor', - 'algum', - 'alias', - 'alifs', - 'aline', - 'alist', - 'aliya', - 'alkie', - 'alkos', - 'alkyd', - 'alkyl', - 'allee', - 'allel', - 'allis', - 'allod', - 'allyl', - 'almah', - 'almas', - 'almeh', - 'almes', - 'almud', - 'almug', - 'alods', - 'aloed', - 'aloes', - 'aloha', - 'aloin', - 'aloos', - 'alowe', - 'altho', - 'altos', - 'alula', - 'alums', - 'alure', - 'alvar', - 'alway', - 'amahs', - 'amain', - 'amate', - 'amaut', - 'amban', - 'ambit', - 'ambos', - 'ambry', - 'ameba', - 'ameer', - 'amene', - 'amens', - 'ament', - 'amias', - 'amice', - 'amici', - 'amide', - 'amido', - 'amids', - 'amies', - 'amiga', - 'amigo', - 'amine', - 'amino', - 'amins', - 'amirs', - 'amlas', - 'amman', - 'ammon', - 'ammos', - 'amnia', - 'amnic', - 'amnio', - 'amoks', - 'amole', - 'amort', - 'amour', - 'amove', - 'amowt', - 'amped', - 'ampul', - 'amrit', - 'amuck', - 'amyls', - 'anana', - 'anata', - 'ancho', - 'ancle', - 'ancon', - 'andro', - 'anear', - 'anele', - 'anent', - 'angas', - 'anglo', - 'anigh', - 'anile', - 'anils', - 'anima', - 'animi', - 'anion', - 'anise', - 'anker', - 'ankhs', - 'ankus', - 'anlas', - 'annal', - 'annas', - 'annat', - 'anoas', - 'anole', - 'anomy', - 'ansae', - 'antae', - 'antar', - 'antas', - 'anted', - 'antes', - 'antis', - 'antra', - 'antre', - 'antsy', - 'anura', - 'anyon', - 'apace', - 'apage', - 'apaid', - 'apayd', - 'apays', - 'apeak', - 'apeek', - 'apers', - 'apert', - 'apery', - 'apgar', - 'aphis', - 'apian', - 'apiol', - 'apish', - 'apism', - 'apode', - 'apods', - 'apoop', - 'aport', - 'appal', - 'appay', - 'appel', - 'appro', - 'appui', - 'appuy', - 'apres', - 'apses', - 'apsis', - 'apsos', - 'apted', - 'apter', - 'aquae', - 'aquas', - 'araba', - 'araks', - 'arame', - 'arars', - 'arbas', - 'arced', - 'archi', - 'arcos', - 'arcus', - 'ardeb', - 'ardri', - 'aread', - 'areae', - 'areal', - 'arear', - 'areas', - 'areca', - 'aredd', - 'arede', - 'arefy', - 'areic', - 'arene', - 'arepa', - 'arere', - 'arete', - 'arets', - 'arett', - 'argal', - 'argan', - 'argil', - 'argle', - 'argol', - 'argon', - 'argot', - 'argus', - 'arhat', - 'arias', - 'ariel', - 'ariki', - 'arils', - 'ariot', - 'arish', - 'arked', - 'arled', - 'arles', - 'armed', - 'armer', - 'armet', - 'armil', - 'arnas', - 'arnut', - 'aroba', - 'aroha', - 'aroid', - 'arpas', - 'arpen', - 'arrah', - 'arras', - 'arret', - 'arris', - 'arroz', - 'arsed', - 'arses', - 'arsey', - 'arsis', - 'artal', - 'artel', - 'artic', - 'artis', - 'aruhe', - 'arums', - 'arval', - 'arvee', - 'arvos', - 'aryls', - 'asana', - 'ascon', - 'ascus', - 'asdic', - 'ashed', - 'ashes', - 'ashet', - 'asked', - 'asker', - 'askoi', - 'askos', - 'aspen', - 'asper', - 'aspic', - 'aspie', - 'aspis', - 'aspro', - 'assai', - 'assam', - 'asses', - 'assez', - 'assot', - 'aster', - 'astir', - 'astun', - 'asura', - 'asway', - 'aswim', - 'asyla', - 'ataps', - 'ataxy', - 'atigi', - 'atilt', - 'atimy', - 'atlas', - 'atman', - 'atmas', - 'atmos', - 'atocs', - 'atoke', - 'atoks', - 'atoms', - 'atomy', - 'atony', - 'atopy', - 'atria', - 'atrip', - 'attap', - 'attar', - 'atuas', - 'audad', - 'auger', - 'aught', - 'aulas', - 'aulic', - 'auloi', - 'aulos', - 'aumil', - 'aunes', - 'aunts', - 'aurae', - 'aural', - 'aurar', - 'auras', - 'aurei', - 'aures', - 'auric', - 'auris', - 'aurum', - 'autos', - 'auxin', - 'avale', - 'avant', - 'avast', - 'avels', - 'avens', - 'avers', - 'avgas', - 'avine', - 'avion', - 'avise', - 'aviso', - 'avize', - 'avows', - 'avyze', - 'awarn', - 'awato', - 'awave', - 'aways', - 'awdls', - 'aweel', - 'aweto', - 'awing', - 'awmry', - 'awned', - 'awner', - 'awols', - 'awork', - 'axels', - 'axile', - 'axils', - 'axing', - 'axite', - 'axled', - 'axles', - 'axman', - 'axmen', - 'axoid', - 'axone', - 'axons', - 'ayahs', - 'ayaya', - 'ayelp', - 'aygre', - 'ayins', - 'ayont', - 'ayres', - 'ayrie', - 'azans', - 'azide', - 'azido', - 'azine', - 'azlon', - 'azoic', - 'azole', - 'azons', - 'azote', - 'azoth', - 'azuki', - 'azurn', - 'azury', - 'azygy', - 'azyme', - 'azyms', - 'baaed', - 'baals', - 'babas', - 'babel', - 'babes', - 'babka', - 'baboo', - 'babul', - 'babus', - 'bacca', - 'bacco', - 'baccy', - 'bacha', - 'bachs', - 'backs', - 'baddy', - 'baels', - 'baffs', - 'baffy', - 'bafts', - 'baghs', - 'bagie', - 'bahts', - 'bahus', - 'bahut', - 'bails', - 'bairn', - 'baisa', - 'baith', - 'baits', - 'baiza', - 'baize', - 'bajan', - 'bajra', - 'bajri', - 'bajus', - 'baked', - 'baken', - 'bakes', - 'bakra', - 'balas', - 'balds', - 'baldy', - 'baled', - 'bales', - 'balks', - 'balky', - 'balls', - 'bally', - 'balms', - 'baloo', - 'balsa', - 'balti', - 'balun', - 'balus', - 'bambi', - 'banak', - 'banco', - 'bancs', - 'banda', - 'bandh', - 'bands', - 'bandy', - 'baned', - 'banes', - 'bangs', - 'bania', - 'banks', - 'banns', - 'bants', - 'bantu', - 'banty', - 'banya', - 'bapus', - 'barbe', - 'barbs', - 'barby', - 'barca', - 'barde', - 'bardo', - 'bards', - 'bardy', - 'bared', - 'barer', - 'bares', - 'barfi', - 'barfs', - 'baric', - 'barks', - 'barky', - 'barms', - 'barmy', - 'barns', - 'barny', - 'barps', - 'barra', - 'barre', - 'barro', - 'barry', - 'barye', - 'basan', - 'based', - 'basen', - 'baser', - 'bases', - 'basho', - 'basij', - 'basks', - 'bason', - 'basse', - 'bassi', - 'basso', - 'bassy', - 'basta', - 'basti', - 'basto', - 'basts', - 'bated', - 'bates', - 'baths', - 'batik', - 'batta', - 'batts', - 'battu', - 'bauds', - 'bauks', - 'baulk', - 'baurs', - 'bavin', - 'bawds', - 'bawks', - 'bawls', - 'bawns', - 'bawrs', - 'bawty', - 'bayed', - 'bayer', - 'bayes', - 'bayle', - 'bayts', - 'bazar', - 'bazoo', - 'beads', - 'beaks', - 'beaky', - 'beals', - 'beams', - 'beamy', - 'beano', - 'beans', - 'beany', - 'beare', - 'bears', - 'beath', - 'beats', - 'beaty', - 'beaus', - 'beaut', - 'beaux', - 'bebop', - 'becap', - 'becke', - 'becks', - 'bedad', - 'bedel', - 'bedes', - 'bedew', - 'bedim', - 'bedye', - 'beedi', - 'beefs', - 'beeps', - 'beers', - 'beery', - 'beets', - 'befog', - 'begad', - 'begar', - 'begem', - 'begot', - 'begum', - 'beige', - 'beigy', - 'beins', - 'bekah', - 'belah', - 'belar', - 'belay', - 'belee', - 'belga', - 'bells', - 'belon', - 'belts', - 'bemad', - 'bemas', - 'bemix', - 'bemud', - 'bends', - 'bendy', - 'benes', - 'benet', - 'benga', - 'benis', - 'benne', - 'benni', - 'benny', - 'bento', - 'bents', - 'benty', - 'bepat', - 'beray', - 'beres', - 'bergs', - 'berko', - 'berks', - 'berme', - 'berms', - 'berob', - 'beryl', - 'besat', - 'besaw', - 'besee', - 'beses', - 'besit', - 'besom', - 'besot', - 'besti', - 'bests', - 'betas', - 'beted', - 'betes', - 'beths', - 'betid', - 'beton', - 'betta', - 'betty', - 'bever', - 'bevor', - 'bevue', - 'bevvy', - 'bewet', - 'bewig', - 'bezes', - 'bezil', - 'bezzy', - 'bhais', - 'bhaji', - 'bhang', - 'bhats', - 'bhels', - 'bhoot', - 'bhuna', - 'bhuts', - 'biach', - 'biali', - 'bialy', - 'bibbs', - 'bibes', - 'biccy', - 'bices', - 'bided', - 'bider', - 'bides', - 'bidet', - 'bidis', - 'bidon', - 'bield', - 'biers', - 'biffo', - 'biffs', - 'biffy', - 'bifid', - 'bigae', - 'biggs', - 'biggy', - 'bigha', - 'bight', - 'bigly', - 'bigos', - 'bijou', - 'biked', - 'biker', - 'bikes', - 'bikie', - 'bilbo', - 'bilby', - 'biled', - 'biles', - 'bilgy', - 'bilks', - 'bills', - 'bimah', - 'bimas', - 'bimbo', - 'binal', - 'bindi', - 'binds', - 'biner', - 'bines', - 'bings', - 'bingy', - 'binit', - 'binks', - 'bints', - 'biogs', - 'biont', - 'biota', - 'biped', - 'bipod', - 'birds', - 'birks', - 'birle', - 'birls', - 'biros', - 'birrs', - 'birse', - 'birsy', - 'bises', - 'bisks', - 'bisom', - 'bitch', - 'biter', - 'bites', - 'bitos', - 'bitou', - 'bitsy', - 'bitte', - 'bitts', - 'bivia', - 'bivvy', - 'bizes', - 'bizzo', - 'bizzy', - 'blabs', - 'blads', - 'blady', - 'blaer', - 'blaes', - 'blaff', - 'blags', - 'blahs', - 'blain', - 'blams', - 'blart', - 'blase', - 'blash', - 'blate', - 'blats', - 'blatt', - 'blaud', - 'blawn', - 'blaws', - 'blays', - 'blear', - 'blebs', - 'blech', - 'blees', - 'blent', - 'blert', - 'blest', - 'blets', - 'bleys', - 'blimy', - 'bling', - 'blini', - 'blins', - 'bliny', - 'blips', - 'blist', - 'blite', - 'blits', - 'blive', - 'blobs', - 'blocs', - 'blogs', - 'blook', - 'bloop', - 'blore', - 'blots', - 'blows', - 'blowy', - 'blubs', - 'blude', - 'bluds', - 'bludy', - 'blued', - 'blues', - 'bluet', - 'bluey', - 'bluid', - 'blume', - 'blunk', - 'blurs', - 'blype', - 'boabs', - 'boaks', - 'boars', - 'boart', - 'boats', - 'bobac', - 'bobak', - 'bobas', - 'bobol', - 'bobos', - 'bocca', - 'bocce', - 'bocci', - 'boche', - 'bocks', - 'boded', - 'bodes', - 'bodge', - 'bodhi', - 'bodle', - 'boeps', - 'boets', - 'boeuf', - 'boffo', - 'boffs', - 'bogan', - 'bogey', - 'boggy', - 'bogie', - 'bogle', - 'bogue', - 'bogus', - 'bohea', - 'bohos', - 'boils', - 'boing', - 'boink', - 'boite', - 'boked', - 'bokeh', - 'bokes', - 'bokos', - 'bolar', - 'bolas', - 'bolds', - 'boles', - 'bolix', - 'bolls', - 'bolos', - 'bolts', - 'bolus', - 'bomas', - 'bombe', - 'bombo', - 'bombs', - 'bonce', - 'bonds', - 'boned', - 'boner', - 'bones', - 'bongs', - 'bonie', - 'bonks', - 'bonne', - 'bonny', - 'bonza', - 'bonze', - 'booai', - 'booay', - 'boobs', - 'boody', - 'booed', - 'boofy', - 'boogy', - 'boohs', - 'books', - 'booky', - 'bools', - 'booms', - 'boomy', - 'boong', - 'boons', - 'boord', - 'boors', - 'boose', - 'boots', - 'boppy', - 'borak', - 'boral', - 'boras', - 'borde', - 'bords', - 'bored', - 'boree', - 'borel', - 'borer', - 'bores', - 'borgo', - 'boric', - 'borks', - 'borms', - 'borna', - 'boron', - 'borts', - 'borty', - 'bortz', - 'bosie', - 'bosks', - 'bosky', - 'boson', - 'bosun', - 'botas', - 'botel', - 'botes', - 'bothy', - 'botte', - 'botts', - 'botty', - 'bouge', - 'bouks', - 'boult', - 'bouns', - 'bourd', - 'bourg', - 'bourn', - 'bouse', - 'bousy', - 'bouts', - 'bovid', - 'bowat', - 'bowed', - 'bower', - 'bowes', - 'bowet', - 'bowie', - 'bowls', - 'bowne', - 'bowrs', - 'bowse', - 'boxed', - 'boxen', - 'boxes', - 'boxla', - 'boxty', - 'boyar', - 'boyau', - 'boyed', - 'boyfs', - 'boygs', - 'boyla', - 'boyos', - 'boysy', - 'bozos', - 'braai', - 'brach', - 'brack', - 'bract', - 'brads', - 'braes', - 'brags', - 'brail', - 'braks', - 'braky', - 'brame', - 'brane', - 'brank', - 'brans', - 'brant', - 'brast', - 'brats', - 'brava', - 'bravi', - 'braws', - 'braxy', - 'brays', - 'braza', - 'braze', - 'bream', - 'brede', - 'breds', - 'breem', - 'breer', - 'brees', - 'breid', - 'breis', - 'breme', - 'brens', - 'brent', - 'brere', - 'brers', - 'breve', - 'brews', - 'breys', - 'brier', - 'bries', - 'brigs', - 'briki', - 'briks', - 'brill', - 'brims', - 'brins', - 'brios', - 'brise', - 'briss', - 'brith', - 'brits', - 'britt', - 'brize', - 'broch', - 'brock', - 'brods', - 'brogh', - 'brogs', - 'brome', - 'bromo', - 'bronc', - 'brond', - 'brool', - 'broos', - 'brose', - 'brosy', - 'brows', - 'brugh', - 'bruin', - 'bruit', - 'brule', - 'brume', - 'brung', - 'brusk', - 'brust', - 'bruts', - 'buats', - 'buaze', - 'bubal', - 'bubas', - 'bubba', - 'bubbe', - 'bubby', - 'bubus', - 'buchu', - 'bucko', - 'bucks', - 'bucku', - 'budas', - 'budis', - 'budos', - 'buffa', - 'buffe', - 'buffi', - 'buffo', - 'buffs', - 'buffy', - 'bufos', - 'bufty', - 'buhls', - 'buhrs', - 'buiks', - 'buist', - 'bukes', - 'bulbs', - 'bulgy', - 'bulks', - 'bulla', - 'bulls', - 'bulse', - 'bumbo', - 'bumfs', - 'bumph', - 'bumps', - 'bumpy', - 'bunas', - 'bunce', - 'bunco', - 'bunde', - 'bundh', - 'bunds', - 'bundt', - 'bundu', - 'bundy', - 'bungs', - 'bungy', - 'bunia', - 'bunje', - 'bunjy', - 'bunko', - 'bunks', - 'bunns', - 'bunts', - 'bunty', - 'bunya', - 'buoys', - 'buppy', - 'buran', - 'buras', - 'burbs', - 'burds', - 'buret', - 'burfi', - 'burgh', - 'burgs', - 'burin', - 'burka', - 'burke', - 'burks', - 'burls', - 'burns', - 'buroo', - 'burps', - 'burqa', - 'burro', - 'burrs', - 'burry', - 'bursa', - 'burse', - 'busby', - 'buses', - 'busks', - 'busky', - 'bussu', - 'busti', - 'busts', - 'busty', - 'buteo', - 'butes', - 'butle', - 'butoh', - 'butts', - 'butty', - 'butut', - 'butyl', - 'buzzy', - 'bwana', - 'bwazi', - 'byded', - 'bydes', - 'byked', - 'bykes', - 'byres', - 'byrls', - 'byssi', - 'bytes', - 'byway', - 'caaed', - 'cabas', - 'caber', - 'cabob', - 'caboc', - 'cabre', - 'cacas', - 'cacks', - 'cacky', - 'cadee', - 'cades', - 'cadge', - 'cadgy', - 'cadie', - 'cadis', - 'cadre', - 'caeca', - 'caese', - 'cafes', - 'caffs', - 'caged', - 'cager', - 'cages', - 'cagot', - 'cahow', - 'caids', - 'cains', - 'caird', - 'cajon', - 'cajun', - 'caked', - 'cakes', - 'cakey', - 'calfs', - 'calid', - 'calif', - 'calix', - 'calks', - 'calla', - 'calls', - 'calms', - 'calmy', - 'calos', - 'calpa', - 'calps', - 'calve', - 'calyx', - 'caman', - 'camas', - 'cames', - 'camis', - 'camos', - 'campi', - 'campo', - 'camps', - 'campy', - 'camus', - 'caned', - 'caneh', - 'caner', - 'canes', - 'cangs', - 'canid', - 'canna', - 'canns', - 'canso', - 'canst', - 'canto', - 'cants', - 'canty', - 'capas', - 'caped', - 'capes', - 'capex', - 'caphs', - 'capiz', - 'caple', - 'capon', - 'capos', - 'capot', - 'capri', - 'capul', - 'carap', - 'carbo', - 'carbs', - 'carby', - 'cardi', - 'cards', - 'cardy', - 'cared', - 'carer', - 'cares', - 'caret', - 'carex', - 'carks', - 'carle', - 'carls', - 'carns', - 'carny', - 'carob', - 'carom', - 'caron', - 'carpi', - 'carps', - 'carrs', - 'carse', - 'carta', - 'carte', - 'carts', - 'carvy', - 'casas', - 'casco', - 'cased', - 'cases', - 'casks', - 'casky', - 'casts', - 'casus', - 'cates', - 'cauda', - 'cauks', - 'cauld', - 'cauls', - 'caums', - 'caups', - 'cauri', - 'causa', - 'cavas', - 'caved', - 'cavel', - 'caver', - 'caves', - 'cavie', - 'cawed', - 'cawks', - 'caxon', - 'ceaze', - 'cebid', - 'cecal', - 'cecum', - 'ceded', - 'ceder', - 'cedes', - 'cedis', - 'ceiba', - 'ceili', - 'ceils', - 'celeb', - 'cella', - 'celli', - 'cells', - 'celom', - 'celts', - 'cense', - 'cento', - 'cents', - 'centu', - 'ceorl', - 'cepes', - 'cerci', - 'cered', - 'ceres', - 'cerge', - 'ceria', - 'ceric', - 'cerne', - 'ceroc', - 'ceros', - 'certs', - 'certy', - 'cesse', - 'cesta', - 'cesti', - 'cetes', - 'cetyl', - 'cezve', - 'chace', - 'chack', - 'chaco', - 'chado', - 'chads', - 'chaft', - 'chais', - 'chals', - 'chams', - 'chana', - 'chang', - 'chank', - 'chape', - 'chaps', - 'chapt', - 'chara', - 'chare', - 'chark', - 'charr', - 'chars', - 'chary', - 'chats', - 'chave', - 'chavs', - 'chawk', - 'chaws', - 'chaya', - 'chays', - 'cheep', - 'chefs', - 'cheka', - 'chela', - 'chelp', - 'chemo', - 'chems', - 'chere', - 'chert', - 'cheth', - 'chevy', - 'chews', - 'chewy', - 'chiao', - 'chias', - 'chibs', - 'chica', - 'chich', - 'chico', - 'chics', - 'chiel', - 'chiks', - 'chile', - 'chimb', - 'chimo', - 'chimp', - 'chine', - 'ching', - 'chink', - 'chino', - 'chins', - 'chips', - 'chirk', - 'chirl', - 'chirm', - 'chiro', - 'chirr', - 'chirt', - 'chiru', - 'chits', - 'chive', - 'chivs', - 'chivy', - 'chizz', - 'choco', - 'chocs', - 'chode', - 'chogs', - 'choil', - 'choko', - 'choky', - 'chola', - 'choli', - 'cholo', - 'chomp', - 'chons', - 'choof', - 'chook', - 'choom', - 'choon', - 'chops', - 'chota', - 'chott', - 'chout', - 'choux', - 'chowk', - 'chows', - 'chubs', - 'chufa', - 'chuff', - 'chugs', - 'chums', - 'churl', - 'churr', - 'chuse', - 'chuts', - 'chyle', - 'chyme', - 'chynd', - 'cibol', - 'cided', - 'cides', - 'ciels', - 'ciggy', - 'cilia', - 'cills', - 'cimar', - 'cimex', - 'cinct', - 'cines', - 'cinqs', - 'cions', - 'cippi', - 'circs', - 'cires', - 'cirls', - 'cirri', - 'cisco', - 'cissy', - 'cists', - 'cital', - 'cited', - 'citer', - 'cites', - 'cives', - 'civet', - 'civie', - 'civvy', - 'clach', - 'clade', - 'clads', - 'claes', - 'clags', - 'clame', - 'clams', - 'clans', - 'claps', - 'clapt', - 'claro', - 'clart', - 'clary', - 'clast', - 'clats', - 'claut', - 'clave', - 'clavi', - 'claws', - 'clays', - 'cleck', - 'cleek', - 'cleep', - 'clefs', - 'clegs', - 'cleik', - 'clems', - 'clepe', - 'clept', - 'cleve', - 'clews', - 'clied', - 'clies', - 'clift', - 'clime', - 'cline', - 'clint', - 'clipe', - 'clips', - 'clipt', - 'clits', - 'cloam', - 'clods', - 'cloff', - 'clogs', - 'cloke', - 'clomb', - 'clomp', - 'clonk', - 'clons', - 'cloop', - 'cloot', - 'clops', - 'clote', - 'clots', - 'clour', - 'clous', - 'clows', - 'cloye', - 'cloys', - 'cloze', - 'clubs', - 'clues', - 'cluey', - 'clunk', - 'clype', - 'cnida', - 'coact', - 'coady', - 'coala', - 'coals', - 'coaly', - 'coapt', - 'coarb', - 'coate', - 'coati', - 'coats', - 'cobbs', - 'cobby', - 'cobia', - 'coble', - 'cobza', - 'cocas', - 'cocci', - 'cocco', - 'cocks', - 'cocky', - 'cocos', - 'codas', - 'codec', - 'coded', - 'coden', - 'coder', - 'codes', - 'codex', - 'codon', - 'coeds', - 'coffs', - 'cogie', - 'cogon', - 'cogue', - 'cohab', - 'cohen', - 'cohoe', - 'cohog', - 'cohos', - 'coifs', - 'coign', - 'coils', - 'coins', - 'coirs', - 'coits', - 'coked', - 'cokes', - 'colas', - 'colby', - 'colds', - 'coled', - 'coles', - 'coley', - 'colic', - 'colin', - 'colls', - 'colly', - 'colog', - 'colts', - 'colza', - 'comae', - 'comal', - 'comas', - 'combe', - 'combi', - 'combo', - 'combs', - 'comby', - 'comer', - 'comes', - 'comix', - 'commo', - 'comms', - 'commy', - 'compo', - 'comps', - 'compt', - 'comte', - 'comus', - 'coned', - 'cones', - 'coney', - 'confs', - 'conga', - 'conge', - 'congo', - 'conia', - 'conin', - 'conks', - 'conky', - 'conne', - 'conns', - 'conte', - 'conto', - 'conus', - 'convo', - 'cooch', - 'cooed', - 'cooee', - 'cooer', - 'cooey', - 'coofs', - 'cooks', - 'cooky', - 'cools', - 'cooly', - 'coomb', - 'cooms', - 'coomy', - 'coons', - 'coops', - 'coopt', - 'coost', - 'coots', - 'cooze', - 'copal', - 'copay', - 'coped', - 'copen', - 'coper', - 'copes', - 'coppy', - 'copra', - 'copsy', - 'coqui', - 'coram', - 'corbe', - 'corby', - 'cords', - 'cored', - 'cores', - 'corey', - 'corgi', - 'coria', - 'corks', - 'corky', - 'corms', - 'corni', - 'corno', - 'corns', - 'cornu', - 'corps', - 'corse', - 'corso', - 'cosec', - 'cosed', - 'coses', - 'coset', - 'cosey', - 'cosie', - 'costa', - 'coste', - 'costs', - 'cotan', - 'coted', - 'cotes', - 'coths', - 'cotta', - 'cotts', - 'coude', - 'coups', - 'courb', - 'courd', - 'coure', - 'cours', - 'couta', - 'couth', - 'coved', - 'coves', - 'covin', - 'cowal', - 'cowan', - 'cowed', - 'cowks', - 'cowls', - 'cowps', - 'cowry', - 'coxae', - 'coxal', - 'coxed', - 'coxes', - 'coxib', - 'coyau', - 'coyed', - 'coyer', - 'coypu', - 'cozed', - 'cozen', - 'cozes', - 'cozey', - 'cozie', - 'craal', - 'crabs', - 'crags', - 'craic', - 'craig', - 'crake', - 'crame', - 'crams', - 'crans', - 'crape', - 'craps', - 'crapy', - 'crare', - 'craws', - 'crays', - 'creds', - 'creel', - 'crees', - 'crems', - 'crena', - 'creps', - 'crepy', - 'crewe', - 'crews', - 'crias', - 'cribs', - 'cries', - 'crims', - 'crine', - 'crios', - 'cripe', - 'crips', - 'crise', - 'crith', - 'crits', - 'croci', - 'crocs', - 'croft', - 'crogs', - 'cromb', - 'crome', - 'cronk', - 'crons', - 'crool', - 'croon', - 'crops', - 'crore', - 'crost', - 'crout', - 'crows', - 'croze', - 'cruck', - 'crudo', - 'cruds', - 'crudy', - 'crues', - 'cruet', - 'cruft', - 'crunk', - 'cruor', - 'crura', - 'cruse', - 'crusy', - 'cruve', - 'crwth', - 'cryer', - 'ctene', - 'cubby', - 'cubeb', - 'cubed', - 'cuber', - 'cubes', - 'cubit', - 'cuddy', - 'cuffo', - 'cuffs', - 'cuifs', - 'cuing', - 'cuish', - 'cuits', - 'cukes', - 'culch', - 'culet', - 'culex', - 'culls', - 'cully', - 'culms', - 'culpa', - 'culti', - 'cults', - 'culty', - 'cumec', - 'cundy', - 'cunei', - 'cunit', - 'cunts', - 'cupel', - 'cupid', - 'cuppa', - 'cuppy', - 'curat', - 'curbs', - 'curch', - 'curds', - 'curdy', - 'cured', - 'curer', - 'cures', - 'curet', - 'curfs', - 'curia', - 'curie', - 'curli', - 'curls', - 'curns', - 'curny', - 'currs', - 'cursi', - 'curst', - 'cusec', - 'cushy', - 'cusks', - 'cusps', - 'cuspy', - 'cusso', - 'cusum', - 'cutch', - 'cuter', - 'cutes', - 'cutey', - 'cutin', - 'cutis', - 'cutto', - 'cutty', - 'cutup', - 'cuvee', - 'cuzes', - 'cwtch', - 'cyano', - 'cyans', - 'cycad', - 'cycas', - 'cyclo', - 'cyder', - 'cylix', - 'cymae', - 'cymar', - 'cymas', - 'cymes', - 'cymol', - 'cysts', - 'cytes', - 'cyton', - 'czars', - 'daals', - 'dabba', - 'daces', - 'dacha', - 'dacks', - 'dadah', - 'dadas', - 'dados', - 'daffs', - 'daffy', - 'dagga', - 'daggy', - 'dagos', - 'dahls', - 'daiko', - 'daine', - 'daint', - 'daker', - 'daled', - 'dales', - 'dalis', - 'dalle', - 'dalts', - 'daman', - 'damar', - 'dames', - 'damme', - 'damns', - 'damps', - 'dampy', - 'dancy', - 'dangs', - 'danio', - 'danks', - 'danny', - 'dants', - 'daraf', - 'darbs', - 'darcy', - 'dared', - 'darer', - 'dares', - 'darga', - 'dargs', - 'daric', - 'daris', - 'darks', - 'darky', - 'darns', - 'darre', - 'darts', - 'darzi', - 'dashi', - 'dashy', - 'datal', - 'dated', - 'dater', - 'dates', - 'datos', - 'datto', - 'daube', - 'daubs', - 'dauby', - 'dauds', - 'dault', - 'daurs', - 'dauts', - 'daven', - 'davit', - 'dawah', - 'dawds', - 'dawed', - 'dawen', - 'dawks', - 'dawns', - 'dawts', - 'dayan', - 'daych', - 'daynt', - 'dazed', - 'dazer', - 'dazes', - 'deads', - 'deair', - 'deals', - 'deans', - 'deare', - 'dearn', - 'dears', - 'deary', - 'deash', - 'deave', - 'deaws', - 'deawy', - 'debag', - 'debby', - 'debel', - 'debes', - 'debts', - 'debud', - 'debur', - 'debus', - 'debye', - 'decad', - 'decaf', - 'decan', - 'decko', - 'decks', - 'decos', - 'dedal', - 'deeds', - 'deedy', - 'deely', - 'deems', - 'deens', - 'deeps', - 'deere', - 'deers', - 'deets', - 'deeve', - 'deevs', - 'defat', - 'deffo', - 'defis', - 'defog', - 'degas', - 'degum', - 'degus', - 'deice', - 'deids', - 'deify', - 'deils', - 'deism', - 'deist', - 'deked', - 'dekes', - 'dekko', - 'deled', - 'deles', - 'delfs', - 'delft', - 'delis', - 'dells', - 'delly', - 'delos', - 'delph', - 'delts', - 'deman', - 'demes', - 'demic', - 'demit', - 'demob', - 'demoi', - 'demos', - 'dempt', - 'denar', - 'denay', - 'dench', - 'denes', - 'denet', - 'denis', - 'dents', - 'deoxy', - 'derat', - 'deray', - 'dered', - 'deres', - 'derig', - 'derma', - 'derms', - 'derns', - 'derny', - 'deros', - 'derro', - 'derry', - 'derth', - 'dervs', - 'desex', - 'deshi', - 'desis', - 'desks', - 'desse', - 'devas', - 'devel', - 'devis', - 'devon', - 'devos', - 'devot', - 'dewan', - 'dewar', - 'dewax', - 'dewed', - 'dexes', - 'dexie', - 'dhaba', - 'dhaks', - 'dhals', - 'dhikr', - 'dhobi', - 'dhole', - 'dholl', - 'dhols', - 'dhoti', - 'dhows', - 'dhuti', - 'diact', - 'dials', - 'diane', - 'diazo', - 'dibbs', - 'diced', - 'dicer', - 'dices', - 'dicht', - 'dicks', - 'dicky', - 'dicot', - 'dicta', - 'dicts', - 'dicty', - 'diddy', - 'didie', - 'didos', - 'didst', - 'diebs', - 'diels', - 'diene', - 'diets', - 'diffs', - 'dight', - 'dikas', - 'diked', - 'diker', - 'dikes', - 'dikey', - 'dildo', - 'dilli', - 'dills', - 'dimbo', - 'dimer', - 'dimes', - 'dimps', - 'dinar', - 'dined', - 'dines', - 'dinge', - 'dings', - 'dinic', - 'dinks', - 'dinky', - 'dinna', - 'dinos', - 'dints', - 'diols', - 'diota', - 'dippy', - 'dipso', - 'diram', - 'direr', - 'dirke', - 'dirks', - 'dirls', - 'dirts', - 'disas', - 'disci', - 'discs', - 'dishy', - 'disks', - 'disme', - 'dital', - 'ditas', - 'dited', - 'dites', - 'ditsy', - 'ditts', - 'ditzy', - 'divan', - 'divas', - 'dived', - 'dives', - 'divis', - 'divna', - 'divos', - 'divot', - 'divvy', - 'diwan', - 'dixie', - 'dixit', - 'diyas', - 'dizen', - 'djinn', - 'djins', - 'doabs', - 'doats', - 'dobby', - 'dobes', - 'dobie', - 'dobla', - 'dobra', - 'dobro', - 'docht', - 'docks', - 'docos', - 'docus', - 'doddy', - 'dodos', - 'doeks', - 'doers', - 'doest', - 'doeth', - 'doffs', - 'dogan', - 'doges', - 'dogey', - 'doggo', - 'doggy', - 'dogie', - 'dohyo', - 'doilt', - 'doily', - 'doits', - 'dojos', - 'dolce', - 'dolci', - 'doled', - 'doles', - 'dolia', - 'dolls', - 'dolma', - 'dolor', - 'dolos', - 'dolts', - 'domal', - 'domed', - 'domes', - 'domic', - 'donah', - 'donas', - 'donee', - 'doner', - 'donga', - 'dongs', - 'donko', - 'donna', - 'donne', - 'donny', - 'donsy', - 'doobs', - 'dooce', - 'doody', - 'dooks', - 'doole', - 'dools', - 'dooly', - 'dooms', - 'doomy', - 'doona', - 'doorn', - 'doors', - 'doozy', - 'dopas', - 'doped', - 'doper', - 'dopes', - 'dorad', - 'dorba', - 'dorbs', - 'doree', - 'dores', - 'doric', - 'doris', - 'dorks', - 'dorky', - 'dorms', - 'dormy', - 'dorps', - 'dorrs', - 'dorsa', - 'dorse', - 'dorts', - 'dorty', - 'dosai', - 'dosas', - 'dosed', - 'doseh', - 'doser', - 'doses', - 'dosha', - 'dotal', - 'doted', - 'doter', - 'dotes', - 'dotty', - 'douar', - 'douce', - 'doucs', - 'douks', - 'doula', - 'douma', - 'doums', - 'doups', - 'doura', - 'douse', - 'douts', - 'doved', - 'doven', - 'dover', - 'doves', - 'dovie', - 'dowar', - 'dowds', - 'dowed', - 'dower', - 'dowie', - 'dowle', - 'dowls', - 'dowly', - 'downa', - 'downs', - 'dowps', - 'dowse', - 'dowts', - 'doxed', - 'doxes', - 'doxie', - 'doyen', - 'doyly', - 'dozed', - 'dozer', - 'dozes', - 'drabs', - 'drack', - 'draco', - 'draff', - 'drags', - 'drail', - 'drams', - 'drant', - 'draps', - 'drats', - 'drave', - 'draws', - 'drays', - 'drear', - 'dreck', - 'dreed', - 'dreer', - 'drees', - 'dregs', - 'dreks', - 'drent', - 'drere', - 'drest', - 'dreys', - 'dribs', - 'drice', - 'dries', - 'drily', - 'drips', - 'dript', - 'droid', - 'droil', - 'droke', - 'drole', - 'drome', - 'drony', - 'droob', - 'droog', - 'drook', - 'drops', - 'dropt', - 'drouk', - 'drows', - 'drubs', - 'drugs', - 'drums', - 'drupe', - 'druse', - 'drusy', - 'druxy', - 'dryad', - 'dryas', - 'dsobo', - 'dsomo', - 'duads', - 'duals', - 'duans', - 'duars', - 'dubbo', - 'ducal', - 'ducat', - 'duces', - 'ducks', - 'ducky', - 'ducts', - 'duddy', - 'duded', - 'dudes', - 'duels', - 'duets', - 'duett', - 'duffs', - 'dufus', - 'duing', - 'duits', - 'dukas', - 'duked', - 'dukes', - 'dukka', - 'dulce', - 'dules', - 'dulia', - 'dulls', - 'dulse', - 'dumas', - 'dumbo', - 'dumbs', - 'dumka', - 'dumky', - 'dumps', - 'dunam', - 'dunch', - 'dunes', - 'dungs', - 'dungy', - 'dunks', - 'dunno', - 'dunny', - 'dunsh', - 'dunts', - 'duomi', - 'duomo', - 'duped', - 'duper', - 'dupes', - 'duple', - 'duply', - 'duppy', - 'dural', - 'duras', - 'dured', - 'dures', - 'durgy', - 'durns', - 'duroc', - 'duros', - 'duroy', - 'durra', - 'durrs', - 'durry', - 'durst', - 'durum', - 'durzi', - 'dusks', - 'dusts', - 'duxes', - 'dwaal', - 'dwale', - 'dwalm', - 'dwams', - 'dwang', - 'dwaum', - 'dweeb', - 'dwile', - 'dwine', - 'dyads', - 'dyers', - 'dyked', - 'dykes', - 'dykey', - 'dykon', - 'dynel', - 'dynes', - 'dzhos', - 'eagre', - 'ealed', - 'eales', - 'eaned', - 'eards', - 'eared', - 'earls', - 'earns', - 'earnt', - 'earst', - 'eased', - 'easer', - 'eases', - 'easle', - 'easts', - 'eathe', - 'eaved', - 'eaves', - 'ebbed', - 'ebbet', - 'ebons', - 'ebook', - 'ecads', - 'eched', - 'eches', - 'echos', - 'ecrus', - 'edema', - 'edged', - 'edger', - 'edges', - 'edile', - 'edits', - 'educe', - 'educt', - 'eejit', - 'eensy', - 'eeven', - 'eevns', - 'effed', - 'egads', - 'egers', - 'egest', - 'eggar', - 'egged', - 'egger', - 'egmas', - 'ehing', - 'eider', - 'eidos', - 'eigne', - 'eiked', - 'eikon', - 'eilds', - 'eisel', - 'ejido', - 'ekkas', - 'elain', - 'eland', - 'elans', - 'elchi', - 'eldin', - 'elemi', - 'elfed', - 'eliad', - 'elint', - 'elmen', - 'eloge', - 'elogy', - 'eloin', - 'elops', - 'elpee', - 'elsin', - 'elute', - 'elvan', - 'elven', - 'elver', - 'elves', - 'emacs', - 'embar', - 'embay', - 'embog', - 'embow', - 'embox', - 'embus', - 'emeer', - 'emend', - 'emerg', - 'emery', - 'emeus', - 'emics', - 'emirs', - 'emits', - 'emmas', - 'emmer', - 'emmet', - 'emmew', - 'emmys', - 'emoji', - 'emong', - 'emote', - 'emove', - 'empts', - 'emule', - 'emure', - 'emyde', - 'emyds', - 'enarm', - 'enate', - 'ended', - 'ender', - 'endew', - 'endue', - 'enews', - 'enfix', - 'eniac', - 'enlit', - 'enmew', - 'ennog', - 'enoki', - 'enols', - 'enorm', - 'enows', - 'enrol', - 'ensew', - 'ensky', - 'entia', - 'enure', - 'enurn', - 'envoi', - 'enzym', - 'eorls', - 'eosin', - 'epact', - 'epees', - 'ephah', - 'ephas', - 'ephod', - 'ephor', - 'epics', - 'epode', - 'epopt', - 'epris', - 'eques', - 'equid', - 'erbia', - 'erevs', - 'ergon', - 'ergos', - 'ergot', - 'erhus', - 'erica', - 'erick', - 'erics', - 'ering', - 'erned', - 'ernes', - 'erose', - 'erred', - 'erses', - 'eruct', - 'erugo', - 'eruvs', - 'erven', - 'ervil', - 'escar', - 'escot', - 'esile', - 'eskar', - 'esker', - 'esnes', - 'esses', - 'estoc', - 'estop', - 'estro', - 'etage', - 'etape', - 'etats', - 'etens', - 'ethal', - 'ethne', - 'ethyl', - 'etics', - 'etnas', - 'ettin', - 'ettle', - 'etuis', - 'etwee', - 'etyma', - 'eughs', - 'euked', - 'eupad', - 'euros', - 'eusol', - 'evens', - 'evert', - 'evets', - 'evhoe', - 'evils', - 'evite', - 'evohe', - 'ewers', - 'ewest', - 'ewhow', - 'ewked', - 'exams', - 'exeat', - 'execs', - 'exeem', - 'exeme', - 'exfil', - 'exies', - 'exine', - 'exing', - 'exits', - 'exode', - 'exome', - 'exons', - 'expat', - 'expos', - 'exude', - 'exuls', - 'exurb', - 'eyass', - 'eyers', - 'eyots', - 'eyras', - 'eyres', - 'eyrie', - 'eyrir', - 'ezine', - 'fabby', - 'faced', - 'facer', - 'faces', - 'facia', - 'facta', - 'facts', - 'faddy', - 'faded', - 'fader', - 'fades', - 'fadge', - 'fados', - 'faena', - 'faery', - 'faffs', - 'faffy', - 'faggy', - 'fagin', - 'fagot', - 'faiks', - 'fails', - 'faine', - 'fains', - 'fairs', - 'faked', - 'faker', - 'fakes', - 'fakey', - 'fakie', - 'fakir', - 'falaj', - 'falls', - 'famed', - 'fames', - 'fanal', - 'fands', - 'fanes', - 'fanga', - 'fango', - 'fangs', - 'fanks', - 'fanon', - 'fanos', - 'fanum', - 'faqir', - 'farad', - 'farci', - 'farcy', - 'fards', - 'fared', - 'farer', - 'fares', - 'farle', - 'farls', - 'farms', - 'faros', - 'farro', - 'farse', - 'farts', - 'fasci', - 'fasti', - 'fasts', - 'fated', - 'fates', - 'fatly', - 'fatso', - 'fatwa', - 'faugh', - 'fauld', - 'fauns', - 'faurd', - 'fauts', - 'fauve', - 'favas', - 'favel', - 'faver', - 'faves', - 'favus', - 'fawns', - 'fawny', - 'faxed', - 'faxes', - 'fayed', - 'fayer', - 'fayne', - 'fayre', - 'fazed', - 'fazes', - 'feals', - 'feare', - 'fears', - 'feart', - 'fease', - 'feats', - 'feaze', - 'feces', - 'fecht', - 'fecit', - 'fecks', - 'fedex', - 'feebs', - 'feeds', - 'feels', - 'feens', - 'feers', - 'feese', - 'feeze', - 'fehme', - 'feint', - 'feist', - 'felch', - 'felid', - 'fells', - 'felly', - 'felts', - 'felty', - 'femal', - 'femes', - 'femmy', - 'fends', - 'fendy', - 'fenis', - 'fenks', - 'fenny', - 'fents', - 'feods', - 'feoff', - 'ferer', - 'feres', - 'feria', - 'ferly', - 'fermi', - 'ferms', - 'ferns', - 'ferny', - 'fesse', - 'festa', - 'fests', - 'festy', - 'fetas', - 'feted', - 'fetes', - 'fetor', - 'fetta', - 'fetts', - 'fetwa', - 'feuar', - 'feuds', - 'feued', - 'feyed', - 'feyer', - 'feyly', - 'fezes', - 'fezzy', - 'fiars', - 'fiats', - 'fibro', - 'fices', - 'fiche', - 'fichu', - 'ficin', - 'ficos', - 'fides', - 'fidge', - 'fidos', - 'fiefs', - 'fient', - 'fiere', - 'fiers', - 'fiest', - 'fifed', - 'fifer', - 'fifes', - 'fifis', - 'figgy', - 'figos', - 'fiked', - 'fikes', - 'filar', - 'filch', - 'filed', - 'files', - 'filii', - 'filks', - 'fille', - 'fillo', - 'fills', - 'filmi', - 'films', - 'filos', - 'filum', - 'finca', - 'finds', - 'fined', - 'fines', - 'finis', - 'finks', - 'finny', - 'finos', - 'fiord', - 'fiqhs', - 'fique', - 'fired', - 'firer', - 'fires', - 'firie', - 'firks', - 'firms', - 'firns', - 'firry', - 'firth', - 'fiscs', - 'fisks', - 'fists', - 'fisty', - 'fitch', - 'fitly', - 'fitna', - 'fitte', - 'fitts', - 'fiver', - 'fives', - 'fixed', - 'fixes', - 'fixit', - 'fjeld', - 'flabs', - 'flaff', - 'flags', - 'flaks', - 'flamm', - 'flams', - 'flamy', - 'flane', - 'flans', - 'flaps', - 'flary', - 'flats', - 'flava', - 'flawn', - 'flaws', - 'flawy', - 'flaxy', - 'flays', - 'fleam', - 'fleas', - 'fleek', - 'fleer', - 'flees', - 'flegs', - 'fleme', - 'fleur', - 'flews', - 'flexi', - 'flexo', - 'fleys', - 'flics', - 'flied', - 'flies', - 'flimp', - 'flims', - 'flips', - 'flirs', - 'flisk', - 'flite', - 'flits', - 'flitt', - 'flobs', - 'flocs', - 'floes', - 'flogs', - 'flong', - 'flops', - 'flors', - 'flory', - 'flosh', - 'flota', - 'flote', - 'flows', - 'flubs', - 'flued', - 'flues', - 'fluey', - 'fluky', - 'flump', - 'fluor', - 'flurr', - 'fluty', - 'fluyt', - 'flyby', - 'flype', - 'flyte', - 'foals', - 'foams', - 'foehn', - 'fogey', - 'fogie', - 'fogle', - 'fogou', - 'fohns', - 'foids', - 'foils', - 'foins', - 'folds', - 'foley', - 'folia', - 'folic', - 'folie', - 'folks', - 'folky', - 'fomes', - 'fonda', - 'fonds', - 'fondu', - 'fones', - 'fonly', - 'fonts', - 'foods', - 'foody', - 'fools', - 'foots', - 'footy', - 'foram', - 'forbs', - 'forby', - 'fordo', - 'fords', - 'forel', - 'fores', - 'forex', - 'forks', - 'forky', - 'forme', - 'forms', - 'forts', - 'forza', - 'forze', - 'fossa', - 'fosse', - 'fouat', - 'fouds', - 'fouer', - 'fouet', - 'foule', - 'fouls', - 'fount', - 'fours', - 'fouth', - 'fovea', - 'fowls', - 'fowth', - 'foxed', - 'foxes', - 'foxie', - 'foyle', - 'foyne', - 'frabs', - 'frack', - 'fract', - 'frags', - 'fraim', - 'franc', - 'frape', - 'fraps', - 'frass', - 'frate', - 'frati', - 'frats', - 'fraus', - 'frays', - 'frees', - 'freet', - 'freit', - 'fremd', - 'frena', - 'freon', - 'frere', - 'frets', - 'fribs', - 'frier', - 'fries', - 'frigs', - 'frise', - 'frist', - 'frith', - 'frits', - 'fritt', - 'frize', - 'frizz', - 'froes', - 'frogs', - 'frons', - 'frore', - 'frorn', - 'frory', - 'frosh', - 'frows', - 'frowy', - 'frugs', - 'frump', - 'frush', - 'frust', - 'fryer', - 'fubar', - 'fubby', - 'fubsy', - 'fucks', - 'fucus', - 'fuddy', - 'fudgy', - 'fuels', - 'fuero', - 'fuffs', - 'fuffy', - 'fugal', - 'fuggy', - 'fugie', - 'fugio', - 'fugle', - 'fugly', - 'fugus', - 'fujis', - 'fulls', - 'fumed', - 'fumer', - 'fumes', - 'fumet', - 'fundi', - 'funds', - 'fundy', - 'fungo', - 'fungs', - 'funks', - 'fural', - 'furan', - 'furca', - 'furls', - 'furol', - 'furrs', - 'furth', - 'furze', - 'furzy', - 'fused', - 'fusee', - 'fusel', - 'fuses', - 'fusil', - 'fusks', - 'fusts', - 'fusty', - 'futon', - 'fuzed', - 'fuzee', - 'fuzes', - 'fuzil', - 'fyces', - 'fyked', - 'fykes', - 'fyles', - 'fyrds', - 'fytte', - 'gabba', - 'gabby', - 'gable', - 'gaddi', - 'gades', - 'gadge', - 'gadid', - 'gadis', - 'gadje', - 'gadjo', - 'gadso', - 'gaffs', - 'gaged', - 'gager', - 'gages', - 'gaids', - 'gains', - 'gairs', - 'gaita', - 'gaits', - 'gaitt', - 'gajos', - 'galah', - 'galas', - 'galax', - 'galea', - 'galed', - 'gales', - 'galls', - 'gally', - 'galop', - 'galut', - 'galvo', - 'gamas', - 'gamay', - 'gamba', - 'gambe', - 'gambo', - 'gambs', - 'gamed', - 'games', - 'gamey', - 'gamic', - 'gamin', - 'gamme', - 'gammy', - 'gamps', - 'ganch', - 'gandy', - 'ganef', - 'ganev', - 'gangs', - 'ganja', - 'ganof', - 'gants', - 'gaols', - 'gaped', - 'gaper', - 'gapes', - 'gapos', - 'gappy', - 'garbe', - 'garbo', - 'garbs', - 'garda', - 'gares', - 'garis', - 'garms', - 'garni', - 'garre', - 'garth', - 'garum', - 'gases', - 'gasps', - 'gaspy', - 'gasts', - 'gatch', - 'gated', - 'gater', - 'gates', - 'gaths', - 'gator', - 'gauch', - 'gaucy', - 'gauds', - 'gauje', - 'gault', - 'gaums', - 'gaumy', - 'gaups', - 'gaurs', - 'gauss', - 'gauzy', - 'gavot', - 'gawcy', - 'gawds', - 'gawks', - 'gawps', - 'gawsy', - 'gayal', - 'gazal', - 'gazar', - 'gazed', - 'gazes', - 'gazon', - 'gazoo', - 'geals', - 'geans', - 'geare', - 'gears', - 'geats', - 'gebur', - 'gecks', - 'geeks', - 'geeps', - 'geest', - 'geist', - 'geits', - 'gelds', - 'gelee', - 'gelid', - 'gelly', - 'gelts', - 'gemel', - 'gemma', - 'gemmy', - 'gemot', - 'genal', - 'genas', - 'genes', - 'genet', - 'genic', - 'genii', - 'genip', - 'genny', - 'genoa', - 'genom', - 'genro', - 'gents', - 'genty', - 'genua', - 'genus', - 'geode', - 'geoid', - 'gerah', - 'gerbe', - 'geres', - 'gerle', - 'germs', - 'germy', - 'gerne', - 'gesse', - 'gesso', - 'geste', - 'gests', - 'getas', - 'getup', - 'geums', - 'geyan', - 'geyer', - 'ghast', - 'ghats', - 'ghaut', - 'ghazi', - 'ghees', - 'ghest', - 'ghyll', - 'gibed', - 'gibel', - 'giber', - 'gibes', - 'gibli', - 'gibus', - 'gifts', - 'gigas', - 'gighe', - 'gigot', - 'gigue', - 'gilas', - 'gilds', - 'gilet', - 'gills', - 'gilly', - 'gilpy', - 'gilts', - 'gimel', - 'gimme', - 'gimps', - 'gimpy', - 'ginch', - 'ginge', - 'gings', - 'ginks', - 'ginny', - 'ginzo', - 'gipon', - 'gippo', - 'gippy', - 'girds', - 'girls', - 'girns', - 'giron', - 'giros', - 'girrs', - 'girsh', - 'girts', - 'gismo', - 'gisms', - 'gists', - 'gitch', - 'gites', - 'giust', - 'gived', - 'gives', - 'gizmo', - 'glace', - 'glads', - 'glady', - 'glaik', - 'glair', - 'glams', - 'glans', - 'glary', - 'glaum', - 'glaur', - 'glazy', - 'gleba', - 'glebe', - 'gleby', - 'glede', - 'gleds', - 'gleed', - 'gleek', - 'glees', - 'gleet', - 'gleis', - 'glens', - 'glent', - 'gleys', - 'glial', - 'glias', - 'glibs', - 'gliff', - 'glift', - 'glike', - 'glime', - 'glims', - 'glisk', - 'glits', - 'glitz', - 'gloam', - 'globi', - 'globs', - 'globy', - 'glode', - 'glogg', - 'gloms', - 'gloop', - 'glops', - 'glost', - 'glout', - 'glows', - 'gloze', - 'glued', - 'gluer', - 'glues', - 'gluey', - 'glugs', - 'glume', - 'glums', - 'gluon', - 'glute', - 'gluts', - 'gnarl', - 'gnarr', - 'gnars', - 'gnats', - 'gnawn', - 'gnaws', - 'gnows', - 'goads', - 'goafs', - 'goals', - 'goary', - 'goats', - 'goaty', - 'goban', - 'gobar', - 'gobbi', - 'gobbo', - 'gobby', - 'gobis', - 'gobos', - 'godet', - 'godso', - 'goels', - 'goers', - 'goest', - 'goeth', - 'goety', - 'gofer', - 'goffs', - 'gogga', - 'gogos', - 'goier', - 'gojis', - 'golds', - 'goldy', - 'goles', - 'golfs', - 'golpe', - 'golps', - 'gombo', - 'gomer', - 'gompa', - 'gonch', - 'gonef', - 'gongs', - 'gonia', - 'gonif', - 'gonks', - 'gonna', - 'gonof', - 'gonys', - 'gonzo', - 'gooby', - 'goods', - 'goofs', - 'googs', - 'gooks', - 'gooky', - 'goold', - 'gools', - 'gooly', - 'goons', - 'goony', - 'goops', - 'goopy', - 'goors', - 'goory', - 'goosy', - 'gopak', - 'gopik', - 'goral', - 'goras', - 'gored', - 'gores', - 'goris', - 'gorms', - 'gormy', - 'gorps', - 'gorse', - 'gorsy', - 'gosht', - 'gosse', - 'gotch', - 'goths', - 'gothy', - 'gotta', - 'gouch', - 'gouks', - 'goura', - 'gouts', - 'gouty', - 'gowan', - 'gowds', - 'gowfs', - 'gowks', - 'gowls', - 'gowns', - 'goxes', - 'goyim', - 'goyle', - 'graal', - 'grabs', - 'grads', - 'graff', - 'graip', - 'grama', - 'grame', - 'gramp', - 'grams', - 'grana', - 'grans', - 'grapy', - 'gravs', - 'grays', - 'grebe', - 'grebo', - 'grece', - 'greek', - 'grees', - 'grege', - 'grego', - 'grein', - 'grens', - 'grese', - 'greve', - 'grews', - 'greys', - 'grice', - 'gride', - 'grids', - 'griff', - 'grift', - 'grigs', - 'grike', - 'grins', - 'griot', - 'grips', - 'gript', - 'gripy', - 'grise', - 'grist', - 'grisy', - 'grith', - 'grits', - 'grize', - 'groat', - 'grody', - 'grogs', - 'groks', - 'groma', - 'grone', - 'groof', - 'grosz', - 'grots', - 'grouf', - 'grovy', - 'grows', - 'grrls', - 'grrrl', - 'grubs', - 'grued', - 'grues', - 'grufe', - 'grume', - 'grump', - 'grund', - 'gryce', - 'gryde', - 'gryke', - 'grype', - 'grypt', - 'guaco', - 'guana', - 'guano', - 'guans', - 'guars', - 'gucks', - 'gucky', - 'gudes', - 'guffs', - 'gugas', - 'guids', - 'guimp', - 'guiro', - 'gulag', - 'gular', - 'gulas', - 'gules', - 'gulet', - 'gulfs', - 'gulfy', - 'gulls', - 'gulph', - 'gulps', - 'gulpy', - 'gumma', - 'gummi', - 'gumps', - 'gundy', - 'gunge', - 'gungy', - 'gunks', - 'gunky', - 'gunny', - 'guqin', - 'gurdy', - 'gurge', - 'gurls', - 'gurly', - 'gurns', - 'gurry', - 'gursh', - 'gurus', - 'gushy', - 'gusla', - 'gusle', - 'gusli', - 'gussy', - 'gusts', - 'gutsy', - 'gutta', - 'gutty', - 'guyed', - 'guyle', - 'guyot', - 'guyse', - 'gwine', - 'gyals', - 'gyans', - 'gybed', - 'gybes', - 'gyeld', - 'gymps', - 'gynae', - 'gynie', - 'gynny', - 'gynos', - 'gyoza', - 'gypos', - 'gyppo', - 'gyppy', - 'gyral', - 'gyred', - 'gyres', - 'gyron', - 'gyros', - 'gyrus', - 'gytes', - 'gyved', - 'gyves', - 'haafs', - 'haars', - 'hable', - 'habus', - 'hacek', - 'hacks', - 'hadal', - 'haded', - 'hades', - 'hadji', - 'hadst', - 'haems', - 'haets', - 'haffs', - 'hafiz', - 'hafts', - 'haggs', - 'hahas', - 'haick', - 'haika', - 'haiks', - 'haiku', - 'hails', - 'haily', - 'hains', - 'haint', - 'hairs', - 'haith', - 'hajes', - 'hajis', - 'hajji', - 'hakam', - 'hakas', - 'hakea', - 'hakes', - 'hakim', - 'hakus', - 'halal', - 'haled', - 'haler', - 'hales', - 'halfa', - 'halfs', - 'halid', - 'hallo', - 'halls', - 'halma', - 'halms', - 'halon', - 'halos', - 'halse', - 'halts', - 'halva', - 'halwa', - 'hamal', - 'hamba', - 'hamed', - 'hames', - 'hammy', - 'hamza', - 'hanap', - 'hance', - 'hanch', - 'hands', - 'hangi', - 'hangs', - 'hanks', - 'hanky', - 'hansa', - 'hanse', - 'hants', - 'haole', - 'haoma', - 'hapax', - 'haply', - 'happi', - 'hapus', - 'haram', - 'hards', - 'hared', - 'hares', - 'harim', - 'harks', - 'harls', - 'harms', - 'harns', - 'haros', - 'harps', - 'harts', - 'hashy', - 'hasks', - 'hasps', - 'hasta', - 'hated', - 'hates', - 'hatha', - 'hauds', - 'haufs', - 'haugh', - 'hauld', - 'haulm', - 'hauls', - 'hault', - 'hauns', - 'hause', - 'haver', - 'haves', - 'hawed', - 'hawks', - 'hawms', - 'hawse', - 'hayed', - 'hayer', - 'hayey', - 'hayle', - 'hazan', - 'hazed', - 'hazer', - 'hazes', - 'heads', - 'heald', - 'heals', - 'heame', - 'heaps', - 'heapy', - 'heare', - 'hears', - 'heast', - 'heats', - 'heben', - 'hebes', - 'hecht', - 'hecks', - 'heder', - 'hedgy', - 'heeds', - 'heedy', - 'heels', - 'heeze', - 'hefte', - 'hefts', - 'heids', - 'heigh', - 'heils', - 'heirs', - 'hejab', - 'hejra', - 'heled', - 'heles', - 'helio', - 'hells', - 'helms', - 'helos', - 'helot', - 'helps', - 'helve', - 'hemal', - 'hemes', - 'hemic', - 'hemin', - 'hemps', - 'hempy', - 'hench', - 'hends', - 'henge', - 'henna', - 'henny', - 'henry', - 'hents', - 'hepar', - 'herbs', - 'herby', - 'herds', - 'heres', - 'herls', - 'herma', - 'herms', - 'herns', - 'heros', - 'herry', - 'herse', - 'hertz', - 'herye', - 'hesps', - 'hests', - 'hetes', - 'heths', - 'heuch', - 'heugh', - 'hevea', - 'hewed', - 'hewer', - 'hewgh', - 'hexad', - 'hexed', - 'hexer', - 'hexes', - 'hexyl', - 'heyed', - 'hiant', - 'hicks', - 'hided', - 'hider', - 'hides', - 'hiems', - 'highs', - 'hight', - 'hijab', - 'hijra', - 'hiked', - 'hiker', - 'hikes', - 'hikoi', - 'hilar', - 'hilch', - 'hillo', - 'hills', - 'hilts', - 'hilum', - 'hilus', - 'himbo', - 'hinau', - 'hinds', - 'hings', - 'hinky', - 'hinny', - 'hints', - 'hiois', - 'hiply', - 'hired', - 'hiree', - 'hirer', - 'hires', - 'hissy', - 'hists', - 'hithe', - 'hived', - 'hiver', - 'hives', - 'hizen', - 'hoaed', - 'hoagy', - 'hoars', - 'hoary', - 'hoast', - 'hobos', - 'hocks', - 'hocus', - 'hodad', - 'hodja', - 'hoers', - 'hogan', - 'hogen', - 'hoggs', - 'hoghs', - 'hohed', - 'hoick', - 'hoied', - 'hoiks', - 'hoing', - 'hoise', - 'hokas', - 'hoked', - 'hokes', - 'hokey', - 'hokis', - 'hokku', - 'hokum', - 'holds', - 'holed', - 'holes', - 'holey', - 'holks', - 'holla', - 'hollo', - 'holme', - 'holms', - 'holon', - 'holos', - 'holts', - 'homas', - 'homed', - 'homes', - 'homey', - 'homie', - 'homme', - 'homos', - 'honan', - 'honda', - 'honds', - 'honed', - 'honer', - 'hones', - 'hongi', - 'hongs', - 'honks', - 'honky', - 'hooch', - 'hoods', - 'hoody', - 'hooey', - 'hoofs', - 'hooka', - 'hooks', - 'hooky', - 'hooly', - 'hoons', - 'hoops', - 'hoord', - 'hoors', - 'hoosh', - 'hoots', - 'hooty', - 'hoove', - 'hopak', - 'hoped', - 'hoper', - 'hopes', - 'hoppy', - 'horah', - 'horal', - 'horas', - 'horis', - 'horks', - 'horme', - 'horns', - 'horst', - 'horsy', - 'hosed', - 'hosel', - 'hosen', - 'hoser', - 'hoses', - 'hosey', - 'hosta', - 'hosts', - 'hotch', - 'hoten', - 'hotty', - 'houff', - 'houfs', - 'hough', - 'houri', - 'hours', - 'houts', - 'hovea', - 'hoved', - 'hoven', - 'hoves', - 'howbe', - 'howes', - 'howff', - 'howfs', - 'howks', - 'howls', - 'howre', - 'howso', - 'hoxed', - 'hoxes', - 'hoyas', - 'hoyed', - 'hoyle', - 'hubby', - 'hucks', - 'hudna', - 'hudud', - 'huers', - 'huffs', - 'huffy', - 'huger', - 'huggy', - 'huhus', - 'huias', - 'hulas', - 'hules', - 'hulks', - 'hulky', - 'hullo', - 'hulls', - 'hully', - 'humas', - 'humfs', - 'humic', - 'humps', - 'humpy', - 'hunks', - 'hunts', - 'hurds', - 'hurls', - 'hurly', - 'hurra', - 'hurst', - 'hurts', - 'hushy', - 'husks', - 'husos', - 'hutia', - 'huzza', - 'huzzy', - 'hwyls', - 'hydra', - 'hyens', - 'hygge', - 'hying', - 'hykes', - 'hylas', - 'hyleg', - 'hyles', - 'hylic', - 'hymns', - 'hynde', - 'hyoid', - 'hyped', - 'hypes', - 'hypha', - 'hyphy', - 'hypos', - 'hyrax', - 'hyson', - 'hythe', - 'iambi', - 'iambs', - 'ibrik', - 'icers', - 'iched', - 'iches', - 'ichor', - 'icier', - 'icker', - 'ickle', - 'icons', - 'ictal', - 'ictic', - 'ictus', - 'idant', - 'ideas', - 'idees', - 'ident', - 'idled', - 'idles', - 'idola', - 'idols', - 'idyls', - 'iftar', - 'igapo', - 'igged', - 'iglus', - 'ihram', - 'ikans', - 'ikats', - 'ikons', - 'ileac', - 'ileal', - 'ileum', - 'ileus', - 'iliad', - 'ilial', - 'ilium', - 'iller', - 'illth', - 'imago', - 'imams', - 'imari', - 'imaum', - 'imbar', - 'imbed', - 'imide', - 'imido', - 'imids', - 'imine', - 'imino', - 'immew', - 'immit', - 'immix', - 'imped', - 'impis', - 'impot', - 'impro', - 'imshi', - 'imshy', - 'inapt', - 'inarm', - 'inbye', - 'incel', - 'incle', - 'incog', - 'incus', - 'incut', - 'indew', - 'india', - 'indie', - 'indol', - 'indow', - 'indri', - 'indue', - 'inerm', - 'infix', - 'infos', - 'infra', - 'ingan', - 'ingle', - 'inion', - 'inked', - 'inker', - 'inkle', - 'inned', - 'innit', - 'inorb', - 'inrun', - 'inset', - 'inspo', - 'intel', - 'intil', - 'intis', - 'intra', - 'inula', - 'inure', - 'inurn', - 'inust', - 'invar', - 'inwit', - 'iodic', - 'iodid', - 'iodin', - 'iotas', - 'ippon', - 'irade', - 'irids', - 'iring', - 'irked', - 'iroko', - 'irone', - 'irons', - 'isbas', - 'ishes', - 'isled', - 'isles', - 'isnae', - 'issei', - 'istle', - 'items', - 'ither', - 'ivied', - 'ivies', - 'ixias', - 'ixnay', - 'ixora', - 'ixtle', - 'izard', - 'izars', - 'izzat', - 'jaaps', - 'jabot', - 'jacal', - 'jacks', - 'jacky', - 'jaded', - 'jades', - 'jafas', - 'jaffa', - 'jagas', - 'jager', - 'jaggs', - 'jaggy', - 'jagir', - 'jagra', - 'jails', - 'jaker', - 'jakes', - 'jakey', - 'jalap', - 'jalop', - 'jambe', - 'jambo', - 'jambs', - 'jambu', - 'james', - 'jammy', - 'jamon', - 'janes', - 'janns', - 'janny', - 'janty', - 'japan', - 'japed', - 'japer', - 'japes', - 'jarks', - 'jarls', - 'jarps', - 'jarta', - 'jarul', - 'jasey', - 'jaspe', - 'jasps', - 'jatos', - 'jauks', - 'jaups', - 'javas', - 'javel', - 'jawan', - 'jawed', - 'jaxie', - 'jeans', - 'jeats', - 'jebel', - 'jedis', - 'jeels', - 'jeely', - 'jeeps', - 'jeers', - 'jeeze', - 'jefes', - 'jeffs', - 'jehad', - 'jehus', - 'jelab', - 'jello', - 'jells', - 'jembe', - 'jemmy', - 'jenny', - 'jeons', - 'jerid', - 'jerks', - 'jerry', - 'jesse', - 'jests', - 'jesus', - 'jetes', - 'jeton', - 'jeune', - 'jewed', - 'jewie', - 'jhala', - 'jiaos', - 'jibba', - 'jibbs', - 'jibed', - 'jiber', - 'jibes', - 'jiffs', - 'jiggy', - 'jigot', - 'jihad', - 'jills', - 'jilts', - 'jimmy', - 'jimpy', - 'jingo', - 'jinks', - 'jinne', - 'jinni', - 'jinns', - 'jirds', - 'jirga', - 'jirre', - 'jisms', - 'jived', - 'jiver', - 'jives', - 'jivey', - 'jnana', - 'jobed', - 'jobes', - 'jocko', - 'jocks', - 'jocky', - 'jocos', - 'jodel', - 'joeys', - 'johns', - 'joins', - 'joked', - 'jokes', - 'jokey', - 'jokol', - 'joled', - 'joles', - 'jolls', - 'jolts', - 'jolty', - 'jomon', - 'jomos', - 'jones', - 'jongs', - 'jonty', - 'jooks', - 'joram', - 'jorum', - 'jotas', - 'jotty', - 'jotun', - 'joual', - 'jougs', - 'jouks', - 'joule', - 'jours', - 'jowar', - 'jowed', - 'jowls', - 'jowly', - 'joyed', - 'jubas', - 'jubes', - 'jucos', - 'judas', - 'judgy', - 'judos', - 'jugal', - 'jugum', - 'jujus', - 'juked', - 'jukes', - 'jukus', - 'julep', - 'jumar', - 'jumby', - 'jumps', - 'junco', - 'junks', - 'junky', - 'jupes', - 'jupon', - 'jural', - 'jurat', - 'jurel', - 'jures', - 'justs', - 'jutes', - 'jutty', - 'juves', - 'juvie', - 'kaama', - 'kabab', - 'kabar', - 'kabob', - 'kacha', - 'kacks', - 'kadai', - 'kades', - 'kadis', - 'kafir', - 'kagos', - 'kagus', - 'kahal', - 'kaiak', - 'kaids', - 'kaies', - 'kaifs', - 'kaika', - 'kaiks', - 'kails', - 'kaims', - 'kaing', - 'kains', - 'kakas', - 'kakis', - 'kalam', - 'kales', - 'kalif', - 'kalis', - 'kalpa', - 'kamas', - 'kames', - 'kamik', - 'kamis', - 'kamme', - 'kanae', - 'kanas', - 'kandy', - 'kaneh', - 'kanes', - 'kanga', - 'kangs', - 'kanji', - 'kants', - 'kanzu', - 'kaons', - 'kapas', - 'kaphs', - 'kapok', - 'kapow', - 'kapus', - 'kaput', - 'karas', - 'karat', - 'karks', - 'karns', - 'karoo', - 'karos', - 'karri', - 'karst', - 'karsy', - 'karts', - 'karzy', - 'kasha', - 'kasme', - 'katal', - 'katas', - 'katis', - 'katti', - 'kaugh', - 'kauri', - 'kauru', - 'kaury', - 'kaval', - 'kavas', - 'kawas', - 'kawau', - 'kawed', - 'kayle', - 'kayos', - 'kazis', - 'kazoo', - 'kbars', - 'kebar', - 'kebob', - 'kecks', - 'kedge', - 'kedgy', - 'keech', - 'keefs', - 'keeks', - 'keels', - 'keema', - 'keeno', - 'keens', - 'keeps', - 'keets', - 'keeve', - 'kefir', - 'kehua', - 'keirs', - 'kelep', - 'kelim', - 'kells', - 'kelly', - 'kelps', - 'kelpy', - 'kelts', - 'kelty', - 'kembo', - 'kembs', - 'kemps', - 'kempt', - 'kempy', - 'kenaf', - 'kench', - 'kendo', - 'kenos', - 'kente', - 'kents', - 'kepis', - 'kerbs', - 'kerel', - 'kerfs', - 'kerky', - 'kerma', - 'kerne', - 'kerns', - 'keros', - 'kerry', - 'kerve', - 'kesar', - 'kests', - 'ketas', - 'ketch', - 'ketes', - 'ketol', - 'kevel', - 'kevil', - 'kexes', - 'keyed', - 'keyer', - 'khadi', - 'khafs', - 'khans', - 'khaph', - 'khats', - 'khaya', - 'khazi', - 'kheda', - 'kheth', - 'khets', - 'khoja', - 'khors', - 'khoum', - 'khuds', - 'kiaat', - 'kiack', - 'kiang', - 'kibbe', - 'kibbi', - 'kibei', - 'kibes', - 'kibla', - 'kicks', - 'kicky', - 'kiddo', - 'kiddy', - 'kidel', - 'kidge', - 'kiefs', - 'kiers', - 'kieve', - 'kievs', - 'kight', - 'kikes', - 'kikoi', - 'kiley', - 'kilim', - 'kills', - 'kilns', - 'kilos', - 'kilps', - 'kilts', - 'kilty', - 'kimbo', - 'kinas', - 'kinda', - 'kinds', - 'kindy', - 'kines', - 'kings', - 'kinin', - 'kinks', - 'kinos', - 'kiore', - 'kipes', - 'kippa', - 'kipps', - 'kirby', - 'kirks', - 'kirns', - 'kirri', - 'kisan', - 'kissy', - 'kists', - 'kited', - 'kiter', - 'kites', - 'kithe', - 'kiths', - 'kitul', - 'kivas', - 'kiwis', - 'klang', - 'klaps', - 'klett', - 'klick', - 'klieg', - 'kliks', - 'klong', - 'kloof', - 'kluge', - 'klutz', - 'knags', - 'knaps', - 'knarl', - 'knars', - 'knaur', - 'knawe', - 'knees', - 'knell', - 'knish', - 'knits', - 'knive', - 'knobs', - 'knops', - 'knosp', - 'knots', - 'knout', - 'knowe', - 'knows', - 'knubs', - 'knurl', - 'knurr', - 'knurs', - 'knuts', - 'koans', - 'koaps', - 'koban', - 'kobos', - 'koels', - 'koffs', - 'kofta', - 'kogal', - 'kohas', - 'kohen', - 'kohls', - 'koine', - 'kojis', - 'kokam', - 'kokas', - 'koker', - 'kokra', - 'kokum', - 'kolas', - 'kolos', - 'kombu', - 'konbu', - 'kondo', - 'konks', - 'kooks', - 'kooky', - 'koori', - 'kopek', - 'kophs', - 'kopje', - 'koppa', - 'korai', - 'koras', - 'korat', - 'kores', - 'korma', - 'koros', - 'korun', - 'korus', - 'koses', - 'kotch', - 'kotos', - 'kotow', - 'koura', - 'kraal', - 'krabs', - 'kraft', - 'krais', - 'krait', - 'krang', - 'krans', - 'kranz', - 'kraut', - 'krays', - 'kreep', - 'kreng', - 'krewe', - 'krona', - 'krone', - 'kroon', - 'krubi', - 'krunk', - 'ksars', - 'kubie', - 'kudos', - 'kudus', - 'kudzu', - 'kufis', - 'kugel', - 'kuias', - 'kukri', - 'kukus', - 'kulak', - 'kulan', - 'kulas', - 'kulfi', - 'kumis', - 'kumys', - 'kuris', - 'kurre', - 'kurta', - 'kurus', - 'kusso', - 'kutas', - 'kutch', - 'kutis', - 'kutus', - 'kuzus', - 'kvass', - 'kvell', - 'kwela', - 'kyack', - 'kyaks', - 'kyang', - 'kyars', - 'kyats', - 'kybos', - 'kydst', - 'kyles', - 'kylie', - 'kylin', - 'kylix', - 'kyloe', - 'kynde', - 'kynds', - 'kypes', - 'kyrie', - 'kytes', - 'kythe', - 'laari', - 'labda', - 'labia', - 'labis', - 'labra', - 'laced', - 'lacer', - 'laces', - 'lacet', - 'lacey', - 'lacks', - 'laddy', - 'laded', - 'lader', - 'lades', - 'laers', - 'laevo', - 'lagan', - 'lahal', - 'lahar', - 'laich', - 'laics', - 'laids', - 'laigh', - 'laika', - 'laiks', - 'laird', - 'lairs', - 'lairy', - 'laith', - 'laity', - 'laked', - 'laker', - 'lakes', - 'lakhs', - 'lakin', - 'laksa', - 'laldy', - 'lalls', - 'lamas', - 'lambs', - 'lamby', - 'lamed', - 'lamer', - 'lames', - 'lamia', - 'lammy', - 'lamps', - 'lanai', - 'lanas', - 'lanch', - 'lande', - 'lands', - 'lanes', - 'lanks', - 'lants', - 'lapin', - 'lapis', - 'lapje', - 'larch', - 'lards', - 'lardy', - 'laree', - 'lares', - 'largo', - 'laris', - 'larks', - 'larky', - 'larns', - 'larnt', - 'larum', - 'lased', - 'laser', - 'lases', - 'lassi', - 'lassu', - 'lassy', - 'lasts', - 'latah', - 'lated', - 'laten', - 'latex', - 'lathi', - 'laths', - 'lathy', - 'latke', - 'latus', - 'lauan', - 'lauch', - 'lauds', - 'laufs', - 'laund', - 'laura', - 'laval', - 'lavas', - 'laved', - 'laver', - 'laves', - 'lavra', - 'lavvy', - 'lawed', - 'lawer', - 'lawin', - 'lawks', - 'lawns', - 'lawny', - 'laxed', - 'laxer', - 'laxes', - 'laxly', - 'layed', - 'layin', - 'layup', - 'lazar', - 'lazed', - 'lazes', - 'lazos', - 'lazzi', - 'lazzo', - 'leads', - 'leady', - 'leafs', - 'leaks', - 'leams', - 'leans', - 'leany', - 'leaps', - 'leare', - 'lears', - 'leary', - 'leats', - 'leavy', - 'leaze', - 'leben', - 'leccy', - 'ledes', - 'ledgy', - 'ledum', - 'leear', - 'leeks', - 'leeps', - 'leers', - 'leese', - 'leets', - 'leeze', - 'lefte', - 'lefts', - 'leger', - 'leges', - 'legge', - 'leggo', - 'legit', - 'lehrs', - 'lehua', - 'leirs', - 'leish', - 'leman', - 'lemed', - 'lemel', - 'lemes', - 'lemma', - 'lemme', - 'lends', - 'lenes', - 'lengs', - 'lenis', - 'lenos', - 'lense', - 'lenti', - 'lento', - 'leone', - 'lepid', - 'lepra', - 'lepta', - 'lered', - 'leres', - 'lerps', - 'lesbo', - 'leses', - 'lests', - 'letch', - 'lethe', - 'letup', - 'leuch', - 'leuco', - 'leuds', - 'leugh', - 'levas', - 'levee', - 'leves', - 'levin', - 'levis', - 'lewis', - 'lexes', - 'lexis', - 'lezes', - 'lezza', - 'lezzy', - 'liana', - 'liane', - 'liang', - 'liard', - 'liars', - 'liart', - 'liber', - 'libra', - 'libri', - 'lichi', - 'licht', - 'licit', - 'licks', - 'lidar', - 'lidos', - 'liefs', - 'liens', - 'liers', - 'lieus', - 'lieve', - 'lifer', - 'lifes', - 'lifts', - 'ligan', - 'liger', - 'ligge', - 'ligne', - 'liked', - 'liker', - 'likes', - 'likin', - 'lills', - 'lilos', - 'lilts', - 'liman', - 'limas', - 'limax', - 'limba', - 'limbi', - 'limbs', - 'limby', - 'limed', - 'limen', - 'limes', - 'limey', - 'limma', - 'limns', - 'limos', - 'limpa', - 'limps', - 'linac', - 'linch', - 'linds', - 'lindy', - 'lined', - 'lines', - 'liney', - 'linga', - 'lings', - 'lingy', - 'linin', - 'links', - 'linky', - 'linns', - 'linny', - 'linos', - 'lints', - 'linty', - 'linum', - 'linux', - 'lions', - 'lipas', - 'lipes', - 'lipin', - 'lipos', - 'lippy', - 'liras', - 'lirks', - 'lirot', - 'lisks', - 'lisle', - 'lisps', - 'lists', - 'litai', - 'litas', - 'lited', - 'liter', - 'lites', - 'litho', - 'liths', - 'litre', - 'lived', - 'liven', - 'lives', - 'livor', - 'livre', - 'llano', - 'loach', - 'loads', - 'loafs', - 'loams', - 'loans', - 'loast', - 'loave', - 'lobar', - 'lobed', - 'lobes', - 'lobos', - 'lobus', - 'loche', - 'lochs', - 'locie', - 'locis', - 'locks', - 'locos', - 'locum', - 'loden', - 'lodes', - 'loess', - 'lofts', - 'logan', - 'loges', - 'loggy', - 'logia', - 'logie', - 'logoi', - 'logon', - 'logos', - 'lohan', - 'loids', - 'loins', - 'loipe', - 'loirs', - 'lokes', - 'lolls', - 'lolly', - 'lolog', - 'lomas', - 'lomed', - 'lomes', - 'loner', - 'longa', - 'longe', - 'longs', - 'looby', - 'looed', - 'looey', - 'loofa', - 'loofs', - 'looie', - 'looks', - 'looky', - 'looms', - 'loons', - 'loony', - 'loops', - 'loord', - 'loots', - 'loped', - 'loper', - 'lopes', - 'loppy', - 'loral', - 'loran', - 'lords', - 'lordy', - 'lorel', - 'lores', - 'loric', - 'loris', - 'losed', - 'losel', - 'losen', - 'loses', - 'lossy', - 'lotah', - 'lotas', - 'lotes', - 'lotic', - 'lotos', - 'lotsa', - 'lotta', - 'lotte', - 'lotto', - 'lotus', - 'loued', - 'lough', - 'louie', - 'louis', - 'louma', - 'lound', - 'louns', - 'loupe', - 'loups', - 'loure', - 'lours', - 'loury', - 'louts', - 'lovat', - 'loved', - 'loves', - 'lovey', - 'lovie', - 'lowan', - 'lowed', - 'lowes', - 'lownd', - 'lowne', - 'lowns', - 'lowps', - 'lowry', - 'lowse', - 'lowts', - 'loxed', - 'loxes', - 'lozen', - 'luach', - 'luaus', - 'lubed', - 'lubes', - 'lubra', - 'luces', - 'lucks', - 'lucre', - 'ludes', - 'ludic', - 'ludos', - 'luffa', - 'luffs', - 'luged', - 'luger', - 'luges', - 'lulls', - 'lulus', - 'lumas', - 'lumbi', - 'lumme', - 'lummy', - 'lumps', - 'lunas', - 'lunes', - 'lunet', - 'lungi', - 'lungs', - 'lunks', - 'lunts', - 'lupin', - 'lured', - 'lurer', - 'lures', - 'lurex', - 'lurgi', - 'lurgy', - 'lurks', - 'lurry', - 'lurve', - 'luser', - 'lushy', - 'lusks', - 'lusts', - 'lusus', - 'lutea', - 'luted', - 'luter', - 'lutes', - 'luvvy', - 'luxed', - 'luxer', - 'luxes', - 'lweis', - 'lyams', - 'lyard', - 'lyart', - 'lyase', - 'lycea', - 'lycee', - 'lycra', - 'lymes', - 'lynes', - 'lyres', - 'lysed', - 'lyses', - 'lysin', - 'lysis', - 'lysol', - 'lyssa', - 'lyted', - 'lytes', - 'lythe', - 'lytic', - 'lytta', - 'maaed', - 'maare', - 'maars', - 'mabes', - 'macas', - 'maced', - 'macer', - 'maces', - 'mache', - 'machi', - 'machs', - 'macks', - 'macle', - 'macon', - 'madge', - 'madid', - 'madre', - 'maerl', - 'mafic', - 'mages', - 'maggs', - 'magot', - 'magus', - 'mahoe', - 'mahua', - 'mahwa', - 'maids', - 'maiko', - 'maiks', - 'maile', - 'maill', - 'mails', - 'maims', - 'mains', - 'maire', - 'mairs', - 'maise', - 'maist', - 'makar', - 'makes', - 'makis', - 'makos', - 'malam', - 'malar', - 'malas', - 'malax', - 'males', - 'malic', - 'malik', - 'malis', - 'malls', - 'malms', - 'malmy', - 'malts', - 'malty', - 'malus', - 'malva', - 'malwa', - 'mamas', - 'mamba', - 'mamee', - 'mamey', - 'mamie', - 'manas', - 'manat', - 'mandi', - 'maneb', - 'maned', - 'maneh', - 'manes', - 'manet', - 'mangs', - 'manis', - 'manky', - 'manna', - 'manos', - 'manse', - 'manta', - 'manto', - 'manty', - 'manul', - 'manus', - 'mapau', - 'maqui', - 'marae', - 'marah', - 'maras', - 'marcs', - 'mardy', - 'mares', - 'marge', - 'margs', - 'maria', - 'marid', - 'marka', - 'marks', - 'marle', - 'marls', - 'marly', - 'marms', - 'maron', - 'maror', - 'marra', - 'marri', - 'marse', - 'marts', - 'marvy', - 'masas', - 'mased', - 'maser', - 'mases', - 'mashy', - 'masks', - 'massa', - 'massy', - 'masts', - 'masty', - 'masus', - 'matai', - 'mated', - 'mater', - 'mates', - 'maths', - 'matin', - 'matlo', - 'matte', - 'matts', - 'matza', - 'matzo', - 'mauby', - 'mauds', - 'mauls', - 'maund', - 'mauri', - 'mausy', - 'mauts', - 'mauzy', - 'maven', - 'mavie', - 'mavin', - 'mavis', - 'mawed', - 'mawks', - 'mawky', - 'mawns', - 'mawrs', - 'maxed', - 'maxes', - 'maxis', - 'mayan', - 'mayas', - 'mayed', - 'mayos', - 'mayst', - 'mazed', - 'mazer', - 'mazes', - 'mazey', - 'mazut', - 'mbira', - 'meads', - 'meals', - 'meane', - 'means', - 'meany', - 'meare', - 'mease', - 'meath', - 'meats', - 'mebos', - 'mechs', - 'mecks', - 'medii', - 'medle', - 'meeds', - 'meers', - 'meets', - 'meffs', - 'meins', - 'meint', - 'meiny', - 'meith', - 'mekka', - 'melas', - 'melba', - 'melds', - 'melic', - 'melik', - 'mells', - 'melts', - 'melty', - 'memes', - 'memos', - 'menad', - 'mends', - 'mened', - 'menes', - 'menge', - 'mengs', - 'mensa', - 'mense', - 'mensh', - 'menta', - 'mento', - 'menus', - 'meous', - 'meows', - 'merch', - 'mercs', - 'merde', - 'mered', - 'merel', - 'merer', - 'meres', - 'meril', - 'meris', - 'merks', - 'merle', - 'merls', - 'merse', - 'mesal', - 'mesas', - 'mesel', - 'meses', - 'meshy', - 'mesic', - 'mesne', - 'meson', - 'messy', - 'mesto', - 'meted', - 'metes', - 'metho', - 'meths', - 'metic', - 'metif', - 'metis', - 'metol', - 'metre', - 'meuse', - 'meved', - 'meves', - 'mewed', - 'mewls', - 'meynt', - 'mezes', - 'mezze', - 'mezzo', - 'mhorr', - 'miaou', - 'miaow', - 'miasm', - 'miaul', - 'micas', - 'miche', - 'micht', - 'micks', - 'micky', - 'micos', - 'micra', - 'middy', - 'midgy', - 'midis', - 'miens', - 'mieve', - 'miffs', - 'miffy', - 'mifty', - 'miggs', - 'mihas', - 'mihis', - 'miked', - 'mikes', - 'mikra', - 'mikva', - 'milch', - 'milds', - 'miler', - 'miles', - 'milfs', - 'milia', - 'milko', - 'milks', - 'mille', - 'mills', - 'milor', - 'milos', - 'milpa', - 'milts', - 'milty', - 'miltz', - 'mimed', - 'mimeo', - 'mimer', - 'mimes', - 'mimsy', - 'minae', - 'minar', - 'minas', - 'mincy', - 'minds', - 'mined', - 'mines', - 'minge', - 'mings', - 'mingy', - 'minis', - 'minke', - 'minks', - 'minny', - 'minos', - 'mints', - 'mired', - 'mires', - 'mirex', - 'mirid', - 'mirin', - 'mirks', - 'mirky', - 'mirly', - 'miros', - 'mirvs', - 'mirza', - 'misch', - 'misdo', - 'mises', - 'misgo', - 'misos', - 'missa', - 'mists', - 'misty', - 'mitch', - 'miter', - 'mites', - 'mitis', - 'mitre', - 'mitts', - 'mixed', - 'mixen', - 'mixer', - 'mixes', - 'mixte', - 'mixup', - 'mizen', - 'mizzy', - 'mneme', - 'moans', - 'moats', - 'mobby', - 'mobes', - 'mobey', - 'mobie', - 'moble', - 'mochi', - 'mochs', - 'mochy', - 'mocks', - 'moder', - 'modes', - 'modge', - 'modii', - 'modus', - 'moers', - 'mofos', - 'moggy', - 'mohel', - 'mohos', - 'mohrs', - 'mohua', - 'mohur', - 'moile', - 'moils', - 'moira', - 'moire', - 'moits', - 'mojos', - 'mokes', - 'mokis', - 'mokos', - 'molal', - 'molas', - 'molds', - 'moled', - 'moles', - 'molla', - 'molls', - 'molly', - 'molto', - 'molts', - 'molys', - 'momes', - 'momma', - 'mommy', - 'momus', - 'monad', - 'monal', - 'monas', - 'monde', - 'mondo', - 'moner', - 'mongo', - 'mongs', - 'monic', - 'monie', - 'monks', - 'monos', - 'monte', - 'monty', - 'moobs', - 'mooch', - 'moods', - 'mooed', - 'mooks', - 'moola', - 'mooli', - 'mools', - 'mooly', - 'moong', - 'moons', - 'moony', - 'moops', - 'moors', - 'moory', - 'moots', - 'moove', - 'moped', - 'moper', - 'mopes', - 'mopey', - 'moppy', - 'mopsy', - 'mopus', - 'morae', - 'moras', - 'morat', - 'moray', - 'morel', - 'mores', - 'moria', - 'morne', - 'morns', - 'morra', - 'morro', - 'morse', - 'morts', - 'mosed', - 'moses', - 'mosey', - 'mosks', - 'mosso', - 'moste', - 'mosts', - 'moted', - 'moten', - 'motes', - 'motet', - 'motey', - 'moths', - 'mothy', - 'motis', - 'motte', - 'motts', - 'motty', - 'motus', - 'motza', - 'mouch', - 'moues', - 'mould', - 'mouls', - 'moups', - 'moust', - 'mousy', - 'moved', - 'moves', - 'mowas', - 'mowed', - 'mowra', - 'moxas', - 'moxie', - 'moyas', - 'moyle', - 'moyls', - 'mozed', - 'mozes', - 'mozos', - 'mpret', - 'mucho', - 'mucic', - 'mucid', - 'mucin', - 'mucks', - 'mucor', - 'mucro', - 'mudge', - 'mudir', - 'mudra', - 'muffs', - 'mufti', - 'mugga', - 'muggs', - 'muggy', - 'muhly', - 'muids', - 'muils', - 'muirs', - 'muist', - 'mujik', - 'mulct', - 'muled', - 'mules', - 'muley', - 'mulga', - 'mulie', - 'mulla', - 'mulls', - 'mulse', - 'mulsh', - 'mumms', - 'mumps', - 'mumsy', - 'mumus', - 'munga', - 'munge', - 'mungo', - 'mungs', - 'munis', - 'munts', - 'muntu', - 'muons', - 'muras', - 'mured', - 'mures', - 'murex', - 'murid', - 'murks', - 'murls', - 'murly', - 'murra', - 'murre', - 'murri', - 'murrs', - 'murry', - 'murti', - 'murva', - 'musar', - 'musca', - 'mused', - 'muser', - 'muses', - 'muset', - 'musha', - 'musit', - 'musks', - 'musos', - 'musse', - 'mussy', - 'musth', - 'musts', - 'mutch', - 'muted', - 'muter', - 'mutes', - 'mutha', - 'mutis', - 'muton', - 'mutts', - 'muxed', - 'muxes', - 'muzak', - 'muzzy', - 'mvule', - 'myall', - 'mylar', - 'mynah', - 'mynas', - 'myoid', - 'myoma', - 'myope', - 'myops', - 'myopy', - 'mysid', - 'mythi', - 'myths', - 'mythy', - 'myxos', - 'mzees', - 'naams', - 'naans', - 'nabes', - 'nabis', - 'nabks', - 'nabla', - 'nabob', - 'nache', - 'nacho', - 'nacre', - 'nadas', - 'naeve', - 'naevi', - 'naffs', - 'nagas', - 'naggy', - 'nagor', - 'nahal', - 'naiad', - 'naifs', - 'naiks', - 'nails', - 'naira', - 'nairu', - 'naked', - 'naker', - 'nakfa', - 'nalas', - 'naled', - 'nalla', - 'named', - 'namer', - 'names', - 'namma', - 'namus', - 'nanas', - 'nance', - 'nancy', - 'nandu', - 'nanna', - 'nanos', - 'nanua', - 'napas', - 'naped', - 'napes', - 'napoo', - 'nappa', - 'nappe', - 'nappy', - 'naras', - 'narco', - 'narcs', - 'nards', - 'nares', - 'naric', - 'naris', - 'narks', - 'narky', - 'narre', - 'nashi', - 'natch', - 'nates', - 'natis', - 'natty', - 'nauch', - 'naunt', - 'navar', - 'naves', - 'navew', - 'navvy', - 'nawab', - 'nazes', - 'nazir', - 'nazis', - 'nduja', - 'neafe', - 'neals', - 'neaps', - 'nears', - 'neath', - 'neats', - 'nebek', - 'nebel', - 'necks', - 'neddy', - 'needs', - 'neeld', - 'neele', - 'neemb', - 'neems', - 'neeps', - 'neese', - 'neeze', - 'negro', - 'negus', - 'neifs', - 'neist', - 'neive', - 'nelis', - 'nelly', - 'nemas', - 'nemns', - 'nempt', - 'nenes', - 'neons', - 'neper', - 'nepit', - 'neral', - 'nerds', - 'nerka', - 'nerks', - 'nerol', - 'nerts', - 'nertz', - 'nervy', - 'nests', - 'netes', - 'netop', - 'netts', - 'netty', - 'neuks', - 'neume', - 'neums', - 'nevel', - 'neves', - 'nevus', - 'newbs', - 'newed', - 'newel', - 'newie', - 'newsy', - 'newts', - 'nexts', - 'nexus', - 'ngaio', - 'ngana', - 'ngati', - 'ngoma', - 'ngwee', - 'nicad', - 'nicht', - 'nicks', - 'nicol', - 'nidal', - 'nided', - 'nides', - 'nidor', - 'nidus', - 'niefs', - 'nieve', - 'nifes', - 'niffs', - 'niffy', - 'nifty', - 'niger', - 'nighs', - 'nihil', - 'nikab', - 'nikah', - 'nikau', - 'nills', - 'nimbi', - 'nimbs', - 'nimps', - 'niner', - 'nines', - 'ninon', - 'nipas', - 'nippy', - 'niqab', - 'nirls', - 'nirly', - 'nisei', - 'nisse', - 'nisus', - 'niter', - 'nites', - 'nitid', - 'niton', - 'nitre', - 'nitro', - 'nitry', - 'nitty', - 'nival', - 'nixed', - 'nixer', - 'nixes', - 'nixie', - 'nizam', - 'nkosi', - 'noahs', - 'nobby', - 'nocks', - 'nodal', - 'noddy', - 'nodes', - 'nodus', - 'noels', - 'noggs', - 'nohow', - 'noils', - 'noily', - 'noint', - 'noirs', - 'noles', - 'nolls', - 'nolos', - 'nomas', - 'nomen', - 'nomes', - 'nomic', - 'nomoi', - 'nomos', - 'nonas', - 'nonce', - 'nones', - 'nonet', - 'nongs', - 'nonis', - 'nonny', - 'nonyl', - 'noobs', - 'nooit', - 'nooks', - 'nooky', - 'noons', - 'noops', - 'nopal', - 'noria', - 'noris', - 'norks', - 'norma', - 'norms', - 'nosed', - 'noser', - 'noses', - 'notal', - 'noted', - 'noter', - 'notes', - 'notum', - 'nould', - 'noule', - 'nouls', - 'nouns', - 'nouny', - 'noups', - 'novae', - 'novas', - 'novum', - 'noway', - 'nowed', - 'nowls', - 'nowts', - 'nowty', - 'noxal', - 'noxes', - 'noyau', - 'noyed', - 'noyes', - 'nubby', - 'nubia', - 'nucha', - 'nuddy', - 'nuder', - 'nudes', - 'nudie', - 'nudzh', - 'nuffs', - 'nugae', - 'nuked', - 'nukes', - 'nulla', - 'nulls', - 'numbs', - 'numen', - 'nummy', - 'nunny', - 'nurds', - 'nurdy', - 'nurls', - 'nurrs', - 'nutso', - 'nutsy', - 'nyaff', - 'nyala', - 'nying', - 'nyssa', - 'oaked', - 'oaker', - 'oakum', - 'oared', - 'oases', - 'oasis', - 'oasts', - 'oaten', - 'oater', - 'oaths', - 'oaves', - 'obang', - 'obeah', - 'obeli', - 'obeys', - 'obias', - 'obied', - 'obiit', - 'obits', - 'objet', - 'oboes', - 'obole', - 'oboli', - 'obols', - 'occam', - 'ocher', - 'oches', - 'ochre', - 'ochry', - 'ocker', - 'ocrea', - 'octad', - 'octan', - 'octas', - 'octyl', - 'oculi', - 'odahs', - 'odals', - 'odeon', - 'odeum', - 'odism', - 'odist', - 'odium', - 'odors', - 'odour', - 'odyle', - 'odyls', - 'ofays', - 'offed', - 'offie', - 'oflag', - 'ofter', - 'ogams', - 'ogeed', - 'ogees', - 'oggin', - 'ogham', - 'ogive', - 'ogled', - 'ogler', - 'ogles', - 'ogmic', - 'ogres', - 'ohias', - 'ohing', - 'ohmic', - 'ohone', - 'oidia', - 'oiled', - 'oiler', - 'oinks', - 'oints', - 'ojime', - 'okapi', - 'okays', - 'okehs', - 'okras', - 'oktas', - 'oldie', - 'oleic', - 'olein', - 'olent', - 'oleos', - 'oleum', - 'olios', - 'ollas', - 'ollav', - 'oller', - 'ollie', - 'ology', - 'olpae', - 'olpes', - 'omasa', - 'omber', - 'ombus', - 'omens', - 'omers', - 'omits', - 'omlah', - 'omovs', - 'omrah', - 'oncer', - 'onces', - 'oncet', - 'oncus', - 'onely', - 'oners', - 'onery', - 'onium', - 'onkus', - 'onlay', - 'onned', - 'ontic', - 'oobit', - 'oohed', - 'oomph', - 'oonts', - 'ooped', - 'oorie', - 'ooses', - 'ootid', - 'oozed', - 'oozes', - 'opahs', - 'opals', - 'opens', - 'opepe', - 'oping', - 'oppos', - 'opsin', - 'opted', - 'opter', - 'orach', - 'oracy', - 'orals', - 'orang', - 'orant', - 'orate', - 'orbed', - 'orcas', - 'orcin', - 'ordos', - 'oread', - 'orfes', - 'orgia', - 'orgic', - 'orgue', - 'oribi', - 'oriel', - 'orixa', - 'orles', - 'orlon', - 'orlop', - 'ormer', - 'ornis', - 'orpin', - 'orris', - 'ortho', - 'orval', - 'orzos', - 'oscar', - 'oshac', - 'osier', - 'osmic', - 'osmol', - 'ossia', - 'ostia', - 'otaku', - 'otary', - 'ottar', - 'ottos', - 'oubit', - 'oucht', - 'ouens', - 'ouija', - 'oulks', - 'oumas', - 'oundy', - 'oupas', - 'ouped', - 'ouphe', - 'ouphs', - 'ourie', - 'ousel', - 'ousts', - 'outby', - 'outed', - 'outre', - 'outro', - 'outta', - 'ouzel', - 'ouzos', - 'ovals', - 'ovels', - 'ovens', - 'overs', - 'ovist', - 'ovoli', - 'ovolo', - 'ovule', - 'owche', - 'owies', - 'owled', - 'owler', - 'owlet', - 'owned', - 'owres', - 'owrie', - 'owsen', - 'oxbow', - 'oxers', - 'oxeye', - 'oxids', - 'oxies', - 'oxime', - 'oxims', - 'oxlip', - 'oxter', - 'oyers', - 'ozeki', - 'ozzie', - 'paals', - 'paans', - 'pacas', - 'paced', - 'pacer', - 'paces', - 'pacey', - 'pacha', - 'packs', - 'pacos', - 'pacta', - 'pacts', - 'padis', - 'padle', - 'padma', - 'padre', - 'padri', - 'paean', - 'paedo', - 'paeon', - 'paged', - 'pager', - 'pages', - 'pagle', - 'pagod', - 'pagri', - 'paiks', - 'pails', - 'pains', - 'paire', - 'pairs', - 'paisa', - 'paise', - 'pakka', - 'palas', - 'palay', - 'palea', - 'paled', - 'pales', - 'palet', - 'palis', - 'palki', - 'palla', - 'palls', - 'pally', - 'palms', - 'palmy', - 'palpi', - 'palps', - 'palsa', - 'pampa', - 'panax', - 'pance', - 'panda', - 'pands', - 'pandy', - 'paned', - 'panes', - 'panga', - 'pangs', - 'panim', - 'panko', - 'panne', - 'panni', - 'panto', - 'pants', - 'panty', - 'paoli', - 'paolo', - 'papas', - 'papaw', - 'papes', - 'pappi', - 'pappy', - 'parae', - 'paras', - 'parch', - 'pardi', - 'pards', - 'pardy', - 'pared', - 'paren', - 'pareo', - 'pares', - 'pareu', - 'parev', - 'parge', - 'pargo', - 'paris', - 'parki', - 'parks', - 'parky', - 'parle', - 'parly', - 'parma', - 'parol', - 'parps', - 'parra', - 'parrs', - 'parti', - 'parts', - 'parve', - 'parvo', - 'paseo', - 'pases', - 'pasha', - 'pashm', - 'paska', - 'paspy', - 'passe', - 'pasts', - 'pated', - 'paten', - 'pater', - 'pates', - 'paths', - 'patin', - 'patka', - 'patly', - 'patte', - 'patus', - 'pauas', - 'pauls', - 'pavan', - 'paved', - 'paven', - 'paver', - 'paves', - 'pavid', - 'pavin', - 'pavis', - 'pawas', - 'pawaw', - 'pawed', - 'pawer', - 'pawks', - 'pawky', - 'pawls', - 'pawns', - 'paxes', - 'payed', - 'payor', - 'paysd', - 'peage', - 'peags', - 'peaks', - 'peaky', - 'peals', - 'peans', - 'peare', - 'pears', - 'peart', - 'pease', - 'peats', - 'peaty', - 'peavy', - 'peaze', - 'pebas', - 'pechs', - 'pecke', - 'pecks', - 'pecky', - 'pedes', - 'pedis', - 'pedro', - 'peece', - 'peeks', - 'peels', - 'peens', - 'peeoy', - 'peepe', - 'peeps', - 'peers', - 'peery', - 'peeve', - 'peggy', - 'peghs', - 'peins', - 'peise', - 'peize', - 'pekan', - 'pekes', - 'pekin', - 'pekoe', - 'pelas', - 'pelau', - 'peles', - 'pelfs', - 'pells', - 'pelma', - 'pelon', - 'pelta', - 'pelts', - 'pends', - 'pendu', - 'pened', - 'penes', - 'pengo', - 'penie', - 'penis', - 'penks', - 'penna', - 'penni', - 'pents', - 'peons', - 'peony', - 'pepla', - 'pepos', - 'peppy', - 'pepsi', - 'perai', - 'perce', - 'percs', - 'perdu', - 'perdy', - 'perea', - 'peres', - 'peris', - 'perks', - 'perms', - 'perns', - 'perog', - 'perps', - 'perry', - 'perse', - 'perst', - 'perts', - 'perve', - 'pervo', - 'pervs', - 'pervy', - 'pesos', - 'pests', - 'pesty', - 'petar', - 'peter', - 'petit', - 'petre', - 'petri', - 'petti', - 'petto', - 'pewee', - 'pewit', - 'peyse', - 'phage', - 'phang', - 'phare', - 'pharm', - 'pheer', - 'phene', - 'pheon', - 'phese', - 'phial', - 'phish', - 'phizz', - 'phlox', - 'phoca', - 'phono', - 'phons', - 'phots', - 'phpht', - 'phuts', - 'phyla', - 'phyle', - 'piani', - 'pians', - 'pibal', - 'pical', - 'picas', - 'piccy', - 'picks', - 'picot', - 'picra', - 'picul', - 'piend', - 'piers', - 'piert', - 'pieta', - 'piets', - 'piezo', - 'pight', - 'pigmy', - 'piing', - 'pikas', - 'pikau', - 'piked', - 'piker', - 'pikes', - 'pikey', - 'pikis', - 'pikul', - 'pilae', - 'pilaf', - 'pilao', - 'pilar', - 'pilau', - 'pilaw', - 'pilch', - 'pilea', - 'piled', - 'pilei', - 'piler', - 'piles', - 'pilis', - 'pills', - 'pilow', - 'pilum', - 'pilus', - 'pimas', - 'pimps', - 'pinas', - 'pined', - 'pines', - 'pingo', - 'pings', - 'pinko', - 'pinks', - 'pinna', - 'pinny', - 'pinon', - 'pinot', - 'pinta', - 'pints', - 'pinup', - 'pions', - 'piony', - 'pious', - 'pioye', - 'pioys', - 'pipal', - 'pipas', - 'piped', - 'pipes', - 'pipet', - 'pipis', - 'pipit', - 'pippy', - 'pipul', - 'pirai', - 'pirls', - 'pirns', - 'pirog', - 'pisco', - 'pises', - 'pisky', - 'pisos', - 'pissy', - 'piste', - 'pitas', - 'piths', - 'piton', - 'pitot', - 'pitta', - 'piums', - 'pixes', - 'pized', - 'pizes', - 'plaas', - 'plack', - 'plage', - 'plans', - 'plaps', - 'plash', - 'plasm', - 'plast', - 'plats', - 'platt', - 'platy', - 'playa', - 'plays', - 'pleas', - 'plebe', - 'plebs', - 'plena', - 'pleon', - 'plesh', - 'plews', - 'plica', - 'plies', - 'plims', - 'pling', - 'plink', - 'ploat', - 'plods', - 'plong', - 'plonk', - 'plook', - 'plops', - 'plots', - 'plotz', - 'plouk', - 'plows', - 'ploye', - 'ploys', - 'plues', - 'pluff', - 'plugs', - 'plums', - 'plumy', - 'pluot', - 'pluto', - 'plyer', - 'poach', - 'poaka', - 'poake', - 'poboy', - 'pocks', - 'pocky', - 'podal', - 'poddy', - 'podex', - 'podge', - 'podgy', - 'podia', - 'poems', - 'poeps', - 'poets', - 'pogey', - 'pogge', - 'pogos', - 'pohed', - 'poilu', - 'poind', - 'pokal', - 'poked', - 'pokes', - 'pokey', - 'pokie', - 'poled', - 'poler', - 'poles', - 'poley', - 'polio', - 'polis', - 'polje', - 'polks', - 'polls', - 'polly', - 'polos', - 'polts', - 'polys', - 'pombe', - 'pomes', - 'pommy', - 'pomos', - 'pomps', - 'ponce', - 'poncy', - 'ponds', - 'pones', - 'poney', - 'ponga', - 'pongo', - 'pongs', - 'pongy', - 'ponks', - 'ponts', - 'ponty', - 'ponzu', - 'poods', - 'pooed', - 'poofs', - 'poofy', - 'poohs', - 'pooja', - 'pooka', - 'pooks', - 'pools', - 'poons', - 'poops', - 'poopy', - 'poori', - 'poort', - 'poots', - 'poove', - 'poovy', - 'popes', - 'poppa', - 'popsy', - 'porae', - 'poral', - 'pored', - 'porer', - 'pores', - 'porge', - 'porgy', - 'porin', - 'porks', - 'porky', - 'porno', - 'porns', - 'porny', - 'porta', - 'ports', - 'porty', - 'posed', - 'poses', - 'posey', - 'posho', - 'posts', - 'potae', - 'potch', - 'poted', - 'potes', - 'potin', - 'potoo', - 'potsy', - 'potto', - 'potts', - 'potty', - 'pouff', - 'poufs', - 'pouke', - 'pouks', - 'poule', - 'poulp', - 'poult', - 'poupe', - 'poupt', - 'pours', - 'pouts', - 'powan', - 'powin', - 'pownd', - 'powns', - 'powny', - 'powre', - 'poxed', - 'poxes', - 'poynt', - 'poyou', - 'poyse', - 'pozzy', - 'praam', - 'prads', - 'prahu', - 'prams', - 'prana', - 'prang', - 'praos', - 'prase', - 'prate', - 'prats', - 'pratt', - 'praty', - 'praus', - 'prays', - 'predy', - 'preed', - 'prees', - 'preif', - 'prems', - 'premy', - 'prent', - 'preon', - 'preop', - 'preps', - 'presa', - 'prese', - 'prest', - 'preve', - 'prexy', - 'preys', - 'prial', - 'pricy', - 'prief', - 'prier', - 'pries', - 'prigs', - 'prill', - 'prima', - 'primi', - 'primp', - 'prims', - 'primy', - 'prink', - 'prion', - 'prise', - 'priss', - 'proas', - 'probs', - 'prods', - 'proem', - 'profs', - 'progs', - 'proin', - 'proke', - 'prole', - 'proll', - 'promo', - 'proms', - 'pronk', - 'props', - 'prore', - 'proso', - 'pross', - 'prost', - 'prosy', - 'proto', - 'proul', - 'prows', - 'proyn', - 'prunt', - 'pruta', - 'pryer', - 'pryse', - 'pseud', - 'pshaw', - 'psion', - 'psoae', - 'psoai', - 'psoas', - 'psora', - 'psych', - 'psyop', - 'pubco', - 'pubes', - 'pubis', - 'pucan', - 'pucer', - 'puces', - 'pucka', - 'pucks', - 'puddy', - 'pudge', - 'pudic', - 'pudor', - 'pudsy', - 'pudus', - 'puers', - 'puffa', - 'puffs', - 'puggy', - 'pugil', - 'puhas', - 'pujah', - 'pujas', - 'pukas', - 'puked', - 'puker', - 'pukes', - 'pukey', - 'pukka', - 'pukus', - 'pulao', - 'pulas', - 'puled', - 'puler', - 'pules', - 'pulik', - 'pulis', - 'pulka', - 'pulks', - 'pulli', - 'pulls', - 'pully', - 'pulmo', - 'pulps', - 'pulus', - 'pumas', - 'pumie', - 'pumps', - 'punas', - 'punce', - 'punga', - 'pungs', - 'punji', - 'punka', - 'punks', - 'punky', - 'punny', - 'punto', - 'punts', - 'punty', - 'pupae', - 'pupas', - 'pupus', - 'purda', - 'pured', - 'pures', - 'purin', - 'puris', - 'purls', - 'purpy', - 'purrs', - 'pursy', - 'purty', - 'puses', - 'pusle', - 'pussy', - 'putid', - 'puton', - 'putti', - 'putto', - 'putts', - 'puzel', - 'pwned', - 'pyats', - 'pyets', - 'pygal', - 'pyins', - 'pylon', - 'pyned', - 'pynes', - 'pyoid', - 'pyots', - 'pyral', - 'pyran', - 'pyres', - 'pyrex', - 'pyric', - 'pyros', - 'pyxed', - 'pyxes', - 'pyxie', - 'pyxis', - 'pzazz', - 'qadis', - 'qaids', - 'qajaq', - 'qanat', - 'qapik', - 'qibla', - 'qophs', - 'qorma', - 'quads', - 'quaff', - 'quags', - 'quair', - 'quais', - 'quaky', - 'quale', - 'quant', - 'quare', - 'quass', - 'quate', - 'quats', - 'quayd', - 'quays', - 'qubit', - 'quean', - 'queme', - 'quena', - 'quern', - 'queyn', - 'queys', - 'quich', - 'quids', - 'quiff', - 'quims', - 'quina', - 'quine', - 'quino', - 'quins', - 'quint', - 'quipo', - 'quips', - 'quipu', - 'quire', - 'quirt', - 'quist', - 'quits', - 'quoad', - 'quods', - 'quoif', - 'quoin', - 'quoit', - 'quoll', - 'quonk', - 'quops', - 'qursh', - 'quyte', - 'rabat', - 'rabic', - 'rabis', - 'raced', - 'races', - 'rache', - 'racks', - 'racon', - 'radge', - 'radix', - 'radon', - 'raffs', - 'rafts', - 'ragas', - 'ragde', - 'raged', - 'ragee', - 'rager', - 'rages', - 'ragga', - 'raggs', - 'raggy', - 'ragis', - 'ragus', - 'rahed', - 'rahui', - 'raias', - 'raids', - 'raiks', - 'raile', - 'rails', - 'raine', - 'rains', - 'raird', - 'raita', - 'raits', - 'rajas', - 'rajes', - 'raked', - 'rakee', - 'raker', - 'rakes', - 'rakia', - 'rakis', - 'rakus', - 'rales', - 'ramal', - 'ramee', - 'ramet', - 'ramie', - 'ramin', - 'ramis', - 'rammy', - 'ramps', - 'ramus', - 'ranas', - 'rance', - 'rands', - 'ranee', - 'ranga', - 'rangi', - 'rangs', - 'rangy', - 'ranid', - 'ranis', - 'ranke', - 'ranks', - 'rants', - 'raped', - 'raper', - 'rapes', - 'raphe', - 'rappe', - 'rared', - 'raree', - 'rares', - 'rarks', - 'rased', - 'raser', - 'rases', - 'rasps', - 'rasse', - 'rasta', - 'ratal', - 'ratan', - 'ratas', - 'ratch', - 'rated', - 'ratel', - 'rater', - 'rates', - 'ratha', - 'rathe', - 'raths', - 'ratoo', - 'ratos', - 'ratus', - 'rauns', - 'raupo', - 'raved', - 'ravel', - 'raver', - 'raves', - 'ravey', - 'ravin', - 'rawer', - 'rawin', - 'rawly', - 'rawns', - 'raxed', - 'raxes', - 'rayah', - 'rayas', - 'rayed', - 'rayle', - 'rayne', - 'razed', - 'razee', - 'razer', - 'razes', - 'razoo', - 'readd', - 'reads', - 'reais', - 'reaks', - 'realo', - 'reals', - 'reame', - 'reams', - 'reamy', - 'reans', - 'reaps', - 'rears', - 'reast', - 'reata', - 'reate', - 'reave', - 'rebbe', - 'rebec', - 'rebid', - 'rebit', - 'rebop', - 'rebuy', - 'recal', - 'recce', - 'recco', - 'reccy', - 'recit', - 'recks', - 'recon', - 'recta', - 'recti', - 'recto', - 'redan', - 'redds', - 'reddy', - 'reded', - 'redes', - 'redia', - 'redid', - 'redip', - 'redly', - 'redon', - 'redos', - 'redox', - 'redry', - 'redub', - 'redux', - 'redye', - 'reech', - 'reede', - 'reeds', - 'reefs', - 'reefy', - 'reeks', - 'reeky', - 'reels', - 'reens', - 'reest', - 'reeve', - 'refed', - 'refel', - 'reffo', - 'refis', - 'refix', - 'refly', - 'refry', - 'regar', - 'reges', - 'reggo', - 'regie', - 'regma', - 'regna', - 'regos', - 'regur', - 'rehem', - 'reifs', - 'reify', - 'reiki', - 'reiks', - 'reink', - 'reins', - 'reird', - 'reist', - 'reive', - 'rejig', - 'rejon', - 'reked', - 'rekes', - 'rekey', - 'relet', - 'relie', - 'relit', - 'rello', - 'reman', - 'remap', - 'remen', - 'remet', - 'remex', - 'remix', - 'renay', - 'rends', - 'reney', - 'renga', - 'renig', - 'renin', - 'renne', - 'renos', - 'rente', - 'rents', - 'reoil', - 'reorg', - 'repeg', - 'repin', - 'repla', - 'repos', - 'repot', - 'repps', - 'repro', - 'reran', - 'rerig', - 'resat', - 'resaw', - 'resay', - 'resee', - 'reses', - 'resew', - 'resid', - 'resit', - 'resod', - 'resow', - 'resto', - 'rests', - 'resty', - 'resus', - 'retag', - 'retax', - 'retem', - 'retia', - 'retie', - 'retox', - 'revet', - 'revie', - 'rewan', - 'rewax', - 'rewed', - 'rewet', - 'rewin', - 'rewon', - 'rewth', - 'rexes', - 'rezes', - 'rheas', - 'rheme', - 'rheum', - 'rhies', - 'rhime', - 'rhine', - 'rhody', - 'rhomb', - 'rhone', - 'rhumb', - 'rhyne', - 'rhyta', - 'riads', - 'rials', - 'riant', - 'riata', - 'ribas', - 'ribby', - 'ribes', - 'riced', - 'ricer', - 'rices', - 'ricey', - 'richt', - 'ricin', - 'ricks', - 'rides', - 'ridgy', - 'ridic', - 'riels', - 'riems', - 'rieve', - 'rifer', - 'riffs', - 'rifte', - 'rifts', - 'rifty', - 'riggs', - 'rigol', - 'riled', - 'riles', - 'riley', - 'rille', - 'rills', - 'rimae', - 'rimed', - 'rimer', - 'rimes', - 'rimus', - 'rinds', - 'rindy', - 'rines', - 'rings', - 'rinks', - 'rioja', - 'riots', - 'riped', - 'ripes', - 'ripps', - 'rises', - 'rishi', - 'risks', - 'risps', - 'risus', - 'rites', - 'ritts', - 'ritzy', - 'rivas', - 'rived', - 'rivel', - 'riven', - 'rives', - 'riyal', - 'rizas', - 'roads', - 'roams', - 'roans', - 'roars', - 'roary', - 'roate', - 'robed', - 'robes', - 'roble', - 'rocks', - 'roded', - 'rodes', - 'roguy', - 'rohes', - 'roids', - 'roils', - 'roily', - 'roins', - 'roist', - 'rojak', - 'rojis', - 'roked', - 'roker', - 'rokes', - 'rolag', - 'roles', - 'rolfs', - 'rolls', - 'romal', - 'roman', - 'romeo', - 'romps', - 'ronde', - 'rondo', - 'roneo', - 'rones', - 'ronin', - 'ronne', - 'ronte', - 'ronts', - 'roods', - 'roofs', - 'roofy', - 'rooks', - 'rooky', - 'rooms', - 'roons', - 'roops', - 'roopy', - 'roosa', - 'roose', - 'roots', - 'rooty', - 'roped', - 'roper', - 'ropes', - 'ropey', - 'roque', - 'roral', - 'rores', - 'roric', - 'rorid', - 'rorie', - 'rorts', - 'rorty', - 'rosed', - 'roses', - 'roset', - 'roshi', - 'rosin', - 'rosit', - 'rosti', - 'rosts', - 'rotal', - 'rotan', - 'rotas', - 'rotch', - 'roted', - 'rotes', - 'rotis', - 'rotls', - 'roton', - 'rotos', - 'rotte', - 'rouen', - 'roues', - 'roule', - 'rouls', - 'roums', - 'roups', - 'roupy', - 'roust', - 'routh', - 'routs', - 'roved', - 'roven', - 'roves', - 'rowan', - 'rowed', - 'rowel', - 'rowen', - 'rowie', - 'rowme', - 'rownd', - 'rowth', - 'rowts', - 'royne', - 'royst', - 'rozet', - 'rozit', - 'ruana', - 'rubai', - 'rubby', - 'rubel', - 'rubes', - 'rubin', - 'ruble', - 'rubli', - 'rubus', - 'ruche', - 'rucks', - 'rudas', - 'rudds', - 'rudes', - 'rudie', - 'rudis', - 'rueda', - 'ruers', - 'ruffe', - 'ruffs', - 'rugae', - 'rugal', - 'ruggy', - 'ruing', - 'ruins', - 'rukhs', - 'ruled', - 'rules', - 'rumal', - 'rumbo', - 'rumen', - 'rumes', - 'rumly', - 'rummy', - 'rumpo', - 'rumps', - 'rumpy', - 'runch', - 'runds', - 'runed', - 'runes', - 'rungs', - 'runic', - 'runny', - 'runts', - 'runty', - 'rupia', - 'rurps', - 'rurus', - 'rusas', - 'ruses', - 'rushy', - 'rusks', - 'rusma', - 'russe', - 'rusts', - 'ruths', - 'rutin', - 'rutty', - 'ryals', - 'rybat', - 'ryked', - 'rykes', - 'rymme', - 'rynds', - 'ryots', - 'ryper', - 'saags', - 'sabal', - 'sabed', - 'saber', - 'sabes', - 'sabha', - 'sabin', - 'sabir', - 'sable', - 'sabot', - 'sabra', - 'sabre', - 'sacks', - 'sacra', - 'saddo', - 'sades', - 'sadhe', - 'sadhu', - 'sadis', - 'sados', - 'sadza', - 'safed', - 'safes', - 'sagas', - 'sager', - 'sages', - 'saggy', - 'sagos', - 'sagum', - 'saheb', - 'sahib', - 'saice', - 'saick', - 'saics', - 'saids', - 'saiga', - 'sails', - 'saims', - 'saine', - 'sains', - 'sairs', - 'saist', - 'saith', - 'sajou', - 'sakai', - 'saker', - 'sakes', - 'sakia', - 'sakis', - 'sakti', - 'salal', - 'salat', - 'salep', - 'sales', - 'salet', - 'salic', - 'salix', - 'salle', - 'salmi', - 'salol', - 'salop', - 'salpa', - 'salps', - 'salse', - 'salto', - 'salts', - 'salue', - 'salut', - 'saman', - 'samas', - 'samba', - 'sambo', - 'samek', - 'samel', - 'samen', - 'sames', - 'samey', - 'samfu', - 'sammy', - 'sampi', - 'samps', - 'sands', - 'saned', - 'sanes', - 'sanga', - 'sangh', - 'sango', - 'sangs', - 'sanko', - 'sansa', - 'santo', - 'sants', - 'saola', - 'sapan', - 'sapid', - 'sapor', - 'saran', - 'sards', - 'sared', - 'saree', - 'sarge', - 'sargo', - 'sarin', - 'saris', - 'sarks', - 'sarky', - 'sarod', - 'saros', - 'sarus', - 'saser', - 'sasin', - 'sasse', - 'satai', - 'satay', - 'sated', - 'satem', - 'sates', - 'satis', - 'sauba', - 'sauch', - 'saugh', - 'sauls', - 'sault', - 'saunt', - 'saury', - 'sauts', - 'saved', - 'saver', - 'saves', - 'savey', - 'savin', - 'sawah', - 'sawed', - 'sawer', - 'saxes', - 'sayed', - 'sayer', - 'sayid', - 'sayne', - 'sayon', - 'sayst', - 'sazes', - 'scabs', - 'scads', - 'scaff', - 'scags', - 'scail', - 'scala', - 'scall', - 'scams', - 'scand', - 'scans', - 'scapa', - 'scape', - 'scapi', - 'scarp', - 'scars', - 'scart', - 'scath', - 'scats', - 'scatt', - 'scaud', - 'scaup', - 'scaur', - 'scaws', - 'sceat', - 'scena', - 'scend', - 'schav', - 'schmo', - 'schul', - 'schwa', - 'sclim', - 'scody', - 'scogs', - 'scoog', - 'scoot', - 'scopa', - 'scops', - 'scots', - 'scoug', - 'scoup', - 'scowp', - 'scows', - 'scrab', - 'scrae', - 'scrag', - 'scran', - 'scrat', - 'scraw', - 'scray', - 'scrim', - 'scrip', - 'scrob', - 'scrod', - 'scrog', - 'scrow', - 'scudi', - 'scudo', - 'scuds', - 'scuff', - 'scuft', - 'scugs', - 'sculk', - 'scull', - 'sculp', - 'sculs', - 'scums', - 'scups', - 'scurf', - 'scurs', - 'scuse', - 'scuta', - 'scute', - 'scuts', - 'scuzz', - 'scyes', - 'sdayn', - 'sdein', - 'seals', - 'seame', - 'seams', - 'seamy', - 'seans', - 'seare', - 'sears', - 'sease', - 'seats', - 'seaze', - 'sebum', - 'secco', - 'sechs', - 'sects', - 'seder', - 'sedes', - 'sedge', - 'sedgy', - 'sedum', - 'seeds', - 'seeks', - 'seeld', - 'seels', - 'seely', - 'seems', - 'seeps', - 'seepy', - 'seers', - 'sefer', - 'segar', - 'segni', - 'segno', - 'segol', - 'segos', - 'sehri', - 'seifs', - 'seils', - 'seine', - 'seirs', - 'seise', - 'seism', - 'seity', - 'seiza', - 'sekos', - 'sekts', - 'selah', - 'seles', - 'selfs', - 'sella', - 'selle', - 'sells', - 'selva', - 'semee', - 'semes', - 'semie', - 'semis', - 'senas', - 'sends', - 'senes', - 'sengi', - 'senna', - 'senor', - 'sensa', - 'sensi', - 'sente', - 'senti', - 'sents', - 'senvy', - 'senza', - 'sepad', - 'sepal', - 'sepic', - 'sepoy', - 'septa', - 'septs', - 'serac', - 'serai', - 'seral', - 'sered', - 'serer', - 'seres', - 'serfs', - 'serge', - 'seric', - 'serin', - 'serks', - 'seron', - 'serow', - 'serra', - 'serre', - 'serrs', - 'serry', - 'servo', - 'sesey', - 'sessa', - 'setae', - 'setal', - 'seton', - 'setts', - 'sewan', - 'sewar', - 'sewed', - 'sewel', - 'sewen', - 'sewin', - 'sexed', - 'sexer', - 'sexes', - 'sexto', - 'sexts', - 'seyen', - 'shads', - 'shags', - 'shahs', - 'shako', - 'shakt', - 'shalm', - 'shaly', - 'shama', - 'shams', - 'shand', - 'shans', - 'shaps', - 'sharn', - 'shash', - 'shaul', - 'shawm', - 'shawn', - 'shaws', - 'shaya', - 'shays', - 'shchi', - 'sheaf', - 'sheal', - 'sheas', - 'sheds', - 'sheel', - 'shend', - 'shent', - 'sheol', - 'sherd', - 'shere', - 'shero', - 'shets', - 'sheva', - 'shewn', - 'shews', - 'shiai', - 'shiel', - 'shier', - 'shies', - 'shill', - 'shily', - 'shims', - 'shins', - 'ships', - 'shirr', - 'shirs', - 'shish', - 'shiso', - 'shist', - 'shite', - 'shits', - 'shiur', - 'shiva', - 'shive', - 'shivs', - 'shlep', - 'shlub', - 'shmek', - 'shmoe', - 'shoat', - 'shoed', - 'shoer', - 'shoes', - 'shogi', - 'shogs', - 'shoji', - 'shojo', - 'shola', - 'shool', - 'shoon', - 'shoos', - 'shope', - 'shops', - 'shorl', - 'shote', - 'shots', - 'shott', - 'showd', - 'shows', - 'shoyu', - 'shred', - 'shris', - 'shrow', - 'shtik', - 'shtum', - 'shtup', - 'shule', - 'shuln', - 'shuls', - 'shuns', - 'shura', - 'shute', - 'shuts', - 'shwas', - 'shyer', - 'sials', - 'sibbs', - 'sibyl', - 'sices', - 'sicht', - 'sicko', - 'sicks', - 'sicky', - 'sidas', - 'sided', - 'sider', - 'sides', - 'sidha', - 'sidhe', - 'sidle', - 'sield', - 'siens', - 'sient', - 'sieth', - 'sieur', - 'sifts', - 'sighs', - 'sigil', - 'sigla', - 'signa', - 'signs', - 'sijos', - 'sikas', - 'siker', - 'sikes', - 'silds', - 'siled', - 'silen', - 'siler', - 'siles', - 'silex', - 'silks', - 'sills', - 'silos', - 'silts', - 'silty', - 'silva', - 'simar', - 'simas', - 'simba', - 'simis', - 'simps', - 'simul', - 'sinds', - 'sined', - 'sines', - 'sings', - 'sinhs', - 'sinks', - 'sinky', - 'sinus', - 'siped', - 'sipes', - 'sippy', - 'sired', - 'siree', - 'sires', - 'sirih', - 'siris', - 'siroc', - 'sirra', - 'sirup', - 'sisal', - 'sises', - 'sista', - 'sists', - 'sitar', - 'sited', - 'sites', - 'sithe', - 'sitka', - 'situp', - 'situs', - 'siver', - 'sixer', - 'sixes', - 'sixmo', - 'sixte', - 'sizar', - 'sized', - 'sizel', - 'sizer', - 'sizes', - 'skags', - 'skail', - 'skald', - 'skank', - 'skart', - 'skats', - 'skatt', - 'skaws', - 'skean', - 'skear', - 'skeds', - 'skeed', - 'skeef', - 'skeen', - 'skeer', - 'skees', - 'skeet', - 'skegg', - 'skegs', - 'skein', - 'skelf', - 'skell', - 'skelm', - 'skelp', - 'skene', - 'skens', - 'skeos', - 'skeps', - 'skers', - 'skets', - 'skews', - 'skids', - 'skied', - 'skies', - 'skiey', - 'skimo', - 'skims', - 'skink', - 'skins', - 'skint', - 'skios', - 'skips', - 'skirl', - 'skirr', - 'skite', - 'skits', - 'skive', - 'skivy', - 'sklim', - 'skoal', - 'skody', - 'skoff', - 'skogs', - 'skols', - 'skool', - 'skort', - 'skosh', - 'skran', - 'skrik', - 'skuas', - 'skugs', - 'skyed', - 'skyer', - 'skyey', - 'skyfs', - 'skyre', - 'skyrs', - 'skyte', - 'slabs', - 'slade', - 'slaes', - 'slags', - 'slaid', - 'slake', - 'slams', - 'slane', - 'slank', - 'slaps', - 'slart', - 'slats', - 'slaty', - 'slaws', - 'slays', - 'slebs', - 'sleds', - 'sleer', - 'slews', - 'sleys', - 'slier', - 'slily', - 'slims', - 'slipe', - 'slips', - 'slipt', - 'slish', - 'slits', - 'slive', - 'sloan', - 'slobs', - 'sloes', - 'slogs', - 'sloid', - 'slojd', - 'slomo', - 'sloom', - 'sloot', - 'slops', - 'slopy', - 'slorm', - 'slots', - 'slove', - 'slows', - 'sloyd', - 'slubb', - 'slubs', - 'slued', - 'slues', - 'sluff', - 'slugs', - 'sluit', - 'slums', - 'slurb', - 'slurs', - 'sluse', - 'sluts', - 'slyer', - 'slype', - 'smaak', - 'smaik', - 'smalm', - 'smalt', - 'smarm', - 'smaze', - 'smeek', - 'smees', - 'smeik', - 'smeke', - 'smerk', - 'smews', - 'smirr', - 'smirs', - 'smits', - 'smogs', - 'smoko', - 'smolt', - 'smoor', - 'smoot', - 'smore', - 'smorg', - 'smout', - 'smowt', - 'smugs', - 'smurs', - 'smush', - 'smuts', - 'snabs', - 'snafu', - 'snags', - 'snaps', - 'snarf', - 'snark', - 'snars', - 'snary', - 'snash', - 'snath', - 'snaws', - 'snead', - 'sneap', - 'snebs', - 'sneck', - 'sneds', - 'sneed', - 'snees', - 'snell', - 'snibs', - 'snick', - 'snies', - 'snift', - 'snigs', - 'snips', - 'snipy', - 'snirt', - 'snits', - 'snobs', - 'snods', - 'snoek', - 'snoep', - 'snogs', - 'snoke', - 'snood', - 'snook', - 'snool', - 'snoot', - 'snots', - 'snowk', - 'snows', - 'snubs', - 'snugs', - 'snush', - 'snyes', - 'soaks', - 'soaps', - 'soare', - 'soars', - 'soave', - 'sobas', - 'socas', - 'soces', - 'socko', - 'socks', - 'socle', - 'sodas', - 'soddy', - 'sodic', - 'sodom', - 'sofar', - 'sofas', - 'softa', - 'softs', - 'softy', - 'soger', - 'sohur', - 'soils', - 'soily', - 'sojas', - 'sojus', - 'sokah', - 'soken', - 'sokes', - 'sokol', - 'solah', - 'solan', - 'solas', - 'solde', - 'soldi', - 'soldo', - 'solds', - 'soled', - 'solei', - 'soler', - 'soles', - 'solon', - 'solos', - 'solum', - 'solus', - 'soman', - 'somas', - 'sonce', - 'sonde', - 'sones', - 'songs', - 'sonly', - 'sonne', - 'sonny', - 'sonse', - 'sonsy', - 'sooey', - 'sooks', - 'sooky', - 'soole', - 'sools', - 'sooms', - 'soops', - 'soote', - 'soots', - 'sophs', - 'sophy', - 'sopor', - 'soppy', - 'sopra', - 'soral', - 'soras', - 'sorbo', - 'sorbs', - 'sorda', - 'sordo', - 'sords', - 'sored', - 'soree', - 'sorel', - 'sorer', - 'sores', - 'sorex', - 'sorgo', - 'sorns', - 'sorra', - 'sorta', - 'sorts', - 'sorus', - 'soths', - 'sotol', - 'souce', - 'souct', - 'sough', - 'souks', - 'souls', - 'soums', - 'soups', - 'soupy', - 'sours', - 'souse', - 'souts', - 'sowar', - 'sowce', - 'sowed', - 'sowff', - 'sowfs', - 'sowle', - 'sowls', - 'sowms', - 'sownd', - 'sowne', - 'sowps', - 'sowse', - 'sowth', - 'soyas', - 'soyle', - 'soyuz', - 'sozin', - 'spacy', - 'spado', - 'spaed', - 'spaer', - 'spaes', - 'spags', - 'spahi', - 'spail', - 'spain', - 'spait', - 'spake', - 'spald', - 'spale', - 'spall', - 'spalt', - 'spams', - 'spane', - 'spang', - 'spans', - 'spard', - 'spars', - 'spart', - 'spate', - 'spats', - 'spaul', - 'spawl', - 'spaws', - 'spayd', - 'spays', - 'spaza', - 'spazz', - 'speal', - 'spean', - 'speat', - 'specs', - 'spect', - 'speel', - 'speer', - 'speil', - 'speir', - 'speks', - 'speld', - 'spelk', - 'speos', - 'spets', - 'speug', - 'spews', - 'spewy', - 'spial', - 'spica', - 'spick', - 'spics', - 'spide', - 'spier', - 'spies', - 'spiff', - 'spifs', - 'spiks', - 'spile', - 'spims', - 'spina', - 'spink', - 'spins', - 'spirt', - 'spiry', - 'spits', - 'spitz', - 'spivs', - 'splay', - 'splog', - 'spode', - 'spods', - 'spoom', - 'spoor', - 'spoot', - 'spork', - 'sposh', - 'spots', - 'sprad', - 'sprag', - 'sprat', - 'spred', - 'sprew', - 'sprit', - 'sprod', - 'sprog', - 'sprue', - 'sprug', - 'spuds', - 'spued', - 'spuer', - 'spues', - 'spugs', - 'spule', - 'spume', - 'spumy', - 'spurs', - 'sputa', - 'spyal', - 'spyre', - 'squab', - 'squaw', - 'squeg', - 'squid', - 'squit', - 'squiz', - 'stabs', - 'stade', - 'stags', - 'stagy', - 'staig', - 'stane', - 'stang', - 'staph', - 'staps', - 'starn', - 'starr', - 'stars', - 'stats', - 'staun', - 'staws', - 'stays', - 'stean', - 'stear', - 'stedd', - 'stede', - 'steds', - 'steek', - 'steem', - 'steen', - 'steil', - 'stela', - 'stele', - 'stell', - 'steme', - 'stems', - 'stend', - 'steno', - 'stens', - 'stent', - 'steps', - 'stept', - 'stere', - 'stets', - 'stews', - 'stewy', - 'steys', - 'stich', - 'stied', - 'sties', - 'stilb', - 'stile', - 'stime', - 'stims', - 'stimy', - 'stipa', - 'stipe', - 'stire', - 'stirk', - 'stirp', - 'stirs', - 'stive', - 'stivy', - 'stoae', - 'stoai', - 'stoas', - 'stoat', - 'stobs', - 'stoep', - 'stogy', - 'stoit', - 'stoln', - 'stoma', - 'stond', - 'stong', - 'stonk', - 'stonn', - 'stook', - 'stoor', - 'stope', - 'stops', - 'stopt', - 'stoss', - 'stots', - 'stott', - 'stoun', - 'stoup', - 'stour', - 'stown', - 'stowp', - 'stows', - 'strad', - 'strae', - 'strag', - 'strak', - 'strep', - 'strew', - 'stria', - 'strig', - 'strim', - 'strop', - 'strow', - 'stroy', - 'strum', - 'stubs', - 'stude', - 'studs', - 'stull', - 'stulm', - 'stumm', - 'stums', - 'stuns', - 'stupa', - 'stupe', - 'sture', - 'sturt', - 'styed', - 'styes', - 'styli', - 'stylo', - 'styme', - 'stymy', - 'styre', - 'styte', - 'subah', - 'subas', - 'subby', - 'suber', - 'subha', - 'succi', - 'sucks', - 'sucky', - 'sucre', - 'sudds', - 'sudor', - 'sudsy', - 'suede', - 'suent', - 'suers', - 'suete', - 'suets', - 'suety', - 'sugan', - 'sughs', - 'sugos', - 'suhur', - 'suids', - 'suint', - 'suits', - 'sujee', - 'sukhs', - 'sukuk', - 'sulci', - 'sulfa', - 'sulfo', - 'sulks', - 'sulph', - 'sulus', - 'sumis', - 'summa', - 'sumos', - 'sumph', - 'sumps', - 'sunis', - 'sunks', - 'sunna', - 'sunns', - 'sunup', - 'supes', - 'supra', - 'surah', - 'sural', - 'suras', - 'surat', - 'surds', - 'sured', - 'sures', - 'surfs', - 'surfy', - 'surgy', - 'surra', - 'sused', - 'suses', - 'susus', - 'sutor', - 'sutra', - 'sutta', - 'swabs', - 'swack', - 'swads', - 'swage', - 'swags', - 'swail', - 'swain', - 'swale', - 'swaly', - 'swamy', - 'swang', - 'swank', - 'swans', - 'swaps', - 'swapt', - 'sward', - 'sware', - 'swarf', - 'swart', - 'swats', - 'swayl', - 'sways', - 'sweal', - 'swede', - 'sweed', - 'sweel', - 'sweer', - 'swees', - 'sweir', - 'swelt', - 'swerf', - 'sweys', - 'swies', - 'swigs', - 'swile', - 'swims', - 'swink', - 'swipe', - 'swire', - 'swiss', - 'swith', - 'swits', - 'swive', - 'swizz', - 'swobs', - 'swole', - 'swoln', - 'swops', - 'swopt', - 'swots', - 'swoun', - 'sybbe', - 'sybil', - 'syboe', - 'sybow', - 'sycee', - 'syces', - 'sycon', - 'syens', - 'syker', - 'sykes', - 'sylis', - 'sylph', - 'sylva', - 'symar', - 'synch', - 'syncs', - 'synds', - 'syned', - 'synes', - 'synth', - 'syped', - 'sypes', - 'syphs', - 'syrah', - 'syren', - 'sysop', - 'sythe', - 'syver', - 'taals', - 'taata', - 'taber', - 'tabes', - 'tabid', - 'tabis', - 'tabla', - 'tabor', - 'tabun', - 'tabus', - 'tacan', - 'taces', - 'tacet', - 'tache', - 'tacho', - 'tachs', - 'tacks', - 'tacos', - 'tacts', - 'taels', - 'tafia', - 'taggy', - 'tagma', - 'tahas', - 'tahrs', - 'taiga', - 'taigs', - 'taiko', - 'tails', - 'tains', - 'taira', - 'taish', - 'taits', - 'tajes', - 'takas', - 'takes', - 'takhi', - 'takin', - 'takis', - 'takky', - 'talak', - 'talaq', - 'talar', - 'talas', - 'talcs', - 'talcy', - 'talea', - 'taler', - 'tales', - 'talks', - 'talky', - 'talls', - 'talma', - 'talpa', - 'taluk', - 'talus', - 'tamal', - 'tamed', - 'tames', - 'tamin', - 'tamis', - 'tammy', - 'tamps', - 'tanas', - 'tanga', - 'tangi', - 'tangs', - 'tanhs', - 'tanka', - 'tanks', - 'tanky', - 'tanna', - 'tansy', - 'tanti', - 'tanto', - 'tanty', - 'tapas', - 'taped', - 'tapen', - 'tapes', - 'tapet', - 'tapis', - 'tappa', - 'tapus', - 'taras', - 'tardo', - 'tared', - 'tares', - 'targa', - 'targe', - 'tarns', - 'taroc', - 'tarok', - 'taros', - 'tarps', - 'tarre', - 'tarry', - 'tarsi', - 'tarts', - 'tarty', - 'tasar', - 'tased', - 'taser', - 'tases', - 'tasks', - 'tassa', - 'tasse', - 'tasso', - 'tatar', - 'tater', - 'tates', - 'taths', - 'tatie', - 'tatou', - 'tatts', - 'tatus', - 'taube', - 'tauld', - 'tauon', - 'taupe', - 'tauts', - 'tavah', - 'tavas', - 'taver', - 'tawai', - 'tawas', - 'tawed', - 'tawer', - 'tawie', - 'tawse', - 'tawts', - 'taxed', - 'taxer', - 'taxes', - 'taxis', - 'taxol', - 'taxon', - 'taxor', - 'taxus', - 'tayra', - 'tazza', - 'tazze', - 'teade', - 'teads', - 'teaed', - 'teaks', - 'teals', - 'teams', - 'tears', - 'teats', - 'teaze', - 'techs', - 'techy', - 'tecta', - 'teels', - 'teems', - 'teend', - 'teene', - 'teens', - 'teeny', - 'teers', - 'teffs', - 'teggs', - 'tegua', - 'tegus', - 'tehrs', - 'teiid', - 'teils', - 'teind', - 'teins', - 'telae', - 'telco', - 'teles', - 'telex', - 'telia', - 'telic', - 'tells', - 'telly', - 'teloi', - 'telos', - 'temed', - 'temes', - 'tempi', - 'temps', - 'tempt', - 'temse', - 'tench', - 'tends', - 'tendu', - 'tenes', - 'tenge', - 'tenia', - 'tenne', - 'tenno', - 'tenny', - 'tenon', - 'tents', - 'tenty', - 'tenue', - 'tepal', - 'tepas', - 'tepoy', - 'terai', - 'teras', - 'terce', - 'terek', - 'teres', - 'terfe', - 'terfs', - 'terga', - 'terms', - 'terne', - 'terns', - 'terry', - 'terts', - 'tesla', - 'testa', - 'teste', - 'tests', - 'tetes', - 'teths', - 'tetra', - 'tetri', - 'teuch', - 'teugh', - 'tewed', - 'tewel', - 'tewit', - 'texas', - 'texes', - 'texts', - 'thack', - 'thagi', - 'thaim', - 'thale', - 'thali', - 'thana', - 'thane', - 'thang', - 'thans', - 'thanx', - 'tharm', - 'thars', - 'thaws', - 'thawy', - 'thebe', - 'theca', - 'theed', - 'theek', - 'thees', - 'thegn', - 'theic', - 'thein', - 'thelf', - 'thema', - 'thens', - 'theow', - 'therm', - 'thesp', - 'thete', - 'thews', - 'thewy', - 'thigs', - 'thilk', - 'thill', - 'thine', - 'thins', - 'thiol', - 'thirl', - 'thoft', - 'thole', - 'tholi', - 'thoro', - 'thorp', - 'thous', - 'thowl', - 'thrae', - 'thraw', - 'thrid', - 'thrip', - 'throe', - 'thuds', - 'thugs', - 'thuja', - 'thunk', - 'thurl', - 'thuya', - 'thymi', - 'thymy', - 'tians', - 'tiars', - 'tical', - 'ticca', - 'ticed', - 'tices', - 'tichy', - 'ticks', - 'ticky', - 'tiddy', - 'tided', - 'tides', - 'tiers', - 'tiffs', - 'tifos', - 'tifts', - 'tiges', - 'tigon', - 'tikas', - 'tikes', - 'tikis', - 'tikka', - 'tilak', - 'tiled', - 'tiler', - 'tiles', - 'tills', - 'tilly', - 'tilth', - 'tilts', - 'timbo', - 'timed', - 'times', - 'timon', - 'timps', - 'tinas', - 'tinct', - 'tinds', - 'tinea', - 'tined', - 'tines', - 'tinge', - 'tings', - 'tinks', - 'tinny', - 'tints', - 'tinty', - 'tipis', - 'tippy', - 'tired', - 'tires', - 'tirls', - 'tiros', - 'tirrs', - 'titch', - 'titer', - 'titis', - 'titre', - 'titty', - 'titup', - 'tiyin', - 'tiyns', - 'tizes', - 'tizzy', - 'toads', - 'toady', - 'toaze', - 'tocks', - 'tocky', - 'tocos', - 'todde', - 'toeas', - 'toffs', - 'toffy', - 'tofts', - 'tofus', - 'togae', - 'togas', - 'toged', - 'toges', - 'togue', - 'tohos', - 'toile', - 'toils', - 'toing', - 'toise', - 'toits', - 'tokay', - 'toked', - 'toker', - 'tokes', - 'tokos', - 'tolan', - 'tolar', - 'tolas', - 'toled', - 'toles', - 'tolls', - 'tolly', - 'tolts', - 'tolus', - 'tolyl', - 'toman', - 'tombs', - 'tomes', - 'tomia', - 'tommy', - 'tomos', - 'tondi', - 'tondo', - 'toned', - 'toner', - 'tones', - 'toney', - 'tongs', - 'tonka', - 'tonks', - 'tonne', - 'tonus', - 'tools', - 'tooms', - 'toons', - 'toots', - 'toped', - 'topee', - 'topek', - 'toper', - 'topes', - 'tophe', - 'tophi', - 'tophs', - 'topis', - 'topoi', - 'topos', - 'toppy', - 'toque', - 'torah', - 'toran', - 'toras', - 'torcs', - 'tores', - 'toric', - 'torii', - 'toros', - 'torot', - 'torrs', - 'torse', - 'torsi', - 'torsk', - 'torta', - 'torte', - 'torts', - 'tosas', - 'tosed', - 'toses', - 'toshy', - 'tossy', - 'toted', - 'toter', - 'totes', - 'totty', - 'touks', - 'touns', - 'tours', - 'touse', - 'tousy', - 'touts', - 'touze', - 'touzy', - 'towed', - 'towie', - 'towns', - 'towny', - 'towse', - 'towsy', - 'towts', - 'towze', - 'towzy', - 'toyed', - 'toyer', - 'toyon', - 'toyos', - 'tozed', - 'tozes', - 'tozie', - 'trabs', - 'trads', - 'tragi', - 'traik', - 'trams', - 'trank', - 'tranq', - 'trans', - 'trant', - 'trape', - 'traps', - 'trapt', - 'trass', - 'trats', - 'tratt', - 'trave', - 'trayf', - 'trays', - 'treck', - 'treed', - 'treen', - 'trees', - 'trefa', - 'treif', - 'treks', - 'trema', - 'trems', - 'tress', - 'trest', - 'trets', - 'trews', - 'treyf', - 'treys', - 'triac', - 'tride', - 'trier', - 'tries', - 'triff', - 'trigo', - 'trigs', - 'trike', - 'trild', - 'trill', - 'trims', - 'trine', - 'trins', - 'triol', - 'trior', - 'trios', - 'trips', - 'tripy', - 'trist', - 'troad', - 'troak', - 'troat', - 'trock', - 'trode', - 'trods', - 'trogs', - 'trois', - 'troke', - 'tromp', - 'trona', - 'tronc', - 'trone', - 'tronk', - 'trons', - 'trooz', - 'troth', - 'trots', - 'trows', - 'troys', - 'trued', - 'trues', - 'trugo', - 'trugs', - 'trull', - 'tryer', - 'tryke', - 'tryma', - 'tryps', - 'tsade', - 'tsadi', - 'tsars', - 'tsked', - 'tsuba', - 'tsubo', - 'tuans', - 'tuart', - 'tuath', - 'tubae', - 'tubar', - 'tubas', - 'tubby', - 'tubed', - 'tubes', - 'tucks', - 'tufas', - 'tuffe', - 'tuffs', - 'tufts', - 'tufty', - 'tugra', - 'tuile', - 'tuina', - 'tuism', - 'tuktu', - 'tules', - 'tulpa', - 'tulsi', - 'tumid', - 'tummy', - 'tumps', - 'tumpy', - 'tunas', - 'tunds', - 'tuned', - 'tuner', - 'tunes', - 'tungs', - 'tunny', - 'tupek', - 'tupik', - 'tuple', - 'tuque', - 'turds', - 'turfs', - 'turfy', - 'turks', - 'turme', - 'turms', - 'turns', - 'turnt', - 'turps', - 'turrs', - 'tushy', - 'tusks', - 'tusky', - 'tutee', - 'tutti', - 'tutty', - 'tutus', - 'tuxes', - 'tuyer', - 'twaes', - 'twain', - 'twals', - 'twank', - 'twats', - 'tways', - 'tweel', - 'tween', - 'tweep', - 'tweer', - 'twerk', - 'twerp', - 'twier', - 'twigs', - 'twill', - 'twilt', - 'twink', - 'twins', - 'twiny', - 'twire', - 'twirp', - 'twite', - 'twits', - 'twoer', - 'twyer', - 'tyees', - 'tyers', - 'tyiyn', - 'tykes', - 'tyler', - 'tymps', - 'tynde', - 'tyned', - 'tynes', - 'typal', - 'typed', - 'types', - 'typey', - 'typic', - 'typos', - 'typps', - 'typto', - 'tyran', - 'tyred', - 'tyres', - 'tyros', - 'tythe', - 'tzars', - 'udals', - 'udons', - 'ugali', - 'ugged', - 'uhlan', - 'uhuru', - 'ukase', - 'ulama', - 'ulans', - 'ulema', - 'ulmin', - 'ulnad', - 'ulnae', - 'ulnar', - 'ulnas', - 'ulpan', - 'ulvas', - 'ulyie', - 'ulzie', - 'umami', - 'umbel', - 'umber', - 'umble', - 'umbos', - 'umbre', - 'umiac', - 'umiak', - 'umiaq', - 'ummah', - 'ummas', - 'ummed', - 'umped', - 'umphs', - 'umpie', - 'umpty', - 'umrah', - 'umras', - 'unais', - 'unapt', - 'unarm', - 'unary', - 'unaus', - 'unbag', - 'unban', - 'unbar', - 'unbed', - 'unbid', - 'unbox', - 'uncap', - 'unces', - 'uncia', - 'uncos', - 'uncoy', - 'uncus', - 'undam', - 'undee', - 'undos', - 'undug', - 'uneth', - 'unfix', - 'ungag', - 'unget', - 'ungod', - 'ungot', - 'ungum', - 'unhat', - 'unhip', - 'unica', - 'units', - 'unjam', - 'unked', - 'unket', - 'unkid', - 'unlaw', - 'unlay', - 'unled', - 'unlet', - 'unlid', - 'unman', - 'unmew', - 'unmix', - 'unpay', - 'unpeg', - 'unpen', - 'unpin', - 'unred', - 'unrid', - 'unrig', - 'unrip', - 'unsaw', - 'unsay', - 'unsee', - 'unsew', - 'unsex', - 'unsod', - 'untax', - 'untin', - 'unwet', - 'unwit', - 'unwon', - 'upbow', - 'upbye', - 'updos', - 'updry', - 'upend', - 'upjet', - 'uplay', - 'upled', - 'uplit', - 'upped', - 'upran', - 'uprun', - 'upsee', - 'upsey', - 'uptak', - 'upter', - 'uptie', - 'uraei', - 'urali', - 'uraos', - 'urare', - 'urari', - 'urase', - 'urate', - 'urbex', - 'urbia', - 'urdee', - 'ureal', - 'ureas', - 'uredo', - 'ureic', - 'urena', - 'urent', - 'urged', - 'urger', - 'urges', - 'urial', - 'urite', - 'urman', - 'urnal', - 'urned', - 'urped', - 'ursae', - 'ursid', - 'urson', - 'urubu', - 'urvas', - 'users', - 'usnea', - 'usque', - 'usure', - 'usury', - 'uteri', - 'uveal', - 'uveas', - 'uvula', - 'vacua', - 'vaded', - 'vades', - 'vagal', - 'vagus', - 'vails', - 'vaire', - 'vairs', - 'vairy', - 'vakas', - 'vakil', - 'vales', - 'valis', - 'valse', - 'vamps', - 'vampy', - 'vanda', - 'vaned', - 'vanes', - 'vangs', - 'vants', - 'vaped', - 'vaper', - 'vapes', - 'varan', - 'varas', - 'vardy', - 'varec', - 'vares', - 'varia', - 'varix', - 'varna', - 'varus', - 'varve', - 'vasal', - 'vases', - 'vasts', - 'vasty', - 'vatic', - 'vatus', - 'vauch', - 'vaute', - 'vauts', - 'vawte', - 'vaxes', - 'veale', - 'veals', - 'vealy', - 'veena', - 'veeps', - 'veers', - 'veery', - 'vegas', - 'veges', - 'vegie', - 'vegos', - 'vehme', - 'veils', - 'veily', - 'veins', - 'veiny', - 'velar', - 'velds', - 'veldt', - 'veles', - 'vells', - 'velum', - 'venae', - 'venal', - 'vends', - 'vendu', - 'veney', - 'venge', - 'venin', - 'vents', - 'venus', - 'verbs', - 'verra', - 'verry', - 'verst', - 'verts', - 'vertu', - 'vespa', - 'vesta', - 'vests', - 'vetch', - 'vexed', - 'vexer', - 'vexes', - 'vexil', - 'vezir', - 'vials', - 'viand', - 'vibes', - 'vibex', - 'vibey', - 'viced', - 'vices', - 'vichy', - 'viers', - 'views', - 'viewy', - 'vifda', - 'viffs', - 'vigas', - 'vigia', - 'vilde', - 'viler', - 'villi', - 'vills', - 'vimen', - 'vinal', - 'vinas', - 'vinca', - 'vined', - 'viner', - 'vines', - 'vinew', - 'vinic', - 'vinos', - 'vints', - 'viold', - 'viols', - 'vired', - 'vireo', - 'vires', - 'virga', - 'virge', - 'virid', - 'virls', - 'virtu', - 'visas', - 'vised', - 'vises', - 'visie', - 'visne', - 'vison', - 'visto', - 'vitae', - 'vitas', - 'vitex', - 'vitro', - 'vitta', - 'vivas', - 'vivat', - 'vivda', - 'viver', - 'vives', - 'vizir', - 'vizor', - 'vleis', - 'vlies', - 'vlogs', - 'voars', - 'vocab', - 'voces', - 'voddy', - 'vodou', - 'vodun', - 'voema', - 'vogie', - 'voids', - 'voile', - 'voips', - 'volae', - 'volar', - 'voled', - 'voles', - 'volet', - 'volks', - 'volta', - 'volte', - 'volti', - 'volts', - 'volva', - 'volve', - 'vomer', - 'voted', - 'votes', - 'vouge', - 'voulu', - 'vowed', - 'vower', - 'voxel', - 'vozhd', - 'vraic', - 'vrils', - 'vroom', - 'vrous', - 'vrouw', - 'vrows', - 'vuggs', - 'vuggy', - 'vughs', - 'vughy', - 'vulgo', - 'vulns', - 'vulva', - 'vutty', - 'waacs', - 'wacke', - 'wacko', - 'wacks', - 'wadds', - 'waddy', - 'waded', - 'wader', - 'wades', - 'wadge', - 'wadis', - 'wadts', - 'waffs', - 'wafts', - 'waged', - 'wages', - 'wagga', - 'wagyu', - 'wahoo', - 'waide', - 'waifs', - 'waift', - 'wails', - 'wains', - 'wairs', - 'waite', - 'waits', - 'wakas', - 'waked', - 'waken', - 'waker', - 'wakes', - 'wakfs', - 'waldo', - 'walds', - 'waled', - 'waler', - 'wales', - 'walie', - 'walis', - 'walks', - 'walla', - 'walls', - 'wally', - 'walty', - 'wamed', - 'wames', - 'wamus', - 'wands', - 'waned', - 'wanes', - 'waney', - 'wangs', - 'wanks', - 'wanky', - 'wanle', - 'wanly', - 'wanna', - 'wants', - 'wanty', - 'wanze', - 'waqfs', - 'warbs', - 'warby', - 'wards', - 'wared', - 'wares', - 'warez', - 'warks', - 'warms', - 'warns', - 'warps', - 'warre', - 'warst', - 'warts', - 'wases', - 'washy', - 'wasms', - 'wasps', - 'waspy', - 'wasts', - 'watap', - 'watts', - 'wauff', - 'waugh', - 'wauks', - 'waulk', - 'wauls', - 'waurs', - 'waved', - 'waves', - 'wavey', - 'wawas', - 'wawes', - 'wawls', - 'waxed', - 'waxer', - 'waxes', - 'wayed', - 'wazir', - 'wazoo', - 'weald', - 'weals', - 'weamb', - 'weans', - 'wears', - 'webby', - 'weber', - 'wecht', - 'wedel', - 'wedgy', - 'weeds', - 'weeke', - 'weeks', - 'weels', - 'weems', - 'weens', - 'weeny', - 'weeps', - 'weepy', - 'weest', - 'weete', - 'weets', - 'wefte', - 'wefts', - 'weids', - 'weils', - 'weirs', - 'weise', - 'weize', - 'wekas', - 'welds', - 'welke', - 'welks', - 'welkt', - 'wells', - 'welly', - 'welts', - 'wembs', - 'wends', - 'wenge', - 'wenny', - 'wents', - 'weros', - 'wersh', - 'wests', - 'wetas', - 'wetly', - 'wexed', - 'wexes', - 'whamo', - 'whams', - 'whang', - 'whaps', - 'whare', - 'whata', - 'whats', - 'whaup', - 'whaur', - 'wheal', - 'whear', - 'wheen', - 'wheep', - 'wheft', - 'whelk', - 'whelm', - 'whens', - 'whets', - 'whews', - 'wheys', - 'whids', - 'whift', - 'whigs', - 'whilk', - 'whims', - 'whins', - 'whios', - 'whips', - 'whipt', - 'whirr', - 'whirs', - 'whish', - 'whiss', - 'whist', - 'whits', - 'whity', - 'whizz', - 'whomp', - 'whoof', - 'whoot', - 'whops', - 'whore', - 'whorl', - 'whort', - 'whoso', - 'whows', - 'whump', - 'whups', - 'whyda', - 'wicca', - 'wicks', - 'wicky', - 'widdy', - 'wides', - 'wiels', - 'wifed', - 'wifes', - 'wifey', - 'wifie', - 'wifty', - 'wigan', - 'wigga', - 'wiggy', - 'wikis', - 'wilco', - 'wilds', - 'wiled', - 'wiles', - 'wilga', - 'wilis', - 'wilja', - 'wills', - 'wilts', - 'wimps', - 'winds', - 'wined', - 'wines', - 'winey', - 'winge', - 'wings', - 'wingy', - 'winks', - 'winna', - 'winns', - 'winos', - 'winze', - 'wiped', - 'wiper', - 'wipes', - 'wired', - 'wirer', - 'wires', - 'wirra', - 'wised', - 'wises', - 'wisha', - 'wisht', - 'wisps', - 'wists', - 'witan', - 'wited', - 'wites', - 'withe', - 'withs', - 'withy', - 'wived', - 'wiver', - 'wives', - 'wizen', - 'wizes', - 'woads', - 'woald', - 'wocks', - 'wodge', - 'woful', - 'wojus', - 'woker', - 'wokka', - 'wolds', - 'wolfs', - 'wolly', - 'wolve', - 'wombs', - 'womby', - 'womyn', - 'wonga', - 'wongi', - 'wonks', - 'wonky', - 'wonts', - 'woods', - 'wooed', - 'woofs', - 'woofy', - 'woold', - 'wools', - 'woons', - 'woops', - 'woopy', - 'woose', - 'woosh', - 'wootz', - 'words', - 'works', - 'worms', - 'wormy', - 'worts', - 'wowed', - 'wowee', - 'woxen', - 'wrang', - 'wraps', - 'wrapt', - 'wrast', - 'wrate', - 'wrawl', - 'wrens', - 'wrick', - 'wried', - 'wrier', - 'wries', - 'writs', - 'wroke', - 'wroot', - 'wroth', - 'wryer', - 'wuddy', - 'wudus', - 'wulls', - 'wurst', - 'wuses', - 'wushu', - 'wussy', - 'wuxia', - 'wyled', - 'wyles', - 'wynds', - 'wynns', - 'wyted', - 'wytes', - 'xebec', - 'xenia', - 'xenic', - 'xenon', - 'xeric', - 'xerox', - 'xerus', - 'xoana', - 'xrays', - 'xylan', - 'xylem', - 'xylic', - 'xylol', - 'xylyl', - 'xysti', - 'xysts', - 'yaars', - 'yabas', - 'yabba', - 'yabby', - 'yacca', - 'yacka', - 'yacks', - 'yaffs', - 'yager', - 'yages', - 'yagis', - 'yahoo', - 'yaird', - 'yakka', - 'yakow', - 'yales', - 'yamen', - 'yampy', - 'yamun', - 'yangs', - 'yanks', - 'yapok', - 'yapon', - 'yapps', - 'yappy', - 'yarak', - 'yarco', - 'yards', - 'yarer', - 'yarfa', - 'yarks', - 'yarns', - 'yarrs', - 'yarta', - 'yarto', - 'yates', - 'yauds', - 'yauld', - 'yaups', - 'yawed', - 'yawey', - 'yawls', - 'yawns', - 'yawny', - 'yawps', - 'ybore', - 'yclad', - 'ycled', - 'ycond', - 'ydrad', - 'ydred', - 'yeads', - 'yeahs', - 'yealm', - 'yeans', - 'yeard', - 'years', - 'yecch', - 'yechs', - 'yechy', - 'yedes', - 'yeeds', - 'yeesh', - 'yeggs', - 'yelks', - 'yells', - 'yelms', - 'yelps', - 'yelts', - 'yenta', - 'yente', - 'yerba', - 'yerds', - 'yerks', - 'yeses', - 'yesks', - 'yests', - 'yesty', - 'yetis', - 'yetts', - 'yeuks', - 'yeuky', - 'yeven', - 'yeves', - 'yewen', - 'yexed', - 'yexes', - 'yfere', - 'yiked', - 'yikes', - 'yills', - 'yince', - 'yipes', - 'yippy', - 'yirds', - 'yirks', - 'yirrs', - 'yirth', - 'yites', - 'yitie', - 'ylems', - 'ylike', - 'ylkes', - 'ymolt', - 'ympes', - 'yobbo', - 'yobby', - 'yocks', - 'yodel', - 'yodhs', - 'yodle', - 'yogas', - 'yogee', - 'yoghs', - 'yogic', - 'yogin', - 'yogis', - 'yoick', - 'yojan', - 'yoked', - 'yokel', - 'yoker', - 'yokes', - 'yokul', - 'yolks', - 'yolky', - 'yomim', - 'yomps', - 'yonic', - 'yonis', - 'yonks', - 'yoofs', - 'yoops', - 'yores', - 'yorks', - 'yorps', - 'youks', - 'yourn', - 'yours', - 'yourt', - 'youse', - 'yowed', - 'yowes', - 'yowie', - 'yowls', - 'yowza', - 'yrapt', - 'yrent', - 'yrivd', - 'yrneh', - 'ysame', - 'ytost', - 'yuans', - 'yucas', - 'yucca', - 'yucch', - 'yucko', - 'yucks', - 'yucky', - 'yufts', - 'yugas', - 'yuked', - 'yukes', - 'yukky', - 'yukos', - 'yulan', - 'yules', - 'yummo', - 'yummy', - 'yumps', - 'yupon', - 'yuppy', - 'yurta', - 'yurts', - 'yuzus', - 'zabra', - 'zacks', - 'zaida', - 'zaidy', - 'zaire', - 'zakat', - 'zaman', - 'zambo', - 'zamia', - 'zanja', - 'zante', - 'zanza', - 'zanze', - 'zappy', - 'zarfs', - 'zaris', - 'zatis', - 'zaxes', - 'zayin', - 'zazen', - 'zeals', - 'zebec', - 'zebub', - 'zebus', - 'zedas', - 'zeins', - 'zendo', - 'zerda', - 'zerks', - 'zeros', - 'zests', - 'zetas', - 'zexes', - 'zezes', - 'zhomo', - 'zibet', - 'ziffs', - 'zigan', - 'zilas', - 'zilch', - 'zilla', - 'zills', - 'zimbi', - 'zimbs', - 'zinco', - 'zincs', - 'zincy', - 'zineb', - 'zines', - 'zings', - 'zingy', - 'zinke', - 'zinky', - 'zippo', - 'zippy', - 'ziram', - 'zitis', - 'zizel', - 'zizit', - 'zlote', - 'zloty', - 'zoaea', - 'zobos', - 'zobus', - 'zocco', - 'zoeae', - 'zoeal', - 'zoeas', - 'zoism', - 'zoist', - 'zombi', - 'zonae', - 'zonda', - 'zoned', - 'zoner', - 'zones', - 'zonks', - 'zooea', - 'zooey', - 'zooid', - 'zooks', - 'zooms', - 'zoons', - 'zooty', - 'zoppa', - 'zoppo', - 'zoril', - 'zoris', - 'zorro', - 'zouks', - 'zowee', - 'zowie', - 'zulus', - 'zupan', - 'zupas', - 'zuppa', - 'zurfs', - 'zuzim', - 'zygal', - 'zygon', - 'zymes', - 'zymic' -]); diff --git a/packages/create-svelte/templates/default/static/favicon.png b/packages/create-svelte/templates/default/static/favicon.png deleted file mode 100644 index 825b9e65af7c104cfb07089bb28659393b4f2097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH - - - - - - %sveltekit.head% - - -
%sveltekit.body%
- - diff --git a/packages/create-svelte/templates/skeleton/src/lib/index.ts b/packages/create-svelte/templates/skeleton/src/lib/index.ts deleted file mode 100644 index 856f2b6c38ae..000000000000 --- a/packages/create-svelte/templates/skeleton/src/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -// place files you want to import through the `$lib` alias in this folder. diff --git a/packages/create-svelte/templates/skeleton/src/routes/+page.svelte b/packages/create-svelte/templates/skeleton/src/routes/+page.svelte deleted file mode 100644 index 5982b0ae37dd..000000000000 --- a/packages/create-svelte/templates/skeleton/src/routes/+page.svelte +++ /dev/null @@ -1,2 +0,0 @@ -

Welcome to SvelteKit

-

Visit kit.svelte.dev to read the documentation

diff --git a/packages/create-svelte/templates/skeleton/static/favicon.png b/packages/create-svelte/templates/skeleton/static/favicon.png deleted file mode 100644 index 825b9e65af7c104cfb07089bb28659393b4f2097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH - - - - - - %sveltekit.head% - - -
%sveltekit.body%
- - diff --git a/packages/create-svelte/templates/skeletonlib/src/lib/index.ts b/packages/create-svelte/templates/skeletonlib/src/lib/index.ts deleted file mode 100644 index 47d3c46fb896..000000000000 --- a/packages/create-svelte/templates/skeletonlib/src/lib/index.ts +++ /dev/null @@ -1 +0,0 @@ -// Reexport your entry components here diff --git a/packages/create-svelte/templates/skeletonlib/src/routes/+page.svelte b/packages/create-svelte/templates/skeletonlib/src/routes/+page.svelte deleted file mode 100644 index 0a45b69f099b..000000000000 --- a/packages/create-svelte/templates/skeletonlib/src/routes/+page.svelte +++ /dev/null @@ -1,3 +0,0 @@ -

Welcome to your library project

-

Create your package using @sveltejs/package and preview/showcase your work with SvelteKit

-

Visit kit.svelte.dev to read the documentation

diff --git a/packages/create-svelte/templates/skeletonlib/static/favicon.png b/packages/create-svelte/templates/skeletonlib/static/favicon.png deleted file mode 100644 index 825b9e65af7c104cfb07089bb28659393b4f2097..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH fileURLToPath(new URL(path, import.meta.url)); - -// use a directory outside of packages to ensure it isn't added to the pnpm workspace -const test_workspace_dir = resolve_path('../../../.test-tmp/create-svelte/'); - -const existing_workspace_overrides = JSON.parse( - fs.readFileSync(resolve_path('../../../package.json'), 'utf-8') -).pnpm?.overrides; - -const overrides = { ...existing_workspace_overrides }; - -for (const pkg_path of glob(resolve_path('../../../packages/*/package.json'))) { - const name = JSON.parse(fs.readFileSync(pkg_path, 'utf-8')).name; - // use `file:` protocol for opting into stricter resolve logic which catches more bugs - overrides[name] = `file:${path.dirname(path.resolve(pkg_path))}`; -} - -try { - const kit_dir = resolve_path('../../../packages/kit'); - const ls_vite_result = execSync('pnpm ls --json vite', { cwd: kit_dir }); - const vite_version = JSON.parse(ls_vite_result.toString())[0].devDependencies.vite.version; - overrides.vite = vite_version; -} catch (e) { - console.error('failed to parse installed vite version from packages/kit'); - throw e; -} - -// prepare test pnpm workspace -fs.rmSync(test_workspace_dir, { recursive: true, force: true }); -fs.mkdirSync(test_workspace_dir, { recursive: true }); -const workspace = { - name: 'svelte-check-test-fake-pnpm-workspace', - private: true, - version: '0.0.0', - pnpm: { overrides }, - // convert override query "@foo/bar@>x [query.replace(/(@?[^@]+)@.*$/, '$1'), range]) - ) -}; - -fs.writeFileSync( - path.join(test_workspace_dir, 'package.json'), - JSON.stringify(workspace, null, '\t') -); - -fs.writeFileSync(path.join(test_workspace_dir, 'pnpm-workspace.yaml'), 'packages:\n - ./*\n'); - -const exec_async = promisify(exec); - -beforeAll(async () => { - await exec_async('pnpm install --no-frozen-lockfile', { - cwd: test_workspace_dir - }); -}, 60000); - -/** @param {any} pkg */ -function patch_package_json(pkg) { - Object.entries(overrides).forEach(([key, value]) => { - if (pkg.devDependencies?.[key]) { - pkg.devDependencies[key] = value; - } - - if (pkg.dependencies?.[key]) { - pkg.dependencies[key] = value; - } - - if (!pkg.pnpm) { - pkg.pnpm = {}; - } - - if (!pkg.pnpm.overrides) { - pkg.pnpm.overrides = {}; - } - - pkg.pnpm.overrides = { ...pkg.pnpm.overrides, ...overrides }; - }); - pkg.private = true; -} - -/** - * Tests in different templates can be run concurrently for a nice speedup locally, but tests within a template must be run sequentially. - * It'd be better to group tests by template, but vitest doesn't support that yet. - * @type {Map import('node:child_process').PromiseWithChild][]>} - */ -const script_test_map = new Map(); - -const templates = /** @type {Array<'default' | 'skeleton' | 'skeletonlib'>} */ ( - fs.readdirSync('templates') -); - -for (const template of templates) { - if (template[0] === '.') continue; - - for (const types of /** @type {const} */ (['checkjs', 'typescript'])) { - for (const svelteVersion of /** @type {const} */ (['svelte4', 'svelte5'])) { - const test_id = `${template}-${types}-${svelteVersion}`; - const cwd = path.join(test_workspace_dir, test_id); - fs.rmSync(cwd, { recursive: true, force: true }); - - create(cwd, { - name: `create-svelte-test-${test_id}`, - template, - types, - prettier: true, - eslint: true, - playwright: false, - vitest: false, - svelte5: svelteVersion === 'svelte5' - }); - - const pkg = JSON.parse(fs.readFileSync(path.join(cwd, 'package.json'), 'utf-8')); - patch_package_json(pkg); - - fs.writeFileSync(path.join(cwd, 'package.json'), JSON.stringify(pkg, null, '\t') + '\n'); - - // run provided scripts that are non-blocking. All of them should exit with 0 - // package script requires lib dir - // TODO: lint should run before format - const scripts_to_test = ['format', 'lint', 'check', 'build', 'package'].filter( - (s) => s in pkg.scripts - ); - - for (const script of scripts_to_test) { - const tests = script_test_map.get(script) ?? []; - tests.push([test_id, () => exec_async(`pnpm ${script}`, { cwd })]); - script_test_map.set(script, tests); - } - } - } -} - -for (const [script, tests] of script_test_map) { - describe.concurrent( - script, - () => { - for (const [name, task] of tests) { - test(name, task); - } - }, - { timeout: 60000 } - ); -} diff --git a/packages/create-svelte/tsconfig.json b/packages/create-svelte/tsconfig.json index 41f0745444fe..e4d8da465f83 100644 --- a/packages/create-svelte/tsconfig.json +++ b/packages/create-svelte/tsconfig.json @@ -9,5 +9,5 @@ "allowSyntheticDefaultImports": true, "strict": true }, - "include": ["./scripts/**/*", "./test/*.js", "./*.js"] + "include": ["./*.js"] } diff --git a/packages/create-svelte/types/index.d.ts b/packages/create-svelte/types/index.d.ts deleted file mode 100644 index 1f1a4a6191bc..000000000000 --- a/packages/create-svelte/types/index.d.ts +++ /dev/null @@ -1,8 +0,0 @@ -import { Options } from './internal.js'; - -/** - * Create a new SvelteKit project. - * @param {string} cwd - Path to the directory to create - * @param {import('./internal').Options} options - */ -export function create(cwd: string, options: Options): Promise; diff --git a/packages/create-svelte/types/internal.d.ts b/packages/create-svelte/types/internal.d.ts deleted file mode 100644 index c7e6804cabf3..000000000000 --- a/packages/create-svelte/types/internal.d.ts +++ /dev/null @@ -1,36 +0,0 @@ -export type Options = { - name: string; - template: 'default' | 'skeleton' | 'skeletonlib'; - types: 'typescript' | 'checkjs' | null; - prettier: boolean; - eslint: boolean; - playwright: boolean; - vitest: boolean; - svelte5?: boolean; // optional to not introduce a breaking change to the `create` API -}; - -export type File = { - name: string; - contents: string; -}; - -export type Condition = - | 'eslint' - | 'prettier' - | 'typescript' - | 'checkjs' - | 'playwright' - | 'vitest' - | 'skeleton' - | 'default' - | 'skeletonlib' - | 'svelte5'; - -export type Common = { - files: Array<{ - name: string; - include: Condition[]; - exclude: Condition[]; - contents: string; - }>; -}; diff --git a/packages/create-svelte/utils.js b/packages/create-svelte/utils.js deleted file mode 100644 index a22ad37f34db..000000000000 --- a/packages/create-svelte/utils.js +++ /dev/null @@ -1,71 +0,0 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import process from 'node:process'; -import { fileURLToPath } from 'node:url'; - -/** @param {string} dir */ -export function mkdirp(dir) { - try { - fs.mkdirSync(dir, { recursive: true }); - } catch (e) { - if (/** @type {any} */ (e).code === 'EEXIST') return; - throw e; - } -} - -/** @param {string} path */ -export function rimraf(path) { - (fs.rmSync || fs.rmdirSync)(path, { recursive: true, force: true }); -} - -/** - * @template T - * @param {T} x - */ -function identity(x) { - return x; -} - -/** - * @param {string} from - * @param {string} to - * @param {(basename: string) => string} rename - */ -export function copy(from, to, rename = identity) { - if (!fs.existsSync(from)) return; - - const stats = fs.statSync(from); - - if (stats.isDirectory()) { - fs.readdirSync(from).forEach((file) => { - copy(path.join(from, file), path.join(to, rename(file))); - }); - } else { - mkdirp(path.dirname(to)); - fs.copyFileSync(from, to); - } -} - -/** @param {string} path */ -export function dist(path) { - return fileURLToPath(new URL(`./dist/${path}`, import.meta.url).href); -} - -/** @type {string} */ -export const package_manager = get_package_manager() || 'npm'; - -/** - * Supports npm, pnpm, Yarn, cnpm, bun and any other package manager that sets the - * npm_config_user_agent env variable. - * Thanks to https://github.com/zkochan/packages/tree/main/which-pm-runs for this code! - */ -function get_package_manager() { - if (!process.env.npm_config_user_agent) { - return undefined; - } - const user_agent = process.env.npm_config_user_agent; - const pm_spec = user_agent.split(' ')[0]; - const separator_pos = pm_spec.lastIndexOf('/'); - const name = pm_spec.substring(0, separator_pos); - return name === 'npminstall' ? 'cnpm' : name; -} diff --git a/packages/create-svelte/vitest.config.js b/packages/create-svelte/vitest.config.js deleted file mode 100644 index 3f5451417a27..000000000000 --- a/packages/create-svelte/vitest.config.js +++ /dev/null @@ -1,5 +0,0 @@ -import { defineConfig } from 'vitest/config'; - -export default defineConfig({ - test: { dir: './test', include: ['*.js'] } -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 8569e4bbf2ab..ee1c5ce662e6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -289,81 +289,7 @@ importers: specifier: ^5.3.3 version: 5.4.5 - packages/create-svelte: - dependencies: - '@clack/prompts': - specifier: ^0.7.0 - version: 0.7.0 - kleur: - specifier: ^4.1.5 - version: 4.1.5 - devDependencies: - '@playwright/test': - specifier: ^1.44.1 - version: 1.44.1 - '@types/gitignore-parser': - specifier: ^0.0.3 - version: 0.0.3 - '@types/node': - specifier: ^18.19.48 - version: 18.19.50 - gitignore-parser: - specifier: ^0.0.2 - version: 0.0.2 - prettier: - specifier: ^3.1.1 - version: 3.2.5 - prettier-plugin-svelte: - specifier: ^3.1.2 - version: 3.1.2(prettier@3.2.5)(svelte@4.2.19) - sucrase: - specifier: ^3.34.0 - version: 3.35.0 - svelte: - specifier: ^4.2.10 - version: 4.2.19 - tiny-glob: - specifier: ^0.2.9 - version: 0.2.9 - typescript: - specifier: ^5.3.3 - version: 5.4.5 - vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) - - packages/create-svelte/templates/default: - devDependencies: - '@fontsource/fira-mono': - specifier: ^5.0.0 - version: 5.0.12 - '@neoconfetti/svelte': - specifier: ^2.0.0 - version: 2.2.1 - '@sveltejs/adapter-auto': - specifier: workspace:* - version: link:../../../adapter-auto - '@sveltejs/kit': - specifier: workspace:* - version: link:../../../kit - '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.0 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) - svelte: - specifier: ^4.2.10 - version: 4.2.19 - typescript: - specifier: ^5.3.3 - version: 5.4.5 - vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - - packages/create-svelte/templates/skeleton: - devDependencies: - '@sveltejs/adapter-auto': - specifier: workspace:* - version: link:../../../adapter-auto + packages/create-svelte: {} packages/enhanced-img: dependencies: @@ -1390,14 +1316,6 @@ packages: '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} - '@clack/core@0.3.4': - resolution: {integrity: sha512-H4hxZDXgHtWTwV3RAVenqcC4VbJZNegbBjlPvzOzCouXtS2y3sDvlO3IsbrPNWuLWPPlYVYPghQdSF64683Ldw==} - - '@clack/prompts@0.7.0': - resolution: {integrity: sha512-0MhX9/B4iL6Re04jPrttDm+BsP8y6mS7byuv0BvXgdXhbV5PdlsHt55dvNsuBCPZ7xq1oTAOOuotR9NFbQyMSA==} - bundledDependencies: - - is-unicode-supported - '@cloudflare/kv-asset-handler@0.3.4': resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} @@ -1752,9 +1670,6 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} - '@fontsource/fira-mono@5.0.12': - resolution: {integrity: sha512-1uFRjqCcxVv4F31PjyLm8o4oNlT5ywwh6OwcDGkZbafOeFZHXekvholS9IlfZkRsZvVhSbFRHT/5iDib4KTtpg==} - '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -1879,10 +1794,6 @@ packages: cpu: [x64] os: [win32] - '@isaacs/cliui@8.0.2': - resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} - engines: {node: '>=12'} - '@jest/schemas@29.6.3': resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -1921,9 +1832,6 @@ packages: resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} hasBin: true - '@neoconfetti/svelte@2.2.1': - resolution: {integrity: sha512-2Ts0Rxaf6clW2qG+AKhTwpl01AAyZEAe03XeuQ7Vp+qYIaM3ycuI94j546fmEkUxwACwGI3Zl2cZ/pncTuNcJg==} - '@netlify/functions@2.6.0': resolution: {integrity: sha512-vU20tij0fb4nRGACqb+5SQvKd50JYyTyEhQetCMHdakcJFzjLDivvRR16u1G2Oy4A7xNAtGJF1uz8reeOtTVcQ==} engines: {node: '>=14.0.0'} @@ -1948,10 +1856,6 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} - '@pkgjs/parseargs@0.11.0': - resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} - engines: {node: '>=14'} - '@playwright/test@1.44.1': resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==} engines: {node: '>=16'} @@ -2155,9 +2059,6 @@ packages: '@types/geojson@7946.0.14': resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - '@types/gitignore-parser@0.0.3': - resolution: {integrity: sha512-sbdu1sG2pQcwjEYWTsX78OqJo5pKnonwC4FV3m2JeQRE2xYb3q0icHHopCHEvpn4uIBuvWBTpJUCJ76ISK24CA==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2331,10 +2232,6 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} - ansi-regex@6.0.1: - resolution: {integrity: sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==} - engines: {node: '>=12'} - ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} @@ -2343,13 +2240,6 @@ packages: resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} engines: {node: '>=10'} - ansi-styles@6.2.1: - resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} - engines: {node: '>=12'} - - any-promise@1.3.0: - resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2494,10 +2384,6 @@ packages: commander@2.20.3: resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - commander@4.1.1: - resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} - engines: {node: '>= 6'} - commander@7.2.0: resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} engines: {node: '>= 10'} @@ -2651,18 +2537,12 @@ packages: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: resolution: {directory: packages/kit/test/apps/dev-only/_test_dependencies/cjs-only, type: directory} - eastasianwidth@0.2.0: - resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} - electron-to-chromium@1.4.736: resolution: {integrity: sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==} emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} - emoji-regex@9.2.2: - resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -2865,10 +2745,6 @@ packages: flexsearch@0.7.43: resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} - foreground-child@3.1.1: - resolution: {integrity: sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==} - engines: {node: '>=14'} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2919,10 +2795,6 @@ packages: get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} - gitignore-parser@0.0.2: - resolution: {integrity: sha512-X6mpqUv59uWLGD4n3hZ8Cu8KbF2PMWPSFYmxZjdkpm3yOU7hSUYnzTkZI1mcWqchphvqyuz3/BhgBR4E/JtkCg==} - engines: {node: '>=0.10.0'} - glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} engines: {node: '>= 6'} @@ -2934,11 +2806,6 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} - glob@10.4.1: - resolution: {integrity: sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==} - engines: {node: '>=16 || 14 >=14.18'} - hasBin: true - glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -3090,10 +2957,6 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} - jackspeak@3.4.0: - resolution: {integrity: sha512-JVYhQnN59LVPFCEcVa2C3CrEKYacvjRfqIQl+h8oi91aLYQVWRYbxjPcv1bUiUy/kLmQaANrYfNMCO3kuEDHfw==} - engines: {node: '>=14'} - js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -3197,9 +3060,6 @@ packages: resolution: {integrity: sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==} engines: {node: '>=10'} - lines-and-columns@1.2.4: - resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} - local-access@1.1.0: resolution: {integrity: sha512-XfegD5pyTAfb+GY6chk283Ox5z8WexG56OvM06RWLpAc/UHozO8X6xAxEkIitZOtsSMM1Yr3DkHgW5W+onLhCw==} engines: {node: '>=6'} @@ -3227,10 +3087,6 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} - lru-cache@10.2.0: - resolution: {integrity: sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==} - engines: {node: 14 || >=16.14} - lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -3309,10 +3165,6 @@ packages: resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} engines: {node: '>=8'} - minipass@7.1.2: - resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} - engines: {node: '>=16 || 14 >=14.17'} - minizlib@2.1.2: resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} engines: {node: '>= 8'} @@ -3337,9 +3189,6 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - mz@2.7.0: - resolution: {integrity: sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==} - nanoid@3.3.7: resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} @@ -3486,10 +3335,6 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} - path-scurry@1.11.1: - resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} - engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} @@ -3522,10 +3367,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pirates@4.0.6: - resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} - engines: {node: '>= 6'} - playwright-core@1.44.1: resolution: {integrity: sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==} engines: {node: '>=16'} @@ -3826,10 +3667,6 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string-width@5.1.2: - resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} - engines: {node: '>=12'} - string_decoder@1.3.0: resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} @@ -3837,10 +3674,6 @@ packages: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} - strip-ansi@7.1.0: - resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} - engines: {node: '>=12'} - strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3857,11 +3690,6 @@ packages: resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} engines: {node: '>=8'} - sucrase@3.35.0: - resolution: {integrity: sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==} - engines: {node: '>=16 || 14 >=14.17'} - hasBin: true - supports-color@7.2.0: resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} engines: {node: '>=8'} @@ -3966,13 +3794,6 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - thenify-all@1.6.0: - resolution: {integrity: sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==} - engines: {node: '>=0.8'} - - thenify@3.3.1: - resolution: {integrity: sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==} - tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} @@ -4024,9 +3845,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-interface-checker@0.1.13: - resolution: {integrity: sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==} - ts-morph@24.0.0: resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} @@ -4211,14 +4029,6 @@ packages: '@cloudflare/workers-types': optional: true - wrap-ansi@7.0.0: - resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} - engines: {node: '>=10'} - - wrap-ansi@8.1.0: - resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} - engines: {node: '>=12'} - wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -4424,17 +4234,6 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@clack/core@0.3.4': - dependencies: - picocolors: 1.1.0 - sisteransi: 1.0.5 - - '@clack/prompts@0.7.0': - dependencies: - '@clack/core': 0.3.4 - picocolors: 1.1.0 - sisteransi: 1.0.5 - '@cloudflare/kv-asset-handler@0.3.4': dependencies: mime: 3.0.0 @@ -4645,8 +4444,6 @@ snapshots: '@fastify/busboy@2.1.1': {} - '@fontsource/fira-mono@5.0.12': {} - '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.0': {} @@ -4728,15 +4525,6 @@ snapshots: '@img/sharp-win32-x64@0.33.3': optional: true - '@isaacs/cliui@8.0.2': - dependencies: - string-width: 5.1.2 - string-width-cjs: string-width@4.2.3 - strip-ansi: 7.1.0 - strip-ansi-cjs: strip-ansi@6.0.1 - wrap-ansi: 8.1.0 - wrap-ansi-cjs: wrap-ansi@7.0.0 - '@jest/schemas@29.6.3': dependencies: '@sinclair/typebox': 0.27.8 @@ -4799,8 +4587,6 @@ snapshots: - encoding - supports-color - '@neoconfetti/svelte@2.2.1': {} - '@netlify/functions@2.6.0': dependencies: '@netlify/serverless-functions-api': 1.14.0 @@ -4824,9 +4610,6 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 - '@pkgjs/parseargs@0.11.0': - optional: true - '@playwright/test@1.44.1': dependencies: playwright: 1.44.1 @@ -5023,8 +4806,6 @@ snapshots: '@types/geojson@7946.0.14': {} - '@types/gitignore-parser@0.0.3': {} - '@types/json-schema@7.0.15': {} '@types/node-forge@1.3.11': @@ -5237,18 +5018,12 @@ snapshots: ansi-regex@5.0.1: {} - ansi-regex@6.0.1: {} - ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 ansi-styles@5.2.0: {} - ansi-styles@6.2.1: {} - - any-promise@1.3.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -5395,8 +5170,6 @@ snapshots: commander@2.20.3: {} - commander@4.1.1: {} - commander@7.2.0: {} commondir@1.0.1: {} @@ -5511,14 +5284,10 @@ snapshots: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: {} - eastasianwidth@0.2.0: {} - electron-to-chromium@1.4.736: {} emoji-regex@8.0.0: {} - emoji-regex@9.2.2: {} - enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -5799,11 +5568,6 @@ snapshots: flexsearch@0.7.43: {} - foreground-child@3.1.1: - dependencies: - cross-spawn: 7.0.3 - signal-exit: 4.1.0 - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -5857,8 +5621,6 @@ snapshots: dependencies: resolve-pkg-maps: 1.0.0 - gitignore-parser@0.0.2: {} - glob-parent@5.1.2: dependencies: is-glob: 4.0.3 @@ -5869,14 +5631,6 @@ snapshots: glob-to-regexp@0.4.1: {} - glob@10.4.1: - dependencies: - foreground-child: 3.1.1 - jackspeak: 3.4.0 - minimatch: 9.0.5 - minipass: 7.1.2 - path-scurry: 1.11.1 - glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -6010,12 +5764,6 @@ snapshots: isexe@2.0.0: {} - jackspeak@3.4.0: - dependencies: - '@isaacs/cliui': 8.0.2 - optionalDependencies: - '@pkgjs/parseargs': 0.11.0 - js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -6095,8 +5843,6 @@ snapshots: lilconfig@2.1.0: {} - lines-and-columns@1.2.4: {} - local-access@1.1.0: {} locate-character@3.0.0: {} @@ -6121,8 +5867,6 @@ snapshots: dependencies: tslib: 2.6.2 - lru-cache@10.2.0: {} - lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -6200,8 +5944,6 @@ snapshots: minipass@5.0.0: {} - minipass@7.1.2: {} - minizlib@2.1.2: dependencies: minipass: 3.3.6 @@ -6217,12 +5959,6 @@ snapshots: mustache@4.2.0: {} - mz@2.7.0: - dependencies: - any-promise: 1.3.0 - object-assign: 4.1.1 - thenify-all: 1.6.0 - nanoid@3.3.7: {} natural-compare@1.4.0: {} @@ -6344,11 +6080,6 @@ snapshots: path-parse@1.0.7: {} - path-scurry@1.11.1: - dependencies: - lru-cache: 10.2.0 - minipass: 7.1.2 - path-to-regexp@6.2.2: {} path-type@4.0.0: {} @@ -6371,8 +6102,6 @@ snapshots: pify@4.0.1: {} - pirates@4.0.6: {} - playwright-core@1.44.1: {} playwright@1.44.1: @@ -6681,12 +6410,6 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string-width@5.1.2: - dependencies: - eastasianwidth: 0.2.0 - emoji-regex: 9.2.2 - strip-ansi: 7.1.0 - string_decoder@1.3.0: dependencies: safe-buffer: 5.2.1 @@ -6695,10 +6418,6 @@ snapshots: dependencies: ansi-regex: 5.0.1 - strip-ansi@7.1.0: - dependencies: - ansi-regex: 6.0.1 - strip-bom@3.0.0: {} strip-final-newline@3.0.0: {} @@ -6709,16 +6428,6 @@ snapshots: strip-json-comments@3.1.1: {} - sucrase@3.35.0: - dependencies: - '@jridgewell/gen-mapping': 0.3.5 - commander: 4.1.1 - glob: 10.4.1 - lines-and-columns: 1.2.4 - mz: 2.7.0 - pirates: 4.0.6 - ts-interface-checker: 0.1.13 - supports-color@7.2.0: dependencies: has-flag: 4.0.0 @@ -6808,14 +6517,6 @@ snapshots: text-table@0.2.0: {} - thenify-all@1.6.0: - dependencies: - thenify: 3.3.1 - - thenify@3.3.1: - dependencies: - any-promise: 1.3.0 - tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 @@ -6858,8 +6559,6 @@ snapshots: dependencies: typescript: 5.4.5 - ts-interface-checker@0.1.13: {} - ts-morph@24.0.0: dependencies: '@ts-morph/common': 0.25.0 @@ -7062,18 +6761,6 @@ snapshots: - supports-color - utf-8-validate - wrap-ansi@7.0.0: - dependencies: - ansi-styles: 4.3.0 - string-width: 4.2.3 - strip-ansi: 6.0.1 - - wrap-ansi@8.1.0: - dependencies: - ansi-styles: 6.2.1 - string-width: 5.1.2 - strip-ansi: 7.1.0 - wrappy@1.0.2: {} ws@8.18.0: {} From bfaf80332470bc98c85b63deda1f4ba006815380 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:03:52 -0700 Subject: [PATCH 0689/1135] Version Packages (#12849) Co-authored-by: github-actions[bot] --- .changeset/breezy-cars-wink.md | 5 ----- .changeset/early-emus-pump.md | 6 ------ .changeset/serious-geckos-itch.md | 5 ----- .changeset/shy-seals-draw.md | 5 ----- packages/adapter-auto/CHANGELOG.md | 6 ++++++ packages/adapter-auto/package.json | 2 +- packages/create-svelte/CHANGELOG.md | 6 ++++++ packages/create-svelte/package.json | 2 +- packages/migrate/CHANGELOG.md | 9 +++++++++ packages/migrate/package.json | 2 +- packages/package/CHANGELOG.md | 6 ++++++ packages/package/package.json | 2 +- 12 files changed, 31 insertions(+), 25 deletions(-) delete mode 100644 .changeset/breezy-cars-wink.md delete mode 100644 .changeset/early-emus-pump.md delete mode 100644 .changeset/serious-geckos-itch.md delete mode 100644 .changeset/shy-seals-draw.md diff --git a/.changeset/breezy-cars-wink.md b/.changeset/breezy-cars-wink.md deleted file mode 100644 index 94bdbe5067cf..000000000000 --- a/.changeset/breezy-cars-wink.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'create-svelte': major ---- - -breaking: the `create-svelte` package has been replaced by the `sv` package diff --git a/.changeset/early-emus-pump.md b/.changeset/early-emus-pump.md deleted file mode 100644 index ded019ffb7ad..000000000000 --- a/.changeset/early-emus-pump.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'svelte-migrate': patch -'@sveltejs/package': patch ---- - -docs: demonstrate sv migrate over prior commands diff --git a/.changeset/serious-geckos-itch.md b/.changeset/serious-geckos-itch.md deleted file mode 100644 index 0b040737c534..000000000000 --- a/.changeset/serious-geckos-itch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-auto': minor ---- - -feat: add support for Bun package manager diff --git a/.changeset/shy-seals-draw.md b/.changeset/shy-seals-draw.md deleted file mode 100644 index 0a50e44dd987..000000000000 --- a/.changeset/shy-seals-draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'svelte-migrate': patch ---- - -fix: bump enhanced-img version to avoid peer dep warning diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index fc8eaa8fc38d..862cfeb6fa54 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-auto +## 3.3.0 +### Minor Changes + + +- feat: add support for Bun package manager ([#12854](https://github.com/sveltejs/kit/pull/12854)) + ## 3.2.5 ### Patch Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index cdd438351c1a..d9bf9d9a91c1 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-auto", - "version": "3.2.5", + "version": "3.3.0", "description": "Automatically chooses the SvelteKit adapter for your current environment, if possible.", "keywords": [ "adapter", diff --git a/packages/create-svelte/CHANGELOG.md b/packages/create-svelte/CHANGELOG.md index eac417529afb..9c00ac242399 100644 --- a/packages/create-svelte/CHANGELOG.md +++ b/packages/create-svelte/CHANGELOG.md @@ -1,5 +1,11 @@ # create-svelte +## 7.0.0 +### Major Changes + + +- breaking: the `create-svelte` package has been replaced by the `sv` package ([#12850](https://github.com/sveltejs/kit/pull/12850)) + ## 6.4.0 ### Minor Changes diff --git a/packages/create-svelte/package.json b/packages/create-svelte/package.json index 36e22010aa1d..9cdc02f715d4 100644 --- a/packages/create-svelte/package.json +++ b/packages/create-svelte/package.json @@ -1,6 +1,6 @@ { "name": "create-svelte", - "version": "6.4.0", + "version": "7.0.0", "type": "module", "description": "A CLI for creating new SvelteKit projects", "keywords": [ diff --git a/packages/migrate/CHANGELOG.md b/packages/migrate/CHANGELOG.md index 46a11658197a..6e0af16e45d5 100644 --- a/packages/migrate/CHANGELOG.md +++ b/packages/migrate/CHANGELOG.md @@ -1,5 +1,14 @@ # svelte-migrate +## 1.6.5 +### Patch Changes + + +- docs: demonstrate sv migrate over prior commands ([#12840](https://github.com/sveltejs/kit/pull/12840)) + + +- fix: bump enhanced-img version to avoid peer dep warning ([#12852](https://github.com/sveltejs/kit/pull/12852)) + ## 1.6.4 ### Patch Changes diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 1ee9b53b2ffc..341640a9b301 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -1,6 +1,6 @@ { "name": "svelte-migrate", - "version": "1.6.4", + "version": "1.6.5", "description": "A CLI for migrating Svelte(Kit) codebases", "keywords": [ "migration", diff --git a/packages/package/CHANGELOG.md b/packages/package/CHANGELOG.md index 75c43031ec6c..150413827f13 100644 --- a/packages/package/CHANGELOG.md +++ b/packages/package/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/package +## 2.3.6 +### Patch Changes + + +- docs: demonstrate sv migrate over prior commands ([#12840](https://github.com/sveltejs/kit/pull/12840)) + ## 2.3.5 ### Patch Changes diff --git a/packages/package/package.json b/packages/package/package.json index 297d915fe30b..6809eabef077 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/package", - "version": "2.3.5", + "version": "2.3.6", "description": "The fastest way to build Svelte packages", "repository": { "type": "git", From 57ba428a0470b6305a0b00df475c5d10ec937a67 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 10:48:18 -0700 Subject: [PATCH 0690/1135] fix: restore repository information --- packages/create-svelte/package.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/packages/create-svelte/package.json b/packages/create-svelte/package.json index 9cdc02f715d4..f0a172780880 100644 --- a/packages/create-svelte/package.json +++ b/packages/create-svelte/package.json @@ -13,6 +13,11 @@ "template", "wizard" ], + "repository": { + "type": "git", + "url": "https://github.com/sveltejs/kit", + "directory": "packages/create-svelte" + }, "license": "MIT", "homepage": "https://svelte.dev", "files": [ From e6c1c1e4a31526cafc49ecebeaa2841f17bef9a4 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:07:51 -0700 Subject: [PATCH 0691/1135] chore: remove kit.svelte.dev (#12856) --- package.json | 2 + packages/kit/src/exports/public.d.ts | 11 +- .../kit/src/runtime/server/page/render.js | 5 +- packages/kit/types/index.d.ts | 11 +- packages/migrate/package.json | 1 - pnpm-lock.yaml | 374 +----------------- pnpm-workspace.yaml | 1 - sites/kit.svelte.dev/.gitignore | 8 - sites/kit.svelte.dev/.prettierignore | 1 - sites/kit.svelte.dev/README.md | 13 - sites/kit.svelte.dev/package.json | 45 --- sites/kit.svelte.dev/scripts/tsconfig.json | 12 - sites/kit.svelte.dev/scripts/types/index.js | 327 --------------- sites/kit.svelte.dev/src/app.d.ts | 12 - sites/kit.svelte.dev/src/app.html | 61 --- sites/kit.svelte.dev/src/hooks.server.js | 23 -- .../src/lib/icons/left-small.svg | 11 - sites/kit.svelte.dev/src/lib/icons/pause.svg | 4 - sites/kit.svelte.dev/src/lib/icons/play.svg | 3 - sites/kit.svelte.dev/src/lib/icons/plus.svg | 11 - sites/kit.svelte.dev/src/lib/icons/search.svg | 6 - .../kit.svelte.dev/src/lib/icons/up-small.svg | 11 - .../src/lib/server/docs/index.js | 127 ------ .../src/lib/server/docs/types.d.ts | 24 -- .../kit.svelte.dev/src/lib/server/renderer.js | 81 ---- sites/kit.svelte.dev/src/routes/+error.svelte | 65 --- .../src/routes/+layout.server.js | 27 -- .../kit.svelte.dev/src/routes/+layout.svelte | 103 ----- sites/kit.svelte.dev/src/routes/+page.js | 5 - sites/kit.svelte.dev/src/routes/+page.svelte | 100 ----- .../src/routes/content.json/+server.js | 10 - .../src/routes/content.json/content.server.js | 114 ------ .../src/routes/docs/+layout.server.js | 9 - .../src/routes/docs/+layout.svelte | 89 ----- sites/kit.svelte.dev/src/routes/docs/+page.js | 5 - .../src/routes/docs/[slug]/+page.server.js | 7 - .../src/routes/docs/[slug]/+page.svelte | 134 ------- .../src/routes/edge.svg/+server.js | 144 ------- .../src/routes/edge.svg/countries.json | 251 ------------ .../src/routes/edge.svg/land-110m.json | 1 - sites/kit.svelte.dev/src/routes/faq/+page.js | 5 - .../src/routes/home/Deployment.svelte | 297 -------------- .../src/routes/home/Features.svelte | 120 ------ .../src/routes/home/Hero.svelte | 192 --------- .../src/routes/home/Intro.svelte | 37 -- .../src/routes/home/Showcase.svelte | 106 ----- .../src/routes/home/Svelte.svelte | 114 ------ .../src/routes/home/Video.svelte | 261 ------------ .../kit.svelte.dev/src/routes/home/cc-off.svg | 22 -- .../kit.svelte.dev/src/routes/home/cc-on.svg | 14 - .../kit.svelte.dev/src/routes/home/common.css | 54 --- .../src/routes/home/logos/appengine.svg | 63 --- .../src/routes/home/logos/azure.svg | 16 - .../src/routes/home/logos/cloudflare.svg | 18 - .../src/routes/home/logos/deno.svg | 60 --- .../src/routes/home/logos/firebase.svg | 36 -- .../src/routes/home/logos/html5.svg | 17 - .../src/routes/home/logos/lambda.svg | 15 - .../src/routes/home/logos/netlify.svg | 16 - .../src/routes/home/logos/node.svg | 1 - .../src/routes/home/logos/vercel.svg | 3 - .../src/routes/home/showcase/asmeditor.png | Bin 162044 -> 0 bytes .../src/routes/home/showcase/dropzone.png | Bin 242780 -> 0 bytes .../src/routes/home/showcase/monogram.png | Bin 470593 -> 0 bytes .../src/routes/home/showcase/pausly.png | Bin 108121 -> 0 bytes .../src/routes/home/showcase/pocketbase.png | Bin 206721 -> 0 bytes .../src/routes/home/showcase/pronauns.png | Bin 99313 -> 0 bytes .../src/routes/home/showcase/pudding.png | Bin 141461 -> 0 bytes .../src/routes/home/showcase/raster.png | Bin 299222 -> 0 bytes .../routes/home/showcase/tradingstrategy.png | Bin 57224 -> 0 bytes .../src/routes/home/subtitles.vtt | 98 ----- .../home/svelte-kit-logotype.svg.svelte | 46 --- .../src/routes/home/svelte-kit-machine.webp | Bin 211500 -> 0 bytes .../src/routes/home/sveltekit-logo.svg | 1 - .../src/routes/home/volume-high.svg | 3 - .../src/routes/home/volume-off.svg | 3 - .../src/routes/nav.json/+server.js | 28 -- sites/kit.svelte.dev/src/routes/schema.json | 89 ----- .../kit.svelte.dev/src/routes/search/+page.js | 1 - .../src/routes/search/+page.server.js | 20 - .../src/routes/search/+page.svelte | 55 --- sites/kit.svelte.dev/static/favicon.png | Bin 1373 -> 0 bytes .../images/svelte-android-chrome-192.png | Bin 1986 -> 0 bytes .../images/svelte-android-chrome-512.png | Bin 5185 -> 0 bytes .../static/images/svelte-kit-horizontal.svg | 1 - .../static/images/twitter-thumbnail.jpg | Bin 65292 -> 0 bytes sites/kit.svelte.dev/static/manifest.json | 20 - sites/kit.svelte.dev/static/opensearch.xml | 10 - sites/kit.svelte.dev/static/robots.txt | 3 - sites/kit.svelte.dev/svelte.config.js | 16 - sites/kit.svelte.dev/tsconfig.json | 11 - sites/kit.svelte.dev/vercel.json | 9 - sites/kit.svelte.dev/vite.config.js | 38 -- 93 files changed, 29 insertions(+), 4139 deletions(-) delete mode 100644 sites/kit.svelte.dev/.gitignore delete mode 100644 sites/kit.svelte.dev/.prettierignore delete mode 100644 sites/kit.svelte.dev/README.md delete mode 100644 sites/kit.svelte.dev/package.json delete mode 100644 sites/kit.svelte.dev/scripts/tsconfig.json delete mode 100644 sites/kit.svelte.dev/scripts/types/index.js delete mode 100644 sites/kit.svelte.dev/src/app.d.ts delete mode 100644 sites/kit.svelte.dev/src/app.html delete mode 100644 sites/kit.svelte.dev/src/hooks.server.js delete mode 100644 sites/kit.svelte.dev/src/lib/icons/left-small.svg delete mode 100644 sites/kit.svelte.dev/src/lib/icons/pause.svg delete mode 100644 sites/kit.svelte.dev/src/lib/icons/play.svg delete mode 100644 sites/kit.svelte.dev/src/lib/icons/plus.svg delete mode 100644 sites/kit.svelte.dev/src/lib/icons/search.svg delete mode 100644 sites/kit.svelte.dev/src/lib/icons/up-small.svg delete mode 100644 sites/kit.svelte.dev/src/lib/server/docs/index.js delete mode 100644 sites/kit.svelte.dev/src/lib/server/docs/types.d.ts delete mode 100644 sites/kit.svelte.dev/src/lib/server/renderer.js delete mode 100644 sites/kit.svelte.dev/src/routes/+error.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/+layout.server.js delete mode 100644 sites/kit.svelte.dev/src/routes/+layout.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/+page.js delete mode 100644 sites/kit.svelte.dev/src/routes/+page.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/content.json/+server.js delete mode 100644 sites/kit.svelte.dev/src/routes/content.json/content.server.js delete mode 100644 sites/kit.svelte.dev/src/routes/docs/+layout.server.js delete mode 100644 sites/kit.svelte.dev/src/routes/docs/+layout.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/docs/+page.js delete mode 100644 sites/kit.svelte.dev/src/routes/docs/[slug]/+page.server.js delete mode 100644 sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/edge.svg/+server.js delete mode 100644 sites/kit.svelte.dev/src/routes/edge.svg/countries.json delete mode 100644 sites/kit.svelte.dev/src/routes/edge.svg/land-110m.json delete mode 100644 sites/kit.svelte.dev/src/routes/faq/+page.js delete mode 100644 sites/kit.svelte.dev/src/routes/home/Deployment.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/Features.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/Hero.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/Intro.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/Showcase.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/Svelte.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/Video.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/cc-off.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/cc-on.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/common.css delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/appengine.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/azure.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/cloudflare.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/deno.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/firebase.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/html5.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/lambda.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/netlify.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/node.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/logos/vercel.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/asmeditor.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/dropzone.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/monogram.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/pausly.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/pocketbase.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/pronauns.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/pudding.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/raster.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/showcase/tradingstrategy.png delete mode 100644 sites/kit.svelte.dev/src/routes/home/subtitles.vtt delete mode 100644 sites/kit.svelte.dev/src/routes/home/svelte-kit-logotype.svg.svelte delete mode 100644 sites/kit.svelte.dev/src/routes/home/svelte-kit-machine.webp delete mode 100644 sites/kit.svelte.dev/src/routes/home/sveltekit-logo.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/volume-high.svg delete mode 100644 sites/kit.svelte.dev/src/routes/home/volume-off.svg delete mode 100644 sites/kit.svelte.dev/src/routes/nav.json/+server.js delete mode 100644 sites/kit.svelte.dev/src/routes/schema.json delete mode 100644 sites/kit.svelte.dev/src/routes/search/+page.js delete mode 100644 sites/kit.svelte.dev/src/routes/search/+page.server.js delete mode 100644 sites/kit.svelte.dev/src/routes/search/+page.svelte delete mode 100644 sites/kit.svelte.dev/static/favicon.png delete mode 100644 sites/kit.svelte.dev/static/images/svelte-android-chrome-192.png delete mode 100644 sites/kit.svelte.dev/static/images/svelte-android-chrome-512.png delete mode 100644 sites/kit.svelte.dev/static/images/svelte-kit-horizontal.svg delete mode 100644 sites/kit.svelte.dev/static/images/twitter-thumbnail.jpg delete mode 100644 sites/kit.svelte.dev/static/manifest.json delete mode 100644 sites/kit.svelte.dev/static/opensearch.xml delete mode 100644 sites/kit.svelte.dev/static/robots.txt delete mode 100644 sites/kit.svelte.dev/svelte.config.js delete mode 100644 sites/kit.svelte.dev/tsconfig.json delete mode 100644 sites/kit.svelte.dev/vercel.json delete mode 100644 sites/kit.svelte.dev/vite.config.js diff --git a/package.json b/package.json index e0a5dd431af5..7c2bb37ed198 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,8 @@ "@svitejs/changesets-changelog-github-compact": "^1.1.0", "eslint": "^9.6.0", "playwright": "^1.44.1", + "prettier": "^3.1.1", + "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, "packageManager": "pnpm@9.12.1", diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index f4fc6b5895b8..c61c053171cf 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -79,12 +79,11 @@ export interface ActionFailure | undefined = u [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } -type UnpackValidationError = - T extends ActionFailure - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; +type UnpackValidationError = T extends ActionFailure + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 6c275c6d968e..6d8b8eb44633 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -566,9 +566,8 @@ function get_data(event, options, nodes, csp, global) { str = devalue.uneval({ id, data, error }, replacer); } - push( - `${global}.resolve(${str})\n` - ); + const nonce = csp.script_needs_nonce ? ` nonce="${csp.nonce}"` : ''; + push(`${global}.resolve(${str})\n`); if (count === 0) done(); } ); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index ff5299a1f94c..cacc70c9c613 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -61,12 +61,11 @@ declare module '@sveltejs/kit' { [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } - type UnpackValidationError = - T extends ActionFailure - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; + type UnpackValidationError = T extends ActionFailure + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 341640a9b301..99eb9d77921d 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -42,7 +42,6 @@ "@types/node": "^18.19.48", "@types/prompts": "^2.4.9", "@types/semver": "^7.5.6", - "prettier": "^3.1.1", "svelte": "^4.2.10", "vitest": "^2.0.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee1c5ce662e6..682ac22e7c49 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -23,6 +23,12 @@ importers: playwright: specifier: ^1.44.1 version: 1.44.1 + prettier: + specifier: ^3.1.1 + version: 3.1.1 + prettier-plugin-svelte: + specifier: ^3.1.2 + version: 3.1.2(prettier@3.1.1)(svelte@4.2.19) typescript-eslint: specifier: ^8.0.0 version: 8.4.0(eslint@9.6.0)(typescript@5.4.5) @@ -1061,9 +1067,6 @@ importers: '@types/semver': specifier: ^7.5.6 version: 7.5.8 - prettier: - specifier: ^3.1.1 - version: 3.2.5 svelte: specifier: ^4.2.10 version: 4.2.19 @@ -1100,7 +1103,7 @@ importers: version: 7.5.8 prettier: specifier: ^3.1.1 - version: 3.2.5 + version: 3.1.1 svelte: specifier: ^4.2.10 version: 4.2.19 @@ -1165,85 +1168,6 @@ importers: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - sites/kit.svelte.dev: - dependencies: - d3-geo: - specifier: ^3.1.0 - version: 3.1.1 - d3-geo-projection: - specifier: ^4.0.0 - version: 4.0.0 - topojson-client: - specifier: ^3.1.0 - version: 3.1.0 - devDependencies: - '@sveltejs/adapter-vercel': - specifier: workspace:^ - version: link:../../packages/adapter-vercel - '@sveltejs/amp': - specifier: workspace:^ - version: link:../../packages/amp - '@sveltejs/enhanced-img': - specifier: workspace:^ - version: link:../../packages/enhanced-img - '@sveltejs/kit': - specifier: workspace:^ - version: link:../../packages/kit - '@sveltejs/site-kit': - specifier: 6.0.0-next.64 - version: 6.0.0-next.64(@sveltejs/kit@packages+kit)(svelte@4.2.19) - '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) - '@types/d3-geo': - specifier: ^3.1.0 - version: 3.1.0 - '@types/node': - specifier: ^18.19.48 - version: 18.19.50 - '@vercel/speed-insights': - specifier: ^1.0.0 - version: 1.0.11(@sveltejs/kit@packages+kit)(svelte@4.2.19) - browserslist: - specifier: ^4.22.2 - version: 4.23.0 - flexsearch: - specifier: ^0.7.31 - version: 0.7.43 - lightningcss: - specifier: ^1.22.1 - version: 1.24.1 - marked: - specifier: ^12.0.0 - version: 12.0.1 - prettier: - specifier: ^3.1.1 - version: 3.2.5 - prettier-plugin-svelte: - specifier: ^3.1.2 - version: 3.1.2(prettier@3.2.5)(svelte@4.2.19) - prism-svelte: - specifier: ^0.5.0 - version: 0.5.0 - prismjs: - specifier: ^1.29.0 - version: 1.29.0 - shiki-twoslash: - specifier: ^3.1.2 - version: 3.1.2(typescript@5.0.4) - svelte: - specifier: ^4.2.10 - version: 4.2.19 - typescript: - specifier: 5.0.4 - version: 5.0.4 - vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) - packages: '@aashutoshrathi/word-wrap@1.2.6': @@ -2013,12 +1937,6 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.3 - '@sveltejs/site-kit@6.0.0-next.64': - resolution: {integrity: sha512-SosLY07DBA79yJhRR9vQpk9eXlSc3VjzOlIJQFvPzgsbu727rq5u3dudFEsm0NeQFoAF+NNgDYi5D85v5Yc+vQ==} - peerDependencies: - '@sveltejs/kit': ^1.20.0 - svelte: ^4.0.0 - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} engines: {node: ^18.0.0 || >=20} @@ -2047,18 +1965,12 @@ packages: '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} - '@types/d3-geo@3.1.0': - resolution: {integrity: sha512-856sckF0oP/diXtS4jNsiQw/UuK5fQG8l/a9VVLeSouf1/PPbBE1i1W852zVwKwYCBkFJJB7nCFTbk6UMEXBOQ==} - '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/geojson@7946.0.14': - resolution: {integrity: sha512-WCfD5Ht3ZesJUsONdhvm84dmzWOiOzOAqOncN0++w0lBw1o8OuDNJF2McvvCef/yBqb/HYRahp1BYtODFQ8bRg==} - '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -2143,43 +2055,11 @@ packages: resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript/twoslash@3.1.0': - resolution: {integrity: sha512-kTwMUQ8xtAZaC4wb2XuLkPqFVBj2dNBueMQ89NWEuw87k2nLBbuafeG5cob/QEr6YduxIdTVUjix0MtC7mPlmg==} - - '@typescript/vfs@1.3.4': - resolution: {integrity: sha512-RbyJiaAGQPIcAGWFa3jAXSuAexU4BFiDRF1g3hy7LmRqfNpYlTQWGXjcrOaVZjJ8YkkpuwG0FcsYvtWQpd9igQ==} - - '@typescript/vfs@1.3.5': - resolution: {integrity: sha512-pI8Saqjupf9MfLw7w2+og+fmb0fZS0J6vsKXXrp4/PDXEFvntgzXmChCXC/KefZZS0YGS6AT8e0hGAJcTsdJlg==} - '@vercel/nft@0.27.1': resolution: {integrity: sha512-K6upzYHCV1cq2gP83r1o8uNV1vwvAlozvMqp7CEjYWxo0CMI8/4jKcDkVjlypVhrfZ54SXwh9QbH0ZIk/vQCsw==} engines: {node: '>=16'} hasBin: true - '@vercel/speed-insights@1.0.11': - resolution: {integrity: sha512-l9hzSNmJvb2Yqpgd/BzpiT0J0aQDdtqxOf3Xm+iW4PICxVvhY1ef7Otdx4GXI+88dVkws57qMzXiShz19gXzSQ==} - peerDependencies: - '@sveltejs/kit': ^1 || ^2 - next: '>= 13' - react: ^18 || ^19 - svelte: ^4 - vue: ^3 - vue-router: ^4 - peerDependenciesMeta: - '@sveltejs/kit': - optional: true - next: - optional: true - react: - optional: true - svelte: - optional: true - vue: - optional: true - vue-router: - optional: true - '@vitest/expect@2.0.1': resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} @@ -2307,11 +2187,6 @@ packages: resolution: {integrity: sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==} engines: {node: '>=8'} - browserslist@4.23.0: - resolution: {integrity: sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==} - engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} - hasBin: true - cac@6.7.14: resolution: {integrity: sha512-b6Ilus+c3RrdDk+JhLKUAQfzzgLEPy6wcXqS7f/xe1EETvsDP6GORG7SFuOs6cID5YkqchW/LXZbX5bc8j7ZcQ==} engines: {node: '>=8'} @@ -2320,9 +2195,6 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - caniuse-lite@1.0.30001609: - resolution: {integrity: sha512-JFPQs34lHKx1B5t1EpQpWH4c+29zIyn/haGsbpfq3suuV9v56enjFt23zqijxGTMwy1p/4H2tjnQMY+p1WoAyA==} - capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} @@ -2381,13 +2253,6 @@ packages: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} - commander@2.20.3: - resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} - - commander@7.2.0: - resolution: {integrity: sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==} - engines: {node: '>= 10'} - commondir@1.0.1: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} @@ -2438,19 +2303,6 @@ packages: engines: {node: '>=4'} hasBin: true - d3-array@3.2.4: - resolution: {integrity: sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==} - engines: {node: '>=12'} - - d3-geo-projection@4.0.0: - resolution: {integrity: sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==} - engines: {node: '>=12'} - hasBin: true - - d3-geo@3.1.1: - resolution: {integrity: sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==} - engines: {node: '>=12'} - data-uri-to-buffer@2.0.2: resolution: {integrity: sha512-ND9qDTLc6diwj+Xe5cdAgVTbLVdXbtxTJRXRhli8Mowuaan+0EJOtdqJ0QCHNSSPyoXGx9HX2/VMnKeC34AChA==} @@ -2537,9 +2389,6 @@ packages: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: resolution: {directory: packages/kit/test/apps/dev-only/_test_dependencies/cjs-only, type: directory} - electron-to-chromium@1.4.736: - resolution: {integrity: sha512-Rer6wc3ynLelKNM4lOCg7/zPQj8tPOCB2hzD32PX9wd3hgRRi9MxEbmkFCokzcEhRVMiOVLjnL9ig9cefJ+6+Q==} - emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} @@ -2561,10 +2410,6 @@ packages: engines: {node: '>=12'} hasBin: true - escalade@3.1.2: - resolution: {integrity: sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==} - engines: {node: '>=6'} - escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2712,10 +2557,6 @@ packages: picomatch: optional: true - fenceparser@1.1.1: - resolution: {integrity: sha512-VdkTsK7GWLT0VWMK5S5WTAPn61wJ98WPFwJiRHumhg4ESNUO/tnkU8bzzzc62o6Uk1SVhuZFLnakmDA4SGV7wA==} - engines: {node: '>=12'} - file-entry-cache@8.0.0: resolution: {integrity: sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==} engines: {node: '>=16.0.0'} @@ -2742,9 +2583,6 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} - flexsearch@0.7.43: - resolution: {integrity: sha512-c5o/+Um8aqCSOXGcZoqZOm+NqtVwNsvVpWv6lfmSclU954O3wvQKxxK8zj74fPaSJbXpSLTs4PRhh+wnoCXnKg==} - fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2899,10 +2737,6 @@ packages: inherits@2.0.4: resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} - internmap@2.0.3: - resolution: {integrity: sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==} - engines: {node: '>=12'} - is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} @@ -2974,9 +2808,6 @@ packages: json-stable-stringify-without-jsonify@1.0.1: resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} - jsonc-parser@3.2.1: - resolution: {integrity: sha512-AilxAyFOAcK5wA1+LeaySVBrHsGQvUFCDWXKpZjzaL0PqW+xfBOttn8GNtWKFWqneyMZj41MWF9Kl6iPWLwgOA==} - jsonfile@4.0.0: resolution: {integrity: sha512-m6F1R3z8jjlf2imQHS2Qez5sjKWQzbuuhuJ/FKYFRZvPE3PuHcSMVZzfsLhGVOkfd20obL5SWEBew5ShlquNxg==} @@ -3090,10 +2921,6 @@ packages: lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - lz-string@1.5.0: - resolution: {integrity: sha512-h5bgJWpxJNswbU7qCrV0tIKQCaS3blPDrqKWx+QxzuzL1zGUzij9XCWLrSLsJPu5t+eWA/ycetzYAO5IOMcWAQ==} - hasBin: true - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -3104,11 +2931,6 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} - marked@12.0.1: - resolution: {integrity: sha512-Y1/V2yafOcOdWQCX0XpAKXzDakPOpn6U0YLxTJs3cww6VxOzZV1BTOOYWLvH3gX38cq+iLwljHHTnMtlDfg01Q==} - engines: {node: '>= 18'} - hasBin: true - marked@14.1.1: resolution: {integrity: sha512-eS59oxof5eBVDCKTs+mJbvB/6Vq137GbimF9wkTIlto2/B2ppY5nigUUQgKVmA3bI2mPTIshUyDj5j612ZxlQQ==} engines: {node: '>= 18'} @@ -3220,9 +3042,6 @@ packages: resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true - node-releases@2.0.14: - resolution: {integrity: sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==} - nopt@5.0.0: resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} engines: {node: '>=6'} @@ -3428,8 +3247,8 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.2.5: - resolution: {integrity: sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==} + prettier@3.1.1: + resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} engines: {node: '>=14'} hasBin: true @@ -3440,13 +3259,6 @@ packages: printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - prism-svelte@0.5.0: - resolution: {integrity: sha512-db91Bf3pRGKDPz1lAqLFSJXeW13mulUJxhycysFpfXV5MIK7RgWWK2E5aPAa71s8TCzQUXxF5JOV42/iOs6QkA==} - - prismjs@1.29.0: - resolution: {integrity: sha512-Kx/1w86q/epKcmte75LNrEoT+lX8pBpavuAbvJWRXar7Hz8jrtF+e3vY751p0R8H9HdArwaCTNDDzHg/ScJK1Q==} - engines: {node: '>=6'} - prompts@2.4.2: resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} engines: {node: '>= 6'} @@ -3591,14 +3403,6 @@ packages: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} - shiki-twoslash@3.1.2: - resolution: {integrity: sha512-JBcRIIizi+exIA/OUhYkV6jtyeZco0ykCkIRd5sgwIt1Pm4pz+maoaRZpm6SkhPwvif4fCA7xOtJOykhpIV64Q==} - peerDependencies: - typescript: '>3' - - shiki@0.10.1: - resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} - siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} @@ -3726,12 +3530,6 @@ packages: peerDependencies: svelte: ^3.0.0 || ^4.0.0 || ^5.0.0-next.1 - svelte-persisted-store@0.9.4: - resolution: {integrity: sha512-Em3cDSsd3fAkQhvNc4+V7ZT86GnIkFrlcKK/oNSHFhF5fbNoavdxvtTZ0pCF2ueG/Oqg5kSbAFxn0rkeICpHUA==} - engines: {node: '>=0.14'} - peerDependencies: - svelte: ^3.48.0 || ^4.0.0 || ^5.0.0-next.0 - svelte-preprocess@6.0.0: resolution: {integrity: sha512-sbyHnWBwIphuaJWC7hnJd6ZoW/VN0va3jVb/8dDfeT2+0hVmo1DCx+zBK0/JfUKQmzg/FOEtcsGKRnbt8pRRkw==} engines: {node: '>= 18.0.0'} @@ -3824,10 +3622,6 @@ packages: resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} engines: {node: '>=8.0'} - topojson-client@3.1.0: - resolution: {integrity: sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==} - hasBin: true - totalist@3.0.1: resolution: {integrity: sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==} engines: {node: '>=6'} @@ -3864,11 +3658,6 @@ packages: typescript: optional: true - typescript@5.0.4: - resolution: {integrity: sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==} - engines: {node: '>=12.20'} - hasBin: true - typescript@5.4.5: resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} engines: {node: '>=14.17'} @@ -3891,12 +3680,6 @@ packages: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} - update-browserslist-db@1.0.13: - resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} - hasBin: true - peerDependencies: - browserslist: '>= 4.21.0' - uri-js@4.4.1: resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} @@ -3981,12 +3764,6 @@ packages: jsdom: optional: true - vscode-oniguruma@1.7.0: - resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} - - vscode-textmate@5.2.0: - resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} - webidl-conversions@3.0.1: resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} @@ -4744,13 +4521,6 @@ snapshots: tiny-glob: 0.2.9 vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - '@sveltejs/site-kit@6.0.0-next.64(@sveltejs/kit@packages+kit)(svelte@4.2.19)': - dependencies: - '@sveltejs/kit': link:packages/kit - esm-env: 1.0.0 - svelte: 4.2.19 - svelte-persisted-store: 0.9.4(svelte@4.2.19) - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) @@ -4793,10 +4563,6 @@ snapshots: '@types/cookie@0.6.0': {} - '@types/d3-geo@3.1.0': - dependencies: - '@types/geojson': 7946.0.14 - '@types/eslint@8.56.12': dependencies: '@types/estree': 1.0.6 @@ -4804,8 +4570,6 @@ snapshots: '@types/estree@1.0.6': {} - '@types/geojson@7946.0.14': {} - '@types/json-schema@7.0.15': {} '@types/node-forge@1.3.11': @@ -4916,26 +4680,6 @@ snapshots: '@typescript-eslint/types': 8.4.0 eslint-visitor-keys: 3.4.3 - '@typescript/twoslash@3.1.0': - dependencies: - '@typescript/vfs': 1.3.5 - debug: 4.3.5 - lz-string: 1.5.0 - transitivePeerDependencies: - - supports-color - - '@typescript/vfs@1.3.4': - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - - '@typescript/vfs@1.3.5': - dependencies: - debug: 4.3.5 - transitivePeerDependencies: - - supports-color - '@vercel/nft@0.27.1': dependencies: '@mapbox/node-pre-gyp': 1.0.11 @@ -4954,11 +4698,6 @@ snapshots: - encoding - supports-color - '@vercel/speed-insights@1.0.11(@sveltejs/kit@packages+kit)(svelte@4.2.19)': - optionalDependencies: - '@sveltejs/kit': link:packages/kit - svelte: 4.2.19 - '@vitest/expect@2.0.1': dependencies: '@vitest/spy': 2.0.1 @@ -5083,19 +4822,10 @@ snapshots: dependencies: fill-range: 7.1.1 - browserslist@4.23.0: - dependencies: - caniuse-lite: 1.0.30001609 - electron-to-chromium: 1.4.736 - node-releases: 2.0.14 - update-browserslist-db: 1.0.13(browserslist@4.23.0) - cac@6.7.14: {} callsites@3.1.0: {} - caniuse-lite@1.0.30001609: {} - capnp-ts@0.7.0: dependencies: debug: 4.3.5 @@ -5168,10 +4898,6 @@ snapshots: color-convert: 2.0.1 color-string: 1.9.1 - commander@2.20.3: {} - - commander@7.2.0: {} - commondir@1.0.1: {} concat-map@0.0.1: {} @@ -5211,20 +4937,6 @@ snapshots: cssesc@3.0.0: {} - d3-array@3.2.4: - dependencies: - internmap: 2.0.3 - - d3-geo-projection@4.0.0: - dependencies: - commander: 7.2.0 - d3-array: 3.2.4 - d3-geo: 3.1.1 - - d3-geo@3.1.1: - dependencies: - d3-array: 3.2.4 - data-uri-to-buffer@2.0.2: {} dataloader@1.4.0: {} @@ -5251,7 +4963,8 @@ snapshots: detect-indent@6.1.0: {} - detect-libc@1.0.3: {} + detect-libc@1.0.3: + optional: true detect-libc@2.0.3: {} @@ -5284,8 +4997,6 @@ snapshots: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: {} - electron-to-chromium@1.4.736: {} - emoji-regex@8.0.0: {} enhanced-resolve@5.17.1: @@ -5349,8 +5060,6 @@ snapshots: '@esbuild/win32-ia32': 0.21.5 '@esbuild/win32-x64': 0.21.5 - escalade@3.1.2: {} - escape-string-regexp@4.0.0: {} eslint-compat-utils@0.5.1(eslint@9.6.0): @@ -5537,8 +5246,6 @@ snapshots: optionalDependencies: picomatch: 4.0.2 - fenceparser@1.1.1: {} - file-entry-cache@8.0.0: dependencies: flat-cache: 4.0.1 @@ -5566,8 +5273,6 @@ snapshots: flatted@3.3.1: {} - flexsearch@0.7.43: {} - fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -5720,8 +5425,6 @@ snapshots: inherits@2.0.4: {} - internmap@2.0.3: {} - is-arrayish@0.3.2: {} is-binary-path@2.1.0: @@ -5779,8 +5482,6 @@ snapshots: json-stable-stringify-without-jsonify@1.0.1: {} - jsonc-parser@3.2.1: {} - jsonfile@4.0.0: optionalDependencies: graceful-fs: 4.2.11 @@ -5840,6 +5541,7 @@ snapshots: lightningcss-linux-x64-gnu: 1.24.1 lightningcss-linux-x64-musl: 1.24.1 lightningcss-win32-x64-msvc: 1.24.1 + optional: true lilconfig@2.1.0: {} @@ -5872,8 +5574,6 @@ snapshots: pseudomap: 1.0.2 yallist: 2.1.2 - lz-string@1.5.0: {} - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -5886,8 +5586,6 @@ snapshots: dependencies: semver: 6.3.1 - marked@12.0.1: {} - marked@14.1.1: {} mdn-data@2.0.30: {} @@ -5978,8 +5676,6 @@ snapshots: node-gyp-build@4.8.0: {} - node-releases@2.0.14: {} - nopt@5.0.0: dependencies: abbrev: 1.1.1 @@ -6143,14 +5839,14 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.1.2(prettier@3.2.5)(svelte@4.2.19): + prettier-plugin-svelte@3.1.2(prettier@3.1.1)(svelte@4.2.19): dependencies: - prettier: 3.2.5 + prettier: 3.1.1 svelte: 4.2.19 prettier@2.8.8: {} - prettier@3.2.5: {} + prettier@3.1.1: {} pretty-format@29.7.0: dependencies: @@ -6160,10 +5856,6 @@ snapshots: printable-characters@1.0.42: {} - prism-svelte@0.5.0: {} - - prismjs@1.29.0: {} - prompts@2.4.2: dependencies: kleur: 3.0.3 @@ -6327,22 +6019,6 @@ snapshots: shebang-regex@3.0.0: {} - shiki-twoslash@3.1.2(typescript@5.0.4): - dependencies: - '@typescript/twoslash': 3.1.0 - '@typescript/vfs': 1.3.4 - fenceparser: 1.1.1 - shiki: 0.10.1 - typescript: 5.0.4 - transitivePeerDependencies: - - supports-color - - shiki@0.10.1: - dependencies: - jsonc-parser: 3.2.1 - vscode-oniguruma: 1.7.0 - vscode-textmate: 5.2.0 - siginfo@2.0.0: {} signal-exit@3.0.7: {} @@ -6464,10 +6140,6 @@ snapshots: dependencies: svelte: 4.2.19 - svelte-persisted-store@0.9.4(svelte@4.2.19): - dependencies: - svelte: 4.2.19 - svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.4.5): dependencies: detect-indent: 6.1.0 @@ -6543,10 +6215,6 @@ snapshots: dependencies: is-number: 7.0.0 - topojson-client@3.1.0: - dependencies: - commander: 2.20.3 - totalist@3.0.1: {} tr46@0.0.3: {} @@ -6581,8 +6249,6 @@ snapshots: - eslint - supports-color - typescript@5.0.4: {} - typescript@5.4.5: {} ufo@1.5.3: {} @@ -6604,12 +6270,6 @@ snapshots: universalify@0.1.2: {} - update-browserslist-db@1.0.13(browserslist@4.23.0): - dependencies: - browserslist: 4.23.0 - escalade: 3.1.2 - picocolors: 1.1.0 - uri-js@4.4.1: dependencies: punycode: 2.3.1 @@ -6694,10 +6354,6 @@ snapshots: - supports-color - terser - vscode-oniguruma@1.7.0: {} - - vscode-textmate@5.2.0: {} - webidl-conversions@3.0.1: {} whatwg-url@5.0.0: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 061febda7d04..a390bbed591a 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,5 @@ packages: - 'packages/*' - - 'sites/*' - 'packages/adapter-static/test/apps/*' - 'packages/kit/test/apps/*' - 'packages/kit/test/prerendering/*' diff --git a/sites/kit.svelte.dev/.gitignore b/sites/kit.svelte.dev/.gitignore deleted file mode 100644 index ee68d9012e07..000000000000 --- a/sites/kit.svelte.dev/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -.DS_Store -.env -/.svelte-kit/ -/.snippets -/.vercel/ -/build/ -/functions/ -/src/lib/generated/type-info.js diff --git a/sites/kit.svelte.dev/.prettierignore b/sites/kit.svelte.dev/.prettierignore deleted file mode 100644 index 1a660d2ed75c..000000000000 --- a/sites/kit.svelte.dev/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -src/routes/edge.svg/land-110m.json diff --git a/sites/kit.svelte.dev/README.md b/sites/kit.svelte.dev/README.md deleted file mode 100644 index dcc5e5381231..000000000000 --- a/sites/kit.svelte.dev/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# kit.svelte.dev - -This is the SvelteKit website. The docs live [here](../../documentation). - -## Developing - -Once you've [set up the repo](../../CONTRIBUTING.md#preparing), `cd` into this directory and start the dev server: - -```bash -cd sites/kit.svelte.dev -pnpm run update -pnpm dev -``` diff --git a/sites/kit.svelte.dev/package.json b/sites/kit.svelte.dev/package.json deleted file mode 100644 index 124d9c9f4588..000000000000 --- a/sites/kit.svelte.dev/package.json +++ /dev/null @@ -1,45 +0,0 @@ -{ - "name": "kit.svelte.dev", - "private": true, - "version": "0.0.1", - "scripts": { - "lint": "prettier --check .", - "format": "prettier --write .", - "update": "node scripts/types", - "dev": "pnpm run update && vite dev", - "build": "pnpm run update && vite build", - "prebuild": "test \"$CI\" = true && npx pnpm install --store=node_modules/.pnpm-store || echo skipping pnpm install", - "preview": "vite preview", - "test": "vitest run" - }, - "devDependencies": { - "@sveltejs/adapter-vercel": "workspace:^", - "@sveltejs/amp": "workspace:^", - "@sveltejs/enhanced-img": "workspace:^", - "@sveltejs/kit": "workspace:^", - "@sveltejs/site-kit": "6.0.0-next.64", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "@types/d3-geo": "^3.1.0", - "@types/node": "^18.19.48", - "@vercel/speed-insights": "^1.0.0", - "browserslist": "^4.22.2", - "flexsearch": "^0.7.31", - "lightningcss": "^1.22.1", - "marked": "^12.0.0", - "prettier": "^3.1.1", - "prettier-plugin-svelte": "^3.1.2", - "prism-svelte": "^0.5.0", - "prismjs": "^1.29.0", - "shiki-twoslash": "^3.1.2", - "svelte": "^4.2.10", - "typescript": "5.0.4", - "vite": "^5.3.2", - "vitest": "^2.0.1" - }, - "type": "module", - "dependencies": { - "d3-geo": "^3.1.0", - "d3-geo-projection": "^4.0.0", - "topojson-client": "^3.1.0" - } -} diff --git a/sites/kit.svelte.dev/scripts/tsconfig.json b/sites/kit.svelte.dev/scripts/tsconfig.json deleted file mode 100644 index d47321a09d38..000000000000 --- a/sites/kit.svelte.dev/scripts/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "module": "ESNext", - "target": "ESNext", - "moduleResolution": "Bundler", - "allowJs": true, - "outDir": "./dist", - "checkJs": true, - "strict": true - }, - "include": ["**/*.ts", "**/*.js"] -} diff --git a/sites/kit.svelte.dev/scripts/types/index.js b/sites/kit.svelte.dev/scripts/types/index.js deleted file mode 100644 index 556cc47bbd9c..000000000000 --- a/sites/kit.svelte.dev/scripts/types/index.js +++ /dev/null @@ -1,327 +0,0 @@ -import { readFile, readdir, writeFile } from 'node:fs/promises'; -import path from 'node:path'; -import { fileURLToPath } from 'node:url'; -import { format } from 'prettier'; -import ts from 'typescript'; -import { mkdirp } from '../../../../packages/kit/src/utils/filesystem.js'; - -/** - * @typedef {{ - * name: string; - * comment: string; - * markdown?: string; - * snippet: string; - * deprecated: string | null; - * children: Extracted[] } - * } Extracted - */ - -/** @type {Array<{ name: string; comment: string; exports: Extracted[]; types: Extracted[]; exempt?: boolean; }>} */ -const modules = []; - -/** - * @param {string} code - * @param {ts.NodeArray} statements - */ -async function get_types(code, statements) { - /** @type {Extracted[]} */ - const exports = []; - - /** @type {Extracted[]} */ - const types = []; - - if (statements) { - for (const statement of statements) { - const modifiers = ts.canHaveModifiers(statement) ? ts.getModifiers(statement) : undefined; - - const export_modifier = modifiers?.find( - (modifier) => modifier.kind === ts.SyntaxKind.ExportKeyword - ); - - if (!export_modifier) continue; - - if ( - ts.isClassDeclaration(statement) || - ts.isInterfaceDeclaration(statement) || - ts.isTypeAliasDeclaration(statement) || - ts.isModuleDeclaration(statement) || - ts.isVariableStatement(statement) || - ts.isFunctionDeclaration(statement) - ) { - const name_node = ts.isVariableStatement(statement) - ? statement.declarationList.declarations[0] - : statement; - - // @ts-ignore no idea why it's complaining here - const name = name_node.name?.escapedText; - - let start = statement.pos; - let comment = ''; - /** @type {string | null} */ - let deprecated_notice = null; - - // @ts-ignore i think typescript is bad at typescript - if (statement.jsDoc) { - // @ts-ignore - const jsDoc = statement.jsDoc[0]; - - // `@link` JSDoc tags (and maybe others?) turn this property into an array, which we need to join manually - if (Array.isArray(jsDoc.comment)) { - comment = jsDoc.comment - .map(({ name, text }) => (name ? `\`${name.escapedText}\`` : text)) - .join(''); - } else { - comment = jsDoc.comment; - } - - if (jsDoc?.tags?.[0]?.tagName?.escapedText === 'deprecated') { - deprecated_notice = jsDoc.tags[0].comment; - } - - // @ts-ignore - start = jsDoc.end; - } - - const i = code.indexOf('export', start); - start = i + 6; - - /** @type {Extracted[]} */ - let children = []; - - let snippet_unformatted = code.slice(start, statement.end).trim(); - - if (ts.isInterfaceDeclaration(statement) || ts.isClassDeclaration(statement)) { - if (statement.members.length > 0) { - for (const member of statement.members) { - // @ts-ignore - children.push(munge_type_element(member)); - } - - children = children.filter(Boolean); - - // collapse `interface Foo {/* lots of stuff*/}` into `interface Foo {…}` - const first = statement.members.at(0); - const last = statement.members.at(-1); - - let body_start = first.pos - start; - while (snippet_unformatted[body_start] !== '{') body_start -= 1; - - let body_end = last.end - start; - while (snippet_unformatted[body_end] !== '}') body_end += 1; - - snippet_unformatted = - snippet_unformatted.slice(0, body_start + 1) + - '/*…*/' + - snippet_unformatted.slice(body_end); - } - } - - const snippet = ( - await format(snippet_unformatted, { - parser: 'typescript', - printWidth: 60, - useTabs: true, - singleQuote: true, - trailingComma: 'none' - }) - ) - .replace(/\s*(\/\*…\*\/)\s*/g, '/*…*/') - .trim(); - - const collection = - ts.isVariableStatement(statement) || ts.isFunctionDeclaration(statement) - ? exports - : types; - - collection.push({ - name, - comment, - snippet, - children, - deprecated: deprecated_notice - }); - } - } - - types.sort((a, b) => (a.name < b.name ? -1 : 1)); - exports.sort((a, b) => (a.name < b.name ? -1 : 1)); - } - - return { types, exports }; -} - -/** - * @param {ts.TypeElement} member - */ -function munge_type_element(member, depth = 1) { - // @ts-ignore - const doc = member.jsDoc?.[0]; - - if (/private api/i.test(doc?.comment)) return; - - /** @type {string[]} */ - const children = []; - - const name = member.name?.escapedText ?? member.name?.getText() ?? 'unknown'; - let snippet = member.getText(); - - for (let i = -1; i < depth; i += 1) { - snippet = snippet.replace(/^\t/gm, ''); - } - - if ( - ts.isPropertySignature(member) && - ts.isTypeLiteralNode(member.type) && - member.type.members.some((member) => member.jsDoc?.[0].comment) - ) { - let a = 0; - while (snippet[a] !== '{') a += 1; - - snippet = snippet.slice(0, a + 1) + '/*…*/}'; - - for (const child of member.type.members) { - children.push(munge_type_element(child, depth + 1)); - } - } - - /** @type {string[]} */ - const bullets = []; - - for (const tag of doc?.tags ?? []) { - const type = tag.tagName.escapedText; - - switch (tag.tagName.escapedText) { - case 'private': - bullets.push(`- private ${tag.comment || ''}`); - break; - - case 'readonly': - bullets.push(`- readonly ${tag.comment || ''}`); - break; - - case 'param': - bullets.push(`- \`${tag.name.getText()}\` ${tag.comment || ''}`); - break; - - case 'default': - bullets.push(`- default \`${tag.comment || ''}\``); - break; - - case 'returns': - bullets.push(`- returns ${tag.comment || ''}`); - break; - - case 'deprecated': - bullets.push(`- deprecated ${tag.comment || ''}`); - break; - - default: - console.log(`unhandled JSDoc tag: ${type}`); - } - } - - return { - name, - snippet, - comment: (doc?.comment ?? '') - .replace(/\/\/\/ type: (.+)/g, '/** @type {$1} */') - .replace(/^( )+/gm, (match, spaces) => { - return '\t'.repeat(match.length / 2); - }), - bullets, - children - }; -} - -/** - * Type declarations include fully qualified URLs so that they become links when - * you hover over names in an editor with TypeScript enabled. We need to remove - * the origin so that they become root-relative, so that they work in preview - * deployments and when developing locally - * @param {string} str - */ -function strip_origin(str) { - return str.replace(/https:\/\/kit\.svelte\.dev/g, ''); -} - -/** - * @param {string} file - */ -async function read_d_ts_file(file) { - const resolved = path.resolve('../../packages/kit', file); - - // We can't use JSDoc comments inside JSDoc, so we would get ts(7031) errors if - // we didn't ignore this error specifically for `/// file:` code examples - const str = await readFile(resolved, 'utf-8'); - - //! For some reason, typescript 5.1> is reading this @errors as a jsdoc tag, and splitting it into separate pieces - return str.replace(/(\s*\*\s*)```js([\s\S]+?)```/g, (match, prefix, code) => { - return `${prefix}\`\`\`js${prefix}// @errors: 7031${code}\`\`\``; - }); -} - -{ - const code = await read_d_ts_file('src/types/private.d.ts'); - const node = ts.createSourceFile('private.d.ts', code, ts.ScriptTarget.Latest, true); - - modules.push({ - name: 'Private types', - comment: '', - ...(await get_types(code, node.statements)) - }); -} - -const dir = fileURLToPath( - new URL('../../../../packages/kit/src/types/synthetic', import.meta.url).href -); -for (const file of await readdir(dir)) { - if (!file.endsWith('.md')) continue; - - const comment = strip_origin(await read_d_ts_file(`${dir}/${file}`)); - - modules.push({ - name: file.replace(/\+/g, '/').slice(0, -3), - comment, - exports: [], - types: [], - exempt: true - }); -} - -{ - const code = await read_d_ts_file('types/index.d.ts'); - const node = ts.createSourceFile('index.d.ts', code, ts.ScriptTarget.Latest, true); - - for (const statement of node.statements) { - if (ts.isModuleDeclaration(statement)) { - // @ts-ignore - const name = statement.name.text || statement.name.escapedText; - - // @ts-ignore - const comment = strip_origin(statement.jsDoc?.[0].comment ?? ''); - - modules.push({ - name, - comment, - // @ts-ignore - ...(await get_types(code, statement.body?.statements)) - }); - } - } -} - -modules.sort((a, b) => (a.name < b.name ? -1 : 1)); - -mkdirp('src/lib/generated'); -writeFile( - 'src/lib/generated/type-info.js', - ` -/* This file is generated by running \`pnpm run update\` - in the sites/kit.svelte.dev directory — do not edit it */ -export const modules = /** @type {import('@sveltejs/site-kit/markdown').Modules} */ (${JSON.stringify( - modules.filter((m) => !m.name.startsWith('_')), - null, - ' ' - )}); -`.trim() -); diff --git a/sites/kit.svelte.dev/src/app.d.ts b/sites/kit.svelte.dev/src/app.d.ts deleted file mode 100644 index f59b884c51ed..000000000000 --- a/sites/kit.svelte.dev/src/app.d.ts +++ /dev/null @@ -1,12 +0,0 @@ -// See https://kit.svelte.dev/docs/types#app -// for information about these interfaces -declare global { - namespace App { - // interface Error {} - // interface Locals {} - // interface PageData {} - // interface Platform {} - } -} - -export {}; diff --git a/sites/kit.svelte.dev/src/app.html b/sites/kit.svelte.dev/src/app.html deleted file mode 100644 index cdd57db42d05..000000000000 --- a/sites/kit.svelte.dev/src/app.html +++ /dev/null @@ -1,61 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - %sveltekit.head% - - - - -
%sveltekit.body%
- - diff --git a/sites/kit.svelte.dev/src/hooks.server.js b/sites/kit.svelte.dev/src/hooks.server.js deleted file mode 100644 index 572abb94ea5c..000000000000 --- a/sites/kit.svelte.dev/src/hooks.server.js +++ /dev/null @@ -1,23 +0,0 @@ -const redirects = { - '/docs/amp': '/docs/seo#manual-setup-amp', - '/docs/assets': '/docs/images', - '/docs/typescript': '/docs/types' -}; - -const preload_types = ['js', 'css', 'font']; - -/** @type {import('@sveltejs/kit').Handle} */ -export function handle({ event, resolve }) { - if (event.url.pathname in redirects) { - return new Response(undefined, { - status: 308, - headers: { - location: redirects[event.url.pathname] - } - }); - } - - return resolve(event, { - preload: ({ type }) => preload_types.includes(type) - }); -} diff --git a/sites/kit.svelte.dev/src/lib/icons/left-small.svg b/sites/kit.svelte.dev/src/lib/icons/left-small.svg deleted file mode 100644 index ee413e35514e..000000000000 --- a/sites/kit.svelte.dev/src/lib/icons/left-small.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/lib/icons/pause.svg b/sites/kit.svelte.dev/src/lib/icons/pause.svg deleted file mode 100644 index a01d92df27cf..000000000000 --- a/sites/kit.svelte.dev/src/lib/icons/pause.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/sites/kit.svelte.dev/src/lib/icons/play.svg b/sites/kit.svelte.dev/src/lib/icons/play.svg deleted file mode 100644 index d99c4ec90f44..000000000000 --- a/sites/kit.svelte.dev/src/lib/icons/play.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/sites/kit.svelte.dev/src/lib/icons/plus.svg b/sites/kit.svelte.dev/src/lib/icons/plus.svg deleted file mode 100644 index 4826bcaf2caf..000000000000 --- a/sites/kit.svelte.dev/src/lib/icons/plus.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/lib/icons/search.svg b/sites/kit.svelte.dev/src/lib/icons/search.svg deleted file mode 100644 index b588f60bf2a1..000000000000 --- a/sites/kit.svelte.dev/src/lib/icons/search.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - \ No newline at end of file diff --git a/sites/kit.svelte.dev/src/lib/icons/up-small.svg b/sites/kit.svelte.dev/src/lib/icons/up-small.svg deleted file mode 100644 index f067962cf72b..000000000000 --- a/sites/kit.svelte.dev/src/lib/icons/up-small.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/lib/server/docs/index.js b/sites/kit.svelte.dev/src/lib/server/docs/index.js deleted file mode 100644 index 2c467fa9f6c2..000000000000 --- a/sites/kit.svelte.dev/src/lib/server/docs/index.js +++ /dev/null @@ -1,127 +0,0 @@ -import { base } from '$app/paths'; -import { modules } from '$lib/generated/type-info.js'; -import { - escape, - extractFrontmatter, - markedTransform, - normalizeSlugify, - removeMarkdown, - replaceExportTypePlaceholders -} from '@sveltejs/site-kit/markdown'; -import { render_content } from '../renderer'; -import { read } from '$app/server'; -import { error } from '@sveltejs/kit'; - -const meta = import.meta.glob('../../../../../../documentation/docs/*/index.md', { - query: '?url', - import: 'default', - eager: true -}); - -const markdown = import.meta.glob( - '../../../../../../documentation/docs/*/[[:digit:]][[:digit:]]-*.md', - { - query: '?url', - import: 'default', - eager: true - } -); - -export const categories = {}; -export const pages = {}; - -for (const [file, asset] of Object.entries(meta)) { - const slug = /\/\d{2}-(.+)\/index\.md$/.exec(file)[1]; - - const { - metadata: { title, draft } - } = extractFrontmatter(await read(asset).text()); - - if (draft) continue; - - categories[slug] = { - title, - pages: [] - }; -} - -for (const [file, asset] of Object.entries(markdown)) { - const [, category_dir, basename] = /\/(\d{2}-.+?)\/(\d{2}-.+\.md)$/.exec(file); - const category_slug = category_dir.slice(3); - const slug = basename.slice(3, -3); // strip the number prefix and .md suffix - - const category = categories[category_slug]; - if (!category) continue; // draft - - const { - metadata: { draft, title, rank }, - body - } = extractFrontmatter(await read(asset).text()); - - if (draft === 'true') continue; - - category.pages.push({ - title, - path: `${base}/docs/${slug}` - }); - - pages[slug] = { - rank: +rank || undefined, - category: category.title, - title, - file: `${category_dir}/${basename}`, - slug, - path: slug, - sections: await get_sections(body), - body - }; -} - -/** @param {string} slug */ -export async function get_parsed_docs(slug) { - const page = pages[slug]; - if (!page) error(404); - - // TODO this should probably use a type from site-kit - return { - category: page.category, - title: page.title, - file: page.file, - path: page.path, - slug: page.slug, - sections: page.sections, - content: await render_content(page.file, page.body) - }; -} - -export function get_docs_list() { - return Object.values(categories); -} - -/** @param {string} markdown */ -async function get_sections(markdown) { - /** @type {import('./types.js').Section[]} */ - const second_level_headings = []; - - const pattern = /^##\s+(.*)$/gm; - let match; - - const placeholders_rendered = await replaceExportTypePlaceholders(markdown, modules); - - while ((match = pattern.exec(placeholders_rendered)) !== null) { - second_level_headings.push({ - title: removeMarkdown( - escape(await markedTransform(match[1], { paragraph: (txt) => txt })) - .replace(/<\/?code>/g, '') - .replace(/'/g, "'") - .replace(/"/g, '"') - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/<(\/)?(em|b|strong|code)>/g, '') - ), - slug: normalizeSlugify(match[1]) - }); - } - - return second_level_headings; -} diff --git a/sites/kit.svelte.dev/src/lib/server/docs/types.d.ts b/sites/kit.svelte.dev/src/lib/server/docs/types.d.ts deleted file mode 100644 index 6b984d72eb27..000000000000 --- a/sites/kit.svelte.dev/src/lib/server/docs/types.d.ts +++ /dev/null @@ -1,24 +0,0 @@ -export type DocsData = Category[]; - -export interface Section { - title: string; - slug: string; - /** Currently, we are only going with 2 level headings, so this will be undefined. In future, we may want to support 3 levels, in which case this will be a list of sections */ - sections?: Section[]; -} - -export type Category = { - title: string; - slug: string; - pages: Page[]; -}; - -export type Page = { - title: string; - slug: string; - file: string; - path: string; - category: string; - content: string; - sections: Section[]; -}; diff --git a/sites/kit.svelte.dev/src/lib/server/renderer.js b/sites/kit.svelte.dev/src/lib/server/renderer.js deleted file mode 100644 index 44bd5069beff..000000000000 --- a/sites/kit.svelte.dev/src/lib/server/renderer.js +++ /dev/null @@ -1,81 +0,0 @@ -import { modules } from '$lib/generated/type-info.js'; -import { renderContentMarkdown, slugify } from '@sveltejs/site-kit/markdown'; -import { parse_route_id } from '../../../../../packages/kit/src/utils/routing.js'; - -/** - * @param {string} filename - * @param {string} body - */ -export const render_content = (filename, body) => - renderContentMarkdown(filename, body, { - cacheCodeSnippets: true, - modules, - - resolveTypeLinks: (module_name, type_name) => { - if (module_name === '@sveltejs/kit') module_name = 'Public Types'; - - return { - page: `/docs/types`, - slug: `${slugify(module_name)}-${slugify(type_name)}` - }; - }, - - twoslashBanner: (filename, source, language, options) => { - const injected = []; - - if ( - source.includes('$app/') || - source.includes('$service-worker') || - source.includes('@sveltejs/kit/') - ) { - injected.push(`// @filename: ambient-kit.d.ts`, `/// `); - } - - if (source.includes('$env/')) { - // TODO we're hardcoding static env vars that are used in code examples - // in the types, which isn't... totally ideal, but will do for now - injected.push( - `declare module '$env/dynamic/private' { export const env: Record }`, - `declare module '$env/dynamic/public' { export const env: Record }`, - `declare module '$env/static/private' { export const API_KEY: string }`, - `declare module '$env/static/public' { export const PUBLIC_BASE_URL: string }` - ); - } - - if (source.includes('./$types') && !source.includes('@filename: $types.d.ts')) { - const params = parse_route_id(`${options.file}` || `+page.${language}`) - .params.map((param) => `${param.name}: string`) - .join(', '); - - injected.push( - `// @filename: $types.d.ts`, - `import type * as Kit from '@sveltejs/kit';`, - `export type PageLoad = Kit.Load<{${params}}>;`, - `export type PageServerLoad = Kit.ServerLoad<{${params}}>;`, - `export type LayoutLoad = Kit.Load<{${params}}>;`, - `export type LayoutServerLoad = Kit.ServerLoad<{${params}}>;`, - `export type RequestHandler = Kit.RequestHandler<{${params}}>;`, - `export type Action = Kit.Action<{${params}}>;`, - `export type Actions = Kit.Actions<{${params}}>;`, - `export type EntryGenerator = () => Promise> | Array<{${params}}>;` - ); - } - - // special case — we need to make allowances for code snippets coming - // from e.g. ambient.d.ts - if (filename.endsWith('30-modules.md')) { - injected.push('// @errors: 7006 7031'); - } - - if (filename.endsWith('10-configuration.md')) { - injected.push('// @errors: 2307'); - } - - // another special case - if (source.includes('$lib/types')) { - injected.push(`declare module '$lib/types' { export interface User {} }`); - } - - return injected.join('\n'); - } - }); diff --git a/sites/kit.svelte.dev/src/routes/+error.svelte b/sites/kit.svelte.dev/src/routes/+error.svelte deleted file mode 100644 index 0751ee710398..000000000000 --- a/sites/kit.svelte.dev/src/routes/+error.svelte +++ /dev/null @@ -1,65 +0,0 @@ - - - - {$page.status} - - -
- {#if $page.status === 404} -

Not found!

- {:else if online} -

Yikes!

- - {#if $page.error.message} -

{$page.status}: {$page.error.message}

- {/if} - -

Please try reloading the page.

- -

- If the error persists, please drop by Discord chatroom - and let us know, or raise an issue on - GitHub. Thanks! -

- {:else} -

It looks like you're offline

- -

Reload the page once you've found the internet.

- {/if} -
- - diff --git a/sites/kit.svelte.dev/src/routes/+layout.server.js b/sites/kit.svelte.dev/src/routes/+layout.server.js deleted file mode 100644 index 8479779fcf81..000000000000 --- a/sites/kit.svelte.dev/src/routes/+layout.server.js +++ /dev/null @@ -1,27 +0,0 @@ -import { fetchBanner } from '@sveltejs/site-kit/components'; - -export const prerender = true; - -export const load = async ({ url, fetch }) => { - const nav_links = fetch('/nav.json').then((r) => r.json()); // TODO why is this behind a `fetch`? does `nav.json` need to be exposed publicly? - const banner = fetchBanner('kit.svelte.dev', fetch); - - return { - nav_title: get_nav_title(url), - nav_links: await nav_links, - banner: await banner - }; -}; - -/** @param {URL} url */ -function get_nav_title(url) { - const list = new Map([[/^docs/, 'Docs']]); - - for (const [regex, title] of list) { - if (regex.test(url.pathname.replace(/^\/(.+)/, '$1'))) { - return title; - } - } - - return ''; -} diff --git a/sites/kit.svelte.dev/src/routes/+layout.svelte b/sites/kit.svelte.dev/src/routes/+layout.svelte deleted file mode 100644 index 39fee2b1c017..000000000000 --- a/sites/kit.svelte.dev/src/routes/+layout.svelte +++ /dev/null @@ -1,103 +0,0 @@ - - -
- - - - - - - -
- -{#if browser} - -{/if} - - diff --git a/sites/kit.svelte.dev/src/routes/+page.js b/sites/kit.svelte.dev/src/routes/+page.js deleted file mode 100644 index ad7a278713ef..000000000000 --- a/sites/kit.svelte.dev/src/routes/+page.js +++ /dev/null @@ -1,5 +0,0 @@ -export function load({ setHeaders }) { - setHeaders({ - 'cache-control': 'public, max-age=60' - }); -} diff --git a/sites/kit.svelte.dev/src/routes/+page.svelte b/sites/kit.svelte.dev/src/routes/+page.svelte deleted file mode 100644 index 4d2963c65641..000000000000 --- a/sites/kit.svelte.dev/src/routes/+page.svelte +++ /dev/null @@ -1,100 +0,0 @@ - - - - SvelteKit • Web development, streamlined - - - - - - - - - - - - {#if schema} - {@html schema} - {/if} - - -
-

SvelteKit

- - - - - - - - - - -
diff --git a/sites/kit.svelte.dev/src/routes/content.json/+server.js b/sites/kit.svelte.dev/src/routes/content.json/+server.js deleted file mode 100644 index af86cda12067..000000000000 --- a/sites/kit.svelte.dev/src/routes/content.json/+server.js +++ /dev/null @@ -1,10 +0,0 @@ -import { content } from './content.server.js'; -import { json } from '@sveltejs/kit'; - -export const prerender = true; - -export async function GET() { - return json({ - blocks: await content() - }); -} diff --git a/sites/kit.svelte.dev/src/routes/content.json/content.server.js b/sites/kit.svelte.dev/src/routes/content.json/content.server.js deleted file mode 100644 index 788b95f65dc7..000000000000 --- a/sites/kit.svelte.dev/src/routes/content.json/content.server.js +++ /dev/null @@ -1,114 +0,0 @@ -import { modules } from '$lib/generated/type-info.js'; -import { pages } from '$lib/server/docs/index.js'; -import { - markedTransform, - replaceExportTypePlaceholders, - slugify -} from '@sveltejs/site-kit/markdown'; - -const categories = [ - { - slug: 'docs', - label: null, - href: (parts) => - parts.length > 1 ? `/docs/${parts[0]}#${parts.slice(1).join('-')}` : `/docs/${parts[0]}` - } -]; - -export async function content() { - /** @type {import('@sveltejs/site-kit/search').Block[]} */ - const blocks = []; - - for (const category of categories) { - const breadcrumbs = category.label ? [category.label] : []; - - for (const [slug, page] of Object.entries(pages)) { - const body = await replaceExportTypePlaceholders(page.body, modules); - - const sections = body.trim().split(/^## /m); - const intro = sections.shift().trim(); - const rank = page.rank; - - blocks.push({ - breadcrumbs: [...breadcrumbs, page.title], - href: category.href([slug]), - content: await plaintext(intro), - rank - }); - - for (const section of sections) { - const lines = section.split('\n'); - const h3 = lines.shift(); - const content = lines.join('\n'); - - const subsections = content.trim().split('### '); - - const intro = subsections.shift().trim(); - - blocks.push({ - breadcrumbs: [...breadcrumbs, page.title, h3], - href: category.href([slug, slugify(h3)]), - content: await plaintext(intro), - rank - }); - - for (const subsection of subsections) { - const lines = subsection.split('\n'); - const h4 = lines.shift(); - - blocks.push({ - breadcrumbs: [...breadcrumbs, page.title, h3, h4], - href: category.href([slug, slugify(h3), slugify(h4)]), - content: await plaintext(lines.join('\n').trim()), - rank - }); - } - } - } - } - - return blocks; -} - -/** @param {string} markdown */ -async function plaintext(markdown) { - const block = (text) => `${text}\n`; - const inline = (text) => text; - - return ( - await markedTransform(markdown, { - code: (source) => - source - .split('// ---cut---\n') - .pop() - .replace(/^\/\/((\/ file:)|( @errors:))[\s\S]*/gm, ''), - blockquote: block, - html: () => '\n', - heading: (text) => `${text}\n`, - hr: () => '', - list: block, - listitem: block, - checkbox: block, - paragraph: (text) => `${text}\n\n`, - table: block, - tablerow: block, - tablecell: (text, opts) => { - return text + ' '; - }, - strong: inline, - em: inline, - codespan: inline, - br: () => '', - del: inline, - link: (href, title, text) => text, - image: (href, title, text) => text, - text: inline - }) - ) - .replace(/</g, '<') - .replace(/>/g, '>') - .replace(/&#(\d+);/g, (match, code) => { - return String.fromCharCode(code); - }) - .trim(); -} diff --git a/sites/kit.svelte.dev/src/routes/docs/+layout.server.js b/sites/kit.svelte.dev/src/routes/docs/+layout.server.js deleted file mode 100644 index 77f6b8ffcfb1..000000000000 --- a/sites/kit.svelte.dev/src/routes/docs/+layout.server.js +++ /dev/null @@ -1,9 +0,0 @@ -import { get_docs_list } from '$lib/server/docs/index.js'; - -export const prerender = true; - -export async function load() { - return { - sections: get_docs_list() - }; -} diff --git a/sites/kit.svelte.dev/src/routes/docs/+layout.svelte b/sites/kit.svelte.dev/src/routes/docs/+layout.svelte deleted file mode 100644 index d95c0a861249..000000000000 --- a/sites/kit.svelte.dev/src/routes/docs/+layout.svelte +++ /dev/null @@ -1,89 +0,0 @@ - - -
-
- {#if category} -

{category}

- {/if} - -
- -
- -
-
- - diff --git a/sites/kit.svelte.dev/src/routes/docs/+page.js b/sites/kit.svelte.dev/src/routes/docs/+page.js deleted file mode 100644 index 875f26286eee..000000000000 --- a/sites/kit.svelte.dev/src/routes/docs/+page.js +++ /dev/null @@ -1,5 +0,0 @@ -import { redirect } from '@sveltejs/kit'; - -export function load() { - redirect(307, `./docs/introduction`); -} diff --git a/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.server.js b/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.server.js deleted file mode 100644 index 5d0fdb672a75..000000000000 --- a/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.server.js +++ /dev/null @@ -1,7 +0,0 @@ -import { get_parsed_docs } from '$lib/server/docs/index.js'; - -export const prerender = true; - -export async function load({ params }) { - return { page: await get_parsed_docs(params.slug) }; -} diff --git a/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte b/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte deleted file mode 100644 index c917a1f7f291..000000000000 --- a/sites/kit.svelte.dev/src/routes/docs/[slug]/+page.svelte +++ /dev/null @@ -1,134 +0,0 @@ - - - - {data.page.title} • Docs • SvelteKit - - - - - - -
-

{data.page.title}

- - - Edit this page on GitHub - - - - -
- {@html data.page.content} -
- -
-
- previous - {#if prev} - {prev.title} - {/if} -
- -
- next - {#if next} - {next.title} - {/if} -
-
-
- - diff --git a/sites/kit.svelte.dev/src/routes/edge.svg/+server.js b/sites/kit.svelte.dev/src/routes/edge.svg/+server.js deleted file mode 100644 index 7cb4a3640d9c..000000000000 --- a/sites/kit.svelte.dev/src/routes/edge.svg/+server.js +++ /dev/null @@ -1,144 +0,0 @@ -import { geoPath } from 'd3-geo'; -import { geoSatellite } from 'd3-geo-projection'; -import * as topojson from 'topojson-client'; -import topology from './land-110m.json'; -import countries from './countries.json'; - -const land = topojson.feature(topology, topology.objects.land); - -const font_size = 36; - -/** - * distance of the satellite observer from the earth - * https://github.com/d3/d3-geo-projection#satellite_distance - */ -const distance = 8; - -const w = 1000; -const h = 1000; - -const rad_to_deg = 180 / Math.PI; - -const projection = geoSatellite() - .distance(distance) - .clipAngle(Math.acos(1 / distance) * rad_to_deg) - .translate([w / 2, h / 2]) - .scale(450) - .precision(0.5); - -let isDark = false; - -const path = geoPath(projection); - -/** - * @param {string | null} lat - * @param {string | null} lon - * @param {string} city - * @param {string} country - */ -function render(lat, lon, city, country) { - const coords = lat && lon ? [+lon, +lat] : [-74, 40.7]; - - // spin globe a little west of the user's location so that it isn't - // dead centre, and tilt them slightly towards the vertical center - projection.rotate([-coords[0] - 30, -coords[1] * (30 / 90), 0]); - - const dot = lon && lat ? projection([lon, lat]) : null; - - const MAX_LABEL_LENGTH = 27; - const DEFAULT_LABEL = 'Your location'; - - let label = [city, country].filter(Boolean).join(', ') || DEFAULT_LABEL; - if (label.length > MAX_LABEL_LENGTH) label = city ?? DEFAULT_LABEL; - if (label.length > MAX_LABEL_LENGTH) label = country ?? DEFAULT_LABEL; - if (label.length > MAX_LABEL_LENGTH) label = DEFAULT_LABEL; - - return ` - - - - - - - ${ - dot - ? ` - - - - - ${label.toUpperCase()} - ` - : '' - } - - `; -} - -export function GET({ request, url }) { - const h = request.headers; - - isDark = !!url.searchParams.has('dark'); - - const latitude = h.get('x-vercel-ip-latitude') ?? ''; - const longitude = h.get('x-vercel-ip-longitude') ?? ''; - const city = h.get('x-vercel-ip-city') ?? ''; - const country = countries[h.get('x-vercel-ip-country')]; - - const svg = render(latitude, longitude, decodeURIComponent(city), country).replace( - /\d\.\d+/g, - (match) => match.slice(0, 4) - ); - - return new Response(svg, { - headers: { - 'content-type': 'image/svg+xml', - 'cache-control': 'private, max-age=3600' - } - }); -} diff --git a/sites/kit.svelte.dev/src/routes/edge.svg/countries.json b/sites/kit.svelte.dev/src/routes/edge.svg/countries.json deleted file mode 100644 index bb92e51a95d5..000000000000 --- a/sites/kit.svelte.dev/src/routes/edge.svg/countries.json +++ /dev/null @@ -1,251 +0,0 @@ -{ - "AF": "Afghanistan", - "AL": "Albania", - "DZ": "Algeria", - "AS": "American Samoa", - "AD": "Andorra", - "AO": "Angola", - "AI": "Anguilla", - "AQ": "Antarctica", - "AG": "Antigua and Barbuda", - "AR": "Argentina", - "AM": "Armenia", - "AW": "Aruba", - "AU": "Australia", - "AT": "Austria", - "AZ": "Azerbaijan", - "BS": "Bahamas (the)", - "BH": "Bahrain", - "BD": "Bangladesh", - "BB": "Barbados", - "BY": "Belarus", - "BE": "Belgium", - "BZ": "Belize", - "BJ": "Benin", - "BM": "Bermuda", - "BT": "Bhutan", - "BO": "Bolivia", - "BQ": "Bonaire, Sint Eustatius and Saba", - "BA": "Bosnia and Herzegovina", - "BW": "Botswana", - "BV": "Bouvet Island", - "BR": "Brazil", - "IO": "British Indian Ocean Territory", - "BN": "Brunei Darussalam", - "BG": "Bulgaria", - "BF": "Burkina Faso", - "BI": "Burundi", - "CV": "Cabo Verde", - "KH": "Cambodia", - "CM": "Cameroon", - "CA": "Canada", - "KY": "Cayman Islands", - "CF": "Central African Republic", - "TD": "Chad", - "CL": "Chile", - "CN": "China", - "CX": "Christmas Island", - "CC": "Cocos (Keeling) Islands", - "CO": "Colombia", - "KM": "Comoros", - "CD": "Congo (Kinshasa)", - "CG": "Congo (Brazzaville)", - "CK": "Cook Islands", - "CR": "Costa Rica", - "HR": "Croatia", - "CU": "Cuba", - "CW": "Curaçao", - "CY": "Cyprus", - "CZ": "Czechia", - "CI": "Côte d'Ivoire", - "DK": "Denmark", - "DJ": "Djibouti", - "DM": "Dominica", - "DO": "Dominican Republic", - "EC": "Ecuador", - "EG": "Egypt", - "SV": "El Salvador", - "GQ": "Equatorial Guinea", - "ER": "Eritrea", - "EE": "Estonia", - "SZ": "Eswatini", - "ET": "Ethiopia", - "FK": "Falkland Islands", - "FO": "Faroe Islands", - "FJ": "Fiji", - "FI": "Finland", - "FR": "France", - "GF": "French Guiana", - "PF": "French Polynesia", - "TF": "French Southern Territories", - "GA": "Gabon", - "GM": "Gambia", - "GE": "Georgia", - "DE": "Germany", - "GH": "Ghana", - "GI": "Gibraltar", - "GR": "Greece", - "GL": "Greenland", - "GD": "Grenada", - "GP": "Guadeloupe", - "GU": "Guam", - "GT": "Guatemala", - "GG": "Guernsey", - "GN": "Guinea", - "GW": "Guinea-Bissau", - "GY": "Guyana", - "HT": "Haiti", - "HM": "Heard Island and McDonald Islands", - "VA": "Holy See", - "HN": "Honduras", - "HK": "Hong Kong", - "HU": "Hungary", - "IS": "Iceland", - "IN": "India", - "ID": "Indonesia", - "IR": "Iran", - "IQ": "Iraq", - "IE": "Ireland", - "IM": "Isle of Man", - "IL": "Israel", - "IT": "Italy", - "JM": "Jamaica", - "JP": "Japan", - "JE": "Jersey", - "JO": "Jordan", - "KZ": "Kazakhstan", - "KE": "Kenya", - "KI": "Kiribati", - "KP": "DPRK", - "KR": "Republic of Korea", - "KW": "Kuwait", - "KG": "Kyrgyzstan", - "LA": "Laos", - "LV": "Latvia", - "LB": "Lebanon", - "LS": "Lesotho", - "LR": "Liberia", - "LY": "Libya", - "LI": "Liechtenstein", - "LT": "Lithuania", - "LU": "Luxembourg", - "MO": "Macao", - "MG": "Madagascar", - "MW": "Malawi", - "MY": "Malaysia", - "MV": "Maldives", - "ML": "Mali", - "MT": "Malta", - "MH": "Marshall Islands", - "MQ": "Martinique", - "MR": "Mauritania", - "MU": "Mauritius", - "YT": "Mayotte", - "MX": "Mexico", - "FM": "Micronesia", - "MD": "Moldova", - "MC": "Monaco", - "MN": "Mongolia", - "ME": "Montenegro", - "MS": "Montserrat", - "MA": "Morocco", - "MZ": "Mozambique", - "MM": "Myanmar", - "NA": "Namibia", - "NR": "Nauru", - "NP": "Nepal", - "NL": "Netherlands", - "NC": "New Caledonia", - "NZ": "New Zealand", - "NI": "Nicaragua", - "NE": "Niger", - "NG": "Nigeria", - "NU": "Niue", - "NF": "Norfolk Island", - "MP": "Northern Mariana Islands", - "NO": "Norway", - "OM": "Oman", - "PK": "Pakistan", - "PW": "Palau", - "PS": "Palestine", - "PA": "Panama", - "PG": "Papua New Guinea", - "PY": "Paraguay", - "PE": "Peru", - "PH": "Philippines", - "PN": "Pitcairn", - "PL": "Poland", - "PT": "Portugal", - "PR": "Puerto Rico", - "QA": "Qatar", - "MK": "North Macedonia", - "RO": "Romania", - "RU": "Russian Federation", - "RW": "Rwanda", - "RE": "Réunion", - "BL": "Saint Barthélemy", - "SH": "Saint Helena, Ascension and Tristan da Cunha", - "KN": "Saint Kitts and Nevis", - "LC": "Saint Lucia", - "MF": "Saint Martin (French part)", - "PM": "Saint Pierre and Miquelon", - "VC": "Saint Vincent and the Grenadines", - "WS": "Samoa", - "SM": "San Marino", - "ST": "Sao Tome and Principe", - "SA": "Saudi Arabia", - "SN": "Senegal", - "RS": "Serbia", - "SC": "Seychelles", - "SL": "Sierra Leone", - "SG": "Singapore", - "SX": "Sint Maarten (Dutch part)", - "SK": "Slovakia", - "SI": "Slovenia", - "SB": "Solomon Islands", - "SO": "Somalia", - "ZA": "South Africa", - "GS": "South Georgia and the South Sandwich Islands", - "SS": "South Sudan", - "ES": "Spain", - "LK": "Sri Lanka", - "SD": "Sudan (the)", - "SR": "Suriname", - "SJ": "Svalbard and Jan Mayen", - "SE": "Sweden", - "CH": "Switzerland", - "SY": "Syrian Arab Republic", - "TW": "Taiwan", - "TJ": "Tajikistan", - "TZ": "Tanzania", - "TH": "Thailand", - "TL": "Timor-Leste", - "TG": "Togo", - "TK": "Tokelau", - "TO": "Tonga", - "TT": "Trinidad and Tobago", - "TN": "Tunisia", - "TR": "Turkey", - "TM": "Turkmenistan", - "TC": "Turks and Caicos Islands (the)", - "TV": "Tuvalu", - "UG": "Uganda", - "UA": "Ukraine", - "AE": "UAE", - "GB": "UK", - "UM": "United States Minor Outlying Islands", - "US": "USA", - "UY": "Uruguay", - "UZ": "Uzbekistan", - "VU": "Vanuatu", - "VE": "Venezuela", - "VN": "Vietnam", - "VG": "British Virgin Islands", - "VI": "US Virgin Islands", - "WF": "Wallis and Futuna", - "EH": "Western Sahara", - "YE": "Yemen", - "ZM": "Zambia", - "ZW": "Zimbabwe", - "AX": "Åland Islands" -} diff --git a/sites/kit.svelte.dev/src/routes/edge.svg/land-110m.json b/sites/kit.svelte.dev/src/routes/edge.svg/land-110m.json deleted file mode 100644 index fbd897cb1f1d..000000000000 --- a/sites/kit.svelte.dev/src/routes/edge.svg/land-110m.json +++ /dev/null @@ -1 +0,0 @@ -{"type":"Topology","objects":{"land":{"type":"GeometryCollection","geometries":[{"type":"MultiPolygon","arcs":[[[0]],[[1]],[[2]],[[3]],[[4]],[[5]],[[6]],[[7]],[[8]],[[9]],[[10]],[[11]],[[12]],[[13]],[[14]],[[15]],[[16,18]],[[19]],[[20]],[[21]],[[22]],[[23]],[[24]],[[25]],[[26]],[[27]],[[28]],[[29]],[[30]],[[31]],[[32]],[[33]],[[34]],[[35]],[[36]],[[37]],[[38]],[[39]],[[40]],[[41]],[[42]],[[43]],[[44]],[[45]],[[46]],[[47]],[[48]],[[49]],[[50]],[[51]],[[52]],[[53]],[[54]],[[55]],[[56]],[[57]],[[58]],[[59]],[[60]],[[61]],[[62]],[[63]],[[64]],[[65]],[[66]],[[67]],[[68]],[[69]],[[70]],[[71]],[[72]],[[73]],[[74]],[[75]],[[76]],[[77]],[[78]],[[79]],[[80]],[[81]],[[82]],[[83]],[[84]],[[85]],[[86]],[[87]],[[88]],[[89]],[[90]],[[91]],[[92,115],[114]],[[94]],[[95]],[[96]],[[97]],[[98]],[[99]],[[100]],[[101]],[[102]],[[103]],[[104]],[[105]],[[106]],[[107]],[[108]],[[109]],[[110]],[[111]],[[112]],[[113]],[[116]],[[117]],[[118]],[[119]],[[120]],[[121]],[[122]],[[123]],[[124]],[[125]],[[126]],[[127]],[[128]],[[129]]]}]}},"arcs":[[[33452,3290],[-82,-301],[-81,-266],[-582,81],[-621,-35],[-348,197],[0,23],[-152,174],[625,-23],[599,-58],[207,243],[147,208],[288,-243]],[[5775,3611],[-533,-81],[-364,208],[-163,209],[-11,35],[-180,162],[169,220],[517,-93],[277,-185],[212,-209],[76,-266]],[[37457,4468],[342,-255],[120,-359],[33,-254],[11,-301],[-430,-186],[-452,-150],[-522,-139],[-582,-116],[-658,35],[-365,197],[49,243],[593,162],[239,197],[174,254],[126,220],[168,209],[180,243],[141,0],[414,127],[419,-127]],[[16330,7154],[359,-93],[332,104],[-158,-208],[-261,-151],[-386,47],[-278,208],[60,197],[332,-104]],[[15122,7165],[425,-231],[-164,23],[-359,58],[-381,162],[202,127],[277,-139]],[[22505,8080],[305,-81],[304,69],[163,-335],[-217,46],[-337,-23],[-343,23],[-376,-35],[-283,116],[-146,243],[174,104],[353,-81],[403,-46]],[[30985,8657],[33,-266],[-49,-231],[-76,-220],[-326,-81],[-311,-116],[-364,11],[136,232],[-327,-81],[-310,-81],[-212,174],[-16,243],[305,231],[190,70],[321,-23],[82,301],[16,219],[-6,475],[158,278],[256,93],[147,-220],[65,-220],[120,-267],[92,-254],[76,-267]],[[0,529],[16,-5],[245,344],[501,-185],[32,21],[78,49],[94,61],[81,52],[41,26],[41,-1],[29,-10],[402,-246],[352,246],[63,34],[816,104],[265,-138],[130,-71],[419,-196],[789,-151],[625,-185],[1072,-139],[800,162],[1181,-116],[669,-185],[734,174],[773,162],[60,278],[-1094,23],[-898,139],[-234,231],[-745,128],[49,266],[103,243],[104,220],[-55,243],[-462,162],[-212,209],[-430,185],[675,-35],[642,93],[402,-197],[495,173],[457,220],[223,197],[-98,243],[-359,162],[-408,174],[-571,35],[-500,81],[-539,58],[-180,220],[-359,185],[-217,208],[-87,672],[136,-58],[250,-185],[457,58],[441,81],[228,-255],[441,58],[370,127],[348,162],[315,197],[419,58],[-11,220],[-97,220],[81,208],[359,104],[163,-196],[425,115],[321,151],[397,12],[375,57],[376,139],[299,128],[337,127],[218,-35],[190,-46],[414,81],[370,-104],[381,11],[364,81],[375,-57],[414,-58],[386,23],[403,-12],[413,-11],[381,23],[283,174],[337,92],[349,-127],[331,104],[300,208],[179,-185],[98,-208],[180,-197],[288,174],[332,-220],[375,-70],[321,-162],[392,35],[354,104],[418,-23],[376,-81],[381,-104],[147,254],[-180,197],[-136,209],[-359,46],[-158,220],[-60,220],[-98,440],[213,-81],[364,-35],[359,35],[327,-93],[283,-174],[119,-208],[376,-35],[359,81],[381,116],[342,70],[283,-139],[370,46],[239,451],[224,-266],[321,-104],[348,58],[228,-232],[365,-23],[337,-69],[332,-128],[218,220],[108,209],[278,-232],[381,58],[283,-127],[190,-197],[370,58],[288,127],[283,151],[337,81],[392,69],[354,81],[272,127],[163,186],[65,254],[-32,244],[-87,231],[-98,232],[-87,231],[-71,209],[-16,231],[27,232],[130,220],[109,243],[44,231],[-55,255],[-32,232],[136,266],[152,173],[180,220],[190,186],[223,173],[109,255],[152,162],[174,151],[267,34],[174,186],[196,115],[228,70],[202,150],[157,186],[218,69],[163,-151],[-103,-196],[-283,-174],[-120,-127],[-206,92],[-229,-58],[-190,-139],[-202,-150],[-136,-174],[-38,-231],[17,-220],[130,-197],[-190,-139],[-261,-46],[-153,-197],[-163,-185],[-174,-255],[-44,-220],[98,-243],[147,-185],[229,-139],[212,-185],[114,-232],[60,-220],[82,-232],[130,-196],[82,-220],[38,-544],[81,-220],[22,-232],[87,-231],[-38,-313],[-152,-243],[-163,-197],[-370,-81],[-125,-208],[-169,-197],[-419,-220],[-370,-93],[-348,-127],[-376,-128],[-223,-243],[-446,-23],[-489,23],[-441,-46],[-468,0],[87,-232],[424,-104],[311,-162],[174,-208],[-310,-185],[-479,58],[-397,-151],[-17,-243],[-11,-232],[327,-196],[60,-220],[353,-220],[588,-93],[500,-162],[398,-185],[506,-186],[690,-92],[681,-162],[473,-174],[517,-197],[272,-278],[136,-220],[337,209],[457,173],[484,186],[577,150],[495,162],[691,12],[680,-81],[560,-139],[180,255],[386,173],[702,12],[550,127],[522,128],[577,81],[614,104],[430,150],[-196,209],[-119,208],[0,220],[-539,-23],[-571,-93],[-544,0],[-77,220],[39,440],[125,128],[397,138],[468,139],[337,174],[337,174],[251,231],[380,104],[376,81],[190,47],[430,23],[408,81],[343,116],[337,139],[305,139],[386,185],[245,197],[261,173],[82,232],[-294,139],[98,243],[185,185],[288,116],[305,139],[283,185],[217,232],[136,277],[202,163],[331,-35],[136,-197],[332,-23],[11,220],[142,231],[299,-58],[71,-220],[331,-34],[360,104],[348,69],[315,-34],[120,-243],[305,196],[283,105],[315,81],[310,81],[283,139],[310,92],[240,128],[168,208],[207,-151],[288,81],[202,-277],[157,-209],[316,116],[125,232],[283,162],[365,-35],[108,-220],[229,220],[299,69],[326,23],[294,-11],[310,-70],[300,-34],[130,-197],[180,-174],[304,104],[327,24],[315,0],[310,11],[278,81],[294,70],[245,162],[261,104],[283,58],[212,162],[152,324],[158,197],[288,-93],[109,-208],[239,-139],[289,46],[196,-208],[206,-151],[283,139],[98,255],[250,104],[289,197],[272,81],[326,116],[218,127],[228,139],[218,127],[261,-69],[250,208],[180,162],[261,-11],[229,139],[54,208],[234,162],[228,116],[278,93],[256,46],[244,-35],[262,-58],[223,-162],[27,-254],[245,-197],[168,-162],[332,-70],[185,-162],[229,-162],[266,-35],[223,116],[240,243],[261,-127],[272,-70],[261,-69],[272,-46],[277,0],[229,-614],[-11,-150],[-33,-267],[-266,-150],[-218,-220],[38,-232],[310,12],[-38,-232],[-141,-220],[-131,-243],[212,-185],[321,-58],[321,104],[153,232],[92,220],[153,185],[174,174],[70,208],[147,289],[174,58],[316,24],[277,69],[283,93],[136,231],[82,220],[190,220],[272,151],[234,115],[153,197],[157,104],[202,93],[277,-58],[250,58],[272,69],[305,-34],[201,162],[142,393],[103,-162],[131,-278],[234,-115],[266,-47],[267,70],[283,-46],[261,-12],[174,58],[234,-35],[212,-127],[250,81],[300,0],[255,81],[289,-81],[185,197],[141,196],[191,163],[348,439],[179,-81],[212,-162],[185,-208],[354,-359],[272,-12],[256,0],[299,70],[299,81],[229,162],[190,174],[310,23],[207,127],[218,-116],[141,-185],[196,-185],[305,23],[190,-150],[332,-151],[348,-58],[288,47],[218,185],[185,185],[250,46],[251,-81],[288,-58],[261,93],[250,0],[245,-58],[256,-58],[250,104],[299,93],[283,23],[316,0],[255,58],[251,46],[76,290],[11,243],[174,-162],[49,-266],[92,-244],[115,-196],[234,-105],[315,35],[365,12],[250,35],[364,0],[262,11],[364,-23],[310,-46],[196,-186],[-54,-220],[179,-173],[299,-139],[310,-151],[360,-104],[375,-92],[283,-93],[315,-12],[180,197],[245,-162],[212,-185],[245,-139],[337,-58],[321,-69],[136,-232],[316,-139],[212,-208],[310,-93],[321,12],[299,-35],[332,12],[332,-47],[310,-81],[288,-139],[289,-116],[195,-173],[-32,-232],[-147,-208],[-125,-266],[-98,-209],[-131,-243],[-364,-93],[-163,-208],[-360,-127],[-125,-232],[-190,-220],[-201,-185],[-115,-243],[-70,-220],[-28,-266],[6,-220],[158,-232],[60,-220],[130,-208],[517,-81],[109,-255],[-501,-93],[-424,-127],[-528,-23],[-234,-336],[-49,-278],[-119,-220],[-147,-220],[370,-196],[141,-244],[239,-219],[338,-197],[386,-186],[419,-185],[636,-185],[142,-289],[800,-128],[53,-45],[208,-175],[767,151],[636,-186],[-99520,-142]],[[31180,18764],[361,-355],[389,-147],[-125,-296],[-264,-29],[-141,208],[-92,-239],[-238,-183],[-301,67],[-202,177],[-291,86],[-350,330],[-283,317],[-383,662],[229,-124],[390,-395],[369,-212],[143,271],[90,405],[256,244],[198,-70],[106,-274],[139,-443]],[[33736,20389],[222,-266],[-83,-207],[-375,-177],[-125,207],[-236,-266],[-139,266],[333,354],[236,-148],[167,237]],[[69522,21210],[-427,-38],[-7,314],[41,244],[19,121],[179,-186],[263,-74],[9,-112],[-77,-269]],[[90387,26479],[269,-204],[151,81],[217,113],[166,-39],[20,-702],[-95,-203],[-29,-476],[-97,162],[-193,-412],[-57,32],[-171,19],[-171,505],[-38,390],[-160,515],[7,271],[181,-52]],[[98060,26404],[63,-244],[198,239],[80,-249],[0,-249],[-103,-274],[-182,-435],[-142,-238],[103,-284],[-214,-7],[-238,-223],[-75,-387],[-157,-597],[-219,-264],[-138,-169],[-256,13],[-180,194],[-302,42],[-46,217],[149,438],[349,583],[179,111],[200,225],[238,310],[167,306],[123,441],[106,149],[41,330],[195,273],[61,-251]],[[98502,29218],[202,-622],[5,403],[126,-161],[41,-447],[224,-192],[188,-48],[158,226],[141,-69],[-67,-524],[-85,-345],[-212,12],[-74,-179],[26,-254],[-41,-110],[-105,-319],[-138,-404],[-214,-236],[-48,155],[-116,85],[160,486],[-91,326],[-299,236],[8,214],[201,206],[47,455],[-13,382],[-113,396],[8,104],[-133,244],[-218,523],[-117,418],[104,46],[151,-328],[216,-153],[78,-526]],[[96421,37487],[-105,-142],[-153,160],[-199,266],[-179,313],[-184,416],[-38,201],[119,-9],[156,-201],[122,-200],[89,-166],[228,-366],[144,-272]],[[99547,40335],[96,-171],[-46,-308],[-172,-81],[-153,73],[-27,260],[107,203],[126,-74],[69,98]],[[0,40798],[99822,-145],[-177,-124],[-36,220],[139,121],[88,33],[-99836,184]],[[0,41087],[0,-289]],[[0,41087],[57,27],[-34,-284],[-23,-32]],[[96623,40851],[-92,-78],[-93,259],[10,158],[175,-339]],[[96418,41756],[45,-476],[-75,74],[-58,-32],[-39,163],[-6,453],[133,-182]],[[63904,42571],[45,-711],[72,-276],[-28,-284],[-49,-174],[-94,347],[-53,-175],[53,-438],[-24,-250],[-77,-137],[-18,-500],[-109,-689],[-137,-814],[-172,-1120],[-106,-821],[-125,-685],[-226,-140],[-243,-250],[-160,151],[-220,211],[-77,312],[-18,524],[-98,471],[-26,425],[50,426],[128,102],[1,197],[133,447],[25,377],[-65,280],[-52,372],[-23,544],[97,331],[38,375],[138,22],[155,121],[103,107],[122,7],[158,337],[229,364],[83,297],[-38,253],[118,-71],[153,410],[6,356],[92,264],[96,-254],[74,-251],[69,-390]],[[89877,42448],[100,-464],[179,223],[92,-250],[133,-231],[-29,-262],[60,-506],[42,-295],[70,-72],[75,-505],[-27,-307],[90,-400],[301,-309],[197,-281],[186,-257],[-37,-143],[159,-371],[108,-639],[111,130],[113,-256],[68,91],[48,-626],[197,-363],[129,-226],[217,-478],[78,-475],[7,-337],[-19,-365],[132,-502],[-16,-523],[-48,-274],[-75,-527],[6,-339],[-55,-423],[-123,-538],[-205,-290],[-102,-458],[-93,-292],[-82,-510],[-107,-294],[-70,-442],[-36,-407],[14,-187],[-159,-205],[-311,-22],[-257,-242],[-127,-229],[-168,-254],[-230,262],[-170,104],[43,308],[-152,-112],[-243,-428],[-240,160],[-158,94],[-159,42],[-269,171],[-179,364],[-52,449],[-64,298],[-137,240],[-267,71],[91,287],[-67,438],[-136,-408],[-247,-109],[146,327],[42,341],[107,289],[-22,438],[-226,-504],[-174,-202],[-106,-470],[-217,243],[9,313],[-174,429],[-147,221],[52,137],[-356,358],[-195,17],[-267,287],[-498,-56],[-359,-211],[-317,-197],[-265,39],[-294,-303],[-241,-137],[-53,-309],[-103,-240],[-236,-15],[-174,-52],[-246,107],[-199,-64],[-191,-27],[-165,-315],[-81,26],[-140,-167],[-133,-187],[-203,23],[-186,0],[-295,377],[-149,113],[6,338],[138,81],[47,134],[-10,212],[34,411],[-31,350],[-147,598],[-45,337],[12,336],[-111,385],[-7,174],[-123,235],[-35,463],[-158,467],[-39,252],[122,-255],[-93,548],[137,-171],[83,-229],[-5,303],[-138,465],[-26,186],[-65,177],[31,341],[56,146],[38,295],[-29,346],[114,425],[21,-450],[118,406],[225,198],[136,252],[212,217],[126,46],[77,-73],[219,220],[168,66],[42,129],[74,54],[153,-14],[292,173],[151,262],[71,316],[163,300],[13,236],[7,321],[194,502],[117,-510],[119,118],[-99,279],[87,287],[122,-128],[34,449],[152,291],[67,233],[140,101],[4,165],[122,-69],[5,148],[122,85],[134,80],[205,-271],[155,-350],[173,-4],[177,-56],[-59,325],[133,473],[126,155],[-44,147],[121,338],[168,208],[142,-70],[234,111],[-5,302],[-204,195],[148,86],[184,-147],[148,-242],[234,-151],[79,60],[172,-182],[162,169],[105,-51],[65,113],[127,-292],[-74,-316],[-105,-239],[-96,-20],[32,-236],[-81,-295],[-99,-291],[20,-166],[221,-327],[214,-189],[143,-204],[201,-350],[78,1],[145,-151],[43,-183],[265,-200],[183,202],[55,317],[56,262],[34,324],[85,470],[-39,286],[20,171],[-32,339],[37,445],[53,120],[-43,197],[67,313],[52,325],[7,168],[104,222],[78,-289],[19,-371],[70,-71],[11,-249],[101,-300],[21,-335],[-10,-214]],[[95032,44386],[78,-203],[-194,4],[-106,363],[166,-142],[56,-22]],[[83531,44530],[-117,-11],[-368,414],[259,116],[146,-180],[97,-180],[-17,-159]],[[94680,44747],[-108,-14],[-170,60],[-58,91],[17,235],[183,-93],[91,-124],[45,-155]],[[94910,44908],[-42,-109],[-206,512],[-57,353],[94,0],[100,-473],[111,-283]],[[84565,44589],[-238,-130],[-33,71],[25,201],[119,360],[275,235],[32,139],[239,133],[194,20],[87,74],[105,-74],[-102,-160],[-289,-258],[-233,-170],[-181,-441]],[[82749,45797],[100,-158],[172,48],[69,-251],[-321,-119],[-193,-79],[-149,5],[95,340],[153,5],[74,209]],[[84139,45797],[-41,-328],[-417,-168],[-370,73],[0,216],[220,123],[174,-177],[185,45],[249,216]],[[94409,45654],[12,-119],[-218,251],[-152,212],[-104,197],[41,60],[128,-142],[228,-272],[65,-187]],[[93760,46238],[-56,-33],[-121,134],[-114,243],[14,99],[166,-250],[111,-193]],[[80172,46575],[533,-59],[61,244],[515,-284],[101,-383],[417,-108],[341,-351],[-317,-225],[-306,238],[-251,-16],[-288,44],[-260,106],[-322,225],[-204,59],[-116,-74],[-506,243],[-48,254],[-255,44],[191,564],[337,-35],[224,-231],[115,-45],[38,-210]],[[87423,46908],[-143,-402],[-27,445],[49,212],[58,200],[63,-173],[0,-282]],[[93299,46550],[-78,-59],[-120,227],[-122,375],[-59,450],[38,57],[30,-175],[84,-134],[135,-375],[131,-200],[-39,-166]],[[92217,47343],[-146,-48],[-44,-166],[-152,-144],[-142,-138],[-148,1],[-228,171],[-158,165],[23,183],[249,-86],[152,46],[42,283],[40,15],[27,-314],[158,45],[78,202],[155,211],[-30,348],[166,11],[56,-97],[-5,-327],[-93,-361]],[[85346,48536],[-104,-196],[-192,108],[-54,254],[281,29],[69,-195]],[[86241,48752],[101,-452],[-234,244],[-232,49],[-157,-39],[-192,21],[65,325],[344,24],[305,-172]],[[92538,47921],[-87,-157],[-52,348],[-65,229],[-126,193],[-158,252],[-200,174],[77,143],[150,-166],[94,-130],[117,-142],[111,-248],[106,-189],[33,-307]],[[87261,49899],[78,-955],[287,-354],[232,627],[319,356],[247,1],[238,-206],[206,-212],[298,-113],[482,-407],[513,-338],[192,-302],[154,-297],[43,-349],[462,-365],[68,-313],[-256,-64],[62,-393],[248,-388],[180,-627],[159,20],[-11,-262],[215,-100],[-84,-111],[295,-249],[-30,-171],[-184,-41],[-69,153],[-238,66],[-281,89],[-216,377],[-158,325],[-144,517],[-362,259],[-235,-169],[-170,-195],[35,-436],[-218,-203],[-155,99],[-288,25],[-247,485],[-282,118],[-69,-168],[-352,-18],[118,481],[175,164],[-72,642],[-134,496],[-538,500],[-229,50],[-417,546],[-82,-287],[-107,-52],[-63,216],[-1,257],[-212,290],[299,213],[198,-11],[-23,156],[-407,1],[-110,352],[-248,109],[-117,293],[374,143],[142,192],[446,-242],[44,-220]],[[84788,51419],[-223,-587],[-209,-113],[-267,115],[-463,-29],[-243,-85],[-39,-447],[248,-526],[150,268],[518,201],[-22,-272],[-121,86],[-121,-347],[-245,-229],[263,-757],[-50,-203],[249,-682],[-2,-388],[-148,-173],[-109,207],[134,484],[-273,-229],[-69,164],[36,228],[-200,346],[21,576],[-186,-179],[24,-689],[11,-846],[-176,-85],[-119,173],[79,544],[-43,570],[-117,4],[-86,405],[115,387],[40,469],[139,891],[58,243],[237,439],[217,-174],[350,-82],[319,25],[275,429],[48,-132]],[[85746,51249],[-15,-517],[-143,58],[-42,-359],[114,-312],[-78,-71],[-112,374],[-82,755],[56,472],[92,215],[20,-322],[164,-52],[26,-241]],[[79393,47122],[-308,-12],[-234,494],[-356,482],[-119,358],[-210,481],[-138,443],[-212,827],[-244,493],[-81,508],[-103,461],[-250,372],[-145,506],[-209,330],[-290,652],[-24,300],[178,-24],[430,-114],[246,-577],[215,-401],[153,-246],[263,-635],[283,-9],[233,-405],[161,-495],[211,-270],[-111,-482],[159,-205],[100,-15],[47,-412],[97,-330],[204,-52],[135,-374],[-70,-735],[-11,-914]],[[82742,51659],[312,-546],[-329,-70],[-93,-403],[12,-535],[-267,-404],[-7,-589],[-107,-903],[-41,210],[-316,-266],[-110,361],[-198,34],[-139,189],[-330,-212],[-101,285],[-182,-32],[-229,68],[-43,793],[-138,164],[-134,505],[-38,517],[32,548],[165,392],[204,-202],[214,110],[56,500],[119,112],[333,128],[199,467],[137,374],[110,221],[236,323],[214,411],[140,462],[112,2],[143,-299],[13,-257],[183,-165],[231,-177],[-20,-232],[-186,-29],[50,-289],[-205,-201],[-158,-533],[204,-560],[-48,-272]],[[85104,55551],[28,-392],[16,-332],[-94,-540],[-102,602],[-130,-300],[89,-435],[-79,-277],[-327,343],[-78,428],[84,280],[-176,280],[-87,-245],[-131,23],[-205,-330],[-46,173],[109,498],[175,166],[151,223],[98,-268],[212,162],[45,264],[196,15],[-16,457],[225,-280],[23,-297],[20,-218]],[[72560,54241],[-242,-135],[-132,470],[-49,849],[126,959],[192,-328],[129,-416],[134,-616],[-42,-615],[-116,-168]],[[33073,56553],[-232,-65],[-50,53],[81,163],[-6,233],[160,77],[58,-21],[-11,-440]],[[84439,56653],[-100,-195],[-87,-373],[-87,-175],[-171,409],[57,158],[70,165],[30,367],[153,35],[-44,-398],[205,570],[-26,-563]],[[82917,56084],[-369,-561],[136,414],[200,364],[167,409],[146,587],[49,-482],[-183,-325],[-146,-406]],[[83856,57606],[166,-183],[177,1],[-5,-247],[-129,-251],[-176,-178],[-10,275],[20,301],[-43,282]],[[84861,57766],[78,-660],[-214,157],[5,-199],[68,-364],[-132,-133],[-11,416],[-84,31],[-43,357],[163,-47],[-4,224],[-169,451],[266,-13],[77,-220]],[[83757,58301],[-74,-510],[-119,295],[-142,450],[238,-22],[97,-213]],[[83700,61512],[171,-168],[85,153],[26,-150],[-46,-245],[95,-423],[-73,-491],[-164,-196],[-43,-476],[62,-471],[147,-65],[123,70],[347,-328],[-27,-321],[91,-142],[-29,-272],[-216,290],[-103,310],[-71,-217],[-177,354],[-253,-87],[-138,130],[14,244],[87,151],[-83,136],[-36,-213],[-137,340],[-41,257],[-11,566],[112,-195],[29,925],[90,535],[169,-1]],[[31780,61349],[-71,-149],[-209,4],[-163,-21],[-16,253],[40,86],[227,-3],[142,-52],[50,-118]],[[28638,61137],[-84,-99],[-156,95],[-159,215],[34,135],[116,41],[64,-20],[187,-53],[147,-142],[46,-161],[-195,-11]],[[29839,62320],[241,-93],[34,101],[217,-3],[165,-152],[73,15],[50,-209],[152,11],[-9,-176],[124,-21],[136,-217],[-103,-240],[-132,128],[-127,-25],[-92,28],[-50,-107],[-106,-37],[-43,144],[-92,-85],[-111,-405],[-71,94],[-14,170],[-185,100],[-131,-41],[-169,43],[-130,-110],[-149,184],[24,190],[256,-82],[210,-47],[100,131],[-127,256],[2,226],[-175,92],[62,163],[170,-26]],[[80649,61615],[-240,-284],[-228,183],[-8,509],[137,267],[304,166],[159,-14],[62,-226],[-122,-260],[-64,-341]],[[6794,61855],[-41,-99],[-69,84],[8,165],[-46,216],[14,65],[48,97],[-19,116],[16,55],[21,-11],[107,-100],[49,-51],[45,-79],[71,-207],[-7,-33],[-108,-126],[-89,-92]],[[6645,62777],[-94,-43],[-47,125],[-32,48],[-3,37],[27,50],[99,-56],[73,-90],[-23,-71]],[[6456,63091],[-9,-63],[-149,17],[21,72],[137,-26]],[[6207,63177],[-15,-34],[-19,8],[-97,21],[-35,133],[-11,24],[74,82],[23,-38],[80,-196]],[[5737,63567],[-33,-58],[-93,107],[14,43],[43,58],[64,-12],[5,-138]],[[27867,64030],[110,-216],[260,66],[98,-138],[235,-366],[173,-267],[92,8],[165,-120],[-20,-167],[205,-24],[210,-242],[-33,-138],[-185,-75],[-187,-29],[-191,46],[-398,-57],[186,329],[-113,154],[-179,39],[-96,171],[-66,336],[-157,-23],[-259,159],[-83,124],[-362,91],[-97,115],[104,148],[-273,30],[-199,-307],[-115,-8],[-40,-144],[-138,-65],[-118,56],[146,183],[60,213],[126,131],[142,116],[210,56],[67,65],[240,-42],[219,-7],[261,-201]],[[28462,64617],[-68,-29],[-70,340],[-104,171],[60,375],[84,-23],[97,-491],[1,-343]],[[83659,64045],[-119,-485],[-146,499],[-32,438],[163,581],[223,447],[127,-176],[-49,-357],[-167,-947]],[[28383,66284],[-303,-95],[-19,219],[130,47],[184,-18],[8,-153]],[[28611,66290],[-48,-420],[-51,75],[4,309],[-124,234],[-1,67],[220,-265]],[[87399,70756],[35,-203],[-156,-357],[-114,189],[-143,-137],[-73,-346],[-181,168],[2,281],[154,352],[158,-68],[114,248],[204,-127]],[[59604,71655],[-188,-251],[21,-111],[8,-48],[-285,-240],[-136,77],[-64,237],[132,22],[19,3],[40,143],[200,-8],[253,176]],[[56583,71675],[152,-199],[216,34],[207,-42],[-7,-103],[151,71],[-35,-175],[-400,-50],[3,98],[-339,115],[52,251]],[[54311,73167],[-100,-465],[41,-183],[-58,-303],[-213,222],[-141,64],[-387,300],[38,304],[325,-54],[284,64],[211,51]],[[52558,74927],[166,-419],[-39,-782],[-126,38],[-113,-197],[-105,156],[-11,713],[-64,338],[153,-30],[139,183]],[[89159,72524],[-104,-472],[48,-296],[-145,-416],[-355,-278],[-488,-36],[-396,-675],[-186,227],[-12,442],[-483,-130],[-329,-279],[-325,-11],[282,-435],[-186,-1004],[-179,-248],[-135,229],[69,533],[-176,172],[-113,405],[263,182],[145,371],[280,306],[203,403],[553,177],[297,-121],[291,1050],[185,-282],[408,591],[158,229],[174,723],[-47,664],[117,374],[295,108],[152,-819],[-9,-479],[-256,-595],[4,-610]],[[52655,75484],[-92,-456],[-126,120],[-64,398],[56,219],[179,226],[47,-507]],[[89974,76679],[195,-126],[197,250],[62,-663],[-412,-162],[-244,-587],[-436,404],[-152,-646],[-308,-9],[-39,587],[138,455],[296,33],[81,817],[83,460],[326,-615],[213,-198]],[[32315,78082],[202,-79],[257,16],[-137,-242],[-102,-38],[-353,250],[-69,198],[105,183],[97,-288]],[[32831,79592],[-135,-11],[-360,186],[-258,279],[96,49],[365,-148],[284,-247],[8,-108]],[[15692,79240],[-140,-82],[-456,269],[-84,209],[-248,207],[-50,168],[-286,107],[-107,321],[24,137],[291,-129],[171,-89],[261,-63],[94,-204],[138,-280],[277,-244],[115,-327]],[[34407,80527],[-184,-517],[181,199],[187,-126],[-98,-206],[247,-162],[128,144],[277,-182],[-86,-433],[194,101],[36,-313],[86,-367],[-117,-520],[-125,-22],[-183,111],[60,484],[-77,75],[-322,-513],[-166,21],[196,277],[-267,144],[-298,-35],[-539,18],[-43,175],[173,208],[-121,160],[234,356],[287,941],[172,336],[241,204],[129,-26],[-54,-160],[-148,-372]],[[13136,82508],[267,47],[-84,-671],[242,-475],[-111,1],[-167,270],[-103,272],[-140,184],[-51,260],[16,188],[131,-76]],[[89901,80562],[280,-1046],[-411,195],[-171,-854],[271,-605],[-8,-413],[-211,356],[-182,-457],[-51,496],[31,575],[-32,638],[64,446],[13,790],[-163,581],[24,808],[257,271],[-110,274],[123,83],[73,-391],[96,-569],[-7,-581],[114,-597]],[[48114,81456],[-493,-349],[-393,89],[225,617],[-145,601],[378,463],[210,276],[233,24],[298,-365],[-149,-406],[46,-422],[-210,-528]],[[53524,83435],[-166,-478],[-291,333],[-39,246],[408,195],[88,-296]],[[7498,84325],[-277,-225],[-142,152],[-43,277],[252,210],[148,90],[185,-40],[117,-183],[-240,-281]],[[49165,85222],[-297,-639],[283,81],[304,-3],[-72,-481],[-250,-530],[287,-38],[270,-759],[190,-95],[171,-673],[79,-233],[337,-113],[-34,-378],[-142,-173],[111,-305],[-250,-310],[-371,6],[-473,-163],[-130,116],[-183,-276],[-257,67],[-195,-226],[-148,118],[407,621],[249,127],[-436,99],[-79,235],[291,183],[-152,319],[52,387],[414,-54],[40,343],[-190,372],[-337,104],[-66,160],[101,264],[-92,163],[-149,-279],[-17,569],[-140,301],[101,611],[216,480],[222,-47],[335,49]],[[4006,85976],[-171,-92],[-182,110],[-168,161],[274,101],[220,-54],[27,-226]],[[27981,87304],[-108,-310],[-123,50],[-73,176],[13,41],[107,177],[114,-13],[70,-121]],[[27250,87631],[-325,-326],[-196,13],[-61,160],[207,273],[381,-6],[-6,-114]],[[2297,88264],[171,-113],[173,61],[225,-156],[276,-79],[-23,-64],[-211,-125],[-211,128],[-106,107],[-245,-34],[-66,52],[17,223]],[[26344,89371],[51,-259],[143,91],[161,-155],[304,-203],[318,-184],[25,-281],[204,46],[199,-196],[-247,-186],[-432,142],[-156,266],[-275,-314],[-396,-306],[-95,346],[-377,-57],[242,292],[35,465],[95,542],[201,-49]],[[45969,89843],[-64,-382],[314,-403],[-361,-451],[-801,-405],[-240,-107],[-365,87],[-775,187],[273,261],[-605,289],[492,114],[-12,174],[-583,137],[188,385],[421,87],[433,-400],[422,321],[349,-167],[453,315],[461,-42]],[[28926,90253],[-312,-30],[-69,289],[118,331],[255,82],[217,-163],[3,-253],[-32,-82],[-180,-174]],[[0,91325],[681,-451],[728,-588],[-24,-367],[187,-147],[-64,429],[754,-88],[544,-553],[-276,-257],[-455,-61],[-7,-578],[-111,-122],[-260,17],[-212,206],[-369,172],[-62,257],[-283,96],[-315,-76],[-151,207],[60,219],[-333,-140],[126,-278],[-158,-251]],[[0,88971],[0,2354]],[[23431,91410],[-173,-207],[-374,179],[-226,-65],[-380,266],[245,183],[194,256],[295,-168],[166,-106],[84,-112],[169,-226]],[[0,92833],[99999,-404],[-305,-30],[-49,187],[-99645,247]],[[0,92833],[36,24],[235,-1],[402,-169],[-24,-81],[-286,-141],[-363,-36],[0,404]],[[24848,91640],[-1,-604],[371,463],[332,-380],[-83,-438],[269,-399],[290,427],[202,510],[16,648],[394,-45],[411,-87],[373,-293],[17,-293],[-207,-315],[196,-316],[-36,-288],[-544,-413],[-386,-91],[-287,178],[-83,-297],[-268,-498],[-81,-258],[-322,-400],[-397,-39],[-220,-250],[-18,-384],[-323,-74],[-340,-479],[-301,-665],[-108,-466],[-15,-686],[408,-99],[125,-553],[130,-448],[388,117],[517,-256],[277,-225],[199,-279],[348,-162],[294,-249],[459,-34],[302,-58],[-45,-511],[86,-594],[201,-661],[414,-561],[214,192],[150,607],[-145,934],[-196,311],[445,276],[314,415],[154,411],[-22,395],[-189,502],[-338,445],[328,619],[-121,535],[-93,922],[194,137],[476,-161],[286,-57],[230,155],[258,-200],[342,-343],[85,-229],[495,-45],[-8,-496],[92,-747],[254,-92],[201,-348],[402,328],[266,652],[184,274],[216,-527],[362,-754],[307,-709],[-112,-371],[370,-333],[250,-338],[442,-152],[179,-189],[110,-500],[216,-78],[112,-223],[20,-664],[-202,-222],[-199,-207],[-458,-210],[-349,-486],[-470,-96],[-594,125],[-417,4],[-287,-41],[-233,-424],[-354,-262],[-401,-782],[-320,-545],[236,97],[446,776],[583,493],[416,59],[245,-290],[-262,-397],[88,-637],[91,-446],[361,-295],[459,86],[278,664],[19,-429],[180,-214],[-344,-387],[-615,-351],[-276,-239],[-310,-426],[-211,44],[-11,500],[483,488],[-445,-19],[-309,-72],[48,-194],[-296,-286],[-286,-204],[-293,-175],[-159,-386],[-35,-98],[-3,-313],[92,-313],[115,-15],[-29,216],[83,-131],[-22,-169],[-188,-96],[-133,12],[-205,-104],[-121,-29],[-162,-29],[-231,-171],[408,111],[82,-112],[-389,-177],[-177,-1],[8,72],[-84,-164],[82,-27],[-60,-424],[-203,-455],[-20,152],[-61,31],[-91,147],[57,-318],[66,-106],[8,-222],[-89,-230],[-157,-472],[-25,24],[86,402],[-142,226],[-33,490],[-53,-255],[59,-375],[-175,88],[183,-186],[12,-562],[79,-41],[29,-204],[39,-591],[-176,-439],[-288,-175],[-182,-346],[-139,-38],[-141,-217],[-39,-199],[-305,-383],[-157,-281],[-131,-351],[-43,-419],[50,-411],[92,-505],[124,-418],[1,-256],[132,-685],[-9,-398],[-12,-230],[-69,-361],[-83,-74],[-137,71],[-44,259],[-106,136],[-147,508],[-129,452],[-42,231],[57,393],[-77,325],[-217,494],[-108,91],[-281,-269],[-49,30],[-135,276],[-174,146],[-314,-75],[-247,66],[-212,-41],[-118,-83],[54,-166],[-5,-240],[59,-117],[-53,-77],[-103,87],[-104,-112],[-202,18],[-207,313],[-242,-74],[-202,137],[-173,-42],[-234,-138],[-253,-438],[-276,-255],[-152,-282],[-63,-266],[-3,-407],[14,-284],[52,-201],[1,-1],[-1,-1],[-107,-516],[-49,-426],[-20,-791],[-27,-289],[48,-322],[86,-288],[56,-458],[184,-440],[65,-337],[109,-291],[295,-157],[114,-247],[244,165],[212,60],[208,106],[175,101],[176,241],[67,345],[22,496],[48,173],[188,155],[294,137],[246,-21],[169,50],[66,-125],[-9,-285],[-149,-351],[-66,-360],[51,-103],[-42,-255],[-69,-461],[-71,152],[-58,-10],[1,-87],[53,-3],[-5,-160],[-45,-256],[24,-91],[-29,-212],[18,-56],[-32,-299],[-55,-156],[-50,-19],[-55,-205],[90,-107],[24,88],[82,-75],[29,-23],[61,104],[79,8],[26,-48],[43,29],[129,-53],[128,16],[90,65],[32,66],[89,-31],[66,-40],[73,14],[55,51],[127,-82],[44,-13],[85,-110],[80,-132],[101,-91],[73,-162],[-24,-57],[-14,-132],[29,-216],[-64,-202],[-30,-237],[-9,-261],[15,-152],[7,-266],[-43,-58],[-26,-253],[19,-156],[-56,-151],[12,-159],[43,-97],[70,-321],[108,-238],[130,-252],[100,-212],[-6,-125],[111,-27],[26,48],[77,-145],[136,42],[119,150],[168,119],[95,176],[153,-34],[-10,-58],[155,-21],[124,-102],[90,-177],[105,-164],[143,-18],[209,412],[114,63],[3,195],[51,500],[159,274],[175,11],[22,123],[218,-49],[218,298],[109,132],[134,285],[98,-36],[73,-156],[-54,-199],[-8,-139],[-163,-69],[91,-268],[-3,-309],[-123,-343],[105,-469],[120,38],[62,427],[-86,208],[-14,447],[346,241],[-38,278],[97,186],[100,-415],[195,-9],[180,-330],[11,-195],[249,-6],[297,61],[159,-264],[213,-73],[155,184],[4,149],[344,35],[333,9],[-236,-175],[95,-279],[222,-44],[210,-291],[45,-473],[144,13],[109,-139],[183,-217],[171,-385],[8,-304],[105,-14],[149,-289],[109,-205],[333,-119],[30,107],[225,43],[298,-159],[95,-65],[204,-140],[294,-499],[46,-242],[95,28],[69,-327],[155,-1033],[149,-97],[7,-408],[-208,-487],[86,-178],[491,-92],[10,-593],[211,388],[349,-212],[462,-361],[135,-346],[-45,-327],[323,182],[540,-313],[415,23],[411,-489],[355,-662],[214,-170],[237,-24],[101,-186],[94,-752],[46,-358],[-110,-977],[-142,-385],[-391,-822],[-177,-668],[-206,-513],[-69,-11],[-78,-435],[20,-1107],[-77,-910],[-30,-390],[-88,-233],[-49,-790],[-282,-771],[-47,-610],[-225,-256],[-65,-355],[-302,2],[-437,-227],[-195,-263],[-311,-173],[-327,-470],[-235,-586],[-41,-441],[46,-326],[-51,-597],[-63,-289],[-195,-325],[-308,-1040],[-244,-468],[-189,-277],[-127,-562],[-183,-337],[-121,-372],[-313,-328],[-205,118],[-151,-63],[-256,253],[-189,-19],[-169,327],[-19,-308],[353,-506],[-38,-408],[173,-257],[-14,-289],[-267,-757],[-412,-317],[-557,-123],[-305,59],[59,-352],[-57,-442],[51,-298],[-167,-208],[-284,-82],[-267,216],[-108,-155],[39,-587],[188,-178],[152,186],[82,-307],[-255,-183],[-223,-367],[-41,-595],[-66,-316],[-262,-2],[-218,-302],[-80,-443],[274,-433],[265,-119],[-96,-531],[-328,-333],[-180,-692],[-254,-234],[-113,-276],[89,-614],[185,-342],[-117,30],[-247,4],[-134,-145],[-250,-213],[-45,-552],[-118,-14],[-313,192],[-318,412],[-346,338],[-87,374],[79,346],[-140,393],[-36,1007],[119,568],[293,457],[-422,172],[265,522],[94,982],[309,-208],[145,1224],[-186,157],[-87,-738],[-175,83],[87,845],[95,1095],[127,404],[-79,576],[-23,666],[117,19],[170,954],[192,945],[118,881],[-64,885],[83,487],[-34,730],[163,721],[50,1143],[89,1227],[87,1321],[-20,967],[-58,832],[-279,340],[-24,242],[-551,593],[-498,646],[-214,365],[-115,488],[46,170],[-236,775],[-274,1090],[-262,1177],[-114,269],[-87,435],[-216,386],[-198,239],[90,264],[-134,563],[86,414],[221,373],[148,442],[-60,258],[-106,-275],[-166,259],[56,167],[-47,536],[97,89],[52,368],[105,381],[-20,241],[153,126],[190,236],[-37,183],[103,44],[-12,296],[65,214],[138,40],[117,371],[106,310],[-102,141],[52,343],[-62,540],[59,155],[-44,500],[-112,315],[-93,170],[-59,319],[68,158],[-70,40],[-52,195],[-138,165],[-122,-38],[-56,-205],[-112,-149],[-61,-20],[-27,-123],[132,-321],[-75,-76],[-40,-87],[-130,-30],[-48,353],[-36,-101],[-92,35],[-56,238],[-114,39],[-72,69],[-119,-1],[-8,-128],[-32,89],[-151,131],[-56,124],[32,103],[-11,130],[-77,142],[-109,116],[-95,76],[-19,173],[-73,105],[18,-172],[-55,-141],[-64,164],[-89,58],[-38,120],[2,179],[36,187],[-78,83],[64,114],[-96,186],[-130,238],[-61,200],[-117,185],[-140,267],[31,92],[46,-89],[21,41],[-48,185],[-84,52],[-31,-140],[-161,9],[-100,57],[-115,117],[-154,37],[-79,127],[-142,103],[-174,11],[-127,117],[-149,244],[-314,636],[-144,192],[-226,154],[-156,-43],[-223,-223],[-140,-58],[-196,156],[-208,112],[-260,271],[-208,83],[-314,275],[-233,282],[-70,158],[-155,35],[-284,187],[-116,270],[-299,335],[-139,373],[-66,288],[93,57],[-29,169],[64,153],[1,204],[-93,266],[-25,235],[-94,298],[-244,587],[-280,462],[-135,368],[-238,241],[-51,145],[42,365],[-142,137],[-164,288],[-69,412],[-149,48],[-162,311],[-130,288],[-12,184],[-149,446],[-99,452],[5,227],[-201,235],[-93,-26],[-159,163],[-44,-240],[46,-284],[27,-444],[95,-243],[206,-407],[46,-139],[42,-42],[37,-203],[49,8],[56,-381],[85,-150],[59,-210],[174,-300],[92,-550],[83,-259],[77,-277],[15,-311],[134,-20],[112,-268],[100,-264],[-6,-106],[-117,-217],[-49,3],[-74,359],[-182,337],[-200,286],[-142,150],[9,432],[-42,320],[-132,183],[-191,264],[-37,-76],[-70,154],[-171,143],[-164,343],[20,44],[115,-33],[103,221],[10,266],[-214,422],[-163,163],[-102,369],[-103,388],[-129,472],[-113,531],[-46,302],[-180,340],[-130,71],[-30,169],[-156,30],[-100,159],[-258,59],[-70,95],[-34,324],[-270,594],[-231,821],[10,137],[-123,195],[-215,495],[-38,482],[-148,323],[61,489],[-10,507],[-89,453],[109,557],[67,1072],[-50,792],[-88,506],[-80,274],[33,115],[402,-200],[148,-558],[68,156],[-44,485],[-94,484],[-38,1],[-537,581],[-199,255],[-503,245],[-155,523],[40,362],[-356,252],[-48,476],[-336,429],[-6,304],[-153,223],[-245,188],[-78,515],[-358,478],[-150,558],[-267,38],[-441,15],[-326,170],[-574,613],[-266,112],[-486,211],[-385,-50],[-546,271],[-330,252],[-309,-125],[58,-411],[-154,-38],[-321,-123],[-245,-199],[-307,-126],[-40,348],[125,580],[295,182],[-76,148],[-354,-329],[-190,-394],[-400,-420],[203,-287],[-262,-424],[-299,-247],[-278,-181],[-69,-261],[-434,-305],[-87,-278],[-325,-252],[-191,45],[-259,-165],[-282,-201],[-231,-197],[-477,-169],[-43,99],[304,276],[271,182],[296,324],[345,66],[137,243],[385,353],[62,119],[205,208],[48,448],[141,349],[-320,-179],[-90,102],[-150,-215],[-181,300],[-75,-212],[-104,294],[-278,-236],[-170,0],[-24,352],[50,217],[-179,210],[-361,-113],[-235,277],[-190,142],[-1,334],[-214,252],[108,340],[226,330],[99,303],[225,43],[191,-94],[224,285],[201,-51],[212,183],[-52,270],[-155,106],[205,228],[-170,-7],[-295,-128],[-85,-131],[-219,131],[-392,-67],[-407,142],[-117,238],[-351,343],[390,247],[620,289],[228,0],[-38,-295],[586,22],[-225,366],[-342,226],[-197,295],[-267,252],[-381,187],[155,309],[493,19],[350,270],[66,287],[284,281],[271,68],[526,262],[256,-40],[427,315],[421,-124],[201,-266],[123,114],[469,-35],[-16,-136],[425,-101],[283,59],[585,-186],[534,-56],[214,-77],[370,96],[421,-177],[302,-83],[518,-142],[438,-284],[289,-55],[244,247],[336,184],[413,-72],[416,259],[455,148],[191,-245],[207,138],[62,278],[192,-63],[470,-530],[369,401],[38,-448],[341,96],[105,173],[337,-34],[424,-248],[650,-217],[383,-100],[272,38],[375,-300],[-391,-293],[502,-127],[750,70],[236,103],[296,-354],[302,299],[-283,251],[179,202],[338,27],[223,59],[224,-141],[279,-321],[310,47],[491,-266],[431,94],[405,-14],[-32,367],[247,103],[431,-200],[-2,-559],[177,471],[223,-16],[126,594],[-298,364],[-324,239],[22,653],[329,429],[366,-95],[281,-261],[378,-666],[-247,-290],[517,-120]],[[18287,93781],[-139,-277],[618,179],[386,-298],[314,302],[254,-194],[227,-580],[140,244],[-197,606],[244,86],[276,-94],[311,-239],[175,-575],[86,-417],[466,-293],[502,-279],[-31,-260],[-456,-48],[178,-227],[-94,-217],[-503,93],[-478,160],[-322,-36],[-522,-201],[-824,-103],[-374,-41],[-151,279],[-379,161],[-246,-66],[-343,468],[185,62],[429,101],[392,-26],[362,103],[-537,138],[-594,-47],[-394,12],[-146,217],[644,237],[-428,-9],[-485,156],[233,443],[193,235],[744,359],[284,-114]],[[20972,93958],[-244,-390],[-434,413],[95,83],[372,24],[211,-130]],[[28794,93770],[25,-163],[-296,17],[-299,13],[-304,-80],[-80,36],[-306,313],[12,213],[133,39],[636,-63],[479,-325]],[[25955,93803],[219,-369],[256,477],[704,242],[477,-611],[-42,-387],[550,172],[263,235],[616,-299],[383,-282],[36,-258],[515,134],[290,-376],[670,-234],[242,-238],[263,-553],[-510,-275],[654,-386],[441,-130],[400,-543],[437,-39],[-87,-414],[-487,-687],[-342,253],[-437,568],[-359,-74],[-35,-338],[292,-344],[377,-272],[114,-157],[181,-584],[-96,-425],[-350,160],[-697,473],[393,-509],[289,-357],[45,-206],[-753,236],[-596,343],[-337,287],[97,167],[-414,304],[-405,286],[5,-171],[-803,-94],[-235,203],[183,435],[522,10],[571,76],[-92,211],[96,294],[360,576],[-77,261],[-107,203],[-425,286],[-563,201],[178,150],[-294,367],[-245,34],[-219,201],[-149,-175],[-503,-76],[-1011,132],[-588,174],[-450,89],[-231,207],[290,270],[-394,2],[-88,599],[213,528],[286,241],[717,158],[-204,-382]],[[22123,94208],[331,-124],[496,75],[72,-172],[-259,-283],[420,-254],[-50,-532],[-455,-229],[-268,50],[-192,225],[-690,456],[5,189],[567,-73],[-306,386],[329,286]],[[89889,93835],[-421,-4],[-569,66],[-49,31],[263,234],[348,54],[394,-226],[34,-155]],[[24112,93575],[-298,-442],[-317,22],[-173,519],[4,294],[145,251],[276,161],[579,-20],[530,-144],[-415,-526],[-331,-115]],[[16539,92764],[-731,-294],[-147,259],[-641,312],[93,193],[218,489],[241,388],[-272,362],[939,93],[397,-123],[709,-33],[270,-171],[298,-249],[-349,-149],[-681,-415],[-344,-414],[0,-248]],[[91869,94941],[-321,-234],[-444,53],[-516,233],[66,192],[518,-89],[697,-155]],[[23996,94879],[-151,-229],[-403,44],[-337,155],[148,266],[399,159],[243,-208],[101,-187]],[[90301,95224],[-219,-439],[-1023,16],[-461,-139],[-550,384],[149,406],[366,111],[734,-26],[1004,-313]],[[22639,95907],[212,-273],[9,-303],[-127,-440],[-458,-60],[-298,94],[5,345],[-455,-46],[-18,457],[299,-18],[419,201],[390,-34],[22,77]],[[19941,95601],[109,-210],[247,99],[291,-26],[49,-289],[-169,-281],[-940,-91],[-701,-256],[-423,-14],[-35,193],[577,261],[-1255,-70],[-389,106],[379,577],[262,165],[782,-199],[493,-350],[485,-45],[-397,565],[255,215],[286,-68],[94,-282]],[[65981,92363],[-164,-52],[-907,77],[-74,262],[-503,158],[-40,320],[284,126],[-10,323],[551,503],[-255,73],[665,518],[-75,268],[621,312],[917,380],[925,110],[475,220],[541,76],[193,-233],[-187,-184],[-984,-293],[-848,-282],[-863,-562],[-414,-577],[-435,-568],[56,-491],[531,-484]],[[23699,96131],[308,-190],[547,1],[240,-194],[-64,-222],[319,-134],[177,-140],[374,-26],[406,-50],[441,128],[566,51],[451,-42],[298,-223],[62,-244],[-174,-157],[-414,-127],[-355,72],[-797,-91],[-570,-11],[-449,73],[-738,190],[-96,325],[-34,293],[-279,258],[-574,72],[-322,183],[104,242],[573,-37]],[[17722,96454],[-38,-454],[-214,-205],[-259,-29],[-517,-252],[-444,-91],[-377,128],[472,442],[570,383],[426,-9],[381,87]],[[63641,74970],[141,-419],[130,-28],[85,-159],[-228,-47],[-49,-459],[-47,-207],[-102,-138],[7,-293],[88,-436],[263,-123],[193,-296],[395,-102],[434,156],[27,139],[-52,417],[40,618],[-216,200],[71,405],[-184,34],[61,498],[262,-145],[244,189],[-202,355],[-80,338],[-224,-151],[-28,-433],[-87,383],[-15,144],[68,246],[-53,206],[-322,202],[-125,530],[-154,150],[-9,192],[270,-56],[11,432],[236,96],[243,-88],[50,576],[-50,365],[-278,-28],[-236,144],[-321,-260],[-259,-124],[-127,-350],[-269,-97],[-276,-610],[252,-561],[-27,-398],[303,-696],[146,-311]],[[0,88971],[99997,-3],[-357,-260],[-360,44],[250,-315],[166,-487],[128,-159],[32,-244],[-71,-157],[-518,129],[-777,-445],[-247,-69],[-425,-415],[-403,-362],[-102,-269],[-397,409],[-724,-464],[-126,220],[-268,-254],[-371,81],[-90,-388],[-333,-572],[10,-239],[316,-132],[-37,-860],[-258,-22],[-119,-494],[116,-255],[-486,-301],[-96,-675],[-415,-144],[-83,-600],[-400,-551],[-103,407],[-119,862],[-155,1313],[134,819],[234,353],[15,276],[431,132],[496,744],[479,608],[499,471],[223,833],[-337,-50],[-167,-487],[-705,-648],[-227,726],[-717,-201],[-696,-990],[230,-362],[-620,-154],[-430,-61],[20,427],[-431,90],[-344,-291],[-850,102],[-913,-175],[-900,-1153],[-1065,-1394],[438,-74],[136,-370],[270,-132],[178,296],[305,-39],[401,-650],[9,-502],[-217,-591],[-23,-705],[-126,-945],[-418,-855],[-94,-409],[-377,-688],[-374,-682],[-179,-349],[-370,-346],[-175,-8],[-175,287],[-373,-432],[-43,-197],[-106,36],[-120,-201],[-83,-201],[10,-424],[-143,-130],[-50,-105],[-104,-174],[-185,-97],[-121,-159],[-9,-256],[-32,-65],[111,-96],[157,-259],[240,-697],[68,-383],[3,-681],[-105,-325],[-252,-113],[-222,-245],[-250,-51],[-31,322],[52,443],[-123,615],[206,99],[-190,506],[-135,113],[-34,-112],[-81,-49],[-10,112],[-72,54],[-75,94],[77,260],[65,69],[-25,108],[71,319],[-18,97],[-163,64],[-131,158],[-388,-171],[-204,-277],[-300,-161],[148,274],[-58,230],[220,397],[-147,310],[-242,-209],[-314,-411],[-171,-381],[-272,-29],[-142,-275],[147,-400],[227,-97],[9,-265],[220,-172],[311,421],[247,-230],[179,-15],[46,-310],[-394,-165],[-130,-319],[-270,-296],[-142,-414],[299,-324],[109,-582],[169,-541],[189,-454],[-5,-439],[-174,-161],[66,-315],[164,-184],[-43,-481],[-71,-468],[-155,-53],[-203,-640],[-225,-775],[-258,-705],[-382,-545],[-386,-498],[-313,-68],[-170,-262],[-96,192],[-157,-294],[-388,-296],[-294,-90],[-95,-624],[-154,-35],[-73,429],[66,228],[-373,190],[-131,-97],[-371,-505],[-231,-558],[-61,-410],[212,-623],[260,-772],[252,-365],[169,-475],[127,-1093],[-37,-1039],[-232,-389],[-318,-381],[-227,-492],[-346,-550],[-101,378],[78,401],[-206,335],[-233,87],[-112,307],[-141,611],[-249,271],[-238,-11],[41,464],[-245,-3],[-22,-650],[-150,-863],[-90,-522],[19,-428],[181,-18],[113,-539],[50,-512],[155,-338],[168,-69],[144,-306],[64,-56],[164,-356],[116,-396],[16,-398],[-29,-269],[27,-203],[20,-349],[98,-163],[109,-523],[-5,-199],[-197,-40],[-263,438],[-329,469],[-32,301],[-161,395],[-38,489],[-100,322],[30,431],[-61,250],[-110,227],[-47,292],[-148,334],[-135,280],[-45,-347],[-53,328],[30,369],[82,566],[-27,439],[86,452],[-94,350],[23,644],[-113,306],[-90,707],[-50,746],[-121,490],[-183,-297],[-315,-421],[-156,53],[-172,138],[96,732],[-58,554],[-218,681],[34,213],[-163,76],[-197,481],[-79,309],[-16,301],[-53,284],[-116,344],[-256,23],[25,-243],[-87,-329],[-118,120],[-41,-108],[-78,65],[-108,53],[-39,-216],[-189,7],[-343,-122],[16,-445],[-148,-349],[-400,-398],[-311,-695],[-209,-373],[-276,-386],[-1,-272],[-138,-146],[-250,-212],[-130,-31],[-84,-450],[58,-769],[15,-490],[-118,-561],[-1,-1004],[-144,-29],[-126,-450],[84,-195],[-253,-167],[-93,-402],[-112,-170],[-263,552],[-128,827],[-107,596],[-97,279],[-148,568],[-69,739],[-48,369],[-253,811],[-115,1145],[-83,756],[1,716],[-54,553],[-404,-353],[-196,70],[-362,716],[133,214],[-82,232],[-326,501],[-203,150],[-83,425],[-215,449],[-512,-111],[-451,-11],[-391,-83],[-523,179],[-302,136],[-314,76],[-118,725],[-133,105],[-214,-106],[-280,-286],[-339,196],[-281,454],[-267,168],[-186,561],[-205,788],[-149,-96],[-177,196],[-103,-231],[-165,29],[58,-261],[-25,-135],[89,-445],[109,-510],[137,-135],[47,-207],[190,-248],[16,-244],[-27,-197],[35,-199],[80,-165],[37,-194],[41,-145],[-18,430],[75,310],[76,64],[84,-186],[5,-345],[-61,-348],[53,-226],[49,29],[11,-162],[217,93],[230,-15],[168,-18],[190,400],[207,379],[176,364],[80,201],[35,-51],[-26,-244],[-37,-108],[38,-466],[125,-404],[155,-214],[204,-78],[164,-107],[125,-339],[75,-196],[100,-75],[-1,-132],[-101,-352],[-44,-166],[-117,-189],[-104,-404],[-126,31],[-58,-141],[-44,-300],[34,-395],[-26,-72],[-128,2],[-174,-221],[-27,-288],[-63,-125],[-173,5],[-109,-149],[1,-239],[-134,-164],[-153,56],[-186,-199],[-128,-33],[-201,-159],[-54,-263],[-6,-201],[-277,-249],[-444,-276],[-249,-417],[-122,-32],[-83,34],[-163,-245],[-177,-113],[-233,-31],[-70,-34],[-61,-156],[-73,-43],[-42,-150],[-138,13],[-89,-80],[-192,30],[-72,345],[8,323],[-46,174],[-54,437],[-80,243],[56,29],[-29,270],[34,114],[-12,257],[-36,253],[-84,177],[-22,236],[-143,212],[-148,495],[-79,482],[-192,406],[-124,97],[-184,563],[-32,411],[12,350],[-159,655],[-130,231],[-150,122],[-92,339],[15,133],[-77,307],[-81,131],[-108,440],[-170,476],[-141,406],[-139,-3],[44,325],[12,206],[34,236],[-9,86],[-78,-238],[-60,-446],[-75,-308],[-65,-103],[-93,191],[-125,263],[-198,847],[-29,-53],[115,-624],[171,-594],[210,-920],[102,-321],[90,-334],[249,-654],[-55,-103],[9,-384],[323,-530],[49,-121],[90,-580],[-61,-107],[40,-608],[102,-706],[106,-145],[152,-219],[161,-683],[77,-543],[152,-288],[379,-558],[154,-336],[151,-341],[87,-203],[136,-178],[66,-183],[-9,-245],[-158,-142],[119,-161],[91,-109],[54,-244],[125,-248],[138,-2],[262,151],[302,70],[245,184],[138,39],[99,108],[158,20],[89,12],[128,88],[147,59],[132,202],[105,2],[6,-163],[-25,-344],[1,-310],[-59,-214],[-78,-639],[-134,-659],[-172,-755],[-238,-866],[-237,-661],[-327,-806],[-278,-479],[-415,-586],[-259,-450],[-304,-715],[-64,-312],[-63,-140],[-195,-236],[-68,-246],[-104,-44],[-40,-416],[-89,-238],[-54,-393],[-112,-195],[-128,-728],[16,-335],[178,-216],[8,-153],[-76,-357],[16,-180],[-18,-282],[97,-370],[115,-583],[101,-129],[45,-265],[-11,-588],[34,-519],[11,-923],[49,-290],[-83,-422],[-108,-410],[-177,-366],[-254,-225],[-313,-287],[-313,-634],[-107,-108],[-194,-420],[-115,-136],[-23,-421],[132,-448],[54,-346],[4,-177],[49,29],[-8,-579],[-45,-274],[65,-102],[-41,-246],[-116,-210],[-229,-199],[-334,-320],[-122,-219],[24,-248],[71,-40],[-24,-311],[-70,-430],[-32,-491],[-72,-267],[-190,-298],[-54,-86],[-118,-300],[-77,-303],[-158,-424],[-314,-609],[-196,-355],[-209,-269],[-291,-229],[-141,-31],[-36,-164],[-169,88],[-138,-113],[-301,114],[-168,-72],[-115,31],[-286,-233],[-238,-94],[-171,-223],[-127,-14],[-117,210],[-94,11],[-120,264],[-13,-82],[-37,159],[2,346],[-90,396],[89,108],[-7,453],[-182,553],[-139,501],[-1,1],[-199,768],[-207,446],[-108,432],[-62,575],[-68,428],[-93,910],[-7,707],[-35,322],[-108,243],[-144,489],[-146,708],[-60,371],[-226,577],[-17,453],[-26,372],[38,519],[96,541],[15,254],[90,532],[66,243],[159,386],[90,263],[29,438],[-15,335],[-83,211],[-74,358],[-68,355],[15,122],[85,235],[-84,570],[-57,396],[-139,374],[26,115],[-39,183],[-74,444],[-228,626],[-285,596],[-184,488],[-169,610],[9,196],[61,189],[67,430],[56,438],[-52,90],[96,663],[40,467],[-108,390],[-127,100],[-56,265],[-71,85],[3,163],[-289,-213],[-105,32],[-107,-133],[-222,13],[-149,370],[-91,427],[-197,390],[-209,-8],[-245,1],[-229,-69],[-224,-126],[-436,-346],[-154,-203],[-250,-171],[-248,168],[-126,-7],[-194,116],[-178,-7],[-329,-103],[-193,-170],[-275,-217],[-54,15],[-73,-5],[-286,282],[-252,450],[-237,323],[-187,381],[-75,44],[-200,238],[-144,316],[-49,216],[-34,437],[-122,349],[-108,232],[-71,76],[-69,118],[-32,261],[-41,130],[-80,97],[-149,247],[-117,39],[-63,166],[1,90],[-84,125],[-18,127],[-46,453],[36,262],[-115,460],[-138,210],[122,112],[134,415],[66,304],[-24,318],[78,291],[34,557],[-30,583],[-34,294],[28,295],[-72,281],[-146,255],[12,249],[13,274],[106,161],[91,308],[-18,200],[96,417],[155,376],[93,95],[74,344],[6,315],[100,365],[185,216],[177,603],[144,235],[259,66],[219,403],[139,158],[232,493],[-70,735],[106,508],[37,312],[179,399],[278,270],[206,244],[186,612],[87,362],[205,-2],[167,-251],[264,41],[288,-131],[121,-6],[267,323],[300,102],[175,244],[268,180],[471,105],[459,48],[140,-87],[262,232],[297,5],[113,-137],[190,35],[302,239],[195,-71],[-9,-299],[236,217],[20,-113],[-139,-289],[-2,-274],[96,-147],[-36,-511],[-183,-297],[53,-322],[143,-10],[70,-281],[106,-92],[326,-204],[117,51],[232,-98],[368,-264],[130,-526],[250,-114],[391,-248],[296,-293],[136,153],[133,272],[-65,452],[87,288],[200,277],[192,80],[375,-121],[95,-264],[104,-2],[88,-101],[276,-69],[68,-196],[369,10],[268,-156],[275,-175],[129,-92],[214,188],[114,169],[245,49],[198,-75],[75,-293],[65,193],[222,-140],[217,-33],[137,149],[80,194],[-19,34],[74,276],[56,446],[40,149],[8,6],[99,482],[138,416],[5,21],[-26,452],[68,243],[-102,268],[105,222],[-169,-51],[-233,136],[-191,-340],[-421,-66],[-225,317],[-300,20],[-64,-245],[-192,-71],[-268,315],[-303,-10],[-165,587],[-203,328],[135,459],[-176,283],[308,565],[428,23],[117,449],[529,-78],[334,383],[324,167],[459,13],[485,-416],[399,-229],[323,91],[239,-53],[328,309],[42,252],[-70,403],[-160,218],[-154,68],[-102,181],[-354,499],[-317,223],[-240,347],[202,95],[231,494],[-156,234],[410,241],[-8,129],[-249,-95],[-222,-48],[-185,-191],[-260,-31],[-239,-220],[16,-368],[136,-142],[284,35],[-55,-210],[-304,-103],[-377,-342],[-154,121],[61,277],[-304,173],[50,113],[265,197],[-80,135],[-432,149],[-19,221],[-257,-73],[-103,-325],[-215,-437],[6,-152],[-135,-128],[-84,56],[-78,-713],[-144,-245],[-101,-422],[89,-337],[33,-228],[243,-190],[-51,-145],[-330,-33],[-118,-182],[-232,-319],[-87,275],[3,122],[-169,17],[-145,56],[-336,-154],[192,-332],[-141,-96],[-154,0],[-147,304],[-52,-130],[62,-353],[139,-277],[-105,-130],[155,-272],[137,-171],[4,-334],[-257,157],[82,-302],[-176,-62],[105,-521],[-184,-7],[-228,257],[-104,472],[-49,393],[-108,272],[-143,337],[-18,168],[-48,41],[-5,130],[-154,199],[-24,281],[23,403],[38,184],[-46,93],[-59,46],[-78,192],[-120,118],[-261,218],[-161,213],[-254,176],[-233,435],[56,44],[-127,248],[-5,200],[-179,93],[-85,-255],[-82,198],[6,205],[10,9],[62,54],[-221,86],[-226,-210],[15,-293],[-34,-168],[91,-301],[261,-298],[140,-488],[309,-476],[217,3],[68,-130],[-78,-118],[249,-213],[204,-179],[238,-308],[29,-111],[-52,-211],[-154,276],[-242,97],[-116,-382],[200,-219],[-33,-309],[-116,-35],[-148,-506],[-116,-46],[1,181],[57,317],[60,126],[-108,342],[-85,298],[-115,74],[-82,255],[-179,107],[-120,238],[-206,38],[-217,267],[-254,384],[-189,341],[-86,584],[-138,68],[-226,195],[-128,-80],[-161,-274],[-115,-43],[-252,-334],[-548,160],[-404,-192],[-32,-355],[15,-344],[-263,-393],[-356,-125],[-25,-199],[-171,-327],[-107,-481],[108,-338],[-160,-263],[-60,-384],[-210,-118],[-197,-455],[-352,-8],[-265,11],[-174,-209],[-106,-223],[-136,49],[-103,199],[-79,340],[-259,92],[-112,-153],[-146,83],[-143,-65],[42,462],[-26,363],[-124,55],[-67,224],[22,386],[111,215],[20,239],[58,355],[-6,250],[-56,212],[-12,200],[14,420],[-114,257],[393,426],[340,-107],[373,4],[296,-101],[230,31],[449,-19],[144,354],[53,1177],[-287,620],[-205,299],[-424,228],[-28,430],[360,129],[466,-152],[-88,669],[263,-254],[646,461],[84,484],[243,119],[222,117],[143,162],[244,870],[380,247],[231,-17],[54,125],[232,32],[52,-130],[188,291],[-63,222],[-13,335],[-113,328],[-8,604],[46,159],[80,178],[244,36],[98,163],[223,167],[-9,-304],[-82,-192],[33,-166],[151,-89],[-68,-223],[-83,64],[-200,-425],[76,-288],[4,-228],[281,-138],[-3,-210],[283,111],[156,162],[313,-233],[132,-189],[189,174],[434,273],[350,200],[277,-100],[21,-144],[268,-7],[63,260],[383,191],[-59,497],[10,445],[136,371],[262,202],[221,-442],[223,12],[53,453],[32,349],[-102,-75],[-176,210],[-24,340],[351,164],[350,86],[301,-97],[287,17],[316,327],[-291,280],[-504,-47],[-489,-216],[-452,-125],[-161,322],[-269,195],[62,581],[-135,534],[133,344],[252,371],[635,640],[185,124],[-28,250],[-387,279],[-478,-167],[-269,-413],[43,-361],[-441,-475],[-537,-509],[-202,-832],[198,-416],[265,-328],[-255,-666],[-289,-138],[-106,-992],[-157,-554],[-337,57],[-158,-468],[-321,-27],[-89,558],[-232,671],[-211,835],[-187,363],[-548,-684],[-370,-138],[-385,301],[-99,635],[-88,1364],[256,380],[733,496],[549,609],[508,824],[668,1141],[465,444],[763,741],[610,259],[457,-31],[423,489],[506,-26],[499,118],[869,-433],[-358,-158],[305,-371],[286,206],[456,-358],[761,-140],[1050,-668],[213,-281],[18,-393],[-308,-311],[-454,-157],[-1240,449],[-204,-75],[453,-433],[36,-878],[358,-180],[217,-153],[36,286],[-174,263],[183,215],[672,-368],[234,144],[-187,433],[647,578],[256,-34],[260,-206],[161,406],[-231,352],[136,353],[-204,367],[777,-190],[158,-331],[-351,-73],[2,-328],[218,-203],[429,128],[68,377],[581,282],[969,507],[209,-29],[-273,-359],[344,-61],[199,202],[521,16],[412,245],[317,-356],[315,391],[-291,343],[145,195],[820,-179],[385,-185],[1006,-675],[186,309],[-282,313],[-8,125],[-335,58],[92,280],[-149,461],[-8,189],[512,535],[182,537],[207,116],[735,-156],[58,-328],[-263,-479],[173,-189],[89,-413],[-63,-809],[307,-362],[-120,-395],[-544,-839],[318,-87],[110,213],[306,151],[74,293],[240,281],[-162,336],[130,390],[-304,49],[-67,328],[222,594],[-361,481],[497,398],[-64,421],[139,13],[145,-328],[-109,-570],[297,-108],[-127,426],[465,233],[577,31],[513,-337],[-247,492],[-28,630],[484,119],[668,-26],[602,77],[-226,309],[321,388],[319,16],[540,293],[734,79],[93,162],[729,55],[227,-133],[624,314],[510,-10],[77,255],[265,252],[656,242],[476,-191],[-378,-146],[629,-90],[75,-292],[254,143],[812,-7],[626,-289],[223,-221],[-69,-307],[-307,-175],[-730,-328],[-209,-175],[345,-83],[410,-149],[250,112],[142,-379],[122,153],[444,93],[892,-97],[67,-276],[1162,-88],[15,451],[590,-103],[443,3],[449,-312],[128,-378],[-165,-247],[349,-465],[437,-240],[268,620],[446,-266],[473,159],[538,-182],[204,166],[455,-83],[-201,549],[367,256],[2509,-384],[236,-351],[727,-451],[1122,112],[553,-98],[231,-244],[-33,-432],[342,-168],[372,121],[492,15],[525,-116],[526,66],[484,-526],[344,189],[-224,378],[123,263],[886,-166],[578,36],[799,-282],[-99610,-258]],[[23933,96380],[-126,-17],[-521,38],[-74,165],[559,-9],[195,-109],[-33,-68]],[[19392,96485],[-518,-170],[-411,191],[224,188],[406,60],[392,-92],[-93,-177]],[[56867,96577],[-620,-241],[-490,137],[191,152],[-167,189],[575,119],[110,-222],[401,-134]],[[19538,97019],[-339,-115],[-461,1],[5,84],[285,177],[149,-27],[361,-120]],[[23380,96697],[-411,-122],[-226,138],[-119,221],[-22,245],[360,-24],[162,-39],[332,-205],[-76,-214]],[[22205,96856],[108,-247],[-453,66],[-457,192],[-619,21],[268,176],[-335,142],[-21,227],[546,-81],[751,-215],[212,-281]],[[79187,96845],[-1566,-228],[507,776],[229,66],[208,-38],[704,-336],[-82,-240]],[[55069,97669],[915,-440],[-699,-233],[-155,-435],[-243,-111],[-132,-490],[-335,-23],[-598,361],[252,210],[-416,170],[-541,499],[-216,463],[757,212],[152,-207],[396,8],[105,202],[408,20],[350,-206]],[[57068,98086],[545,-207],[-412,-318],[-806,-70],[-819,98],[-50,163],[-398,11],[-304,271],[858,165],[403,-142],[281,177],[702,-148]],[[64204,98169],[-373,-78],[-250,-45],[-39,-97],[-324,-98],[-301,140],[158,185],[-618,18],[542,107],[422,8],[57,-160],[159,142],[262,97],[412,-129],[-107,-90]],[[77760,97184],[-606,-73],[-773,170],[-462,226],[-213,423],[-379,117],[722,404],[600,133],[540,-297],[640,-572],[-69,-531]],[[25828,97644],[334,-190],[-381,-176],[-513,-445],[-492,-42],[-575,76],[-299,240],[4,215],[220,157],[-508,-4],[-306,196],[-176,268],[193,262],[192,180],[285,42],[-122,135],[646,30],[355,-315],[468,-127],[455,-112],[220,-390]],[[30972,99681],[742,-47],[597,-75],[508,-161],[-12,-157],[-678,-257],[-672,-119],[-251,-133],[605,3],[-656,-358],[-452,-167],[-476,-483],[-573,-98],[-177,-120],[-841,-64],[383,-74],[-192,-105],[230,-292],[-264,-202],[-429,-167],[-132,-232],[-388,-176],[39,-134],[475,23],[6,-144],[-742,-355],[-726,163],[-816,-91],[-414,71],[-525,31],[-35,284],[514,133],[-137,427],[170,41],[742,-255],[-379,379],[-450,113],[225,229],[492,141],[79,206],[-392,231],[-118,304],[759,-26],[220,-64],[433,216],[-625,68],[-972,-38],[-491,201],[-232,239],[-324,173],[-61,202],[413,112],[324,19],[545,96],[409,220],[344,-30],[300,-166],[211,319],[367,95],[498,65],[849,24],[148,-63],[802,100],[601,-38],[602,-37]],[[42472,99925],[1737,-469],[-513,-227],[-1062,-26],[-1496,-58],[140,-105],[984,65],[836,-204],[540,181],[231,-212],[-305,-344],[707,220],[1348,229],[833,-114],[156,-253],[-1132,-420],[-157,-136],[-888,-102],[643,-28],[-324,-431],[-224,-383],[9,-658],[333,-386],[-434,-24],[-457,-187],[513,-313],[65,-502],[-297,-55],[360,-508],[-617,-42],[322,-241],[-91,-208],[-391,-91],[-388,-2],[348,-400],[4,-263],[-549,244],[-143,-158],[375,-148],[364,-361],[105,-476],[-495,-114],[-214,228],[-344,340],[95,-401],[-322,-311],[732,-25],[383,-32],[-745,-515],[-755,-466],[-813,-204],[-306,-2],[-288,-228],[-386,-624],[-597,-414],[-192,-24],[-370,-145],[-399,-138],[-238,-365],[-4,-415],[-141,-388],[-453,-472],[112,-462],[-125,-488],[-142,-577],[-391,-36],[-410,482],[-556,3],[-269,324],[-186,577],[-481,735],[-141,385],[-38,530],[-384,546],[100,435],[-186,208],[275,691],[418,220],[110,247],[58,461],[-318,-209],[-151,-88],[-249,-84],[-341,193],[-19,401],[109,314],[258,9],[567,-157],[-478,375],[-249,202],[-276,-83],[-232,147],[310,550],[-169,220],[-220,409],[-335,626],[-353,230],[3,247],[-745,346],[-590,43],[-743,-24],[-677,-44],[-323,188],[-482,372],[729,186],[559,31],[-1188,154],[-627,241],[39,229],[1051,285],[1018,284],[107,214],[-750,213],[243,235],[961,413],[404,63],[-115,265],[658,156],[854,93],[853,5],[303,-184],[737,325],[663,-221],[390,-46],[577,-192],[-660,318],[38,253],[932,353],[975,-27],[354,218],[982,57],[2219,-74]]],"bbox":[-180,-85.60903777459777,180,83.64513000000002],"transform":{"scale":[0.0036000360003600037,0.0016925586033320111],"translate":[-180,-85.60903777459777]}} diff --git a/sites/kit.svelte.dev/src/routes/faq/+page.js b/sites/kit.svelte.dev/src/routes/faq/+page.js deleted file mode 100644 index 950b7316700e..000000000000 --- a/sites/kit.svelte.dev/src/routes/faq/+page.js +++ /dev/null @@ -1,5 +0,0 @@ -import { redirect } from '@sveltejs/kit'; - -export const load = ({}) => { - redirect(301, '/docs/faq'); -}; diff --git a/sites/kit.svelte.dev/src/routes/home/Deployment.svelte b/sites/kit.svelte.dev/src/routes/home/Deployment.svelte deleted file mode 100644 index 4328500efad7..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/Deployment.svelte +++ /dev/null @@ -1,297 +0,0 @@ - - -
-
-

deploy anywhere

-
-

- Export static HTML files. Run your own Node server. Deploy code to the edge of the world. If - a platform runs JavaScript, it runs SvelteKit — in some cases with zero configuration. -

-

Want to try deploying somewhere else? Swap out your adapter with a single line of code.

-
-
- - -
- - diff --git a/sites/kit.svelte.dev/src/routes/home/Features.svelte b/sites/kit.svelte.dev/src/routes/home/Features.svelte deleted file mode 100644 index 0854a8bb0b11..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/Features.svelte +++ /dev/null @@ -1,120 +0,0 @@ - - -
-
-
-

features? we got 'em.

-

- Mix and match prerendered pages for maximum performance with dynamic - server-side rendering for maximum flexibility. Turn your app into a - client-rendered - PWA with a single line of code, for the whole thing or just one page. Use - accessible client-side routing with automatic - preloading for slick, instantaneous navigation that doesn't reload your - entire page (and your analytics, and all that other junk). Protect your users with automatic - CSRF protection - and easy-to-use - Content Security Policy configuration. Keep your secrets to yourself with - advanced environment variable handling. Handle errors gracefully and - securely. Load data - directly from your database - and connect your back end to your front end with type-safe data loading and - built-in form actions - that work with or without JavaScript. Co-exist with other client-side - routing frameworks on the same page. Add service workers for offline - support. Generate AMP-compliant - pages if you really have to. Build complex UIs with unusually powerful - filesystem-based routes. Nested layouts? Duh. Learn - web standards - that work across environments. Integrate with Tailwind - and Playwright and Vitest and Storybook - and, well, whatever you want. Build libraries as well as apps. - Deploy anywhere with adapters. -

- -

- SvelteKit is the framework that - grows with you, whatever you end up building. -

-
-
-
- - diff --git a/sites/kit.svelte.dev/src/routes/home/Hero.svelte b/sites/kit.svelte.dev/src/routes/home/Hero.svelte deleted file mode 100644 index 11000359ee61..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/Hero.svelte +++ /dev/null @@ -1,192 +0,0 @@ - - -
-
-
- - -
web development, streamlined
- read the docs -
- -
- -
-
-
- - diff --git a/sites/kit.svelte.dev/src/routes/home/Intro.svelte b/sites/kit.svelte.dev/src/routes/home/Intro.svelte deleted file mode 100644 index d3a93005596c..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/Intro.svelte +++ /dev/null @@ -1,37 +0,0 @@ - - - -
-

fast

-

- Powered by Svelte and - Vite, speed is baked into - every crevice: fast setup, fast dev, fast builds, fast page loads, fast navigation. Did we - mention it's fast? -

-
- -
-

fun

-

- No more wasted days figuring out bundler configuration, routing, SSR, CSP, TypeScript, - deployment settings and all the other boring stuff. Code with joy. -

-
- -
-

flexible

-

- SPA? MPA? SSR? SSG? Check. SvelteKit gives you the tools to succeed whatever it is you're - building. And it runs wherever JavaScript does. -

-
-
- - diff --git a/sites/kit.svelte.dev/src/routes/home/Showcase.svelte b/sites/kit.svelte.dev/src/routes/home/Showcase.svelte deleted file mode 100644 index 90f4d6da1db1..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/Showcase.svelte +++ /dev/null @@ -1,106 +0,0 @@ - - -
-

showcase

- -
- {#each showcase as { url, image }} - - - {url} - - {/each} -
-
- - diff --git a/sites/kit.svelte.dev/src/routes/home/Svelte.svelte b/sites/kit.svelte.dev/src/routes/home/Svelte.svelte deleted file mode 100644 index e896bfbd22ee..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/Svelte.svelte +++ /dev/null @@ -1,114 +0,0 @@ - - -
-

- /ˈsvɛlt/ adjective - attractively thin, graceful and stylish -

- -
- - -
-

- SvelteKit is built on Svelte, a UI framework that uses a compiler to let you write - breathtakingly concise components that do minimal work in the browser, using languages you - already know — HTML, CSS and JavaScript. It's a love letter to web development. -

- -

- But don't take our word for it. Developers consistently rank Svelte as the framework they're - - most - - - excited - - - about - - - - using. -

-
-
-
- - diff --git a/sites/kit.svelte.dev/src/routes/home/Video.svelte b/sites/kit.svelte.dev/src/routes/home/Video.svelte deleted file mode 100644 index 057e118794c5..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/Video.svelte +++ /dev/null @@ -1,261 +0,0 @@ - - -
- - - {#if d} -
- {/if} - -
- - - -
- - -
- - diff --git a/sites/kit.svelte.dev/src/routes/home/cc-off.svg b/sites/kit.svelte.dev/src/routes/home/cc-off.svg deleted file mode 100644 index c5d60a43dfc6..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/cc-off.svg +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/cc-on.svg b/sites/kit.svelte.dev/src/routes/home/cc-on.svg deleted file mode 100644 index e429173f5e96..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/cc-on.svg +++ /dev/null @@ -1,14 +0,0 @@ - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/common.css b/sites/kit.svelte.dev/src/routes/home/common.css deleted file mode 100644 index a059dd3df689..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/common.css +++ /dev/null @@ -1,54 +0,0 @@ -.hero-container:dir(rtl) { - max-width: 116rem; -} - -.home { - --background-1: radial-gradient(circle at top right, rgb(230, 233, 236), rgb(244, 245, 247)); - --background-2: var(--sk-theme-2); -} - -.home h2 { - font-size: var(--sk-text-xl); - line-height: 1.2; -} - -.home .grid { - display: grid; - gap: 1em; - margin: 0 0 4rem 0; -} - -.home .grid:last-child { - margin-bottom: 0; -} - -@media (min-width: 900px) { - .home h2 { - font-size: var(--sk-text-xxl); - } - - .home .grid { - grid-template-columns: repeat(var(--columns), 1fr); - gap: 7rem; - } -} - -/* In case JS disabled */ -@media screen and (prefers-color-scheme: dark) { - .home { - /* --background-1: radial-gradient(circle at top right, rgb(49, 49, 49), rgb(77, 77, 77)); */ - --background-1: #222; - --background-2: #444; - } - - body.light .home { - --background-1: radial-gradient(circle at top right, rgb(230, 233, 236), rgb(244, 245, 247)); - --background-2: var(--sk-theme-2); - } -} - -body.dark .home { - /* --background-1: radial-gradient(circle at top right, rgb(49, 49, 49), rgb(77, 77, 77)); */ - --background-1: #222; - --background-2: #444; -} diff --git a/sites/kit.svelte.dev/src/routes/home/logos/appengine.svg b/sites/kit.svelte.dev/src/routes/home/logos/appengine.svg deleted file mode 100644 index 4c2e34391ecc..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/appengine.svg +++ /dev/null @@ -1,63 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/azure.svg b/sites/kit.svelte.dev/src/routes/home/logos/azure.svg deleted file mode 100644 index 996038592311..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/azure.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/cloudflare.svg b/sites/kit.svelte.dev/src/routes/home/logos/cloudflare.svg deleted file mode 100644 index 53b4e416101f..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/cloudflare.svg +++ /dev/null @@ -1,18 +0,0 @@ - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/deno.svg b/sites/kit.svelte.dev/src/routes/home/logos/deno.svg deleted file mode 100644 index 34293615e36f..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/deno.svg +++ /dev/null @@ -1,60 +0,0 @@ - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/firebase.svg b/sites/kit.svelte.dev/src/routes/home/logos/firebase.svg deleted file mode 100644 index 6aec5adc92c1..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/firebase.svg +++ /dev/null @@ -1,36 +0,0 @@ - - - - - - - - - - - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/html5.svg b/sites/kit.svelte.dev/src/routes/home/logos/html5.svg deleted file mode 100644 index 72a4b1ef25c5..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/html5.svg +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/lambda.svg b/sites/kit.svelte.dev/src/routes/home/logos/lambda.svg deleted file mode 100644 index 958c9657e2d3..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/lambda.svg +++ /dev/null @@ -1,15 +0,0 @@ - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/netlify.svg b/sites/kit.svelte.dev/src/routes/home/logos/netlify.svg deleted file mode 100644 index 8d4e9d77e17d..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/netlify.svg +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/logos/node.svg b/sites/kit.svelte.dev/src/routes/home/logos/node.svg deleted file mode 100644 index 41d044ac6b3f..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/node.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sites/kit.svelte.dev/src/routes/home/logos/vercel.svg b/sites/kit.svelte.dev/src/routes/home/logos/vercel.svg deleted file mode 100644 index 72948d01a7d0..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/logos/vercel.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/sites/kit.svelte.dev/src/routes/home/showcase/asmeditor.png b/sites/kit.svelte.dev/src/routes/home/showcase/asmeditor.png deleted file mode 100644 index c6059ee483ab49fe6fecfa88244e557d8de65cbd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 162044 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 VK1r!Pk^vAtFO)T&l_{D8{vU!tkSG8E diff --git a/sites/kit.svelte.dev/src/routes/home/showcase/dropzone.png b/sites/kit.svelte.dev/src/routes/home/showcase/dropzone.png deleted file mode 100644 index d5f1a7c94f2a27cc3d6dda854001572dcc5e7c4c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 242780 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

-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�EI>td1EiKQzBl$ayk(H|*A|-d@1{`P*8@IR; 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 z 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�X+q_j7;_2VaV+R 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 diff --git a/sites/kit.svelte.dev/src/routes/home/showcase/pausly.png b/sites/kit.svelte.dev/src/routes/home/showcase/pausly.png deleted file mode 100644 index 950a5b29fde19de1d8b94757d9977604b6685f0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 108121 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

6lgX^o3d(f9Q@+sUw#*K-z+z|-m@v(- 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�&ju*`WpYyr{0ac8r%S)lZ`AT6Deakj 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 Jay4z9{6D_2Ald)` diff --git a/sites/kit.svelte.dev/src/routes/home/showcase/pocketbase.png b/sites/kit.svelte.dev/src/routes/home/showcase/pocketbase.png deleted file mode 100644 index b58ae9a7dbdc8733e92ff08d40c56bb2a1f4bbce..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 206721 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

KJ| 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βU3j;&H1Pu`HP(M!Gd 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 diff --git a/sites/kit.svelte.dev/src/routes/home/showcase/pronauns.png b/sites/kit.svelte.dev/src/routes/home/showcase/pronauns.png deleted file mode 100644 index 167c0e17618f8ec8ad7752f8824cff9147f686aa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 99313 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

-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⪼1P35Y=W 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
F7}pJq z&`aSTL9PLrvT3i3`U2nvYp_M!OXnuYhK-r2(%#Par6V#%U#hi^X;0ydxbN4tB@bwm zZRhUmXj4IC{pDz%^(MeOo^7~Jf8a=)2EYVO>KJwbgVA|v6NmsHWXDcrI*`{0!mZHR z#yWAv0H=7VD1t*i#Mkt1&z*kl8-SmjQjTWuSl3;~-EY_G(sPa%aw%h%2_{jJKk{u3 z6*mY)QIt%D|?qFGsvD+3e#uzWN#j4CpbQD)vJUmpGQb+eOs4>c@<h{OwSNS&O9R~gK926Li?2YVU` zm(6(Cm`0}@_+$r#6%CTFKo-HAVmvo~_$)uGo>E(SrC+!})Yn<{z0e5exPpTIl#A)* zi+)o9eOF~fKiD>%b^77Aw=KV|?eWMx+ChgtH~q+Z`v3W95O~VRztBE*`nTH-+icoj zE5{vj_L-3%xwb<`-X3Srv3tG!Tbaw1b_rE%O=Txb2{DP%IhVeep&MqUK~)hl=u5Lwr;(?1Q4#0ETvBW47P+~GX} zb3c+(C#fryhdr$i@W3)&W-_jkBpbGq%d&mYh7M|Koagn8fQ|qxbpw0TrUr$W4h9IO zENcgV!A5{*Z5RQts|?uJL_nx$tEOwaBtGL00yDA^@7fSjYX>!2V>B!v>1ky@wP0{f z2!EX=-+q%G;2jJM|8WG%cBHx1{9_`B(G|YdX#C?7XMr{YKyIuEL83#YYB83^|1){v zX{<)V>bf0R?(OWS3{#sw2rv-d2{OV4lEOewZ8Cs44H100o-R0pW}th!0{w+r@G&^} zE(cfsWk5t*YBzQ4_RS~i1@G2&xj&PyLE03o!9@oHRXcJF)U_DmZ|uF*ZdywKh@x4Z z_)2~HFTQzKvF%4Anm+?P**5g7pp1_I&89}&NI#129=!uO(375rdtqUNzg)i;bYTtp zU+@y&?}1+Zn}E*1Sg9yS7cH|UrocS;q8>?`d;)Oww|(5Q%TQ!oj8^Bx zjLVEaQujs;kr6%75%^ELBk7qw{f53!35D&%Klw4@t$2bwwntuf?64(*DDpRi3U!eH zYmGY+S^+H0P3)9(iy!NlIvV6iIpew>_9RQuWcjtdy=3IhRG}p#SUIM-mOq17~ zdc}7EB=Dp*p%*F?GU59q3Z{Uns{$a9%2kZob_Q1TA7zI@AAG+u?#LY{4*)@1u2*~y zd=9>1SpmdCHi0@$Uz30PkVpDx%P8xI7uuXMv+s>5U``p+D7Eg7zQJ{THIk zL0#KY!mESBRkB{amDZ+ff)Nh^6K{5kAUcn-tKMjF6AP4af{#l8$Z7S$p0` zC<;tEedmaz!qIQ@7)K2g04i)_)dt=boV4g~fABFcy`0zoah<975eTwhmFk=d2#)(+ z3%v0CuaA3Ko4@gb0l?cRYkpeI_w|h+(B%L&{xoGK)LU=6y}kOiC$*cFuWB1@xB*9~ zrCY~As0VyNu;hrg=s)8 zF+HO$Y3W{k9q;G8e!26>5pMDopBw6xX{%$y&&ZHp=yJm z5n%bDT;p(PGe^Y~8U<`5Bib`~3NWGmGK0tb6`$BtDHFz3bm*|cFaju<3na#M%RK@>F7e`sX`WX&@-E-b4I4p6I`R5{kFZX7 zjxqps!{}J*f_&Gzfdv#Hkbz(T9fNOWO#yQCBGhZ}-y0@SR6h&9FyJB|_A!EGUL&Ap zdr%RsvrX$7_2hHHq|?nW0GQ$Lu*Z?pFxw#gx zM*a*ih4y85P5+L&ekrInffU%|=Gic006bpLkwdi2oDtW!w4|3^&xb`T%?IhF-#LMq z#hS^Wu=~q<91b&(p&eM}rI*4Gk*F)HI&av;1(EO*duY%p`v71D1hcr;0V-k3!FWF! zvRT+PTQtxh4el!QC%B`?@eT5H#hcYoT8hjk4-#d^=G{uTlqf;OKv1JBs8*^q7!!jD z4tQPeJJiV@3@uAm@Iam90odXT9FC?+G08)=FIrg^U#zDh!f;gJ0kH8NRE|!RJQW?O zHJ&yQl2)_YS38Vj>$CtMiwp3D({`Vx53!vZ351e)4gA#e7}f>q^>LgQ9`A=A^-UmZ znzPdMlc3>^AaM;-#o`eir~o6IMJg6>QHKi^uG`oC-O+Z~W2g3lm%i}6Vl>c-B>C%K z|GItuyz_9B%X0z;7WQ`GX zT!b00{ws8Y1M5+jYr=xxi1gb!PXSt^jVQB0|Gd2G_x4WgksHr$cXk`uPf-`;YOUnT zUVq~*Q$J}4x(M2L$9?glbjL6OFOpThUl?C{R$j5q*@@B>kP8Pr;irHz@}a`fiezzu z^sH-CJ>!~pO#+<9n?d?pLfXQu00ucFXYfFp%t!hsy>jYrDA(^B5OR};?L%;eK2!fV zx}2V_xDXhKcGN~jJ+3kTjz`2`{TdyXQ_$c+8$sA<2q1W5u=uSwr(Tua`*%uKvXty- zFJi9W=Z2HgiGd}DO$xNY4<%u)`HPD>*g8iXJ84d>Q;#_JFaRB75_qOs!CxHkY{2c2 zFy1RrmTk*;_`pTcgX(zEuEtLTKyBubOty>Lh~EhS;gj@;9Jz!I+=zPv;({dojXirD*pr z1Aqc!WKYw^4h)_VsP^K%%Kt%|N6?=+kOC-Pf9?tB-qdA7?Q~|Eji|?F@lD+uf+w!{ zz)=#ZKd94L2Yy-L5FI=BG9%&gw~U41b}sIB7NbkZF(8d-D+saERNqb4fDXFQbfcdr z3;=EO3i@a!P)IZ&JwSXyBZ52rGt3AFfzj}P0Y+3QQ0aO|%4_I}ZPh(_21!a*8z(@5 zu9=P#Ex99aC~lruo_6(j16y7z-3cbRIniP@UZhE>n>9uklDv2jkC^V2fIfN#qeiwL zHAlPa)2YjCCm=%!twIUlrcRPRR1XstD!kjti(45@qHgKh~bu%z8_#X4?zpop+HB*tykC!U zb7pPOmaV!29pQp`vv4kAkY3fx$B5#bjrx0HW7Mt#q17EYF6-cJ(Sm+nVrL}4THIT{ z`tG)P<2h|f2i6;Q06c%AK7!d>y|a%%UU%E-w)4Wd?V1&Lw09lx%=YacUD|fpc2T?R zn(NvRuerW$(l@>YklJCh`R$VHZ)uC>Zq(`ip&HeRx zaemxZz3eYK-TD16?=9x^SD5v38+2V<+3RlGl=1Dq38HMtA7u$_VZqM z+u0icc!oSNI(bRg<6a%yt?CDJZ?|w>ySbm$xa!WkJD(f03vRxxz3B-LZnHPqu)Y3E zKWGo$W|Pj}y6r9j>x;WicbT(Mo7d^z+8+jX?DfxHy1YGP?yL?b|In`Pn~rv!KMQ=_ zrPmBH&kXie&dTuj7x_S@gW;iF@H|UoDnJHg9(I?V|%U;7|P9+C{1Cw-gp8QO~K13*#C znD3zvr8Xo6-}FJ?R>zan)L>5AN>52P;!Rqmo(NX0CCV>giMo^v$J|7@xEB;qx29;p zoAm{iXe1Qn3t#~h;hOqhWmf8Wobn}~Y{S#s!~1Y$S;#K{Ll4M>G-(g4T@!D%GfXbo za`Z5N8 zo&~6Jvvrny_XPCNl`8C+bm|#-g#Nk~^ul0L&Z$hn;`#@*4RzVct751sVq0Z>Fl8+X zX0ryxQ4Qgp#ARaU2bxei8q>)x~Xa4dPH$s<_a$*!ovgo2mhizKJ8B~(??RY zhKGE}|KLY83TU6A4CE7h={LDEsAQRS`v#Dkmo97jANJh#@W(uItpHHrlwJnPU56`H ztZ2s`du-cdk3HIf2OikA-+uc^nd`2*uAO=2neF`Z&u{N~*Sp#lTWoQk0Hy)p`4{}S z9d+Elv^{p+y4|hgV8&@!2*8}qFA9V>Pw@BsRdyeF&)>C6F1@n->bKVcy#4s6zXT}S zWWnsV<>m|9`9HlHBb4ua-Qn%hzUJ_>Gr!kv?cnWk58bH)qkG$Vm;So#&_^FvcM!Pq zwwt%xI|#gb$+9-DgS4e9Zg1Ofv9R5L`>onJ7yY8m-f+D(d)7v6PM@yce$l4wy+8bU zd-)@FZ7XkI-7dNIM(AsC2Y!3*vTgg`Wxr}mIuJbUi4SXM^|~h=^@8^G@BXO$%Xcqn zi#k|*#=~}QhaULk_KzPuqy6V^Z)h8J9-sD*9ou9paL*$)a8u#NbI&~ zVIOV%WBb%)ziqGBd$+dYwmaHsS6$af<>s_YI{16(Uc0m_et#2yTjbB+e_3xorf(PY z?@KyRyY`N|+o5~y+i630{tCgb{BBu$PzQa#>}|b#&z;-F*WS>+^Q#-$ zu}^wvd*Rcc*xvH-ue39|Ob?qsr#*SM?b zv{Vmtc8G}=Mh;=Tn_gwi@!q78e$b(uUn|e*n_28Jw0>U)=rc2OWKST_`5W0l>~oZG z7`2Pv!H!xqFaucV*9+wEq0@Pb5ng?Wz7dQdB&I!N4#a4*EP3taYgA6_6JzcHJk?q| z>O*~Oe1{6viXN&dC$Dj2PXGj8IiiUpZlW&oeLz5FEAvOb+&>Alfgb+|Dh(#70fSAB z(0aPFbT>{DCoqD1o+>uLD)2o;0dyq-EVkiIARZM2Z?-$EMEME4Sl@Gh-29`y#Ci=m zLN+;`%hHzOOMX&^Hp>GN_+BFPLzhfI$Y7@yQ2qjso`oFa2HzfDlL?fv+Q= zad)hsLIPo7$E|B73Egnbd=86-!`^6*BS>7k1+5i0REJK!WNnR%6);kVrMN{xuw)1t zNf}c=@G*sY_U;lI1eH(_grrLlBqf4g5D~bGwnWE3#|{eE0YIcO6D1LJfRvM1xPW9( zEJ(8qQK@AH7xTT)31#D1eh7Ds0`p;^fL#>AnkVVn+Z$rk7tdYtvydsmID8;B z0NfKx%%y*RQit3K!sowq5%4EHXNb@*Kvz8DL8Aks0D#Xs^3e8xhd%H=0W^4Q=jrB~ zZ*HfbetLV+i(b?|^5KuP#oH`y&wu{&F#`9+FMhH8O1W_ z?|f;SJ3B@)?*UMI`^Uc0UU%p-+w=bE)bfhVdD{pUeJJ5~&-W7lB5YUavw#-kA@=6QJVoW25FWw&t4g}zDDvP{< zcy-;POkwGjYuU7YGw zYNL!qBE=JbW&M0zoO7bit7TT8%oyD1e;$0{;mTYKNDwlEXXP%$m_}L1Gj(Hnmcye? z)E+@2r?#!Kdo_u{u8e>No?sXq)ZM82t;`g2&*&y!UGfM3HTo zNwTi`cj}pT_1Sqev8F+#cv^(MNE`FFJ2Y&l2pS=8>Oww+{>!|(K6yb|b?{yTiHr}u zv0~|zcp-N=qpkqB%9A&b0!rSPxUtSP@}}W~PEVtFzK)ST12-Ef)^&Ka4+^Uh!8{|7 zWz}WL8K~D<7dVswqXiJr|Hl%S{%@V7-#>xfp@WiElEMj83}`A?h9^w=EX@-%6j1J% zZ8uXzS#+HI#}OMn`2;QW%2ZiVrYXdV+M}CfTq4`SO8E3HEh7QuFceZ9$`${-79~NP zu2Xt)!hnOS#G^SJIStwYW>AHH21CJG{4|EtbswKY!U~;KC}kn*0w#lIvb^|G2vqyx zqeLfRXd&d5%?*eUbiA25c3JDdccMUU{FvF!RP+Q~$)?o;nRw_c9GCycKToX!0OFy8 zzLIB{!TSjs>)gN4Kg)YG&~>Ta0DuO01jL@0z?ws?CoKSIojZifq#Sh=NDVy(0PLe$ z2fyZsw(A3S`yTrB5?6U#-LN5<_$V1xGpZ;`QfB*a64`8^} zR$I}};8B12&m(|WU3GOk{BPgdcJ8BW27s*P`jo?ew!!)xNc^r(HJ<#gzw2xM`VluB z@GZM}dHcr?oZddZ5#Fl+03ZNKL_t*au4CFMpZszk$y(apas1!3XT9WY?c}$;tbM-& zu#12G>-L_v9Mw+!{MXw2d2`x<`#-6@?<1$Tzj^V2?Wi~ZYrDOJp+$WZ@2snrwr`zy zbi1k3JmrgLw|BqcW$i29Jhwe+&j+?2Uvfn|>%z<0zn<`lcE2aRx_$m#hXe4v{-a-Q zfAQD{w;OI**^YV1^V@qq_QiJa)1J`I_|^~GGxvQ|`_2Uyw-29pY1_K51-$>FP1><9 zes+8KGvC_2^5MVf)6%orQ=fQT`|O!-Y>T(ttUd7!A8wD?ezUgqg1PP89h4n({J*u` zx7@hB`4xw>_kQ9l?EyP3ZclmKUhVX+o!g$(0p3HOdO~~Kar?DHp1E&(#fhJ2?>zG0 z_UyNOq#g2z`?vk~d1U+M_kY|DefE>vvF|&r9lGCRI*{A4edV0<+lvo;N_*qKoYpq) z?R@au%iGtEKeSzP)vwwczVd_ilpVKhXJ56XeeRXdX}j&becSVaf7d>E+7a!6yKLV_ zR!&yX(r`CB>d})F z&~P{AH|J3iELZGpY_!Gw+PWLeQU*Ya8l{Tdgyc(5Fn~gQ?^k)ATL7fWZEVr`oBb1| zBkl3eIM;cRA{A(6QdIxae*hqbUizh)I^}o#178Fxd0+gKgWy%%1Rd#^J>$T)9@rAx zsg9>J4O$573}OV{tP}7-n&eLa3vWmfe<=rluK^t6zS=;2sW9sMuH-04T5eW7j50sI046xxx!3W&m?Ypdc0bJ*LL((8N z@S)+BW7Jmxz+tWups=?SV9-68d@_fjA*TT$kp>-o1c3C zH6@q$1uPOTe%fHGP^NTB6_joXgcS0FQYkxH7fq2EF{EJ;u77DTD0}a`pk!md_DLSvLY!0pei3dRRzvqJ8q6K(YU* zQ9n-S5-0LRzI}dMzT(z)%+W7yKe_nwK3cdzTe<4i_S2tV-459A ziS2bKeY|Zte>Ti_<&x#?%kMd+ExqaHcJuO;ZC0Q5{pR=nvpxIIAK$+7!=JR@Tz_MG z`hJ*RbdO!zM?UwpKFas#cILM)YzI8) zQSI9o{Iq@Y2bZ-?`WnN%cV66HcJR~No&aq?lD|)TQ~UPmuLTdUKH_uj^(Q^89kk!$ z+g``~OMCRz8~1gB3)<_CcusrB>;ARl$xqX!JrasDd z_^D^L_Z;}R_PB>Xuupy8+4gzor`lP^yrBK~@?W&qpLu?J%J!SLv#(szPJi`t`!4Mb zyX^nmUjCMS+h0CopLX@N*SEbMc>ng(D}LGLbzXk)+w0p!S6|zXJZQi6=vTe3{rz(u z-S&UNBihyd`h$1dv3;ZK?sZ=~zwOnhvhRqU+IVnEcVNzuyU>4U#(s1djQ_z&%Af3Q ziYWu8Od!rJnab^<%0KAjn9mI4M*od`2>`hMMs`Xtm?KWgOEvY!Jiz+`3-IM=#z2uW zqHpat09<0^Lpjw;R-hK?iX(93)d0_@_F>=DE` z(kI&r{*|Z+yp^=kCIKX_1!$T4rvAMP8r6`#<5~eq>XiH^7?(D{1L#-Z>uFi?C)+~L z@)g)EXh|o!PFrZS6+Wc$;>pLm&@_}0OSld4hBgeu_-eN)0OaUh{EO>azyzSiXejMchF>p(E^$c!KpA#Ci);b_r9~^Vu$tYLP6_d&lUKol2UZK6 zon~iUckloc3WOnDWTy-e7}XKXrX$9c80h-Gufp=Vcp3x9@Hv0(K!tRygDLRilL6$2 z@~Q)p!}l@E8ssoGluXPA&v%GzVZv}ARhu`WCN^tRT@Punc}yW-@;E~>eg7* z?V#!I!940k{?#kud?Y+@kQb+;#JUip?t2uF{1pInt|ASl&Y+QU!sp04e7S>@n>$!| z`d>Z2?fK~G8o*3KsV&(ces|fHEnC)3JMFY~^wCGxjkSC``Q($^v!3;=ws`Sk>=w@6 z;7`;t0KDMBAGcQ@_ujVqu8aFrB&UFFH@X9LHIvU+1GuEG0sO$bk8MA`=+bu0uYLzW zcgfFw)&Bn2Big^7^7#(-ZfhqT_tJLwYffzc^oEyUYWAP|DBb(s_KNl&XML|v`F0Sy z!?x{$i+cG!VWY9H!Tq;K!j zv1fhv!gf^$Hg7!gMeY87aeVvY2`}#8^`5qH!91)tJn_^s+o|t(O?&T0PjAoN?+NY8 zXZ@f(=P8eE-}=Fi`zYH*ZHEprx7~Dpd*`cO-2UO@&$YdF-=XcZ_nz&z_n+3@^pfYc z-~4__JNN@%YJ2w`%{y=hqOaZ__wxI--z<|J_7j3GtO@FJBVAf*~0eSi>_>M zKl+7zRPcZ5}JqW|)PUuqBCbZ$H6mp8Q2U-jJf z_&x=E*xOESZ+Owu`{tY5+Bbf9ar@g2U|;=#&$Q=0<{@qA%`4isF1x0EtiNUE=uYRz zXFajapF5}R`@YY%U!C-t_T{s`-~R5)-)|4^?|)v6qk5co9jE+FJ1bV>d*^u0woO*Q47denpqf97gP@=r)jTz>V;3)bJ>cAsw0GNZi z+&<+VKt{9&eXz9kk{~MN51k}my-Z+*Nmpdggq>+A&L+&4=*l+pGXQY1RQYR90N z8%fxXvU~#51mOYbtUL3VpiTf1wx@$acleZJ!l@*e&-$Yy0hnP`0lstej*cP_7$E{W z0)DDvRL&831%+sGRItFG9VT`HqrJS>wGaSsba;2z7&=AA8y)jBD#o9>1M9d`S6pX3 zsCNvybnmFcV>iGQ+M;7{#LJxVIR-x!fE73JLg|1Bh5vLthJ;f`{6gB~9BEJvTa6G> z5L&q5m?P9=^#JV5M~z^SZv59ED#29930BE(eTqsdlX{_2$0v2^MGXwar5ve34-7f3 zX7DRng~1q9rf(Dl{jh23jbTUKGl|t`EkU)4*bLUHK%4Cd_3;=Dm`0#Z{zV#oM&zTz zI08ua3J8iFnM|OM8s*5I{K}!7U@goT{$*N{pKAy0KjlXTqTnsc3aHXOsVIE!faaDP zm$kfN#CEkFuS3Vmso9BLHrKvUk46r~-Vxca9(V$Vd7p;Vaw1g_~4N z+5y+{X#n_*Z=TcM_Rf#B-S58*)}m={0y-G|*S{QR0aBLtHD!N&*a2}0x99e?eW9E4 zF8oQmxP!+1|7`E}@h_j#NBY)>=3=LB*!}3gd}iBh(@om79hANE6KA$p9Q5S&-%y@3lw!!B4Mj zk9p{B?V>Aw)y})>cWukQuJ30zuWIl3i>G#87PM#n(`oHfFF&B|y3_sIwb$Ly{^7K5 zv;}>mNbD5es)NNB{`q6t$!C7IU2)58?XMpF!1jzjl6Ozvz;bRMQ9S<43)*}CVxPA6 zo_k=lGQi$b-t?h%Y#%Lr%3~kiuKd-teYEzj_E)ETqy6*2PiT+c>p^|p;_CK=|NVpZ z%j<7$$96zBXU^<)Q6Kd?@=M=sFMaS1?a*iK+fMuXciVZt{C!*2LHWxb`=GY_PTRFj z7cRhv?>~O#8|~aaLi%sd-xs5RD{j55eYVs4_{G<>QxAW7Un4oIz5R>lw09kT08AL` zF~9YneagIVjCmL~x6rzbD`ltn;n-7;>TKn8*cI#?VPJk_Y#OkkjGTq!MVC$Gy-Em5 zCQcL{#tIKip88`}pZcA>**0j$>yQ&L1=#>7A|HHl8j^Y5z%Uv|=8Twe4ntYq!Kd3- zo*2Yo&jcV9|0@uhbVu6aNtqgaczV^NaUQ)yzpi}i@=SSBq;l(|U6n5YY&{dqSxy5= zk80I#nu59*)+PE{|ICAqrJGT|Q5VzK0q&5tr4P^}m}Z}70Eo_E7)4__*JC0ZfGtv6 z^fwv?lCMHfuvdXW_#E^#T~BF#ZA0pyM(e2KV2iw2_aiv21DvH-@Mv33K`f_~g#}U; zf=JK@z!I3usaVO45Go*-Ku;rflM%pZLrzU#Sfhmoj(Gx}fuHmnPe(QNs~pe;#s*b^ zKPn;s;CTdqs7p;rQ4IJg0Hm`LxTvhFWX;rgj*y@s9lsHG+0mMQ*oM);^ zW!!Xr0j~&P85q7HfCX6y0w6Q)8OZVp1#&=C8BP3q_#eE$&?IJ{$dNy3N+8t=OjRIf z3e1)^ty*djl{A7h@{4O~pDEQSynG-$Mz2+ryBh{q^1>;kM&NJCT$E`g2KfpwX9 z4IJrL)HBo#*{N6fyKWI&g_7hK;!_XbDQD2}z!i0`5j@y{9Zv2B294OY%k~(Ol21DI z#t+by-vGA5FM?id)Ck{^D@pIBNB-#3Q4Ur%;Kj|Lp;Q!YfQPW1>)4LHYzIrXu3FXZ z*WUp0yqCOqO@KDUiEZc4ko~gDE^FtWdoD)U#$^|d;*>3GSOykIwNPvs`j^3O5?%hrL z@h?&LhUK@mMSZj_%KU!Ws(u{HW^GkJ*5!ufx8qopI1*;lUUq2*SBo~C=f^6r5yt{u z*595ouTTH3?BMjli#Ki8^-;x5`siDmk6=_7ctqj$?bs<@<|rMG!Mwq;J&VVs*6ZC}{WFpP8d9=`efc1{OWn49UNV^8QZ zxbwZYJLQl2?%e;?N8@5g?{E4sE?0M2@wZJs&Sj5&l+2|!t!hhpnf-TP+}`=h7q%l$ z{CN9q-x>UyE@Nk^E$X25!M)snbzLp*^t+$N=sCl2EhnSfQ8uUR0*sJVq#AF~5C+Vg#E3OO(t0f9 zHrC^R;v?qi#EEin0Z9$UF!{TRKqvc?0*mAYyaK%Pyttf(jZvS<>Iqg8h+0kNK|0SV zTU?*&O(x5AhUPnXz?)P;KcZ)zq7IIs!9D4x1B=P%VJE;1HB+$UjV)FeK#uH6uw>vf z){Q<%zbE;ReQvai9u4~8ccokDlGi9b?FK-pe#j3e28>az-v2B4k|sL=+KBe!!vOOh z$O|M#LFi=Ag@4l>qP#~FC5r)I)D;Nyu3t~nLbhQIA00vO_l;4zpo=wtL6f6(tZVQm z2afAeeh3EYumnW6tw6yGIwru6^#I-38ShE-)u?( z2ANf#B+QN{O)ffYYy>#vf&`+Olq6@i4m0?5WunOOxCoP-^qH6?1@NZAsG;ERBcb*U@s#q_9ffjWUSXtdYy zA-gOx06$p?tdHPTzp)8o2vjFH%Vf|x=}DxwvPFT~Jjc&|0G+D=`IeUqc!UrB(aZal zYfdNllq>{yv2IU??u5+ZgYvT-KgY@9tS=WZ4X2?$^alT^SJ_za26_(pxSp?q>+NBZ zO>M>X7$IwYhv;F)y{gTibt}%z3-wu?)7hPOK(`-M~yZV z0B5H*%IB~Fy&<+k=GeWO(`Nm4?ADFx;d?un47~?Xi`UG>Xk}cFvj$_t(xaE*k1^U8 zqnoh_#m^K9TdeJ)jp8jMopx_8j$;Y^20*$~?b)}3AD{ObX9C9gcX7sF06xD7BxDFb zi1YqPmuL3*FOISC!&8(E;Kyrxvq&szkG}wtJmZfK5_9^f;X`)XrhV_yYdXDNuD9v6 zq``Z%;rw}b$j~drnSPF2$kO?ZHdgoVeuxPfKr7VW34~m%+xZv4;4cn*o*nuLzIwyK z7t(RB6w|(OaJFshn9SIeZJlTH!P2o~#wQhANsJ8%$XzUZRy}+(drjPu4~NV}12s6B zeINkfoJ|+E4d%?}D|Pf&=dLj~d$%vagZe6cCJ+n`qDiWPo&NB>dak09BS~W&)KxHu zUV?@$OHDPFyqroMUisF`5iGIKG0#4>#23J)+m=%Nn;R^O7e9z|q|ZQCzy`7oBazml z%GEkQYM=51Z$6@?0FvAHrU#EK!khv;sRIK&^`!(>_AsvFq#MWw!W6($#K(vrmAal@;Y3TyG)J?xW z1MGSFmBgkafr#;3|3}(6Eeu19bpreu#05Oi{g7P_KLS8*_=rAJLWE1}-#Rw{0G0!z z`_@kfa)B~+?htPn{g9JE_0fcI$w3}z8MaX1`q%yj|i9;?4$;Djb)vfMjuGCQY)ZP zHW$c3b=%DLqp3>$@~7U&2mos{hxs8GF8_(|e2W78X#itNG1%2BA3}&n85HiFEJjG_ zUj~@H{{aBx@&mOC|Dg^LMEw&q1P)z z^hI?@CoJ=S`&$>Arlw_SgL;Uej$U-vn(IUi`PhR%rE7Kv0k$z8FEC{jW4A=$R$#Ka3GM^4Hjn| zJmE<+3FSk7B}VdW`JqM0VLRk#77{#t=Z1dv-&TDy3>%Z~)Gl-&i*tE}9jLy$edNU` zZ+S&7Wf*?D45LcA8g&aAgMFlu(S9@Ort;Ok0Tf=%W_jcoxF%bS>;7!}yk=96E;@tH zv0aD=UtO=wjSV1J5JfqnTus%HrxD2IdNNqX8FK)CP`$xGjUG}sJJSFzR6cG^+LZ~T zo=3+Bd^{!X08k$ezC8^&ow5XnMVP+ae`nqMmM6~e@K7!2i`F)(kofid(CKvqkS4a2mn9G58vqb@cOrC3;&6Ybp-$& zJX{0FHH$pGB7TRQfj45Lk2-+4T{ayd4s8w$Vuv9uDmdzNuKI9ifgEf;OkqyCJWdLOc4M+GZ{GPUg+}k-kzw-lvu5bJpcJ0!6>@Q?y72 zDQ%U==~OoZ;1xgY3zP-mOc{e@Hr@@-w8DQu5BiBZ zUfo$~0waK`4;z@4OliN*b%It|@PU7whYq+_^&?Fl@VG~{ryp|gTF>e$C;ET;%>eMU z(>~um{>d}i_V??DK*t$?h*4Wselq-|^9h)w2NbU(Kr-Z{c^Pl1LV76fScQ)1`mHd{ z_6HCsm!lgKe5Ct|osq8GeWFyk9T~_RKYLWdIotT2u#ld*l`n+I>A=dmuv+Z z?fa_dHdMZVX0;piM*x`T^U2meeg@O5QC7SsNE+lo7!FRsY03CUKuU>O#sdzNLHDDa zb<@AFtpTX@vYzgBxhMm^&;|!IoMi!e2A-o%@m*7*EI)3hu+Px5bE-Jx2_mv5(>u#} zG|!zi{0I8*r{oT>q#R<$1WAx8z(qaHd_Z8%AWiv+fL?)n)~oe<`mJ8WyMYas-P1*T z>xnl{^Lir*onLZj>Xv1o_1_Nx1!!z%6v9`=CW&$Z1^CCJ>C@ z9F64rf9YgZmfw+Q)DEYBrB!}VkzDK^fh{kTv-&Bse3zh0rd6jM7sQzB;ghB^SvJ%; zQTsWHq<|v#Bw!%K&L9iurk#zB0W*RjF&3qIFU_$S@s;c0EEEG^{r8BAz<;cl0+%9QuZ1+vbb5?5}d` zpi9S2P?w`($usrrAc&x)kY!0(0+&nsQpFl|qlp;(Tej@x_R3fOJ-)|3KZq&Y%C>1` z#aQq+TpME0u3*PVfIhg#c&~hnO$n2iOHtL(0Bpv5rQfoteMh>MmPCWu4R+5|LEa}R zqQt3tBcZ%MT(p|S6D0t1X{t2a^o!z)<;GZ9BW>A#FhszTE^o|~zHh%*nHM38fE(Rf05IqQTrECGBgF?YGfeas1`fL6+UyM(4 zW@UKfDErWUqh7H_nv}%(Y5-2Yu8_+8`MSQqDM{QxuUmvY39owd@A??=7r9MPG$|1qKNK;~Lw__fN<9h>|TqfBJXmiN|TdE*RC5&WPe=r}*Rupq&b9 z^@cTl1>9l)f#A*S1cAXY<`wy^(;ugl1>g|tQ7-F+nuuL$>K6hN(}fE355BbY2OR*8 zSt@i(kIp2D0?rD)uTLlWG>L;tG{L+H>J#S9d=Qd2`5BbSP}$iU9I(Sqa3?PiBoF~cM|7ZZjTe=MdI2KiQYH`!L9pipL$^>}w+Dp|%26{&l(^2e z6X=3}fo1D5!Io*q4b~ku$w19&%SoKq3T{wLF(LE1jLq%N)gsj988aWv2al4MW|R75 zQxv7#1YWF*y9Sf}wvT$TEO|VTXiuhvMf09DXe(Iybptv*8*_v%eIl9`_>19j@THAL z;uUOWd_gLI001BWNkl`|_@fcTss;-L0F493z2_Sa7YWv~(qc!w39c1V-JCbqXL)Q+4UzcB4HMd9veZr?GwO zPT+e@*4DU^X%BZi9#UKv^isZ@P@s_ISz*$cQopy&+hmKj;q1Ql4~Diss>6;e5w`&% z`lr{h6$j)hM`xr7zH27W}pea48$xw*Ob*+dlW!D zmt+yY@@smx{|SitAq;Ku&vA;f5z3wClpDIK5y04l;tdggH*xSl5Lo9Fk~d=xj)vvI z$1d;t;88#)KB-LbQozqZh&reD^=zK&wgO~XrVx(5setlcq$>5%kbih6g&&EA?TIqd z)o5$#M*vMUa>EL2J^(~~ryZvoVQACTJH897fi=rlvUp_Bzyzn9Oh)rK3OG*T`WTqd zRh{og;Ff0t3d9+~*Cvt3rP5*Nha-UTuh$1yq>i!dM#_ua(*fY|GxLt!trwhvGblKS zs)o%w0eSY;h&}v|f9&^lQ=ox;jIIF;pb$AV>JsR2hdd?-QYIJUy1)d8$dJjwFe)g( zhN^7W=PVJR&=KzqWvM=M20Pbm=3(Qdu{H;We zwyme)FPji^wTUF!C`(Df!n#4H^lyFU2rJrFTS(A z1fqF5Ra_cJ0hKnSBY`!Tpa8=?@@h~2!qWYk!5-v>!)mH{Y*%t?2{3eo{cs7gZJ!80 z#sR9^zd7k5Gj?C;_hN!I)&hq7EBkRFFMQqKwQYCYfgmt;pXMJ4QFU^r^r?y$hK3r= zc7qRQzqQph_`CMn-?dj9`TDl$rVH&6@>%OdiNN8J?o8VFnenMYj>)_i+|e-zs2LXq zY)MDu?S`D{jCO3x0wL))$_w^uhuzRc4B9lq@@|HUgkU?+*2I2PEqSa86P@c8mElxH z%CGN!71dGPRDX7{2*)EK%#-BRD-Tg@;ZI2If{tv znu=jvD$VYfchRn{OWC}qYp!6YkgEBUWny%E*1V0|oQ0cWxr8AUN4Er;q<21Ct8)e| z0Y$}u-v+`_BLP0tVa|5lXt$(EErOqM&0L5*a|4QjsQKemDqV>6Y4Z5)b#@e2kF&kJ z!DO{O@W!R+w1DjvbwXc~K?zYnMb{;#%VES$Z4vNMw;ln+dO*lWhB2y%cBn7PRlv|Z zd(;r1O#&o<0^by#qi6)djBHJNhApBEwF45-j({IRL@`70$K>SrvtyO6K*ru9{d4EI zcNh2jonfy_bmr!EErUa)0?C218$)l9)u5L`S7lZg@%N{P41wW>V~8F{S(+mKUD zK4U!(oz-A4xZo;4mPa!Pq!~)kW|1hB$wf|>*eRN&@8p*RY_N-Y8r&Y&qGQz#LS_Hb zxWJjUN)gnPD4D8LCV4ZZwM*t_Sa?JkMj6$yn|bi+uBrM@J`a^{-APM=v>VsnNg4Pk z0EM!CFc|#AIs{j}kY6zvzcB?2Is#|%t-_e_a;iP}28(fR>WAPXXbS*RTWrt%TK?+< zBz_bw(d}>)5FXU-xc&CFai0P{q72Pm5iIEac+nIX3@WW})R zA}6TqNO#f(+7(<6{}}3`d9Wk-rFTfJc+UGm7uIp+kSHiIm}}Vv%Nh9Tf<#8X^CjDw z8dSSdh<(60Ks=eZ{IsL2abE(8u6_9rv9o$kKPG44=7T#?2)HP0P{1WPtEpe-T6i?L zcAX#~PtRPP^k|0MkxIWX>|~n+aXd^|o}xb1<>;v>L$?}6ql(|+0Z9|oraO_##|#?X z-&uvB3xKZ9qu1^6L6qmw;w(PvEBR(SIn9gjYQNVpI7|R2-4WceoZsqUU3xm4blD(u zDt)G&63kIou~EVSvrZg$;<~6$y`V12)hFnyZjvx5wGF44@IZ3oW*71}@Ef*AJ7qu6 zkbP1n*q0!WcGQ|jHHhP3`VE5LpkE-5*-Co~pg4lI91%=|jU#|8gAqdQ1m-$GIsozo z0AB!U>MAyI5YWMJtdF>lGP)kI-|xjbLeI3IHiCek2>_u_XGlkNFp*iG1{V&2@}n~^ z;Kk0(W*IjN*j*?R6LEzTYp{L0lIhS;D6edXBM)L1F#;D-t0GnJU?+Y8K_Yn)QTYHt zX|2l>T2=n3TIXdvxFeHJ+6Ie31aWV@K!1*1+8 zs?$01DizAW>Et+yBaT72<%S#EgZ6oR+y8|xfS=LVq>%a;l?k2;P?S5#0_jVmtARBs zEskFK%xR~$kDl_mw$m=#wY&Qv!#u)8GV$>{{}?BfhqjQgBNMpe`=JIK$Yc!UMam>q zFVz=%R?@O}}EHC&-A7*Dw(Z!+SrPLF;GWQdq zM10WYjCRqLX5Ar%Kt}Zxpgw!i@)97kUB|mkbLY4D8*jowgF6Ko_L0;Pe#bA{X0TC3 zsU@G5mpVY7Qn0@waEscWsHLgmey;tC8gZ?Ecwh$Y4R5XRh7I(5QC9Jd{#fQ8v`6}> zDl(OWAmXvF)}<)%uUOXJB00?;Gh_N2)6oe0pgb8-js*RYUip^lWzmda+O_`! z05l0Ha@4zzctI2n;9rq5jDB(rAl5tD=2@rfSO5_BwayPYh>=IzYHFC>Mle{TepGUS zx+sHDIsrh+9sP(le1tpdj6efFuOIX*8m|X9WSy8%GtdLL3{ip(_+g$90E{c{oaM4! zfH?yIdTx1wnNYg`pv;Es#n?7YPR}JL_*Ti>oiUtpEGL5-4CP7fvUE;Ux-~R002v3T z6CP;$&}s3b7d^%72w)|u@S0$Dh)Cpl#=|5k)@qY5w9l(hkp zuV<5#Jv*E_OD(*T&s(L7D2roOM4LVnb>wr=seo-?k31=Fr&tJfydStf4h`<4Xdut& ze?cD!h}ZglEZLXI5-N-UivLBRsSRq5$J5*s=gRbTc+0N4zCHTD1KN|G^-S>Z>0oxP zVRuQYq$MR++}NGU6lgaee$Xex8GL*w`r5yLy}jqee`~w!wu9dL>uwSmNzOrEgdWs^ z$UVm-M$N~6gFFVnKLAN8&WqA_o{6SUiuD`qU^ zl&$q`ZyoADJ@6HNTHcEL!3g5nfO4#p%@1k7^u~Ls$DuvBakihns-_9<47kf`F2~UM zQ-C~tK(Y;TGha*aBxC^xnQdsqMqO7581e;uhVCZ+>E+|x&hXQD^B4BfzxkBH{%v}_ zxB(#gNU*Hjsdn>v+!y`Y9jp54+)W=`1W4*1K0_|R7T{LU0j(TN;Wf#CDO3iFM#%(v zP$q!S08sr~l2iH-R5_m1K$MdlXb->DV-DAY3iw8U5^YAjGcJfFG<6#Qu(!u4Oha6O zInm|XK!Z^NP69?>3x1tt1qzw@q?78k$%A?FBYj*GI7~m_2q3{9+s_RWqpL~jv~l>y z5RjrJ?@Hjw0Uq0rzMOu8?}OcaFLWWm%0wvM!~a4L@KuiT_HF9v3uKSFAowGF%ERyI z)$!fN?Z5MYXEF*fmmtt<^P(K}0v+XOp6mF&fL_qC;P@V|O^v!8+h~OEk6LgUB96e% zzt_2;PXRN>2Zb7;aokd^^~Z_|2qfh&lAjk?j$nr!WEcaZ8lr;)hRf8t-HfH>Vz4cqY5 zI-X`7p6;Y{>L|#XZ6huG?l-i&ur^Pyd~zU`2<@eB@oygS6JSPq8+2opa1AA=XfrW` zEd!&VVfhQRlXn6*3R30b*JN#A{Dy5=68GSDdOm~<1j}s7ojuEP6wUYJ09;9!e!}d6 zV_CFaSS}z_2sD-%)xKN>HY0N^Li#>f+e;U07Iwx2vbcsy1b_h=;|&w>sJQI+*SEc& z{jBz9&prTt9Uzb$mTYEVW)=D&0_w4INWE&4cA-xA`ncA<__iyl(D=ck!{1mI9y7R>#c*-jTCplI=&Al^e=6Vt8of%b;vu!M z-YCn2_kn>ydl@q$U(@V1QzL7LJ>$aKYTI|#t}pYSJSY}s>bA;Fbuv>2C^tj*qkN-| z|8F*2Q<}Om>T&d$|5ksF%dYv@;X7;A+%{+Kf_~69-*%HbVIwC*kWIaxr?Dd|_~>(kq&%J`+aleZeT44Z6Bh`C z9Sn5he&>lJfl4#br{sm4H5Ct*z55mALtuJlfh2j7auoHhs1`l@FTq{ikMHC10Mo^F z+b}?&oWOpSz|DYLG`Zo3ZxW*Jz2jH14()SCuVotMgK*7C=Cmxqo&RatHvpsm!3Y9| zaEh)UZ3y8;kS>|Zu-~!cb0DG)duGpyYdWxyzvYc6%irrPJ>P2p4V^qH<&>%r=s!7+ zERP+43P*g{37}S#l{1csxfbQK4R)UeObCX^q@QerY1pdTWS=+$hEbs;X5vBY-1TnA|Wqx_H^4P0EFc1)Mc9!%jcU6qy$j^(T1iy%fCvx1>F zwgMhU0Ep{@F`R~cnlVHbMT(t?YC4)~E7Il!97UUt3!DN@x%>S%2QUG>+A$ELkC1o! zKoH1dSWr{4MO}#zE#UxXfwcIHDd40V^dw6GHFciZR{w4Dng>M+)jFmX>sH_vG`!}p z?17M%Og>D$5FGnt9fzfYxX>hLe zImUuV{Z_7A**@gTH(3jraX3ZUdYuRr}Rh&>3jc`}wEuigOyL?%UT` zlsw^D|2{0WRyExhW!FVHr;qfR42jN@yA)qjen>t<7j@|y&=7pW{^SPS_*6_kIL*{E zDG&N^NRBERv^BNMj6(LewbUKL7tv$zTzQ6(BUet_=&_7>D`O(F*8l>YDN@ynv&t6~ z(=qL@j5`f=NwHHODD_yd8Wm#xFD-^&$9akCcd)nNhI9Hl*tz(QR`C=_;4w6mvT_%y zI{E0F@!g|h%yoWdl9#7tMgTd|cYT5*dV!~Q?b5jBcI2xyZ3>T1^^DVpo)Y!)E@q1I zrcqm*CMK=&Se9KEFGz6Ikz=SduE{hBhC_vrgVf`{-gq)O=B1Y-?vTuo(d+y;$U?cT z56HE zWI=fFpSTVcMZLJrw(w8i{Z}c56qUc&t@WF^IDe=MQ_A6)*<3lkCWn;- z;P>?}T>JDY$DX3>)S$W8AAS{m8wBI# z0UqMcEPQ~!45T0e=yWh=3rQ~of#L~%qLDc9AJe}+dr#sN01R51BDdd7%fx-9U-0CO zHc^T?vYDw3{qENRZBur|0?f%W0Rm&~MSws6!2T~@Yu1N7+KQW(wT%{R+@AdWgW3c4 z+%re+VmBn?p<;|in*LcI9`OrsdD$hGw$FX~b8X3WOWKxOEy8QsV#5bEeI&h+uG9I< zwx+)+Kd-sQnjEPP)j9cNC=B+4KBy;pQgwlRZYGe-5#A^--DBB_bqu@lf=7^ZdUy?e zSpr926|l63OekNxrqq-h@+02HzcuYd@FYECh!suOPQd3_hFqm<$Czn(XD<>q^kIuo zXVeR+(^u`U=6-rcfhkb`#j~<3ZjWcwxw|w_P}Wg4BQK*a$zH6H>aVuzKELjI9rUf! z-*1dS)G%17n<+rb@pn%}k{9w*Q?<#FG$GqCfY`|gK!kK0*}|>jy(jI&yx;LDB&N zsASCo^!vJS5?rox*<&^nTx zIKse-@io>#*cA%gb~;+0h*UwPr8W%v>{Czy9s*+Br91zM>bUPioy~VWUeJ5+rVfh_ z)|uix_3Q_U&-vr`%GIrEKa6u&;sf4#l*WeARj&jsF z+VA$pyNWx5ei!Z^(HfBDPy{qKCY{q#S7(l*(Avo>q??0&39oJU3A$1bz;s_dD-g4qT>M31r^*q*yT z|MHdT7BAIt_zl$9Hf0F;<^GCqQ8QQ$Jy~ApO!|%Z?Z4xp0P9*px1n?RPXr=HIt5BLm$dy|sM`|YZ3;#%7Ezh8S zRY;JmP>#n0W*o+xZ5sZ^r5l_whi_`f`BbVBAkW!^81!i-7>{yLkc33I$6Aw7GHE>3 zrzT8qIuTgyTTMzG>ZEyp?7#_v!alZ@%A_5cQ_1^yWQzJ-FMa#$!2>d5=#X@4{Rf$q(Ky zAUc9QkLY-@ug~=4s&q-r4{$>JIWF31;@Nf*4Bze9#q@oDzf{bUY6My?j^Y z;MLOAHz3i3WP9`QxgDoS#AUX6l3X?Os4GE<=sdsOo|G@T$fehG%1c^B3`s`kzU}Zn88)Z ziIOV<-+4)TW7`Zs2Xc*qnKO3K;MM#paLEr;f&XP0XCmEaH=tB4k)6~kc@^+XP@wj# zHrm^+r|w8>RT%+LfigewBHb#HH=;u(X$JQ-cOt@|biMNi=lWrOEQ2WC0!N%pG6(7VqWqglM_b zA9wVY|K)SMriiUEZ%(lm$s<9hJ&1azr<7mw3`vf9c_a`!gri>9>20f4wOd!NYFqBG zW81xt2JW!yuKmp+i`v|I^V<3wY|y96`lw0&ySE?U9LKuccH3?3#=fignhyLfz3Afh zo2!4-=FFSh7W5HCtan7y@gD&^xSXP0F-6nPghcd>@+$dC)>Vgxj*T8$rK>7cqOKbS z=syH*1mvUpCV+?D=so$o9d-j4q^@us305PpZYS;FaUMybyoDMnlN}2>P_<6A;m;j! zCfB^@3G~ua#uLOWB6t9RiX$TrITYHcIHDZVopN32PmWGgnN#Wqz`0&y=Q!nV2LXbwai)y6kI_i>BaVjg5vagmLS42ci;Zn^1W*qK066|17@UGXl(ba|?vkeZ z8q}7u*mn!e$}R@JKJb~~N27i+eq}Dn-mhCembJeR*OkA$>zBY!BYn|E$fiEWfQ`IM zhR~1mjXl(WZ}KVmobip+qpm<-qIdW)zb?H%Q@}$|GnsI-h9<8> z=|HDS{J(HqopGkjKpO0T34jc8oD4}5<#4~+AXV0L-ARVaz%mUc2edFGb!`nL%gDF` z*Ge*w5lLJr)L9k0>+B-%Xo;L2DUUafj6h6msB@4EAqxO>5F;3Kf*=pnMWHkqiVC7e zBpcFWvP+=hs&H!Q!eGux(&cbpJV0w~IB86;jU5-&MBXc$#3G#;RyEHgE0K#&nS(mh z*hM^{BwzBCXam=ZH-bL$kQ-^BpOPuNc&!<{V6)BIyp3a*AJshg4!dW{_E`<@elR;fJVS#W)JYLOR2NWNe&jf zqT+s?b?Q{P1mkp#qF2VlH?Nc9PFLnL+Q1_`1U9KbwVj+txxudVU)j9>@F>_!P&oc3 zAY)W$EPWWAqaN74ffutvjZUf2{-L=a_GbbU*6hR!f@d}fI~btU)U*Mh!C3ij9$zEb zW2Z0Q>Y-^%*$#N5Q?AV*F~WrtP*X2n%%$uoo(0HZIDsQ87AzYe$-k6$h*PK=2Ah3I z;0TIfAHZi$OC7+-jzOBdUHuzpH%9=-SwGKKBzU##ishsO8;7ru7q)Ld(THK_5ba7n zF_Kfop8nN(Kg1gx$@J`u0p8S)(+F;yF)DDEBZj8qO(2>A<~|JO91Nn#X^|W9HvuI# zj4;n~yi&OU;E(xcoh26@-)ZQFa#aEd=wozI8YD-Iq7empzSGw>^F0KjBGhF?lSx1o zoFwi4xGuoNMl+Gpkz^nfNj?H7Rj1}G>Cqn87)g)mnn`VN(Db>uHmGf+FCKlQ%{T&? z>DJyWIlyx2lT)xc&4=b$Ai`*Qvoi%J-ugBq($UlY>PfHt{X*qfiB~I6beR| z0;o2FZ7Pqysl==U))7I&we(tDQ+-*H^u624KqRJp)gdcTIUTJL!uSNx;juM+#+He% z2WgbMyRYB7>#i8_yQh!*^>LkEX5GGyYP~)ph<|-lkRxLPYUGTK;8JE3YXXV=MhrP)z3f53lL#x6~pdwn0}9oH^*OmW~U0-LI{Ue1x5l7kfeTHw%RVGSZ0D- zUY`OmhAefYFEmujLpf_{iB>D*TXM{uuOsg1y2@vss4e-|W@JN%8vPIPl4<&hf5$Hy zHonWhpif<|9p=>I^sng7yf@Nyot#?L@)KxXd4QU#(JmX#K1-hH9qwZ}kU`*M@E2{> z=ovvkO}`qnQI-j)gYQ!5*#@mS8Euk!p zB*M`#_$|Gfn5I0W9$k11y$blDrF6oHzO&CC*Q%1#)E5X;1@)cOYx~onnRC#X%IQ)YhvODa1 zV@)7*(XaK30I4d66{!)Jih56Lb0pF3uXr@bvtI>0BxJ?1)_f>!$~S07cSh7$`3!2p zznu@H2Gl7~LMr}K$Dj}>;3NGK6hiDMT0Srn~x>vdvNfOu&QgD);gt*7GSDFq}#c zjw$MsI*Gz^#J9n+P991t)xkUOL=W%s{G=x98vzym20fL=s=>@}a^EZu z{ZIdFF9RgEiq8Q^rLU?0Y}@Y}WU;(G&G%*ix?ZM6gvqaW*H*h;pBG}*S~B1F;mIMz znp2KZs>7=;%=G=TYHQRd_$Qw^I1u$rx8L(RMq-70^aB;Y<2Ur?gPo}Z_6!7n1iCq@ zX@D~TTCaJ7r*?)o0w(JRp-vBgXaIm7@fz?Or;^iUe3l;jf^p652nOj~y^`ZH_=1C= z;r=gpnyv#hK!)yuUonwDPJWOhc_c1xo~~&GySNwU08(!RjQSp#Bppkc&AWX?H{=Px z2QdWn*kxHC(SFFmYk$xvUjabQJOZd`>Nmk$jv@w=27ZwzdO?6gwyiF*z#j6&kSkEO z%d+%BPXSxW4#vnNOpN#wvO}^#k|9i>UDT<%m=vC6R9}>6Mr0#B88MS7q0!J#H#&3i zBXB{_VEQZ2#EgsI_LC8L;&u$T81$9#DGXCGIhe6L8>2jA0>_X@Hpr5|#3igd$spd@ zi7*oKd?$f2&@l3Fb!$M%#$+PORRN^`iQZ5N&D7eq(2?53b;&7Rk{qp4qi3pLdw#YhNj{>g0@Dgq77<3659Z`4cZWHVn2ac@D*2;3i;&mf2k@}y4ys9+Ocd}N6LVL+b0Q9lCV1b6+u z0iHjRen2xm1!k0i-Mm4zbqyKBo~I4LslXG{7kS6Il>TX1;|_!vFSvuL8)FQQB;<;j zcnnY&Q3h}22TZY~!1bSe3MSa|l&|XwIEGJwMapVkXNuz7;Uo{Kr8wqXPL0X)3&cQQ zP!U^+oHD2*JLTy8;5$)(73^oUfgA#^C<=;;yf0g13yPt8d+`K-(i`K)x?tkY_7qpS z$eXP9|9f-RAi($)E}+~q`UdiZJ!SmV1FSn&Iixbfi%h%^`wK~%hR{qG(zfjS<6|QI_T?B!c(Ij0p%{?_)l&J z0`J@r8-&A&2vP{DXh%QZ!**$Jmal8f7g&3#q~acub*vlZ6>Si)8+sJb4_}id9C8-R zU2iU-CSwoWngEctEC47wOZmAb7&4jXnC3PBln!Xb{-3TFFgNfI8KRMJRsk@L+6mP& zQV}#!P5`mjBLE~%*eUF2r$H!j|ISys(QuVky0tLPOWxo*>uCx&IE~-&FSwIGvfE_Y zb#4d%n1)nI1Qe44*M&fGsLO;B1W@gKYUzq$7@8nEWv?w^yrwIF7DoW#iM)$K27pc; zDx-iO0btY`r&2))7n2zDtrb}$=p$UR!Qz^UgusJnKvTs?mTb#`06s_Xn0m7O)LjA9 z2yTx+A$r9p+Z+L2YB6}%?pYRA$2E+|6yQ_b+EUO_n;h6I z*~hhxl#_zdmTqVInRY;gjE@8y;WJO(yg-uDU+@t?CF(iQq!(DZ|0k!3rB_Z1(+-~P zM>}Ab)5^RZ*D4OJt8x0xi+fW?I0I_5GxeKmYweuy(@X@6Mv9+*pkiKhpDsE04#_7# z^N47^avHXjZ>SzO%CL?f1RRC)`)zf|D24B zSs(Hl>QnmRH~g3WT3s%}2iMppOS-Q0th(aEJ`XTAv6b*gzwRSpFzpK+Fz-hBI1D?n zNdQ3g^PmSilbP_e1b)z!z-Bx^0o(S@M?CsoHP zjhq1$oWWN8dUU#2XsWw;CJ>Vh3)1P`4tR;)T3qpIUuAR!NlCti|vOgLCSRf0QMw$|iYRB&CJH zA8b#3_KzIB8F(-qkC1sJvcxtW+iC!7>P+~sGV-Z1I@-mwY=;DK2E9To)FoBqf4U?e zg*UOS=!hj#u;EcacwGM-9eMmgE~u7uLkC{_H-xzWsmdoGNZA8FL6r20ud-3Srm;p; zS$_0KL_fQup(9F%lR?lD9H;80ACFgqj4J0Rt`Up@==*-?7T4Ux@V7y)k248627pZQ znle`hVP9b$&_k7Yf^I4)fH`*5j62_sGtZnyJeoj1=ctE;qSdJ5c+$2GM%?4&7L;Fp znBUoG`ILU7O{RH~I*|TkJNi$>Pu_<7CVTmR<8+VV4q=@DqKe__YXb#MV%Vm-8H9?c0pGk*&l zs2=<4*yJz*FoFSDmG|r$c4CPZ#j+oV(OG~aeg4#%#HcgGl;vR+m5GRU8&*W{s`f!U zzC-WgD`W?c+SDO&gJ&GJEE`~YSAArzcZ@ngv-^MT_N_IP06%EYaiWZq@(U!>6*7Lj zUXDSfSW<9!ZC}}ibt?d?JRhyxMtKi)JN#DL@JIC1h)De_9T3D#ZDe4Fk-k9&07F#u zr(~4#;{)_GO6s7<8w2FMhgFygaI5w}v+9Z8U4LVeSP|NAK2cv4Aouzdr zrLx0KTbb41Eo8DK0=TlPrcHvrY$y7pAy12fb||s!<4$tOKHH=`06_ZWIv1&^e`2R> z>Phk^K=aBQ`$&a8b`gVZ>Y89MgrJw(zfv!F7qDa|Q}jQlfqsov7ti2PmNDIwoBH93 z4R)p(czos}5B(!|2!kh16JsODpmR^gB!3b0eHSIBN3DAqh(Jnuu{d@~*$pa4``Sk| zHHfmq8ZNt@VhJSe8Y(;fOfOO#7^p#|A#Wy`kdqg4RI~G*=P5!C`CRvV@4F9f0dypH z?uJcwm#?cUUfbxL*Eu-@xkJGs_B;cWoos>%bTATK{+VGOc}Rk%?}A6gCX(Zr@4Q=? zm1qifd82L(@?`@0Qs^*cmrmuY(Z=}jfDuvIjeeM1Dm74$luNz?k4+yb>v~iV<>mXq zn@5dEXaI?Jh8Zqnq3wB@$8lqrT1A22#pATDL9QnQDcNZ=-o=V?U`Xygx9l_GK1T5R z7rhXHk>1i~OgD5O-$6UUE$UJhcLDBF4D#HLGq~;IY3V4> z1C6a?161mQhe6K(E&aFOSqz^+uOvDC24&xLX*;j#NN(uLZHWQ5&k;!yrtY+I zO8mQB+GOCvw8g1MDadPe5(L(4)a~GVU_;1QV5q@3`9EZ1{3uHJsRT3T2~P7$A7OLpc?coALs=%Fyzq@+ z)L_a0D>L)RX8J2*(-bJZc?TR9@D921RZ!AL#DFJ9tzTn8Q6&3t(MVEztUrJkrE^!LfrARFR`eIxIa?!+hER)D%F$12r6 zev^jR_SH^bmh*1c;#INXc6%X?luN$&O@&cj2xnW%LI6WiM~@xsObE&VmP9bLF#aa*S#r6#C4aA zKEeYLQAQr)F#(jK0 z5YV;E(NU+ukiZpFADjYQ-;7kyOMh1{wmMDz@c=?_QBW4 zoxu?74R$1hd}z&SUfBU{OGoK%#S?wmyjd4MGfm|L&H!@4R=t8pWWYzr3RkAD;x&nJ z9RV3KF?I+B9S`z)+b%u2I{gt$!A_x%+=?eUYM&1fw6s&8Z9azT2mmX&@=3b>m_;X- zk}~<8L|5<@^1;QV4<$C*Uit|6RW>RJ>&wpe1CMqwrgC{j=+?5vQVsAY4)L8vbgnJ1 zf`F9=xzi{;@$9!uOQRAd>PXevetEaDm+h6BQykzr!w-K&OAi9-P{DopPVXqZ26FTP z*8>1_*36tG|5FQ$k!Wl%qzObbHZD}dAI@T_SLu`YMnGMvPb& zauLDVNT<3kfiBY!AMQhf7W>-*XFM=pZ+{O_js?z5YE%8q-Fa<_)=e8OWzPps9H9*?`5n)=bJJ zChPseUaIF&HgG$*PfqoMQO963$ZVLpg1?Wtl>^9dq)UOz^BkiZ!L&Sf7|1^I$ln0Y zq63>mKdvm4J`DgEdJ)(TS}I52=0?Ob94E4T-^pwgk46I3dsHtJ&;A>+-NB-kU$flA z@fip_^H2Kfb-2kxnKYQ7AyF1IVW7$#1b_h!Ik>=bZr}ZlFo^meYDqB}Rc`pvn-JCs zRGcZYm&j1guDAM@gk8`WW5}6?ftYy*+J|P;i`Mh6>$0=7@+)bOxNgW-93a^yiYuVU zNKvgT@A<%e2Q(=Gj}yw$+}+S$Bjnxiv(E`-JJkUWkz23uVNsSVWg3FL`InnEa6x_q5#{5$ z%q#3DQ7=H1=<^cwleO#!{i+8&5HCa#qQNHPrv^^`Pit@TY}=Ndcb)rgW~wxjC9AM3 z8Dj%d$l;)B613^jLJHe0dWN7u1dbp;mVq#|=n@ny{sg7n$D%{eSVgvI0wzo-Qz=16 zV8~Y_Yka@&8)MA1_c`~zOr6a8_S$RCIp(P6w`Q@n!)hMtW17%C`o9_zNec*C7va%i z+MX=1Q~xeP@P)4k02Zw!(_Hg#p=_gk@0eJj5KmlVv}?J(O<^k1BPY+VWk~0brSaBD zFTW??-MjiJIj--#+}VIy>cx(A);I^8de5W!lvmNtHe)}afug_N=W03$;$v&VjsH*Q#;(OLOK z)eA^WOsKr1Lni#!OTZcYaJUQ3vU&u41H!t%V%$;Bm;JjxK0d_Ku1mblt zFwW5C93nmf4vU5(vhrf;MwglabUYTP>hqHFoBsd+h*V<`F{KtZ@&XXLt^YY9;`$z} zEjjt6Nn*$bn!0ZgxcgNbJBygW(WpMWh?ewgS3wHu~dWM5;^&vnBSHz<`L zDVp>Ch6NCq*>bs6LH7x|B1LGymmNnepJ1)ZGY}vzm9_ENGmz22@riU+^Z+LMY%TfP z{l|7vpp6n+TZN85>mA`{CUSjWgF1TvOK&NMH%v63Exh@*2m2Vx>bBpYHtVimLlc_@ zKp=?CWFe71`%0~T>xtYm1Ev9#Y+##7@3sU&xvWm*x?ig}GkRv(vx3oewX4YV39O`J z14;2L_lO_kFYs$0(F_l!VwTl)t6Y37exk-a4A?KTd0!D=|Leikam)VFCZIl8}M5Weg~8VC%?c))hJG|A6G73oxWphqtbo0i3u|jUo}hhupEjK6PSd z#hBV5NN>d$H|VMwDC8GoTd}VHI3IS|Dbrn^M5b6Zk;d zzS#(10BGC7vZ*b=R<#70>Rtd~tr!%oi?5ymG;L9F|G_7CLD71{!u6j3K-nhzR0Lcy z@fsWcMz5wVS_{Y;%w^9f4@~e*Tso@MM}fEn2;Ko}8MORUJm`e5uj^Cykx0N5b0?qB~?eidRL;Fvd5y!*X>aJ>jx$ z@T(0teStZR>B{&RdJi`zN?motpP3HtMb-L2s@pKCeq;%O&>YAh%&aVt-AY+tQ1?Ci zmpZl!s+|6%mrF3s9*!#mNY{)(Je(dCo#ruMEn?PpoJM`MKNy(A7tB{3 zJ%D!J8ASnrQnMwB|G2-Hc@DFn)Bdjgedt|wzPvjrIuknR2|W|r(f9SOW?)vxiuQrS1Lrp!+3L^`kapV0N*!N8#HZZxS+)t%;8Nm8FwY&029>KD|QF4^-B9By$ zzcHIWK)8Maul>ok;xslf&{<#FwhbLOXfy)|Kt=_)@&@t6ua{PUrH{V=edUNnv!<)8JmWZy=|zhI!>df}p`)KQvzV zn8_oUwCYlyvKgMFJ=I3mu_$SS90CB8Qb{_P)Ido!0T@EDP7rzJfD)7g+K?HKuK#)< zGYOKJ9bkX>;i3EKGCTA^*A7Ei(N$mTJL`c{9tKkx83HiX-h%;)RbqTt05Kqc3%l-F z_C1p{*$y&H-VK*S-uE=<)9=hEnuqcMm2W;WK*UlQ9OXiDmN5bG+zc>X_pHPWHqmLT zq4bkM%=;yGnNm(UsbiJpxW$Lnjt=oE70b`+h6hNS$!f6vBTGzz12O0uC{=rj4z0-E zgXaR7v<2R1pGYnJ+b6AF(~ey->oOp?#gSJ4<^=v4TpK9rz6a!zS>;Mk7w?%B3%DG; zL`TR0_#v&MgLt;pt^2d6gC5`@{c){fD*ADaqP$s&hj7og6M9aMrNY2@>BZ7e~{4zRMIocau550;=+TXeYq-Hqb=j12UyVG zy6k&U#_zkH{VHub#*60wzoKU*v8NMr`id_~7RzV1)?5A)Yu6Psq!I|f5;H|FeiBbv zdB@UdAPpZh8(Ukb{n(wC>Y@;U4k|$DnbE2NMZMjWmS?8cyYz3b^iv|+axQ7Z&oa~=bPXHku@w%Gsef&s4CJOKfTv2XyWB?c>H4ap|1U?h;+U-?_R(u} z>TFu=Tt^wXuvz*y&kep+4}*z(^SSdu>MTcgn*n+#Rj#YDO#j+B2nzpO=y~$Nx@C#D0U$1!Oc3NtU=;%- zQvF@`vfQBjy8<4?;{O};xFPrL2>S3B0G5+lxR4K0VFHOdaOzKW$vV+j6a(HmhAd>auXeqnC;y0EMzyLN z{&U;*Ax_MdJ~%W}f8|erXLD-$opYpWJ_NbMy_8}5w5Cg(b z^paxiI5V1l#f|%Fp011jl@RH$bYkB8$?Re&!2H#BgC|_DK#~lE4OGrQ0x@matOF~H2u(=^qGf&ZaT?_rF=Y`0zlzS?Bjy`sij=*WHI!90sMc*f>exwkE7 z?6UlMZA*YFLR;QO+GJ*yd{-F`%{}}1I9eGlU`|FHU>Ch&-s_ME`9xN*002PR6wUgs zSBvR7bs^Lx_Urp z_r*jKq2(2UswSO#FcUvYbuC1LrqFIu?mL9U2>${txZXTQJ*jB0VEZ|~Y_A0bWiz|` zO6V=p(s_PLZe~pZKG8waSOz48QNS1s!?R5Z&$*A~kOUz~52SM7B+(RDuTD)t<*NNb=rIE0@7wG#m5XTMl7 zCPrFEq@#8>i-w%4SaN4s+43ul?0+6S!h2jwH9MKcH3NtE9(|^C*GGlPPMIkkpc*e_ z=IZ)ZIyO*D;&D{<3?Dg#|Ao)g(LDv0Ga;t5z}T(KGAF{#B>qKV9SUM(qq2-j)f{t>CMoeuU`$K=`S4`0Zy#yD za|w^i2v_sQtdXjE-=U z{u4l{87z%A=2`Ry%ocrC75zFG^=&{ST~!7F_<%{aE~y6(c|8gd26mXeg$;5PKpbYs ziB@#s0}j$n{>k&Ne^!uVGGUuIGg4IDKJXI1vI6yCeMLc<*HvG(Ma8vkgW-{-Uw>nu zsWH8DY5~$dD4)K_Xz&y#!dU|V8zlCOUzjaM)+}Hy|R+U^20NXU5bvJI7DEidL7n@Y<)kX}|XV$%Jf zr*0Auhm$xw4>>Vi_(JdUEB8^q-OQf>k>Yg8Qf<{Q;G=7@{z3QUezNR6W+w?{tOFEVHn(x)wG9RWE*+eVbhw7QWUV}W88%a# zT;f~`5ZH3@y`f8dZB>%w0kcI<_O|~kXHdCiu^s`1Xfmp8`C1RI({1nuoY=IRZ*z_|EQfUze;8=TU}jI~Sd#8)fW7P1KE#ZY^{f%q{9GTI zrOC2t(LQEuO#^ShM*~*kT;kf}gCk9J>o1@&_v5kEcKVsIYwE#df46-EpbVzB-yA-N z>DC`~IH3#3jAulddQho<(V6%I2=4w$&i*+&dzSQHCeYek03aS6dc9QZd;9e$4FIbw z0^7q2REm7xH;694Wg!CsCD^vLbZI+@d!~@$95_M zzZ~dDnnm$N10ctJfFJjB9Wcl^rvIr7N9>&7Yvn1A6Ysv68Nj$?fK1*mR>{VUCW*;Z zW$Q_s8Wa@-PM{zu53H`=phQ{dh!6FSiTvk8doItSG<3X&v7slK?F{P1_E2p*C{M=) zs_b`Gnv#eTx&ep4MJkzCgl~Vn?&qznTLQ5JIO%~EPaD15)DY<#q()DDQh8`DHQBG= zHMs>d(if~6wD`Lcp+u^Ro2LciyL@cY0MzowH%idYtG;A32(&?CD>+^UH-jk33Je+b@0UH^#c#=6RLC=a7ca4jEjl+jv8o;DgwL^W;WJl;9CIq zYIeODO62%wzqzh+zi7;?s8h7{)PTELimgf}XQzw)=Q`LU&%Q-T-Aju1uZ5H-GFRG< zA545vgTID8M~hW~T1{?vtowcX6pMJ)b6T@>{O^fen23wuY#Y+|d+iZZ`9Y#AAPwiyrMKr&)r2g74UjWQo&y z5WpYtDf^I;cJ4d*D-Q61?SrvE+pXAHMh$3K&s~SfH&AW>xCunRXDfR_n<`mH`kNUk zJdvf)D#8Zi@noyLH`Ccmb+F~~TjlL}%t>j3p9k77y$^=qHU&^N(4^k>4*;P3Yk`e` zx&alDWVqtoqsC*at$?X_ig1L8vzh z$-RSjG{(v>B+Pbwhrs)QL+OiPgAY8A>(OPEXS7ZZl0B=>v=@;b@qp3x3Hu3oALLOx z2-G|S!M3T}`jNWp0ZXvS1Ox_EnPxZ5?L}YDHBu_4fJZmxH^_Yhzmm3Q{=D=%KraH7 z;MJ!yn1JHdkIYJtup!v3>O-vVmguf-++m z9YDVITJpP_4TdzZ*tcPB_?1S?=;jwq1vn71E%U8?s9C-GI@PZ$)wjSYTRNMEfYK6B zB`O!O=*k`SKArfs_lPFu*zZ@mD7)8t00#g9s=|Z;wc{mvIhMw&dy6nWw0Sag3b2W| zD7HQJu68^fMYcLyC%m2maD{z(8C1L@kNB!G_cJ@q-PW|>A6lhY^&R?M256eH)N=&- zAtL}Q9+*|6$df!FxhzjWWAo5sk7Fbb>`n@P;a zuY**%6Xz`dq9pQ&A5yPd`X!KWT}!}8aKzMLbx!_rcMl8_O3PXP-MWi@MiHUC6xzCwWsPC%Y*0T;BfwBoadv*gBYPWB8T;_c zmLh?T)MlY3C1%w(KdqawaTdstGj5VuGH3^ct6WZK_Xt__0S~LI<_EgN_hAk<$SE=T znCH?*@1`sLb*EhG|JQ%y7U<`Y#eo9P@F}a=DXWcUuIisjS9-hN18@GrJM9_>W8_9o` zNE0~#*|?a1jS`vlZJizfaCx@uukRT$nw>bEXp{6OezqKay<&Dzu_7{TjExgxexnxI zyR{a(^U%`Kn0VUqVWC#&_M;-F?=|$>xzH`SY!ZL@n;(#3RmBa)#6RLO+#9RXiN3F! z+m|V#P?Hbt^U?b$+*(_-5uad+P#Jr=?~Yt^f4*t`47E z_xLpr14;3+XSb7K_VPCG#_Lz22r$lU-vK_$gQXZe89%Wigg^WcV4$gdWhZFR*V(E% zu^$SBwzA}eE!U9&;+wW%z-W!-_5o}-nRw_(B<2vuY^;>_Nv6swYHMeHO)Rb)_I?W0cz&+z>lFteS=i{8dJYAvW zciIkukW*d%cv)ZPbJcPZk`rhURj1dVha4qCx7Tg1JFOROC7dG6OQ7kZuFnM#00Iaf z@P#1sIl2OL;17oeJ(xF(yS&b(M`n!y(Sr-u)u(yVuZpTtD-ErbIwu5e#Kj*b6 z8Ri&N6xdn{SHs~){aXiqbVOH`s7%B1qFWo@b)o{|CrK7YN!+VHHU+*{mPTb}Ua2V(~xt>&NC!kTjfGeqyj$G^?}k2s+-@6gN0x zcF&lZl=DORt$i~s#Rms7QulaZj-Q+Ts?_^Q{c>+`+xQLf<{?gcCyDd2aeSbGbknVM zo#=?m24}Iid3L6-#;x}bkw^hgJsX$YW8ND7+J8=c^8k?C%!ySDp)shtpwj@8>~rf1 zkuk&_{y#d?t`V&eGxU(_^Qghgk&9m*_aX**Fs=G@ zEavSE5kVl>a#Vc)7~{?-mmhSQ{7L$%7f?8{%{_y`x>hcs?YnRN_5}dT zEga-fam4b)u8Nb*pMjqT8xq%Gw#ZpJgBoFT2Z5p}{ZrnM!+~h2HW$7ovCw`m>vFS) zj&u+OF=F(CO|9$apoao~G8FO#xKxSSts2pX`yhERAQO|3Is=F457`!vmqc6Nt>*z+ z4L;YQl%CB}ax(H)p9K4q%QLQl!@FvtpVpJ@Vd}``c7#a%z;=joK@NfBdpOB3sFB_(5vK1jwCw$}U#6skYDgt0( zhw=u1qTz?5l2ZZ5Oke;Jv0{CB4WRYuMAdzzUJv+twsk_Zfra^rxQeyrvXV}h9KOr_ zUAXG?<$#~zuQzX8^6}WOp-3`s{n@r2G-YciCED0eqCcp#o{~ue5?k}jKRef|RUR^r zvB=Is?uoqlwk2jTm^v+&Gy2`_L`%LEpC7Ofiwu34DV@GFMBB&cPxUI{uh_|bG$puZ zT|?<^xs1V6W}hw&4TO@}wHBxovz=?TwqM-fKn1e4%t@kC@Bqp`7o<^@QzxOX{N3a3f zanPgnWzROKeXrITqbTcHJ71qOcP=l0T#^W|c{#ZH5I?ccc+R{6X6)0mq;?npOtmco z*q=4CSNF*u4Qh1Hj?nGkKVT|$u`?oCbQH(+^PBR5QMmG70BC7L z0s{gyt5waLgQkbxa9Sjh!`Z<6XK&b5Ut>0z|m_$+^E7GL}G<@z6b0RDz94ysz zKj*}0JCcD#tO2LW%^mce0EB-x}tSti=F0;~T4f0C}m6RA)DU}6L6^SAFOMf;wsh;z4X z@Fx#}4m~iim?R(FM~UZDUv%0|r62DxyzbQ#Xmb^yd)>$~aF2KG7ty}E-6yISV8xpk zYt~KcD0;H5%uHz1pwSIl)6#CUM;tT=Z0ly99=2x* zI3fiwh9>0#fs;A$1N++pc($8hV`skNL*NOI#%FEwxM66nemdWYX0oN3jd3-Iv`NHT zc|m42M0V9JQVnDjCw!ND4cg6~{AIxJ)-|%V8afW6Z#=}xXt|Nzl1vpdmHQb;A~yF^ zssLYlJjtYL{aE`10DgfEZDTiM78L*4F_uVF{nC?tDNE=uQ0)e~NYB#0X8}`1?u;H= zC!G&yvvZ!uLD*HU8eJy^_25|L9!x}D`M?P-b~m97oC4O6-Wsk!)A^(a>g9IHn>}l% zzDK0A9bnSZ_CtKMjU_U}XOOT=*s4%Xvm#bRgid^c7&1Mm!ThAlLwqVn;4D zUwh^h^##z>cR!AZ-`N|OLmGt$;H^Qcy&^azk&j-gKYk_-dH^xaS}ATrC*vV|rMp&EXFCAJABe)yY89Lz>4!)gU{@r^XFBa+%XH|(z9k3twxU#b3fw-72bXGngNspBmpi^5JM0rNT|!B z4vDM^lJEt86a+rWB~W2QxHkclVxYf^Fz)QS4PKH&(4_;n0?JLKgkqqaotq{L$3_wz ztNPxs<*H#?5>uPOppbWbnBIU=KvIte>LP*=+p%C6|5?8sclPPnSkZgcseK`eKigCCKyd@A^q~hG z{ZyX+b_Q*q8osowCAZ1idCKf-?k?kd9sK?77C&pu5OO;(akG{ZxFW79s?YPZiGrcEEA)+SQF*%AQ% z@RYs+e&e6{>~{*@edx}9@~-Pi+hWIhKln_q8Keyo#8;d{3T(~YyQ`A(^lp!^0uX?G!>oiC-tu9-6k1pV|GRx=nVAI}`9^l^5gw|Jc#X{)D8jGW)k$0T7uD>g zYo%`kGId)R%8@nvP^Xt{*L8!F1pxa%$b08Qfk|@YFk4KA@i@j-bPR3}tv-8-7CmO$ z5wn2BI3RHL|5XUnukx(*s@!TYDUEji_I2f(vQz1^ntk(kE&w=jzhj}V!7@^(?#cWO zaEeNeSWfsEe07;6G z$}qOa_+-68Mg{u6A0R@v4MCkRvI#JLVtWsd(1^zoVDYGubDgA4I-zU$uK>HgfLRAL z3_z^9{)Lbuo@~v`avnN`cW|DfckC;SxomAcEKj!;_+X%j|E{8b?UTsmKlVRjBXJJM za?-PIcn{(LsY*(Eb&X9EJkGzX}z_s#f=tge? z5C@o9(JhzzT0kZP^X%=!J{{jHxO!86=N5YzuGjimj}mPSfX?`kt`>WHZ)wP-%?$X_ zJl%QiVqTPdxA#>k`{6<(X}STGY)`NT+jK8>)y=hdGVrMTb9!0E76(0pr37&DoNw>z zNSJ_NW+%z(WP*`RV`BG%A@e;zsezw$+~Cc5Px_QB_3IZz7R#pwv-Xd)!#19%(Vn}U zSnkzG1hb)-0h8x)EB+QkhUw_D^{2tqe>s%0fi<>?)RNodv9XQxA3soc1pp6!^b)X$ z#NjY@?cXCDV|*LS&ce*$9S9Z~46C-Drq;Uvk3%2Jxtl@D8%LAE>tA$vI$XBrC$H*3 zI^Zor8UQx%vp#!}6+OGjgZ@&I~OH9*dNc=oNN z;(z`#pk&|Qm4gdAkI|0kIFSVy1{AB6<(OqG^V>iSO%;jR8XcO^kNXdA(eC0qdW2SaCmmz9 zwC5V1@BrwOaaE5v<9?l(o7uMErw9rF#=zzYJM2N$;HKnq(rAyX0l6InP=L*N#~(AP zXPpL+OXke_gy&Xd*I9P8{Sw%%mz~A0I=u|L_=_v|X9GwKtQ71djoOofOOeUgC^))b zLzeO^?$EziV}Hxc7Rj;puVoZTKa;3xmbCf^@WG!0w6y%ZmPPTC(2IAUl8VCKVDDn? z8@9Bb&bIruQ#*FHuR9yGZ$?kV<;0s^w~1#Cm3nq_C+q2R05T1|Pf!lNUn4~6&XHRq z=`{BO$at*?rpUGr4Q`#d=lYl_y>e#S9{RD59Gmy?Dm3BBv+2KwW~95y1x_+v#!Ess zbwbY?4t=R*L{iTI5&@_2;_ySRc84+&dA9Bj^sX`9vm^_6M6Y^wsrtpc=#5+rKwY_B z3dMW-W=4^TG#UmMv_4Fi89l&<@k!4X25IN^oB#kI07*naRM0WoibrK>Szh90$NiLicD3WJ zEe-z4vjPB%isCd`snxSmN>{MQR-Fb`@)Wt?@fZ0)Fe;jWtu_HWEB(1%V2*6J9m{-h zGWSeeJl)NFjhgwfJI~CJ2LOsh5WeNnY+L&)eCuZsQJ+ZmQf${Vs7MkuKv5g%bo9#} z!xm@;0@WSxM@OSgRM;H2_@e70fdMeZQUerJ)EHZW$^Y;DT=zXX?Eys%gVvX>8z?kC z(?{CVFA;@WtUGhQT!L=ogJIYyTtpC{K~L3FHQV1hX8%pVSkbF_aQLFGJ&GG`$JmoQ z0KZk`syYWZ*#xhO)5-ln{$w@f5D1HLkcm z?cb(VMD`w3XZ%j&bbKhWdEXa^ZG9xBEkpb?CQg>g_@*wdJ{bEqM4|`PJ9=FJ(D$j6 z`)FJbwYJeG-j+}$0V|vKv<*l}zn08K-0jEIm7jfL)xO~L1{&?wME5d0W5JPe5H`8D|Qe9+qu0`-eBuhk>zd z=qRh}06Fu*%jsn+gFc~q{^AEXA${mID*=}2PX@Oa z#`tlZZXCt?0p4rajW+!17doqLTm$5UbVS#$jxsn*UMavTOC~pqR{3dta{t}8ez#@- zZ3cfPfi2{)!rM|S807U`CIA?DtGogtdSCVA7gcXMQeZV;R`RR_!Nyq}&;v6_K>rjH z`L4^N(eoe#sgZ`B2E=n_7{ws8+!m1F;HVPK7P%jl7&wJ*$q;Z7P-TycE>kXDkw79r zFk{Gb&fRel3_R1jetBH zlJ<7AxXAV`dchGJZNWR=i-={hAN5O^4VL0tc?~x2{;T#Rd)ii!?MlxXLRniZC=H6{4C(O zMdN7~C~a94qmh@!8=F#uKk2{LYZI`mwOG4++;HjDF_6S6A2UBoAu&gQVdb*C1_l?6 z-#Gp^h&Di!&&dbEq@VUT&p6@yb=g>~^Kj|TKDBc&W2t9gir6z_M}ON(tgEy{&7SF6 zJcYhWn_n7NljEfAb^AWk(;&&L5#37(7BI7Mvkwu=#QHsHLWDLjz%Q&D`^bPZDTf(T zk_0}+?f%DDVZL&GRjPOQA)|FH8a0D7pbk%1AWwOu>R03aUcUiG;2raF)q7tv-UdO; z0@7an1~^^iJ*i~+lp}Q4D}Kd*Ix&#Kp!x+4T}df!%eC%CDbc%qB49~!raI!a-l$_e z=v|4Um$Z-WodQLmJwXRF#D<9Wte*6Ed4gr)kc*iR0K_Q|-mCt+rvP?9iNDCYD7ppy z>K}5nFs9AypYLx+z8`hB{$!=AzV_%dY>0PxlfGBEX8`3n9^&d#<=GqPdXgk{0DJ5u z#LI$OH3P^Vz=_mO+H%@ft2OEmSMR~6+u!O3ut?7?^C;Ifg*-Zyuj|#<0%~Z-`}gep z$$ko!)OAM0C%MmnKWCK#=tvL|suXoyOUvA&9ar;m>GYL>zp4k6!h2>&XJ7~Ph~g5v z2k7dfjFf&|Nyc3Ff)$ZzREFqimizLesAm+azG*9$FklMMJP;m&z_04o4d`ajOJB&} zs%k)F63!ZSH?=pf5u(V3-~P=S0~iZ^EQuFiC=aJ*q_py*gwQ+(=mY#+RrQLEBDFUA zhg42~_UT+a;RJvh+~ec*nSFk?iP)T1wqziY4lLWUi0Na=S#oZRVT1dh0P4-$ww3x& zlSvYf1ne)1Iz2xB>+owgQ`Xb}E1B_YC?0-oCS0_1w?Sd?mhZHWFK4s1GNJhoH!Um8 z_1C=G4Kygb@HIJJ5${pG>khK#fgrw>aEsjjZvFUCwr!MUWm!3~Y(3OH9%WZNdzd6@ zM^^UGzAoK>zn#-dX&5Cy!Pe`%-zto5lV8$RDqOtua-R6IqyjNmNj9(x_Je!dEP#;# zwGUWYEI=DH2EYX%VU&P89{B0ERkHk}>I(2Ix#P3Zg~V!JqaWMBP8R@Cbn;?mCq-Ln zK&O^|7d?QW!J@!RkEG&lUKKMkl2K^4X^qVc40VI?Y}-|G6Ix3*?3rsCzTWKv@C0hA zZSlKa1Cx-I1k2WSU+AHv*YNztSaq z7S}R*dkSOIb&u^s26P)BR@_N$k28|j|4KTymqvX5-S7SOuRE7zKyy+kV`XEw0)mK9 zs>_>5+tezi-t*HZfYY?=&KwSa#kvwWLkGBm^^i`YFAtE&7NWy9<{m!H zp#^suv9AO$N$Ww08X>R$=r?V=8zz8II%jFV4~eL4da>=zSDGZ>!lGbkHQWw7$d$ex#Jywr;Jte3^RDz+v(4*41iSmki9e zn-ti0=GvGQxvisIi`6S}?O*lSWzqHQiHn|>eVkm!USR?K8&4pX*~_5bcg!T&gueqP z_03&j>+_U-!i!#Gqh50`BjK6nujJLmztz0;R;4-YA-0sOoHs1tyk|1`(l!(O<1di_ z6>{I>ifqiCygQZaDR-Nt*in<`;kMF4`?}Y5@D=u;b)Qh}o_yc@^bDWsE`BeffCJA8 zS@U(LXZaLMPx=Y+9W@O2^S#kp#f22fUk&i$!!@c{{ZQO5O*S9x!393mE}&*WPu&Gm zEWoF3r!U$O0R2!Ul#31IX$C*y z&#MW&-%UJNe= zp@sT$#6&mN3w65@jL5gRm!~;By+?q$&Qr2`n~ldd=z(?^;59s5OS$d(iemR=00=vz zaq$*_;Ta_WXZ_!)zG*llYWAmr2byGX^MD)CtlPaD3GK4Ts03h?%2jLtdfijnhDm>T zfa&T*i)Ssw9MCAsh|hsz3WJ+ns%yY4Gh_K1@N5-{ivY6lzxY;}Rco8c`C>=0f+HU8 zu=vR=X4nAySU;*4eaNfP+uCqO-PjaKV$WQsIL!zy=!Gwvhd#msA}jLc3mWPpOwwM>CU{GdP2YY z->6Oz8(hr zeeLj-6o-uRdlEd!+_trk@N}QZMo;)(uHF8yA3k@NXUpMKf2#vk>Uo*a-Vu5ux5qV6 zn7*Q3^=%m#gwYKf_zeJDIrd48XNyk&%#4wixV@ESL4zWX1?jgV_y(}RXg1ap6&AvoWd_yphS@u&1}IM>@SyWv3hwl0-FwJt zD4OiD07&TRRG>jvuow=1wN`+Z0!xqez4j5}bRkJrt)576D${oZSZ*+Lq$K8~tX~{) zKMh=*#?>@{6~H#jwjw}pmWK~+4#-)+%=H4m#H}W@0CWK6@P(S=txd1xI_t78E)4*H z=+^XnEgdZVE2diz59BfNOpid@@;2Cv-04cR0ZaY&@V!a^Lj5a!0$5k0dJwC&)=ATl z9qf}R+=|a|7r%@@pb7S2;^zB=ZYxHlGT{I1d+k^>D}s4z*9OMx!dxp<`UcdqH=JpCV>s$QSSLk%y)vOp~^(nBI zL929Nw3h=f;!iS;ojwr&Bu=v|oPkgGtG`+z4NlW1`}wk`m^vQA1s>z%_<}grzQGz$ znBD8s!{J%?DC-$Tfg?*BU0j6?2 z76*B!pVz&a4b=F7?)zc0?s+-c!w@$7*6;rM)$cTz5n0v`w?(RrX}ePO4$!*ru`J5~ zsj_o$5`_l4GSr#%5JvBCyAR}41Q4bXpBxAv$!LgfkdnkFU6VUv1vDhNP%RR zwkg!9I#z@EJOJSIU+T_46^sSj<{u#@L5HkK_aO_{b5rb_drf1xSwNKB`^B5%$nBN7TQ2Cw-bt9; zBMG!Qws~5YNsrcb)7rzIO)TDaPw9>FJOs2`yBX;_Er*{B8kpnGN7|H;Xxq!<$M?;H z^&5YVj^J+b(2O1TPfAJ6sT-i-?@7j+RMhm!J!Cv}mhU~wXXQnQ^J_4%53wtsTD0b2 ztb8qgG!YtLJvnFP>!+H5PkE3HHNQ`rA(|(s{bmd5o7dl2Vu_bg`tC0{qlU2a?e}YSo&ssD$p|lTHl)hWUjQ+y9=Q8M?Bplf0`$ZXsTOvz$o^bk7Ota`>&4nRJ#Dk{ zVZ^7ZYO-WALDcIKPQ(jg8y%2E(?v z?1;R_a(aU|!+p^rSa>UY@$BerFlTK^geuSC4pJe{m7-f#MYQX>O>1C-a!>JF9u|$9 z%tW`1Wjz^yCAk!Thk@s5{4n(dvg6EyJCU($6B7;4bIx`Wo2APchNV6w&GeaB&A@?x z!e+Z{(xL@uD^ns*DvoJ=^;n>##ZJJ^>D{gsyC}Jz#SG>KwD~z>D8%MT+*b*83}NIm z)0@T-$v+8WyY8a09`#}XBItQ&j6FWoWv)hzWRpO0e5(RER34wFh=lgi0YZ+(0I01O0Yd|(@|DDs_r{e^&eCpxD2z8KbRPl7N@MZ^{un7dBNz|9 z`eYeAVC|}XRRo+8Q^Gsqshz9isP`~R@l|f#q%fRFnM_WCaR7$ZPd&u|Tzke-JWHu| z+ybD`EotjibZBJHU%i5bSxz(EZ4;1^8XB%QAh75gs9jaqON}RFhiK`6J%a87g(#w# zuJT_4!>hjQRw~W!312gSzt--VHcDJjOXM4vIgqg#9V)vg*e!1cAQ{lf+fO;2+0?e| zfdhtQBbFFQdagb$rC726QZ*`L%2qB^1lOQb-)rWkH8Gb|QJW-I;?O59gEY)@p3nmx zMKXX#tYyG8pZcKV1DuF2`UW&Yd2b&C7&Uq8B{!|7Tl>)Doq!H0%iTa=gMtNuT0zxC zaU-@2zhaw1R?B6B9Y8~L{j?DsMgQtQcE-1&$NJO|r+W+%jbB95{uaH+->!d5VwmLt z=sg?Twnv`~qbCSQW_V8E(4Tp%4_z{I7x~o2dL&jHq^aXL@AZj*#_(=^*d44Gl285u zkWhdVLKj+Y4}Bvl?OT5<;4-)g_*OsCiDj)GlCV$-I&Q*=0yE%p_{W0vms#Ofq4kiY zGfUeG;5GP8AGYt(k%%wdv;&R0Zu}NU9t2yXRmJ(D1+%{Fx0y9a+)6&@s^|-uvkxbF zTJjqm%b%jc_MlKlN-VTDB_4vQ_D4OGN^ua_zKw$dqaew*S?B#Q;$pi*jCBsFj z0nwse++~Xy^y4AuHGqnreH);b5YA&8D~ludCw1D^KYbd%Pu)I1f}2Hc&Jpun{!m}- zK)Q|(xNY4Fcw;{%S-$1Mt=eXF?Z;%h`N$dDX>zFAFokIz$&tFF@=QtFXT21xSwgiV zX3p2P_@2s~Cj*2f1hJ9Vsz_e}#0j{dUCAG3S`JxM0_qm{V=v$MSILr}bz>|jkTcbvZ1V0O!ae=-$^x?51eL24?O?~TknE~v7Dr6wkVmqGX2%yywJJYcp8`-$G~Qgr=iDz4Yxi=*T8NMM_&3|m-Dh@F~K0$ z+6|C!I0gtry!syCA|6X`>zW%>(%6IjW#m4cP1^=s5@7@J zktgCy#wZw(t!&ITKo24JKEv3S{*G5&moptQ>_Z>q;B*%ITBp80KrsB9UIw$PdC%mz zazI|s5XSZFe^wjbf)KjAFAUQIGgQJReXUYQEdQR$`(UAk6yVa{^N!_ z>by^`4YWY9L-Ra!?7qzZ$YWa;C*fIH&$(vt$Ze7{xB1L|ti+qugsyPy)?0eROZ+b; zGcZc}Z-CnbuimA;txLO5{3vP3zD9nFLZSn>h`f9Y2w|{3|7cI&^%=Pwp^`B^fQEV* zCb^4|q-Cz_`B|n>M%wim+-kE@ExxdBwC?Pm$<5Ju$-iQ#TFyK0;)9lUb;M-A1}>x6 zHUVmDZpfbuw#hxxN(OxCTnu%)>^rjw3|1`E27tv&=oa33fMtMewl|&o182Mu-v&$b&O^&A{zuN0Lhc(u%iIrvTK4vefrfV$cmz{x3Bw)^`A2PNZJ8Xt*^-9 zLj09K&T^!#{krs`$*q7qbft%va!$``we17K%C}sv)L3Abj;?RDS1&OmOf?RRYyp4B znFAl*n&*3f%RDp(P}+%6RF;9Iyvl8HK%ABQSW}yxopWAk%U#ua^+}x#0OZtg_^WF} z=Hl1>+NXxAA9cz50vXe6Ljk}fTpJL^?DWa-Ag%R>(vk?`L~7|w%HT@2b$|Vx#1a}A zbc){E9pk4HqrREYv(t*OXZ}1~UpH#jk2JbzMesbaX@>Avhp9wiK&DY(oFsC9k1Ug} z0VQ&f4e}=EG;qo?c=A!dqC_GD2%;^zC`%eNdcdk#LqJIm5YUl|tFC_&SGF^+TpMNu z;KljX_HHlB7;^_yH4>u@^xco?9Uw6Sqhro2HYm*unnUjZ5xvw}(zd?oEB!W@Y1ynd z_m|m;<$~7j7-s`;X;zB#>1ox*;pI)THC~)hh-bIH6L@$Z?ZtD=9xf1=d$u)VVcU6( za)MAN6FvN7n%HuTCXu8Lg?(s-s`_i4iDDB;q_3LxscuMukDt-N{p5a9YR6FN&2?OT z?~&~GwyE@5w8UhH#=l0^Qy2%v(ofJ-Qq`oa(%YWDN!uk0TIy#OViA1@p5);|^(=El zNFB=dqs`bdy|&nAQkBl;nF(EtpK+zOD;IBowC&9GRNVD?uvPrq8b^L#eq(EA-|YAf z{Pa5jO=oL)JQp7-<~3+4mu=7Xb(hzG?@_4fw%3@3X*R3T6#m^OLMLRFP$#f#S6_XJ zSL?7{K0Gz=27&evpADdY6R5VC6v`5BTlMN=UfPW2s9$!00UvT*WmJMUH@NCU+cRSp zC^K*J1ry(Zxeu)fq)kjTpcWW%Ujh2Q2M-j^vhD)90eK~Z{T$HQ+Q!Bz$5-jXyoj^` zpqbaqUS=B`poRyJj{=Rk=SiV}G2Q2tZ;I0T`kv)eoD)4|8Ts)wGU3gzX#-F_oW&j& z4KEE#S_8HTM>-NNISyxVU*2=k695#GCU$*hrm$}35J*Q;fMtc4uCp{;JY@E;;csRD z!}Sy}U@;{#3K0 z0~|A0Qq{CAq(L5_1SiOnqelem9vjeK>WrCUu2x>&iD+q}>b9$w&825VjMT_ej%l5s z{Q#noHM6$CjPqGuX_8WRbej9l4B1Q9vLl<#!F7P2bsO0&7Oa{7^nywHTg$P7vOu(- zU)-FTIP~Cj85x|ckO_bYb!H`%9C5w|kIFE)XWoenIzh^S(DXZC10AFn?&oPT_P{2i zGqaQwyg;}Udn&lbQeBhG;EJyst2<$<| ze6^YCyWNQ103pYpd?bJ(kj$rOT~QXX%JWlPLn8!jS^2gH%;?)~dv-?O4Sd>@!^J4O z0foCL82|wEJ^(WDP%a)>;%Unp53#c*Uqo^IFi4!ta0Z*Zu5Bv2=ZF=*TN zpf!P41fZl*kamTS+ z{mThb%%8po-1c5Eu{q@|{aVuKA+oD3?-y(pN2k_%mWV^M!Hv}s^T+^_C8s#HO|5G8 zD^EChY6TA9lucrva%Z=BdFZ2rg-K|kt0CH^6J|Y=R zulRAp$QC>0!6FMGcxv?1=@btRz$?4xPHb17EDa|m*K1|S2i8yGNqmPd35aa*W7osS zECZA#BJ8X1niQ|Dy8p4s45w)HYGXG@gh$tthMPqfIo_-n#Zy0q4{wPZcr|dgF9e)1 zM3rD;@AN-1CP5LoExa$gK8%cFI%n;QrlHX~j=g*IbvNPX+Az`BAC)_in$eUu2<``f zWv?VeO)1}cZrtP@xc2`X~54m`Oz#0qmzoqG`PG+YbwL8i|;8b7dS1qP7)~DC@Q4`PdDZB=hoPE=p5sh5rmomi_ zmIm%IFnzjzyG>@{wnD1L)?EN$y!SW=VLb@YcdAc}D5-TLq~3CDa2 zl;!19WoSByd}NA3Ov)_S;rhoCJ-Ql@7!X=mt1uIaGZ{76YW7`HT;$ z(gu>2e>-xOdw*Sn;RUV+{Mk=?*3U*OfTVqnc23EH?9xrXUq3or6sU*pvM*4RO|1hf zv<+e3UWO4T20lZYny%EmpgAKS)>FS0G+ zp${B1-~zT5P%DBueQRgdplaTo^pjrnBINw}oqBF9vNU|s)XCX(_mXwi&>4VjgE5PAUyWuepJN?F1oPYy6#qLl3Bae zA#^C)4!bNf{bOg6y*R-RgPGya)KVr{x?jtsxI!oMV8Jr?yexfer-a`*3q55IUG{vA z_F#xUm;WptQX$U|s=UB2hcG-C+wai$JOD&Xy=U*L*E4St4Fk-7PkOO&RC#FK12cV2 zzg?$o-s7(n5{;=%@t~lAYsS&Gj`<6?Tk?wO0Nv4QBneL`fj|3)Z-(dQ-$1pLk^24V z&}e;zhU+rvlSi`vCDTcr&LFd=FFdd$JozfmT6wkHEZdR{=0x$l{sosdu#-@83V5HK z&GIw8bAmmGtQZdfD^j(eF6p6t$unI84xy*6-Co=9Vp~kM_Wf1gj$Os8{UEXHPe31$ z((e)!-}Y6bYw^ysDvH;yh=lI-*^XZzvp`;zL8D*tT=!DXJXP+42b^G1ZJYwWl_#3_ z1;kX0=Wr^wXn9u8<53V%fSatS<=dJCBsb@?2=uF9bUom2la;pZ11Si$S?XUK<760-1Y>8KMCpH~|AYB5Y7O zzZw$RT&}7xhksh#emCCcgP(+>I<2a|+_O{xW+FMDh#5mWli2p_Wv=V$F-zZix1n_< z04dOCoi**c7cgpe40ww*XaykJ0G5-Y(NA%m`p6ZyW;vJcQK^|rKd7Q`~OQJ)Z>B$T@YySNNdXp%0{opE0#x=hF8gUjPi> zEsFXdJ-DvS5Sh8Bp-bjYX1M86Uq??&;S;QqxIuSfvV0g?@zbbh@BP}$2EfuYbmQOV z#!rnYMAzuq32!3qY^qvTvYuR>2%S3w9It!(Ni;Fr8ME1m&ZFmK)WvU-%t#WZZD+nJ z-v*6G=rL2bA@&Cbbs~;kf^bDI$&~mb!pL^Aq10em6MpS~+t+qG^cNk*zb5~T&)IT^ z{Y*X<$Yh522tMu!wHk+#8Ix2GU{Y=UR`O_Nph)7Ksfi zY^V5T1EIDO9B!VtHfZd6&c+3h4gm%z_T!)2)PU0h<$Lo{dcv~wwtx(EJg%jlW0tyB z+f`={fS8tCE^YlXWa$$w``W@9Dj3>j!Xqc~AKSR(MGR%P(Dxz&!UaI?IvRX9XBV3U2*FQ)WBBwQ!Wx{b zt(}*dJ!F;}dBEXk-wg27#r1tHPiD5R-T@dMl;*0MYxfTRD0Fc zsDymF%HU%<0nZIEU1x|!|29ZEhnQ(b)7I}4wXNG}n%QMn*#c11-h#^b%RqYc#{h90 z6o{{+Su0B3iGEsFz9k}xJnKHnWjcLHMg{v)ox;Xe26@+|cEDDqXc7Ug^nX`fgDVko z9aY>ilWD|a=}EEDk0H<{rT6vl?0YW6myxxu9%q)Q?+0d*oOEx1o3hr5d#@PiQOo>W z<-~2|A3kA2h30#MBCEi%;liPjHY)>LXJako<9ircS~)7N@=70OKTSIy*8SZs70t$S zYd>#nn)Xy_f*IOvy>5}V17Wt|I%^+ViZwELD<3Y^X)N%) zHnC08`8&RF_{ngW_Ka(5@<2i-1B_i7Y}r1e%~*MD$Pj)s+9WvG_e6-_P(MSnFW+cW>n{U`prbw27=O&o^3;D z>9A!jnhT5u)P=U23WR#5PGHI4j@Q7LFV_{Y%PgUk={`i0ytieQ!uGx14u>NA7T9T-Z7sM%Z}VniRFjOiQ{~kompe9=-2n_sKrVpJ0+I?c}8rF3)!dD zK=2sRc=2*4AyMuhZ0ngw(lh}qNsDKJCOd!uT)kfifSSR+swTyI(D%kYz#9%4@Yb_& z*S)&d1m72*UjO+gL+5ko1^o3MLSkBFfKLvk=ui9=Pv#{{-s*c~1AMM}nmII)FzGgU z2c6Dr8ZJVMGM29v(9BTZBWU`B5KbroO3!P(O#n6?f_?$xI4(M0X-}-#R{|EL7t_d# zzOA<+i2e$+*|w2gZdC~ZUColIZQXp-hL8&IAAI@lXWxGL{5#*ygyR<1{j~b5!>=Gq zJ%+w~1-sRO7TwD~WfVnGOiM-d!9D5#N=w$FXL7auX;C(^vSd?RZb{_ZE$K`H*d{K%eMi2pKz6sk$34v%=j@z@KN^@LS))u+e9V)>>MF#V|^$=@+B zx3SRyR>kJlgQ92vP*mV}4B+Y|Iq?B-Aa9|j@czfnVXm&lbI ziXrn~DMRf8km{X$=Eok?^~-Y%Z0vE4c+-@1ELYj}kUapj`Z2gpc}~TS8)F9prbKHF zZHS-nVdl7(e`6C+Yu&FIKZI7KYB|^z>2}y>mXxWRgGS8UIe%4KO(B-N_4)b5?iGDs z`%^FPe&kR4H8lm=vOLTwVEK)fb!p$r+P==xEj-w;_G#H!vwkkCS;K-~?L1cnJ^R! zvB0S7B?svjhD68U&otM209QHv8SFz_{$1$kVLBBE=ZUK!3B?mpz_G?iR z&EUPX3#zY>hGx|RF>Yyggsr&${CA-_%Hv}tKf zXD_$YM|W_y^y-5;2d|s&=skkmc;9WSD86!3yU}Z%#9X)jCF2wRZ@2CuLe?rwAGP1& zJOAJR`||#W|Mbg`{P<74eE#{Bl*+pnPknhXJ>ZogxhX#M@nGi6h=rkJkUQyYcgRrq z#BEx(8UA*yw0!ipXZ{x-I%HZEdy>ZYPLrP=*e;gaH}@T~lQBNb>8lOz^2-xj z`*+vnI}DSI%V|8YEdP0Khw1BCdBWFFulCJv0Qare0Z`8-xc1Ec{lzN26y}D`;*S!uD2M9Z@>TQHE4e2<+FeE zKfnC(H-7Wwv#%lo`)r6R8g7VrxQ6o~UfZaoWoCXg3F7dRxk@>&=HtCIOD7hWkk z@5$EvaG-Wqv+MqT3IXqxF0D-I&WB4)S30Qn0%?p%y|=KQXB&)SO=kX#PBJSf5&?bi zpkJ911J}fW9?p@Y{%L795A*IfKTN1Pg-Z%NN_nOm0Qmdg$P(~2Rb{lCYFweTN7Hyh zW?G6h8G{)eb(O>@JJ%O5XeUxXo%F~m$H)0|4~$Q{0gYa>ci-Z?6s?>*d*u+;GlV9c zz!Ea=DHj;c>>6Tv2p4$dn*DkPfPq$;;j2E-pO$^EIyHOq$-D2o{KU`wD=%OD*?;Zj zyI=W{Q6%x`zg*2QaH2WNdyg64T8H&5dLEiu%U*`tmn6JS@DC%BZ#)~Rn#|OBTJ5-b z(rXiM@ol@@iY6r6W>$^m(a3OfS>GMa+W$5?x$XxP>tgHUlk2@ufBZ*(^zs9L<`-Um z=Fk1Y%jchd>Zj8uDm`pzjw9r)I>5o+?+&;1GZ;Md5_3lv`}=l>S1kS~d3$vEnt!>s zJC7g9#G7vSku*NO+6QEa|2^1o;^(m6s`q8ZkKC`z|2D7p(hp1asHMA`J=5cB{XA=X z4}(|2V&e7V4fj3O{9bgDj=oIWFH`qHkdJNrS`OHWY&++x#=KkZ-ssu)?WHc?3H5ui zPL0K1{eePb-TI4f{Esi+{(JxB%NJk!u`6?458+o=nSHF6IcLT-GkM@660%NKdv9N6 zG$BC3?AN?h-3#a$8wqW&>*uPY_XB!%v6^{lSrq(AnLY$#z*gIga_SdGJSG%qyLgu7 zaw6X2uY%qXRqerZGZXK!Cs1{XGGBKgHj&HP=;wsS#Pw~qj z*G2z!Z*WY}R410NF0-`jC2S?L%=k$cRmq=v;J4*8qsYh$K;u(Ov&IgZ=~H_z`>q+g zIVqf(L672B^#+JBtY-v8ufd~d3YFu+*EM_jt#ACg=elaYg6CD2Jpp|Na@AR8&5rfI z`3=K>i%IT+RdlOCE5pY1xuU6O<0Q~t3I*u3(;9$jPv6+(OxvS_CBD@a*B0>M2i7X^!xnkQ@vhj`?LS+<){C`zy9*oKl`t~eE0M3lt;Ax z%dU+?fXCbl{GL$JjL||Z_fSKQduU;^23>gD?(}GIm{N`0>EiJu_!!EfvAb{(9U#^m zOtm~zP%wM6a8gei)0zC@NvkUSpoKjMH6iQ#>QM2}LK($!h#PwvEoD3o@S{ z#_Z9O$8taPTd_mpjtfteP?oSc%B2g(?;CBCdk@jVt?So&aExDm{!r{iFtCQxVeI8wYY>=|;kFV<3ddx3byynZX-=WL+;~Oz@xBcV< zav%Q4I6Dj7rwv-xB(7ebdzK7hz|K7H!aT^e&QwAydO|(*7CBJZqdc;qxCFX-S<97>a3jA0F3+ZzT#=Bax;N2 z=e+>G>z-!wSbtu#cQX^1eS)1E+;(OP#gLe-nL_9#MMwbhmU+8o0DqkvqDq$1Sv?6< zd94#owT_EJSgmwx-ER&_lLe;gN5>~^QkNb9Ui8BKnf>vmbd&aCtY+bQBy}q8pcSO8 z0~FVOzVM_~W4FHg0@#M1dO39QV3G!bhLG3Ii~Dp3b6)nX%K%0n`q1~wc%T2l%TNEa zzw+|cpZXUK0Lv&X!~yEi0`foqD^H=!M=M+{$^YI;28(wsx=-x$Kw@~rL(?W8)kb^5 zDlV|}x)MW!Sc!_f34o)lvwCEhKoL3n=8PswCwO+8v6W)i;(HT`t#i-zFY7e`yq17# z2Jo8ARYJKTZTVaJEXJ0+hehI;T_LbA86Z4Nt8UU4t1Ml`2Cw$}$nz-0KKH%0UAl;? zLCP|9KB31RoSw;(f$J4{IzidBHp`o?NUy@=64~wp{XVvhyS&|Y{rvVa`4Z$wzs<~t z%GzJIH@VT%wyvk{%l3yCI(VMTbMSQQH}ksW=~Ksd+kROaRKIWA=k8NGMqY0V&#%YV z$Jn4<{Ltfb+cJ)we*R1siID)6zkqkSp5nBdR9=px*fBQH4YW6x~v=7gcx3!Rihna zRtW>pqJ3f9V2qsljs53PSe^8(Hp5838n1D&r#aEpw_Xy?0XiK{D?aA6Fr5!f1DY4O z{r!3kOtNNypb|nH*Aq5HVmjdD(f1kv3ce*lbevS8x00BXnCCRce zO(d@Wg{RCo7(ALkc*zOa>n7U?1B0-~y2 z-|H73G_CvDAH4j`KldvyU;C+lNdQpq@v*#*x=h$aY4`DJ5*g}ROXf;)E7{$q3z>mS zotyCjfbmw_c-6skFtj#v^v@^A?UN7s@&o`bn20jMyXJ%eDQQ!Of z6S~paL*4JQtzF3WTgtxkyn%_U^=#heA-2@aM!6OVxCLywax}z#kaybllu^^Qzu((7 z>mE|?vtz4Y@l-B^9lQf9y7V)GrI<-F}v&QEW)ZG|~;#vfN($&;9&T=DzVFEW$n zjMTAdRVL(@4Ze3hKH3LBkd>jE@4`6naGAaR*F0f+^e7RR{Tcv1@eAnOW7C$Zf!==6 zdV?L?_VmXhA0DO2H+%}QZvEO7ahS9>ojGg~(RuxW{g_x=r2lL`&ya>%0;LBI2^(oT@NS1yXO-hKNUzb0sAc;>{# zpdUxe;fw7*iXS^k`+>4yJSXi->Iw=KI#b0f91QCGD*#xY_~{?M{Om9On*xAe z)DmzuS zFahog@eO^o3mgM=-)DfI+z=*DIT<$(s*tux=i&C&ZY7;9_fAHklRbbx_>;fz^3y+e zEdhV_xCH#%WYNIVeY1Kii`*{nC%X`S#_ukB;vxr6k1Ber#p!3?N82Z+x%K;yMXvH> z#@Ot}K+<|P1Ne9T>z9{* z`Rn5~8{iqhofPIEV3E1&9zSaAbO z{TBld3Ok%ly2+smmw+LmAyWj5%9jg(S?p4xl$w4aaLvPM_D`6r+B9H0my>z9p1Jib zkpQ3-rK29)=zci}f{3D4fX_ee1{l1Sp1-&}?3w}m*lbhTTl^;pZrU=G8aujF_R1eI2XLzT9Q9ZT<+f?Jh?z zjq2bpf5+jFrLwypEHpW8xs&bLb(}|sK>p}D1X2L-XD$Hv=>-6LhC!^DZ+|pn&EQQJ zyF$+>-SjC5oeAO|_Wu!l-LMZHgU5ECJ5z6!MZH@$2hVp#Zp3f2Pa96#sYc=(`_O`6 z{AN%R#G7Ssley+m9y4*2y+$|XheRue;KuwOdfGhGS|&N-FAj1yXb0pI#SYI)K{s8! zMHhJ=+rCYAj{qLops`|ibYX3^sqVgf+JJ9w*|xLe5Ps-4a#_h0Vu#UOo`kiNiu-RP z*{7!Y@XJ{Cmaa~pYB+n-#p&x#jrK=oHLn^P;76VvMvwj)f4k}G@VBjy?Q_-F-DanY zJgD+nzR10sd%e|mr^vp((QW|vL)Q{;{T%@CH(&mbzx!)1?*afzWtzMK1PRAAD7?Pt zpe(a|8}#)rgZNc3Im{stR+#Bh5Ohp5AJ;u?yHc4~@ubV5Z>1_dV9Nqv4DbHM4d=5! z5S1AqW+t-XfM@b(YXB)cSK!eRYB1QKtNL_(a-aca0HDEPPvMyN5~zUcyKnnN&<#qq zaXYS=8QcEa03g0qj3@(ocFt1qlFk8br?YUBdrsW$kgRq)p#o6_eD?48b|tqJy#jy^ zn8@H)xEL)mq@<46o@J0~!a{TPH6T$mKZh@sNv=!bSDnlR3JjL=ua^k_*dZk=`aO}}LQDEBN7Kbaii>P&l^|2qdqR6cw;SCoq^35$be(eZv4P9*b5vwjmohjR?=*V^WO zn&GW!CkJi*@>2RkS8d?ryFZDxD<4?TJ!fWJw25D_!G7i$0bq7?vApQ!Z+XZ(+S(+i z?UyefHaKHonSbS^v+XeFj(VnI$IJLdidzc%%`=}W@%l#vR{TBFMbowUNvA7m=z%^^ zvc{zqTs=_OlXjW;K`)yC1*aqx)S}Vg&vK$ZBTK2S5V&m;mFIbOMRY{0SK5McHoOvvAe6!mL51 zV@^f}Q0Zmdnz<`|b06@y^38g=Gc$m*ZZ^P-wpxB=J=?Q?MYif^9UCCYubMGqNIC!Z z>>+}6}3i$V5{@gG9wU-~b0HBtDJ8B|?b##o@N5~}< z6FPiv@I>8*AU*EbjEAj!0=k2Rl}EFB!Wy7l_BY#FFsTv_OB zymb5^%ZF~H?X!Asl||<_R+`L{wr#do+S0^|b#gjX7Y{#XO>Y_JN!f@-^4#hhHYsCp z-gh%tWk|l4*$3ZfOOA=B-WBG;TfdKbd}fT-+jfe4jc%BdI)-+%`Iau6G#!Ye|Kd6Q zKEqb8xys>shnRe6_rCHE16_N{4tkXQRNfEh_~wrfd_JiDOn^Dk`)bE2%yLJOj(u-)!us#5A)n`D6M%%pR zrPx!Uv88*fKp90ovU`RaCZu6vj*q!227m2GWGlk}R*MGZhl1L^FVrsLsrEESQ z%G~dvwuhGESx3?L*!G#HMjv{VTFemH!}aD9ciQtL2OjBY2+z;jW?RQCkO&-M7_bYVYPevt@x=96#P?`hf6On4q( zGld@#oAT6ptnK-fNq-Mja${^gev-I<)J4_Vde|ZVnl9!c^B7SN-~Lb>oY8yLel0&E9buafKLIh8NdR7|NGbf<^=$M`P$x>8NdQ|JRInS&w7!w zX9a!gSKsSp(FT43Q#~V?>llewy@Uq9ujucSzPu;!1b|kGL0q+Cxj1|H0D8>e)zDH3 zF(3@Bv^BWPiC*>rCTN-6)80ajH=Y5^n52FImKlx%2sIOFa0oTVM*W&d0onq90er_S zT%tKXbba2C@$sBWOr=yF*0xeP^K~lm=~s;$3RI zHMlW4vvwG-4|t^6uAl3;%Stw9H;Y#@)Y!IlfO0XpGtkm1_e&r#btK5RD**71uNOgQ z3HUq&A};QR+3I*!_H;BbW6yMPlSf^u-fd{vI(w_%2S>We@MYU>PyIk!X2V_?iyqpN zB<(bA3nkp+Z?LHr^M3^Ln67aL65EnM2tV7I;Z`>2ih z<5I{Id0urq$@|z=`Et#aoinagRswp!`x1KG_St$I79Qj4uH!>NH$6X`l>I1On8+)- zxck(8*yybIYFm$aTCP3a61t~f9DbvGL$0~|V|W7mE#UVcuYDdO&A>Tx>zpT(R-dor zspO(pgYuS_p4ERP=J&Ai909M?+hKiO)FF^p0N_9R`oDiI0bc;{iz^QwCw&2ZpIl(z zlk4=XK%r&_4g3nkWzV0|X3hQuIA#fVaw%Ojb@6w9s6Bv`1q_kku=;FO008MkO@Y4ztlQ$1^F%ZN(9RST0ShzBXjC--5Cc8V z7y>BMZ}tnZ7cWcz*jPSBxp`lpsu&&%0G8eb0Qpr90HCEXc;yu@Is&Y{f2HWEq1itz z1!wl}y6f4)0)ll4`14P{{qpDk@?U%TK`#O8H89psvnvpd-X>a~4VI3;AkYM445v?K zGy}BIx{RuS9hfUA^s6f#wir<|?O(60s7v+~g{`~Xz0ODRN53daQkQiOI}yyLYu7=uY*-Ci0!X`Npm7!IKjrAl(T| zF&#agns^*gktc~lmv6Mykh^vFq^)ipG3VGw9&GcMY>6BCeXH&GIbj+QU?Oeikw;GM zJQf*Gd5_qOs+}}HqzlEm$#;JLh_>YYTTFck8{F-4fXL9bTYVW_yrxIY^<0my*+6(I zX_z!J_E|0&e|)OPfXDU=lr-66>(L7Q2t9VLZa*((w_i+-YoB|XFP`|+N^Kw0R^2}F zW!*o<9)EWOy$0qf0Q~ze|J&F9y_ZjZ?5|uSXg!EugmR*{_Wxx+p!Wjus~%nw7FZ16 zt9IGTM?ml22L|L3zu5~2!1K7>d;O}vHE>-Iz&f<52Vf)KKLQv=$XWT$XWufJ%Io8U;gW}1l(3L zph8gVa%YoVTdDnFMHbHq%3GC^M;6%SB4?WSq}6&`0I&l-{cOL;xN1c4E5_W*wFCkp`X*TA$hOY^PTzI~G? zm7E|j*W&7kq3^XV*`v+2!g9-hl)K-<>j;^raecVi!Sl@l-zqE8tNfwrtGY1fU4D1& zl3z(;Ngg@2V>#fOWyUY{YsJ~>}M;&kL+~j#CuL+=rH*}Gl z{L%7kdc#wCXsx~4@8 z>xhY~)oU|=zw`HB{@365cV9mF@qgh`-*3tea*AukSq@ zXtiq@n3=;q@vC1889=zp*@stjoE!`a^%|If8>Ir4e|67?K>%`0S<1SZ=@Z3bFu05mD`m-?-KHURY-O5|rufi?~E${VjQ{eAPd{`Pmj_La|iFw-ns z0HAZ3B!Yf0khQNQ*5e;&3D8BiL_4wi%=O?(P@`*ScYC^om7h2v-giD zGurB&)@Ct~;gQ7w0E%RRy{c`x{3=KRK=u<>JwP5ahnnT{4>)JvAHcC_RM`apuNlC9 z=CAy9odSOL9zbH5e&+O}SbO{LRRCxZhv@TXP=CZS<{2O<9+I2Z?5i^bCP}&&@Mp#L zM`F2w?FKtGOBmb!)6BNNoGK7+cexg!nn5VAjs*OLm*@T1=eC~gGxd?z!2G}i0DLq} z(?2>oQtO8-dMkgc?JH%n%^}Q}?DGw|zHds;2|TmQvoYxA39rhTS?1UE@H+LGV}4DC zZ*lfo*%5J1mC&=7uau4_KdbPzJoNs(%JXq;AF0QxU%uZ3zhCjV@5Kf?>C8jY*};eC zmKHz0?Kuu^J=T~;-pTagN%cs`D~m;j?N6QIMwBPu@B0efk4z`WP?Nm-q~o2rS`DdJ zC`V{Y|jGvJ2QC2 z?B#X3m){SblesfHc-_;0Rp@+Ona zr%7fdl}eptSLN*5XUX+jD^gie3JD$$9t;c&Nk&>+6$}g_01OP=4i*}8CH-@K5A+7- zD6QiH28Mv~&kGzZE9WcdBDjmHlqgu;G{Gt81EhtBf(RH`V?4sU5fm8MHld8Th`J~E zg&vHdx&+3@6;lsD^tuN?1sfsV3>KyRO&!&*s|c2^$WROu94m#2t12jhqzAC&9gZps zdwS^%n3?SA(iIhD`UXMzcA7|Ef3dy^cv^Qbw{R^Bfn~@1AB#eKQ2rmIQB{Ui7Wvl- zBSg@?LH%o?WY7{|SpQuS^%WCb{l6<{jQ@WZP}BU6nIbf=$}?lkFT}EBvx!pU=OE6W zBh8+|m#4Waq4l%NXt7+rTmOQq2|W5pEiCxQ9IwU5X{eI_oF`!M5r&k^@oyl?i@&O> zCWXA~g{xowWn!{-bawAOb=jcZP=j>b%RJ2RGZN$yC;lA-eLbKot%ZmB+%QXC) zGZ)s=*|~_OF%&8^2rQ3k;p#2C+{E_*?Zx)}6z8jdKGJ{oGqebf9WCxaRD$PiaPWas$wuBXro zkd2#M+@j7|O6|vVXy3qSG!Y>(r7DbwHvL! z@Ch#dZmms>yB00!W??|2#e_G^QDMIJ5aC@ZSSj{efcE?)CuMvsWyJFJ zz;{U&i*QYtlM(5h+b*~(8=ud^7KK|&izll6*|YoY!!d7t#1W}l!^&^ zJBCn+@LaxbRJ+}i7j1@8c`RnhhI=nl=(D*88ks2VTnG(^>~^4mxxx66PyY4A;{XeX zS#O}7n99t1Bex5%t4J36dg@Ia*FX4~Hh#?b!^8L}-~ad!l|yDNTKmnLA)oa+|Fh&W z@BEE#s>;7C++qOP@_gAr(%5+3Z9Bi@?QVE{fyeU(_P38Png_ba0s%h?^nx`qz z8X(Z;W+6qG<$a>@>-~_aZe(W^H;ivg8#I#Ct+CO{wUTZrOTjEN1nV4$1)q3HokQidRG@4?ii}9ox^RlPDQAzr$FSa!og%o2~4xujA>% zS1X0Ghfx&gWjhag|4IaZAj}Ac;=BpO>N9uCitmv9No9<* zSuwsnj;VC^$wSlabq*yeNWc9kSV>Gs2*GVW+WnJS{Z#>FIkkEP!HcD=bT2b6-sJa% z7srHjQKl@PzW0m7dzU3Hy3AQVV1|r9z$eBpU#?_1pv~Yqo+)>2f84^Ls3}*XGz!b{ z;DlA+$x&)}`1fA*jL_g{eq0e7&;EYl^`5@i(5strm8nzr`)}`)g=*?7uDW= zJMBgvovP~McGnlSEDl>RW@Z#y67>9(l#tl$w%wO4!BRgI72iAg>*30UMJc?Y&COiQ zbxs&Qe)~S+kUy ziGTait~gyh%h3L4ykQ|VeM2FVti@Y8`MB@TY(7>l{;6@X){L@LrT$xG?E`&NNrNt3 zN_<$tbC!#urY)4NdqRP`(0o?Q2X53|4=&`9NMVLqn4 z&&*}=-Fc zH6)Wk9NENg&r?7;liu%X!8esqs+Plv)ZfTtcLKAxh>9FeZlx9*lpJN3ig^OTt}Y;d ztcps69c41AI0k@0CJ=G!49m#SE}6eSTWk4>H$3ljyNC75ax3Gk9lhu@^J%RgaJ$f6 zzjJsQ`RAeA$iRjQ-G><)a@p>0RH4{biG{6|z>+uErU{lQ+o&dyeSNX3pwCPylZNUm zO0uVL({f4)*WP&#AVCC7Yc8bSZ!^nszCF)JzuOjRX~3#;M$TewpJz$trKxmBGU)fX z+VRQiiHxi!-QND*?&Urugp{#rlh0G(%trV#Z+f16P=c zFwdOeVXQZJQH}ZSn@P06`dc=6CKVnr@=t}{b(xtjRG}@_>OCJ{)wMzc^{}iVEaTz= zZ{NmQ=3?vip=}b%H?5v9k z4`IwaNUY9N&RsT6dzQF(zq6h*KX@17AgNME3J?sBUiSshCXfgKY*9$lb&-h-*92!} zi6)IW0vdnv*v<2FoCnHQ_`z zxYc}f3q{C7#?Vk)1+;Ib{9h-%R4}LW_`~}wKFN;pIL#p{{nK|&uW0kz?AK{WJxJ9C zb;ww|n;5v5key2MVoPz2W34sBYoG1T0FG0^#y<4gz1ECG*H0`*QwHM0ve}vJw2V4M z?YeI(27WQ|QZZyf3y8#%&lqCc-g3J5M^jm0Xyj7S{NlR0K^4pLt_bj39AFw$O_RwL z)ZUNOSkA<~@8$$VmYeAQ({DJ}y}+nNvuN|!n|lZLx#LWty(reR==j@RYVzBUu6m=t zJx%xO}if!o;z^ka*n`$8d0TxO4k{Cdrut3*$tm&2L}x>q0EYsV?1tH%`mQ z(uqw;D^M!AtUQ9CeMj^_q9(r!D&F-pz=oBTN8+d*os*WdQDug*GtUdR0iPP8-?#iLg5kEDRE6 z?%)tnAfi7sJamjb{taAM>_tbXQj}M>-4PD_qnAf&CeiSxdtQ-+@$C(&lgZvVh7xoJ zkhybYvB9#Wja5e1gegq=TCIdAY?+~x8a+C)>;XbU6|AO zWd9Kh^3k!OR0nKL9qlQE8-SDpnI8f+(}*@%%7ANfQzlPbT{M<}CIQndL!JyxGJhDx zROfQdW(XU{`k_vQ+iczURH7IPxlf*392JObn>k1csK7;Gp_dyyHU-^+%vv19x!|dh zC0yF^%CC1<=c4E<4r|8ic_uu9o5lE*?zcr?ja5T$_ehh$6<9S4ag=WHxjx~Dz?`x2 z@P}jsjvGf0Q!-TFOFYrj!0$!kJjet>3}@tk+=QKXYG~V!mqUP#hYtU7MBO4! zR=f+F3CNwv)#eO|qn*8xp-{_Pl3x3L>~)hk;-94AaXKQ_in0~h3sr^#Wwcsa)NFc; zLtpH^?~NSi{ca`fx*479EAj7}|AczDypPHF_VQv)oX}!_ndRx$kHD6=Kk(7fTW^F* z+i^_B)DIYQ>JZjp-RJXi*s11VAqwC|GTq%REJ0nN9wC>JKS6Vi4^`XbAQ2sMJGj24 z9z7o4SrF`+8{YF1_*g_>^D>ni-0{#K+D7;w-y<*}ft=l((rX5S?@jiay(u=*s29SS z)LZ2B8>#k#0ypI!r0T`>%59-fU8S@2bJK)lzX?q!&G0T)PgE((w*~Q?ng(QD#gd!u z**7Z&SbefTc*VMz^F;}5b_-E?2AsG1DOTb_`!}l%q%_h38>b>Fyas+QES2#vhh1j$ z%LTlTz;yi!O8Aur9TyoL|-OPJNfu8NOcnv;y!Asb=>E7p8Yev!G(^{>a?z<%iL8k7FoCVa_J*ae(Z*K zBUGeB0y?aom#MuEH|z!SnMrJhwxp#NQ?Cl5CH5gl3iw9+nag3Z&+z&FoXbx@&b4}z zmGYa*_DEwqL?k%uz2ozJ^5b4-O1gzA3MQ!^szPP&Ja~lz1GuAwneHr8vl%RkA4VJ> z8GJ|MN}aRmB8@u^5LIZycT)ScE9X=i68g` zW#{BCg;nh}Yd1+Q4WX1MUENuOwF%#h7kPXD`zi9HkL9a3K6ode6mIFa`v(TfZJJ0b zKVAx}%3=B|)hrsbCmk=i`b*|>iGD$ag7QJx?UN5}96ZSUk)}f%@kCuYiulxl;!(vS zyJ~EnZ&b>f!tn(BOjNtk;;NrI?T|3YR`eGg*ADBg(XcM?@bL1Ye%Y+y>b=ZXMGuhH z$(iYq2+6`v9j5amvPWSGKW=?KxraHt!curO-I;V}QxwmGV}QPHX*>qDLB}$4pwn3- z1&~4&2gD1>`BbRm4ZB}bj@+I*8LQUmHD|dKSkL%!z?r(msx*q~)RegE^%)^N+dme* zX<5*CwgivQ9M$r(I{m57c%49ud36`CUa6w0Bi#TXtMaGOYiXYKuhl>D1vB1d`ueZP z=~?ake04aLWy81jGwF_G!siUn*MUJHOnWtSVZ#VPC4+>5v&Z3bqNb#ZK22B2T>R!f zwbMHl(&|=yWLg`UG|sh+F9FUeGpC@$z5kZ)H{gL$HV1jsl&~vrjmb${?W1B^yXV)x z7gU{%prEg-+-d6c{PJ@`oQ9DxcX0_dJD;@P!jbLkuzHRtWa4J#^NTaHXf%Gt9ALF{ zC$cVgu0ez_>%#1LuNm%nvIF7dQQgD!XN6sw2_~|&+4BjoEqs@0w29u^iRD88BB$rZ z^cLHZ^gg^-7AheY`V=93+`zZ?O#8cJI5`~7&gDVevFwHeKJ3Lnu%v|Q3tnQ==uun~ zN41?el6Q`M6dZ;>HnnHoDX98k)nT~X^mKoYDZ(F;lHS@Kk{Sv5rkUzJFR;2nFd#ZD&55Ydm?EqJMq z!-Ou+CudrQ-GPg73g}%}fucdDMRG5zr|NK&Jg*hSXCi_4Y0P2%$w|zZ&0X5`OR5rm z*L8ljDj9>gfD2!i(>L)JVJ7v^l(RR;HyF;>>xMwtWyTljjtWuv}tl+mMW%{|_i64@Z8Gl@$Faa!q8_KURUvgj)4?e(Y2*6||x|vk?i*KWQv!WqUaR3^u#Q zTlop=5uZ}53{bSLEGS9$p^!o)=vn>kYcsp2qS0p{0ANm1ky+zL8)&zf(W@7~w#;Sx z4#HNzH=NlDF1l(&X~25lh>nU%yQR*N)(4AaXOPt`IoA3XQ2%__XroRbCCuiaH ze5@t4^z}!`j9jVJz%cN8?X{!o=OztzHhRhBpNj2o%x%AKKVT_v~^>F-Txlwmtl=%ZEanUZ^S`Wy2B3b*@Z!oQuq z={fcLVkl$q6qlCg-3Ord9ZY4Wzp{-g16x8iSk0t=T&HAPm5OM%j}_#&vV-U1-nsXt|g`& zUEWDv>#Ie-t8Q7@O?guoLY&?11CpEf=^t0+FGNk}R8qSd5``rTVZSU?d(w|X&vVwW z>OKOt*j)Z4o7sVR!M@&}X88Tu1D#b`{uo#AeC-LwC*qIUIY|uG)woBtarNmE#M9`| zRgP#kAik;jUzFUAVQ5@i>dC&g7tfY&ddIk%0$-VLRj342{vRY
5gLOak-gS6w$EMvO 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%0DS392BG54_~SFA>b5?V!@ zXZvUj69h^v|2oR((GB=Jzuj@;aWfH4K?1(kn}U-*tSoV?^drgV6W6l&ZIxAsaF-M5!?ezR?jS zgX{#l;Cye*;H_r650A9I%r4Vs9)}|m72YN=FAKr1fZ>bhpIb$#OIB7blhH~jb0Wpg2{tK_wowp-0=9 zx06dY;jp@rX#37pb)!3S3QPpn^UNTnFFDZfVp1bCQ9o_-a{j%ZTyTY2)xAsj_@Fdi zu2No&CDKv+UP@ERB)Qw{3>?~jn^=1!VWtiqcL&8=|5dD%byR|Bg0`%Nq;qq3$84yS zE~quRg~cEg$YXXU+RyYx2*=^{1}VMAN**j6V~OfC+tB{#Yh|x?n!uPZQ4E%KK)+t$ z6x?Zx`!VcuM&700fe|P+wiL&G3#KGFVQ6YGQ|pTLD({ac;5LdOn<2MSE?Ya&BGRH{ zLg7LOVX7F68COs#+GwRx6-7+wD<)dOD<7}fc(fP$N7JPX>D4v=)$e-qOrzbUflh_% z$LacO^jdZH_)zAm`Ew8pw|>1#LG!naHl*;KOh}`N)rs8F3JUfbrI*@SbC7PW$U7S& z>d4c>4Y8O#JP_fI*+!b!uWAbVR*m>gEyo92@rH-bLy$VOh`vkvhxjqsz6wlSr}6z7 zP;lM3smw$YmnQ2I@=e&l98KsQDOTykODp3{IB8CmwMoS~y-#Mkx4Jw*f&&!8eE-Y; zt5;jxNKcrH8*DkVJmm(AIQ$zsxVu=_PuY8G*FC#fR!bSXTCw#9{_$GyodxCXjykZ9 zZ$0EC8mB5IYtOn~d@Ha`cSD_US(sHTR9>@uiHgW5!(wMMf6Gr!1oCz*zhor+86vc0 zv?53k)#Sf>co=*Mi}WbiQr?vqf>AtrtN_~A5~XVp_ZJ(PkWTK;9-cD>I5A%N%XoZV zC`Xg}qHl{6+lR?JVqP^acu$7HbVSnUqoS|Qv2zA!Ji64x=KDqTABF}*2bHzPV| z32#=C#I<&Iv=S#ank(-!BMPqc<9k*250VIBIKz1iDq z%K@D!q5SVc*|z*Id-}=J{@-C8;T8!95L3Ekc9C(4Pyvi-$<+%H8yV7$Va{&)t3?VFvRuM{|3$kw zP+G)HOuzI%Y{b;i{BrWA^Q8!cO23Ww_O30C9!<11gK1Q0ey(Bu_{L&R$mpNOG;g4}LndpedsL{OPb{gCq=2%1Htn zK=g#}^om!Y*}vFZr*$6{U7d~xu14s&&6RN*h=9b29 z+)v_8W8jCSXc&g(qjg*_2L0D)@7OA}gkNrdFf&QD?Ozf_O|rJ(VRUEdx+v&2^EPhP z|E+k#_j-FLC#RvBw${>za!5p&q~h7zf7mULEIs|{5om*jp1DhxFU?=#wyPH04S|=c zR8UHshMzBw$61WATzRN|lNslx9oD_gFBFE^;=bqx3)t5qQGeL}5z(=e@4-o@@Qp&j zlJ3&;IbDJDpj&-Ai$#1!Cica>Ddk?}5w?7UZ8^o@Vibd*J#HyZp3FTqJIA%As7-)= z-x>6YUzR`cWt>_~9#J`YNbsoPbEr;@IW(J(w&quPzMZLz9VCJ6w_lvTB%+Gd*wF{u z*#FWvwUQst8`U&phSc&6n$t};aS^tZ;4-qrs~unA z5Z%J0q_7LEI~MGxUEy~#!Q;P?iI_g{Bd`r8VIb2&%ow~Zo;UExFjoBa_F8?-qCs+=ew*>JBzH8KG@67 zJBB`UHP*Ftx(D;IvB^xcABoysx>??{KVE=5vF9Krs(I*a|FvXv#AnSkOoWQAkdi`- zcx(0}A@+A&cdBHScNS$>6di+46<@!T9NeGwNxmsd!uWl<{;QLr!W(%f+%SeygX5%UCW%FU0)w7wq|_Ry_Yx#HEQhrSv5r6p)}k&C78o$f^p%*>6;Q-eZW zq6%KG&y%`E#B))5lnhT;6=&U5ce?!f}GZHQ=qcgK{fQeW^u1HA8SQPmC#hnRsOu>TFVE8)| z>JxVtEfA&w{seBhpdrT>OdNeIKog$KHJY==r1AO97O?G%yfpzu#QzeNQ1q8_kV(4d~JWFYT|W1jzJ-cS30 zBzG>-uX`!rz?;^0H(`hS6QBp(*fh*;Mqug?wJ5|)1GKvbUaP60{4%>BEcnoSIa)w| zkbC+c%Ucp^b#^jNzc*l@t=7#95qC?}<*CV1^v*>&8Vj$WG-~&G*W+8&Pp?yMC*xIL zzzCEw8n_BF9WmR|#Rw)3pY;Zl4*SDVqA_jm+EqF>*2#n^eIU+uP-Ho@ilS-#vFZNO{%USuxVTe!Rr(*U9YOWP&=8+agF@*b| z?9~P2E%epDYq*5hg?ZL_vbW{2%7)Hm35p$O&Sk%x-_AJy&{DzRB1H5?iwk5bcs|dv zXPwI#e$BN8yt#k8A4h68nLC93QmSSbdq8FAc4~|REc8xI4Z#pSU*lzcMUF1q)u7L! zh$#er4^7OFgEt!$3SXgeHLS;F+=MiTp)JnTRJbQiw$$n?G4J#;uVwa$4V1ieH-;J0 zw{v+<7}TgY*4NvQ)IdOmWIJ$A)S|N*$^`farr|_!>UI*i3bE%Ajll1DwffY){^9CJ%$FpoDi-ox@c3FI(>71oYXrZ|T}C61NqAZ9U& zNTozOZ^Q6Uf1DCs9t0V5{1h-l=VZFk zpbcBB7eXAoyZIoSw=Sg{ZV|0cS3dqcAQF@OtHXn(x-$d*o=#?y77Lcz0$EI()BZ#( z-}`|ORuhb{@cS)Mu0^5!ep^JeHYNtnx&>);yi)<+s0w%h?z@KIqYuiY1_Vr9o#3NH z8;^fP0DJKipPWnSylqVEVt-f4lnm87@a9Sv&KN8rwYKFpI_|FtjU5^u&PsclS6HA`3c0vd^Sjrhzx_q>ARC(5-(%W3S^~K+O}*|DGxm@RsXWwzua4f7gSU5H}vj&rnWt!sY{OPw-lh<)i-^nY%$M$_h-k%hd(V|*9qMAwZmd;8J>Bq!h#F;< zZD`TzpQxegPt-q~>woY?FE|Ho{g$Q0hz_m*?w~c(u6LGS5sPj*N{uQ!WZHFOuSFME zmxgFK9n*u@*&G>|Q6#q-tckh7Kljo5E$}y?%)AIBrwW_zef?YZ_Z5bRhZk2as;smk z%LgkyV(I#WTpyJyAKm~93)?lvRJ|8gcj0CIbVIJi1vH&s0W>eqHhOGAvzbfAz4}g! z?INqgBF&#fPhB5I>}vbI_%NU9RH0R&a`>I#TK`)7)okUUm*!(&!Lq9L;_Ti{%R9Ci z<|fEW$v&480F0aOi60i7u7E(rdL{l{S+S+)N@Ytc! z1!VmNz+alrQa8f=!$^h$Rj+bZ^!?bjb~%il3R%3GY(9ScXL0%A4Xcm1z3-aXjYqFe z00wGN48SP>;JNI$EdT(JzXLc90DL=p{V4>ei0xm!11=WcV~}1 zbo#ZRnJt0wg|LdE97k^<$7~)xyyk3RYg;S-pwT3iL;?j7^S#WR8lRN)HqADJqDHOv zr)nVoSwlKMsH8O}(f^6B3YBGnPT_x}AvfH<0F zOzhFHpD4v_j%b3`Hs%-dwp%6OS+HdDEGPD9o-J}IsOC^h&m|c7tp-;oTPirZ+)cx<__LYoRrG-~D%}33`avBTs!sz?R zXWgLfC~ejl{Ls17Lf6tLF~73sX-f-h(3zY)$MaKsz3A>JxF`$cl{G^z~YWtefIh&N2kP zeCZB**%p#oIJOM>uI1@k%7JPeB?NiypVyLU^DQpplkB z?QgZV)ZRbtYoh|@x&p0iIar~9sGqw$7v*Gfd_xld?z`)nU5Q%YCQl%eU3T3w4KonQ z(}#q-3D2GwST|-@SN5$q$i6l5w;XcmN}4CBhmS;(u=?QW1|tkj9zI&f0Mk`_LR9cI z5LTI_Xo~p3hLeCLRe5`m)Uqg}W@={kuGikH5IHmLJ<0({a#wrfQ`B0o?Sha1sQyf! zwljVFF)~ke9tXwmsF`+*Cm#nya$f#`$V9d2NN0|^%y5-?uQq38R$>Fi)*Zvo!?kw$ zJ;v_?CoQy}!nYf%Q4UGEi?Z8$7WSH>u0DB@Usl=T%&%9oK0Hp+vg^~B_l#KnBeQS= zQ7B<7s@b6|*MLH06=j5u)k&0!U++eOOeK5l(7dM>>n&e*yndHq5`lDyVO30!7P8$l zv)!BZ9AX-sG&D5qf@u{X-@gifCHX<~w1?1*6!(mZYF74Y^X?T8b7F}bK$GNzJ(_S6 z-Mr#!T)|Nz@ylOSyqQP*NM%qJ*Y!!*u*$Tuh&{nSJfL9;JG&XsmM@{(#6Z|MI!YAg z*X2eXf|W?6xsbH*8JN4uOxV|}%Xqb@*0!FW^4Xx~(-AlQazdIqVjr-T-%KQl1_m;) zi?x=zra-$-7)n7~)_&_D{V1AU!`H2O=2Ev;W|TAF6M~bTXu|VhqL2Ns8S>FY(cAZJ zZ3Eu4rD%`-Rk|Q^oS?w=DB<)Cw?4@;X?sY@(TN(D6+oTt_8g4p=;>*BWj#JVK}u2& zws_X!tinyziTF}h&m`d+ayJ=yu|-BnAK;jcRPvc;%ldAK3vKREQdy24PnR)dmwuN@ zqvytNcutP~{w`j@jPKCZb{jO?jFO4lD$eso6&uj1E&`Wt` zBPDGdhF=97T~-MbRx{$AgzHAEQmwixAu*0gIWb>bO8mOlo0y6q&ka@RYGx_d(j?)? z=E0dZ8ASgcQr?wbptUucHrN1hAC^DZ$7+Sb4a8_Gj%rv=>@cuYC-1e8nuHu}NOIkc z)ml5W;8GN|{jGRr_>8*(1XY^RyhcBn*0OO4IT z=#_C1`!OG!xxIp`gEodYEqJ}fkQG8b=GSV49W0@C-!~Qol9TGngogARkk_RE1Gc9) zOy-F$URQC9c5e+QCzBw2+6wT)i6Za4q{l|M&YAr;XrheUh|yVb;6#$}qojplpndHo zDbpoAygvDS`QqAF^4qVoJ6SH_9g6rP;z5kTU=0&DMhAG|-tgJVHP%>sDcM2%&qQ6T zX=(H(V818GxMFdFxgc2X`+&G77QT8Ox&)sQ=v}HL_+ZEDDGMmgMeM$y>%ZRYtW6mA z+2gyLTr&Gu8I_Eu^^+kK2uZNvS^c|XCuwQo?m^$V%QfcBE!- zOe-oe0Q77_kD&NZejoN{rAk)$?ix{mEW|5eR{6&J-7~TXzv8);)aIS1D9lj z1^C(HzZpF;oX^&(hzc^|=Nzw}`m2*X7Xizroa8AbB?_Q6Q^I3q0Hep1j~tVgJ7kP> zx7+f4xONBi4 00:00:01.920 - [Scott Tolinski] I wanted to share it immediately. - -00:00:01.920 --> 00:00:04.240 - I wanted to build more things in it. - -00:00:04.240 --> 00:00:05.640 - [James Q Quick] I love it. - -00:00:05.640 --> 00:00:07.080 - [Fireship] It's the only JavaScript framework - -00:00:07.080 --> 00:00:08.640 - that's actually enjoyable to use. - -00:00:08.640 --> 00:00:10.540 - [Ben McCann] Svelte introduced a new ergonomics - -00:00:10.540 --> 00:00:13.160 - to building a website that's made it more fun - -00:00:13.160 --> 00:00:15.440 - and easier than it's been in a long time. - -00:00:15.440 --> 00:00:18.720 - And the way that it's done that is by introducing - -00:00:18.720 --> 00:00:22.360 - this concept of generating reactive code at compile time. - -00:00:22.360 --> 00:00:25.560 - [Scott Tolinski] What Svelte allows us to do is to write code - -00:00:25.560 --> 00:00:29.400 - that's not only small and simple, but plain and readable. - -00:00:29.400 --> 00:00:32.760 - [Amelia Wattenberger] You're mostly just looking at basic HTML, - -00:00:32.760 --> 00:00:34.760 - JavaScript, and CSS. - -00:00:34.760 --> 00:00:37.120 - [Aliza Aufrichtig] The thing I like most about using Svelte - -00:00:37.120 --> 00:00:39.200 - is how fast you can move. - -00:00:39.200 --> 00:00:42.400 - [Moritz Stefaner] And when I discovered Svelte, it came back to this, - -00:00:42.400 --> 00:00:44.800 - oh, here's a really simple way to do things. - -00:00:44.800 --> 00:00:47.480 - [Shawn Wang] You don't actually need all this machinery - -00:00:47.480 --> 00:00:49.120 - in order to do components right. - -00:00:49.120 --> 00:00:51.640 - I looked at my React experience so far — - -00:00:51.640 --> 00:00:55.120 - I could not be anywhere as productive as I could be in Svelte. - -00:00:55.120 --> 00:00:57.520 - And that's when it started really taking it seriously. - -00:00:57.520 --> 00:00:59.800 - [Amelia Wattenberger] There's quite a bit of usage these days - -00:00:59.800 --> 00:01:02.680 - and satisfaction is still, I think, the highest - -00:01:02.680 --> 00:01:05.920 - or one of the highest for any of the larger - -00:01:05.920 --> 00:01:08.120 - or more used JavaScript frameworks. - -00:01:08.120 --> 00:01:10.040 - [Guillermo Rauch] When you write your application, - -00:01:10.040 --> 00:01:13.160 - you're making it fast by construction. - -00:01:13.160 --> 00:01:14.880 - It's almost impossible to create a slow app - -00:01:14.880 --> 00:01:17.200 - and I think Svelte has an incredible advantage here. - -00:01:17.200 --> 00:01:18.360 - People love Svelte. - diff --git a/sites/kit.svelte.dev/src/routes/home/svelte-kit-logotype.svg.svelte b/sites/kit.svelte.dev/src/routes/home/svelte-kit-logotype.svg.svelte deleted file mode 100644 index 759357aaa3bf..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/svelte-kit-logotype.svg.svelte +++ /dev/null @@ -1,46 +0,0 @@ - - - - - - diff --git a/sites/kit.svelte.dev/src/routes/home/svelte-kit-machine.webp b/sites/kit.svelte.dev/src/routes/home/svelte-kit-machine.webp deleted file mode 100644 index e8467a50df3002788202acea4dd47e1c405b6be7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 211500 zcmdpcV~;KjtnHY4Y}>YN+qP{zW82uX$F^|AmmOqNGbdFc2`(Y>S;#5~Cf37$Sn5M&&nPuEHu1ij@cx1ri0O5H3Ka-gJM+@q6QgXA;)D6eR<)hh`o%jCi z#g-Ia>|kUm{n&dR(^IdUv-;8#mLyz!QpjK6hee-T3E#0O``7#8+0&})k~rLKQ+-4$ z0m|1Gyk)b628v>dw5jK^Le1{i3f%72l}{al?K0gYSNy;xym+Om3%t|F746$@;J(wx zD-yN;DCc7rWP**9ZEm|OK9s8uonNA7y>cd$%XO)V%=mGNyw=oGRmqxf)zmmS(oeP3 z*43BkBT4aQCB5l7E1XHC)U<8jJRL#G+&s!jlSvIC&X~H?%?wga7kwn?ftGO6YXwR9 z(seb8snvkz96!;>qMl}iHr(TQ#nGQ|{$sXZN#Z0L?=nnm!4r^9C`u|~*P^#Lk&kLR z1CI$^yyw}hkfvUhR&|kHSz02$jcB4fH9H!nCR>y?Z%XpAN@#)woDV0)WKxn*yu*Y^ zaW6V9Z0NKhk&Qpa*xLQ8opUc?PHt)$tnQRX=HjYp=m`!X)v+ZN*VYej(5NVHn)MJ( za##CXUCh=5YXV6K)c`V4;nx!+x&`CHZ7+V6`FBiiJPldzL`JZIs0DtH6beXHggIH# zg*=mmtZHKW74dwAUx&h82zhvXD0{>V0P2Y1=3qycp1~r8UGp#8K*)w}W38TUi&cN> z@V2TwRuqF{TYJSHxDSsMI$+B|=PT2H-QUo~QmO%awFN9_80192cv7>~Z(2iCw(sMY zEI>5JKP5_1TJ0Zz5D|%L_P=^LQxGFY5C$|^$!r4)1`rdIupq7HVgX5IW%|;Ue<2Gc z)L3&AUx)z7dz8YxA|f+sApvclyK6}sBLctOMq;^)(>oJK$cJipEtIE@9jmUqjZGYa; zNhOgNw9wD;?6|>K6L62|hWd#W;5;Ebs{U(IHHz`@~Z=eB? z`gk16p-vL1OcLoP^L@L)%Exc58!!|J@qK%@LL+HGR{1=MVdj4o(jHoIGI z{)Bzc@^Gl=Oe(q}Ep3zwMKE<>&3QxqgKv|2n-L8G+i>4(F-j4iW0pJ!Cge2bDLj2k zBOOm79dA)>I(_&Rzy(np5v@XEd&Eb=CzNXVFL|_or_LN1;w8<|)zOvQ;>V`42n7GE zx*Q1n9R9CC@9$TsQ<*=gzGJRJZEsP-Et2+atCL?YjqS)>3f)4LcQoR^7+XHNr5`47p?7CHb z2`MhMgF17U`9Az40eCASbYERz5)SOZKXx`5hoay@ljOAodKa~vpp>AIkCwk0FLN+R zxwxo8sAX6jd*Y^#nyY0+E_Uuz!@(-kK0-sltJH*m%z%-YLv|^5a80CvB~$^o%?B%X zQ(dT)W+qnlWC*aAylxEV&O8hvPN;r^V|C_GHepNvnR&$HSl4@k8My>bVm8L~k=K1A z<=3Y4Y>l#O}PwKBpSX~2@M0$LNkoG;zw{N|MRE@ z6bhUmV9$TXYmXRzmcb{4famIV&v^fb2|R*vd`3EwfY(vak@bRCU?i0&*!ad;2G_vb zRkduj*7)q0S{u}TIHIu!Um9EgGhvmyghkCaIzqt&#<@+oJz`ArZS0Go?WAflz_K{RK5()glHzelD5Eui{g-MedAkwxp2!`N|Ti6Qd*WE1V z``kp1ER_T;p^_!1A71i9_>(UpAuB!JQ_w*mf%Xvt?Gjj{d$spKZ9zUZfQTZsMDUs$ zb1RRWr^aT1FI-!uZw z^pHrWYnovEq3MSS4KfqQM5@3`fE%JMTqaeaflBRBX9oij$7K2tPQ9*6F#QKlL1&Yj zBw7Tx;y152GHDm z9gy_P+6hz=ss)q7mdX0aC4-iT(%X0Z_w|m5ma&CG7hYeg9Z(SmQKg9Gg%W_+UiRaBpg<6Kwm;3JOW}YNwC<_Fpf@gdp*^XI-SB8iR+wj&4`E+M$xCN2y5L!FxpA9 z3y{L~nncT}=o*F@z4GSPQA`{PrDK7eaywU>;_$~1elgQ>a3#R`!ke-@SQ)>KQD+U4 z8ibd!5c#nc&W5z!d~JTQql~!^B#8I2B8{Al_rOM!6Ny0N=`p#+(s=rw7A8(27TGH1 zjGr3>`kZ#eLOd-ej?&@;<%~)4MX`A1z0Zd_LKtE(--f_J%VQ>VvcUBYLS@L)gnE(3 z9i$Qu6&(DeWn?BtE-U=ZnfQrB_6kK0zCW(bjcJ3;1jb5yO!48Zqmn@n--7#u?(4fU z8@FQkRJXMU;z+KO%B>Do;VXaSA{l*g>b)BmKfzF1NcjqWe(~fu0SYD`lH<@!v%?@3 ziRbSaVmsgS#%+%^K6a54gkrD%WJZ*?IGIAP`z7&e0BWc_y%m)C{x5FzBJzmkOPA|@ z5|0-e3PmgG)5EPCcE zasi}=w69suG-;;Z7TktRDiJc(g;a3f@u`T2Bk%v5fRSaJ;9YTGfQmCE;WeiO93Sbz zQ&#{#=es{|wc&h4M(OnwhmCUkh%`JaEhCNR{ek)U`}bXnX8VP_!?m$#@$XMZnlapM zJfll8n`oj~>~YFI_MeCFC{v1~zt5X?Dt}Z~!?aw*3I|KO->%-#gwj}04hsiGL`FNm zZ!Fv8_=>~>3QgXi;ZB_N#7p^^uBuIF;^Led`LkN0m0%S}Xd#-gyPi2VK@j0hU*K4V zCwr?#rYew-BGDYqBWO%Oz@EV(2qgX<*L@eSuRpC3oPYxbtkeMWsS|7mRxN=&}}8qRQS)t4RZHh;9Q+k*DzEJD%v zQWR%4n=JLF&V=Gkrza*4u5Y&AX=vEeHalVcJ6le)l4LtJ26IwrtuA7#CHo08do!fv z99U67FAR>1sxTj(Vy5c&&X?ir#&y2i-0MElI82Vj?)224+#KG1sxtML#7y8_RuDKvYb8@?%g)2uZ+&ih)v zl1Izd#B|K~LG7LtoAhv#>7jssFY;$3m_z*ai$cVgG1SAU?Z|!`RyB(>7NnnX*ZsSR-TUy-piZ|Q*rqIg3qvwXU8jY+ zh@Z=cUAH~;enCism+nDzn(%~GJ5Gm#W7XhuQnWsmX06kd3*y{ceP}CD@-?eJF?p|} z@eyM&3)18o!D(cwz=rKBe3vgV+S7U-oZ;LxVSwrN8s4_c;QkBUI7_EC^PHyISdE_P zvdWp7vba{p8sVCX`1U5ey0#kNz-v(LfypAN2q3O9=3t^8#ecP!3Emv-W3X3~^!|d! zBkR{;0_RRRNZbUt)H*#-Ki9;A3y`XB`m4-H+nu(%-aWUMPG2!ph?o!A-chjd8kpw0|PvQsng z@ro6akYnY%GQ@J3b?;0(V!JM~s6Ga#Vo7eDo~Z3*E|xm;5J$Kgk3)urPUfDUCwoAh zg{*e3UB#0>$!CGFQ3yan5W70#uxErFp=IZoo5-`#(Z6dNNe~2!#0suOwz;Iu%Yq+X z^4McgQP)-AnI&VK(JD2Uodl9SeXXH}M86!yl07F;4)KGJbWcGj+ut_k|0^H1?QX-m z`>@Cu8F4qE3mD{1Lo!VJXH(KaI?Tv?09&s~vBvJ`7rH0zxO8a7Pvsl%UuIj-U~gBC=XLRo>6JiilQI7mr3ZsiswH(>DU9~l}Vl}f}g7Hd@ zBCG>o z2y-AVSpe%%TY!3n2v#U-LX2wH)7&=t@UYFF)U`w$3ECZ+FsY2LgD-cL6gD>65R=Lz zNgXv(f|&D+r(n+Mbo!b;0N&jDGyx!Sq{C#F)Zf=6SAP(yoeYJO@_mw07u9)hI?i9gzB`1{bRpuLv6VPjNd&@ z{HZ|zN1lt`V8l;O(s6LWlD?AGS%rSbm&zzOK+9^tx`DLib5I<`OV<#d>-XK+g|cTp z@6fujJ@4AGG2S7UY4=9Ss@u0k8ka$V>mL#!$^rr=n8j%QN+CE`D?s3$((z?0f=2zg zDI}3uichQt)uOMgA7MK}@A+C1qWXTer<4$xhYk?#&CYepba}Z+?E)lCR{1KJ*&Wq!_5WhpuD%* zyCa5;yl#&mNziT)W9O*`+!0#Zl%R0N z&Zc4HPn~Mn7?tS;RAzY_8}lqXY5xVmK1$qAs3q-T<4Wh@+PdiJC%pgwJXuhcp4Zytx9&RG-?3mVcmR#4V?Ie}1lRNboJ`fVv25|JxtoUo{2yoQXOvyw9=UKkKEb77_g{9(@q2+K=qybsP$1(iS(~AM+mH?Fb-s4Q#h`;?}9?F-0{4^2Hp|puPBKvnTkIwr5pliN*8jK ziIzDt0EdM@UVpVfwo~auV8Va#)pB5ViAHd2uqb5tYjYypTkX@vOFi#vR}3dSuykSg z7eFP!{E6=4le0tSqKeVENuX{Qd``q%rb@sXKE8j(_r&4{3S>|b{Z{>YRrc(BSz^KR zK0bFz@>&p-(5gC`A{AcL)kZ_pYn23p(JuVmrO^#E#m9mmC164yom#gA*tyFNNJbHk zQ>ZlnBf`r_07uTLp?fycZ8!qtD}KxfKxt|O_ZtU5^Fxdv7@e4WkiD7w3k%!?v^n+`WT#dJJ9y{maq z?N4QnawW(Wo*+0ds*!31E`G?cLo}ciX(Bm}ejV68>5~4w$~YB{t9JK~aA>^zy3gAL zJzuDPEYTfH;H9Mya&ewj?`vw$aYUetiscsJDFxZZbpMW}bIRnifhJt>YUMMo3?2L` zsN+OX)(u_a9M(>A|3%J+!Dd4Cxos$%_?fSmuxEg{9${;N1;86eyKYPBk-e2)PS$)p zHcw@P()%pd{&+ohbPLvUGpKB+pry)RJX}^JjuY`t770?26!VCv+ENAA8xJ3d(P%99 zN5JZNQIxsr3DUk-w-yF@VEsd88TGU8KIg4FH0Iq`mD@PA*H2y*YTw7276xDa{o?o= z;h6Y7a(41q>zgr_78okiyy|$&bsf24u9}5CXVK}ARiPI7XB`;=c9^DOQ@v($E<1aT zsmhp*pSW7eJTKG?S&k?PYM9A@ya6V1tQ{+!g1Dz!5TqX;sqwW02n*|G<*fi_P(j3+ z0Ld@4y;8$Roae%$S62U_rqNiP>>RcR*>l#oya1SuD63{$b+VvQVK#FztKOou;XXa- z!}hr)NP_ds;V^lLgjX$s`K< zMDej&Kwmo!f{hnLvEoim=|WUgO}*E2@NNDd!mq`wBb7Ra71Ur3?qC@wkCOn&ki)VF z#Jkl8$r)_Dorp$bZK8FM%*z8Acu|BcnTCysF_0}Ublp;;J25F)s6^2-vz~&z&spX^ zvY&#`GHr&(3|{xCm)3WjCs(L1TRf5Iu*5q$uApG2QMD!JK9`JiTu`20Qi(Udzu_lK zGBA48tY=mq1vL*9rL5CXu1uxwFvh%+n0|Q?Dw4W#;@K&tf(a6pRhS=j>8oAm<-Wel z{y&SOkP4TVo4u-DNsWH(--cnvHrH=lf^rNcF13O_5T_UCFR&a~(x@KT(1Eqy!y6yK z&$G4%q8k8tkYaiw-mmBxaQVk0MJf4o?+lz5L+*Z2yK$KU0T5;Y=+N>cZ4EgVlm7@A zBq^yApzTih`e7!AV=QHxVSo^yRh z$8;v5#s0=N2X_L)p=bSy!6*+tcF;I`HNQvUm`1zy`vcAMz>BB7n=e<+VxxPIeaRtc zptUdWk>t7H$ZVsOWo6(jk~h zZ0y>Qo&~yGTcZM{-e4+6L{#5jOb%tSJ-UjDrqs#A;`7Lm3f)t4tYPTA?%Pt%m2JG& ze@idn-BVl?jxsJ^FTYK;JE2@qFVcHR4di%v8aNl+KRVnyTmM1O`U!D`QA$%>0jk|;JeKll$l19+7mc*zHw^=1AJ0*BQBOW6tL1t?Q zSyybc0#V;**iqAR%haJCgMdAkP=zr*Rz+Se;bA3SZugEi={dLgO-o zo@@9cE-J4ISvrFP>LvJtGl?#NY(L$H^+8N&Y^H-^ys3%O*P_upLZ+T?6FY6QKCR_i z8wq|i_d71+J{6HEvQAq`ewlLhnsmc`+CNHRlj=5u`!eJ5<l4V?=f;?x-P=^GAE4~lfl|%|?0q~vnZKTd5EyZyh z0`1eb`XM=;9;-cBDJpDMhU!+Zx#TSh!&c%o)#=dxGt!Kz0UK4PYnccp@WJa z6$t{rrd7B?s&~><4GsisWkd0~7tG3%uRZvC@SMUv5P1S`M^%^Bwb*76hjS3Y1xdh* zM6EnQ*$#`!ymn(&0}v&l5w%C5gWJI!`x4w7xn5k|T4T-1#(CD_TU%IXVj z_#6`rm3=mRT7pXrs_@_ajF;p_@c>gp)w3ORj?Ln(1syz#NYr)rq*^>GftwZF*}^)k zGrf!Cv6bnLcVGG4g+(`H?MkmMK2Stx(a?B57=PDEeEaFUfi^hlMIoy$m0Hul z_`rTFxN3f7^R|o??U+1&8c%}QPLk74C`S`)nvWBwtlT~b7C7p`xe7p*7jkHnFw0E8 z%i~me8GI&X&xR@w3M=Yh{={cLOTWib3N)>V3XsXrH2@sePDd98eCw`7s2(!RB@)kv zEn6FV@I*45oJw43V!oNs|6*SfDVg0`H@c-f8DFVH>OUk&&p5;Zm>@couwHab1hOmj zfK1^Vx~?Gp+VZiJStJ}l774AVKE8lI^U-xz$Rs9mGt$_MD^vt}XKzIh>3a6;l5KHb z$f{HESesYSV=chlmCZw2ss83+aD*cS8>r#cr;f;C{@4QK%7_MGz;O8*odL86J%PmZ zlgoVX6N*hBq;>KNwK_v-}sMEo_bC3TR1f>Uo9kn?VzCWiw< z6j~rYEuwGTYIBL)lZ(Tpj~si-9$QM&PzO-pe@t(`%VmsP`s$YgqoS?O7r{X_QBlrK zt={IQ_fL(I4?6n~T-rl=0vs)u{1Qa)(22Ctg~iePi#Vhek%&+|tdS^P_ulIfOLruI zFklMMNx1IT2~u4jLkUy5p|i6U6fH1{xYP)6$yBD-f-_4;+f@W9+vo_>-MRGTP#f*X zy^&y`uZuu$<$78`usdWE6uVx!J_$NZW48xjDt#}HMhKC`W*CODK4OP(1|12i4HW-g z0?#^SC|CS}IlIRQCBn6_{G|xvP3*cMssj_n%&FcE9IF}$hoy`Z{u=GfrCN?>#7Bf_ zG7g~NArI3q*g`X%haIa>?7h>58Wg!Syt+TAd2r5g zta!h}y>&l`gie)#fI2pND9yzKrq$|52(DG!8yOEfFQ?PqElM3@e6g-j`DOifsh!5S zBQbK3EKIM{(J4ejpH9o+HK4-qC50h2-z_`qic5X8dGfsN4-Wrik;V)JQnqXK$#bvM zU*bEY#~Ol>{!It$*(m!uLZ}m+wTp0;GcmcGaIsk4z1lkek%8N4#AoE$ecu!e(y0N1 zas(&ZG`j{O%-!T!VeTd4aSZg??RnE41zGros!(zKMm1{3^_k74$4nOr>Is>a$vio!-r{@$w9&A zM0#ON1VD@c03Vjy56^hfS=3Gsd%M32Ca+CuM;sn7TA%*E8gRXIK)RshtJ2t)&Oj=@{OKReTOhj zKr)fav6TO}5P}-^rDES&y#SHlvE+nug9T^fE$@YgP^<~*oHfH20Bu0_0U=VSih0YRvaRYHP8U#KqsX&z{b z^q1#rPd8+oE5YGzJS#(1SJECKFburZz&UY)WYq+?ueQ(>E^+hG0YVWh75ijF1+WTv zY=%%um%!Q05C1IcnhR+FG?t983+x6*MSX-obFWZEl-PeALV{pOT(J#1c|r$HqtFG~z(OYjze|arSg&MV# zk)3|BV9(ODJ^E2-j zj=*Y&;U;rX9*y;4Hh4d2+8hpjH*evU$gZwqPMO6pLGAfD?76e|e;C>GHwzl`$2?i) zn9m*srmt^~Zv=T631w0!u}VmZ?sXhqj-P&;KGiY=cJwvL)ZtYVQH+m}fR5X~8ay8O z(;%EMRB@2HJmpx|bri8FZ7vZ4(z33}y4w78C@vH!t`t5E;{p@wR_ltowk{5Xhp7w! z{`NYHh?K7q8MH>1cl+hN%B70QS-r%RpC%bAzhMuStKA~Eg!mH{iWhF%uN9MC{u419 z4O`tD7*~-=1t0HQ(B9wH_s$hId>9XxeZukLwekRU3c9?)PlC4Vc_j%fR2T~(6h~$J zxU^`i8e79$OwLqZsa`wPKcX|N#+sGgbCc?r+=zJK$TC@@uZl@5CgK&d-;NishHngN zK=~#4^;og^wEWi>i`c9Pr9idyq)Ps0GH&HrbhSSR6lsh~0sX6dieZJBmKP~9^x8-f z;Nz@r_VRf|{*G@y_Q(w|?$AW#F`=FI`HWOJR{c4>-ycfx{Nnp?W69XPu@W3Pbpmb^ zSl{(}`IRk!hvNYiVUqF*tCBW#eQw@@j4DxFCkwwIn{s(E${x+QkAU$T7LyVS=_m< zd7rhnWFj<8ODEtfeBY2taDG2KMvH1X?e$y54g|JzO^W&WRCx{b2U;wLovktl^+4UZ z{RSLlYssyHWB_W$J!lRhAYf-1qvsgy?*VY%oujnmcZ2n3hF_1VaoiufnOoU*FhW5(GZUWESz+uPnMcW z6r(KtCJ4%W*sy?y)UsUZG`nQ8wBPhqe-ClTaHyIxv3?k}?#t=na{9~hH zG#bgioJ?p4B$Btd5dj1Xu5)1Ug#9~p3$JNxwypsi-TibnRIN%#6g@+#KJ8%d!pt$s?^EChxC&g zi%rVIM&fycfkjVfop8UEZQ21tFFN}XK8-@X2UBm8SQu9g3AKf&4=jqr9V&Q$?+y>9 z-+2(jku7gbgzMXXZQm|LL}M)TR00bZICA=ZC9+z} z&(4j6nk(5*QPEOf-dw-m%co*WZ0_g$>*-|8ka`fsi;z$4K%?kH?}h&Poj_RGr8o49 z!kdLoLLA5dPLXDPl9(UTV9>3hy(_NE1I+<){1y@o6kaldlkID}Xu}}>w61w$9It~^ zA=McUjai;(%;9&HJM#u+nR?s4sf7W3H@mG|L~8IboV&|C=XNIO@!NNo!RIBTCHA0V z@OAz@h|fZLu~!(Tizc&OhQo>Mpr;YbX-)T%;(+<&SHx~{3^wse%-?_&awxoS|0h8yF4YIhhwy>fYc@xEw!F!ob(;O>3Zp-~Euf z+_I2;=(nr|L8A=K!`WtwI%yO|e32$dmkKfvx|uz-`6~ zF8(Sar3^d_>42N}4s50oFCI+5u@Pva7!;S?v9)!-?xEMW`U6 zAWRntt))mCW}4Yf8)}X&1SpQcz~_efSVt>dxm1zwD|+zi>h>k<=}(~(_Usw&8@E-sNJVQZ=<3}vLmXiO{BmW$B zxRuGhe8d1SoG@GZKWA6h$^$#hWBetpc#50uD;-5l@RCkx%IX~$ezmCsAzRzg>D2qR z-~laIRaR!7;3wXA5_!T+Tl87lbvN%0e$!!e*HdrVsjS6UU-6B7d?uQUMuwcb zDl=p<4Djk6&tKJ1>`DNrNE}O29%NbwxDw~@Ot>#5@J{sxagMykGPFRDpRZo}o~A)1 z{=0h})Xap$X!v{bQr-mYtqQgD-lN#2RV@$JOyyqjZ7WA@C}tB7eLHHx%($A{?jpXy zKY>*7#iCcItBwwckuR}^r|mB&4sg;8{1#G6ckB*#Ivc1E?MzTj9?}929lFm}>D9H$ zVJjMhF#?&OC8je`j4{^!i^v6!b934awau+$N4#Jo6Lg|oo~#!{_gxOt;ExMQ_#^nX z{17319L+A-?Vhgs5RllF9CqdDGgNd%(r+ORWKa?32wPfd?kjp;`XuM$aN}dTcPLvC z_lUqj&uC8nt?;a=Uv3xhgG0Rt51iX<@Tp0lp}T4D+;1&@;)LN_YIlrORysG}fsdes z{`J^F8eCT$-7Y;R9dOPSu5|WfS4gZgF9`4o@v=*{?RN`a9eFXjj*{5*7Lr`)!QSYY z&<#cAdv2Wvn9X#z9YN-8FItl$u8OjV-eW9=P4N>sCuNPgHg0<5;+~#jLRyjY;4;ZQ zs6JVds&6hIZ_}GOS@NnHqy`__I@?otDiIeakt?cdVq9GJ;a|c?Fq)w1qvip&Uidxj zh*;jwqv08Qs&#gLLX|`!Uit@R0(Q@$447IYib%!Ce_pkw55;q7CD3UMR|cm~1AeI8C#tm%I& z{$fl#g|CpKG@HjxD!g=wrI>}%hFWSJ?A1nrTdjCpU(k>gvaCC;LBM?6Ty-<_8~p| zK4cYR8*J2q0e*2BRWujqt}Tlx@|*kxQq*g_@;u6c!nzuB94D>C#b+-9S%PczaIcDWsg5J6Mo|2O+k-riBrEM-?*?JB zIbVEEZpL^$D==|*r4@pA=sFN!=7?!CN4KcMIVMm&QE z@>0qbC+|Ow>Q=eOGN6bu`y&bh^`FFeC^UTCIg`q?dtx4eNg{F(h40(v=O6eV63!VW z73omNyFv&*~0h%tyYKNpmc`jndNY z;9~|rZpg%K(NO#nOlmYn_<0+vF>dIiTxdrf^Q;PfQ@d2|Vcs@Eh?A!K1(fW@jGgGy zqjxEj%l8AT8@YLcc`dV>G(T1UGUxjZ?MG(LXS^n*uGC4EiLnmpYr6{RjgrTAFxR-U|2s${v)HRrzSFSOg{4lzj;v4p5LL2oGKhmzz?|0shjTs z-t<9-i$cK;0Q4w(;v?;3CGDcDSQFEYLPN|DfbWC1M=JoixD&_@OBw#SI(oCd9&}JH z?V&u*nG&gL4-BPK2Fk7w0=g;p8bgQwjWuAvH}=cun3>qOM`#ecD(b);$t&R%J7W|cF& zBf>KP35NSIMf^;pM){?o)WB-;B$|a9AQbwJ83N+-79Tt}MgcSDo36n{WXyb8RPJ*b zuNOS^hI#hoNIzwXU?-IJ&h(uf-miY5z3W=I3JE&6o=%jjsF)*f60V1Km3oh~P!3h& z^`E%#RL`CTiCp&RacXeHzg?u{<^>vPpDjeuZAJ@aeDdewtt-Ro-|j;Ov{VtvlLo)J z!e%351epghroMgE?qJ_3&WA!#&?j~{m%d-4BZwd*$}cyLu8uZA2`^pG%O9z}DX|p; zljXZyg@0;qQo!IvCr!})+q=#2*&W-$l> z;X2{n-~snBEo_Un8}EMl5Lp21b^);lR#;w!#L2p z#1~`XQtnlK(58)@MOZxDH;T8T>vf~bp@)u`gOI>u%HL8J3eceIAF=|x2UR}sVCcj6 zAJ^PSw=qI^S!Vko!kogKoFwEu1t3sekizRxzu%9HY$W(Y=p(ir;c{bm;rLZXv>1-y z$nKjR|6bX?(vMJa06xm~5v-lct)h8YCP%Q1Y6jWE>TL zxEKai>Sn(gFdzBkV!iY3ht*&#eQKVwth-lS7^OL6_Wa#c$Ml`t+^9`LSf%R!s37ps z(hK4Qh=gQJ>@W7}x*C8&5aGvITRLh6wxWy)=iq@uOtH*T#ng?Ijd;9q8pR0FBw>^C zXF7uki=?EZ0zf~zy3KA~I=X}I_AV~osh^_yxeCa#(@I_W2x|BXnULAc6FgJ0TG|Nu zfS6MQ$GXa!&?g)tyK4h+?Az22KLUKmP%5mrF?0l2ClDwO)hY?U`@GCnq0Ndvf@sb? zsDV3-h$F5F-pOm4RNjhmf_2}k*hobaT`(brM4tz!xy@NJs7Z+H=8b?vq5K#DfXM75u~tub$XBdhVI#a+A6rAMme#$&(ciwPEr( z(FZu-=T>?3#zsL z0)-Unm>5gl;*~xiicp(u78c|qUV^$%oq%r8Na17}d%w&4ynoRec;6YPHS`4^uTfdn z>E#+BOHU-RF*%@i$ov1ys6*p(vS7K9OkXpBVkgNo3&JyoH>$RD4pnUrPUn!GOOq4W zofQFeOqto7+Yt^1-=iJuWtI+GO#areac_vYrW>hqM@oX(oy_r;cuXmx83n`GqUkku z?TE^LGKZofQ)lp_KH$Nm6~4NStiSOSnLWr~=mn1aJqYak?@P@SCO{Iv$J-ZVYSbSq z3{S=P%}qtct>FU36#YRPC%I?Uu)9;m$vF%U(jTT;b0c}8(L_y{FqYLFCByBdO}n`} zVoq}XzyUdbSbpS(iO*%q3HE$4mk2SO#Hx&AUvtOIA5ypYTOB6Q2!69P#e?gyUcz z@>a?a&lUc0U<4h?tzqbPBlVZwBUYb5`GXK>2H;vAVO{tEh3`^l6sa@oil!%au23`z*y1b znNVLmUEY%y)-S5(kuh}{p)@z>ebQ>1syt4*Qb~xk6R_V6gF(`KpPMY~4dwH`OA{0I zTgq1MB$0_?W7LWc@xcsBMFT4RGoB_CJotF7{l~i>}BaGEIofxwADMk%e#Yumg0n zF97$5$am%48{PmsD~Jz01Ng;7BoS;+g$PPq*uvAXL$RG;!(Ix(b7AGANfeL`eJ zREpwC#~M@|c&#EV=9vNkYzKW#s|B;{mZD-tBmrT>7qmviXlSKNi4xm*2{~5P1<%Wy zEnqsihQ5+-jR;qJGViTLs_ zf=O%#0!PnVqt+Lj%?W(Kq5xC1IBI1_HB1-@xgphw;?S!@)pkMzErN+7kY0O=ye zw16)TgDcV11DJKI0Y&o&4y+rjqS(JH7>(9mcy^|bru#Sf*%Bi0@Io(;Fv%Kzj<-~; zF&_OR=83-Xv$iie@Aa7?uWnAn2U~~i1~+z?WDn~C7{ofBMtxEPeai6cRbGz&2H6oA zMi-P4r$!w|Zaq#pU0k4xkUXw^5F*@s_Q_|Gv(QLnQ31@V@{mhB9JZ z-kdi2`A%yAA%q~bps-Xd#hBAbOeLZfzM0H&(E2K$e!r^eC8bEW5074|HUViu>nIzF zju1Y)5IWES8E9b$F@wOhFD={Aqn{%s1*gsjI)Wvc#|^#TR{FF;8BlaZs^U`f;$7`m zk3-We!!daz#SrX>=ee^e8@Xi!-1-SCf3zq9))gOsFu@vC!pn92qRN3oN0%mZEy6Lh zwQ$1#&iFlN5hvLC0>9FuA@AgXwEtuh3Qon#N#VS6!aIjoD4Q&tA7^rU`rFIkX&Jqy zy9(?nSyhm9;7s7+D=^hS>=Wyx#`Vlg9kbi%x~qv{7<1yG&fi=E=;clEF%v&66=J2l z5`7e4Xb$YzZKmGJ|6UW|jtmh){$3wjj2@X?r0dhUMmrb^XL>fIK#?0(E9``(XL9x+ zUU*5r^NFY5KMFw#n9oRYlz$@@Sm0H2GhHF0xUVZ!)^Lxl{T~1>K+(T8_bmG$pNAxq zmpy?I2+I^u6&~|RND8?ipEs_8><0}G>Mf`Gr1ZO%@S>7E%h_04XFs~8@=MTtBf}Jz zZI6qK@_UZmOKQ%ry&v{Cd}y~F)nzyqA@GEwXA#;DJMq0cLrzaTB>1Qh!*t(nCSArC z2!CGFfMg zz3Ifuf1Anw9ztH@R~t_-n+PMgE}#FBH6KCylnj+jjc8>e=J1g^;KPxiPJTc1TJhMz zbESfD>to6rQ0$g>p$PzqMlV+-w&nYkb$kI@>TCb@6E+2Ks`;}tiE~+e5%FcKR5u-4 znQAvhg~AgT6-+i9wNS0_#HQVlchHCBhmw%?3!s#Fh>nH?LNZolzq(2h1~>;^{`Ivd zLmHUt{OJsaV2F)(k_xRC2wJor8?i866<7`h6B(D0R2ujn9O~%I*CDv=(7^Ci8u_Z_M+7kYmuX^#bQ3g4`Z0#gTW`Szy5JyB}~VKC@ELXr7=pV@r0se#jOO~r%!+f1aYe&<;&jfNqBsfG%jks z0AD5Yz+#MmYyGdGM|b@!7eTh&*N>2AS=ng%>z3T<9v7KCGi{#KKoV=ehYquw#O9J- z*cesE=g<=n9MBO4`U?9^!S4o~7M||7$Y((T+@&u@Qi;XoVJaYoB3EwcsBnrTP>f3T zgJ$s0U+Rz60B4C1S`nru`)qq)Er`b!QiNID{i>K)z)pErHnWu*Lpa8JTdl1ye-1F7 z9n&Yrr@T)HDf&jiR4_h*L-POf(36;qj0t;!A}%F={Yl$4`0%R*Bd6JK)2{G{rZI+C zOFI702U+Lx+St)^*J^Bnl>@$LSRmQ$SIkY)&JfIWz^Lc^0mil5Yd5Slo=6Q#brU6v zJdaqESzew%`(w)zVq}kyeEl&Gp9Al}^|G)OYjZ(k&;NHVjH#R`>6eQ2=>AVx>MMQi z6YheW-n+z2HGHhN1 zxLJVNCkC2*V0THp%IKQAN;@wc3r-Y{Y{3cD)UF!A>SZ)Up4Z4z_DCjOHP??-gdjsw zAH4f`hsZ9uWw;b%??;#Z`#iRwZs_lBzRK66=%dW?2HF~@Tn@eX024k*y*t93yNb=s zljeG@@8b;s8_M>LqXKqeoxWeGWH|CzZWsNt$$laYASCSS-zGNiEBo9cw7g;|_J0-Mg8yX1sgs!ZFBu?Z%!ogq>fMn0x`31X2fOJ+&eMYyhh~M zU|U=Q3k){gm!vhLvjcs@fsih0IC#v-0JAcG>Km*FERVPKOxr;fI6vR==~&As#sqHa z!IBXQSZ=!f(YNhW$tmIhNcyLLb~%>IuZGqk@&JKIRKOJoo7ZYS;|$QTBrMckkPJK* zttJSD$ZfM**(KdXcG1)yQ%lqx6#>t=h0p-2G!;O6vlPM-H$)+^oV(_WzOJ}8lfb!( z5@m>$Q3ka6=8k+;NR&9VB*i+qzl4_&AWjYi&B66vRD3>(_vpb7oGB9sLFiy~Ay`+s zhbBdxJdI#lx)G=l8?u9#Cu#=9;QWYuLTI*tt9#_O3{d#HiKB{QotoUV%dhzy+VwK0 zl%frwb<+K2ZHddRwp%H%yp5!Q=0U=~J^lZ6+z@Yc&Ix1$s2n}WQ3T5N;~nk2Ylzb1 z3JK>K$fl_)HEq@jTzQq37+xn})H!d=Yx zST2bwNRl;2-MYJV3vOkHI;U#q5gLqp`y&tv&#kwwp-blJx}m6}L_`(&?PW58J#&O3 zIu1C9!VxOjL?So2yLo5npl@IlYY0e+u%snAsRJ;@P9z@rCv90o*RywCNnY+s$R#|B zM%^AhQfX74gK=il zwC&XgZ<%wL2{trRMSXNk7p4>)ks_coZcxUaMhw;rlw8q)#nnG6suR9%AuXkU6}M3XUp;>DDxXw=K0qr`=wgN?*QJm_+unS5g}iZY z&;eTT-TJXS6e%Q-wpsD+izU7MAV|IOS=mhdO1SP1?AeuXr2|OzoH`DDn|<~lS-0lm z;Y8ha%yr|5Xl7Lif_D|>gq?}C_PQ@)6Yo$^=83Nr8%~`Td-tP03FXBdV7g!Jj_5+= zLIiEXua;xTxw)eaF)Ev)pfdtnc>9M9U{nx%MWG%hiWK}D&qRefKSFpl#rcCs;vUAx z;iG6&oTF+G@Dv7i9Pmau;78)+fKP66(`?^=s}-Z^po>^T69bT|T!E{g6Y~Lnk(|8b zU0r)fbU+4UB{E(*Av|LV?)5f&A>$Ht1iKSI<6HvQ$YMv5^x(RbZHRLIhwEVDXChR0 z-Hef31jGe+q0UIZ7BVV9cv@`x{s#9PLWP7Lpmsc^hN$lL6)vn;P7a$IXszbFNx5lG;wngEm6jjAz-&EGdkm=2D6 z=w^zFKg{MI0(A?Yx|_F`$wVX#K0t{ZsTnHb?n|gy^e@XRCn7_k0?$JzX^oPF9Y*8x z>RqLm3^h7gitq+zDLmEM#Uea+2xS3yXiO++!c;Qngx$v^4PmZNg1(b)Jpi zEjNpsHyR`josIYdgcK@B*3%vW}MuQs0~Ijg1g2Srh^l zsXUg4g4Mi}x@@j2dAy}!JqUOiZU&^gmeIsF8!!4`4={E#UyfQ?Ls#Z}S>6O-hs^mj zgVrVbGNU6(f$PYEaieGfHz0J~goX9nKtNWCWN3o**>A2?)*pj_(zSA$Tovf3J4`@) z=blA#JxmO<*7LLXaaYFr2$tO8&$FI^1k##2)%x?&Dkly$#xDT5`ujwo(WkzRCqvuO z4xqw;2ZqIoN|#YB5Wiv&@PGe{-36TA^nt)p6irkH@Qz&6-gQL{h#F&kHPz$7^)w~M z$QS2Z+Z9n&W;FhQTSvdYFEZ#@4*n<@#Q0Qa_`N7VCK4F^s0a{tqyrARM5`#Xz(5Ct zESbmF0})VGR1A)3iwD9j98=aH07g_5BKOjq9J-;MfDv-11YbPNQT;itogV~H=ViEB zVRaF_@%CV!E<&ml9+rSdO|^i;=V^)O=R7w080&fiVyPAz7K% zOFde_E>0xp7ke1I#u4mg%GT+faqr@A_Gkve?!w3$MQHWB?jpJZNYg*89mwOxysClK zKT+WnljE5fv_uG=TL`le2^h@53ABn8m1ofiP$&AP6xypIUWBQ#xZd+Fxt&}YJ{q(1 zHKy?Z(%bwV7p`43|L7Cw_-&xK@_^qb{8`yD)o*7pFMRjO((?YKiyN9;n;}yi0S3}}-!$naB z-E8V86}c~PJv}!|8BaW`8acdsEkaImSSM!`K{d(AY8(@&CCd2@rJjI@~(g8wHFgfyd5OS#EXq@8I%B zkth~YTW>2K+tb|&brA;U<))U@bw64>7Ya8ilcShel|zycPA|73BA>hL4UmX%fWTNp zOsH3F1j6*fwY)LBezM1shS@}Tw~=g!+9|Wh(Ypabeluy|>UqpSrpp8FK71}|yYs93 zK9l%aeFwXm!M_E>5V4cg1%l|i;B5SGUx7fK$MrBhaW9TWNFoL!BIK++FJ)}wwg{tL znAL;MT3cS2)(p!z=IZl(bn^tAYaqB`r%QkzFeZEPH+yu;n-gtK&k3kVMqs)fIlSK( z=8!{m)Iug4Q4{9@dz83PeDZ(kmt~+c#=?&6A7V2XD(7zp*{ zDxWOd^U!J?L855LNq&Bs+MePAZhsk5~mjaLSTd$Kgho)dIOsI5P}nQGK|Vi ztYp8;(ZSRX;lV4R_u<-%ZM1iwWOyG2noA%o-`1?8gel|~ja#sOt>+CZYl8e6EPZ*! z31`;4CjjUeGEw+xCi<}K%c5O<^8mV_mgYTxau=_fQ(@TGi95Uns>^%$C2SN8Zy#)s z3Q%eK7}eaU1k~j;Z-_!+<3d<=Z+o--NZ(rmu;vLWUApooa2$;JbL&Fb7+}-=S%(vt zj~uv4&=U0pB(Cb`d59yQC8A4y`ESw}vvJih{hfL86Gp`45X2MBeQ5>|%i!|`D*1SK zD9*yfB_L#tZc3TL#9HLJbn~xtsNVlzBeEKm?3xY~uFh?YVfQ8`Z-L`UCcd}2e=Kpw z;UX*^JpC9KxSKytD8kSgKI zG!%G`2=}OExF!Xzeiy>itg>D`P@c22T3T!&=>9FgeBMsiNTQr9zkr4)u~sYFhPNZk zDk^cw^*n5n2+V0_fU?eYpM0j5s<^S-{_kL<0t-z*xYxQ_7bp%xp}VCxGHp?2D*N2F zCkdfh1C!)=^bdO>tc|#2`m)F`>gC1}Pc~5}zF-V1*P?~R2L}OHn8)*1P)Od-LjQ+F zbz>JGLnV~s{eSJm+}H%9(OR~tigxYnFSEXB5%ZA?Ei53aFC9MC0nD-2%abDr)hn1R zmPL@Lkq?R2V&HneRxVFexD?koNdN|@p>>KyHLv%zG-G4-{inA;^?x~GbuQ-fJ3@gVaEXq0v z=qBiUq6#w(&;R|HP8dc3A|Z*CGL>uCyQzAoz%#eB0j3`xtt?UW(3l1GiX~kVQ6l)b zIw7jR7}N|`JRFScNgVOi!_hfMRb^sThM%|ABNPA&nQ^h85rrxf3Wyg*N^_7;Zu67( z8yq%_)3?e$DUf_%9(Yzff z$WW~cp>2*|MrB-V?-n7DqCn;KCSr0Yo19U*C}-2GKU`AZAVLwH7SF>I?4n7BD{vrv zG7OU5#~5rOQ95QBZemfEps^O;7P25$C;*#rsfkA3j{l(H47!JL?Ib6D`d>Bb<2j8O zU3bzbOb1$&$v2A+t}69NMWC8iItos-Ga{G#zktt@?aClfq|o1r4GfNz9gzj{u0CBR ze#|M|1+h3whsDFRS&MK_#(F+cz8TM7x$tG>-G92Gp!RW$EG5vEL2}1J{@=3dpES+e z?_>}Q9Hc~I%AIaaZrqT;evzKp1o$*8}sJKHqx8lsF) z^yH2;z|XGJ(8|4dEBi#@@FhS5J*D$_KgV##dR12z{a!0N01=89kyoFXfAjE)pocn4 zQYV=Z&||tD;-Q7euhrPdlobzo53OI|nG4`JlL@w*;AoB9j(dvz(J>_m(^-x--4#N? z^rR)ibl%bgMC5lDHx?hjLa3<_MU*@9TZ~rK`p5RUeOXBaZ4c+Y_yOulXbq0mLCR^> z0m=d#1CUvD-JG^)noc;}HCW%E%CR46xeoi_PS6}dLZnrzz-4$pUB!u={9%Hq@tfSV z@7<8PEk!C+bxTgnmwxi6Q{t9(e?y$Fw7r6P8pRmL%2AE8-jXLERXP+R%Z#2%0#A22 z;7`D@PBf5r1L_MhmNi5tDhS)Z?eH%I|q_`kOmO^DqEp;lmS}RgL zxy!4Urwf1Yj1KMHO?U_^2Q*8ig@-Y(CnDewZ%lCFzEmWl_m{@QR3A$12$%0t$T>`a zgHxa%Bw%WQJ&Vn*`J}h`-A?hc6r{+~TQ4djamk84GdXx}M%uJWq-HB(83t4YZE#>? z`9g*2K|OdeVo0s${7Kz`%Rf2gxM*LznK8t~Dj-a0Uw}$Nxndrcns&>V zt`oJUmXk?IuhX-SH$yRs*i`TxE*E|xyJ~oP21P2}Ul_ibKYtWuz~cbw+8-N^|F7K8 z)`?1h_j(z{p_%dU5&FCvB;Ve{Ypq%y$j0_+nM zSJx>rin?mrL~;R6HR$TR<>7>yI?Ksg60evf#T8HX$-EW$3d5DP4~VCI|HW4Uu_4WD zFOnfbcZaEnZ2fa?GH(f_Qv*B~&N+Nu&GcllM z*rS;My7V@z5cPZHgZilFxqxJ>wpj;!y@1xnAnpNRx+<%HTI?=}>vB7w**u;3ri*4U z>vh8MabN;;5$1`{q20m~5sSo8B9en-H*5drzn!=!F##cSWa`hRN;EN%jJ)`Qa+I)$ z3C9PoXyLQ%k5yxEZj`7*7Te#|qn6YhMe*u-S>VZw-sy`d4(Ew=SUp)>tw?vCAbv9d z%5Kv}?>|#z;VxMOB!Bn2pS?&nsj*h6htKk}=s`nk9n}_ZmL{C7!TEf|hxkI8so16B zYAz0MpB0ty^?@qO%f;LBTty+2QCVRnBCc4RS6n|Md{<@3;hn~ODl?28kB0a06tsx8 znhW(t@ai{z{QZyZCUiuVP}|x7?;_~pEbZkxq@spV(9rR!AiLImR6gXRMf=AjGI>1f zMJW1XwY#H_50qy@`B`vr)kJ>)%kh6!e{rEl@kH3MJAsRi_sf=sWnvZ;7<`6Sp0gkR z;%Dc(S!@Azv;QKb(I=OR7C77Tq#14xyzRa{xn;a++e8rY;}U-ZCbMvxup+S3NU#bq zpMGOrC`_p{C*a3Z8f6z0xAEhqJbfKj&^3(Qe^Jn+KS$z9;U;I|{Kr2%y&td1iQ&7uKRAc0!>CP zLbdY^Z(g3AzIglo{j2liBP)U^CFo-Je_h^`p4Gw@L5B+51nyGE6YkEI>z^|wGKUPr zzv|`0=9iw2C?*qk79-o=VHyJ`{7~9e8Lt5 z9BerI%V@rd0i;3W`0D*n+uO$J5h-rcFsV<3a|%Ve!K_iw=qkrC0y%?E)_i2?V<7Pz zS4+Yn`dhig*1A>icIdCJNKX+xnb6ec{4xS^De_Bc zj+#ke<8{i=^QlQ-&Rv7(YtdZm21?1lygBD$b=Z>|$bXKEP#OjbqCb`wyCusQw+M+Y zFn~B+4emaEYIdeEQ-jx&@b&l3#hc!e?(z)ISq@z+JDFWpEADldm(n{!15eURNy9TV zTz&krPy8m)Tt4`Ypb88ve1)jvwOt~4klgLzYazC4lTx1)sto_n>(W3wY>^}r+OFG= zua4r>5yjDWfB!l_Q*O^bMPvbrjf^C92Xe@sUa99eklWGWB;uS1=r;GKj@@s}X3 z<6r&y$8Q@^3PKF;)Y0~XE%CmJUlOvGu zU?R%0J#40{>&;+7K&cQ6tzB3mo(VF>rxE+Ec%DM__n&4!G2n4Ad{d1lZQlaD5vn0Jm(gs!^=64^7~HS>_poQWKmpq4) zX&Qdax9Q!>Zh8xmf!eY^lDlEK5(N&s*AV8};Hu{a0`BRs{6s(|;y^U#caM-Gav6wpW*15Tuq1&crOX7m1$*AKDhCdKDxxUeyq1)Jbfm*IhU-t1T%?!(q z+J$0$!Mau6XzJZeA9HNuJ@HLPiT4~;+0HRVK^hu01kF6b>iawvj?uw4@jX+Ul1_H{jbJkfuaf?Xj}Ci3wo_ z$&Z0FX2U)C37;#C`bIl8cOd3BFpWN1Um!;xLo(e?ZF;CXPdO5ecSrs;S-s)1x_vmZz#~8=4j@nqOD$$YSB7C~Z?KbO|~Y$Ls#ZIW$#W zu-P(LL(*62!81!njNK3!3q-cyBP#iKmjMvI5x5wnqemGK&`gUqXgs9Z4@o|(8CyL+ zKXn7|z(NcZ!q@Ko0jb0;2xv1j85tQvt&Hzuuxd^Fn$AQbf*>-L^x(%A#tPLS(QglG zkfP}yoE<&Lez;S!XKNWk?u(;l$nkY|E)@DqwFGA_KXKJL2Go!vr_(M4d|Urix@z@R zZ2hhK@zAO00}9M=LI)>#P3{18HJnjrpztbx^6e`K;}@1Da)x(CuZ1rC6j z>>YC3s~BN{Yjv!^1fjpx$!!0FuQA$A7HMALTv9qC1p`QQ@>uPtYv}MxTjE(5HKvBa zuYtvork*xFK{RII52V{T*G=vFCQ-GCLc~DFV>z5>RTuIGt+deMSnVmDWGFLV6Q)N4gST+a-t0(R$h9@z75PX+EexR*vd{RaHj?Orh1;WzI(M!YzJ(wHV|aUqb(OolWv$7sC@3;E6I)f(2lnsSGUi>U$5|P*x_? zj-S_`*y15F3YV{1h)v-OsJjkVh?XVol@sGipLK4)J8r8jb`OD&7bF}(mwow%&;H2OginTdsX&AtD~?^QLZC+o#`x)Vr&*FcWk z&HESW@m*5a)LsL8#YkDYCcRnbK&%Kgw4D0ai-`3&38GON4M zA%q|pM_ID#-`ELe7r(mgl7!-|Y}Wz(nRnLvXVDysfY{1|cos=q63w`Sl$hAxKmBc_ zL!kV%Kywvhn-D+27*miTeugW-4V{H<-i)_{eweZUn!Xl8W)M!hH7&Sv-h0cqneuk^ zIHoX~2^~cD_`gJGbaM5ong6!F%4uUHn9GwvJHl-r)+@gGw|WwOyRk zqtKC?#B>>72fJASX7EJ^vs9W{!8A;Q{sR> zryBNO-D!Xx20Z@g7=+6Sv-)hGw6&W4aWwxsyTP)LeZ{wcMkEhKFk5{T8%t_7nvyVd z3M$^lbCavdrUs4n5MZCH2t<@Ic_H3>pxcq29|yDV?+I{5(iSlTrORpERb5x{0uAZw zy8aa-LOEr@@bKfj>kz1lbU)&Sjx`YAiIPFL4gkirf6&VA5b_IgJK!l+tTE>lAhP(T`JsIEW_!7^7xH`eHU2Im%EG2GZ}@~ zay{1UBF=_W${>lhVr@9Co_f)~FcCTlEojqvp&=3X5lRv#~ShX zm~&^xFkjB`ULFiNnSxBVt38-gl!24V2Q78z)HkL|n*bC7mzHL%-Kxj$8+M4ND>xj# zN(2`Hkm396vOm~xtu6O7+MieFhX5b4fu!79ukPV3`n*;BtE@m|>d}iT{-q`q?B`Jl zdCpcwaQoQo=i`ll*p?}{QE^tOlQ3Z_Bu>h!eeK=`8IpBsxwsO9ZgSs&i^sKmzI*L%6b+E9Lii^W!NF-oy~ADQ7g zV*gnA9*;;r9i>)+x1D%8|2ImV*PtUhofGRG4w@HfK)al7}*fE4| zrYI1G5#@sW^Aw=Lt0(xf@yAjbFJFcO{Ky_x3C3N`$EQwuZq=5E4F#iElUvYcm?6%W zD?S_Bx{HYByAhF`1bi(>M;JVcDR(5J3uuNDNg%+zE6j7}9A6dux7J-|N}-I}P4X{Z*n# zNmjBIgOM9=+7xX7BHir}Y=|SZpLPmZ* z#!GmNe)<#__or4qDdJKw#b#FC4ochm)K&8|$Yj_3cz;Lni`pH5m`5A8IuWv-jEG&% z&wwLMe0{~dy%EIMpak&Pl3QXNqyR%JN4&TcoFfZ=*EhfY zquJIJ!l($b6K-3ATgOAHKkT{ee;paC+X)e$-OzkXx&t)Jq zRV@Jhd@M9WNNdosucM0@WZZ8At1(K4CJ+HROgw2&@H;K@?;=6!7g`$PNz?Fp)EGm! zCdux>!KL@^s&IJERc7Yu9_=@#lsdTk!5hEjsj`};rsmq}RAqTtEb0o!83+n-=%^MZ z773RHv_!LpFg2%U`?{{8oI`>=XtcH5-Vn_o0oP>htZvkX1&_L1UCPVgT#`7jCX8Zla^!s3xqI*2Q z3#egji#wIh8-u8wc(S6RqO7beS-WUiBdF>KXBIv*%8zG2ni1r3!$`V^GJNhX(|H*c zL@kUYe?%WLb0aEGbv|>Z{oeIpYhV|~Z;iVaZ25NGoIF)0d{5W_GJM7{Q6ts`CG^JV z2@#ZW)>7Sv3PIHrCRr1vg@qd+FZfSL!b4YY(ggKsz!^aKTmn(Ie!~l;w!Y=HZQaqVz~psv%NU)P&7^gFIb%hZA~-}s{JPZ0Chm! z)~E1Ds8cBruf{ET+bT|{dHah~v9v0(ken2#gfe0_li>?}hmc@8_? zY!2aeW|g3gf2FWNf%`%Axb=VVqx>aXZIlP(If!dvA!=hdGQWH8uKoR^Ifzv^uimuW zRgA_u|BnF&`95H(Ej5ezxWMFm###`G9#5i|FEA*#$|SRvm%cQtLCvl1))Bq7YC(GV z9+p17QB)7Pd|!7JC$C5GQxwNE z$q|r!Jl#6`o)|dQ4<2<5Fb<*=bR>q0aT|GKTZ!I?JbYpN>%AW?Jp!bjd$LiD7?OAb z(S3%Mr!&t(ftifh(q;L3?Hhw6b_SdBqfiAO;bn@wpM9w2u7vfR72>R(OUV2H)m5sM zcS5;rr1KXCaiylLO49dpaY7H zTACkLNr<;EBQ*b=(OB&Y`PMZlI(gkJ5IjrS*y|^oWA*2C@a2rMY$3S;QJqm<Xqh|MqmCHTdhPg z?#vpu)`nCRWN4>;UcU#&^zmrV0?R*3JAYs3U-I+z@54MgL&-U!xzPL*_!cH7JcGIa zr2P^&#K1VlBTX65d3mNNak_dx^s*)3ATb%LT&8N}g_fNeWBvFwFydgd&G`ip%r-!w zKf7yzJl!~y+7*MAp(3BS9$8{1z({q=d=1zO?AD3fr<5tq?id+PTB}RxuI}}Z)ppZN zi)4H8%kvGL!CaF-`|S4JK|f@)CKCP!*^iCNfIU>)QAp~M?ndP;{ zvU0((a5|O~Hw2HzkW9W_v??UIZ^H%pNN>`$nP26hS&^@I4M2*#c%Sjzspr??d3X|* zuNG#Hb0Aoj?emer?=VmbmS(`15pl?-=H_qY_zg1M&jS<}0d8(qTyFkvxv-b_8ADO{ zLFoG0-hKP`?W=BHe9DT(SV56z!hHXKJwfMJbibt+(K!&JBxN0Zz_gn~DLp9A7rd9w z7b#i#u!i!PM0=hZmOl5Ioh&T68u~x%5HtvJYUG%SunGWDT3yFWRp#;0^yHOt*ML#c z5W}uNbTf~LSIr->c2c;ZF+a$ekN?Ae29D*ajb`FL$>Vu}kQ)a*<;T-m%U>ZE7T@r$ zL_Rw;VpJqizjDp|%4mc#OGnEpbMXYzAM@YAu`S770+%hz1H3TR9S(Asz4pbh;ImD8 zf#QI>;*3mHmI8h1NP&ZD|Gw|7Uz7}sjqjsNpW|Q5+ef>S#^q6;u;VOW#sYU>nu_Us-sxmzTD)J3W02ELGq%vPt(ZXKVgA zP=KLjI)xI;v^WQRAHsRLN}v_1j92b&pT{TO77)gm{)jA53i4_w1xS~Ql!fNlKui^h z7jf}U-#M?>Bqchy!ae@4uve~}KhOgHf!g?@2{%`;Mf2+uBxw*aI^SoCEfPw5(15l_$p(_kh zTV*utF#O6A?u=3aWCyOp;5=^<3#IMB<=9KhPjH3?%-q8hquZcBRk6 zT?=gS#3D!uu|-jiN^r`bcO$x(+en*B3HI1Uv8;d}%h)e%Iksz{B@V&h{z7JE)z4vS z^J8&-w-3E59VNF-h*5oG2;rucvD;mJ-Y=C0?I@9YR05o+8>?Qb2KMef)ORdB<$1mz z)HRh2%Pv00A(aj4$Gzq`+}pWGzE~%9ZA(b_ z;SpAiM;(g0!lz(~`|@c9KdYipa%0%?v*>8wRsyag`7e=h7P9guC#F3=SPDSLE2|^C zEpY4`|Bd`V_Ium1U5+4X+CS}u^qZW`jWPH86)b>tMAL!sgWAW=M1@3LYgLXL0viEWSVgmG}ryA!T@fTpw2tt(wb)&HovEvDibLIg|G3 zGLauxpGWPf0haGN0)9lxWRc9iCAyZif}WI#s{o5%pWzWgjRhWZCL#no@zh_}$d?8RezmJ~6o0wnXAQN=^auUnhYtG!F zxpANet2Yiyr;!s)m84%n{)$(XJU1gm^ zreTsuvN?k{3mze9dyv*Xhbp1lIUa8I&|+99l~3>xEni(8UAhO{3L)%z$HwizJ_v-I zf2;Cwko6rCoE?=_v2@g7Bnr;LSMXEGNbq<75P>Mjljn-vyA<;Kv-%hk+D;JBC;+BZ zFZOUZwg0>Sr#+)kfFa~8!1zwtd>{ipwnHhU`{gzS-tqd>%F?aGwIQs zQF6E#_4fGc7>w6+2wMwBVsbb2vMV)kL>)R`$nYR8kO9VrZ)E%NtxWrxp7bB3p9df8 zN++tzNPCp`*R%F&ZtURw_dGSJ^9HF}R9nXhjd#ykj&85}fh8+{N@G1j!H9z-ldsT9 zyDh_DwSxd&(fkmeQD!ROwU6umHm|TU=;d9L#LDvumME?BB{#vuyR^*H2F0bGpR;X4I@Z;=U50|7twR4jY^a8Cvt?M9>Vc+|1om&*9L z%w&3^ytTG2p3|Cd?PT|U;sX5VHgVij1x{RVxko@z31~EnbCMD_=Ppwc2QjSb;u{FB zh-ybxEj>rrJ3T>x^x`aHJdK(%@jny1F|b^qo=LT0-kEN$7SOe3PG=%;fX=sp+ZdobOwN3L??+y5{5fsUp%qH{hb6Xlt5YSOLqL)9aJpFjk z6&xMOv+;wpE_Gfu&-eMlQsY`u1#2$b7r#=)7bq4NPKl{HYytt{cD}S*pTe&%%wU7&E}SMTz&UY zXDTGpTMVy-5enQVd^@BWqqp(wj{-lwyAol4pwL^+4-Vq(IZ5@J;YNR$=giQi&n(e?O&pW?J)RON7tpC@-4f@2AIK7#vn z%>af%y}pM-LLR;FA+Y9$XrNJeGlcyw(>%0w_-%V&GmD;JtiA$GW#nZ6ikb8n8^?(3%P4Wj;2WJhJ6 zsNMnPDgo%FyVqs*@TwTKty}LgB588r{;EKJb3H|tM3CT!b=Xyb!V>XT=`g3g3{1iF zSd#$&F+@rffS{mcCaOZ_KM?9#RD9TI5eOLjEcd}(KxnVtRnLh)QB$VG9Z#}O!+Xff zy=jNb1n$@5(=Tt-f|UnHFmCcCAnGD)xfJJbWVbf!wC-b*C)@YGoKTgRrp-ZNfVqu# zj4>uAr^6#9Nb!j#DwSf25PWQ!Ov19j#`;4P6HcM7=p{We{P`O&Zx=Z2lXT|t!aWd95@FdlpaeyKI>i~UgTnE#kp&7){0<= z?heL-8Sf3_dPs{LD1air#x@F-sFBc=-9@!uX-?7*x3AM4o(5Wz z&O!VM`}80)$5WMVunq1>`^3~Tfu`R=^=G7v3$mqrfo8mlNl-=go)k|yw5;AVtRx%$ zERH=Y#5j`iSiI`e_!8^bu}+ne2{P5JjZP#3AO7RWHdt(e!&ITb`m1A%l>8sdC<|q? zCN@t~*uFdfCXEuO<~k@r8bt?tYh{5GN0!rC2<;Uu)J(kU;uEP!pwx#LJRILR*0-B7 zcKbb}6o)!#vyM&Qvh~wQiL+h?2Hv}aabN!&)Aw7T$fVpJFhL4g#5__@t1v<;V7)ct zyax&iE-Jf(_5qn)5`{Dcq zB9VSIbTjiacNO}_aVTV+4vFU8jrwdV(;jcw&C}y^OEmCm;1+Nqj*y@Ze+8^!7i7ok z?PP#xIs5Jb3{i2a?*_Qr#;v$P_Dk?}@eBTHIofqE@W_i^j2l=wv*0W&>-k9evs9OZ z5<>s6vpW@hN`(H6ye)#6Nq1>-@oj6*Q0Cs9y@eg@w6>p8pD7@nCnbb%Vf zO06Y7M^Y37qZ4N_!O>s4E|e42>6EmR0&H%KpNOu$T3@H8^4+Gv1Z2|iI4GU+9`??1 z5v7}TXx!z09(VLn15810{-8|MLAsKoE{A5LPEg0xuWk#L9-nVC^{W>udKK$G2p?ih zeD)8q3j&S}CSw2~v|{dt{udgXZ5K!}Nf^NNLu!4iMQs*JvKPe%l0AjdcGgIt~ zn&_7rSnFUJAo5^v(a1C6j-rW|T_i7j#9^B?g5e9b0wT>}QmF!zxWlGbvY}g-@mIlM zFrQC8pr)sCkzoF$`M-2Qny)k+Nf=F*jy4x0 zm9^K`;cd)IW9Z^4+AlD-H^|5W4$ZrcL~I&++l}+YGIe8FC5@>|Zq<>a=3k>ZD3Q`G zVMZk?QG0J!FI7~_QGJSTug2cQuG+NGnQ4Jq#3GhH9`!-c4Ei1-xPs-$%QcE2lEh(} z6SH9FAXEfnxyXtAqFdGapk!G;?X3s!Ed`QSRE-c)POkT504UK2{DuMdHi)zaM9gJC zE?(+d(OKaoZ$gWnp9P?E0}L3E$9B^?cd6u zIZ{ah3G|aNmf(g7!^h65|D5ovlnPMuEt!j&PO$qkqw=xWItter3;;hsz`rj>k`d!I z=5e=_(Q_4YX=bfhy^sC^vEey;*7h8u=~3Y8nOap8+3(M1P`qk=Y!^(0#ei zVR%=$XO!?SA0o8;7Nd^_uU%V>koi6hZ*BFHtt94lWRI)i&-c_mLV~LTcQIu~Hr8h( zA7~pEkFfU#){CZy+ zHm5IW`NII|NW>z-xTD7%Ur>TNu1e}_nU@Bj%zdbrnuW73YAHLB42*DEXEvO;r@p9g zA?4Oe{&9G5?6Z~#lNi{Tz#PRNF;u_Ka~{T<`YpHG>v}{{9bZ6Gkfd6X9s7jp?un)F z_L#;*9^^_>55X#n;{YOuEVA>TP(Bx0VByA*=LrcO;<|+Dd@0tMfN8|DOC0sj7w_I@ zsjx&f?N%S)5q(|F)I9Z?K3YQPJPQ(XU_ZW`cW6g;h$vnEDX5Y7j_(IOVw$BQOZh>V z%T?RSEwQ?;-ES-_Hsty#X6G{PAK&E~ssUW+eTsPuYW>Ln!LQlzKj2b8Kun2y@Hs+~ z;25)S8;@+6Z-dobbHDYh_$%vRBxPyRYTLfz=2jqNR09(?6>~UuH~t~S==5vHC;HL< z^KXJTdY3kScIaROWA-D!1a0APfXElJD46z*IzF%uoyFDLoSxutn`RloU~v|&1*CfF z24Fl@LMPbigBf-%Ux4zd2GL5Vt{zxXnby#9A7Gk|Ye}y&#}n>CHq)VnN$-Sy{h2RV z_xTiS6%Vb1%12j}cp@N~xe{}}c9Nd7!lVr^SS)Cfc>+PvEg)GZ*&U_Dc~Bisr66qP z6N88|(h1rCC_cBk<0scx?K=~#Z6@UrB39-}i*CzcGjg3AY>W-Lh8Ot!{UB-uzymsO zw_7)@fllem?jBE`PJbuASPWy@V?h<7C}saaP=^CESri_L6C)vg;!jVPxH;()Pw!D1K~qxp9B>ha7e}qIl3Elf7p* zQ!|`>qn(IH5>$DqvLTH-P$@TR!4{bB#+O%d(QyPRA9oZ$f)!CVJ~bINl+8q{4`RKx zK}1<)k1C9Ed1eKG_C}gy0e&5mvdgR0BSbP2>h*wEcJLPc21bcCC)M^afq?hv&z` zS^~6CVun%efy^12UFtNpcIS`y1>~B2Se*_q#2oW{2Udfamis+taeea^L&(LX%j0Na zd*@y0m|-S7#4atFcA(yYo>Mi?z-)b25mUshJTYoUgfkhQTg(v1Posi`aBs{?6pJTR zWb3P3T)L|&G2QfYequFFXit({0$MZS;LCxcFpWp#br9GVIwz9TIqx|fyJBd@n0V9g2kU; zHSoJrle3ds*t=ZP2liL6>`v_yGQ?pQej(0If!wJ>6b*}b3v%LvkCdndS#k1$-T;E_ zyHD&22)J5H zTvD2?fWy(1t0U^j1*1Wyv)DLMN20ao4WskYLmOEnx>;aVKU)5mOEVdM%~!YXoLjtZ z2iS>7gP|iO11YxtZVaI6jC?)k&K-aV5iSHeG9;2~w~y2#naWySXA~G^013}10Fmvv zKH2EQw^V%)3K5)qWXhNj9aA0bJ)V*ga0%}#6N9X#^7ggChNtcw7{3^3iOqgLoN7k{ zPr4tzo5;~N>u%!vbGRe03PbYh4M?Q`K7I@OKOFzHM*P>$RM+^0Ex~!9-gj_jtr$h( zy$W?@KI$XGgTM^gfr08q8^t{<`X#`EAzCl_{Y2tz)?#}c6gz#}^>8*MHX7Q&q_R7; z^-1Q+{c|jA&AzORjn~znSoA#;WGHA+%hV}8H4F+Hl6QAuAGg};^)B&-##{tF$B9i~ z|69bxS7D_v@7+VZ0sIpXu_ z5Ps&yVaz$DJSQ+ z&P&clAs+=TD*4|Xh+7JGrpBxh;gmXTtm}Ii3nP7ZxsNvA&=tN^XVwzTXTiSS>hb`= zqV`Zh@3BdEFIsY{^qi~bck-ZoqV*n-D@ODqmi{ZoL%7NTL8lhT%}Akm3{9h8y$!{%LfUY|NA@o zO2W6&2EVq4ILPXuVM4#?g!SZ85dBp1m0S}))^=* zBIGbN$wD-q-umbwe$subyft0A~DAfZ$=wA2Y_w?%U z>?m7Ejx`okFP{)1Ji5KCoU1%eS2qvw9sNM=NER?GEXhKbIYtCZQY|9yjv{ra(!$~% zd{ZhM331eVQ~`%e`_F4D6}qY5;^jDog56)AE;Oo4{_B+(69qS`gu4sw`(3==4JxMD zHK(blAL<^5r9ZWT2 z+xckfAugKwb*onV(LiNzYq#aYpG=#CwdKabDSWQy6Rp6 zO@2Q-qTC^h2>(DuyivwCO$9$hXRDy?lM6(-n9##KVLVE4OfAoSngR%F!%4vc4C4>! zFhp%%WFoa%)ZSV2d@!~4|K&qJ6RDvZF)SizGDr&>_;`p`0I|_&L7A~ogUt4EDRfo=sLM!V+A-X(bt9W4F4d&QR%b zI#8fv<6j6V$~%cJSSj!^#75;%bnj=3G`?v^jJNk}0HAs|7F0Yh2V;UpO#wQhF{5hdW5EXddrD16z_ha>X`HpBV``tfTUA+BIdutse?84s+I;L zP8g`=r6c9-kFtO^L_98XanOkl`0wB57&!Rp&Xn~lmg<2WWIQs6>a zM=)EOb!}LX`LX=HCS}K?zw9ThvURI%Wu=}#u~DBSaGLm#w1(itj9MTTSAYmO zIu^^G*Rr@)U^$dPy(gV6)|>|hQa1qMt%;^lONSjJQuI~kZSfO`r1y27oRq4U>o|y4 z9u8ql`+HbBgHQ#v8^a?7fa`zDw63d(o*x&n4gGDL)Smo_r&At`R*sqKtOpf|5Uja{*}B9EV6$5p2~%gghs)| zV4DO#{E;x$T!`Mvs*<5^+EJ=^fAHkX5v^Y@aBURM@5khtRX;ls;N}l!KC}p(#^gI2 z`O*nJej}LxrRtShIY`@BE@;}6gb8bjLVE%{b(X$21j9KLk^xLPkjr6{1$ju zB{-%ht4w(gG~(nWAJf=BE49%_CSt_4w>+WGoF?D`^SP)Ep849;H}6 zr$uS?HrsXR6?p$xpEyH_um$uui`*~=45)QP+mm9mt^V{#kF-_V5hr+;;*0{ZF+b}b zVTr#vx8BE9N2zgqe?LIv_vY*MIGS}op?Ui7bZ-$lSE>84_Y5`?ENHhW)nc^3ue!B| z*I}TCAL+(j)J!>vOf#hYv~Eml4~4@ShEd63p4CAN)A4pd&zIeK#IdX!%o8&WMkqgF zsHNP#pl}wJ$TC?EY}#5t^MtP|gT?{)^3alGEP$ScA5A(z zSS~`3;IK?LgmwfNIFfNvMMuWni^@AFF9BWPdiwq&&f&L!PEp`siAj|$YS}CO=lo{7 zoevrA3^3iPEn=^w->h|VVbDMp+cRgIOL9z@AE>?b5R4K$D7r+wa8S3dHfw-tKf2|v z8e|D6h2P7Vvxz8POS-3SQAVs+kQUn37(T<`mE>B0Zb7ulyLl_GwWR1F5(0Vyk_r+a#Xx)+Ox)a9rCEW=nFVo$A%HJ)Q5g^V;P`7w?e zK0ZH^N1dHrEGRZ>K5D?(F@Q(89Lz#1Ai0w+fo843eovR z$m~B{LA;Ab1ZAtpC^I#SAR&k}+AYiNNp&IxD5Kb5nP?8=;6@hOcAe;87i1M< z-JYjUq~qM|eNg}wk9#AvwC`MjNWqAt?jA=;XHf!H1P`JJk$w^#r^PRxIm6s>91`-z zU3eMmL-=ylM``wr23Vi@lewyP5COwsjn*q(8fZb}S%SSS0eNU)`YAawW2~K?pP9xs z`@A$#>JmiyrltgEeU4ag-TG3oN@LX>^-HbFkHv5Os&jwD{Tsgkvj$nK^`fK+yM8mr zlXWWyKDRnl?&|uM_XL67bsxDhBtK z#2gumSVd|?WchYesRbjVnoK5Cmi*$JyeLqbj|woj9|6UbVAhK=B>V3}FExrNFFYCY z&Z!RKFJ_YhV&i{Ods4Jr(IF}vYj{mO+L4zTH0}Hn%v&HV9mm132^rp4eEO04mY9W? zZM=E;x5n|RS7*d0CBH5jU1Z+7K09fnFhB_Qi@SI(0PfYrj_=(Mg}=HQuld~Ee!!|sRDbM`VFNG6`}qcpA- zHOf)wrl{WU1HE<~bu3<(f~{U5vUr$Hfu{cF&s^L5U2Y5>T?93B%%(H^YP25@%B9Fy z5y%*t`uRnwYq>f+Dm;Qg!cHUcHCXT&>DP6J$08zpM|O)a7AwSht=gbzRa{&IcUdXN zlopsR(`QT*@aULC-Sz4tKS&DCs`LARyMf7yQdWCBg;t2r%8RnME+f%5fQ}47XC?t9 z5_f0cMidhjWyZRi5;ZW6CwoLKV4QM(6Nm3}Ysa2n_xA^KEi>imG~!xJg5^XCQ#W&N z-|moC3?hl#zGBqXprKeTAmsGt3Pu{tD(Ob83>>ZA%eDp{s9@8)fiFi)sLs3bq$U`lmv{x zFOj6x$HD#I@k}6J@KCG}_)!HJTkRH$!l)e!64Xll&CNtR79YiGy)h{9Pau^nJyaYj zQ}+UH5^b-Lj4(-8^}(a_elUZV@)EK^$_DS!O{bUG5+$PoJ_Ui*SQf^_RF3j!$==t_ zDzr&<64#imZx z2v};OU~^<`H`o5M5b9RG77{OkDT!G{4fKWnO!Sn)508DaQcTt$YqdIR@8(o*5;In^ zk|oH+JqU7F9e*T=>GTIzoil^x%@&zOAfi0eLq4)U@i{UNsG6&AF90$Xn1H0*PYXc% z1d}9vQ3p2{!<(~lztp(&WBS5fl6_IN(u6TYLWx{j_U>YUH8>?LtraPMPlA@C{#K|Cv`$Zmp|F11o*Ma(V*;H zGr=@75-x7hL2s7Vz$pZgrLFhG9nX*nWj70}s8iII< zsFoftCwV~^-?9=qF#@)Phr_zFL8i7{i4>crVWf+V7Md*u-veC}7w5QK2aE1ts5Au zN9hNX_|Toxl3Xe@ODFsp#|**_I%hY(L!4u?w@ad`>RF?%@mQ+NZ&^LIj65q!jIxQ} ziSaatTN_8uI83#d8ueFM^?(2W3M@@V%=khILQ)d&(P*By6z>tP)0(XTCWshd~C=~ESq7ljHB7UtU9EOTBcdgIO9)(@)%KYPcYf2!(>yJ z(MaI(<1f^3(3Q)c15GrhWP89(gVogj|0nVWv66cy8aO5MIyr^HS&hH#f`n(3q75

o*H+jWf! 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 diff --git a/sites/kit.svelte.dev/src/routes/home/sveltekit-logo.svg b/sites/kit.svelte.dev/src/routes/home/sveltekit-logo.svg deleted file mode 100644 index 0f798fc18f27..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/sveltekit-logo.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sites/kit.svelte.dev/src/routes/home/volume-high.svg b/sites/kit.svelte.dev/src/routes/home/volume-high.svg deleted file mode 100644 index f0e1db86c1bd..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/volume-high.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/sites/kit.svelte.dev/src/routes/home/volume-off.svg b/sites/kit.svelte.dev/src/routes/home/volume-off.svg deleted file mode 100644 index 424d9124451b..000000000000 --- a/sites/kit.svelte.dev/src/routes/home/volume-off.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - \ No newline at end of file diff --git a/sites/kit.svelte.dev/src/routes/nav.json/+server.js b/sites/kit.svelte.dev/src/routes/nav.json/+server.js deleted file mode 100644 index c6f78ca01153..000000000000 --- a/sites/kit.svelte.dev/src/routes/nav.json/+server.js +++ /dev/null @@ -1,28 +0,0 @@ -import { get_docs_list } from '$lib/server/docs/index.js'; -import { json } from '@sveltejs/kit'; - -export const prerender = true; - -export const GET = async () => { - const docs_list = get_docs_list(); - - /** @type {import('@sveltejs/site-kit').NavigationLink[]} */ - const nav_list = [ - { - title: 'Docs', - prefix: 'docs', - pathname: '/docs/introduction', - sections: [ - { - title: 'DOCS', - sections: docs_list.map(({ title, pages }) => ({ - title, - sections: pages.map(({ title, path }) => ({ title, path })) - })) - } - ] - } - ]; - - return json(nav_list); -}; diff --git a/sites/kit.svelte.dev/src/routes/schema.json b/sites/kit.svelte.dev/src/routes/schema.json deleted file mode 100644 index c5e2b0e8987a..000000000000 --- a/sites/kit.svelte.dev/src/routes/schema.json +++ /dev/null @@ -1,89 +0,0 @@ -{ - "@context": "http://schema.org", - "@type": "SoftwareSourceCode", - "name": "SvelteKit", - "description": "SvelteKit is the official Svelte application framework.", - "url": "https://kit.svelte.dev/", - "codeRepository": "https://github.com/sveltejs/kit", - "dateCreated": "2020-10-15T16:00:00", - "programmingLanguage": ["JavaScript", "TypeScript"], - "image": "https://raw.githubusercontent.com/sveltejs/branding/master/svelte-logo.svg", - "sameAs": ["https://github.com/sveltejs/kit", "https://www.npmjs.com/package/@sveltejs/kit"], - "license": "https://github.com/sveltejs/kit/blob/main/LICENSE", - "releasedEvent": { - "@type": "PublicationEvent", - "startDate": "2022-12-14T17:00:00", - "url": [ - "https://svelte.dev/blog/announcing-sveltekit-1.0", - "https://www.youtube.com/watch?v=N4BRVkQVoMc" - ] - }, - "contributor": [ - { - "@type": "Person", - "name": "Rich Harris", - "url": "https://www.rich-harris.co.uk", - "image": "https://avatars.githubusercontent.com/u/1162160", - "sameAs": ["https://github.com/Rich-Harris", "https://twitter.com/Rich_Harris"] - }, - { - "@type": "Person", - "name": "Ben McCann", - "url": "https://www.benmccann.com", - "image": "https://avatars.githubusercontent.com/u/322311", - "sameAs": [ - "https://github.com/benmccann", - "https://twitter.com/benjaminmccann", - "https://about.me/benmccann", - "https://angel.co/ben-mccann", - "https://www.crunchbase.com/person/benjamin-mccann", - "https://www.linkedin.com/in/benmccann" - ] - }, - { - "@type": "Person", - "name": "Simon Holthausen", - "image": "https://avatars.githubusercontent.com/u/5968653", - "sameAs": ["https://github.com/dummdidumm", "https://twitter.com/dummdidumm_"] - }, - { - "@type": "Person", - "name": "Ignatius Bagus", - "url": "https://mauss.dev/", - "image": "https://avatars.githubusercontent.com/u/8156777", - "sameAs": [ - "https://twitter.com/alchemauss", - "https://github.com/ignatiusmb", - "https://gitlab.com/ignatiusmb", - "https://www.linkedin.com/in/ignatiusmb" - ] - }, - { - "@type": "Person", - "name": "Conduitry", - "url": "https://conduitry.dev/", - "image": "https://avatars.githubusercontent.com/u/16696352", - "sameAs": ["https://github.com/Conduitry"] - }, - { - "@type": "Person", - "name": "Dominik Göpel", - "url": "https://goepel.it/", - "image": "https://avatars.githubusercontent.com/u/611613", - "sameAs": ["https://github.com/dominikg", "https://m.webtoo.ls/@dominikg"] - }, - { - "@type": "Person", - "name": "Bjorn Lu", - "url": "https://bjornlu.com/", - "image": "https://avatars.githubusercontent.com/u/34116392", - "sameAs": [ - "https://github.com/bluwy", - "https://twitter.com/bluwyoo", - "https://m.webtoo.ls/@bluwy", - "https://www.linkedin.com/in/bjorn-lu-3302a31b5", - "https://www.reddit.com/user/IamLUG" - ] - } - ] -} diff --git a/sites/kit.svelte.dev/src/routes/search/+page.js b/sites/kit.svelte.dev/src/routes/search/+page.js deleted file mode 100644 index d43d0cd2a55d..000000000000 --- a/sites/kit.svelte.dev/src/routes/search/+page.js +++ /dev/null @@ -1 +0,0 @@ -export const prerender = false; diff --git a/sites/kit.svelte.dev/src/routes/search/+page.server.js b/sites/kit.svelte.dev/src/routes/search/+page.server.js deleted file mode 100644 index 10451707bfed..000000000000 --- a/sites/kit.svelte.dev/src/routes/search/+page.server.js +++ /dev/null @@ -1,20 +0,0 @@ -import { init, inited, search } from '@sveltejs/site-kit/search'; - -export async function load({ url, fetch }) { - if (!inited) { - const res = await fetch('/content.json'); - if (!res.ok) throw new Error("Couldn't fetch content"); - - const blocks = (await res.json()).blocks; - init(blocks); - } - - const query = url.searchParams.get('q'); - - const results = query ? search(query) : []; - - return { - query, - results - }; -} diff --git a/sites/kit.svelte.dev/src/routes/search/+page.svelte b/sites/kit.svelte.dev/src/routes/search/+page.svelte deleted file mode 100644 index 5056715cd8a8..000000000000 --- a/sites/kit.svelte.dev/src/routes/search/+page.svelte +++ /dev/null @@ -1,55 +0,0 @@ - - - - Search • SvelteKit - - -

-

Search

-
- -
- - -
- - diff --git a/sites/kit.svelte.dev/static/favicon.png b/sites/kit.svelte.dev/static/favicon.png deleted file mode 100644 index 21bc302b6882fcb18ab7c6fa1839e3f523199ae9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1373 zcmb7^|3A|S9LGN!$I{&9OTM!)jG`l*O1ALuZI?FRBA17zg~Bag3Yjk>(}=?;N@^#> zV~`C*RRmA> z;55j`YT0?tQ6%I2b;l|g#>IIJWQkJS=96kw`p-7^Wp`M@F`4JRp=&RzLCvi7 zfelewei(nDrDxl*l2*7W<>lFw#Ym$%!G+|U=R5hORvT6?b{Ffib@dB*iyoynF({g4 zKZs17T&vs&hLIJKFrCPPp372ySoB+1Yp}zP_iSY=%R)4T3#y6RF+L@dBQS5M4^bmJ z`4ju^jt!X(Q&;6rd6aadAQG!^*(q&e85brX6#0XAic~!(W&EB!*|~O4uZS1hdb4{uH2NjE!G-S< zO2}bbXT~(9dF_XG1K;jGrtTa12P>}L!5SXoc>0-1z9uUgKFD+#*6GxWI-1-IZ&;?@ zD^g99O5#uClt}jetf?{uL5q!xFIv}_;_0t=wBk%}ry=`Ke*sC)AmXnNH^!-OG|Sj~ zNrH>Mv<2|t2EWlt9H+d)_^QacFL4TB1Z8d)5BLPYiK{tRKM4+cHjPEi&zUt&8wCh4 zLU)A;%VD{;D21Gqh!Dn+eqGT$!=|}nLj-zVFXr1u&{s-i13N~z+~$sK!>)5-`5%p~ z5;WkXf7QP(E@zxRR-0;j$nqUCq=yu1iVf9Lv!VCb6CqAkVk02nQFtU2!0P~wLGf`y zIKT$>XYSZPIX){fSU#&-j#S88pbfSJ_nbKOHyC;Y(`Hys%%JRh(HO6g=xk!3BP$*UYS>xJh)IF2$Up)6SzJX@Rg6F@4u8!Ywt()m0 zZJAePZ89S6C)|0Ll_}7xw=>N$8ZI-0K!q5)l|Yldh$SuS0en$X&18g$GR(KKzP2hJ zo7;~QFzkJEyH|S#34ELfwvaVr-P^SS%Q1`8J2lum@Ytp3(fE2p#1e~}5sn~I5aQ&X zUe7B)EaA9oY1012*3$I*)b{0zBvbk(x*}kq ztku8OvAWZNiZai&wYVIbVd4?64N5~ZuSsb?n7g_%&2iC^1AD$tWR0v@q88qtUEO_I bedL5nFQ=R0R@YaqEHHrJMf7a;Am{!EfXa*$ diff --git a/sites/kit.svelte.dev/static/images/svelte-android-chrome-192.png b/sites/kit.svelte.dev/static/images/svelte-android-chrome-192.png deleted file mode 100644 index e3ccf280875b9e5106cbe4542213c896c3f88f88..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1986 zcmb7F`#;l*AO37^)5w^}BBh)mmsLk%8_TsR3sEjzh;yuxDVH7JBqXJ#jfGTm%|X|F zCAsC+#Wiyxxon!5`$xVF|Y7+ne>cqp&-W%TZ zzk?}k=pWF>)*BY$dDO=R+<-ms|Ir-*p4b7N!+;S4@Tw-jKmn0kY>!X4j8}AU&-lXFIVh4uc85EhwC}21B@FhO{vNixvUMD&q^7(5> z)OS-|0fSH=+_Ift?>*snDEG9fO>^1DgWQlsmH!T4V%>@+*6Wl5D%-I% z?Dv)u%UMNK6H?Iak%^QEbDA#s-;6Bv6$TRx2>s`{(@rIu`R-?udA3NF4xvA8yjY{U zm;OlwAq7&`Ze!Qf7PEf`zAJ1!T8*`p#~srl7_2Vt7l$$oL!HY29FZ|VuVWU1Auwg% zimvwbd(mj!WY-rTY#QZ8+;*$kP1=cJis~6+A#x9Kv-<$-%Vn{UuB29D;u%-zT;0nF z#i8rj>1r|{mgu!Ke7l0&=>UwdOd`rm+417;Bmxk7-`EyGrlw{lY1RBA_rKZ#c>sMI zva5}DpP~FlZ)9GqX5^-XSf0&!{l($+)5}fiJ2c#O+bM^x$wPW(cbhO!Tbicy96n&q zbLw-n9jS+u3Z5gIS6AwmD~^4L^3ZQW#YA_^4cD4q2Fw+$MECMMNJ?{>1BsZT=c9L*#xm^bym*uz9_?J!f+yd$h zgMIt~R_`~_?w9wT^dgHwDazzm9+$~Z#fTrIZ9&*}eGhmDUKBNVuoQngxvC3KkC;jC zm+G<&!t~e#^Gn`3LYI5VRy4tMMo5{lO0O!tz{&EDa>FD*x|(%ANQYd~S7CVSGfKF% z2)vuG>yNuTXbm5kiva7?CxpKHgebfp3bzA_1&j36pL zRIXFQm-Y>uRyRq03p?YjR?SmIB*`B7$rE0r*4MvBzq0FpW)uktHQ;BbiXop5Xb9~h zrv{q4(6R9G4+Ta?q*nz%1jGQf*LutzSDcU>1|XqPSGpglWvf|hr#!F;8~QCRn4M-l zP_jmY3JTr9cYC&Nleb% z+5cYF7W51Q{4Jh$HK5z868{=3ce7B4h=JX4&TYJ+S9ypSJ*;vkc%VUKNgg|L=FfU; zjW5m4$H?Z_;?*7xFPTC^@q}b%AQ-}J*9pJq^X=s*Hn3Pq*~ac_eL@c?;&k?Q#P})4aR^U~&lErww#V?5- zP4vw>F;Kcak8cCPn0Ac@O0`DjJ4DmgNC-b0FDk)(%@~W`59O*Rgl z@}9Zw^;L}^>(%BT=f#TJ^`+?)YD*n*=&iBtm_BY-2^Ia6LSB``Fs|h)ZiK4kaK=oS zD-j2y=6#o^P|*!hO0%RU?Ac&GFO3f5OY;pOBdpSR%OCfs=n)qfRZy-e?y^LCS8BJy z=SZv0iM7aMUm@H$v%$4^s=(n?ItRs*!`-3ehZ`#i N5M4;lFCBxD{{<6>)yMz< diff --git a/sites/kit.svelte.dev/static/images/svelte-android-chrome-512.png b/sites/kit.svelte.dev/static/images/svelte-android-chrome-512.png deleted file mode 100644 index e673c91c7bcb0e3a1be737745af56990613a641e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5185 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 diff --git a/sites/kit.svelte.dev/static/images/svelte-kit-horizontal.svg b/sites/kit.svelte.dev/static/images/svelte-kit-horizontal.svg deleted file mode 100644 index 9fe9b630d4fc..000000000000 --- a/sites/kit.svelte.dev/static/images/svelte-kit-horizontal.svg +++ /dev/null @@ -1 +0,0 @@ - \ No newline at end of file diff --git a/sites/kit.svelte.dev/static/images/twitter-thumbnail.jpg b/sites/kit.svelte.dev/static/images/twitter-thumbnail.jpg deleted file mode 100644 index 0ef1eded0df6aa7e31c0c36d6b38cf41e158a7c2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 65292 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®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
`Ros_i(UhM7f1%eZ!h+H4#kbKdB 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 - SvelteKit - Search SvelteKit - UTF-8 - https://kit.svelte.dev/favicon.png - - https://kit.svelte.dev/search - \ No newline at end of file diff --git a/sites/kit.svelte.dev/static/robots.txt b/sites/kit.svelte.dev/static/robots.txt deleted file mode 100644 index e9e57dc4d41b..000000000000 --- a/sites/kit.svelte.dev/static/robots.txt +++ /dev/null @@ -1,3 +0,0 @@ -# https://www.robotstxt.org/robotstxt.html -User-agent: * -Disallow: diff --git a/sites/kit.svelte.dev/svelte.config.js b/sites/kit.svelte.dev/svelte.config.js deleted file mode 100644 index 46575d85e0fd..000000000000 --- a/sites/kit.svelte.dev/svelte.config.js +++ /dev/null @@ -1,16 +0,0 @@ -import adapter from '@sveltejs/adapter-vercel'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - kit: { - adapter: adapter({ - runtime: 'edge' - }), - - paths: { - relative: true - } - } -}; - -export default config; diff --git a/sites/kit.svelte.dev/tsconfig.json b/sites/kit.svelte.dev/tsconfig.json deleted file mode 100644 index b7507e5607cf..000000000000 --- a/sites/kit.svelte.dev/tsconfig.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "allowSyntheticDefaultImports": true, - "module": "es2022", - "moduleResolution": "bundler", - "outDir": "build" - } -} diff --git a/sites/kit.svelte.dev/vercel.json b/sites/kit.svelte.dev/vercel.json deleted file mode 100644 index c3c586fb80d1..000000000000 --- a/sites/kit.svelte.dev/vercel.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "$schema": "http://openapi.vercel.sh/vercel.json", - "github": { - "silent": true - }, - "trailingSlash": false, - "installCommand": "pnpm install --frozen-lockfile --verbose && pnpm rebuild", - "buildCommand": "cd ../../packages/kit && pnpm prepublishOnly && cd ../../sites/kit.svelte.dev && pnpm build" -} diff --git a/sites/kit.svelte.dev/vite.config.js b/sites/kit.svelte.dev/vite.config.js deleted file mode 100644 index 957d499557bb..000000000000 --- a/sites/kit.svelte.dev/vite.config.js +++ /dev/null @@ -1,38 +0,0 @@ -import { sveltekit } from '@sveltejs/kit/vite'; -import { enhancedImages } from '@sveltejs/enhanced-img'; -import browserslist from 'browserslist'; -import { browserslistToTargets } from 'lightningcss'; - -/** @type {import('vite').UserConfig} */ -const config = { - assetsInclude: ['**/*.vtt'], - - logLevel: 'info', - - css: { - transformer: 'lightningcss', - lightningcss: { - targets: browserslistToTargets(browserslist(['>0.2%', 'not dead'])) - } - }, - build: { - cssMinify: 'lightningcss' - }, - - plugins: [enhancedImages(), sveltekit()], - - ssr: { - noExternal: ['@sveltejs/site-kit'] - }, - optimizeDeps: { - exclude: ['@sveltejs/site-kit'] - }, - - server: { - fs: { - strict: false - } - } -}; - -export default config; From d9f9a44608753948d7f580225df6128b9a865d2f Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:10:15 -0700 Subject: [PATCH 0692/1135] docs: update site location in contributors guide --- CONTRIBUTING.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 2784d08a49dc..ca6709e3b704 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -101,7 +101,7 @@ If you would like to test local changes to Vite or another dependency, you can b ## Documentation changes -All documentation for SvelteKit is in the [`documentation` directory](https://github.com/sveltejs/kit/tree/main/documentation), and any improvements should be made as a Pull Request to this repository. The site itself is located in the [`sites/kit.svelte.dev` directory](https://github.com/sveltejs/kit/tree/main/sites/kit.svelte.dev) and can be run locally to preview changes. +All documentation for SvelteKit is in the [`documentation` directory](https://github.com/sveltejs/kit/tree/main/documentation), and any improvements should be made as a Pull Request to this repository. The site itself is located in the [`sveltejs/svelte.dev` repo](https://github.com/sveltejs/svelte.dev) and can be run locally to preview changes. ## Sending PRs From 1f0a5f5023fe18776fa9d35290559abd2de4638a Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:12:29 -0700 Subject: [PATCH 0693/1135] docs: update URL in root readme --- README.md | 2 +- package.json | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index 77de1f97d21a..bdc90a935771 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ # SvelteKit -Web development, streamlined. Read the [documentation](https://kit.svelte.dev/docs) to get started. +Web development, streamlined. Read the [documentation](https://svelte.dev/docs/kit) to get started. ### Packages diff --git a/package.json b/package.json index 7c2bb37ed198..9fe848d2e078 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,6 @@ "precommit": "pnpm format && pnpm lint", "changeset:version": "changeset version && pnpm -r generate:version && git add --all", "changeset:release": "changeset publish", - "start": "cd sites/kit.svelte.dev && npm run dev", "build": "pnpm --filter @sveltejs/* -r build", "sync-all": "node scripts/sync-all.js" }, From 6f2a9c8b5c06c8999b33740502c70efaedd568ea Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:15:23 -0700 Subject: [PATCH 0694/1135] fix: remove pointer to deleted file --- packages/kit/tsconfig.json | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/packages/kit/tsconfig.json b/packages/kit/tsconfig.json index 0b7f9d49aa6d..96f45f67488e 100644 --- a/packages/kit/tsconfig.json +++ b/packages/kit/tsconfig.json @@ -21,8 +21,7 @@ "*.js", "scripts/**/*", "src/**/*", - "src/types/**/*", - "../../sites/kit.svelte.dev/scripts/extract-types.js" + "src/types/**/*" ], "exclude": ["./**/write_types/test/**"] } From 12c034d1692d32b7e27efb379330f2e37b1053ac Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 12:23:23 -0700 Subject: [PATCH 0695/1135] docs: update URLs --- documentation/docs/20-core-concepts/20-load.md | 2 +- documentation/docs/25-build-and-deploy/30-adapter-auto.md | 2 +- .../docs/25-build-and-deploy/60-adapter-cloudflare.md | 6 +++--- .../25-build-and-deploy/70-adapter-cloudflare-workers.md | 2 +- .../docs/25-build-and-deploy/80-adapter-netlify.md | 4 ++-- documentation/docs/25-build-and-deploy/90-adapter-vercel.md | 2 +- documentation/docs/40-best-practices/05-performance.md | 2 +- documentation/docs/40-best-practices/07-images.md | 2 +- documentation/docs/40-best-practices/10-accessibility.md | 2 +- documentation/docs/60-appendix/50-additional-resources.md | 3 +-- documentation/docs/60-appendix/60-glossary.md | 2 +- 11 files changed, 14 insertions(+), 15 deletions(-) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 786312625217..6396b9a4b5e0 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -34,7 +34,7 @@ export function load({ params }) { Thanks to the generated `$types` module, we get full type safety. -A `load` function in a `+page.js` file runs both on the server and in the browser (unless combined with `export const ssr = false`, in which case it will [only run in the browser](https://kit.svelte.dev/docs/page-options#ssr)). If your `load` function should _always_ run on the server (because it uses private environment variables, for example, or accesses a database) then it would go in a `+page.server.js` instead. +A `load` function in a `+page.js` file runs both on the server and in the browser (unless combined with `export const ssr = false`, in which case it will [only run in the browser](page-options#ssr)). If your `load` function should _always_ run on the server (because it uses private environment variables, for example, or accesses a database) then it would go in a `+page.server.js` instead. A more realistic version of your blog post's `load` function, that only runs on the server and pulls data from a database, might look like this: diff --git a/documentation/docs/25-build-and-deploy/30-adapter-auto.md b/documentation/docs/25-build-and-deploy/30-adapter-auto.md index a1c682168c88..be55193b0fdc 100644 --- a/documentation/docs/25-build-and-deploy/30-adapter-auto.md +++ b/documentation/docs/25-build-and-deploy/30-adapter-auto.md @@ -9,7 +9,7 @@ When you create a new SvelteKit project with `npx sv create`, it installs [`adap - [`@sveltejs/adapter-vercel`](adapter-vercel) for [Vercel](https://vercel.com/) - [`svelte-adapter-azure-swa`](https://github.com/geoffrich/svelte-adapter-azure-swa) for [Azure Static Web Apps](https://docs.microsoft.com/en-us/azure/static-web-apps/) - [`svelte-kit-sst`](https://github.com/sst/sst/tree/master/packages/svelte-kit-sst) for [AWS via SST](https://sst.dev/docs/start/aws/svelte) -- [`@sveltejs/adapter-node`](https://kit.svelte.dev/docs/adapter-node) for [Google Cloud Run](https://cloud.google.com/run) +- [`@sveltejs/adapter-node`](adapter-node) for [Google Cloud Run](https://cloud.google.com/run) It's recommended to install the appropriate adapter to your `devDependencies` once you've settled on a target environment, since this will add the adapter to your lockfile and slightly improve install times on CI. diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index 9626b6689a0e..b1dea91bdd6b 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -108,11 +108,11 @@ For testing the build, you should use [wrangler](https://developers.cloudflare.c ## Notes -Functions contained in the `/functions` directory at the project's root will _not_ be included in the deployment, which is compiled to a [single `_worker.js` file](https://developers.cloudflare.com/pages/platform/functions/#advanced-mode). Functions should be implemented as [server endpoints](https://kit.svelte.dev/docs/routing#server) in your SvelteKit app. +Functions contained in the `/functions` directory at the project's root will _not_ be included in the deployment, which is compiled to a [single `_worker.js` file](https://developers.cloudflare.com/pages/platform/functions/#advanced-mode). Functions should be implemented as [server endpoints](routing#server) in your SvelteKit app. The `_headers` and `_redirects` files specific to Cloudflare Pages can be used for static asset responses (like images) by putting them into the `/static` folder. -However, they will have no effect on responses dynamically rendered by SvelteKit, which should return custom headers or redirect responses from [server endpoints](https://kit.svelte.dev/docs/routing#server) or with the [`handle`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) hook. +However, they will have no effect on responses dynamically rendered by SvelteKit, which should return custom headers or redirect responses from [server endpoints](routing#server) or with the [`handle`](hooks#Server-hooks-handle) hook. ## Troubleshooting @@ -122,4 +122,4 @@ You may wish to refer to [Cloudflare's documentation for deploying a SvelteKit s ### Accessing the file system -You can't use `fs` in Cloudflare Workers — you must [prerender](https://kit.svelte.dev/docs/page-options#prerender) the routes in question. +You can't use `fs` in Cloudflare Workers — you must [prerender](page-options#prerender) the routes in question. diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index 8caaad4200ea..6635f566d38a 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -135,4 +135,4 @@ When deploying to workers, the server generated by SvelteKit is bundled into a s ### Accessing the file system -You can't use `fs` in Cloudflare Workers — you must [prerender](https://kit.svelte.dev/docs/page-options#prerender) the routes in question. +You can't use `fs` in Cloudflare Workers — you must [prerender](page-options#prerender) the routes in question. diff --git a/documentation/docs/25-build-and-deploy/80-adapter-netlify.md b/documentation/docs/25-build-and-deploy/80-adapter-netlify.md index a9d5702b3b14..575a706ff1eb 100644 --- a/documentation/docs/25-build-and-deploy/80-adapter-netlify.md +++ b/documentation/docs/25-build-and-deploy/80-adapter-netlify.md @@ -80,7 +80,7 @@ During compilation, redirect rules are automatically appended to your `_redirect ### Netlify Forms 1. Create your Netlify HTML form as described [here](https://docs.netlify.com/forms/setup/#html-forms), e.g. as `/routes/contact/+page.svelte`. (Don't forget to add the hidden `form-name` input element!) -2. Netlify's build bot parses your HTML files at deploy time, which means your form must be [prerendered](https://kit.svelte.dev/docs/page-options#prerender) as HTML. You can either add `export const prerender = true` to your `contact.svelte` to prerender just that page or set the `kit.prerender.force: true` option to prerender all pages. +2. Netlify's build bot parses your HTML files at deploy time, which means your form must be [prerendered](page-options#prerender) as HTML. You can either add `export const prerender = true` to your `contact.svelte` to prerender just that page or set the `kit.prerender.force: true` option to prerender all pages. 3. If your Netlify form has a [custom success message](https://docs.netlify.com/forms/setup/#success-messages) like `
` then ensure the corresponding `/routes/success/+page.svelte` exists and is prerendered. ### Netlify Functions @@ -115,4 +115,4 @@ You can't use `fs` in edge deployments. You _can_ use it in serverless deployments, but it won't work as expected, since files are not copied from your project into your deployment. Instead, use the `read` function from `$app/server` to access your files. `read` does not work inside edge deployments (this may change in future). -Alternatively, you can [prerender](https://kit.svelte.dev/docs/page-options#prerender) the routes in question. +Alternatively, you can [prerender](page-options#prerender) the routes in question. diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index 1d203fb3acaa..226d8cb6cae1 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -161,7 +161,7 @@ Cookie-based skew protection comes with one caveat: if a user has multiple versi ### Vercel functions -If you have Vercel functions contained in the `api` directory at the project's root, any requests for `/api/*` will _not_ be handled by SvelteKit. You should implement these as [API routes](https://kit.svelte.dev/docs/routing#server) in your SvelteKit app instead, unless you need to use a non-JavaScript language in which case you will need to ensure that you don't have any `/api/*` routes in your SvelteKit app. +If you have Vercel functions contained in the `api` directory at the project's root, any requests for `/api/*` will _not_ be handled by SvelteKit. You should implement these as [API routes](routing#server) in your SvelteKit app instead, unless you need to use a non-JavaScript language in which case you will need to ensure that you don't have any `/api/*` routes in your SvelteKit app. ### Node version diff --git a/documentation/docs/40-best-practices/05-performance.md b/documentation/docs/40-best-practices/05-performance.md index 25f332e3ddf0..390236d9a2f7 100644 --- a/documentation/docs/40-best-practices/05-performance.md +++ b/documentation/docs/40-best-practices/05-performance.md @@ -93,7 +93,7 @@ One of the biggest performance killers is what is referred to as a _waterfall_, ## Hosting -Your frontend should be located in the same data center as your backend to minimize latency. For sites with no central backend, many SvelteKit adapters support deploying to the _edge_, which means handling each user's requests from a nearby server. This can reduce load times significantly. Some adapters even support [configuring deployment on a per-route basis](https://kit.svelte.dev/docs/page-options#config). You should also consider serving images from a CDN (which are typically edge networks) — the hosts for many SvelteKit adapters will do this automatically. +Your frontend should be located in the same data center as your backend to minimize latency. For sites with no central backend, many SvelteKit adapters support deploying to the _edge_, which means handling each user's requests from a nearby server. This can reduce load times significantly. Some adapters even support [configuring deployment on a per-route basis](page-options#config). You should also consider serving images from a CDN (which are typically edge networks) — the hosts for many SvelteKit adapters will do this automatically. Ensure your host uses HTTP/2 or newer. Vite's code splitting creates numerous small files for improved cacheability, which results in excellent performance, but this does assume that your files can be loaded in parallel with HTTP/2. diff --git a/documentation/docs/40-best-practices/07-images.md b/documentation/docs/40-best-practices/07-images.md index 4dd9219e0bcd..5c7040b32be9 100644 --- a/documentation/docs/40-best-practices/07-images.md +++ b/documentation/docs/40-best-practices/07-images.md @@ -71,7 +71,7 @@ If you wish to add styles to your ``, you should add a `class` and ### Dynamically choosing an image -You can also manually import an image asset and pass it to an ``. This is useful when you have a collection of static images and would like to dynamically choose one or [iterate over them](https://github.com/sveltejs/kit/blob/main/sites/kit.svelte.dev/src/routes/home/Showcase.svelte). In this case you will need to update both the `import` statement and `` element as shown below to indicate you'd like process them. +You can also manually import an image asset and pass it to an ``. This is useful when you have a collection of static images and would like to dynamically choose one or [iterate over them](https://github.com/sveltejs/kit/blob/0ab1733e394b6310895a1d3bf0f126ce34531170/sites/kit.svelte.dev/src/routes/home/Showcase.svelte). In this case you will need to update both the `import` statement and `` element as shown below to indicate you'd like process them. ```svelte ``` diff --git a/documentation/docs/30-advanced/10-advanced-routing.md b/documentation/docs/30-advanced/10-advanced-routing.md index 5abfcbe83390..07044fa7bcc7 100644 --- a/documentation/docs/30-advanced/10-advanced-routing.md +++ b/documentation/docs/30-advanced/10-advanced-routing.md @@ -287,4 +287,4 @@ export function load(event) { ## Further reading -- [Tutorial: Advanced Routing](https://learn.svelte.dev/tutorial/optional-params) +- [Tutorial: Advanced Routing](../tutorial/kit/optional-params) diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index 7ae631064456..c2f3408498c5 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -270,4 +270,4 @@ Using `reroute` will _not_ change the contents of the browser's address bar, or ## Further reading -- [Tutorial: Hooks](https://learn.svelte.dev/tutorial/handle) +- [Tutorial: Hooks](../tutorial/kit/handle) diff --git a/documentation/docs/30-advanced/25-errors.md b/documentation/docs/30-advanced/25-errors.md index 76351d633cc9..63fbd83cc2c4 100644 --- a/documentation/docs/30-advanced/25-errors.md +++ b/documentation/docs/30-advanced/25-errors.md @@ -144,5 +144,5 @@ This interface always includes a `message: string` property. ## Further reading -- [Tutorial: Errors and redirects](https://learn.svelte.dev/tutorial/error-basics) -- [Tutorial: Hooks](https://learn.svelte.dev/tutorial/handle) +- [Tutorial: Errors and redirects](../tutorial/kit/error-basics) +- [Tutorial: Hooks](../tutorial/kit/handle) diff --git a/documentation/docs/30-advanced/50-server-only-modules.md b/documentation/docs/30-advanced/50-server-only-modules.md index 698d00484024..e20f9caa0925 100644 --- a/documentation/docs/30-advanced/50-server-only-modules.md +++ b/documentation/docs/30-advanced/50-server-only-modules.md @@ -61,4 +61,4 @@ This feature also works with dynamic imports, even interpolated ones like ``awai ## Further reading -- [Tutorial: Environment variables](https://learn.svelte.dev/tutorial/env-static-private) +- [Tutorial: Environment variables](../tutorial/kit/env-static-private) From e753c0bfe44cf70bed8ba75674f9695268d7b515 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:09:15 -0700 Subject: [PATCH 0697/1135] docs: update links --- documentation/docs/10-getting-started/10-introduction.md | 4 ++-- .../docs/10-getting-started/20-creating-a-project.md | 2 +- documentation/docs/20-core-concepts/10-routing.md | 2 +- documentation/docs/20-core-concepts/20-load.md | 2 +- documentation/docs/40-best-practices/10-accessibility.md | 2 +- documentation/docs/40-best-practices/20-seo.md | 2 +- documentation/docs/60-appendix/10-faq.md | 6 +++--- documentation/docs/60-appendix/25-debugging.md | 2 +- .../docs/60-appendix/30-migrating-to-sveltekit-2.md | 4 ++-- documentation/docs/60-appendix/50-additional-resources.md | 4 ++-- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/documentation/docs/10-getting-started/10-introduction.md b/documentation/docs/10-getting-started/10-introduction.md index 1e33f2a5617f..2e7cae50029f 100644 --- a/documentation/docs/10-getting-started/10-introduction.md +++ b/documentation/docs/10-getting-started/10-introduction.md @@ -10,13 +10,13 @@ title: Introduction ## What is SvelteKit? -SvelteKit is a framework for rapidly developing robust, performant web applications using [Svelte](https://svelte.dev/). If you're coming from React, SvelteKit is similar to Next. If you're coming from Vue, SvelteKit is similar to Nuxt. +SvelteKit is a framework for rapidly developing robust, performant web applications using [Svelte](../svelte). If you're coming from React, SvelteKit is similar to Next. If you're coming from Vue, SvelteKit is similar to Nuxt. To learn more about the kinds of applications you can build with SvelteKit, see the [FAQ](faq#What-can-I-make-with-SvelteKit). ## What is Svelte? -In short, Svelte is a way of writing user interface components — like a navigation bar, comment section, or contact form — that users see and interact with in their browsers. The Svelte compiler converts your components to JavaScript that can be run to render the HTML for the page and to CSS that styles the page. You don't need to know Svelte to understand the rest of this guide, but it will help. If you'd like to learn more, check out [the Svelte tutorial](https://svelte.dev/tutorial). +In short, Svelte is a way of writing user interface components — like a navigation bar, comment section, or contact form — that users see and interact with in their browsers. The Svelte compiler converts your components to JavaScript that can be run to render the HTML for the page and to CSS that styles the page. You don't need to know Svelte to understand the rest of this guide, but it will help. If you'd like to learn more, check out [the Svelte tutorial](/tutorial). ## SvelteKit vs Svelte diff --git a/documentation/docs/10-getting-started/20-creating-a-project.md b/documentation/docs/10-getting-started/20-creating-a-project.md index d86d1e3d1aac..4219449d1f1a 100644 --- a/documentation/docs/10-getting-started/20-creating-a-project.md +++ b/documentation/docs/10-getting-started/20-creating-a-project.md @@ -15,7 +15,7 @@ The first command will scaffold a new project in the `my-app` directory asking y There are two basic concepts: -- Each page of your app is a [Svelte](https://svelte.dev) component +- Each page of your app is a [Svelte](../svelte) component - You create pages by adding files to the `src/routes` directory of your project. These will be server-rendered so that a user's first visit to your app is as fast as possible, then a client-side app takes over Try editing the files to get a feel for how everything works. diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 3024990032ca..2d8845e77c45 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -384,7 +384,7 @@ In turn, annotating the `load` function with `PageLoad`, `PageServerLoad`, `Layo If you're using VS Code or any IDE that supports the language server protocol and TypeScript plugins then you can omit these types _entirely_! Svelte's IDE tooling will insert the correct types for you, so you'll get type checking without writing them yourself. It also works with our command line tool `svelte-check`. -You can read more about omitting `$types` in our [blog post](https://svelte.dev/blog/zero-config-type-safety) about it. +You can read more about omitting `$types` in our [blog post](/blog/zero-config-type-safety) about it. ## Other files diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 2643741e983f..2a75cc5ca2f1 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -675,7 +675,7 @@ To summarize, a `load` function will rerun in the following situations: `params` and `url` can change in response to a `` link click, a [`` interaction](form-actions#GET-vs-POST), a [`goto`]($app-navigation#goto) invocation, or a [`redirect`](@sveltejs-kit#redirect). -Note that rerunning a `load` function will update the `data` prop inside the corresponding `+layout.svelte` or `+page.svelte`; it does _not_ cause the component to be recreated. As a result, internal state is preserved. If this isn't what you want, you can reset whatever you need to reset inside an [`afterNavigate`]($app-navigation#afterNavigate) callback, and/or wrap your component in a [`{#key ...}`](https://svelte.dev/docs#template-syntax-key) block. +Note that rerunning a `load` function will update the `data` prop inside the corresponding `+layout.svelte` or `+page.svelte`; it does _not_ cause the component to be recreated. As a result, internal state is preserved. If this isn't what you want, you can reset whatever you need to reset inside an [`afterNavigate`]($app-navigation#afterNavigate) callback, and/or wrap your component in a [`{#key ...}`](../svelte/key) block. ## Implications for authentication diff --git a/documentation/docs/40-best-practices/10-accessibility.md b/documentation/docs/40-best-practices/10-accessibility.md index 9651a8833265..ffa4a0852e68 100644 --- a/documentation/docs/40-best-practices/10-accessibility.md +++ b/documentation/docs/40-best-practices/10-accessibility.md @@ -2,7 +2,7 @@ title: Accessibility --- -SvelteKit strives to provide an accessible platform for your app by default. Svelte's [compile-time accessibility checks](https://svelte.dev/docs#accessibility-warnings) will also apply to any SvelteKit application you build. +SvelteKit strives to provide an accessible platform for your app by default. Svelte's [compile-time accessibility checks](../svelte/compiler-warnings) will also apply to any SvelteKit application you build. Here's how SvelteKit's built-in accessibility features work and what you need to do to help these features to work as well as possible. Keep in mind that while SvelteKit provides an accessible foundation, you are still responsible for making sure your application code is accessible. If you're new to accessibility, see the ["further reading"](accessibility#Further-reading) section of this guide for additional resources. diff --git a/documentation/docs/40-best-practices/20-seo.md b/documentation/docs/40-best-practices/20-seo.md index 46bb92a8114f..232d2393fe82 100644 --- a/documentation/docs/40-best-practices/20-seo.md +++ b/documentation/docs/40-best-practices/20-seo.md @@ -24,7 +24,7 @@ SvelteKit redirects pathnames with trailing slashes to ones without (or vice ver ### <title> and <meta> -Every page should have well-written and unique `` and `<meta name="description">` elements inside a [`<svelte:head>`](https://svelte.dev/docs#template-syntax-svelte-head). Guidance on how to write descriptive titles and descriptions, along with other suggestions on making content understandable by search engines, can be found on Google's [Lighthouse SEO audits](https://web.dev/lighthouse-seo/) documentation. +Every page should have well-written and unique `<title>` and `<meta name="description">` elements inside a [`<svelte:head>`](../svelte/svelte-head). Guidance on how to write descriptive titles and descriptions, along with other suggestions on making content understandable by search engines, can be found on Google's [Lighthouse SEO audits](https://web.dev/lighthouse-seo/) documentation. > [!NOTE] A common pattern is to return SEO-related `data` from page [`load`](load) functions, then use it (as [`$page.data`]($app-stores)) in a `<svelte:head>` in your root [layout](routing#layout). diff --git a/documentation/docs/60-appendix/10-faq.md b/documentation/docs/60-appendix/10-faq.md index aa789e0723ee..4e0b2d536c13 100644 --- a/documentation/docs/60-appendix/10-faq.md +++ b/documentation/docs/60-appendix/10-faq.md @@ -4,7 +4,7 @@ title: Frequently asked questions ## Other resources -Please see [the Svelte FAQ](https://svelte.dev/faq) and [`vite-plugin-svelte` FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md) as well for the answers to questions deriving from those libraries. +Please see [the Svelte FAQ](../svelte/faq) and [`vite-plugin-svelte` FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md) as well for the answers to questions deriving from those libraries. ## What can I make with SvelteKit? @@ -29,7 +29,7 @@ It is also possible to write custom adapters or leverage community adapters to d ## How do I use HMR with SvelteKit? -SvelteKit has HMR enabled by default powered by [svelte-hmr](https://github.com/sveltejs/svelte-hmr). If you saw [Rich's presentation at the 2020 Svelte Summit](https://svelte.dev/blog/whats-the-deal-with-sveltekit), you may have seen a more powerful-looking version of HMR presented. This demo had `svelte-hmr`'s `preserveLocalState` flag on. This flag is now off by default because it may lead to unexpected behaviour and edge cases. But don't worry, you are still getting HMR with SvelteKit! If you'd like to preserve local state you can use the `@hmr:keep` or `@hmr:keep-all` directives as documented on the [svelte-hmr](https://github.com/sveltejs/svelte-hmr) page. +SvelteKit has HMR enabled by default powered by [svelte-hmr](https://github.com/sveltejs/svelte-hmr). If you saw [Rich's presentation at the 2020 Svelte Summit](/blog/whats-the-deal-with-sveltekit), you may have seen a more powerful-looking version of HMR presented. This demo had `svelte-hmr`'s `preserveLocalState` flag on. This flag is now off by default because it may lead to unexpected behaviour and edge cases. But don't worry, you are still getting HMR with SvelteKit! If you'd like to preserve local state you can use the `@hmr:keep` or `@hmr:keep-all` directives as documented on the [svelte-hmr](https://github.com/sveltejs/svelte-hmr) page. ## How do I include details from package.json in my application? @@ -83,7 +83,7 @@ onNavigate((navigation) => { }); ``` -For more, see ["Unlocking view transitions"](https://svelte.dev/blog/view-transitions) on the Svelte blog. +For more, see ["Unlocking view transitions"](/blog/view-transitions) on the Svelte blog. ## How do I use X with SvelteKit? diff --git a/documentation/docs/60-appendix/25-debugging.md b/documentation/docs/60-appendix/25-debugging.md index b07b31abe9d2..f033622f9ab9 100644 --- a/documentation/docs/60-appendix/25-debugging.md +++ b/documentation/docs/60-appendix/25-debugging.md @@ -2,7 +2,7 @@ title: Breakpoint Debugging --- -In addition to the [`@debug`](https://svelte.dev/docs/special-tags#debug) tag, you can also debug Svelte and SvelteKit projects using breakpoints within various tools and development environments. This includes both frontend and backend code. +In addition to the [`@debug`](../svelte/debug) tag, you can also debug Svelte and SvelteKit projects using breakpoints within various tools and development environments. This includes both frontend and backend code. The following guides assume your JavaScript runtime environment is Node.js. diff --git a/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md b/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md index 148d8b08b63a..ab2f6808ab17 100644 --- a/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md +++ b/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md @@ -4,7 +4,7 @@ title: Migrating to SvelteKit v2 Upgrading from SvelteKit version 1 to version 2 should be mostly seamless. There are a few breaking changes to note, which are listed here. You can use `npx sv migrate sveltekit-2` to migrate some of these changes automatically. -We highly recommend upgrading to the most recent 1.x version before upgrading to 2.0, so that you can take advantage of targeted deprecation warnings. We also recommend [updating to Svelte 4](https://svelte.dev/docs/v4-migration-guide) first: Later versions of SvelteKit 1.x support it, and SvelteKit 2.0 requires it. +We highly recommend upgrading to the most recent 1.x version before upgrading to 2.0, so that you can take advantage of targeted deprecation warnings. We also recommend [updating to Svelte 4](../svelte/v4-migration-guide) first: Later versions of SvelteKit 1.x support it, and SvelteKit 2.0 requires it. ## `redirect` and `error` are no longer thrown by you @@ -40,7 +40,7 @@ export function load({ cookies }) { ## Top-level promises are no longer awaited -In SvelteKit version 1, if the top-level properties of the object returned from a `load` function were promises, they were automatically awaited. With the introduction of [streaming](https://svelte.dev/blog/streaming-snapshots-sveltekit) this behavior became a bit awkward as it forces you to nest your streamed data one level deep. +In SvelteKit version 1, if the top-level properties of the object returned from a `load` function were promises, they were automatically awaited. With the introduction of [streaming](/blog/streaming-snapshots-sveltekit) this behavior became a bit awkward as it forces you to nest your streamed data one level deep. As of version 2, SvelteKit no longer differentiates between top-level and non-top-level promises. To get back the blocking behavior, use `await` (with `Promise.all` to prevent waterfalls, where appropriate): diff --git a/documentation/docs/60-appendix/50-additional-resources.md b/documentation/docs/60-appendix/50-additional-resources.md index 01c43d53a341..f59f0faadf59 100644 --- a/documentation/docs/60-appendix/50-additional-resources.md +++ b/documentation/docs/60-appendix/50-additional-resources.md @@ -4,9 +4,9 @@ title: Additional resources ## FAQs -Please see the [SvelteKit FAQ](../faq) for solutions to common issues and helpful tips and tricks. +Please see the [SvelteKit FAQ](faq) for solutions to common issues and helpful tips and tricks. -The [Svelte FAQ](https://svelte.dev/faq) and [`vite-plugin-svelte` FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md) may also be helpful for questions deriving from those libraries. +The [Svelte FAQ](../svelte/faq) and [`vite-plugin-svelte` FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md) may also be helpful for questions deriving from those libraries. ## Examples From ea7d024a818d05903bc4fb1330b74a86e8d0245e Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:16:11 -0700 Subject: [PATCH 0698/1135] docs: update playground links --- playgrounds/basic/jsconfig.json | 2 +- playgrounds/basic/src/app.d.ts | 2 +- playgrounds/basic/src/routes/+page.svelte | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/playgrounds/basic/jsconfig.json b/playgrounds/basic/jsconfig.json index fe45e13fdd06..1801420ff9f0 100644 --- a/playgrounds/basic/jsconfig.json +++ b/playgrounds/basic/jsconfig.json @@ -10,7 +10,7 @@ "sourceMap": true, "strict": true } - // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias and https://kit.svelte.dev/docs/configuration#files + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias and https://svelte.dev/docs/kit/configuration#files // // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes // from the referenced tsconfig.json - TypeScript does not merge them in diff --git a/playgrounds/basic/src/app.d.ts b/playgrounds/basic/src/app.d.ts index f59b884c51ed..9746bdf0ef82 100644 --- a/playgrounds/basic/src/app.d.ts +++ b/playgrounds/basic/src/app.d.ts @@ -1,4 +1,4 @@ -// See https://kit.svelte.dev/docs/types#app +// See https://svelte.dev/docs/kit/types#app.d.ts // for information about these interfaces declare global { namespace App { diff --git a/playgrounds/basic/src/routes/+page.svelte b/playgrounds/basic/src/routes/+page.svelte index 5982b0ae37dd..cc88df0ea352 100644 --- a/playgrounds/basic/src/routes/+page.svelte +++ b/playgrounds/basic/src/routes/+page.svelte @@ -1,2 +1,2 @@ <h1>Welcome to SvelteKit</h1> -<p>Visit <a href="https://kit.svelte.dev">kit.svelte.dev</a> to read the documentation</p> +<p>Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation</p> From 8ec471c875345b751344e67580ff1b772ef2735b Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:24:58 -0700 Subject: [PATCH 0699/1135] docs: update URLs for new svelte.dev site (#12857) --- .changeset/strange-plums-drop.md | 16 +++ packages/adapter-auto/README.md | 2 +- packages/adapter-auto/index.js | 2 +- packages/adapter-auto/package.json | 2 +- packages/adapter-cloudflare-workers/README.md | 2 +- .../adapter-cloudflare-workers/package.json | 2 +- packages/adapter-cloudflare/README.md | 4 +- packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/README.md | 2 +- packages/adapter-netlify/index.js | 2 +- packages/adapter-netlify/package.json | 2 +- packages/adapter-node/README.md | 4 +- packages/adapter-node/package.json | 2 +- packages/adapter-static/README.md | 4 +- packages/adapter-static/index.js | 6 +- packages/adapter-static/package.json | 2 +- .../adapter-static/test/apps/spa/README.md | 2 +- packages/adapter-vercel/README.md | 2 +- packages/adapter-vercel/package.json | 2 +- packages/amp/package.json | 2 +- packages/enhanced-img/README.md | 2 +- packages/enhanced-img/package.json | 2 +- packages/enhanced-img/types/index.d.ts | 2 +- packages/kit/CHANGELOG.md | 6 +- packages/kit/README.md | 6 +- packages/kit/package.json | 2 +- packages/kit/src/core/config/index.js | 2 +- packages/kit/src/core/config/index.spec.js | 16 +-- packages/kit/src/core/config/options.js | 16 +-- packages/kit/src/core/postbuild/prerender.js | 12 +- packages/kit/src/core/sync/write_ambient.js | 2 +- packages/kit/src/core/sync/write_tsconfig.js | 2 +- packages/kit/src/exports/public.d.ts | 94 +++++++------- packages/kit/src/exports/vite/dev/index.js | 2 +- packages/kit/src/exports/vite/index.js | 4 +- packages/kit/src/runtime/app/paths/types.d.ts | 4 +- packages/kit/src/runtime/app/stores.js | 4 +- packages/kit/src/runtime/client/client.js | 10 +- packages/kit/src/runtime/client/fetcher.js | 2 +- .../kit/src/runtime/server/page/actions.js | 2 +- packages/kit/src/runtime/server/page/index.js | 4 +- .../kit/src/runtime/server/page/load_data.js | 2 +- .../kit/src/runtime/server/page/render.js | 2 +- packages/kit/src/types/ambient.d.ts | 14 +- .../types/synthetic/$env+dynamic+private.md | 2 +- .../types/synthetic/$env+dynamic+public.md | 2 +- .../types/synthetic/$env+static+private.md | 4 +- .../src/types/synthetic/$env+static+public.md | 2 +- packages/kit/src/types/synthetic/$lib.md | 4 +- packages/kit/src/utils/url.spec.js | 8 +- .../kit/test/apps/basics/test/client.test.js | 4 +- .../basics/test/cross-platform/client.test.js | 2 +- .../kit/test/build-errors/prerender.spec.js | 2 +- packages/kit/tsconfig.json | 7 +- packages/kit/types/index.d.ts | 120 +++++++++--------- packages/migrate/README.md | 4 +- packages/migrate/migrations/package/index.js | 2 +- packages/migrate/migrations/svelte-4/index.js | 6 +- .../migrate/migrations/svelte-4/migrate.js | 16 +-- .../migrate/migrations/svelte-5/migrate.js | 2 +- .../migrate/migrations/sveltekit-2/index.js | 4 +- .../migrate/migrations/sveltekit-2/migrate.js | 16 +-- .../sveltekit-2/svelte-config-samples.md | 4 +- packages/migrate/package.json | 2 +- packages/package/README.md | 6 +- packages/package/package.json | 2 +- packages/package/src/validate.js | 4 +- 67 files changed, 257 insertions(+), 246 deletions(-) create mode 100644 .changeset/strange-plums-drop.md diff --git a/.changeset/strange-plums-drop.md b/.changeset/strange-plums-drop.md new file mode 100644 index 000000000000..dc8d4d160a14 --- /dev/null +++ b/.changeset/strange-plums-drop.md @@ -0,0 +1,16 @@ +--- +'@sveltejs/adapter-cloudflare-workers': patch +'@sveltejs/adapter-cloudflare': patch +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-static': patch +'@sveltejs/adapter-vercel': patch +'@sveltejs/adapter-auto': patch +'@sveltejs/adapter-node': patch +'@sveltejs/enhanced-img': patch +'svelte-migrate': patch +'@sveltejs/package': patch +'@sveltejs/amp': patch +'@sveltejs/kit': patch +--- + +docs: update URLs for new svelte.dev site diff --git a/packages/adapter-auto/README.md b/packages/adapter-auto/README.md index 26f861ded979..ed96335346a5 100644 --- a/packages/adapter-auto/README.md +++ b/packages/adapter-auto/README.md @@ -4,7 +4,7 @@ Automatically chooses the SvelteKit adapter for your current environment, if pos ## Docs -[Docs](https://kit.svelte.dev/docs/adapter-auto) +[Docs](https://svelte.dev/docs/kit/adapter-auto) ## Changelog diff --git a/packages/adapter-auto/index.js b/packages/adapter-auto/index.js index cc1c676ffb80..c83ba6246c59 100644 --- a/packages/adapter-auto/index.js +++ b/packages/adapter-auto/index.js @@ -117,7 +117,7 @@ export default () => ({ if (adapter) return adapter.adapt(builder); builder.log.warn( - 'Could not detect a supported production environment. See https://kit.svelte.dev/docs/adapters to learn how to configure your app to run on the platform of your choosing' + 'Could not detect a supported production environment. See https://svelte.dev/docs/kit/adapters to learn how to configure your app to run on the platform of your choosing' ); }, supports: { diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index d9bf9d9a91c1..b80c17e10e22 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -17,7 +17,7 @@ "directory": "packages/adapter-auto" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/adapter-cloudflare-workers/README.md b/packages/adapter-cloudflare-workers/README.md index 1dbb3a50f2cb..a3805020a4aa 100644 --- a/packages/adapter-cloudflare-workers/README.md +++ b/packages/adapter-cloudflare-workers/README.md @@ -6,7 +6,7 @@ SvelteKit adapter that creates a Cloudflare Workers site using a function for dy ## Docs -[Docs](https://kit.svelte.dev/docs/adapter-cloudflare-workers) +[Docs](https://svelte.dev/docs/kit/adapter-cloudflare-workers) ## Changelog diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index ff8b55ec7acf..d6801a02569b 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -16,7 +16,7 @@ "directory": "packages/adapter-cloudflare-workers" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/adapter-cloudflare/README.md b/packages/adapter-cloudflare/README.md index 51a7eb0302fe..fa00adbf1c94 100644 --- a/packages/adapter-cloudflare/README.md +++ b/packages/adapter-cloudflare/README.md @@ -1,10 +1,10 @@ # adapter-cloudflare -[Adapter](https://kit.svelte.dev/docs/building-your-app) for building SvelteKit applications on [Cloudflare Pages](https://developers.cloudflare.com/pages/) with [Workers integration](https://developers.cloudflare.com/pages/platform/functions). +[Adapter](https://svelte.dev/docs/kit/building-your-app) for building SvelteKit applications on [Cloudflare Pages](https://developers.cloudflare.com/pages/) with [Workers integration](https://developers.cloudflare.com/pages/platform/functions). ## Docs -[Docs](https://kit.svelte.dev/docs/adapter-cloudflare) +[Docs](https://svelte.dev/docs/kit/adapter-cloudflare) ## Changelog diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index a7eaf5448a9b..9d294a4ed177 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -16,7 +16,7 @@ "directory": "packages/adapter-cloudflare" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/adapter-netlify/README.md b/packages/adapter-netlify/README.md index 93ea58a9f964..339311ffb2df 100644 --- a/packages/adapter-netlify/README.md +++ b/packages/adapter-netlify/README.md @@ -4,7 +4,7 @@ A SvelteKit adapter that creates a Netlify app. ## Docs -[Docs](https://kit.svelte.dev/docs/adapter-netlify) +[Docs](https://svelte.dev/docs/kit/adapter-netlify) ## Changelog diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js index 2b7fafd47711..8fc380cc270f 100644 --- a/packages/adapter-netlify/index.js +++ b/packages/adapter-netlify/index.js @@ -323,7 +323,7 @@ function get_publish_directory(netlify_config, builder) { } builder.log.warn( - 'No netlify.toml found. Using default publish directory. Consult https://kit.svelte.dev/docs/adapter-netlify#usage for more details' + 'No netlify.toml found. Using default publish directory. Consult https://svelte.dev/docs/kit/adapter-netlify#usage for more details' ); } diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index bae99da20417..9c7631d878a8 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -16,7 +16,7 @@ "directory": "packages/adapter-netlify" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/adapter-node/README.md b/packages/adapter-node/README.md index 978aa477319e..22e355fee5ed 100644 --- a/packages/adapter-node/README.md +++ b/packages/adapter-node/README.md @@ -1,10 +1,10 @@ # @sveltejs/adapter-node -[Adapter](https://kit.svelte.dev/docs/adapters) for SvelteKit apps that generates a standalone Node server. +[Adapter](https://svelte.dev/docs/kit/adapters) for SvelteKit apps that generates a standalone Node server. ## Docs -[Docs](https://kit.svelte.dev/docs/adapter-node) +[Docs](https://svelte.dev/docs/kit/adapter-node) ## Changelog diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 9ba8d2a63e07..3da7dc6ff361 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -16,7 +16,7 @@ "directory": "packages/adapter-node" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/adapter-static/README.md b/packages/adapter-static/README.md index 0d3aebd93adf..b612f2aa6122 100644 --- a/packages/adapter-static/README.md +++ b/packages/adapter-static/README.md @@ -1,10 +1,10 @@ # @sveltejs/adapter-static -[Adapter](https://kit.svelte.dev/docs/adapters) for SvelteKit apps that prerenders your entire site as a collection of static files. It's also possible to create an SPA with it by specifying a fallback page which renders an empty shell. If you'd like to prerender only some pages and not create an SPA for those left out, you will need to use a different adapter together with [the `prerender` option](https://kit.svelte.dev/docs/page-options#prerender). +[Adapter](https://svelte.dev/docs/kit/adapters) for SvelteKit apps that prerenders your entire site as a collection of static files. It's also possible to create an SPA with it by specifying a fallback page which renders an empty shell. If you'd like to prerender only some pages and not create an SPA for those left out, you will need to use a different adapter together with [the `prerender` option](https://svelte.dev/docs/kit/page-options#prerender). ## Docs -[Docs](https://kit.svelte.dev/docs/adapter-static) +[Docs](https://svelte.dev/docs/kit/adapter-static) ## Changelog diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js index 3ddb1b84ea4a..c5e0d68efa42 100644 --- a/packages/adapter-static/index.js +++ b/packages/adapter-static/index.js @@ -18,7 +18,7 @@ export default function (options) { has_param_routes ? '(routes with parameters are not part of entry points by default)' : '' - } — see https://kit.svelte.dev/docs/configuration#prerender for more info.` + } — see https://svelte.dev/docs/kit/configuration#prerender for more info.` : ''; builder.log.error( @@ -26,14 +26,14 @@ export default function (options) { ${dynamic_routes.map((route) => ` - ${path.posix.join(prefix, route.id)}`).join('\n')} You have the following options: - - set the \`fallback\` option — see https://kit.svelte.dev/docs/single-page-apps#usage for more info. + - set the \`fallback\` option — see https://svelte.dev/docs/kit/single-page-apps#usage for more info. - add \`export const prerender = true\` to your root \`+layout.js/.ts\` or \`+layout.server.js/.ts\` file. This will try to prerender all pages. - add \`export const prerender = true\` to any \`+server.js/ts\` files that are not fetched by page \`load\` functions. ${config_option} - pass \`strict: false\` to \`adapter-static\` to ignore this error. Only do this if you are sure you don't need the routes in question in your final app, as they will be unavailable. See https://github.com/sveltejs/kit/tree/main/packages/adapter-static#strict for more info. If this doesn't help, you may need to use a different adapter. @sveltejs/adapter-static can only be used for sites that don't need a server for dynamic rendering, and can run on just a static file server. -See https://kit.svelte.dev/docs/page-options#prerender for more details` +See https://svelte.dev/docs/kit/page-options#prerender for more details` ); throw new Error('Encountered dynamic routes'); } diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 6aa221827c71..f28a87ccad5c 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -17,7 +17,7 @@ "directory": "packages/adapter-static" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/adapter-static/test/apps/spa/README.md b/packages/adapter-static/test/apps/spa/README.md index 1facfc2a692c..16c7d1981629 100644 --- a/packages/adapter-static/test/apps/spa/README.md +++ b/packages/adapter-static/test/apps/spa/README.md @@ -27,7 +27,7 @@ npm run dev -- --open ## Building -Before creating a production version of your app, install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. Then: +Before creating a production version of your app, install an [adapter](https://svelte.dev/docs/kit/adapters) for your target environment. Then: ```bash npm run build diff --git a/packages/adapter-vercel/README.md b/packages/adapter-vercel/README.md index a5c47db245b5..ce1a3c89595e 100644 --- a/packages/adapter-vercel/README.md +++ b/packages/adapter-vercel/README.md @@ -4,7 +4,7 @@ A SvelteKit adapter that creates a Vercel app. ## Docs -[Docs](https://kit.svelte.dev/docs/adapter-vercel) +[Docs](https://svelte.dev/docs/kit/adapter-vercel) ## Changelog diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 383cebe5e34a..85b9e203a01e 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -16,7 +16,7 @@ "directory": "packages/adapter-vercel" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/amp/package.json b/packages/amp/package.json index 45e8b389a32c..155251a05d1f 100644 --- a/packages/amp/package.json +++ b/packages/amp/package.json @@ -14,7 +14,7 @@ "directory": "packages/amp" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "exports": { ".": { diff --git a/packages/enhanced-img/README.md b/packages/enhanced-img/README.md index 93f194944ff7..ac87975c1f95 100644 --- a/packages/enhanced-img/README.md +++ b/packages/enhanced-img/README.md @@ -6,7 +6,7 @@ A Vite plugin which runs a Svelte preprocessor to locate images and then transfo ## Docs -[Docs](https://kit.svelte.dev/docs/images) +[Docs](https://svelte.dev/docs/kit/images) ## Changelog diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 8cd893d36d2c..2225e4cd0741 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -18,7 +18,7 @@ "vite" ], "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "scripts": { "lint": "prettier --check .", diff --git a/packages/enhanced-img/types/index.d.ts b/packages/enhanced-img/types/index.d.ts index 458caafbb6d8..5d287fc672d6 100644 --- a/packages/enhanced-img/types/index.d.ts +++ b/packages/enhanced-img/types/index.d.ts @@ -5,7 +5,7 @@ import './ambient.js'; type EnhancedImgAttributes = Omit<HTMLImgAttributes, 'src'> & { src: string | Picture }; -// https://svelte.dev/docs/typescript#enhancing-built-in-dom-types +// https://svelte.dev/docs/svelte/typescript#enhancing-built-in-dom-types declare module 'svelte/elements' { export interface SvelteHTMLElements { 'enhanced:img': EnhancedImgAttributes; diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index e85f799bb106..3e8cc810c68a 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -4206,8 +4206,8 @@ Starting from now all releases follow semver and changes will be listed as Major ### Patch Changes -- Allow endpoints to return a [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response), or an object with [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) ([docs](https://kit.svelte.dev/docs/routing#endpoints), [#3384](https://github.com/sveltejs/kit/pull/3384)) -- breaking: Expose standard [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) object to endpoints and hooks. `method`, `headers`, and `body` now accessed through `request` field ([docs](https://kit.svelte.dev/docs/routing#endpoints), [#3384](https://github.com/sveltejs/kit/pull/3384)) +- Allow endpoints to return a [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response), or an object with [Headers](https://developer.mozilla.org/en-US/docs/Web/API/Headers) ([docs](https://svelte.dev/docs/kit/routing#endpoints), [#3384](https://github.com/sveltejs/kit/pull/3384)) +- breaking: Expose standard [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) object to endpoints and hooks. `method`, `headers`, and `body` now accessed through `request` field ([docs](https://svelte.dev/docs/kit/routing#endpoints), [#3384](https://github.com/sveltejs/kit/pull/3384)) - breaking: change `app.render` signature to (request: Request) => Promise<Response> ([#3384](https://github.com/sveltejs/kit/pull/3384)) - breaking: move protocol/host configuration options from Kit to adapter-node ([#3384](https://github.com/sveltejs/kit/pull/3384)) @@ -4342,7 +4342,7 @@ Starting from now all releases follow semver and changes will be listed as Major ### Patch Changes -- breaking: Add `disableScrollHandling` function (see https://kit.svelte.dev/docs/modules#$app-navigation) ([#3182](https://github.com/sveltejs/kit/pull/3182)) +- breaking: Add `disableScrollHandling` function (see https://svelte.dev/docs/kit/modules#$app-navigation) ([#3182](https://github.com/sveltejs/kit/pull/3182)) ## 1.0.0-next.213 diff --git a/packages/kit/README.md b/packages/kit/README.md index f5b81142dcff..f5592f982a6d 100644 --- a/packages/kit/README.md +++ b/packages/kit/README.md @@ -1,8 +1,8 @@ # The fastest way to build Svelte apps -This is the [SvelteKit](https://kit.svelte.dev) framework and CLI. +This is the [SvelteKit](https://svelte.dev/docs/kit) framework and CLI. -The quickest way to get started is via the [create-svelte](https://github.com/sveltejs/kit/tree/main/packages/create-svelte) package: +The quickest way to get started is via the [sv](https://npmjs.com/package/sv) package: ```bash npx sv create my-app @@ -11,7 +11,7 @@ npm install npm run dev ``` -See the [documentation](https://kit.svelte.dev/docs) to learn more. +See the [documentation](https://svelte.dev/docs/kit) to learn more. ## Changelog diff --git a/packages/kit/package.json b/packages/kit/package.json index 61f5729d79ea..c77a8c1e4e17 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -15,7 +15,7 @@ "directory": "packages/kit" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "dependencies": { "@types/cookie": "^0.6.0", diff --git a/packages/kit/src/core/config/index.js b/packages/kit/src/core/config/index.js index 36b82a86db04..b387cb2f0a44 100644 --- a/packages/kit/src/core/config/index.js +++ b/packages/kit/src/core/config/index.js @@ -111,7 +111,7 @@ function process_config(config, { cwd = process.cwd() } = {}) { export function validate_config(config) { if (typeof config !== 'object') { throw new Error( - 'svelte.config.js must have a configuration object as its default export. See https://kit.svelte.dev/docs/configuration' + 'svelte.config.js must have a configuration object as its default export. See https://svelte.dev/docs/kit/configuration' ); } diff --git a/packages/kit/src/core/config/index.spec.js b/packages/kit/src/core/config/index.spec.js index 0f946a61292d..35ca362837d5 100644 --- a/packages/kit/src/core/config/index.spec.js +++ b/packages/kit/src/core/config/index.spec.js @@ -209,7 +209,7 @@ test('fails if kit.appDir is only slash', () => { appDir: '/' } }); - }, /^config\.kit\.appDir cannot start or end with '\/'. See https:\/\/kit\.svelte\.dev\/docs\/configuration$/); + }, /^config\.kit\.appDir cannot start or end with '\/'. See https:\/\/svelte\.dev\/docs\/kit\/configuration$/); }); test('fails if kit.appDir starts with slash', () => { @@ -219,7 +219,7 @@ test('fails if kit.appDir starts with slash', () => { appDir: '/_app' } }); - }, /^config\.kit\.appDir cannot start or end with '\/'. See https:\/\/kit\.svelte\.dev\/docs\/configuration$/); + }, /^config\.kit\.appDir cannot start or end with '\/'. See https:\/\/svelte\.dev\/docs\/kit\/configuration$/); }); test('fails if kit.appDir ends with slash', () => { @@ -229,7 +229,7 @@ test('fails if kit.appDir ends with slash', () => { appDir: '_app/' } }); - }, /^config\.kit\.appDir cannot start or end with '\/'. See https:\/\/kit\.svelte\.dev\/docs\/configuration$/); + }, /^config\.kit\.appDir cannot start or end with '\/'. See https:\/\/svelte\.dev\/docs\/kit\/configuration$/); }); test('fails if paths.base is not root-relative', () => { @@ -242,7 +242,7 @@ test('fails if paths.base is not root-relative', () => { } } }); - }, /^config\.kit\.paths\.base option must either be the empty string or a root-relative path that starts but doesn't end with '\/'. See https:\/\/kit\.svelte\.dev\/docs\/configuration#paths$/); + }, /^config\.kit\.paths\.base option must either be the empty string or a root-relative path that starts but doesn't end with '\/'. See https:\/\/svelte\.dev\/docs\/kit\/configuration#paths$/); }); test("fails if paths.base ends with '/'", () => { @@ -254,7 +254,7 @@ test("fails if paths.base ends with '/'", () => { } } }); - }, /^config\.kit\.paths\.base option must either be the empty string or a root-relative path that starts but doesn't end with '\/'. See https:\/\/kit\.svelte\.dev\/docs\/configuration#paths$/); + }, /^config\.kit\.paths\.base option must either be the empty string or a root-relative path that starts but doesn't end with '\/'. See https:\/\/svelte\.dev\/docs\/kit\/configuration#paths$/); }); test('fails if paths.assets is relative', () => { @@ -267,7 +267,7 @@ test('fails if paths.assets is relative', () => { } } }); - }, /^config\.kit\.paths\.assets option must be an absolute path, if specified. See https:\/\/kit\.svelte\.dev\/docs\/configuration#paths$/); + }, /^config\.kit\.paths\.assets option must be an absolute path, if specified. See https:\/\/svelte\.dev\/docs\/kit\/configuration#paths$/); }); test('fails if paths.assets has trailing slash', () => { @@ -279,7 +279,7 @@ test('fails if paths.assets has trailing slash', () => { } } }); - }, /^config\.kit\.paths\.assets option must not end with '\/'. See https:\/\/kit\.svelte\.dev\/docs\/configuration#paths$/); + }, /^config\.kit\.paths\.assets option must not end with '\/'. See https:\/\/svelte\.dev\/docs\/kit\/configuration#paths$/); }); test('fails if prerender.entries are invalid', () => { @@ -373,6 +373,6 @@ test('errors on loading config with incorrect default export', async () => { assert.equal( message, - 'svelte.config.js must have a configuration object as its default export. See https://kit.svelte.dev/docs/configuration' + 'svelte.config.js must have a configuration object as its default export. See https://svelte.dev/docs/kit/configuration' ); }); diff --git a/packages/kit/src/core/config/options.js b/packages/kit/src/core/config/options.js index a4b41f2a16c6..70d631d3ada6 100644 --- a/packages/kit/src/core/config/options.js +++ b/packages/kit/src/core/config/options.js @@ -68,7 +68,7 @@ const options = object( message += ', rather than the name of an adapter'; } - throw new Error(`${message}. See https://kit.svelte.dev/docs/adapters`); + throw new Error(`${message}. See https://svelte.dev/docs/kit/adapters`); } return input; @@ -92,7 +92,7 @@ const options = object( if (input) { if (input.startsWith('/') || input.endsWith('/')) { throw new Error( - "config.kit.appDir cannot start or end with '/'. See https://kit.svelte.dev/docs/configuration" + "config.kit.appDir cannot start or end with '/'. See https://svelte.dev/docs/kit/configuration" ); } } else { @@ -151,7 +151,7 @@ const options = object( if (input !== '' && (input.endsWith('/') || !input.startsWith('/'))) { throw new Error( - `${keypath} option must either be the empty string or a root-relative path that starts but doesn't end with '/'. See https://kit.svelte.dev/docs/configuration#paths` + `${keypath} option must either be the empty string or a root-relative path that starts but doesn't end with '/'. See https://svelte.dev/docs/kit/configuration#paths` ); } @@ -163,13 +163,13 @@ const options = object( if (input) { if (!/^[a-z]+:\/\//.test(input)) { throw new Error( - `${keypath} option must be an absolute path, if specified. See https://kit.svelte.dev/docs/configuration#paths` + `${keypath} option must be an absolute path, if specified. See https://svelte.dev/docs/kit/configuration#paths` ); } if (input.endsWith('/')) { throw new Error( - `${keypath} option must not end with '/'. See https://kit.svelte.dev/docs/configuration#paths` + `${keypath} option must not end with '/'. See https://svelte.dev/docs/kit/configuration#paths` ); } } @@ -202,7 +202,7 @@ const options = object( (/** @type {any} */ { message }) => { throw new Error( message + - '\nTo suppress or handle this error, implement `handleHttpError` in https://kit.svelte.dev/docs/configuration#prerender' + '\nTo suppress or handle this error, implement `handleHttpError` in https://svelte.dev/docs/kit/configuration#prerender' ); }, (input, keypath) => { @@ -216,7 +216,7 @@ const options = object( (/** @type {any} */ { message }) => { throw new Error( message + - '\nTo suppress or handle this error, implement `handleMissingId` in https://kit.svelte.dev/docs/configuration#prerender' + '\nTo suppress or handle this error, implement `handleMissingId` in https://svelte.dev/docs/kit/configuration#prerender' ); }, (input, keypath) => { @@ -230,7 +230,7 @@ const options = object( (/** @type {any} */ { message }) => { throw new Error( message + - '\nTo suppress or handle this error, implement `handleEntryGeneratorMismatch` in https://kit.svelte.dev/docs/configuration#prerender' + '\nTo suppress or handle this error, implement `handleEntryGeneratorMismatch` in https://svelte.dev/docs/kit/configuration#prerender' ); }, (input, keypath) => { diff --git a/packages/kit/src/core/postbuild/prerender.js b/packages/kit/src/core/postbuild/prerender.js index 9a83652db866..f2f511d4a98a 100644 --- a/packages/kit/src/core/postbuild/prerender.js +++ b/packages/kit/src/core/postbuild/prerender.js @@ -114,7 +114,7 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { ({ status, path, referrer, referenceType }) => { const message = status === 404 && !path.startsWith(config.paths.base) - ? `${path} does not begin with \`base\`, which is configured in \`paths.base\` and can be imported from \`$app/paths\` - see https://kit.svelte.dev/docs/configuration#paths for more info` + ? `${path} does not begin with \`base\`, which is configured in \`paths.base\` and can be imported from \`$app/paths\` - see https://svelte.dev/docs/kit/configuration#paths for more info` : path; return `${status} ${message}${referrer ? ` (${referenceType} from ${referrer})` : ''}`; @@ -126,7 +126,7 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { config.prerender.handleMissingId, ({ path, id, referrers }) => { return ( - `The following pages contain links to ${path}#${id}, but no element with id="${id}" exists on ${path} - see the \`handleMissingId\` option in https://kit.svelte.dev/docs/configuration#prerender for more info:` + + `The following pages contain links to ${path}#${id}, but no element with id="${id}" exists on ${path} - see the \`handleMissingId\` option in https://svelte.dev/docs/kit/configuration#prerender for more info:` + referrers.map((l) => `\n - ${l}`).join('') ); } @@ -136,7 +136,7 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { log, config.prerender.handleEntryGeneratorMismatch, ({ generatedFromId, entry, matchedId }) => { - return `The entries export from ${generatedFromId} generated entry ${entry}, which was matched by ${matchedId} - see the \`handleEntryGeneratorMismatch\` option in https://kit.svelte.dev/docs/configuration#prerender for more info.`; + return `The entries export from ${generatedFromId} generated entry ${entry}, which was matched by ${matchedId} - see the \`handleEntryGeneratorMismatch\` option in https://svelte.dev/docs/kit/configuration#prerender for more info.`; } ); @@ -385,7 +385,7 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { if (response.status === 200) { if (existsSync(dest) && statSync(dest).isDirectory()) { throw new Error( - `Cannot save ${decoded} as it is already a directory. See https://kit.svelte.dev/docs/page-options#prerender-route-conflicts for more information` + `Cannot save ${decoded} as it is already a directory. See https://svelte.dev/docs/kit/page-options#prerender-route-conflicts for more information` ); } @@ -394,7 +394,7 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { if (existsSync(dir) && !statSync(dir).isDirectory()) { const parent = decoded.split('/').slice(0, -1).join('/'); throw new Error( - `Cannot save ${decoded} as ${parent} is already a file. See https://kit.svelte.dev/docs/page-options#prerender-route-conflicts for more information` + `Cannot save ${decoded} as ${parent} is already a file. See https://svelte.dev/docs/kit/page-options#prerender-route-conflicts for more information` ); } @@ -509,7 +509,7 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { const list = not_prerendered.map((id) => ` - ${id}`).join('\n'); throw new Error( - `The following routes were marked as prerenderable, but were not prerendered because they were not found while crawling your app:\n${list}\n\nSee https://kit.svelte.dev/docs/page-options#prerender-troubleshooting for info on how to solve this` + `The following routes were marked as prerenderable, but were not prerendered because they were not found while crawling your app:\n${list}\n\nSee https://svelte.dev/docs/kit/page-options#prerender-troubleshooting for info on how to solve this` ); } diff --git a/packages/kit/src/core/sync/write_ambient.js b/packages/kit/src/core/sync/write_ambient.js index 40a871cb52de..1f2188097ade 100644 --- a/packages/kit/src/core/sync/write_ambient.js +++ b/packages/kit/src/core/sync/write_ambient.js @@ -7,7 +7,7 @@ import { create_dynamic_types, create_static_types } from '../env.js'; import { write_if_changed } from './utils.js'; // TODO these types should be described in a neutral place, rather than -// inside either `packages/kit` or `kit.svelte.dev` +// inside either `packages/kit` or `svelte.dev/docs/kit` const descriptions_dir = fileURLToPath(new URL('../../../src/types/synthetic', import.meta.url)); /** @param {string} filename */ diff --git a/packages/kit/src/core/sync/write_tsconfig.js b/packages/kit/src/core/sync/write_tsconfig.js index 48114dd562fa..e9df340902e1 100644 --- a/packages/kit/src/core/sync/write_tsconfig.js +++ b/packages/kit/src/core/sync/write_tsconfig.js @@ -166,7 +166,7 @@ function validate_user_config(cwd, out, config) { .bold() .yellow( `You have specified a baseUrl and/or paths in your ${config.kind} which interferes with SvelteKit's auto-generated tsconfig.json. ` + - 'Remove it to avoid problems with intellisense. For path aliases, use `kit.alias` instead: https://kit.svelte.dev/docs/configuration#alias' + 'Remove it to avoid problems with intellisense. For path aliases, use `kit.alias` instead: https://svelte.dev/docs/kit/configuration#alias' ) ); } diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index c61c053171cf..7b706387cbe0 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -23,7 +23,7 @@ import type { PluginOptions } from '@sveltejs/vite-plugin-svelte'; export { PrerenderOption } from '../types/private.js'; /** - * [Adapters](https://kit.svelte.dev/docs/adapters) are responsible for taking the production build and turning it into something that can be deployed to a platform of your choosing. + * [Adapters](https://svelte.dev/docs/kit/adapters) are responsible for taking the production build and turning it into something that can be deployed to a platform of your choosing. */ export interface Adapter { /** @@ -128,7 +128,7 @@ export interface Builder { generateEnvModule(): void; /** - * Generate a server-side manifest to initialise the SvelteKit [server](https://kit.svelte.dev/docs/types#public-types-server) with. + * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/types#public-types-server) with. * @param opts a relative path to the base directory of the app and optionally in which format (esm or cjs) the manifest should be generated */ generateManifest(opts: { relativePath: string; routes?: RouteDefinition[] }): string; @@ -189,7 +189,7 @@ export interface Builder { export interface Config { /** - * Options passed to [`svelte.compile`](https://svelte.dev/docs#compile-time-svelte-compile). + * Options passed to [`svelte.compile`](https://svelte.dev/docs/svelte/svelte-compiler#CompileOptions). * @default {} */ compilerOptions?: CompileOptions; @@ -278,7 +278,7 @@ export interface Emulator { export interface KitConfig { /** - * Your [adapter](https://kit.svelte.dev/docs/adapters) is run when executing `vite build`. It determines how the output is converted for different platforms. + * Your [adapter](https://svelte.dev/docs/kit/adapters) is run when executing `vite build`. It determines how the output is converted for different platforms. * @default undefined */ adapter?: Adapter; @@ -351,9 +351,9 @@ export interface KitConfig { * * > [!NOTE] When `mode` is `'auto'`, SvelteKit will use nonces for dynamically rendered pages and hashes for prerendered pages. Using nonces with prerendered pages is insecure and therefore forbidden. * - * > [!NOTE] Note that most [Svelte transitions](https://svelte.dev/tutorial/transition) work by creating an inline `<style>` element. If you use these in your app, you must either leave the `style-src` directive unspecified or add `unsafe-inline`. + * > [!NOTE] Note that most [Svelte transitions](https://svelte.dev/tutorial/svelte/transition) work by creating an inline `<style>` element. If you use these in your app, you must either leave the `style-src` directive unspecified or add `unsafe-inline`. * - * If this level of configuration is insufficient and you have more dynamic requirements, you can use the [`handle` hook](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) to roll your own CSP. + * If this level of configuration is insufficient and you have more dynamic requirements, you can use the [`handle` hook](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) to roll your own CSP. */ csp?: { /** @@ -397,12 +397,12 @@ export interface KitConfig { */ dir?: string; /** - * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://kit.svelte.dev/docs/modules#$env-static-public) and [`$env/dynamic/public`](https://kit.svelte.dev/docs/modules#$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. + * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://svelte.dev/docs/kit/modules#$env-static-public) and [`$env/dynamic/public`](https://svelte.dev/docs/kit/modules#$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. * @default "PUBLIC_" */ publicPrefix?: string; /** - * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://kit.svelte.dev/docs/modules#$env-static-private) and [`$env/dynamic/private`](https://kit.svelte.dev/docs/modules#$env-dynamic-private). + * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://svelte.dev/docs/kit/modules#$env-static-private) and [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private). * @default "" * @since 1.21.0 */ @@ -419,17 +419,17 @@ export interface KitConfig { assets?: string; hooks?: { /** - * The location of your client [hooks](https://kit.svelte.dev/docs/hooks). + * The location of your client [hooks](https://svelte.dev/docs/kit/hooks). * @default "src/hooks.client" */ client?: string; /** - * The location of your server [hooks](https://kit.svelte.dev/docs/hooks). + * The location of your server [hooks](https://svelte.dev/docs/kit/hooks). * @default "src/hooks.server" */ server?: string; /** - * The location of your universal [hooks](https://kit.svelte.dev/docs/hooks). + * The location of your universal [hooks](https://svelte.dev/docs/kit/hooks). * @default "src/hooks" * @since 2.3.0 */ @@ -441,17 +441,17 @@ export interface KitConfig { */ lib?: string; /** - * a directory containing [parameter matchers](https://kit.svelte.dev/docs/advanced-routing#matching) + * a directory containing [parameter matchers](https://svelte.dev/docs/kit/advanced-routing#matching) * @default "src/params" */ params?: string; /** - * the files that define the structure of your app (see [Routing](https://kit.svelte.dev/docs/routing)) + * the files that define the structure of your app (see [Routing](https://svelte.dev/docs/kit/routing)) * @default "src/routes" */ routes?: string; /** - * the location of your service worker's entry point (see [Service workers](https://kit.svelte.dev/docs/service-workers)) + * the location of your service worker's entry point (see [Service workers](https://svelte.dev/docs/kit/service-workers)) * @default "src/service-worker" */ serviceWorker?: string; @@ -505,7 +505,7 @@ export interface KitConfig { */ assets?: '' | `http://${string}` | `https://${string}`; /** - * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://kit.svelte.dev/docs/modules#$app-paths-base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. + * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://svelte.dev/docs/kit/modules#$app-paths-base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. * @default "" */ base?: '' | `/${string}`; @@ -515,7 +515,7 @@ export interface KitConfig { * If `true`, `base` and `assets` imported from `$app/paths` will be replaced with relative asset paths during server-side rendering, resulting in more portable HTML. * If `false`, `%sveltekit.assets%` and references to build artifacts will always be root-relative paths, unless `paths.assets` is an external URL * - * [Single-page app](https://kit.svelte.dev/docs/single-page-apps) fallback pages will always use absolute paths, regardless of this setting. + * [Single-page app](https://svelte.dev/docs/kit/single-page-apps) fallback pages will always use absolute paths, regardless of this setting. * * If your app uses a `<base>` element, you should set this to `false`, otherwise asset URLs will incorrectly be resolved against the `<base>` URL rather than the current page. * @@ -527,7 +527,7 @@ export interface KitConfig { relative?: boolean; }; /** - * See [Prerendering](https://kit.svelte.dev/docs/page-options#prerender). + * See [Prerendering](https://svelte.dev/docs/kit/page-options#prerender). */ prerender?: { /** @@ -647,7 +647,7 @@ export interface KitConfig { * </script> * ``` * - * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://kit.svelte.dev/docs/modules#$app-stores-updated) store to `true` when it detects one. + * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://svelte.dev/docs/kit/modules#$app-stores-updated) store to `true` when it detects one. */ version?: { /** @@ -678,8 +678,8 @@ export interface KitConfig { } /** - * The [`handle`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) hook runs every time the SvelteKit server receives a [request](https://kit.svelte.dev/docs/web-standards#Fetch-APIs-Request) and - * determines the [response](https://kit.svelte.dev/docs/web-standards#Fetch-APIs-Response). + * The [`handle`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) hook runs every time the SvelteKit server receives a [request](https://svelte.dev/docs/kit/web-standards#Fetch-APIs-Request) and + * determines the [response](https://svelte.dev/docs/kit/web-standards#Fetch-APIs-Response). * It receives an `event` object representing the request and a function called `resolve`, which renders the route and generates a `Response`. * This allows you to modify response headers or bodies, or bypass SvelteKit entirely (for implementing routes programmatically, for example). */ @@ -689,7 +689,7 @@ export type Handle = (input: { }) => MaybePromise<Response>; /** - * The server-side [`handleError`](https://kit.svelte.dev/docs/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. + * The server-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. * * If an unexpected error is thrown during loading or rendering, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -702,7 +702,7 @@ export type HandleServerError = (input: { }) => MaybePromise<void | App.Error>; /** - * The client-side [`handleError`](https://kit.svelte.dev/docs/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. + * The client-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. * * If an unexpected error is thrown during loading or the following render, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -715,7 +715,7 @@ export type HandleClientError = (input: { }) => MaybePromise<void | App.Error>; /** - * The [`handleFetch`](https://kit.svelte.dev/docs/hooks#server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) */ export type HandleFetch = (input: { event: RequestEvent; @@ -724,13 +724,13 @@ export type HandleFetch = (input: { }) => MaybePromise<Response>; /** - * The [`reroute`](https://kit.svelte.dev/docs/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. + * The [`reroute`](https://svelte.dev/docs/kit/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ export type Reroute = (event: { url: URL }) => void | string; /** - * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types)) + * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) * rather than using `Load` directly. */ export type Load< @@ -742,7 +742,7 @@ export type Load< > = (event: LoadEvent<Params, InputData, ParentData, RouteId>) => MaybePromise<OutputData>; /** - * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types)) + * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) * rather than using `LoadEvent` directly. */ export interface LoadEvent< @@ -757,10 +757,10 @@ export interface LoadEvent< * - It can be used to make credentialed requests on the server, as it inherits the `cookie` and `authorization` headers for the page request. * - It can make relative requests on the server (ordinarily, `fetch` requires a URL with an origin when used in a server context). * - Internal requests (e.g. for `+server.js` routes) go directly to the handler function when running on the server, without the overhead of an HTTP call. - * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) + * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://kit.svelte.dev/docs/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) */ fetch: typeof fetch; /** @@ -787,7 +787,7 @@ export interface LoadEvent< * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://kit.svelte.dev/docs/types#public-types-cookies) API in a server-only `load` function instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API in a server-only `load` function instead. * * `setHeaders` has no effect when a `load` function runs in the browser. */ @@ -800,7 +800,7 @@ export interface LoadEvent< */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://kit.svelte.dev/docs/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -939,7 +939,7 @@ export interface Navigation { } /** - * The argument passed to [`beforeNavigate`](https://kit.svelte.dev/docs/modules#$app-navigation-beforenavigate) callbacks. + * The argument passed to [`beforeNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-beforenavigate) callbacks. */ export interface BeforeNavigate extends Navigation { /** @@ -949,7 +949,7 @@ export interface BeforeNavigate extends Navigation { } /** - * The argument passed to [`onNavigate`](https://kit.svelte.dev/docs/modules#$app-navigation-onnavigate) callbacks. + * The argument passed to [`onNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-onnavigate) callbacks. */ export interface OnNavigate extends Navigation { /** @@ -967,7 +967,7 @@ export interface OnNavigate extends Navigation { } /** - * The argument passed to [`afterNavigate`](https://kit.svelte.dev/docs/modules#$app-navigation-afternavigate) callbacks. + * The argument passed to [`afterNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-afternavigate) callbacks. */ export interface AfterNavigate extends Omit<Navigation, 'type'> { /** @@ -1022,17 +1022,17 @@ export interface Page< */ data: App.PageData & Record<string, any>; /** - * The page state, which can be manipulated using the [`pushState`](https://kit.svelte.dev/docs/modules#$app-navigation-pushstate) and [`replaceState`](https://kit.svelte.dev/docs/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The page state, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. */ state: App.PageState; /** - * Filled only after a form submission. See [form actions](https://kit.svelte.dev/docs/form-actions) for more info. + * Filled only after a form submission. See [form actions](https://svelte.dev/docs/kit/form-actions) for more info. */ form: any; } /** - * The shape of a param matcher. See [matching](https://kit.svelte.dev/docs/advanced-routing#matching) for more info. + * The shape of a param matcher. See [matching](https://svelte.dev/docs/kit/advanced-routing#matching) for more info. */ export type ParamMatcher = (param: string) => boolean; @@ -1050,10 +1050,10 @@ export interface RequestEvent< * - It can be used to make credentialed requests on the server, as it inherits the `cookie` and `authorization` headers for the page request. * - It can make relative requests on the server (ordinarily, `fetch` requires a URL with an origin when used in a server context). * - Internal requests (e.g. for `+server.js` routes) go directly to the handler function when running on the server, without the overhead of an HTTP call. - * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) + * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://kit.svelte.dev/docs/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) */ fetch: typeof fetch; /** @@ -1061,7 +1061,7 @@ export interface RequestEvent< */ getClientAddress(): string; /** - * Contains custom data that was added to the request within the [`handle hook`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle). + * Contains custom data that was added to the request within the [`handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). */ locals: App.Locals; /** @@ -1105,7 +1105,7 @@ export interface RequestEvent< * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://kit.svelte.dev/docs/types#public-types-cookies) API instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API instead. */ setHeaders(headers: Record<string, string>): void; /** @@ -1126,7 +1126,7 @@ export interface RequestEvent< /** * A `(event: RequestEvent) => Response` function exported from a `+server.js` file that corresponds to an HTTP verb (`GET`, `PUT`, `PATCH`, etc) and handles requests with that method. * - * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://kit.svelte.dev/docs/types#generated-types) instead. + * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://svelte.dev/docs/kit/types#generated-types) instead. */ export type RequestHandler< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1202,7 +1202,7 @@ export interface SSRManifest { } /** - * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types)) + * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) * rather than using `ServerLoad` directly. */ export type ServerLoad< @@ -1224,7 +1224,7 @@ export interface ServerLoadEvent< */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://kit.svelte.dev/docs/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -1279,7 +1279,7 @@ export interface ServerLoadEvent< /** * Shape of a form action method that is part of `export const actions = {..}` in `+page.server.js`. - * See [form actions](https://kit.svelte.dev/docs/form-actions) for more information. + * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Action< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1289,7 +1289,7 @@ export type Action< /** * Shape of the `export const actions = {..}` object in `+page.server.js`. - * See [form actions](https://kit.svelte.dev/docs/form-actions) for more information. + * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Actions< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1317,7 +1317,7 @@ export type ActionResult< | { type: 'error'; status?: number; error: any }; /** - * The object returned by the [`error`](https://kit.svelte.dev/docs/modules#sveltejs-kit-error) function. + * The object returned by the [`error`](https://svelte.dev/docs/kit/modules#sveltejs-kit-error) function. */ export interface HttpError { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses), in the range 400-599. */ @@ -1327,7 +1327,7 @@ export interface HttpError { } /** - * The object returned by the [`redirect`](https://kit.svelte.dev/docs/modules#sveltejs-kit-redirect) function + * The object returned by the [`redirect`](https://svelte.dev/docs/kit/modules#sveltejs-kit-redirect) function */ export interface Redirect { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages), in the range 300-308. */ diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 5d6f5cda4071..0dbc912940a2 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -43,7 +43,7 @@ export async function dev(vite, vite_config, svelte_config) { globalThis.fetch = (info, init) => { if (typeof info === 'string' && !SCHEME.test(info)) { throw new Error( - `Cannot use relative URL (${info}) with global fetch — use \`event.fetch\` instead: https://kit.svelte.dev/docs/web-standards#fetch-apis` + `Cannot use relative URL (${info}) with global fetch — use \`event.fetch\` instead: https://svelte.dev/docs/kit/web-standards#fetch-apis` ); } diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 06b1977c2b82..1d92fcc38ccf 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -93,7 +93,7 @@ const warning_preprocessor = { const message = `\n${colors.bold().red(path.relative('.', filename))}\n` + - `\`${match[1]}\` will be ignored — move it to ${fixed} instead. See https://kit.svelte.dev/docs/page-options for more information.`; + `\`${match[1]}\` will be ignored — move it to ${fixed} instead. See https://svelte.dev/docs/kit/page-options for more information.`; if (!warned.has(message)) { console.log(message); @@ -900,7 +900,7 @@ async function kit({ svelte_config }) { } else { console.log(colors.bold().yellow('\nNo adapter specified')); - const link = colors.bold().cyan('https://kit.svelte.dev/docs/adapters'); + const link = colors.bold().cyan('https://svelte.dev/docs/kit/adapters'); console.log( `See ${link} to learn how to configure your app to run on the platform of your choosing` ); diff --git a/packages/kit/src/runtime/app/paths/types.d.ts b/packages/kit/src/runtime/app/paths/types.d.ts index de2c409f6809..d17c45dd4efd 100644 --- a/packages/kit/src/runtime/app/paths/types.d.ts +++ b/packages/kit/src/runtime/app/paths/types.d.ts @@ -1,12 +1,12 @@ /** - * A string that matches [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths). + * A string that matches [`config.kit.paths.base`](https://svelte.dev/docs/kit/configuration#paths). * * Example usage: `<a href="{base}/your-page">Link</a>` */ export let base: '' | `/${string}`; /** - * An absolute path that matches [`config.kit.paths.assets`](https://kit.svelte.dev/docs/configuration#paths). + * An absolute path that matches [`config.kit.paths.assets`](https://svelte.dev/docs/kit/configuration#paths). * * > [!NOTE] If a value for `config.kit.paths.assets` is specified, it will be replaced with `'/_svelte_kit_assets'` during `vite dev` or `vite preview`, since the assets don't yet live at their eventual URL. */ diff --git a/packages/kit/src/runtime/app/stores.js b/packages/kit/src/runtime/app/stores.js index 554d653cbfaa..da4b02db836e 100644 --- a/packages/kit/src/runtime/app/stores.js +++ b/packages/kit/src/runtime/app/stores.js @@ -53,7 +53,7 @@ export const navigating = { }; /** - * A readable store whose initial value is `false`. If [`version.pollInterval`](https://kit.svelte.dev/docs/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. + * A readable store whose initial value is `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. * * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. * @type {import('svelte/store').Readable<boolean> & { check(): Promise<boolean> }} @@ -88,7 +88,7 @@ function get_store(name) { } catch { throw new Error( `Cannot subscribe to '${name}' store on the server outside of a Svelte component, as it is bound to the current request via component context. This prevents state from leaking between users.` + - 'For more information, see https://kit.svelte.dev/docs/state-management#avoid-shared-state-on-the-server' + 'For more information, see https://svelte.dev/docs/kit/state-management#avoid-shared-state-on-the-server' ); } } diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 5f251a07362f..432c7165fb02 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1574,7 +1574,7 @@ function setup_preload() { `Preloading data for ${intent.url.pathname} failed with the following error: ${result.state.error.message}\n` + 'If this error is transient, you can ignore it. Otherwise, consider disabling preloading for this route. ' + 'This route was preloaded due to a data-sveltekit-preload-data attribute. ' + - 'See https://kit.svelte.dev/docs/link-options for more info' + 'See https://svelte.dev/docs/kit/link-options for more info' ); } }); @@ -1717,12 +1717,12 @@ export function disableScrollHandling() { * Returns a Promise that resolves when SvelteKit navigates (or fails to navigate, in which case the promise rejects) to the specified `url`. * For external URLs, use `window.location = url` instead of calling `goto(url)`. * - * @param {string | URL} url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app. + * @param {string | URL} url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://svelte.dev/docs/kit/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app. * @param {Object} [opts] Options related to the navigation * @param {boolean} [opts.replaceState] If `true`, will replace the current `history` entry rather than creating a new one with `pushState` * @param {boolean} [opts.noScroll] If `true`, the browser will maintain its scroll position rather than scrolling to the top of the page after navigation * @param {boolean} [opts.keepFocus] If `true`, the currently focused element will retain focus after navigation. Otherwise, focus will be reset to the body - * @param {boolean} [opts.invalidateAll] If `true`, all `load` functions of the page will be rerun. See https://kit.svelte.dev/docs/load#rerunning-load-functions for more info on invalidation. + * @param {boolean} [opts.invalidateAll] If `true`, all `load` functions of the page will be rerun. See https://svelte.dev/docs/kit/load#rerunning-load-functions for more info on invalidation. * @param {App.PageState} [opts.state] An optional object that will be available on the `$page.state` store * @returns {Promise<void>} */ @@ -1861,7 +1861,7 @@ export function preloadCode(pathname) { } /** - * Programmatically create a new history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://kit.svelte.dev/docs/shallow-routing). + * Programmatically create a new history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). * * @param {string | URL} url * @param {App.PageState} state @@ -1905,7 +1905,7 @@ export function pushState(url, state) { } /** - * Programmatically replace the current history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://kit.svelte.dev/docs/shallow-routing). + * Programmatically replace the current history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). * * @param {string | URL} url * @param {App.PageState} state diff --git a/packages/kit/src/runtime/client/fetcher.js b/packages/kit/src/runtime/client/fetcher.js index 1d43a5bc905a..6cb8ef1b7724 100644 --- a/packages/kit/src/runtime/client/fetcher.js +++ b/packages/kit/src/runtime/client/fetcher.js @@ -53,7 +53,7 @@ if (DEV && BROWSER) { if (in_load_heuristic && !used_kit_fetch) { console.warn( - `Loading ${url} using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://kit.svelte.dev/docs/load#making-fetch-requests` + `Loading ${url} using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://svelte.dev/docs/kit/load#making-fetch-requests` ); } diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index 64db810507a8..a36a8d1ecd7e 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -197,7 +197,7 @@ export async function handle_action_request(event, server) { function check_named_default_separate(actions) { if (actions.default && Object.keys(actions).length > 1) { throw new Error( - 'When using named actions, the default action cannot be used. See the docs for more info: https://kit.svelte.dev/docs/form-actions#named-actions' + 'When using named actions, the default action cannot be used. See the docs for more info: https://svelte.dev/docs/kit/form-actions#named-actions' ); } } diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 00dfdf7adc3e..82c43a7ce78a 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -105,12 +105,12 @@ export async function render_page(event, page, options, manifest, state, resolve if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) { if (action_result.type === 'error') { console.warn( - "The form action returned an error, but +error.svelte wasn't rendered because SSR is off. To get the error page with CSR, enhance your form with `use:enhance`. See https://kit.svelte.dev/docs/form-actions#progressive-enhancement-use-enhance" + "The form action returned an error, but +error.svelte wasn't rendered because SSR is off. To get the error page with CSR, enhance your form with `use:enhance`. See https://svelte.dev/docs/kit/form-actions#progressive-enhancement-use-enhance" ); } else if (action_result.data) { /// case: lost data console.warn( - "The form action returned a value, but it isn't available in `$page.form`, because SSR is off. To handle the returned value in CSR, enhance your form with `use:enhance`. See https://kit.svelte.dev/docs/form-actions#progressive-enhancement-use-enhance" + "The form action returned a value, but it isn't available in `$page.form`, because SSR is off. To handle the returned value in CSR, enhance your form with `use:enhance`. See https://svelte.dev/docs/kit/form-actions#progressive-enhancement-use-enhance" ); } } diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index dc60327e3370..e2af144654e6 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -348,7 +348,7 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts) const included = resolve_opts.filterSerializedResponseHeaders(lower, value); if (!included) { throw new Error( - `Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://kit.svelte.dev/docs/hooks#Server-hooks-handle (at ${event.route.id})` + `Failed to get response header "${lower}" — it must be included by the \`filterSerializedResponseHeaders\` option: https://svelte.dev/docs/kit/hooks#Server-hooks-handle (at ${event.route.id})` ); } } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 6d8b8eb44633..be44c3c7a860 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -480,7 +480,7 @@ export async function render_response({ if (page_config.csr) { if (transformed.split('<!--').length < html.split('<!--').length) { // the \u001B stuff is ANSI codes, so that we don't need to add a library to the runtime - // https://svelte.dev/repl/1b3f49696f0c44c881c34587f2537aa2 + // https://svelte.dev/playground/1b3f49696f0c44c881c34587f2537aa2?version=4.2.19 console.warn( "\u001B[1m\u001B[31mRemoving comments in transformPageChunk can break Svelte's hydration\u001B[39m\u001B[22m" ); diff --git a/packages/kit/src/types/ambient.d.ts b/packages/kit/src/types/ambient.d.ts index 00730946b980..e63e8f98117e 100644 --- a/packages/kit/src/types/ambient.d.ts +++ b/packages/kit/src/types/ambient.d.ts @@ -29,30 +29,30 @@ declare namespace App { } /** - * The interface that defines `event.locals`, which can be accessed in [hooks](https://kit.svelte.dev/docs/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. + * The interface that defines `event.locals`, which can be accessed in [hooks](https://svelte.dev/docs/kit/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. */ export interface Locals {} /** - * Defines the common shape of the [$page.data store](https://kit.svelte.dev/docs/modules#$app-stores-page) - that is, the data that is shared between all pages. + * Defines the common shape of the [$page.data store](https://svelte.dev/docs/kit/modules#$app-stores-page) - that is, the data that is shared between all pages. * The `Load` and `ServerLoad` functions in `./$types` will be narrowed accordingly. * Use optional properties for data that is only present on specific pages. Do not add an index signature (`[key: string]: any`). */ export interface PageData {} /** - * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://kit.svelte.dev/docs/modules#$app-navigation-pushstate) and [`replaceState`](https://kit.svelte.dev/docs/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. */ export interface PageState {} /** - * If your adapter provides [platform-specific context](https://kit.svelte.dev/docs/adapters#platform-specific-context) via `event.platform`, you can specify it here. + * If your adapter provides [platform-specific context](https://svelte.dev/docs/kit/adapters#platform-specific-context) via `event.platform`, you can specify it here. */ export interface Platform {} } /** - * This module is only available to [service workers](https://kit.svelte.dev/docs/service-workers). + * This module is only available to [service workers](https://svelte.dev/docs/kit/service-workers). */ declare module '$service-worker' { /** @@ -66,7 +66,7 @@ declare module '$service-worker' { */ export const build: string[]; /** - * An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://kit.svelte.dev/docs/configuration) + * An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://svelte.dev/docs/kit/configuration) */ export const files: string[]; /** @@ -75,7 +75,7 @@ declare module '$service-worker' { */ export const prerendered: string[]; /** - * See [`config.kit.version`](https://kit.svelte.dev/docs/configuration#version). It's useful for generating unique cache names inside your service worker, so that a later deployment of your app can invalidate old caches. + * See [`config.kit.version`](https://svelte.dev/docs/kit/configuration#version). It's useful for generating unique cache names inside your service worker, so that a later deployment of your app can invalidate old caches. */ export const version: string; } diff --git a/packages/kit/src/types/synthetic/$env+dynamic+private.md b/packages/kit/src/types/synthetic/$env+dynamic+private.md index d5cd7239dacf..93c8c8cd7905 100644 --- a/packages/kit/src/types/synthetic/$env+dynamic+private.md +++ b/packages/kit/src/types/synthetic/$env+dynamic+private.md @@ -1,4 +1,4 @@ -This module provides access to runtime environment variables, as defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://kit.svelte.dev/docs/cli)), this is equivalent to `process.env`. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://kit.svelte.dev/docs/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://kit.svelte.dev/docs/configuration#env) (if configured). +This module provides access to runtime environment variables, as defined by the platform you're running on. For example if you're using [`adapter-node`](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) (or running [`vite preview`](https://svelte.dev/docs/kit/cli)), this is equivalent to `process.env`. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured). This module cannot be imported into client-side code. diff --git a/packages/kit/src/types/synthetic/$env+dynamic+public.md b/packages/kit/src/types/synthetic/$env+dynamic+public.md index ad1cf54d2fb6..95fdaf9c0d34 100644 --- a/packages/kit/src/types/synthetic/$env+dynamic+public.md +++ b/packages/kit/src/types/synthetic/$env+dynamic+public.md @@ -1,4 +1,4 @@ -Similar to [`$env/dynamic/private`](https://kit.svelte.dev/docs/modules#$env-dynamic-private), but only includes variables that begin with [`config.kit.env.publicPrefix`](https://kit.svelte.dev/docs/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. +Similar to [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private), but only includes variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. Note that public dynamic environment variables must all be sent from the server to the client, causing larger network requests — when possible, use `$env/static/public` instead. diff --git a/packages/kit/src/types/synthetic/$env+static+private.md b/packages/kit/src/types/synthetic/$env+static+private.md index 40704d239772..20bdb6e90a4a 100644 --- a/packages/kit/src/types/synthetic/$env+static+private.md +++ b/packages/kit/src/types/synthetic/$env+static+private.md @@ -1,6 +1,6 @@ -Environment variables [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env`. Like [`$env/dynamic/private`](https://kit.svelte.dev/docs/modules#$env-dynamic-private), this module cannot be imported into client-side code. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://kit.svelte.dev/docs/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://kit.svelte.dev/docs/configuration#env) (if configured). +Environment variables [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env`. Like [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private), this module cannot be imported into client-side code. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured). -_Unlike_ [`$env/dynamic/private`](https://kit.svelte.dev/docs/modules#$env-dynamic-private), the values exported from this module are statically injected into your bundle at build time, enabling optimisations like dead code elimination. +_Unlike_ [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private), the values exported from this module are statically injected into your bundle at build time, enabling optimisations like dead code elimination. ```ts import { API_KEY } from '$env/static/private'; diff --git a/packages/kit/src/types/synthetic/$env+static+public.md b/packages/kit/src/types/synthetic/$env+static+public.md index 2b55250f0a47..16e5d0208a91 100644 --- a/packages/kit/src/types/synthetic/$env+static+public.md +++ b/packages/kit/src/types/synthetic/$env+static+public.md @@ -1,4 +1,4 @@ -Similar to [`$env/static/private`](https://kit.svelte.dev/docs/modules#$env-static-private), except that it only includes environment variables that begin with [`config.kit.env.publicPrefix`](https://kit.svelte.dev/docs/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. +Similar to [`$env/static/private`](https://svelte.dev/docs/kit/modules#$env-static-private), except that it only includes environment variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. Values are replaced statically at build time. diff --git a/packages/kit/src/types/synthetic/$lib.md b/packages/kit/src/types/synthetic/$lib.md index 65eb2c861b27..1108e1b85cb0 100644 --- a/packages/kit/src/types/synthetic/$lib.md +++ b/packages/kit/src/types/synthetic/$lib.md @@ -1,5 +1,5 @@ -This is a simple alias to `src/lib`, or whatever directory is specified as [`config.kit.files.lib`](https://kit.svelte.dev/docs/configuration#files). It allows you to access common components and utility modules without `../../../../` nonsense. +This is a simple alias to `src/lib`, or whatever directory is specified as [`config.kit.files.lib`](https://svelte.dev/docs/kit/configuration#files). It allows you to access common components and utility modules without `../../../../` nonsense. ### `$lib/server` -A subdirectory of `$lib`. SvelteKit will prevent you from importing any modules in `$lib/server` into client-side code. See [server-only modules](https://kit.svelte.dev/docs/server-only-modules). +A subdirectory of `$lib`. SvelteKit will prevent you from importing any modules in `$lib/server` into client-side code. See [server-only modules](https://svelte.dev/docs/kit/server-only-modules). diff --git a/packages/kit/src/utils/url.spec.js b/packages/kit/src/utils/url.spec.js index 7de41b1e04d1..181ffed4fd9e 100644 --- a/packages/kit/src/utils/url.spec.js +++ b/packages/kit/src/utils/url.spec.js @@ -102,7 +102,7 @@ describe('make_trackable', (test) => { test('makes URL properties trackable', () => { let tracked = false; const url = make_trackable( - new URL('https://kit.svelte.dev/docs'), + new URL('https://svelte.dev/docs/kit'), () => { tracked = true; }, @@ -118,7 +118,7 @@ describe('make_trackable', (test) => { test('throws an error when its hash property is accessed', () => { const url = make_trackable( - new URL('https://kit.svelte.dev/docs'), + new URL('https://svelte.dev/docs/kit'), () => {}, () => {} ); @@ -133,7 +133,7 @@ describe('make_trackable', (test) => { let tracked = false; const tracked_search_params = new Set(); const url = make_trackable( - new URL('https://kit.svelte.dev/docs'), + new URL('https://svelte.dev/docs/kit'), () => { tracked = true; }, @@ -161,7 +161,7 @@ describe('make_trackable', (test) => { describe('disable_search', (test) => { test('throws an error when its search property is accessed', () => { - const url = new URL('https://kit.svelte.dev/docs'); + const url = new URL('https://svelte.dev/docs/kit'); disable_search(url); /** @type {Array<keyof URL>} */ diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 2ecc4ba1c0da..351cbdbeb7ad 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -260,7 +260,7 @@ test.describe('Load', () => { predicate: (message) => { return ( message.text() === - `Loading ${baseURL}/load/window-fetch/data.json using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://kit.svelte.dev/docs/load#making-fetch-requests` + `Loading ${baseURL}/load/window-fetch/data.json using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://svelte.dev/docs/kit/load#making-fetch-requests` ); }, timeout: 3_000 @@ -280,7 +280,7 @@ test.describe('Load', () => { expect(await page.textContent('h1')).toBe('42'); expect(warnings).not.toContain( - `Loading ${baseURL}/load/window-fetch/data.json using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://kit.svelte.dev/docs/load#making-fetch-requests` + `Loading ${baseURL}/load/window-fetch/data.json using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://svelte.dev/docs/kit/load#making-fetch-requests` ); }); } diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 5e1a8b258f00..c2e9bf6cc474 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -933,7 +933,7 @@ test.describe('Load', () => { expect(await page.textContent('h1')).toBe('42'); expect(warnings).not.toContain( - `Loading ${baseURL}/load/window-fetch/data.json using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://kit.svelte.dev/docs/load#making-fetch-requests` + `Loading ${baseURL}/load/window-fetch/data.json using \`window.fetch\`. For best results, use the \`fetch\` that is passed to your \`load\` function: https://svelte.dev/docs/kit/load#making-fetch-requests` ); }); } diff --git a/packages/kit/test/build-errors/prerender.spec.js b/packages/kit/test/build-errors/prerender.spec.js index 65fa222c3986..fc4d683a7901 100644 --- a/packages/kit/test/build-errors/prerender.spec.js +++ b/packages/kit/test/build-errors/prerender.spec.js @@ -24,6 +24,6 @@ test('entry generators should match their own route', () => { stdio: 'pipe', timeout: 60000 }), - `Error: The entries export from /[slug]/[notSpecific] generated entry /whatever/specific, which was matched by /[slug]/specific - see the \`handleEntryGeneratorMismatch\` option in https://kit.svelte.dev/docs/configuration#prerender for more info.${EOL}To suppress or handle this error, implement \`handleEntryGeneratorMismatch\` in https://kit.svelte.dev/docs/configuration#prerender` + `Error: The entries export from /[slug]/[notSpecific] generated entry /whatever/specific, which was matched by /[slug]/specific - see the \`handleEntryGeneratorMismatch\` option in https://svelte.dev/docs/kit/configuration#prerender for more info.${EOL}To suppress or handle this error, implement \`handleEntryGeneratorMismatch\` in https://svelte.dev/docs/kit/configuration#prerender` ); }); diff --git a/packages/kit/tsconfig.json b/packages/kit/tsconfig.json index 96f45f67488e..2fe96624a921 100644 --- a/packages/kit/tsconfig.json +++ b/packages/kit/tsconfig.json @@ -17,11 +17,6 @@ "noUnusedLocals": true, "noUnusedParameters": true }, - "include": [ - "*.js", - "scripts/**/*", - "src/**/*", - "src/types/**/*" - ], + "include": ["*.js", "scripts/**/*", "src/**/*", "src/types/**/*"], "exclude": ["./**/write_types/test/**"] } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index cacc70c9c613..0595d25e2e60 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -5,7 +5,7 @@ declare module '@sveltejs/kit' { import type { CompileOptions } from 'svelte/compiler'; import type { PluginOptions } from '@sveltejs/vite-plugin-svelte'; /** - * [Adapters](https://kit.svelte.dev/docs/adapters) are responsible for taking the production build and turning it into something that can be deployed to a platform of your choosing. + * [Adapters](https://svelte.dev/docs/kit/adapters) are responsible for taking the production build and turning it into something that can be deployed to a platform of your choosing. */ export interface Adapter { /** @@ -110,7 +110,7 @@ declare module '@sveltejs/kit' { generateEnvModule(): void; /** - * Generate a server-side manifest to initialise the SvelteKit [server](https://kit.svelte.dev/docs/types#public-types-server) with. + * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/types#public-types-server) with. * @param opts a relative path to the base directory of the app and optionally in which format (esm or cjs) the manifest should be generated */ generateManifest(opts: { relativePath: string; routes?: RouteDefinition[] }): string; @@ -171,7 +171,7 @@ declare module '@sveltejs/kit' { export interface Config { /** - * Options passed to [`svelte.compile`](https://svelte.dev/docs#compile-time-svelte-compile). + * Options passed to [`svelte.compile`](https://svelte.dev/docs/svelte/svelte-compiler#CompileOptions). * @default {} */ compilerOptions?: CompileOptions; @@ -260,7 +260,7 @@ declare module '@sveltejs/kit' { export interface KitConfig { /** - * Your [adapter](https://kit.svelte.dev/docs/adapters) is run when executing `vite build`. It determines how the output is converted for different platforms. + * Your [adapter](https://svelte.dev/docs/kit/adapters) is run when executing `vite build`. It determines how the output is converted for different platforms. * @default undefined */ adapter?: Adapter; @@ -333,9 +333,9 @@ declare module '@sveltejs/kit' { * * > [!NOTE] When `mode` is `'auto'`, SvelteKit will use nonces for dynamically rendered pages and hashes for prerendered pages. Using nonces with prerendered pages is insecure and therefore forbidden. * - * > [!NOTE] Note that most [Svelte transitions](https://svelte.dev/tutorial/transition) work by creating an inline `<style>` element. If you use these in your app, you must either leave the `style-src` directive unspecified or add `unsafe-inline`. + * > [!NOTE] Note that most [Svelte transitions](https://svelte.dev/tutorial/svelte/transition) work by creating an inline `<style>` element. If you use these in your app, you must either leave the `style-src` directive unspecified or add `unsafe-inline`. * - * If this level of configuration is insufficient and you have more dynamic requirements, you can use the [`handle` hook](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) to roll your own CSP. + * If this level of configuration is insufficient and you have more dynamic requirements, you can use the [`handle` hook](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) to roll your own CSP. */ csp?: { /** @@ -379,12 +379,12 @@ declare module '@sveltejs/kit' { */ dir?: string; /** - * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://kit.svelte.dev/docs/modules#$env-static-public) and [`$env/dynamic/public`](https://kit.svelte.dev/docs/modules#$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. + * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://svelte.dev/docs/kit/modules#$env-static-public) and [`$env/dynamic/public`](https://svelte.dev/docs/kit/modules#$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. * @default "PUBLIC_" */ publicPrefix?: string; /** - * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://kit.svelte.dev/docs/modules#$env-static-private) and [`$env/dynamic/private`](https://kit.svelte.dev/docs/modules#$env-dynamic-private). + * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://svelte.dev/docs/kit/modules#$env-static-private) and [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private). * @default "" * @since 1.21.0 */ @@ -401,17 +401,17 @@ declare module '@sveltejs/kit' { assets?: string; hooks?: { /** - * The location of your client [hooks](https://kit.svelte.dev/docs/hooks). + * The location of your client [hooks](https://svelte.dev/docs/kit/hooks). * @default "src/hooks.client" */ client?: string; /** - * The location of your server [hooks](https://kit.svelte.dev/docs/hooks). + * The location of your server [hooks](https://svelte.dev/docs/kit/hooks). * @default "src/hooks.server" */ server?: string; /** - * The location of your universal [hooks](https://kit.svelte.dev/docs/hooks). + * The location of your universal [hooks](https://svelte.dev/docs/kit/hooks). * @default "src/hooks" * @since 2.3.0 */ @@ -423,17 +423,17 @@ declare module '@sveltejs/kit' { */ lib?: string; /** - * a directory containing [parameter matchers](https://kit.svelte.dev/docs/advanced-routing#matching) + * a directory containing [parameter matchers](https://svelte.dev/docs/kit/advanced-routing#matching) * @default "src/params" */ params?: string; /** - * the files that define the structure of your app (see [Routing](https://kit.svelte.dev/docs/routing)) + * the files that define the structure of your app (see [Routing](https://svelte.dev/docs/kit/routing)) * @default "src/routes" */ routes?: string; /** - * the location of your service worker's entry point (see [Service workers](https://kit.svelte.dev/docs/service-workers)) + * the location of your service worker's entry point (see [Service workers](https://svelte.dev/docs/kit/service-workers)) * @default "src/service-worker" */ serviceWorker?: string; @@ -487,7 +487,7 @@ declare module '@sveltejs/kit' { */ assets?: '' | `http://${string}` | `https://${string}`; /** - * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://kit.svelte.dev/docs/modules#$app-paths-base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. + * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://svelte.dev/docs/kit/modules#$app-paths-base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. * @default "" */ base?: '' | `/${string}`; @@ -497,7 +497,7 @@ declare module '@sveltejs/kit' { * If `true`, `base` and `assets` imported from `$app/paths` will be replaced with relative asset paths during server-side rendering, resulting in more portable HTML. * If `false`, `%sveltekit.assets%` and references to build artifacts will always be root-relative paths, unless `paths.assets` is an external URL * - * [Single-page app](https://kit.svelte.dev/docs/single-page-apps) fallback pages will always use absolute paths, regardless of this setting. + * [Single-page app](https://svelte.dev/docs/kit/single-page-apps) fallback pages will always use absolute paths, regardless of this setting. * * If your app uses a `<base>` element, you should set this to `false`, otherwise asset URLs will incorrectly be resolved against the `<base>` URL rather than the current page. * @@ -509,7 +509,7 @@ declare module '@sveltejs/kit' { relative?: boolean; }; /** - * See [Prerendering](https://kit.svelte.dev/docs/page-options#prerender). + * See [Prerendering](https://svelte.dev/docs/kit/page-options#prerender). */ prerender?: { /** @@ -629,7 +629,7 @@ declare module '@sveltejs/kit' { * </script> * ``` * - * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://kit.svelte.dev/docs/modules#$app-stores-updated) store to `true` when it detects one. + * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://svelte.dev/docs/kit/modules#$app-stores-updated) store to `true` when it detects one. */ version?: { /** @@ -660,8 +660,8 @@ declare module '@sveltejs/kit' { } /** - * The [`handle`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) hook runs every time the SvelteKit server receives a [request](https://kit.svelte.dev/docs/web-standards#Fetch-APIs-Request) and - * determines the [response](https://kit.svelte.dev/docs/web-standards#Fetch-APIs-Response). + * The [`handle`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) hook runs every time the SvelteKit server receives a [request](https://svelte.dev/docs/kit/web-standards#Fetch-APIs-Request) and + * determines the [response](https://svelte.dev/docs/kit/web-standards#Fetch-APIs-Response). * It receives an `event` object representing the request and a function called `resolve`, which renders the route and generates a `Response`. * This allows you to modify response headers or bodies, or bypass SvelteKit entirely (for implementing routes programmatically, for example). */ @@ -671,7 +671,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise<Response>; /** - * The server-side [`handleError`](https://kit.svelte.dev/docs/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. + * The server-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. * * If an unexpected error is thrown during loading or rendering, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -684,7 +684,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise<void | App.Error>; /** - * The client-side [`handleError`](https://kit.svelte.dev/docs/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. + * The client-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. * * If an unexpected error is thrown during loading or the following render, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -697,7 +697,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise<void | App.Error>; /** - * The [`handleFetch`](https://kit.svelte.dev/docs/hooks#server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) */ export type HandleFetch = (input: { event: RequestEvent; @@ -706,13 +706,13 @@ declare module '@sveltejs/kit' { }) => MaybePromise<Response>; /** - * The [`reroute`](https://kit.svelte.dev/docs/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. + * The [`reroute`](https://svelte.dev/docs/kit/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ export type Reroute = (event: { url: URL }) => void | string; /** - * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types)) + * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) * rather than using `Load` directly. */ export type Load< @@ -724,7 +724,7 @@ declare module '@sveltejs/kit' { > = (event: LoadEvent<Params, InputData, ParentData, RouteId>) => MaybePromise<OutputData>; /** - * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types)) + * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) * rather than using `LoadEvent` directly. */ export interface LoadEvent< @@ -739,10 +739,10 @@ declare module '@sveltejs/kit' { * - It can be used to make credentialed requests on the server, as it inherits the `cookie` and `authorization` headers for the page request. * - It can make relative requests on the server (ordinarily, `fetch` requires a URL with an origin when used in a server context). * - Internal requests (e.g. for `+server.js` routes) go directly to the handler function when running on the server, without the overhead of an HTTP call. - * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) + * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://kit.svelte.dev/docs/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) */ fetch: typeof fetch; /** @@ -769,7 +769,7 @@ declare module '@sveltejs/kit' { * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://kit.svelte.dev/docs/types#public-types-cookies) API in a server-only `load` function instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API in a server-only `load` function instead. * * `setHeaders` has no effect when a `load` function runs in the browser. */ @@ -782,7 +782,7 @@ declare module '@sveltejs/kit' { */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://kit.svelte.dev/docs/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -921,7 +921,7 @@ declare module '@sveltejs/kit' { } /** - * The argument passed to [`beforeNavigate`](https://kit.svelte.dev/docs/modules#$app-navigation-beforenavigate) callbacks. + * The argument passed to [`beforeNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-beforenavigate) callbacks. */ export interface BeforeNavigate extends Navigation { /** @@ -931,7 +931,7 @@ declare module '@sveltejs/kit' { } /** - * The argument passed to [`onNavigate`](https://kit.svelte.dev/docs/modules#$app-navigation-onnavigate) callbacks. + * The argument passed to [`onNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-onnavigate) callbacks. */ export interface OnNavigate extends Navigation { /** @@ -949,7 +949,7 @@ declare module '@sveltejs/kit' { } /** - * The argument passed to [`afterNavigate`](https://kit.svelte.dev/docs/modules#$app-navigation-afternavigate) callbacks. + * The argument passed to [`afterNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-afternavigate) callbacks. */ export interface AfterNavigate extends Omit<Navigation, 'type'> { /** @@ -1004,17 +1004,17 @@ declare module '@sveltejs/kit' { */ data: App.PageData & Record<string, any>; /** - * The page state, which can be manipulated using the [`pushState`](https://kit.svelte.dev/docs/modules#$app-navigation-pushstate) and [`replaceState`](https://kit.svelte.dev/docs/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The page state, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. */ state: App.PageState; /** - * Filled only after a form submission. See [form actions](https://kit.svelte.dev/docs/form-actions) for more info. + * Filled only after a form submission. See [form actions](https://svelte.dev/docs/kit/form-actions) for more info. */ form: any; } /** - * The shape of a param matcher. See [matching](https://kit.svelte.dev/docs/advanced-routing#matching) for more info. + * The shape of a param matcher. See [matching](https://svelte.dev/docs/kit/advanced-routing#matching) for more info. */ export type ParamMatcher = (param: string) => boolean; @@ -1032,10 +1032,10 @@ declare module '@sveltejs/kit' { * - It can be used to make credentialed requests on the server, as it inherits the `cookie` and `authorization` headers for the page request. * - It can make relative requests on the server (ordinarily, `fetch` requires a URL with an origin when used in a server context). * - Internal requests (e.g. for `+server.js` routes) go directly to the handler function when running on the server, without the overhead of an HTTP call. - * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle) + * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://kit.svelte.dev/docs/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) */ fetch: typeof fetch; /** @@ -1043,7 +1043,7 @@ declare module '@sveltejs/kit' { */ getClientAddress(): string; /** - * Contains custom data that was added to the request within the [`handle hook`](https://kit.svelte.dev/docs/hooks#Server-hooks-handle). + * Contains custom data that was added to the request within the [`handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). */ locals: App.Locals; /** @@ -1087,7 +1087,7 @@ declare module '@sveltejs/kit' { * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://kit.svelte.dev/docs/types#public-types-cookies) API instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API instead. */ setHeaders(headers: Record<string, string>): void; /** @@ -1108,7 +1108,7 @@ declare module '@sveltejs/kit' { /** * A `(event: RequestEvent) => Response` function exported from a `+server.js` file that corresponds to an HTTP verb (`GET`, `PUT`, `PATCH`, etc) and handles requests with that method. * - * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://kit.svelte.dev/docs/types#generated-types) instead. + * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://svelte.dev/docs/kit/types#generated-types) instead. */ export type RequestHandler< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1184,7 +1184,7 @@ declare module '@sveltejs/kit' { } /** - * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://kit.svelte.dev/docs/types#generated-types)) + * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) * rather than using `ServerLoad` directly. */ export type ServerLoad< @@ -1206,7 +1206,7 @@ declare module '@sveltejs/kit' { */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://kit.svelte.dev/docs/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -1261,7 +1261,7 @@ declare module '@sveltejs/kit' { /** * Shape of a form action method that is part of `export const actions = {..}` in `+page.server.js`. - * See [form actions](https://kit.svelte.dev/docs/form-actions) for more information. + * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Action< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1271,7 +1271,7 @@ declare module '@sveltejs/kit' { /** * Shape of the `export const actions = {..}` object in `+page.server.js`. - * See [form actions](https://kit.svelte.dev/docs/form-actions) for more information. + * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Actions< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1299,7 +1299,7 @@ declare module '@sveltejs/kit' { | { type: 'error'; status?: number; error: any }; /** - * The object returned by the [`error`](https://kit.svelte.dev/docs/modules#sveltejs-kit-error) function. + * The object returned by the [`error`](https://svelte.dev/docs/kit/modules#sveltejs-kit-error) function. */ export interface HttpError { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses), in the range 400-599. */ @@ -1309,7 +1309,7 @@ declare module '@sveltejs/kit' { } /** - * The object returned by the [`redirect`](https://kit.svelte.dev/docs/modules#sveltejs-kit-redirect) function + * The object returned by the [`redirect`](https://svelte.dev/docs/kit/modules#sveltejs-kit-redirect) function */ export interface Redirect { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages), in the range 300-308. */ @@ -2075,7 +2075,7 @@ declare module '$app/navigation' { * Returns a Promise that resolves when SvelteKit navigates (or fails to navigate, in which case the promise rejects) to the specified `url`. * For external URLs, use `window.location = url` instead of calling `goto(url)`. * - * @param url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app. + * @param url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://svelte.dev/docs/kit/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app. * @param {Object} opts Options related to the navigation * */ export function goto(url: string | URL, opts?: { @@ -2138,12 +2138,12 @@ declare module '$app/navigation' { * */ export function preloadCode(pathname: string): Promise<void>; /** - * Programmatically create a new history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://kit.svelte.dev/docs/shallow-routing). + * Programmatically create a new history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). * * */ export function pushState(url: string | URL, state: App.PageState): void; /** - * Programmatically replace the current history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://kit.svelte.dev/docs/shallow-routing). + * Programmatically replace the current history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). * * */ export function replaceState(url: string | URL, state: App.PageState): void; @@ -2154,14 +2154,14 @@ declare module '$app/navigation' { declare module '$app/paths' { /** - * A string that matches [`config.kit.paths.base`](https://kit.svelte.dev/docs/configuration#paths). + * A string that matches [`config.kit.paths.base`](https://svelte.dev/docs/kit/configuration#paths). * * Example usage: `<a href="{base}/your-page">Link</a>` */ export let base: '' | `/${string}`; /** - * An absolute path that matches [`config.kit.paths.assets`](https://kit.svelte.dev/docs/configuration#paths). + * An absolute path that matches [`config.kit.paths.assets`](https://svelte.dev/docs/kit/configuration#paths). * * > [!NOTE] If a value for `config.kit.paths.assets` is specified, it will be replaced with `'/_svelte_kit_assets'` during `vite dev` or `vite preview`, since the assets don't yet live at their eventual URL. */ @@ -2230,7 +2230,7 @@ declare module '$app/stores' { * */ export const navigating: import('svelte/store').Readable<import('@sveltejs/kit').Navigation | null>; /** - * A readable store whose initial value is `false`. If [`version.pollInterval`](https://kit.svelte.dev/docs/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. + * A readable store whose initial value is `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. * * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. * */ @@ -2270,30 +2270,30 @@ declare namespace App { } /** - * The interface that defines `event.locals`, which can be accessed in [hooks](https://kit.svelte.dev/docs/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. + * The interface that defines `event.locals`, which can be accessed in [hooks](https://svelte.dev/docs/kit/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. */ export interface Locals {} /** - * Defines the common shape of the [$page.data store](https://kit.svelte.dev/docs/modules#$app-stores-page) - that is, the data that is shared between all pages. + * Defines the common shape of the [$page.data store](https://svelte.dev/docs/kit/modules#$app-stores-page) - that is, the data that is shared between all pages. * The `Load` and `ServerLoad` functions in `./$types` will be narrowed accordingly. * Use optional properties for data that is only present on specific pages. Do not add an index signature (`[key: string]: any`). */ export interface PageData {} /** - * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://kit.svelte.dev/docs/modules#$app-navigation-pushstate) and [`replaceState`](https://kit.svelte.dev/docs/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. */ export interface PageState {} /** - * If your adapter provides [platform-specific context](https://kit.svelte.dev/docs/adapters#platform-specific-context) via `event.platform`, you can specify it here. + * If your adapter provides [platform-specific context](https://svelte.dev/docs/kit/adapters#platform-specific-context) via `event.platform`, you can specify it here. */ export interface Platform {} } /** - * This module is only available to [service workers](https://kit.svelte.dev/docs/service-workers). + * This module is only available to [service workers](https://svelte.dev/docs/kit/service-workers). */ declare module '$service-worker' { /** @@ -2307,7 +2307,7 @@ declare module '$service-worker' { */ export const build: string[]; /** - * An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://kit.svelte.dev/docs/configuration) + * An array of URL strings representing the files in your static directory, or whatever directory is specified by `config.kit.files.assets`. You can customize which files are included from `static` directory using [`config.kit.serviceWorker.files`](https://svelte.dev/docs/kit/configuration) */ export const files: string[]; /** @@ -2316,7 +2316,7 @@ declare module '$service-worker' { */ export const prerendered: string[]; /** - * See [`config.kit.version`](https://kit.svelte.dev/docs/configuration#version). It's useful for generating unique cache names inside your service worker, so that a later deployment of your app can invalidate old caches. + * See [`config.kit.version`](https://svelte.dev/docs/kit/configuration#version). It's useful for generating unique cache names inside your service worker, so that a later deployment of your app can invalidate old caches. */ export const version: string; } diff --git a/packages/migrate/README.md b/packages/migrate/README.md index 7c308494bb64..1dceb6d6f89e 100644 --- a/packages/migrate/README.md +++ b/packages/migrate/README.md @@ -18,8 +18,8 @@ npx sv migrate [migration] | Migration | From | To | Guide | | ------------- | --------------------- | --------------------- | --------------------------------------------------------------- | -| `sveltekit-2` | SvelteKit 1.0 | SvelteKit 2.0 | [Website](https://kit.svelte.dev/docs/migrating-to-sveltekit-2) | -| `svelte-4` | Svelte 3 | Svelte 4 | [Website](https://svelte.dev/docs/v4-migration-guide) | +| `sveltekit-2` | SvelteKit 1.0 | SvelteKit 2.0 | [Website](https://svelte.dev/docs/kit/migrating-to-sveltekit-2) | +| `svelte-4` | Svelte 3 | Svelte 4 | [Website](https://svelte.dev/docs/svelte/v4-migration-guide) | | `svelte-5` | Svelte 4 | Svelte 5 | | | `package` | `@sveltejs/package@1` | `@sveltejs/package@2` | [#8922](https://github.com/sveltejs/kit/pull/8922) | | `routes` | SvelteKit pre-1.0 | SvelteKit 1.0 | [#5774](https://github.com/sveltejs/kit/discussions/5774) | diff --git a/packages/migrate/migrations/package/index.js b/packages/migrate/migrations/package/index.js index f2d0683b667f..0e36547686f8 100644 --- a/packages/migrate/migrations/package/index.js +++ b/packages/migrate/migrations/package/index.js @@ -66,7 +66,7 @@ export async function migrate() { const tasks = [ use_git && cyan('git commit -m "migration to @sveltejs/package v2"'), 'Review the migration guide at https://github.com/sveltejs/kit/pull/8922', - 'Read the updated docs at https://kit.svelte.dev/docs/packaging' + 'Read the updated docs at https://svelte.dev/docs/kit/packaging' ].filter(Boolean); tasks.forEach((task, i) => { diff --git a/packages/migrate/migrations/svelte-4/index.js b/packages/migrate/migrations/svelte-4/index.js index 98ca69cb33d5..4fea5173da0e 100644 --- a/packages/migrate/migrations/svelte-4/index.js +++ b/packages/migrate/migrations/svelte-4/index.js @@ -53,7 +53,7 @@ export async function migrate() { type: 'confirm', name: 'value', message: - 'Add the `|global` modifier to currently global transitions for backwards compatibility? More info at https://svelte.dev/docs/v4-migration-guide#transitions-are-local-by-default', + 'Add the `|global` modifier to currently global transitions for backwards compatibility? More info at https://svelte.dev/docs/svelte/v4-migration-guide#transitions-are-local-by-default', initial: true }); @@ -96,8 +96,8 @@ export async function migrate() { const tasks = [ use_git && cyan('git commit -m "migration to Svelte 4"'), - 'Review the migration guide at https://svelte.dev/docs/v4-migration-guide', - 'Read the updated docs at https://svelte.dev/docs' + 'Review the migration guide at https://svelte.dev/docs/svelte/v4-migration-guide', + 'Read the updated docs at https://svelte.dev/docs/svelte' ].filter(Boolean); tasks.forEach((task, i) => { diff --git a/packages/migrate/migrations/svelte-4/migrate.js b/packages/migrate/migrations/svelte-4/migrate.js index b3067d451393..c459380ef441 100644 --- a/packages/migrate/migrations/svelte-4/migrate.js +++ b/packages/migrate/migrations/svelte-4/migrate.js @@ -30,7 +30,7 @@ export function update_pkg_json_content(content) { [ 'eslint-plugin-svelte3', '^4.0.0', - ' (this package is deprecated, use eslint-plugin-svelte instead. More info: https://svelte.dev/docs/v4-migration-guide#new-eslint-package)' + ' (this package is deprecated, use eslint-plugin-svelte instead. More info: https://svelte.dev/docs/svelte/v4-migration-guide#new-eslint-package)' ], [ 'typescript', @@ -70,7 +70,7 @@ export function transform_svelte_code(code, migrate_transition) { function update_svelte_options(code) { return code.replace(/<svelte:options([^]*?)\stag=([^]*?)\/?>/, (match) => { log_migration( - 'Replaced `svelte:options` `tag` attribute with `customElement` attribute: https://svelte.dev/docs/v4-migration-guide#custom-elements-with-svelte' + 'Replaced `svelte:options` `tag` attribute with `customElement` attribute: https://svelte.dev/docs/svelte/v4-migration-guide#custom-elements-with-svelte' ); return match.replace('tag=', 'customElement='); }); @@ -87,7 +87,7 @@ function update_transitions(code, migrate_transition) { const replaced = code.replace(/(\s)(transition:|in:|out:)(\w+)(?=[\s>=])/g, '$1$2$3|global'); if (replaced !== code) { log_migration( - 'Added `|global` to `transition`, `in`, and `out` directives (transitions are local by default now): https://svelte.dev/docs/v4-migration-guide#transitions-are-local-by-default' + 'Added `|global` to `transition`, `in`, and `out` directives (transitions are local by default now): https://svelte.dev/docs/svelte/v4-migration-guide#transitions-are-local-by-default' ); } code = replaced; @@ -95,7 +95,7 @@ function update_transitions(code, migrate_transition) { const replaced = code.replace(/(\s)(transition:|in:|out:)(\w+)(\|local)(?=[\s>=])/g, '$1$2$3'); if (replaced !== code) { log_migration( - 'Removed `|local` from `transition`, `in`, and `out` directives (transitions are local by default now): https://svelte.dev/docs/v4-migration-guide#transitions-are-local-by-default' + 'Removed `|local` from `transition`, `in`, and `out` directives (transitions are local by default now): https://svelte.dev/docs/svelte/v4-migration-guide#transitions-are-local-by-default' ); } return replaced; @@ -109,7 +109,7 @@ function update_transitions(code, migrate_transition) { function update_action_types(source, is_ts) { const logger = log_on_ts_modification( source, - 'Updated `Action` interface usages: https://svelte.dev/docs/v4-migration-guide#stricter-types-for-svelte-functions' + 'Updated `Action` interface usages: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' ); const imports = get_imports(source, 'svelte/action', 'Action'); @@ -152,7 +152,7 @@ function update_action_types(source, is_ts) { function update_action_return_types(source, is_ts) { const logger = log_on_ts_modification( source, - 'Updated `ActionReturn` interface usages: https://svelte.dev/docs/v4-migration-guide#stricter-types-for-svelte-functions' + 'Updated `ActionReturn` interface usages: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' ); const imports = get_imports(source, 'svelte/action', 'ActionReturn'); @@ -192,7 +192,7 @@ function update_action_return_types(source, is_ts) { function update_imports(source, is_ts) { const logger = log_on_ts_modification( source, - 'Replaced `SvelteComponentTyped` imports with `SvelteComponent` imports: https://svelte.dev/docs/v4-migration-guide#stricter-types-for-svelte-functions' + 'Replaced `SvelteComponentTyped` imports with `SvelteComponent` imports: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' ); const identifiers = find_identifiers(source, 'SvelteComponent'); @@ -252,7 +252,7 @@ function update_imports(source, is_ts) { function update_typeof_svelte_component(source, is_ts) { const logger = log_on_ts_modification( source, - 'Adjusted `typeof SvelteComponent` to `typeof SvelteComponent<any>`: https://svelte.dev/docs/v4-migration-guide#stricter-types-for-svelte-functions' + 'Adjusted `typeof SvelteComponent` to `typeof SvelteComponent<any>`: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' ); const imports = get_imports(source, 'svelte', 'SvelteComponent'); diff --git a/packages/migrate/migrations/svelte-5/migrate.js b/packages/migrate/migrations/svelte-5/migrate.js index 21cf4beec097..24ace9dc7148 100644 --- a/packages/migrate/migrations/svelte-5/migrate.js +++ b/packages/migrate/migrations/svelte-5/migrate.js @@ -33,7 +33,7 @@ export function update_pkg_json_content(content) { [ 'eslint-plugin-svelte3', '^4.0.0', - ' (this package is deprecated, use eslint-plugin-svelte instead. More info: https://svelte.dev/docs/v4-migration-guide#new-eslint-package)' + ' (this package is deprecated, use eslint-plugin-svelte instead. More info: https://svelte.dev/docs/svelte/v4-migration-guide#new-eslint-package)' ], [ 'typescript', diff --git a/packages/migrate/migrations/sveltekit-2/index.js b/packages/migrate/migrations/sveltekit-2/index.js index 6737c3090a9c..c62442aba5b2 100644 --- a/packages/migrate/migrations/sveltekit-2/index.js +++ b/packages/migrate/migrations/sveltekit-2/index.js @@ -151,8 +151,8 @@ export async function migrate() { const tasks = [ 'Run npm install (or the corresponding installation command of your package manager)', use_git && cyan('git commit -m "migration to SvelteKit 2"'), - 'Review the migration guide at https://kit.svelte.dev/docs/migrating-to-sveltekit-2', - 'Read the updated docs at https://kit.svelte.dev/docs' + 'Review the migration guide at https://svelte.dev/docs/kit/migrating-to-sveltekit-2', + 'Read the updated docs at https://svelte.dev/docs/kit' ].filter(Boolean); tasks.forEach((task, i) => { diff --git a/packages/migrate/migrations/sveltekit-2/migrate.js b/packages/migrate/migrations/sveltekit-2/migrate.js index 7d83fcea302b..ddd46d946f64 100644 --- a/packages/migrate/migrations/sveltekit-2/migrate.js +++ b/packages/migrate/migrations/sveltekit-2/migrate.js @@ -52,7 +52,7 @@ export function update_tsconfig_content(content) { if (updated !== content) { log_migration( 'Removed deprecated `importsNotUsedAsValues` and `preserveValueImports`' + - ' from tsconfig.json: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#updated-dependency-requirements' + ' from tsconfig.json: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#updated-dependency-requirements' ); } @@ -61,13 +61,13 @@ export function update_tsconfig_content(content) { if (updated !== content) { log_migration( 'Updated `moduleResolution` to `bundler`' + - ' in tsconfig.json: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#updated-dependency-requirements' + ' in tsconfig.json: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#updated-dependency-requirements' ); } if (content.includes('"paths":') || content.includes('"baseUrl":')) { log_migration( - '`paths` and/or `baseUrl` detected in your tsconfig.json - remove it and use `kit.alias` instead: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#generated-tsconfig-json-is-more-strict' + '`paths` and/or `baseUrl` detected in your tsconfig.json - remove it and use `kit.alias` instead: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#generated-tsconfig-json-is-more-strict' ); } @@ -89,7 +89,7 @@ export function update_svelte_config_content(code) { const result = code.replace(regex, ''); if (result !== code) { log_migration( - 'Removed `dangerZone` from svelte.config.js: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#server-fetches-are-not-trackable-anymore' + 'Removed `dangerZone` from svelte.config.js: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#server-fetches-are-not-trackable-anymore' ); } @@ -101,7 +101,7 @@ export function update_svelte_config_content(code) { const logger = log_on_ts_modification( source, - 'Changed `vitePreprocess` import: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#vitepreprocess-is-no-longer-exported-from-sveltejs-kit-vite' + 'Changed `vitePreprocess` import: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#vitepreprocess-is-no-longer-exported-from-sveltejs-kit-vite' ); if (namedImport.getParent().getParent().getNamedImports().length === 1) { @@ -150,7 +150,7 @@ export function transform_code(code, _is_ts, file_path) { function remove_throws(source) { const logger = log_on_ts_modification( source, - 'Removed `throw` from redirect/error functions: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#redirect-and-error-are-no-longer-thrown-by-you' + 'Removed `throw` from redirect/error functions: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#redirect-and-error-are-no-longer-thrown-by-you' ); /** @param {string} id */ @@ -200,7 +200,7 @@ function add_cookie_note(file_path, source) { const logger = log_on_ts_modification( source, - 'Search codebase for `@migration` and manually add the `path` option to `cookies.set/delete/serialize` calls: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#path-is-now-a-required-option-for-cookies' + 'Search codebase for `@migration` and manually add the `path` option to `cookies.set/delete/serialize` calls: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#path-is-now-a-required-option-for-cookies' ); const calls = []; @@ -279,7 +279,7 @@ function replace_resolve_path(source) { const logger = log_on_ts_modification( source, - 'Replaced `resolvePath` with `resolveRoute`: https://kit.svelte.dev/docs/migrating-to-sveltekit-2#resolvePath-has-been-removed' + 'Replaced `resolvePath` with `resolveRoute`: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#resolvePath-has-been-removed' ); const name_node = named_import.getNameNode(); diff --git a/packages/migrate/migrations/sveltekit-2/svelte-config-samples.md b/packages/migrate/migrations/sveltekit-2/svelte-config-samples.md index daa482375f39..9a06096a3986 100644 --- a/packages/migrate/migrations/sveltekit-2/svelte-config-samples.md +++ b/packages/migrate/migrations/sveltekit-2/svelte-config-samples.md @@ -51,7 +51,7 @@ import { vitePreprocess } from '@sveltejs/kit/vite'; /** @type {import('@sveltejs/kit').Config} */ const config = { - // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // Consult https://svelte.dev/docs/kit/integrations#preprocessors // for more information about preprocessors preprocess: vitePreprocess(), @@ -69,7 +69,7 @@ import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; /** @type {import('@sveltejs/kit').Config} */ const config = { - // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // Consult https://svelte.dev/docs/kit/integrations#preprocessors // for more information about preprocessors preprocess: vitePreprocess(), diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 99eb9d77921d..4e7580e85b6e 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -15,7 +15,7 @@ "directory": "packages/migrate" }, "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "bin": { "svelte-migrate": "./bin.js" diff --git a/packages/package/README.md b/packages/package/README.md index 740f32338967..edcbdb96a560 100644 --- a/packages/package/README.md +++ b/packages/package/README.md @@ -1,8 +1,8 @@ # The fastest way to build Svelte packages -Create Svelte packages, build and push them to npm. This is part of the [SvelteKit](https://kit.svelte.dev) framework and CLI. +[Build Svelte packages](https://svelte.dev/docs/kit/packaging) in correctly packaged format. -The quickest way to get started is via the [create-svelte](https://github.com/sveltejs/kit/tree/main/packages/create-svelte) package: +The quickest way to get started is via the [sv](https://npmjs.com/package/sv) package: ```bash npm sv create my-app @@ -11,7 +11,7 @@ npm install npm run dev ``` -See the [documentation](https://kit.svelte.dev/docs/packaging) to learn more. +See the [documentation](https://svelte.dev/docs/kit/packaging) to learn more. ## Changelog diff --git a/packages/package/package.json b/packages/package/package.json index 6809eabef077..a4e35f3e206e 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -17,7 +17,7 @@ "tool" ], "license": "MIT", - "homepage": "https://kit.svelte.dev", + "homepage": "https://svelte.dev", "type": "module", "dependencies": { "chokidar": "^4.0.0", diff --git a/packages/package/src/validate.js b/packages/package/src/validate.js index 31d2d285bba3..af97dc09b5ed 100644 --- a/packages/package/src/validate.js +++ b/packages/package/src/validate.js @@ -119,7 +119,7 @@ export function _create_validator(options) { warnings.push( 'You are using Svelte files, but did not declare a `svelte` condition in one of your `exports` in your `package.json`. ' + 'Add a `svelte` condition to your `exports` to ensure that your package is recognized as Svelte package by tooling. ' + - 'See https://kit.svelte.dev/docs/packaging#anatomy-of-a-package-json-exports for more info' + 'See https://svelte.dev/docs/kit/packaging#anatomy-of-a-package-json-exports for more info' ); } @@ -142,7 +142,7 @@ export function _create_validator(options) { } else { warnings.push( 'No `exports` field found in `package.json`, please provide one. ' + - 'See https://kit.svelte.dev/docs/packaging#anatomy-of-a-package-json-exports for more info' + 'See https://svelte.dev/docs/kit/packaging#anatomy-of-a-package-json-exports for more info' ); } From 820f3e738d01479aec435d0995bbcd8c5bb817f5 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 14:32:27 -0700 Subject: [PATCH 0700/1135] docs: update for svelte 5 --- documentation/docs/20-core-concepts/20-load.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 2a75cc5ca2f1..e60dcd3ca269 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -120,8 +120,8 @@ Data returned from layout `load` functions is available to child `+layout.svelte +++ // we can access `data.posts` because it's returned from // the parent layout `load` function - $: index = data.posts.findIndex(post => post.slug === $page.params.slug); - $: next = data.posts[index - 1];+++ + let index = $derived(data.posts.findIndex(post => post.slug === $page.params.slug)); + let next = $derived(data.posts[index - 1];)+++ </script> <h1>{data.post.title}</h1> From 855af3e31c1c3b1ebe9ae4543d2ec4285ab4909a Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Tue, 22 Oct 2024 18:31:12 -0400 Subject: [PATCH 0701/1135] docs: fix tutorial links (#12860) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- documentation/docs/10-getting-started/10-introduction.md | 2 +- documentation/docs/20-core-concepts/10-routing.md | 4 ++-- documentation/docs/20-core-concepts/20-load.md | 6 +++--- documentation/docs/20-core-concepts/30-form-actions.md | 2 +- documentation/docs/20-core-concepts/40-page-options.md | 2 +- documentation/docs/20-core-concepts/50-state-management.md | 4 ++-- documentation/docs/30-advanced/10-advanced-routing.md | 2 +- documentation/docs/30-advanced/20-hooks.md | 2 +- documentation/docs/30-advanced/25-errors.md | 4 ++-- documentation/docs/30-advanced/50-server-only-modules.md | 2 +- 10 files changed, 15 insertions(+), 15 deletions(-) diff --git a/documentation/docs/10-getting-started/10-introduction.md b/documentation/docs/10-getting-started/10-introduction.md index 2e7cae50029f..d1a5ca169533 100644 --- a/documentation/docs/10-getting-started/10-introduction.md +++ b/documentation/docs/10-getting-started/10-introduction.md @@ -4,7 +4,7 @@ title: Introduction ## Before we begin -> [!NOTE] If you're new to Svelte or SvelteKit we recommend checking out the [interactive tutorial](../tutorial/kit). +> [!NOTE] If you're new to Svelte or SvelteKit we recommend checking out the [interactive tutorial](/tutorial/kit). > > If you get stuck, reach out for help in the [Discord chatroom](https://svelte.dev/chat). diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 2d8845e77c45..0c48a2b2c2b7 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -394,6 +394,6 @@ If components and modules are needed by multiple routes, it's a good idea to put ## Further reading -- [Tutorial: Routing](../tutorial/kit/pages) -- [Tutorial: API routes](../tutorial/kit/get-handlers) +- [Tutorial: Routing](/tutorial/kit/pages) +- [Tutorial: API routes](/tutorial/kit/get-handlers) - [Docs: Advanced routing](advanced-routing) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index e60dcd3ca269..3e50259a3308 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -693,6 +693,6 @@ Putting an auth guard in `+layout.server.js` requires all child pages to call `a ## Further reading -- [Tutorial: Loading data](../tutorial/kit/page-data) -- [Tutorial: Errors and redirects](../tutorial/kit/error-basics) -- [Tutorial: Advanced loading](../tutorial/kit/await-parent) +- [Tutorial: Loading data](/tutorial/kit/page-data) +- [Tutorial: Errors and redirects](/tutorial/kit/error-basics) +- [Tutorial: Advanced loading](/tutorial/kit/await-parent) diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index 1aa45620c8ac..deb4ef73abc0 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -518,4 +518,4 @@ Submitting this form will navigate to `/search?q=...` and invoke your load funct ## Further reading -- [Tutorial: Forms](../tutorial/kit/the-form-element) +- [Tutorial: Forms](/tutorial/kit/the-form-element) diff --git a/documentation/docs/20-core-concepts/40-page-options.md b/documentation/docs/20-core-concepts/40-page-options.md index 84ae9fc3e23e..030ccc593412 100644 --- a/documentation/docs/20-core-concepts/40-page-options.md +++ b/documentation/docs/20-core-concepts/40-page-options.md @@ -219,4 +219,4 @@ export const config = { ## Further reading -- [Tutorial: Page options](../tutorial/kit/page-options) +- [Tutorial: Page options](/tutorial/kit/page-options) diff --git a/documentation/docs/20-core-concepts/50-state-management.md b/documentation/docs/20-core-concepts/50-state-management.md index acfd9d5ca3f6..f993f59ca6f8 100644 --- a/documentation/docs/20-core-concepts/50-state-management.md +++ b/documentation/docs/20-core-concepts/50-state-management.md @@ -82,7 +82,7 @@ If you're not using SSR, then there's no risk of accidentally exposing one user' ## Using stores with context -You might wonder how we're able to use `$page.data` and other [app stores]($app-stores) if we can't use our own stores. The answer is that app stores on the server use Svelte's [context API](../tutorial/svelte/context-api) — the store is attached to the component tree with `setContext`, and when you subscribe you retrieve it with `getContext`. We can do the same thing with our own stores: +You might wonder how we're able to use `$page.data` and other [app stores]($app-stores) if we can't use our own stores. The answer is that app stores on the server use Svelte's [context API](/tutorial/svelte/context-api) — the store is attached to the component tree with `setContext`, and when you subscribe you retrieve it with `getContext`. We can do the same thing with our own stores: ```svelte <!--- file: src/routes/+layout.svelte ---> @@ -143,7 +143,7 @@ When you navigate around your application, SvelteKit reuses existing layout and ...then navigating from `/blog/my-short-post` to `/blog/my-long-post` won't cause the layout, page and any other components within to be destroyed and recreated. Instead the `data` prop (and by extension `data.title` and `data.content`) will update (as it would with any other Svelte component) and, because the code isn't rerunning, lifecycle methods like `onMount` and `onDestroy` won't rerun and `estimatedReadingTime` won't be recalculated. -Instead, we need to make the value [_reactive_](../tutorial/svelte/state): +Instead, we need to make the value [_reactive_](/tutorial/svelte/state): ```svelte /// file: src/routes/blog/[slug]/+page.svelte diff --git a/documentation/docs/30-advanced/10-advanced-routing.md b/documentation/docs/30-advanced/10-advanced-routing.md index 07044fa7bcc7..26b1be2143e8 100644 --- a/documentation/docs/30-advanced/10-advanced-routing.md +++ b/documentation/docs/30-advanced/10-advanced-routing.md @@ -287,4 +287,4 @@ export function load(event) { ## Further reading -- [Tutorial: Advanced Routing](../tutorial/kit/optional-params) +- [Tutorial: Advanced Routing](/tutorial/kit/optional-params) diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index c2f3408498c5..74d4c815d835 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -270,4 +270,4 @@ Using `reroute` will _not_ change the contents of the browser's address bar, or ## Further reading -- [Tutorial: Hooks](../tutorial/kit/handle) +- [Tutorial: Hooks](/tutorial/kit/handle) diff --git a/documentation/docs/30-advanced/25-errors.md b/documentation/docs/30-advanced/25-errors.md index 63fbd83cc2c4..7449b5137723 100644 --- a/documentation/docs/30-advanced/25-errors.md +++ b/documentation/docs/30-advanced/25-errors.md @@ -144,5 +144,5 @@ This interface always includes a `message: string` property. ## Further reading -- [Tutorial: Errors and redirects](../tutorial/kit/error-basics) -- [Tutorial: Hooks](../tutorial/kit/handle) +- [Tutorial: Errors and redirects](/tutorial/kit/error-basics) +- [Tutorial: Hooks](/tutorial/kit/handle) diff --git a/documentation/docs/30-advanced/50-server-only-modules.md b/documentation/docs/30-advanced/50-server-only-modules.md index e20f9caa0925..54a49a2a308b 100644 --- a/documentation/docs/30-advanced/50-server-only-modules.md +++ b/documentation/docs/30-advanced/50-server-only-modules.md @@ -61,4 +61,4 @@ This feature also works with dynamic imports, even interpolated ones like ``awai ## Further reading -- [Tutorial: Environment variables](../tutorial/kit/env-static-private) +- [Tutorial: Environment variables](/tutorial/kit/env-static-private) From b2acab8374c92a20d201293cadea0360f7f37f66 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 22 Oct 2024 16:06:20 -0700 Subject: [PATCH 0702/1135] docs: fix link --- documentation/docs/60-appendix/25-debugging.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/60-appendix/25-debugging.md b/documentation/docs/60-appendix/25-debugging.md index f033622f9ab9..68c3f055eee4 100644 --- a/documentation/docs/60-appendix/25-debugging.md +++ b/documentation/docs/60-appendix/25-debugging.md @@ -2,7 +2,7 @@ title: Breakpoint Debugging --- -In addition to the [`@debug`](../svelte/debug) tag, you can also debug Svelte and SvelteKit projects using breakpoints within various tools and development environments. This includes both frontend and backend code. +In addition to the [`@debug`](../svelte/@debug) tag, you can also debug Svelte and SvelteKit projects using breakpoints within various tools and development environments. This includes both frontend and backend code. The following guides assume your JavaScript runtime environment is Node.js. From 8f516d135f7fe9b89ce7d0d04e4e87bc5ef49d95 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 23 Oct 2024 07:53:03 -0700 Subject: [PATCH 0703/1135] docs: fix links for new site (#12862) --- packages/kit/src/exports/public.d.ts | 38 ++++++++--------- packages/kit/src/types/ambient.d.ts | 4 +- .../types/synthetic/$env+dynamic+public.md | 2 +- .../types/synthetic/$env+static+private.md | 4 +- .../src/types/synthetic/$env+static+public.md | 2 +- packages/kit/types/index.d.ts | 42 +++++++++---------- 6 files changed, 46 insertions(+), 46 deletions(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 7b706387cbe0..fe0c0b01a504 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -128,7 +128,7 @@ export interface Builder { generateEnvModule(): void; /** - * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/types#public-types-server) with. + * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/@sveltejs-kit#Server) with. * @param opts a relative path to the base directory of the app and optionally in which format (esm or cjs) the manifest should be generated */ generateManifest(opts: { relativePath: string; routes?: RouteDefinition[] }): string; @@ -397,12 +397,12 @@ export interface KitConfig { */ dir?: string; /** - * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://svelte.dev/docs/kit/modules#$env-static-public) and [`$env/dynamic/public`](https://svelte.dev/docs/kit/modules#$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. + * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) and [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. * @default "PUBLIC_" */ publicPrefix?: string; /** - * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://svelte.dev/docs/kit/modules#$env-static-private) and [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private). + * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) and [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private). * @default "" * @since 1.21.0 */ @@ -505,7 +505,7 @@ export interface KitConfig { */ assets?: '' | `http://${string}` | `https://${string}`; /** - * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://svelte.dev/docs/kit/modules#$app-paths-base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. + * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://svelte.dev/docs/kit/$app-paths#base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. * @default "" */ base?: '' | `/${string}`; @@ -647,7 +647,7 @@ export interface KitConfig { * </script> * ``` * - * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://svelte.dev/docs/kit/modules#$app-stores-updated) store to `true` when it detects one. + * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://svelte.dev/docs/kit/$app-stores#updated) store to `true` when it detects one. */ version?: { /** @@ -730,7 +730,7 @@ export type HandleFetch = (input: { export type Reroute = (event: { url: URL }) => void | string; /** - * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) + * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `Load` directly. */ export type Load< @@ -742,7 +742,7 @@ export type Load< > = (event: LoadEvent<Params, InputData, ParentData, RouteId>) => MaybePromise<OutputData>; /** - * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) + * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `LoadEvent` directly. */ export interface LoadEvent< @@ -787,7 +787,7 @@ export interface LoadEvent< * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API in a server-only `load` function instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/@sveltejs-kit#Cookies) API in a server-only `load` function instead. * * `setHeaders` has no effect when a `load` function runs in the browser. */ @@ -800,7 +800,7 @@ export interface LoadEvent< */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -939,7 +939,7 @@ export interface Navigation { } /** - * The argument passed to [`beforeNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-beforenavigate) callbacks. + * The argument passed to [`beforeNavigate`](https://svelte.dev/docs/kit/$app-navigation#beforeNavigate) callbacks. */ export interface BeforeNavigate extends Navigation { /** @@ -949,7 +949,7 @@ export interface BeforeNavigate extends Navigation { } /** - * The argument passed to [`onNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-onnavigate) callbacks. + * The argument passed to [`onNavigate`](https://svelte.dev/docs/kit/$app-navigation#onNavigate) callbacks. */ export interface OnNavigate extends Navigation { /** @@ -967,7 +967,7 @@ export interface OnNavigate extends Navigation { } /** - * The argument passed to [`afterNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-afternavigate) callbacks. + * The argument passed to [`afterNavigate`](https://svelte.dev/docs/kit/$app-navigation#afterNavigate) callbacks. */ export interface AfterNavigate extends Omit<Navigation, 'type'> { /** @@ -1022,7 +1022,7 @@ export interface Page< */ data: App.PageData & Record<string, any>; /** - * The page state, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The page state, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/$app-navigation#pushState) and [`replaceState`](https://svelte.dev/docs/kit/$app-navigation#replaceState) functions from `$app/navigation`. */ state: App.PageState; /** @@ -1105,7 +1105,7 @@ export interface RequestEvent< * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/@sveltejs-kit#Cookies) API instead. */ setHeaders(headers: Record<string, string>): void; /** @@ -1126,7 +1126,7 @@ export interface RequestEvent< /** * A `(event: RequestEvent) => Response` function exported from a `+server.js` file that corresponds to an HTTP verb (`GET`, `PUT`, `PATCH`, etc) and handles requests with that method. * - * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://svelte.dev/docs/kit/types#generated-types) instead. + * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://svelte.dev/docs/kit/types#Generated-types) instead. */ export type RequestHandler< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1202,7 +1202,7 @@ export interface SSRManifest { } /** - * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) + * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `ServerLoad` directly. */ export type ServerLoad< @@ -1224,7 +1224,7 @@ export interface ServerLoadEvent< */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -1317,7 +1317,7 @@ export type ActionResult< | { type: 'error'; status?: number; error: any }; /** - * The object returned by the [`error`](https://svelte.dev/docs/kit/modules#sveltejs-kit-error) function. + * The object returned by the [`error`](https://svelte.dev/docs/kit/@sveltejs-kit#error) function. */ export interface HttpError { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses), in the range 400-599. */ @@ -1327,7 +1327,7 @@ export interface HttpError { } /** - * The object returned by the [`redirect`](https://svelte.dev/docs/kit/modules#sveltejs-kit-redirect) function + * The object returned by the [`redirect`](https://svelte.dev/docs/kit/@sveltejs-kit#redirect) function */ export interface Redirect { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages), in the range 300-308. */ diff --git a/packages/kit/src/types/ambient.d.ts b/packages/kit/src/types/ambient.d.ts index e63e8f98117e..bc936d57b31c 100644 --- a/packages/kit/src/types/ambient.d.ts +++ b/packages/kit/src/types/ambient.d.ts @@ -34,14 +34,14 @@ declare namespace App { export interface Locals {} /** - * Defines the common shape of the [$page.data store](https://svelte.dev/docs/kit/modules#$app-stores-page) - that is, the data that is shared between all pages. + * Defines the common shape of the [$page.data store](https://svelte.dev/docs/kit/$app-stores#page) - that is, the data that is shared between all pages. * The `Load` and `ServerLoad` functions in `./$types` will be narrowed accordingly. * Use optional properties for data that is only present on specific pages. Do not add an index signature (`[key: string]: any`). */ export interface PageData {} /** - * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/$app-navigation#pushState) and [`replaceState`](https://svelte.dev/docs/kit/$app-navigation#replaceState) functions from `$app/navigation`. */ export interface PageState {} diff --git a/packages/kit/src/types/synthetic/$env+dynamic+public.md b/packages/kit/src/types/synthetic/$env+dynamic+public.md index 95fdaf9c0d34..6e826d2fe2c0 100644 --- a/packages/kit/src/types/synthetic/$env+dynamic+public.md +++ b/packages/kit/src/types/synthetic/$env+dynamic+public.md @@ -1,4 +1,4 @@ -Similar to [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private), but only includes variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. +Similar to [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private), but only includes variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. Note that public dynamic environment variables must all be sent from the server to the client, causing larger network requests — when possible, use `$env/static/public` instead. diff --git a/packages/kit/src/types/synthetic/$env+static+private.md b/packages/kit/src/types/synthetic/$env+static+private.md index 20bdb6e90a4a..e36ef4efdd7f 100644 --- a/packages/kit/src/types/synthetic/$env+static+private.md +++ b/packages/kit/src/types/synthetic/$env+static+private.md @@ -1,6 +1,6 @@ -Environment variables [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env`. Like [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private), this module cannot be imported into client-side code. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured). +Environment variables [loaded by Vite](https://vitejs.dev/guide/env-and-mode.html#env-files) from `.env` files and `process.env`. Like [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private), this module cannot be imported into client-side code. This module only includes variables that _do not_ begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) _and do_ start with [`config.kit.env.privatePrefix`](https://svelte.dev/docs/kit/configuration#env) (if configured). -_Unlike_ [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private), the values exported from this module are statically injected into your bundle at build time, enabling optimisations like dead code elimination. +_Unlike_ [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private), the values exported from this module are statically injected into your bundle at build time, enabling optimisations like dead code elimination. ```ts import { API_KEY } from '$env/static/private'; diff --git a/packages/kit/src/types/synthetic/$env+static+public.md b/packages/kit/src/types/synthetic/$env+static+public.md index 16e5d0208a91..70a98b458f78 100644 --- a/packages/kit/src/types/synthetic/$env+static+public.md +++ b/packages/kit/src/types/synthetic/$env+static+public.md @@ -1,4 +1,4 @@ -Similar to [`$env/static/private`](https://svelte.dev/docs/kit/modules#$env-static-private), except that it only includes environment variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. +Similar to [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private), except that it only includes environment variables that begin with [`config.kit.env.publicPrefix`](https://svelte.dev/docs/kit/configuration#env) (which defaults to `PUBLIC_`), and can therefore safely be exposed to client-side code. Values are replaced statically at build time. diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 0595d25e2e60..f5b8aa40d34d 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -110,7 +110,7 @@ declare module '@sveltejs/kit' { generateEnvModule(): void; /** - * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/types#public-types-server) with. + * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/@sveltejs-kit#Server) with. * @param opts a relative path to the base directory of the app and optionally in which format (esm or cjs) the manifest should be generated */ generateManifest(opts: { relativePath: string; routes?: RouteDefinition[] }): string; @@ -379,12 +379,12 @@ declare module '@sveltejs/kit' { */ dir?: string; /** - * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://svelte.dev/docs/kit/modules#$env-static-public) and [`$env/dynamic/public`](https://svelte.dev/docs/kit/modules#$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. + * A prefix that signals that an environment variable is safe to expose to client-side code. See [`$env/static/public`](https://svelte.dev/docs/kit/$env-static-public) and [`$env/dynamic/public`](https://svelte.dev/docs/kit/$env-dynamic-public). Note that Vite's [`envPrefix`](https://vitejs.dev/config/shared-options.html#envprefix) must be set separately if you are using Vite's environment variable handling - though use of that feature should generally be unnecessary. * @default "PUBLIC_" */ publicPrefix?: string; /** - * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://svelte.dev/docs/kit/modules#$env-static-private) and [`$env/dynamic/private`](https://svelte.dev/docs/kit/modules#$env-dynamic-private). + * A prefix that signals that an environment variable is unsafe to expose to client-side code. Environment variables matching neither the public nor the private prefix will be discarded completely. See [`$env/static/private`](https://svelte.dev/docs/kit/$env-static-private) and [`$env/dynamic/private`](https://svelte.dev/docs/kit/$env-dynamic-private). * @default "" * @since 1.21.0 */ @@ -487,7 +487,7 @@ declare module '@sveltejs/kit' { */ assets?: '' | `http://${string}` | `https://${string}`; /** - * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://svelte.dev/docs/kit/modules#$app-paths-base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. + * A root-relative path that must start, but not end with `/` (e.g. `/base-path`), unless it is the empty string. This specifies where your app is served from and allows the app to live on a non-root path. Note that you need to prepend all your root-relative links with the base value or they will point to the root of your domain, not your `base` (this is how the browser works). You can use [`base` from `$app/paths`](https://svelte.dev/docs/kit/$app-paths#base) for that: `<a href="{base}/your-page">Link</a>`. If you find yourself writing this often, it may make sense to extract this into a reusable component. * @default "" */ base?: '' | `/${string}`; @@ -629,7 +629,7 @@ declare module '@sveltejs/kit' { * </script> * ``` * - * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://svelte.dev/docs/kit/modules#$app-stores-updated) store to `true` when it detects one. + * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://svelte.dev/docs/kit/$app-stores#updated) store to `true` when it detects one. */ version?: { /** @@ -712,7 +712,7 @@ declare module '@sveltejs/kit' { export type Reroute = (event: { url: URL }) => void | string; /** - * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) + * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `Load` directly. */ export type Load< @@ -724,7 +724,7 @@ declare module '@sveltejs/kit' { > = (event: LoadEvent<Params, InputData, ParentData, RouteId>) => MaybePromise<OutputData>; /** - * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) + * The generic form of `PageLoadEvent` and `LayoutLoadEvent`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `LoadEvent` directly. */ export interface LoadEvent< @@ -769,7 +769,7 @@ declare module '@sveltejs/kit' { * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API in a server-only `load` function instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/@sveltejs-kit#Cookies) API in a server-only `load` function instead. * * `setHeaders` has no effect when a `load` function runs in the browser. */ @@ -782,7 +782,7 @@ declare module '@sveltejs/kit' { */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -921,7 +921,7 @@ declare module '@sveltejs/kit' { } /** - * The argument passed to [`beforeNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-beforenavigate) callbacks. + * The argument passed to [`beforeNavigate`](https://svelte.dev/docs/kit/$app-navigation#beforeNavigate) callbacks. */ export interface BeforeNavigate extends Navigation { /** @@ -931,7 +931,7 @@ declare module '@sveltejs/kit' { } /** - * The argument passed to [`onNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-onnavigate) callbacks. + * The argument passed to [`onNavigate`](https://svelte.dev/docs/kit/$app-navigation#onNavigate) callbacks. */ export interface OnNavigate extends Navigation { /** @@ -949,7 +949,7 @@ declare module '@sveltejs/kit' { } /** - * The argument passed to [`afterNavigate`](https://svelte.dev/docs/kit/modules#$app-navigation-afternavigate) callbacks. + * The argument passed to [`afterNavigate`](https://svelte.dev/docs/kit/$app-navigation#afterNavigate) callbacks. */ export interface AfterNavigate extends Omit<Navigation, 'type'> { /** @@ -1004,7 +1004,7 @@ declare module '@sveltejs/kit' { */ data: App.PageData & Record<string, any>; /** - * The page state, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The page state, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/$app-navigation#pushState) and [`replaceState`](https://svelte.dev/docs/kit/$app-navigation#replaceState) functions from `$app/navigation`. */ state: App.PageState; /** @@ -1087,7 +1087,7 @@ declare module '@sveltejs/kit' { * * Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. * - * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/types#public-types-cookies) API instead. + * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/@sveltejs-kit#Cookies) API instead. */ setHeaders(headers: Record<string, string>): void; /** @@ -1108,7 +1108,7 @@ declare module '@sveltejs/kit' { /** * A `(event: RequestEvent) => Response` function exported from a `+server.js` file that corresponds to an HTTP verb (`GET`, `PUT`, `PATCH`, etc) and handles requests with that method. * - * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://svelte.dev/docs/kit/types#generated-types) instead. + * It receives `Params` as the first generic argument, which you can skip by using [generated types](https://svelte.dev/docs/kit/types#Generated-types) instead. */ export type RequestHandler< Params extends Partial<Record<string, string>> = Partial<Record<string, string>>, @@ -1184,7 +1184,7 @@ declare module '@sveltejs/kit' { } /** - * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#generated-types)) + * The generic form of `PageServerLoad` and `LayoutServerLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `ServerLoad` directly. */ export type ServerLoad< @@ -1206,7 +1206,7 @@ declare module '@sveltejs/kit' { */ parent(): Promise<ParentData>; /** - * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/modules#$app-navigation-invalidate) to cause `load` to rerun. + * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * * Most of the time you won't need this, as `fetch` calls `depends` on your behalf — it's only necessary if you're using a custom API client that bypasses `fetch`. * @@ -1299,7 +1299,7 @@ declare module '@sveltejs/kit' { | { type: 'error'; status?: number; error: any }; /** - * The object returned by the [`error`](https://svelte.dev/docs/kit/modules#sveltejs-kit-error) function. + * The object returned by the [`error`](https://svelte.dev/docs/kit/@sveltejs-kit#error) function. */ export interface HttpError { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses), in the range 400-599. */ @@ -1309,7 +1309,7 @@ declare module '@sveltejs/kit' { } /** - * The object returned by the [`redirect`](https://svelte.dev/docs/kit/modules#sveltejs-kit-redirect) function + * The object returned by the [`redirect`](https://svelte.dev/docs/kit/@sveltejs-kit#redirect) function */ export interface Redirect { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages), in the range 300-308. */ @@ -2275,14 +2275,14 @@ declare namespace App { export interface Locals {} /** - * Defines the common shape of the [$page.data store](https://svelte.dev/docs/kit/modules#$app-stores-page) - that is, the data that is shared between all pages. + * Defines the common shape of the [$page.data store](https://svelte.dev/docs/kit/$app-stores#page) - that is, the data that is shared between all pages. * The `Load` and `ServerLoad` functions in `./$types` will be narrowed accordingly. * Use optional properties for data that is only present on specific pages. Do not add an index signature (`[key: string]: any`). */ export interface PageData {} /** - * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/modules#$app-navigation-pushstate) and [`replaceState`](https://svelte.dev/docs/kit/modules#$app-navigation-replacestate) functions from `$app/navigation`. + * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/$app-navigation#pushState) and [`replaceState`](https://svelte.dev/docs/kit/$app-navigation#replaceState) functions from `$app/navigation`. */ export interface PageState {} From d76d8c5072be1a20c70198ae0bd36773ac1510ee Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 23 Oct 2024 10:52:29 -0700 Subject: [PATCH 0704/1135] docs: update link hash casing --- documentation/docs/40-best-practices/10-accessibility.md | 2 +- packages/kit/src/exports/public.d.ts | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/documentation/docs/40-best-practices/10-accessibility.md b/documentation/docs/40-best-practices/10-accessibility.md index ffa4a0852e68..a432acbe6687 100644 --- a/documentation/docs/40-best-practices/10-accessibility.md +++ b/documentation/docs/40-best-practices/10-accessibility.md @@ -29,7 +29,7 @@ This will allow screen readers and other assistive technology to identify the ne In traditional server-rendered applications, every navigation will reset focus to the top of the page. This ensures that people browsing the web with a keyboard or screen reader will start interacting with the page from the beginning. -To simulate this behavior during client-side routing, SvelteKit focuses the `<body>` element after each navigation and [enhanced form submission](form-actions#progressive-enhancement). There is one exception - if an element with the [`autofocus`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus) attribute is present, SvelteKit will focus that element instead. Make sure to [consider the implications for assistive technology](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus#accessibility_considerations) when using that attribute. +To simulate this behavior during client-side routing, SvelteKit focuses the `<body>` element after each navigation and [enhanced form submission](form-actions#Progressive-enhancement). There is one exception - if an element with the [`autofocus`](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus) attribute is present, SvelteKit will focus that element instead. Make sure to [consider the implications for assistive technology](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/autofocus#accessibility_considerations) when using that attribute. If you want to customize SvelteKit's focus management, you can use the `afterNavigate` hook: diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index fe0c0b01a504..7a3f4c9164e4 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -724,7 +724,7 @@ export type HandleFetch = (input: { }) => MaybePromise<Response>; /** - * The [`reroute`](https://svelte.dev/docs/kit/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. + * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ export type Reroute = (event: { url: URL }) => void | string; @@ -760,7 +760,7 @@ export interface LoadEvent< * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies) */ fetch: typeof fetch; /** @@ -1032,7 +1032,7 @@ export interface Page< } /** - * The shape of a param matcher. See [matching](https://svelte.dev/docs/kit/advanced-routing#matching) for more info. + * The shape of a param matcher. See [matching](https://svelte.dev/docs/kit/advanced-routing#Matching) for more info. */ export type ParamMatcher = (param: string) => boolean; @@ -1053,7 +1053,7 @@ export interface RequestEvent< * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies) */ fetch: typeof fetch; /** From 4958421a91f1b4866adab81b0de7fa04e36cef7e Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:04:01 -0700 Subject: [PATCH 0705/1135] fix: format --- packages/kit/src/exports/public.d.ts | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 7a3f4c9164e4..dfe8a125ad63 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -79,11 +79,12 @@ export interface ActionFailure<T extends Record<string, unknown> | undefined = u [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } -type UnpackValidationError<T> = T extends ActionFailure<infer X> - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; +type UnpackValidationError<T> = + T extends ActionFailure<infer X> + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. From f9a98168d2023fe54a8cfcacc060f1f6bbbcb1e9 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 23 Oct 2024 11:04:34 -0700 Subject: [PATCH 0706/1135] fix: generate types --- packages/kit/types/index.d.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index f5b8aa40d34d..a9634841c4cd 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -61,11 +61,12 @@ declare module '@sveltejs/kit' { [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } - type UnpackValidationError<T> = T extends ActionFailure<infer X> - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; + type UnpackValidationError<T> = + T extends ActionFailure<infer X> + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. @@ -706,7 +707,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise<Response>; /** - * The [`reroute`](https://svelte.dev/docs/kit/hooks#universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. + * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ export type Reroute = (event: { url: URL }) => void | string; @@ -742,7 +743,7 @@ declare module '@sveltejs/kit' { * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies) */ fetch: typeof fetch; /** @@ -1014,7 +1015,7 @@ declare module '@sveltejs/kit' { } /** - * The shape of a param matcher. See [matching](https://svelte.dev/docs/kit/advanced-routing#matching) for more info. + * The shape of a param matcher. See [matching](https://svelte.dev/docs/kit/advanced-routing#Matching) for more info. */ export type ParamMatcher = (param: string) => boolean; @@ -1035,7 +1036,7 @@ declare module '@sveltejs/kit' { * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies) */ fetch: typeof fetch; /** From 312f130da720d76fe8b9066ab8720ecaafd65d52 Mon Sep 17 00:00:00 2001 From: songkeys <songv587@gmail.com> Date: Thu, 24 Oct 2024 05:21:56 +0800 Subject: [PATCH 0707/1135] docs: remove svelte 5's preview status in performance (#12864) --- documentation/docs/40-best-practices/05-performance.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/40-best-practices/05-performance.md b/documentation/docs/40-best-practices/05-performance.md index 390236d9a2f7..2e358921dc7f 100644 --- a/documentation/docs/40-best-practices/05-performance.md +++ b/documentation/docs/40-best-practices/05-performance.md @@ -57,7 +57,7 @@ You can reduce the size of font files by [subsetting](https://web.dev/learn/perf ### Svelte version -We recommend running the latest version of Svelte. Svelte 4 is smaller and faster than Svelte 3. (The [Svelte 5 preview](https://svelte-5-preview.vercel.app/) is much smaller and faster still, but we don't recommend that you upgrade to this version until it's production ready.) +We recommend running the latest version of Svelte. Svelte 5 is smaller and faster than Svelte 4, which is smaller and faster than Svelte 3. ### Packages From 723eb8b31e6a22c82f730c30e485386c8676b746 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Thu, 24 Oct 2024 05:23:18 +0800 Subject: [PATCH 0708/1135] fix: explain why `json()` cannot be used in form actions (#12829) closes #12787 Adds a check to see if the data being returned is a Response object (such as with the helper method json()), then replies with a more helpful error message. --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/healthy-planets-dance.md | 5 +++++ packages/kit/src/runtime/server/page/actions.js | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 .changeset/healthy-planets-dance.md diff --git a/.changeset/healthy-planets-dance.md b/.changeset/healthy-planets-dance.md new file mode 100644 index 000000000000..aaeda9d953b3 --- /dev/null +++ b/.changeset/healthy-planets-dance.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: better error message when a `Result` is returned from a form action diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index a36a8d1ecd7e..97e01e34d770 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -280,6 +280,14 @@ function try_deserialize(data, fn, route_id) { // If we're here, the data could not be serialized with devalue const error = /** @type {any} */ (e); + // if someone tries to use `json()` in their action + if (data instanceof Response) { + throw new Error( + `Data returned from action inside ${route_id} is not serializable. Form actions need to return plain objects or fail(). E.g. return { success: true } or return fail(400, { message: "invalid" });` + ); + } + + // if devalue could not serialize a property on the object, etc. if ('path' in error) { let message = `Data returned from action inside ${route_id} is not serializable: ${error.message}`; if (error.path !== '') message += ` (data.${error.path})`; From dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Thu, 24 Oct 2024 05:25:31 +0800 Subject: [PATCH 0709/1135] fix: include importer in illegal import error message (#12820) closes #12550 Uses the resolveId hook to get the importer name before including it in the error message when loading the illegal import in the load hook. --- .changeset/dry-cows-smash.md | 5 +++++ packages/kit/src/exports/vite/index.js | 18 +++++++++++++++++- packages/kit/test/apps/dev-only/test/test.js | 8 ++++---- 3 files changed, 26 insertions(+), 5 deletions(-) create mode 100644 .changeset/dry-cows-smash.md diff --git a/.changeset/dry-cows-smash.md b/.changeset/dry-cows-smash.md new file mode 100644 index 000000000000..df3a91c5f977 --- /dev/null +++ b/.changeset/dry-cows-smash.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: include importer in illegal import error message diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 1d92fcc38ccf..01f2c98f3f91 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -352,6 +352,9 @@ async function kit({ svelte_config }) { } }; + /** @type {Map<string, string>} */ + const import_map = new Map(); + /** @type {import('vite').Plugin} */ const plugin_virtual_modules = { name: 'vite-plugin-sveltekit-virtual-modules', @@ -372,6 +375,8 @@ async function kit({ svelte_config }) { `Cannot import ${id} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.` ); } + + import_map.set(id, importer); } // treat $env/static/[public|private] as virtual @@ -398,7 +403,18 @@ async function kit({ svelte_config }) { }) ) { const relative = normalize_id(id, normalized_lib, normalized_cwd); - throw new Error(`Cannot import ${strip_virtual_prefix(relative)} into client-side code`); + + const illegal_module = strip_virtual_prefix(relative); + + if (import_map.has(illegal_module)) { + const importer = path.relative( + cwd, + /** @type {string} */ (import_map.get(illegal_module)) + ); + throw new Error(`Cannot import ${illegal_module} into client-side code: ${importer}`); + } + + throw new Error(`Cannot import ${illegal_module} into client-side code`); } } diff --git a/packages/kit/test/apps/dev-only/test/test.js b/packages/kit/test/apps/dev-only/test/test.js index dfb8a4a99e13..00a2288b1daf 100644 --- a/packages/kit/test/apps/dev-only/test/test.js +++ b/packages/kit/test/apps/dev-only/test/test.js @@ -17,7 +17,7 @@ test.describe.serial('Illegal imports', () => { wait_for_started: false }); expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/dynamic/private into client-side code' + 'Cannot import $env/dynamic/private into client-side code: src/routes/illegal-imports/env/dynamic-private/+page.svelte' ); }); @@ -26,7 +26,7 @@ test.describe.serial('Illegal imports', () => { wait_for_started: false }); expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/dynamic/private into client-side code' + 'Cannot import $env/dynamic/private into client-side code: src/routes/illegal-imports/env/dynamic-private-dynamic-import/+page.svelte' ); }); @@ -35,7 +35,7 @@ test.describe.serial('Illegal imports', () => { wait_for_started: false }); expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/static/private into client-side code' + 'Cannot import $env/static/private into client-side code: src/routes/illegal-imports/env/static-private/+page.svelte' ); }); @@ -44,7 +44,7 @@ test.describe.serial('Illegal imports', () => { wait_for_started: false }); expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/static/private into client-side code' + 'Cannot import $env/static/private into client-side code: src/routes/illegal-imports/env/static-private-dynamic-import/+page.svelte' ); }); From 3a9b78f04786898ca93f6d4b75ab18d26bc45192 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Fri, 25 Oct 2024 16:56:38 +0800 Subject: [PATCH 0710/1135] fix: decode URI when previewing prerendered pages (#12874) fixes #12865 The issue only affected the preview server as we weren't decoding the URI before checking if the prerendered file existed or not --- .changeset/eleven-turkeys-jump.md | 5 +++++ packages/kit/src/exports/vite/preview/index.js | 7 +++++++ .../prerendering/\344\270\255\346\226\207/+page.svelte" | 0 .../routes/prerendering/\344\270\255\346\226\207/+page.ts" | 1 + packages/kit/test/apps/basics/test/server.test.js | 5 +++++ 5 files changed, 18 insertions(+) create mode 100644 .changeset/eleven-turkeys-jump.md create mode 100644 "packages/kit/test/apps/basics/src/routes/prerendering/\344\270\255\346\226\207/+page.svelte" create mode 100644 "packages/kit/test/apps/basics/src/routes/prerendering/\344\270\255\346\226\207/+page.ts" diff --git a/.changeset/eleven-turkeys-jump.md b/.changeset/eleven-turkeys-jump.md new file mode 100644 index 000000000000..b50200cf69f0 --- /dev/null +++ b/.changeset/eleven-turkeys-jump.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: decode non-latin characters when previewing prerendered pages diff --git a/packages/kit/src/exports/vite/preview/index.js b/packages/kit/src/exports/vite/preview/index.js index 2b4214e843f2..37e04f72f602 100644 --- a/packages/kit/src/exports/vite/preview/index.js +++ b/packages/kit/src/exports/vite/preview/index.js @@ -131,6 +131,13 @@ export async function preview(vite, vite_config, svelte_config) { let filename = normalizePath( join(svelte_config.kit.outDir, 'output/prerendered/pages' + pathname) ); + + try { + filename = decodeURI(filename); + } catch { + // malformed URI + } + let prerendered = is_file(filename); if (!prerendered) { diff --git "a/packages/kit/test/apps/basics/src/routes/prerendering/\344\270\255\346\226\207/+page.svelte" "b/packages/kit/test/apps/basics/src/routes/prerendering/\344\270\255\346\226\207/+page.svelte" new file mode 100644 index 000000000000..e69de29bb2d1 diff --git "a/packages/kit/test/apps/basics/src/routes/prerendering/\344\270\255\346\226\207/+page.ts" "b/packages/kit/test/apps/basics/src/routes/prerendering/\344\270\255\346\226\207/+page.ts" new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ "b/packages/kit/test/apps/basics/src/routes/prerendering/\344\270\255\346\226\207/+page.ts" @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 6590346e21b1..ff77c55f0204 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -630,6 +630,11 @@ test.describe('Miscellaneous', () => { expect(response.status()).toBe(200); expect(await response.text()).toBe('foo'); }); + + test('serves prerendered non-latin pages', async ({ request }) => { + const response = await request.get('/prerendering/中文'); + expect(response.status()).toBe(200); + }); }); test.describe('reroute', () => { From 4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Fri, 25 Oct 2024 18:00:14 +0800 Subject: [PATCH 0711/1135] fix: revert using server read for load function fetch (#12876) * revert server read for fetch * changeset * check file existance instead --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/eight-insects-live.md | 5 +++++ packages/kit/src/runtime/server/fetch.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/eight-insects-live.md diff --git a/.changeset/eight-insects-live.md b/.changeset/eight-insects-live.md new file mode 100644 index 000000000000..ad50fb22cd4f --- /dev/null +++ b/.changeset/eight-insects-live.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: don't try reading assets directly that aren't present diff --git a/packages/kit/src/runtime/server/fetch.js b/packages/kit/src/runtime/server/fetch.js index 7e2177d6661c..417b59c93063 100644 --- a/packages/kit/src/runtime/server/fetch.js +++ b/packages/kit/src/runtime/server/fetch.js @@ -97,7 +97,7 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade return new Response(state.read(file), { headers: type ? { 'content-type': type } : {} }); - } else if (read_implementation) { + } else if (read_implementation && file in manifest._.server_assets) { const length = manifest._.server_assets[file]; const type = manifest.mimeTypes[file.slice(file.lastIndexOf('.'))]; From bd82819e668a13bf78cf97ba1103ce9582cf01ba Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 25 Oct 2024 13:45:16 +0200 Subject: [PATCH 0712/1135] docs: more Svelte 5 conversion (#12871) --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> Co-authored-by: Willow (GHOST) <ghostdevbusiness@gmail.com> Co-authored-by: Sri Senthil Balaji J <50240805+SymphonySimper@users.noreply.github.com> Co-authored-by: Tee Ming <chewteeming01@gmail.com> --- .../docs/20-core-concepts/10-routing.md | 45 ++++++++++++------- .../docs/20-core-concepts/20-load.md | 33 +++++++------- .../docs/20-core-concepts/30-form-actions.md | 25 +++++------ .../20-core-concepts/50-state-management.md | 18 ++++---- .../25-build-and-deploy/90-adapter-vercel.md | 4 +- .../docs/30-advanced/10-advanced-routing.md | 6 +-- .../docs/30-advanced/65-snapshots.md | 2 +- .../docs/30-advanced/67-shallow-routing.md | 2 +- documentation/docs/98-reference/26-$lib.md | 16 ++++++- packages/kit/src/exports/public.d.ts | 15 +++---- packages/kit/types/index.d.ts | 15 +++---- 11 files changed, 104 insertions(+), 77 deletions(-) diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 0c48a2b2c2b7..66d2af54bb61 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -37,17 +37,22 @@ A `+page.svelte` component defines a page of your app. By default, pages are ren <a href="/">Home</a> ``` +Pages can receive data from `load` functions via the `data` prop. + ```svelte <!--- file: src/routes/blog/[slug]/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); </script> <h1>{data.title}</h1> <div>{@html data.content}</div> ``` +> [!LEGACY] In Svelte 4 +> In Svelte 4, you'd use `export let data` instead + > [!NOTE] Note that SvelteKit uses `<a>` elements to navigate between routes, rather than a framework-specific `<Link>` component. ### +page.js @@ -153,21 +158,29 @@ But in many apps, there are elements that should be visible on _every_ page, suc To create a layout that applies to every page, make a file called `src/routes/+layout.svelte`. The default layout (the one that SvelteKit uses if you don't bring your own) looks like this... -```html -<slot></slot> +```svelte +<script> + let { children } = $props(); +</script> + +{@render children()} ``` -...but we can add whatever markup, styles and behaviour we want. The only requirement is that the component includes a `<slot>` for the page content. For example, let's add a nav bar: +...but we can add whatever markup, styles and behaviour we want. The only requirement is that the component includes a `@render` tag for the page content. For example, let's add a nav bar: + +```svelte +<!---- file: src/routes/+layout.svelte ---> +<script> + let { children } = $props(); +</script> -```html -/// file: src/routes/+layout.svelte <nav> <a href="/">Home</a> <a href="/about">About</a> <a href="/settings">Settings</a> </nav> -<slot></slot> +{@render children()} ``` If we create pages for `/`, `/about` and `/settings`... @@ -196,8 +209,8 @@ We can create a layout that only applies to pages below `/settings` (while inher ```svelte <!--- file: src/routes/settings/+layout.svelte ---> <script> - /** @type {import('./$types').LayoutData} */ - export let data; + /** @type {{ data: import('./$types').LayoutData, children: import('svelte').Snippet }} */ + let { data, children } = $props(); </script> <h1>Settings</h1> @@ -208,7 +221,7 @@ We can create a layout that only applies to pages below `/settings` (while inher {/each} </div> -<slot></slot> +{@render children()} ``` You can see how `data` is populated by looking at the `+layout.js` example in the next section just below. @@ -239,8 +252,8 @@ Data returned from a layout's `load` function is also available to all its child ```svelte <!--- file: src/routes/settings/profile/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); console.log(data.sections); // [{ slug: 'profile', title: 'Profile' }, ...] </script> @@ -370,13 +383,13 @@ export async function fallback({ request }) { Throughout the examples above, we've been importing types from a `$types.d.ts` file. This is a file SvelteKit creates for you in a hidden directory if you're using TypeScript (or JavaScript with JSDoc type annotations) to give you type safety when working with your root files. -For example, annotating `export let data` with `PageData` (or `LayoutData`, for a `+layout.svelte` file) tells TypeScript that the type of `data` is whatever was returned from `load`: +For example, annotating `let { data } = $props()` with `PageData` (or `LayoutData`, for a `+layout.svelte` file) tells TypeScript that the type of `data` is whatever was returned from `load`: ```svelte <!--- file: src/routes/blog/[slug]/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); </script> ``` diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 3e50259a3308..d6739fca0c86 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -24,14 +24,17 @@ export function load({ params }) { ```svelte <!--- file: src/routes/blog/[slug]/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); </script> <h1>{data.post.title}</h1> <div>{@html data.post.content}</div> ``` +> [!LEGACY] In Svelte 4 +> In Svelte 4, you'd use `export let data` instead + Thanks to the generated `$types` module, we get full type safety. A `load` function in a `+page.js` file runs both on the server and in the browser (unless combined with `export const ssr = false`, in which case it will [only run in the browser](page-options#ssr)). If your `load` function should _always_ run on the server (because it uses private environment variables, for example, or accesses a database) then it would go in a `+page.server.js` instead. @@ -85,13 +88,13 @@ export async function load() { ```svelte <!--- file: src/routes/blog/[slug]/+layout.svelte ---> <script> - /** @type {import('./$types').LayoutData} */ - export let data; + /** @type {{ data: import('./$types').LayoutData, children: Snippet }} */ + let { data, children } = $props(); </script> <main> - <!-- +page.svelte is rendered in this <slot> --> - <slot /> + <!-- +page.svelte is `@render`ed here --> + {@render children()} </main> <aside> @@ -115,13 +118,13 @@ Data returned from layout `load` functions is available to child `+layout.svelte <script> +++import { page } from '$app/stores';+++ - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); +++ // we can access `data.posts` because it's returned from // the parent layout `load` function let index = $derived(data.posts.findIndex(post => post.slug === $page.params.slug)); - let next = $derived(data.posts[index - 1];)+++ + let next = $derived(data.posts[index + 1]);+++ </script> <h1>{data.post.title}</h1> @@ -365,8 +368,8 @@ export async function load({ parent }) { ```svelte <!--- file: src/routes/abc/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); </script> <!-- renders `1 + 2 = 3` --> @@ -504,8 +507,8 @@ This is useful for creating skeleton loading states, for example: ```svelte <!--- file: src/routes/blog/[slug]/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); </script> <h1>{data.post.title}</h1> @@ -645,8 +648,8 @@ export async function load({ fetch, depends }) { <script> import { invalidate, invalidateAll } from '$app/navigation'; - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); function rerunLoadFunction() { // any of these will cause the `load` function to rerun diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index deb4ef73abc0..5d8c439f86b6 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -140,11 +140,8 @@ export const actions = { ```svelte <!--- file: src/routes/login/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; - - /** @type {import('./$types').ActionData} */ - export let form; + /** @type {{ data: import('./$types').PageData, form: import('./$types').ActionData }} */ + let { data, form } = $props(); </script> {#if form?.success} @@ -154,6 +151,9 @@ export const actions = { {/if} ``` +> [!LEGACY] In Svelte 4 +> In Svelte 4, you'd use `export let data` and `export let form` instead to declare properties + ### Validation errors If the request couldn't be processed because of invalid data, you can return validation errors — along with the previously submitted form values — back to the user so that they can try again. The `fail` function lets you return an HTTP status code (typically 400 or 422, in the case of validation errors) along with the data. The status code is available through `$page.status` and the data through `form`: @@ -339,8 +339,8 @@ The easiest way to progressively enhance a form is to add the `use:enhance` acti <script> +++import { enhance } from '$app/forms';+++ - /** @type {import('./$types').ActionData} */ - export let form; + /** @type {{ form: import('./$types').ActionData }} */ + let { form } = $props(); </script> <form method="POST" +++use:enhance+++> @@ -390,8 +390,8 @@ If you return a callback, you may need to reproduce part of the default `use:enh <script> import { enhance, +++applyAction+++ } from '$app/forms'; - /** @type {import('./$types').ActionData} */ - export let form; + /** @type {{ form: import('./$types').ActionData }} */ + let { form } = $props(); </script> <form @@ -427,11 +427,8 @@ We can also implement progressive enhancement ourselves, without `use:enhance`, import { invalidateAll, goto } from '$app/navigation'; import { applyAction, deserialize } from '$app/forms'; - /** @type {import('./$types').ActionData} */ - export let form; - - /** @type {any} */ - let error; + /** @type {{ form: import('./$types').ActionData }} */ + let { form } = $props(); /** @param {{ currentTarget: EventTarget & HTMLFormElement}} event */ async function handleSubmit(event) { diff --git a/documentation/docs/20-core-concepts/50-state-management.md b/documentation/docs/20-core-concepts/50-state-management.md index f993f59ca6f8..be74d59535ef 100644 --- a/documentation/docs/20-core-concepts/50-state-management.md +++ b/documentation/docs/20-core-concepts/50-state-management.md @@ -90,12 +90,14 @@ You might wonder how we're able to use `$page.data` and other [app stores]($app- import { setContext } from 'svelte'; import { writable } from 'svelte/store'; - /** @type {import('./$types').LayoutData} */ - export let data; + /** @type {{ data: import('./$types').LayoutData }} */ + let { data } = $props(); // Create a store and update it when necessary... - const user = writable(); - $: user.set(data.user); + const user = writable(data.user); + $effect.pre(() => { + user.set(data.user); + }); // ...and add it to the context for child components to access setContext('user', user); @@ -125,8 +127,8 @@ When you navigate around your application, SvelteKit reuses existing layout and ```svelte <!--- file: src/routes/blog/[slug]/+page.svelte ---> <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); // THIS CODE IS BUGGY! const wordCount = data.content.split(' ').length; @@ -148,8 +150,8 @@ Instead, we need to make the value [_reactive_](/tutorial/svelte/state): ```svelte /// file: src/routes/blog/[slug]/+page.svelte <script> - /** @type {import('./$types').PageData} */ - export let data; + /** @type {{ data: import('./$types').PageData }} */ + let { data } = $props(); +++ let wordCount = $state(data.content.split(' ').length); let estimatedReadingTime = $derived(wordCount / 250);+++ diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index 226d8cb6cae1..57867ce7c986 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -140,8 +140,8 @@ export function load() { ```svelte <!--- file: +layout.svelte ---> <script> - /** @type {import('./$types').LayoutServerData} */ - export let data; + /** @type {{ data: import('./$types').LayoutServerData }} */ + let { data } = $props(); </script> <p>This staging environment was deployed from {data.deploymentGitBranch}.</p> diff --git a/documentation/docs/30-advanced/10-advanced-routing.md b/documentation/docs/30-advanced/10-advanced-routing.md index 26b1be2143e8..06122648f170 100644 --- a/documentation/docs/30-advanced/10-advanced-routing.md +++ b/documentation/docs/30-advanced/10-advanced-routing.md @@ -193,7 +193,7 @@ You can also put a `+page` directly inside a `(group)`, for example if `/` shoul ### Breaking out of layouts -The root layout applies to every page of your app — if omitted, it defaults to `<slot />`. If you want some pages to have a different layout hierarchy than the rest, then you can put your entire app inside one or more groups _except_ the routes that should not inherit the common layouts. +The root layout applies to every page of your app — if omitted, it defaults to `{@render children()}`. If you want some pages to have a different layout hierarchy than the rest, then you can put your entire app inside one or more groups _except_ the routes that should not inherit the common layouts. In the example above, the `/admin` route does not inherit either the `(app)` or `(marketing)` layouts. @@ -260,11 +260,11 @@ Not all use cases are suited for layout grouping, nor should you feel compelled <!--- file: src/routes/nested/route/+layout@.svelte ---> <script> import ReusableLayout from '$lib/ReusableLayout.svelte'; - export let data; + let { data, children } = $props(); </script> <ReusableLayout {data}> - <slot /> + {@render children()} </ReusableLayout> ``` diff --git a/documentation/docs/30-advanced/65-snapshots.md b/documentation/docs/30-advanced/65-snapshots.md index 5a55330f0d38..cc7477f0fe66 100644 --- a/documentation/docs/30-advanced/65-snapshots.md +++ b/documentation/docs/30-advanced/65-snapshots.md @@ -11,7 +11,7 @@ To do this, export a `snapshot` object with `capture` and `restore` methods from ```svelte <!--- file: +page.svelte ---> <script> - let comment = ''; + let comment = $state(''); /** @type {import('./$types').Snapshot<string>} */ export const snapshot = { diff --git a/documentation/docs/30-advanced/67-shallow-routing.md b/documentation/docs/30-advanced/67-shallow-routing.md index f4f871cf8e8d..f10edd0ad5ef 100644 --- a/documentation/docs/30-advanced/67-shallow-routing.md +++ b/documentation/docs/30-advanced/67-shallow-routing.md @@ -51,7 +51,7 @@ For this to work, you need to load the data that the `+page.svelte` expects. A c import Modal from './Modal.svelte'; import PhotoPage from './[id]/+page.svelte'; - export let data; + let { data } = $props(); </script> {#each data.thumbnails as thumbnail} diff --git a/documentation/docs/98-reference/26-$lib.md b/documentation/docs/98-reference/26-$lib.md index 2feb1a4402fc..d9262a29542c 100644 --- a/documentation/docs/98-reference/26-$lib.md +++ b/documentation/docs/98-reference/26-$lib.md @@ -2,4 +2,18 @@ title: $lib --- -TODO +SvelteKit automatically makes files under `src/lib` available using the `$lib` import alias. You can change which directory this alias points to in your [config file](configuration#files). + +```svelte +<!--- file: src/lib/Component.svelte ---> +A reusable component +``` + +```svelte +<!--- file: src/routes/+page.svelte ---> +<script> + import Component from '$lib/Component.svelte'; +</script> + +<Component /> +``` diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index dfe8a125ad63..4957dc67f439 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -79,12 +79,11 @@ export interface ActionFailure<T extends Record<string, unknown> | undefined = u [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } -type UnpackValidationError<T> = - T extends ActionFailure<infer X> - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; +type UnpackValidationError<T> = T extends ActionFailure<infer X> + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. @@ -826,7 +825,7 @@ export interface LoadEvent< * <script> * import { invalidate } from '$app/navigation'; * - * export let data; + * let { data } = $props(); * * const increase = async () => { * await invalidate('increase:count'); @@ -1250,7 +1249,7 @@ export interface ServerLoadEvent< * <script> * import { invalidate } from '$app/navigation'; * - * export let data; + * let { data } = $props(); * * const increase = async () => { * await invalidate('increase:count'); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index a9634841c4cd..feb9eca1714a 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -61,12 +61,11 @@ declare module '@sveltejs/kit' { [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } - type UnpackValidationError<T> = - T extends ActionFailure<infer X> - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; + type UnpackValidationError<T> = T extends ActionFailure<infer X> + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. @@ -808,7 +807,7 @@ declare module '@sveltejs/kit' { * <script> * import { invalidate } from '$app/navigation'; * - * export let data; + * let { data } = $props(); * * const increase = async () => { * await invalidate('increase:count'); @@ -1232,7 +1231,7 @@ declare module '@sveltejs/kit' { * <script> * import { invalidate } from '$app/navigation'; * - * export let data; + * let { data } = $props(); * * const increase = async () => { * await invalidate('increase:count'); From 1d7128a7ba6d43a7c3bf19b73babb5733af3201a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 14:11:59 +0200 Subject: [PATCH 0713/1135] Version Packages (#12858) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/dry-cows-smash.md | 5 ----- .changeset/eight-insects-live.md | 5 ----- .changeset/eleven-turkeys-jump.md | 5 ----- .changeset/healthy-planets-dance.md | 5 ----- .changeset/strange-plums-drop.md | 16 ---------------- packages/adapter-auto/CHANGELOG.md | 9 +++++++++ packages/adapter-auto/package.json | 2 +- .../adapter-cloudflare-workers/CHANGELOG.md | 9 +++++++++ .../adapter-cloudflare-workers/package.json | 2 +- packages/adapter-cloudflare/CHANGELOG.md | 9 +++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/CHANGELOG.md | 9 +++++++++ packages/adapter-netlify/package.json | 2 +- packages/adapter-node/CHANGELOG.md | 9 +++++++++ packages/adapter-node/package.json | 2 +- packages/adapter-static/CHANGELOG.md | 9 +++++++++ packages/adapter-static/package.json | 2 +- packages/adapter-vercel/CHANGELOG.md | 9 +++++++++ packages/adapter-vercel/package.json | 2 +- packages/amp/CHANGELOG.md | 9 +++++++++ packages/amp/package.json | 2 +- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- packages/kit/CHANGELOG.md | 18 ++++++++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- packages/migrate/CHANGELOG.md | 6 ++++++ packages/migrate/package.json | 2 +- packages/package/CHANGELOG.md | 6 ++++++ packages/package/package.json | 2 +- 30 files changed, 121 insertions(+), 49 deletions(-) delete mode 100644 .changeset/dry-cows-smash.md delete mode 100644 .changeset/eight-insects-live.md delete mode 100644 .changeset/eleven-turkeys-jump.md delete mode 100644 .changeset/healthy-planets-dance.md delete mode 100644 .changeset/strange-plums-drop.md diff --git a/.changeset/dry-cows-smash.md b/.changeset/dry-cows-smash.md deleted file mode 100644 index df3a91c5f977..000000000000 --- a/.changeset/dry-cows-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: include importer in illegal import error message diff --git a/.changeset/eight-insects-live.md b/.changeset/eight-insects-live.md deleted file mode 100644 index ad50fb22cd4f..000000000000 --- a/.changeset/eight-insects-live.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: don't try reading assets directly that aren't present diff --git a/.changeset/eleven-turkeys-jump.md b/.changeset/eleven-turkeys-jump.md deleted file mode 100644 index b50200cf69f0..000000000000 --- a/.changeset/eleven-turkeys-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: decode non-latin characters when previewing prerendered pages diff --git a/.changeset/healthy-planets-dance.md b/.changeset/healthy-planets-dance.md deleted file mode 100644 index aaeda9d953b3..000000000000 --- a/.changeset/healthy-planets-dance.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: better error message when a `Result` is returned from a form action diff --git a/.changeset/strange-plums-drop.md b/.changeset/strange-plums-drop.md deleted file mode 100644 index dc8d4d160a14..000000000000 --- a/.changeset/strange-plums-drop.md +++ /dev/null @@ -1,16 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare-workers': patch -'@sveltejs/adapter-cloudflare': patch -'@sveltejs/adapter-netlify': patch -'@sveltejs/adapter-static': patch -'@sveltejs/adapter-vercel': patch -'@sveltejs/adapter-auto': patch -'@sveltejs/adapter-node': patch -'@sveltejs/enhanced-img': patch -'svelte-migrate': patch -'@sveltejs/package': patch -'@sveltejs/amp': patch -'@sveltejs/kit': patch ---- - -docs: update URLs for new svelte.dev site diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index 862cfeb6fa54..409a5e47e8f3 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-auto +## 3.3.1 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 3.3.0 ### Minor Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index b80c17e10e22..2d4016ac220d 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-auto", - "version": "3.3.0", + "version": "3.3.1", "description": "Automatically chooses the SvelteKit adapter for your current environment, if possible.", "keywords": [ "adapter", diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md index dcd3011db091..02072ab969d8 100644 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ b/packages/adapter-cloudflare-workers/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-cloudflare-workers +## 2.5.6 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 2.5.5 ### Patch Changes diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index d6801a02569b..3e82abd677d4 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare-workers", - "version": "2.5.5", + "version": "2.5.6", "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", "keywords": [ "adapter", diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 315e5277e135..16a1b821899f 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-cloudflare +## 4.7.4 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 4.7.3 ### Patch Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 9d294a4ed177..fb99d2887e70 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "4.7.3", + "version": "4.7.4", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/adapter-netlify/CHANGELOG.md b/packages/adapter-netlify/CHANGELOG.md index ec22eac3c998..27ad75b65eaa 100644 --- a/packages/adapter-netlify/CHANGELOG.md +++ b/packages/adapter-netlify/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-netlify +## 4.3.6 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 4.3.5 ### Patch Changes diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 9c7631d878a8..1b92f575e208 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-netlify", - "version": "4.3.5", + "version": "4.3.6", "description": "A SvelteKit adapter that creates a Netlify app", "keywords": [ "adapter", diff --git a/packages/adapter-node/CHANGELOG.md b/packages/adapter-node/CHANGELOG.md index 25e016dfb3fd..443a618cc757 100644 --- a/packages/adapter-node/CHANGELOG.md +++ b/packages/adapter-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-node +## 5.2.9 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 5.2.8 ### Patch Changes diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 3da7dc6ff361..a7a0357b352b 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-node", - "version": "5.2.8", + "version": "5.2.9", "description": "Adapter for SvelteKit apps that generates a standalone Node server", "keywords": [ "adapter", diff --git a/packages/adapter-static/CHANGELOG.md b/packages/adapter-static/CHANGELOG.md index 4b1d33c93400..2b100095d0a7 100644 --- a/packages/adapter-static/CHANGELOG.md +++ b/packages/adapter-static/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-static +## 3.0.6 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 3.0.5 ### Patch Changes diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index f28a87ccad5c..82d2cad95370 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-static", - "version": "3.0.5", + "version": "3.0.6", "description": "Adapter for SvelteKit apps that prerenders your entire site as a collection of static files", "keywords": [ "adapter", diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index 7db35dc50842..ba6d4a937ab8 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-vercel +## 5.4.6 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 5.4.5 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 85b9e203a01e..096e23b80779 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.4.5", + "version": "5.4.6", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/amp/CHANGELOG.md b/packages/amp/CHANGELOG.md index 11f4e0563723..b7e808115ec2 100644 --- a/packages/amp/CHANGELOG.md +++ b/packages/amp/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/amp +## 1.1.4 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + +- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: + - @sveltejs/kit@2.7.3 + ## 1.1.3 ### Patch Changes diff --git a/packages/amp/package.json b/packages/amp/package.json index 155251a05d1f..972f6a56e4b8 100644 --- a/packages/amp/package.json +++ b/packages/amp/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/amp", - "version": "1.1.3", + "version": "1.1.4", "description": "AMP integration for SvelteKit", "keywords": [ "accelerated mobile pages", diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index 3ec5d40d6465..435640914ee0 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.3.10 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + ## 0.3.9 ### Patch Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 2225e4cd0741..8f922e5d8be5 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.3.9", + "version": "0.3.10", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 3e8cc810c68a..8c9e9cc15bbe 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,23 @@ # @sveltejs/kit +## 2.7.3 +### Patch Changes + + +- fix: include importer in illegal import error message ([#12820](https://github.com/sveltejs/kit/pull/12820)) + + +- fix: don't try reading assets directly that aren't present ([#12876](https://github.com/sveltejs/kit/pull/12876)) + + +- fix: decode non-latin characters when previewing prerendered pages ([#12874](https://github.com/sveltejs/kit/pull/12874)) + + +- fix: better error message when a `Result` is returned from a form action ([#12829](https://github.com/sveltejs/kit/pull/12829)) + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + ## 2.7.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index c77a8c1e4e17..dbcd64fa916b 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.7.2", + "version": "2.7.3", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 089f46027d20..678b39e92642 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.7.2'; +export const VERSION = '2.7.3'; diff --git a/packages/migrate/CHANGELOG.md b/packages/migrate/CHANGELOG.md index 6e0af16e45d5..0b9c6daa6480 100644 --- a/packages/migrate/CHANGELOG.md +++ b/packages/migrate/CHANGELOG.md @@ -1,5 +1,11 @@ # svelte-migrate +## 1.6.6 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + ## 1.6.5 ### Patch Changes diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 4e7580e85b6e..50e528e8f6e8 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -1,6 +1,6 @@ { "name": "svelte-migrate", - "version": "1.6.5", + "version": "1.6.6", "description": "A CLI for migrating Svelte(Kit) codebases", "keywords": [ "migration", diff --git a/packages/package/CHANGELOG.md b/packages/package/CHANGELOG.md index 150413827f13..bc660c081a19 100644 --- a/packages/package/CHANGELOG.md +++ b/packages/package/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/package +## 2.3.7 +### Patch Changes + + +- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) + ## 2.3.6 ### Patch Changes diff --git a/packages/package/package.json b/packages/package/package.json index a4e35f3e206e..d5369848ccf5 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/package", - "version": "2.3.6", + "version": "2.3.7", "description": "The fastest way to build Svelte packages", "repository": { "type": "git", From 7b56e375f34f901f258a6f2388045982f62addf8 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 25 Oct 2024 10:07:44 -0700 Subject: [PATCH 0714/1135] chore(deps): update pnpm to v9.12.2 (#12824) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 9fe848d2e078..c5528ad6b325 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.12.1", + "packageManager": "pnpm@9.12.2", "engines": { "pnpm": "^9.0.0" } From f13aef7fe740200677cb1f19b6a84bcdb69a46a5 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:37:02 -0700 Subject: [PATCH 0715/1135] docs: auth guide (#12810) Co-authored-by: Tee Ming <chewteeming01@gmail.com> --- documentation/docs/30-advanced/20-hooks.md | 6 ++++- .../docs/40-best-practices/03-auth.md | 23 +++++++++++++++++++ packages/kit/src/exports/public.d.ts | 2 +- packages/kit/src/types/ambient.d.ts | 2 +- packages/kit/types/index.d.ts | 4 ++-- 5 files changed, 32 insertions(+), 5 deletions(-) create mode 100644 documentation/docs/40-best-practices/03-auth.md diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index 74d4c815d835..6decc1cbf463 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -37,7 +37,11 @@ export async function handle({ event, resolve }) { > [!NOTE] Requests for static assets — which includes pages that were already prerendered — are _not_ handled by SvelteKit. -If unimplemented, defaults to `({ event, resolve }) => resolve(event)`. To add custom data to the request, which is passed to handlers in `+server.js` and server `load` functions, populate the `event.locals` object, as shown below. +If unimplemented, defaults to `({ event, resolve }) => resolve(event)`. + +### locals + +To add custom data to the request, which is passed to handlers in `+server.js` and server `load` functions, populate the `event.locals` object, as shown below. ```js /// file: src/hooks.server.js diff --git a/documentation/docs/40-best-practices/03-auth.md b/documentation/docs/40-best-practices/03-auth.md new file mode 100644 index 000000000000..e9ca3384780c --- /dev/null +++ b/documentation/docs/40-best-practices/03-auth.md @@ -0,0 +1,23 @@ +--- +title: Auth +--- + +Auth refers to authentication and authorization, which are common needs when building a web application. Authentication means verifying that the user is who they say they are based on their provided credentials. Authorization means determining which actions they are allowed to take. + +## Sessions vs tokens + +After the user has provided their credentials such as a username and password, we want to allow them to use the application without needing to provide their credentials again for future requests. Users are commonly authenticated on subsequent requests with either a session identifier or signed token such as a JSON Web Token (JWT). + +Session IDs are most commonly stored in a database. They can be immediately revoked, but require a database query to be made on each request. + +In contrast, JWT generally are not checked against a datastore, which means they cannot be immediately revoked. The advantage of this method is improved latency and reduced load on your datastore. + +## Integration points + +Auth [cookies](types#public-types-cookies) can be checked inside [server hooks](hooks#server-hooks). If a user is found matching the provided credentials, the user information can be stored in [`locals`](hooks#server-hooks-locals). + +## Guides + +[Lucia](https://lucia-next.pages.dev/) is a reference for session-based web app auth. It contains example code snippets and projects for implementing session-based auth within SvelteKit and other JS projects. You can add code which follows the Lucia guide to your project with `npx sv create` when creating a new project or `npx sv add lucia` for an existing project. + +An auth system is tightly coupled to a web framework because most of the code lies in validating user input, handling errors, and directing users to the appropriate next page. As a result, many of the generic JS auth libraries include one or more web frameworks within them. For this reason, many users will find it preferrable to follow a SvelteKit-specific guide such as the examples found in [Lucia](https://lucia-next.pages.dev/) rather than having multiple web frameworks inside their project. diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 4957dc67f439..77be062a3163 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1061,7 +1061,7 @@ export interface RequestEvent< */ getClientAddress(): string; /** - * Contains custom data that was added to the request within the [`handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). + * Contains custom data that was added to the request within the [`server handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). */ locals: App.Locals; /** diff --git a/packages/kit/src/types/ambient.d.ts b/packages/kit/src/types/ambient.d.ts index bc936d57b31c..16ef13016deb 100644 --- a/packages/kit/src/types/ambient.d.ts +++ b/packages/kit/src/types/ambient.d.ts @@ -29,7 +29,7 @@ declare namespace App { } /** - * The interface that defines `event.locals`, which can be accessed in [hooks](https://svelte.dev/docs/kit/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. + * The interface that defines `event.locals`, which can be accessed in server [hooks](https://svelte.dev/docs/kit/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. */ export interface Locals {} diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index feb9eca1714a..491de54d9698 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1043,7 +1043,7 @@ declare module '@sveltejs/kit' { */ getClientAddress(): string; /** - * Contains custom data that was added to the request within the [`handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). + * Contains custom data that was added to the request within the [`server handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). */ locals: App.Locals; /** @@ -2270,7 +2270,7 @@ declare namespace App { } /** - * The interface that defines `event.locals`, which can be accessed in [hooks](https://svelte.dev/docs/kit/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. + * The interface that defines `event.locals`, which can be accessed in server [hooks](https://svelte.dev/docs/kit/hooks) (`handle`, and `handleError`), server-only `load` functions, and `+server.js` files. */ export interface Locals {} From bcb30cd2692f402c603fb7d367ee3eef05aec8d3 Mon Sep 17 00:00:00 2001 From: Hyunbin Seo <47051820+hyunbinseo@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:26:53 +0900 Subject: [PATCH 0716/1135] docs: elaborate on duplicate setHeaders calls (#12886) --- documentation/docs/20-core-concepts/20-load.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index d6739fca0c86..9de2b83eade8 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -333,7 +333,7 @@ export async function load({ fetch, setHeaders }) { } ``` -Setting the same header multiple times (even in separate `load` functions) is an error — you can only set a given header once. You cannot add a `set-cookie` header with `setHeaders` — use `cookies.set(name, value, options)` instead. +Setting the same header multiple times (even in separate `load` functions) is an error. You can only set a given header once using the `setHeaders` function. You cannot add a `set-cookie` header with `setHeaders` — use `cookies.set(name, value, options)` instead. ## Using parent data From 5006435ef30b4057a43e4e143e3422879035629d Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Mon, 28 Oct 2024 17:33:10 +0800 Subject: [PATCH 0717/1135] fix: defer when clicking hash links with data-sveltekit-reload (#12866) fixes #12582 fixes #12188 This PR ensures that clicking on a hash link with the reload option avoids the usual behaviour of thinking the page will reload and instead allows it to be handled as if the option wasn't enabled (hash links on the same page never reload the page). It also fixes a behaviour where an element doesn't get focused when clicking on the hash link more than once. --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/chilled-cats-hang.md | 5 ++++ .changeset/strange-buckets-sell.md | 5 ++++ packages/kit/src/runtime/client/client.js | 14 +++++++---- .../data-sveltekit/reload/hash/+page.svelte | 3 +++ .../reload/hash/new/+page.svelte | 1 + .../routes/routing/hashes/focus/+page.svelte | 2 ++ .../basics/test/cross-platform/client.test.js | 24 +++++++++++++++++++ 7 files changed, 50 insertions(+), 4 deletions(-) create mode 100644 .changeset/chilled-cats-hang.md create mode 100644 .changeset/strange-buckets-sell.md create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/new/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/routing/hashes/focus/+page.svelte diff --git a/.changeset/chilled-cats-hang.md b/.changeset/chilled-cats-hang.md new file mode 100644 index 000000000000..47dae6ac5f68 --- /dev/null +++ b/.changeset/chilled-cats-hang.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: ensure element is focused after subsequent clicks of the same hash link diff --git a/.changeset/strange-buckets-sell.md b/.changeset/strange-buckets-sell.md new file mode 100644 index 000000000000..3cbaa6a7184c --- /dev/null +++ b/.changeset/strange-buckets-sell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: avoid reloading behaviour for hash links with data-sveltekit-reload if the hash is on the same page diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 432c7165fb02..1a6695c385e9 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -2089,8 +2089,11 @@ function _start_router() { if (download) return; + const [nonhash, hash] = url.href.split('#'); + const same_pathname = nonhash === strip_hash(location); + // Ignore the following but fire beforeNavigate - if (external || options.reload) { + if (external || (options.reload && (!same_pathname || !hash))) { if (_before_navigate({ url, type: 'link' })) { // set `navigating` to `true` to prevent `beforeNavigate` callbacks // being called when the page unloads @@ -2105,8 +2108,7 @@ function _start_router() { // Check if new url only differs by hash and use the browser default behavior in that case // This will ensure the `hashchange` event is fired // Removing the hash does a full page navigation in the browser, so make sure a hash is present - const [nonhash, hash] = url.href.split('#'); - if (hash !== undefined && nonhash === strip_hash(location)) { + if (hash !== undefined && same_pathname) { // If we are trying to navigate to the same hash, we should only // attempt to scroll to that element and avoid any history changes. // Otherwise, this can cause Firefox to incorrectly assign a null @@ -2121,7 +2123,11 @@ function _start_router() { if (hash === '' || (hash === 'top' && a.ownerDocument.getElementById('top') === null)) { window.scrollTo({ top: 0 }); } else { - a.ownerDocument.getElementById(decodeURIComponent(hash))?.scrollIntoView(); + const element = a.ownerDocument.getElementById(decodeURIComponent(hash)); + if (element) { + element.scrollIntoView(); + element.focus(); + } } return; diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/+page.svelte new file mode 100644 index 000000000000..ca54461e368f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/+page.svelte @@ -0,0 +1,3 @@ +<a href="#example" data-sveltekit-reload>focus</a> +<input id="example" /> +<a href="/data-sveltekit/reload/hash/new">new page</a> diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/new/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/new/+page.svelte new file mode 100644 index 000000000000..48aa4cb69f99 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/reload/hash/new/+page.svelte @@ -0,0 +1 @@ +<p>hello world</p> diff --git a/packages/kit/test/apps/basics/src/routes/routing/hashes/focus/+page.svelte b/packages/kit/test/apps/basics/src/routes/routing/hashes/focus/+page.svelte new file mode 100644 index 000000000000..17954338b764 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/routing/hashes/focus/+page.svelte @@ -0,0 +1,2 @@ +<a href="#example">focus</a> +<input id="example" /> diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index c2e9bf6cc474..71338a8422ce 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -715,6 +715,30 @@ test.describe('Routing', () => { expect(await page.textContent('#page-url-hash')).toBe('#target'); }); + test('clicking on a hash link focuses the associated element', async ({ page }) => { + await page.goto('/routing/hashes/focus'); + await page.locator('a[href="#example"]').click(); + await expect(page.getByRole('textbox')).toBeFocused(); + // check it still works when the hash is already present in the URL + await page.locator('a[href="#example"]').click(); + await expect(page.getByRole('textbox')).toBeFocused(); + }); + + test('backwards navigation works after clicking a hash link with data-sveltekit-reload', async ({ + page, + clicknav, + baseURL + }) => { + await page.goto('/data-sveltekit/reload/hash'); + await page.locator('a[href="#example"]').click(); + expect(page.url()).toBe(`${baseURL}/data-sveltekit/reload/hash#example`); + await clicknav('a[href="/data-sveltekit/reload/hash/new"]'); + expect(page.url()).toBe(`${baseURL}/data-sveltekit/reload/hash/new`); + await page.goBack(); + expect(page.url()).toBe(`${baseURL}/data-sveltekit/reload/hash#example`); + await expect(page.getByRole('textbox')).toBeVisible(); + }); + test('back button returns to previous route when previous route has been navigated to via hash anchor', async ({ page, clicknav From 304755eff690e35e216a9f6578046991e31e76b3 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Mon, 28 Oct 2024 17:46:45 +0800 Subject: [PATCH 0718/1135] fix: avoid preload if event default was prevented (#12887) closes #12510 --- .changeset/fast-crews-smash.md | 5 +++++ packages/kit/src/runtime/client/client.js | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/fast-crews-smash.md diff --git a/.changeset/fast-crews-smash.md b/.changeset/fast-crews-smash.md new file mode 100644 index 000000000000..9281f3cf2d9f --- /dev/null +++ b/.changeset/fast-crews-smash.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: avoid preload if event default was prevented for `touchstart` and `mousedown` events diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 1a6695c385e9..df35010c65c1 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1529,6 +1529,7 @@ function setup_preload() { /** @param {Event} event */ function tap(event) { + if (event.defaultPrevented) return; preload(/** @type {Element} */ (event.composedPath()[0]), 1); } From 0abcacd2fc4f4eff578faf9f2c704252ab9b801f Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:37:30 +0100 Subject: [PATCH 0719/1135] docs: fix links (#12898) --- documentation/docs/40-best-practices/03-auth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/40-best-practices/03-auth.md b/documentation/docs/40-best-practices/03-auth.md index e9ca3384780c..b2b8e07aa82c 100644 --- a/documentation/docs/40-best-practices/03-auth.md +++ b/documentation/docs/40-best-practices/03-auth.md @@ -14,7 +14,7 @@ In contrast, JWT generally are not checked against a datastore, which means they ## Integration points -Auth [cookies](types#public-types-cookies) can be checked inside [server hooks](hooks#server-hooks). If a user is found matching the provided credentials, the user information can be stored in [`locals`](hooks#server-hooks-locals). +Auth [cookies](@sveltejs-kit#Cookies) can be checked inside [server hooks](hooks#Server-hooks). If a user is found matching the provided credentials, the user information can be stored in [`locals`](hooks#Server-hooks-handle). ## Guides From 2c035ec5b7d8e8b1050b3270d6913c7f8c1190dd Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 28 Oct 2024 13:16:20 -0700 Subject: [PATCH 0720/1135] chore: no longer need template ssh key (#12905) --- .github/workflows/release.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index b45ff3283784..50160969b273 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -42,7 +42,6 @@ jobs: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} NPM_CONFIG_PROVENANCE: true NPM_TOKEN: ${{ secrets.NPM_TOKEN }} - UPDATE_TEMPLATE_SSH_KEY: ${{ secrets.UPDATE_TEMPLATE_SSH_KEY }} # TODO alert discord # - name: Send a Slack notification if a publish happens From 162d8ac1d7bec7a7fc572481dd08ad6b7769e44f Mon Sep 17 00:00:00 2001 From: Basang Basangov <basan1991@ya.ru> Date: Tue, 29 Oct 2024 01:10:57 +0300 Subject: [PATCH 0721/1135] docs: remove duplicate (#12904) --- documentation/docs/20-core-concepts/10-routing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 66d2af54bb61..78c2b0ac719d 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -50,7 +50,7 @@ Pages can receive data from `load` functions via the `data` prop. <div>{@html data.content}</div> ``` -> [!LEGACY] In Svelte 4 +> [!LEGACY] > In Svelte 4, you'd use `export let data` instead > [!NOTE] Note that SvelteKit uses `<a>` elements to navigate between routes, rather than a framework-specific `<Link>` component. From 9776e7cfa83f18d91e44685f421248d45370ed48 Mon Sep 17 00:00:00 2001 From: Hyunbin Seo <47051820+hyunbinseo@users.noreply.github.com> Date: Tue, 29 Oct 2024 11:14:50 +0900 Subject: [PATCH 0722/1135] docs: elaborate on setHeaders in SSR (#12888) * docs: elaborate on setHeaders in SSR * Update documentation/docs/20-core-concepts/20-load.md * docs: update expression * Update documentation/docs/20-core-concepts/20-load.md --------- Co-authored-by: Tee Ming <chewteeming01@gmail.com> --- documentation/docs/20-core-concepts/20-load.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 9de2b83eade8..5f5f801cfe0a 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -322,8 +322,8 @@ export async function load({ fetch, setHeaders }) { const url = `https://cms.example.com/products.json`; const response = await fetch(url); - // cache the page for the same length of time - // as the underlying data + // Headers are only set during SSR, caching the page's HTML + // for the same length of time as the underlying data. setHeaders({ age: response.headers.get('age'), 'cache-control': response.headers.get('cache-control') From 2668a7d5a84bea6ee0a67a18c1eb20cd64ab7874 Mon Sep 17 00:00:00 2001 From: Pierre Svgnt <46089601+rrr63@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:34:37 -0400 Subject: [PATCH 0723/1135] docs: delete the 'In Svelte 4' redundancy in the doc. (#12908) * Update 20-load.md * Update 30-form-actions.md --- documentation/docs/20-core-concepts/20-load.md | 2 +- documentation/docs/20-core-concepts/30-form-actions.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 5f5f801cfe0a..ee64825aea87 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -32,7 +32,7 @@ export function load({ params }) { <div>{@html data.post.content}</div> ``` -> [!LEGACY] In Svelte 4 +> [!LEGACY] > In Svelte 4, you'd use `export let data` instead Thanks to the generated `$types` module, we get full type safety. diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index 5d8c439f86b6..a86e56b784d1 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -151,7 +151,7 @@ export const actions = { {/if} ``` -> [!LEGACY] In Svelte 4 +> [!LEGACY] > In Svelte 4, you'd use `export let data` and `export let form` instead to declare properties ### Validation errors From 345d7702981ec7835ffd1c0f893a2fed1a90e8cf Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Wed, 30 Oct 2024 12:44:59 -0400 Subject: [PATCH 0724/1135] docs: fix links (#12912) --- documentation/docs/25-build-and-deploy/40-adapter-node.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/40-adapter-node.md b/documentation/docs/25-build-and-deploy/40-adapter-node.md index 71dc8efd66ca..0a7c553c4acc 100644 --- a/documentation/docs/25-build-and-deploy/40-adapter-node.md +++ b/documentation/docs/25-build-and-deploy/40-adapter-node.md @@ -187,7 +187,7 @@ By default `adapter-node` gracefully shuts down the HTTP server when a `SIGTERM` 1. reject new requests ([`server.close`](https://nodejs.org/api/http.html#serverclosecallback)) 2. wait for requests that have already been made but not received a response yet to finish and close connections once they become idle ([`server.closeIdleConnections`](https://nodejs.org/api/http.html#servercloseidleconnections)) -3. and finally, close any remaining connections that are still active after [`SHUTDOWN_TIMEOUT`](#Environment-variables-SHUTDOWN-TIMEOUT) seconds. ([`server.closeAllConnections`](https://nodejs.org/api/http.html#servercloseallconnections)) +3. and finally, close any remaining connections that are still active after [`SHUTDOWN_TIMEOUT`](#Environment-variables-SHUTDOWN_TIMEOUT) seconds. ([`server.closeAllConnections`](https://nodejs.org/api/http.html#servercloseallconnections)) > [!NOTE] If you want to customize this behaviour you can use a [custom server](#Custom-server). @@ -205,7 +205,7 @@ The parameter `reason` has one of the following values: - `SIGINT` - shutdown was triggered by a `SIGINT` signal - `SIGTERM` - shutdown was triggered by a `SIGTERM` signal -- `IDLE` - shutdown was triggered by [`IDLE_TIMEOUT`](#Environment-variables-IDLE-TIMEOUT) +- `IDLE` - shutdown was triggered by [`IDLE_TIMEOUT`](#Environment-variables-IDLE_TIMEOUT) ## Socket activation @@ -215,7 +215,7 @@ Most Linux operating systems today use a modern process manager called systemd t To take advantage of socket activation follow these steps. -1. Run your app as a [systemd service](https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html). It can either run directly on the host system or inside a container (using Docker or a systemd portable service for example). If you additionally pass an [`IDLE_TIMEOUT`](#Environment-variables-IDLE-TIMEOUT) environment variable to your app it will gracefully shutdown if there are no requests for `IDLE_TIMEOUT` seconds. systemd will automatically start your app again when new requests are coming in. +1. Run your app as a [systemd service](https://www.freedesktop.org/software/systemd/man/latest/systemd.service.html). It can either run directly on the host system or inside a container (using Docker or a systemd portable service for example). If you additionally pass an [`IDLE_TIMEOUT`](#Environment-variables-IDLE_TIMEOUT) environment variable to your app it will gracefully shutdown if there are no requests for `IDLE_TIMEOUT` seconds. systemd will automatically start your app again when new requests are coming in. ```ini /// file: /etc/systemd/system/myapp.service From e41a8e24b71cb9e9ee249ddfe732a3d0721d40bf Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Wed, 30 Oct 2024 18:46:29 -0400 Subject: [PATCH 0725/1135] chore: add sync request workflow (#12918) --- .github/workflows/sync-request.yml | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) create mode 100644 .github/workflows/sync-request.yml diff --git a/.github/workflows/sync-request.yml b/.github/workflows/sync-request.yml new file mode 100644 index 000000000000..d563e7038f5a --- /dev/null +++ b/.github/workflows/sync-request.yml @@ -0,0 +1,21 @@ +name: Sync request + +on: + push: + branches: + - main + +jobs: + dispatch: + runs-on: ubuntu-latest + steps: + - name: Repository Dispatch + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.SYNC_REQUEST_TOKEN }} + repository: sveltejs/svelte.dev + event-type: sync-request + client-payload: |- + { + "package": "kit" + } From 00154744d306a764906e124fa07f841a86c05f3b Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Thu, 31 Oct 2024 14:37:40 -0400 Subject: [PATCH 0726/1135] add link to sync-docs README (#12919) --- .github/workflows/sync-request.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/sync-request.yml b/.github/workflows/sync-request.yml index d563e7038f5a..0e09c5b9a4bc 100644 --- a/.github/workflows/sync-request.yml +++ b/.github/workflows/sync-request.yml @@ -1,3 +1,4 @@ +# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md name: Sync request on: From 48f02015fc63c694b058fad4a0bf9fe93e070f28 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Thu, 31 Oct 2024 22:31:43 +0100 Subject: [PATCH 0727/1135] fix: prefer ts in unclear migration situations if `tsconfig.json` found (#12881) Fixes #12880, relies on https://github.com/sveltejs/svelte/pull/13929 --- .changeset/rare-glasses-smell.md | 5 +++++ packages/migrate/migrations/svelte-5/index.js | 4 +++- packages/migrate/migrations/svelte-5/migrate.js | 4 ++-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 .changeset/rare-glasses-smell.md diff --git a/.changeset/rare-glasses-smell.md b/.changeset/rare-glasses-smell.md new file mode 100644 index 000000000000..53d3d8e51d88 --- /dev/null +++ b/.changeset/rare-glasses-smell.md @@ -0,0 +1,5 @@ +--- +'svelte-migrate': patch +--- + +fix: prefer TS in unclear migration situations if `tsconfig.json` found diff --git a/packages/migrate/migrations/svelte-5/index.js b/packages/migrate/migrations/svelte-5/index.js index 01be6c0221a2..a6b17d421232 100644 --- a/packages/migrate/migrations/svelte-5/index.js +++ b/packages/migrate/migrations/svelte-5/index.js @@ -149,6 +149,8 @@ export async function migrate() { update_pkg_json(); + const use_ts = fs.existsSync('tsconfig.json'); + // const { default: config } = fs.existsSync('svelte.config.js') // ? await import(pathToFileURL(path.resolve('svelte.config.js')).href) // : { default: {} }; @@ -170,7 +172,7 @@ export async function migrate() { if (extensions.some((ext) => file.endsWith(ext))) { if (svelte_extensions.some((ext) => file.endsWith(ext))) { update_svelte_file(file, transform_module_code, (code) => - transform_svelte_code(code, migrate, { filename: file }) + transform_svelte_code(code, migrate, { filename: file, use_ts }) ); } else { update_js_file(file, transform_module_code); diff --git a/packages/migrate/migrations/svelte-5/migrate.js b/packages/migrate/migrations/svelte-5/migrate.js index 24ace9dc7148..1b6c73af81a2 100644 --- a/packages/migrate/migrations/svelte-5/migrate.js +++ b/packages/migrate/migrations/svelte-5/migrate.js @@ -56,8 +56,8 @@ export function transform_module_code(code) { /** * @param {string} code - * @param {(source: string, options: { filename?: string }) => { code: string }} transform_code - * @param {{ filename?: string }} options + * @param {(source: string, options: { filename?: string, use_ts?: boolean }) => { code: string }} transform_code + * @param {{ filename?: string, use_ts?: boolean }} options */ export function transform_svelte_code(code, transform_code, options) { return transform_code(code, options).code; From 7c2f8b51df817feba9b090e78f1b5e9975869397 Mon Sep 17 00:00:00 2001 From: Conduitry <git@chor.date> Date: Fri, 1 Nov 2024 11:11:34 -0400 Subject: [PATCH 0728/1135] docs: replace non-breaking spaces (#12932) --- documentation/docs/20-core-concepts/20-load.md | 2 +- documentation/docs/20-core-concepts/30-form-actions.md | 4 ++-- documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index ee64825aea87..7231b588d06a 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -333,7 +333,7 @@ export async function load({ fetch, setHeaders }) { } ``` -Setting the same header multiple times (even in separate `load` functions) is an error. You can only set a given header once using the `setHeaders` function. You cannot add a `set-cookie` header with `setHeaders` — use `cookies.set(name, value, options)` instead. +Setting the same header multiple times (even in separate `load` functions) is an error. You can only set a given header once using the `setHeaders` function. You cannot add a `set-cookie` header with `setHeaders` — use `cookies.set(name, value, options)` instead. ## Using parent data diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index a86e56b784d1..dddae80da99f 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -156,7 +156,7 @@ export const actions = { ### Validation errors -If the request couldn't be processed because of invalid data, you can return validation errors — along with the previously submitted form values — back to the user so that they can try again. The `fail` function lets you return an HTTP status code (typically 400 or 422, in the case of validation errors) along with the data. The status code is available through `$page.status` and the data through `form`: +If the request couldn't be processed because of invalid data, you can return validation errors — along with the previously submitted form values — back to the user so that they can try again. The `fail` function lets you return an HTTP status code (typically 400 or 422, in the case of validation errors) along with the data. The status code is available through `$page.status` and the data through `form`: ```js /// file: src/routes/login/+page.server.js @@ -195,7 +195,7 @@ export const actions = { }; ``` -> [!NOTE] Note that as a precaution, we only return the email back to the page — not the password. +> [!NOTE] Note that as a precaution, we only return the email back to the page — not the password. ```svelte /// file: src/routes/login/+page.svelte diff --git a/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md b/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md index ab2f6808ab17..09252136e4f1 100644 --- a/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md +++ b/documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md @@ -129,7 +129,7 @@ The `$env/dynamic/public` and `$env/dynamic/private` modules provide access to _ During prerendering in SvelteKit 1, they are one and the same. As such, prerendered pages that make use of 'dynamic' environment variables are really 'baking in' build time values, which is incorrect. Worse, `$env/dynamic/public` is populated in the browser with these stale values if the user happens to land on a prerendered page before navigating to dynamically-rendered pages. -Because of this, dynamic environment variables can no longer be read during prerendering in SvelteKit 2 — you should use the `static` modules instead. If the user lands on a prerendered page, SvelteKit will request up-to-date values for `$env/dynamic/public` from the server (by default from a module called `_env.js` — this can be configured with `config.kit.env.publicModule`) instead of reading them from the server-rendered HTML. +Because of this, dynamic environment variables can no longer be read during prerendering in SvelteKit 2 — you should use the `static` modules instead. If the user lands on a prerendered page, SvelteKit will request up-to-date values for `$env/dynamic/public` from the server (by default from a module called `_env.js` — this can be configured with `config.kit.env.publicModule`) instead of reading them from the server-rendered HTML. ## `form` and `data` have been removed from `use:enhance` callbacks From 967bad7c45c3646eb6e469452df7011fa938c97a Mon Sep 17 00:00:00 2001 From: pngwn <hello@pngwn.io> Date: Fri, 1 Nov 2024 17:10:09 +0100 Subject: [PATCH 0729/1135] breaking: require svelte 5 for enhanced-img (#12822) --- .changeset/witty-years-relate.md | 5 + packages/enhanced-img/package.json | 10 +- packages/enhanced-img/src/preprocessor.js | 120 +++++++----- packages/enhanced-img/test/Input.svelte | 11 +- packages/enhanced-img/test/Output.svelte | 18 +- packages/enhanced-img/types/internal.d.ts | 34 ++++ packages/kit/src/exports/vite/index.js | 1 + pnpm-lock.yaml | 213 ++++++++++++++-------- 8 files changed, 286 insertions(+), 126 deletions(-) create mode 100644 .changeset/witty-years-relate.md create mode 100644 packages/enhanced-img/types/internal.d.ts diff --git a/.changeset/witty-years-relate.md b/.changeset/witty-years-relate.md new file mode 100644 index 000000000000..c0d93ddb3ea7 --- /dev/null +++ b/.changeset/witty-years-relate.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/enhanced-img": minor +--- + +breaking: require Svelte 5 diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 8f922e5d8be5..89c3445e7362 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -38,20 +38,20 @@ "dependencies": { "magic-string": "^0.30.5", "svelte-parse-markup": "^0.1.5", - "vite-imagetools": "^7.0.1" + "vite-imagetools": "^7.0.1", + "zimmerframe": "^1.1.2" }, "devDependencies": { "@types/estree": "^1.0.5", "@types/node": "^18.19.48", - "estree-walker": "^3.0.3", "rollup": "^4.14.2", - "svelte": "^4.2.10", - "typescript": "^5.3.3", + "svelte": "^5.0.0", + "typescript": "^5.6.3", "vite": "^5.3.2", "vitest": "^2.0.1" }, "peerDependencies": { - "svelte": "^4.0.0 || ^5.0.0-next.0", + "svelte": "^5.0.0", "vite": ">= 5.0.0" } } diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js index 0222037e593b..2de5d9f6b9cc 100644 --- a/packages/enhanced-img/src/preprocessor.js +++ b/packages/enhanced-img/src/preprocessor.js @@ -1,8 +1,10 @@ +/** @import { AST } from 'svelte/compiler' */ + import { existsSync } from 'node:fs'; import * as path from 'node:path'; import MagicString from 'magic-string'; -import { asyncWalk } from 'estree-walker'; +import { walk } from 'zimmerframe'; import { VERSION } from 'svelte/compiler'; import { parse } from 'svelte-parse-markup'; @@ -32,7 +34,7 @@ export function image(opts) { } const s = new MagicString(content); - const ast = parse(content, { filename }); + const ast = parse(content, { filename, modern: true }); /** * Import path to import name @@ -49,20 +51,26 @@ export function image(opts) { const consts = new Map(); /** - * @param {import('svelte/types/compiler/interfaces').TemplateNode} node - * @param {{ type: string, start: number, end: number, raw: string }} src_attribute + * @param {import('svelte/compiler').AST.RegularElement} node + * @param {AST.Text | AST.ExpressionTag} src_attribute * @returns {Promise<void>} */ async function update_element(node, src_attribute) { - // TODO: this will become ExpressionTag in Svelte 5 - if (src_attribute.type === 'MustacheTag') { - const src_var_name = content - .substring(src_attribute.start + 1, src_attribute.end - 1) - .trim(); - s.update(node.start, node.end, dynamic_img_to_picture(content, node, src_var_name)); - return; - } else if (src_attribute.type === 'AttributeShorthand') { - const src_var_name = content.substring(src_attribute.start, src_attribute.end).trim(); + if (src_attribute.type === 'ExpressionTag') { + const start = + 'end' in src_attribute.expression + ? src_attribute.expression.end + : src_attribute.expression.range?.[0]; + const end = + 'start' in src_attribute.expression + ? src_attribute.expression.start + : src_attribute.expression.range?.[1]; + + if (typeof start !== 'number' || typeof end !== 'number') { + throw new Error('ExpressionTag has no range'); + } + const src_var_name = content.substring(start, end).trim(); + s.update(node.start, node.end, dynamic_img_to_picture(content, node, src_var_name)); return; } @@ -73,10 +81,10 @@ export function image(opts) { const sizes = get_attr_value(node, 'sizes'); const width = get_attr_value(node, 'width'); url += url.includes('?') ? '&' : '?'; - if (sizes) { + if (sizes && 'raw' in sizes) { url += 'imgSizes=' + encodeURIComponent(sizes.raw) + '&'; } - if (width) { + if (width && 'raw' in width) { url += 'imgWidth=' + encodeURIComponent(width.raw) + '&'; } url += 'enhanced'; @@ -119,23 +127,35 @@ export function image(opts) { } } + /** + * @type {Array<ReturnType<typeof update_element>>} + */ + const pending_ast_updates = []; // TODO: switch to zimmerframe with Svelte 5 - // @ts-ignore - await asyncWalk(ast.html, { - /** - * @param {import('svelte/types/compiler/interfaces').TemplateNode} node - */ - async enter(node) { - if (node.type === 'Element') { - // Compare node tag match - if (node.name === 'enhanced:img') { + + walk( + /** @type {import('svelte/compiler').AST.Root} */ (ast), + {}, + { + _(_, { next }) { + next(); + }, + /** @param {import('svelte/compiler').AST.RegularElement} node */ + // @ts-ignore + RegularElement(node) { + if ('name' in node && node.name === 'enhanced:img') { + // Compare node tag match const src = get_attr_value(node, 'src'); - if (!src) return; - await update_element(node, src); + + if (!src || typeof src === 'boolean') return; + + pending_ast_updates.push(update_element(node, src)); } } } - }); + ); + + await Promise.all(pending_ast_updates); // add imports and consts to <script module> block let text = ''; @@ -215,22 +235,31 @@ export function parseObject(str) { } /** - * @param {import('svelte/types/compiler/interfaces').TemplateNode} node + * @param {import('../types/internal.ts').TemplateNode} node * @param {string} attr + * @returns {AST.Text | AST.ExpressionTag | undefined} */ function get_attr_value(node, attr) { + if (!('type' in node) || !('attributes' in node)) return; const attribute = node.attributes.find( /** @param {any} v */ (v) => v.type === 'Attribute' && v.name === attr ); - if (!attribute) return; + if (!attribute || !('value' in attribute) || typeof attribute.value === 'boolean') return; - return attribute.value[0]; + // Check if value is an array and has at least one element + if (Array.isArray(attribute.value)) { + if (attribute.value.length > 0) return attribute.value[0]; + return; + } + + // If it's not an array or is empty, return the value as is + return attribute.value; } /** * @param {string} content - * @param {Array<import('svelte/types/compiler/interfaces').BaseDirective | import('svelte/types/compiler/interfaces').Attribute | import('svelte/types/compiler/interfaces').SpreadAttribute>} attributes + * @param {import('../types/internal.ts').Attribute[]} attributes * @param {{ * src: string, * width: string | number, @@ -239,7 +268,7 @@ function get_attr_value(node, attr) { */ function serialize_img_attributes(content, attributes, details) { const attribute_strings = attributes.map((attribute) => { - if (attribute.name === 'src') { + if ('name' in attribute && attribute.name === 'src') { return `src=${details.src}`; } return content.substring(attribute.start, attribute.end); @@ -250,8 +279,13 @@ function serialize_img_attributes(content, attributes, details) { /** @type {number | undefined} */ let user_height; for (const attribute of attributes) { - if (attribute.name === 'width') user_width = parseInt(attribute.value[0].raw); - if (attribute.name === 'height') user_height = parseInt(attribute.value[0].raw); + if ('name' in attribute && 'value' in attribute) { + const value = Array.isArray(attribute.value) ? attribute.value[0] : attribute.value; + if (typeof value === 'object' && 'raw' in value) { + if (attribute.name === 'width') user_width = parseInt(value.raw); + if (attribute.name === 'height') user_height = parseInt(value.raw); + } + } } if (!user_width && !user_height) { attribute_strings.push(`width=${details.width}`); @@ -283,13 +317,15 @@ function stringToNumber(param) { /** * @param {Map<string,string>} consts * @param {string} content - * @param {import('svelte/types/compiler/interfaces').TemplateNode} node + * @param {import('svelte/compiler').AST.RegularElement} node * @param {import('vite-imagetools').Picture} image */ function img_to_picture(consts, content, node, image) { - /** @type {Array<import('svelte/types/compiler/interfaces').BaseDirective | import('svelte/types/compiler/interfaces').Attribute | import('svelte/types/compiler/interfaces').SpreadAttribute>} attributes */ + /** @type {import('../types/internal.ts').Attribute[]} attributes */ const attributes = node.attributes; - const index = attributes.findIndex((attribute) => attribute.name === 'sizes'); + const index = attributes.findIndex( + (attribute) => 'name' in attribute && attribute.name === 'sizes' + ); let sizes_string = ''; if (index >= 0) { sizes_string = ' ' + content.substring(attributes[index].start, attributes[index].end); @@ -324,19 +360,21 @@ function to_value(consts, src) { } return `{${var_name}}`; } + return `"${src}"`; } /** * For images like `<img src={manually_imported} />` * @param {string} content - * @param {import('svelte/types/compiler/interfaces').TemplateNode} node + * @param {import('svelte/compiler').AST.RegularElement} node * @param {string} src_var_name */ function dynamic_img_to_picture(content, node, src_var_name) { - /** @type {Array<import('svelte/types/compiler/interfaces').BaseDirective | import('svelte/types/compiler/interfaces').Attribute | import('svelte/types/compiler/interfaces').SpreadAttribute>} attributes */ const attributes = node.attributes; - const index = attributes.findIndex((attribute) => attribute.name === 'sizes'); + const index = attributes.findIndex( + (attribute) => 'name' in attribute && attribute.name === 'sizes' + ); let sizes_string = ''; if (index >= 0) { sizes_string = ' ' + content.substring(attributes[index].start, attributes[index].end); @@ -350,7 +388,7 @@ function dynamic_img_to_picture(content, node, src_var_name) { }; return `{#if typeof ${src_var_name} === 'string'} - <img ${serialize_img_attributes(content, node.attributes, details)} /> + <img ${serialize_img_attributes(content, attributes, details)} /> {:else} <picture> {#each Object.entries(${src_var_name}.sources) as [format, srcset]} diff --git a/packages/enhanced-img/test/Input.svelte b/packages/enhanced-img/test/Input.svelte index c5113be736d4..4b6d54d22125 100644 --- a/packages/enhanced-img/test/Input.svelte +++ b/packages/enhanced-img/test/Input.svelte @@ -4,6 +4,7 @@ const src = manual_image1; const images = [manual_image1, manual_image2]; + const get_image = (image_key: number) => images[image_key]; let foo: string = 'bar'; </script> @@ -28,7 +29,11 @@ alt="sizes test" /> -<enhanced:img src="./dev.png" on:click={(foo = 'clicked an image!')} alt="event handler test" /> +<enhanced:img + src="./dev.png" + onclick={() => (foo = 'clicked an image!')} + alt="event handler test" +/> <enhanced:img src="$lib/dev.png" alt="alias test" /> @@ -42,6 +47,10 @@ <enhanced:img src={image} alt="opt-in test" /> {/each} +{#each images as _, i} + <enhanced:img src={get_image(i)} alt="opt-in test" /> +{/each} + <picture> <source src="./dev.avif" /> <source srcset="./dev.avif 500v ./bar.avif 100v" /> diff --git a/packages/enhanced-img/test/Output.svelte b/packages/enhanced-img/test/Output.svelte index aa7ba366238e..2cc0fe0609ae 100644 --- a/packages/enhanced-img/test/Output.svelte +++ b/packages/enhanced-img/test/Output.svelte @@ -1,4 +1,4 @@ -<script context="module"> +<script module> import __IMPORTED_ASSET_0__ from "./foo.svg"; const __DECLARED_ASSET_0__ = "__VITE_ASSET__2AM7_y_a__ 1440w, __VITE_ASSET__2AM7_y_b__ 960w"; const __DECLARED_ASSET_1__ = "__VITE_ASSET__2AM7_y_c__ 1440w, __VITE_ASSET__2AM7_y_d__ 960w"; @@ -13,6 +13,7 @@ const src = manual_image1; const images = [manual_image1, manual_image2]; + const get_image = (image_key: number) => images[image_key]; let foo: string = 'bar'; </script> @@ -33,7 +34,7 @@ <picture><source srcset="/1 1440w, /2 960w" sizes="(min-width: 60rem) 80vw, (min-width: 40rem) 90vw, 100vw" type="image/avif" /><source srcset="/3 1440w, /4 960w" sizes="(min-width: 60rem) 80vw, (min-width: 40rem) 90vw, 100vw" type="image/webp" /><source srcset="5 1440w, /6 960w" sizes="(min-width: 60rem) 80vw, (min-width: 40rem) 90vw, 100vw" type="image/png" /><img src="/7" alt="sizes test" width=1440 height=1440 /></picture> -<picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" on:click={(foo = 'clicked an image!')} alt="event handler test" width=1440 height=1440 /></picture> +<picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" onclick={() => (foo = 'clicked an image!')} alt="event handler test" width=1440 height=1440 /></picture> <picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" alt="alias test" width=1440 height=1440 /></picture> @@ -65,6 +66,19 @@ {/if} {/each} +{#each images as _, i} + {#if typeof get_image(i) === 'string'} + <img src={get_image(i).img.src} alt="opt-in test" width={get_image(i).img.w} height={get_image(i).img.h} /> +{:else} + <picture> + {#each Object.entries(get_image(i).sources) as [format, srcset]} + <source {srcset} type={'image/' + format} /> + {/each} + <img src={get_image(i).img.src} alt="opt-in test" width={get_image(i).img.w} height={get_image(i).img.h} /> + </picture> +{/if} +{/each} + <picture> <source src="./dev.avif" /> <source srcset="./dev.avif 500v ./bar.avif 100v" /> diff --git a/packages/enhanced-img/types/internal.d.ts b/packages/enhanced-img/types/internal.d.ts new file mode 100644 index 000000000000..814511d0ed6d --- /dev/null +++ b/packages/enhanced-img/types/internal.d.ts @@ -0,0 +1,34 @@ +import type { AST } from 'svelte/compiler'; + +type ElementLike = + | AST.Component + | AST.TitleElement + | AST.SlotElement + | AST.RegularElement + | AST.SvelteBody + | AST.SvelteComponent + | AST.SvelteDocument + | AST.SvelteElement + | AST.SvelteFragment + | AST.SvelteHead + | AST.SvelteOptionsRaw + | AST.SvelteSelf + | AST.SvelteWindow; + +type Tag = AST.ExpressionTag | AST.HtmlTag | AST.ConstTag | AST.DebugTag | AST.RenderTag; + +type Directive = + | AST.AnimateDirective + | AST.BindDirective + | AST.ClassDirective + | AST.LetDirective + | AST.OnDirective + | AST.StyleDirective + | AST.TransitionDirective + | AST.UseDirective; + +type Block = AST.EachBlock | AST.IfBlock | AST.AwaitBlock | AST.KeyBlock | AST.SnippetBlock; + +export type TemplateNode = AST.Text | Tag | ElementLike | AST.Comment | Block; + +export type Attribute = AST.Attribute | AST.SpreadAttribute | Directive; diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 01f2c98f3f91..e6521e979560 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -147,6 +147,7 @@ export async function sveltekit() { preprocess, onwarn: svelte_config.onwarn, compilerOptions: { + // @ts-ignore - ignore this property when running `pnpm check` against Svelte 5 in the ecosystem CI hydratable: isSvelte5Plus() ? undefined : true, ...svelte_config.compilerOptions }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 682ac22e7c49..0a360411ab50 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.27.8 '@sveltejs/eslint-config': specifier: ^8.1.0 - version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@4.2.19))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.4.5))(typescript@5.4.5) + version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 @@ -28,10 +28,10 @@ importers: version: 3.1.1 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.1.2(prettier@3.1.1)(svelte@4.2.19) + version: 3.1.2(prettier@3.1.1)(svelte@5.1.9) typescript-eslint: specifier: ^8.0.0 - version: 8.4.0(eslint@9.6.0)(typescript@5.4.5) + version: 8.4.0(eslint@9.6.0)(typescript@5.6.3) packages/adapter-auto: dependencies: @@ -44,7 +44,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -137,7 +137,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -177,7 +177,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -274,7 +274,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -289,7 +289,7 @@ importers: dependencies: '@sveltejs/kit': specifier: ^1.0.0 || ^2.0.0 - version: 2.6.2(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 2.7.3(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) devDependencies: typescript: specifier: ^5.3.3 @@ -304,10 +304,13 @@ importers: version: 0.30.11 svelte-parse-markup: specifier: ^0.1.5 - version: 0.1.5(svelte@4.2.19) + version: 0.1.5(svelte@5.1.9) vite-imagetools: specifier: ^7.0.1 version: 7.0.1(rollup@4.24.0) + zimmerframe: + specifier: ^1.1.2 + version: 1.1.2 devDependencies: '@types/estree': specifier: ^1.0.5 @@ -315,18 +318,15 @@ importers: '@types/node': specifier: ^18.19.48 version: 18.19.50 - estree-walker: - specifier: ^3.0.3 - version: 3.0.3 rollup: specifier: ^4.14.2 version: 4.24.0 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.0.0 + version: 5.1.9 typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.6.3 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1928,8 +1928,8 @@ packages: typescript: '>= 5' typescript-eslint: '>= 7.5' - '@sveltejs/kit@2.6.2': - resolution: {integrity: sha512-ruogrSPXjckn5poUiZU8VYNCSPHq66SFR1AATvOikQxtP6LNI4niAZVX/AWZRe/EPDG3oY2DNJ9c5z7u0t2NAQ==} + '@sveltejs/kit@2.7.3': + resolution: {integrity: sha512-Vx7nq5MJ86I8qXYsVidC5PX6xm+uxt8DydvOdmJoyOK7LvGP18OFEG359yY+aa51t6pENvqZAMqAREQQx1OI2Q==} engines: {node: '>=18.13'} hasBin: true peerDependencies: @@ -2088,6 +2088,11 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + acorn-typescript@1.4.13: + resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} + peerDependencies: + acorn: '>=8.9.0' + acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} @@ -2257,7 +2262,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} @@ -2278,10 +2283,6 @@ packages: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} - cookie@0.7.2: - resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} - engines: {node: '>= 0.6'} - cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -2489,6 +2490,9 @@ packages: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} + esrap@1.2.2: + resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} engines: {node: '>=4.0'} @@ -3421,10 +3425,6 @@ packages: engines: {node: '>=18'} hasBin: true - sirv@2.0.4: - resolution: {integrity: sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==} - engines: {node: '>= 10'} - sirv@3.0.0: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} engines: {node: '>=18'} @@ -3577,6 +3577,10 @@ packages: resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} + svelte@5.1.9: + resolution: {integrity: sha512-nzq+PPKGS2PoEWDjAcXSrKSbXmmmOAxd6dAz1IhRusUpVkFS6DMELWPyBPGwu6TpO/gsgtFXwX0M4+pAR5gzKw==} + engines: {node: '>=18'} + tapable@2.2.1: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} @@ -3663,6 +3667,11 @@ packages: engines: {node: '>=14.17'} hasBin: true + typescript@5.6.3: + resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} + engines: {node: '>=14.17'} + hasBin: true + ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} @@ -4492,22 +4501,22 @@ snapshots: eslint-visitor-keys: 4.1.0 espree: 10.2.0 - '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@4.2.19))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.4.5))(typescript@5.4.5)': + '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': dependencies: '@stylistic/eslint-plugin-js': 2.1.0(eslint@9.6.0) eslint: 9.6.0 eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.9.0(eslint@9.6.0) - eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@4.2.19) + eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.1.9) globals: 15.10.0 - typescript: 5.4.5 - typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.4.5) + typescript: 5.6.3 + typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/kit@2.6.2(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/cookie': 0.6.0 - cookie: 0.7.2 + cookie: 0.6.0 devalue: 5.1.0 esm-env: 1.0.0 import-meta-resolve: 4.1.0 @@ -4516,8 +4525,8 @@ snapshots: mrmime: 2.0.0 sade: 1.8.1 set-cookie-parser: 2.6.0 - sirv: 2.0.4 - svelte: 4.2.19 + sirv: 3.0.0 + svelte: 5.1.9 tiny-glob: 0.2.9 vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -4530,6 +4539,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.3.5 + svelte: 5.1.9 + vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + transitivePeerDependencies: + - supports-color + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) @@ -4544,6 +4562,20 @@ snapshots: transitivePeerDependencies: - supports-color + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.3.5 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.11 + svelte: 5.1.9 + svelte-hmr: 0.16.0(svelte@5.1.9) + vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 0.2.5(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + transitivePeerDependencies: + - supports-color + '@svitejs/changesets-changelog-github-compact@1.1.0': dependencies: '@changesets/get-github-info': 0.5.2 @@ -4599,34 +4631,34 @@ snapshots: dependencies: '@types/node': 18.19.50 - '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.4.5))(eslint@9.6.0)(typescript@5.4.5)': + '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.11.1 - '@typescript-eslint/parser': 8.4.0(eslint@9.6.0)(typescript@5.4.5) + '@typescript-eslint/parser': 8.4.0(eslint@9.6.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.4.0 - '@typescript-eslint/type-utils': 8.4.0(eslint@9.6.0)(typescript@5.4.5) - '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.4.5) + '@typescript-eslint/type-utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.4.0 eslint: 9.6.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.4.5)': + '@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/scope-manager': 8.4.0 '@typescript-eslint/types': 8.4.0 - '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.4.0 debug: 4.3.5 eslint: 9.6.0 optionalDependencies: - typescript: 5.4.5 + typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -4635,21 +4667,21 @@ snapshots: '@typescript-eslint/types': 8.4.0 '@typescript-eslint/visitor-keys': 8.4.0 - '@typescript-eslint/type-utils@8.4.0(eslint@9.6.0)(typescript@5.4.5)': + '@typescript-eslint/type-utils@8.4.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.4.5) - '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) debug: 4.3.5 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color '@typescript-eslint/types@8.4.0': {} - '@typescript-eslint/typescript-estree@8.4.0(typescript@5.4.5)': + '@typescript-eslint/typescript-estree@8.4.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.4.0 '@typescript-eslint/visitor-keys': 8.4.0 @@ -4658,18 +4690,18 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.6.3 - ts-api-utils: 1.3.0(typescript@5.4.5) + ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.4.0(eslint@9.6.0)(typescript@5.4.5)': + '@typescript-eslint/utils@8.4.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) '@typescript-eslint/scope-manager': 8.4.0 '@typescript-eslint/types': 8.4.0 - '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.4.5) + '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) eslint: 9.6.0 transitivePeerDependencies: - supports-color @@ -4736,6 +4768,10 @@ snapshots: dependencies: acorn: 8.12.1 + acorn-typescript@1.4.13(acorn@8.12.1): + dependencies: + acorn: 8.12.1 + acorn-walk@8.3.2: {} acorn@8.12.1: {} @@ -4912,8 +4948,6 @@ snapshots: cookie@0.6.0: {} - cookie@0.7.2: {} - cross-env@7.0.3: dependencies: cross-spawn: 7.0.3 @@ -5090,7 +5124,7 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@4.2.19): + eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.9): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 @@ -5103,9 +5137,9 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 semver: 7.6.3 - svelte-eslint-parser: 0.39.2(svelte@4.2.19) + svelte-eslint-parser: 0.39.2(svelte@5.1.9) optionalDependencies: - svelte: 4.2.19 + svelte: 5.1.9 transitivePeerDependencies: - ts-node @@ -5182,6 +5216,11 @@ snapshots: dependencies: estraverse: 5.3.0 + esrap@1.2.2: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + esrecurse@4.3.0: dependencies: estraverse: 5.3.0 @@ -5839,10 +5878,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.1.2(prettier@3.1.1)(svelte@4.2.19): + prettier-plugin-svelte@3.1.2(prettier@3.1.1)(svelte@5.1.9): dependencies: prettier: 3.1.1 - svelte: 4.2.19 + svelte: 5.1.9 prettier@2.8.8: {} @@ -6040,12 +6079,6 @@ snapshots: sirv: 3.0.0 tinydate: 1.3.0 - sirv@2.0.4: - dependencies: - '@polka/url': 1.0.0-next.28 - mrmime: 2.0.0 - totalist: 3.0.1 - sirv@3.0.0: dependencies: '@polka/url': 1.0.0-next.28 @@ -6122,7 +6155,7 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.39.2(svelte@4.2.19): + svelte-eslint-parser@0.39.2(svelte@5.1.9): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -6130,15 +6163,19 @@ snapshots: postcss: 8.4.47 postcss-scss: 4.0.9(postcss@8.4.47) optionalDependencies: - svelte: 4.2.19 + svelte: 5.1.9 svelte-hmr@0.16.0(svelte@4.2.19): dependencies: svelte: 4.2.19 - svelte-parse-markup@0.1.5(svelte@4.2.19): + svelte-hmr@0.16.0(svelte@5.1.9): dependencies: - svelte: 4.2.19 + svelte: 5.1.9 + + svelte-parse-markup@0.1.5(svelte@5.1.9): + dependencies: + svelte: 5.1.9 svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.4.5): dependencies: @@ -6174,6 +6211,22 @@ snapshots: magic-string: 0.30.11 periscopic: 3.1.0 + svelte@5.1.9: + dependencies: + '@ampproject/remapping': 2.3.0 + '@jridgewell/sourcemap-codec': 1.5.0 + '@types/estree': 1.0.6 + acorn: 8.12.1 + acorn-typescript: 1.4.13(acorn@8.12.1) + aria-query: 5.3.2 + axobject-query: 4.1.0 + esm-env: 1.0.0 + esrap: 1.2.2 + is-reference: 3.0.2 + locate-character: 3.0.0 + magic-string: 0.30.11 + zimmerframe: 1.1.2 + tapable@2.2.1: {} tar@6.2.1: @@ -6227,6 +6280,10 @@ snapshots: dependencies: typescript: 5.4.5 + ts-api-utils@1.3.0(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + ts-morph@24.0.0: dependencies: '@ts-morph/common': 0.25.0 @@ -6238,19 +6295,21 @@ snapshots: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.4.5): + typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.4.5))(eslint@9.6.0)(typescript@5.4.5) - '@typescript-eslint/parser': 8.4.0(eslint@9.6.0)(typescript@5.4.5) - '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.4.5) + '@typescript-eslint/eslint-plugin': 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.4.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) optionalDependencies: - typescript: 5.4.5 + typescript: 5.6.3 transitivePeerDependencies: - eslint - supports-color typescript@5.4.5: {} + typescript@5.6.3: {} + ufo@1.5.3: {} undici-types@5.26.5: {} From 73cf77f0c3cf7b760072914f56bb4890d590d022 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 09:12:56 -0700 Subject: [PATCH 0730/1135] chore(deps): update pnpm to v9.12.3 (#12895) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c5528ad6b325..42303946f718 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.12.2", + "packageManager": "pnpm@9.12.3", "engines": { "pnpm": "^9.0.0" } From d55b822ac37aaa1cc6d0dd202db593267ddad66b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 1 Nov 2024 09:14:31 -0700 Subject: [PATCH 0731/1135] Version Packages (#12897) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/chilled-cats-hang.md | 5 ----- .changeset/fast-crews-smash.md | 5 ----- .changeset/rare-glasses-smell.md | 5 ----- .changeset/strange-buckets-sell.md | 5 ----- .changeset/witty-years-relate.md | 5 ----- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- packages/migrate/CHANGELOG.md | 6 ++++++ packages/migrate/package.json | 2 +- 12 files changed, 28 insertions(+), 29 deletions(-) delete mode 100644 .changeset/chilled-cats-hang.md delete mode 100644 .changeset/fast-crews-smash.md delete mode 100644 .changeset/rare-glasses-smell.md delete mode 100644 .changeset/strange-buckets-sell.md delete mode 100644 .changeset/witty-years-relate.md diff --git a/.changeset/chilled-cats-hang.md b/.changeset/chilled-cats-hang.md deleted file mode 100644 index 47dae6ac5f68..000000000000 --- a/.changeset/chilled-cats-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: ensure element is focused after subsequent clicks of the same hash link diff --git a/.changeset/fast-crews-smash.md b/.changeset/fast-crews-smash.md deleted file mode 100644 index 9281f3cf2d9f..000000000000 --- a/.changeset/fast-crews-smash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: avoid preload if event default was prevented for `touchstart` and `mousedown` events diff --git a/.changeset/rare-glasses-smell.md b/.changeset/rare-glasses-smell.md deleted file mode 100644 index 53d3d8e51d88..000000000000 --- a/.changeset/rare-glasses-smell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'svelte-migrate': patch ---- - -fix: prefer TS in unclear migration situations if `tsconfig.json` found diff --git a/.changeset/strange-buckets-sell.md b/.changeset/strange-buckets-sell.md deleted file mode 100644 index 3cbaa6a7184c..000000000000 --- a/.changeset/strange-buckets-sell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: avoid reloading behaviour for hash links with data-sveltekit-reload if the hash is on the same page diff --git a/.changeset/witty-years-relate.md b/.changeset/witty-years-relate.md deleted file mode 100644 index c0d93ddb3ea7..000000000000 --- a/.changeset/witty-years-relate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/enhanced-img": minor ---- - -breaking: require Svelte 5 diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index 435640914ee0..743a63056d66 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.4.0 +### Minor Changes + + +- breaking: require Svelte 5 ([#12822](https://github.com/sveltejs/kit/pull/12822)) + ## 0.3.10 ### Patch Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 89c3445e7362..d3cf29e757a6 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.3.10", + "version": "0.4.0", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 8c9e9cc15bbe..2b7a95de623b 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.7.4 +### Patch Changes + + +- fix: ensure element is focused after subsequent clicks of the same hash link ([#12866](https://github.com/sveltejs/kit/pull/12866)) + + +- fix: avoid preload if event default was prevented for `touchstart` and `mousedown` events ([#12887](https://github.com/sveltejs/kit/pull/12887)) + + +- fix: avoid reloading behaviour for hash links with data-sveltekit-reload if the hash is on the same page ([#12866](https://github.com/sveltejs/kit/pull/12866)) + ## 2.7.3 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index dbcd64fa916b..5793ae5eace0 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.7.3", + "version": "2.7.4", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 678b39e92642..985bacc7e0a3 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.7.3'; +export const VERSION = '2.7.4'; diff --git a/packages/migrate/CHANGELOG.md b/packages/migrate/CHANGELOG.md index 0b9c6daa6480..efde63584649 100644 --- a/packages/migrate/CHANGELOG.md +++ b/packages/migrate/CHANGELOG.md @@ -1,5 +1,11 @@ # svelte-migrate +## 1.6.7 +### Patch Changes + + +- fix: prefer TS in unclear migration situations if `tsconfig.json` found ([#12881](https://github.com/sveltejs/kit/pull/12881)) + ## 1.6.6 ### Patch Changes diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 50e528e8f6e8..3670fda4e962 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -1,6 +1,6 @@ { "name": "svelte-migrate", - "version": "1.6.6", + "version": "1.6.7", "description": "A CLI for migrating Svelte(Kit) codebases", "keywords": [ "migration", From 204506b97a5c8ab42e230bf5b926973ed94140b7 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Sat, 2 Nov 2024 23:52:25 +0100 Subject: [PATCH 0732/1135] fix: prevent duplicate imports (#12931) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/spicy-cars-cheer.md | 5 ++++ .../migrate/migrations/svelte-5/migrate.js | 13 ++------- .../migrations/svelte-5/migrate.spec.js | 29 +++++++++++++++++++ .../migrate/migrations/sveltekit-2/migrate.js | 19 +++++------- packages/migrate/utils.js | 18 ++++++++++++ 5 files changed, 62 insertions(+), 22 deletions(-) create mode 100644 .changeset/spicy-cars-cheer.md diff --git a/.changeset/spicy-cars-cheer.md b/.changeset/spicy-cars-cheer.md new file mode 100644 index 000000000000..4a46f1a65365 --- /dev/null +++ b/.changeset/spicy-cars-cheer.md @@ -0,0 +1,5 @@ +--- +'svelte-migrate': patch +--- + +fix: prevent duplicate imports diff --git a/packages/migrate/migrations/svelte-5/migrate.js b/packages/migrate/migrations/svelte-5/migrate.js index 1b6c73af81a2..eb9e750f46a0 100644 --- a/packages/migrate/migrations/svelte-5/migrate.js +++ b/packages/migrate/migrations/svelte-5/migrate.js @@ -1,6 +1,6 @@ import fs from 'node:fs'; import { Project, ts, Node } from 'ts-morph'; -import { update_pkg } from '../../utils.js'; +import { add_named_import, update_pkg } from '../../utils.js'; export function update_pkg_json() { fs.writeFileSync( @@ -94,14 +94,7 @@ function update_component_instantiation(source) { ?.remove(); } - if (source.getImportDeclaration('svelte')) { - source.getImportDeclaration('svelte')?.addNamedImport(method); - } else { - source.addImportDeclaration({ - moduleSpecifier: 'svelte', - namedImports: [method] - }); - } + add_named_import(source, 'svelte', method); const declaration = parent .getParentIfKind(ts.SyntaxKind.VariableDeclaration) @@ -114,7 +107,7 @@ function update_component_instantiation(source) { const call_expr = parent.getParentIfKind(ts.SyntaxKind.CallExpression); if (call_expr) { call_expr.replaceWithText(`unmount(${usage.getText()})`); - source.getImportDeclaration('svelte')?.addNamedImport('unmount'); + add_named_import(source, 'svelte', 'unmount'); } } } diff --git a/packages/migrate/migrations/svelte-5/migrate.spec.js b/packages/migrate/migrations/svelte-5/migrate.spec.js index a623230d7eae..0f9e3e6d4db6 100644 --- a/packages/migrate/migrations/svelte-5/migrate.spec.js +++ b/packages/migrate/migrations/svelte-5/migrate.spec.js @@ -73,6 +73,35 @@ function destroy() { ); }); +test('Updates component creation with multiple components', () => { + const result = transform_module_code( + `import App from './App.svelte'; +import Child from './Child.svelte'; + +const x = new App({ + target: document.getElementById('app')! +}); +const y = new Child({ + target: document.getElementById('child')! +}); +` + ); + assert.equal( + result, + `import App from './App.svelte'; +import Child from './Child.svelte'; +import { mount } from "svelte"; + +const x = mount(App, { + target: document.getElementById('app')! +}); +const y = mount(Child, { + target: document.getElementById('child')! +}); +` + ); +}); + test('Update package.json', () => { const result = update_pkg_json_content(`{ "name": "svelte-app", diff --git a/packages/migrate/migrations/sveltekit-2/migrate.js b/packages/migrate/migrations/sveltekit-2/migrate.js index ddd46d946f64..9657be37d480 100644 --- a/packages/migrate/migrations/sveltekit-2/migrate.js +++ b/packages/migrate/migrations/sveltekit-2/migrate.js @@ -1,6 +1,11 @@ import fs from 'node:fs'; import { Project, Node, SyntaxKind } from 'ts-morph'; -import { log_migration, log_on_ts_modification, update_pkg } from '../../utils.js'; +import { + add_named_import, + log_migration, + log_on_ts_modification, + update_pkg +} from '../../utils.js'; import path from 'node:path'; export function update_pkg_json() { @@ -112,17 +117,7 @@ export function update_svelte_config_content(code) { ?.setModuleSpecifier('@sveltejs/vite-plugin-svelte'); } else { namedImport.remove(); - const vps = source.getImportDeclaration( - (i) => i.getModuleSpecifierValue() === '@sveltejs/vite-plugin-svelte' - ); - if (vps) { - vps.addNamedImport('vitePreprocess'); - } else { - source.addImportDeclaration({ - moduleSpecifier: '@sveltejs/vite-plugin-svelte', - namedImports: ['vitePreprocess'] - }); - } + add_named_import(source, '@sveltejs/vite-plugin-svelte', 'vitePreprocess'); } logger(); diff --git a/packages/migrate/utils.js b/packages/migrate/utils.js index 9cd9d10c6f39..944461f02a78 100644 --- a/packages/migrate/utils.js +++ b/packages/migrate/utils.js @@ -401,3 +401,21 @@ export function read_samples(test_file) { return samples; } + +/** + * @param {import('ts-morph').SourceFile} source + * @param {string} _import + * @param {string} method + */ +export function add_named_import(source, _import, method) { + const existing = source.getImportDeclaration(_import); + if (existing) { + if (existing.getNamedImports().some((i) => i.getName() === method)) return; + existing?.addNamedImport(method); + } else { + source.addImportDeclaration({ + moduleSpecifier: _import, + namedImports: [method] + }); + } +} From b3666b2f40946457554c2a1bcede83513b7827c4 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 2 Nov 2024 15:57:11 -0700 Subject: [PATCH 0733/1135] Version Packages (#12937) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/spicy-cars-cheer.md | 5 ----- packages/migrate/CHANGELOG.md | 6 ++++++ packages/migrate/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/spicy-cars-cheer.md diff --git a/.changeset/spicy-cars-cheer.md b/.changeset/spicy-cars-cheer.md deleted file mode 100644 index 4a46f1a65365..000000000000 --- a/.changeset/spicy-cars-cheer.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'svelte-migrate': patch ---- - -fix: prevent duplicate imports diff --git a/packages/migrate/CHANGELOG.md b/packages/migrate/CHANGELOG.md index efde63584649..96020c5b63b7 100644 --- a/packages/migrate/CHANGELOG.md +++ b/packages/migrate/CHANGELOG.md @@ -1,5 +1,11 @@ # svelte-migrate +## 1.6.8 +### Patch Changes + + +- fix: prevent duplicate imports ([#12931](https://github.com/sveltejs/kit/pull/12931)) + ## 1.6.7 ### Patch Changes diff --git a/packages/migrate/package.json b/packages/migrate/package.json index 3670fda4e962..be1a716729fb 100644 --- a/packages/migrate/package.json +++ b/packages/migrate/package.json @@ -1,6 +1,6 @@ { "name": "svelte-migrate", - "version": "1.6.7", + "version": "1.6.8", "description": "A CLI for migrating Svelte(Kit) codebases", "keywords": [ "migration", From c4b76d09c9f5982f024d5422aafea4135cc8ad15 Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Sat, 2 Nov 2024 22:21:37 -0400 Subject: [PATCH 0734/1135] chore: setup docs previews (#12938) * chore: setup docs previews * test * delete --- .../workflows/docs-preview-create-request.yml | 26 ++++++++++++++++++ .../workflows/docs-preview-delete-request.yml | 27 +++++++++++++++++++ 2 files changed, 53 insertions(+) create mode 100644 .github/workflows/docs-preview-create-request.yml create mode 100644 .github/workflows/docs-preview-delete-request.yml diff --git a/.github/workflows/docs-preview-create-request.yml b/.github/workflows/docs-preview-create-request.yml new file mode 100644 index 000000000000..af4bcfce2046 --- /dev/null +++ b/.github/workflows/docs-preview-create-request.yml @@ -0,0 +1,26 @@ +# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md +name: Docs preview create request + +on: + pull_request: + branches: + - main + +jobs: + dispatch: + runs-on: ubuntu-latest + steps: + - name: Repository Dispatch + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.SYNC_REQUEST_TOKEN }} + repository: sveltejs/svelte.dev + event-type: docs-preview-create + client-payload: |- + { + "package": "kit", + "repo": "${{ github.repository }}", + "owner": "${{ github.event.pull_request.head.repo.owner.login }}", + "branch": "${{ github.event.pull_request.head.ref }}", + "pr": ${{ github.event.pull_request.number }} + } diff --git a/.github/workflows/docs-preview-delete-request.yml b/.github/workflows/docs-preview-delete-request.yml new file mode 100644 index 000000000000..40a9bacbfded --- /dev/null +++ b/.github/workflows/docs-preview-delete-request.yml @@ -0,0 +1,27 @@ +# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md +name: Docs preview delete request + +on: + pull_request: + branches: + - main + types: [closed] + +jobs: + dispatch: + runs-on: ubuntu-latest + steps: + - name: Repository Dispatch + uses: peter-evans/repository-dispatch@v3 + with: + token: ${{ secrets.SYNC_REQUEST_TOKEN }} + repository: sveltejs/svelte.dev + event-type: docs-preview-delete + client-payload: |- + { + "package": "kit", + "repo": "${{ github.repository }}", + "owner": "${{ github.event.pull_request.head.repo.owner.login }}", + "branch": "${{ github.event.pull_request.head.ref }}", + "pr": ${{ github.event.pull_request.number }} + } From c484ced0f6305c98433ccb9034545fd5dc3acb82 Mon Sep 17 00:00:00 2001 From: ottomated <31470743+ottomated@users.noreply.github.com> Date: Sun, 3 Nov 2024 20:01:47 -0800 Subject: [PATCH 0735/1135] fix: fix nested images in enhanced-img (#12945) --- .changeset/stale-moons-walk.md | 5 +++++ packages/enhanced-img/src/preprocessor.js | 7 +++++-- packages/enhanced-img/test/Input.svelte | 4 ++++ packages/enhanced-img/test/Output.svelte | 4 ++++ 4 files changed, 18 insertions(+), 2 deletions(-) create mode 100644 .changeset/stale-moons-walk.md diff --git a/.changeset/stale-moons-walk.md b/.changeset/stale-moons-walk.md new file mode 100644 index 000000000000..4fa3cd36c61f --- /dev/null +++ b/.changeset/stale-moons-walk.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': patch +--- + +fix: correctly handle `<enhanced:img />` elements nested in other DOM elements diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js index 2de5d9f6b9cc..dbba1aa5514f 100644 --- a/packages/enhanced-img/src/preprocessor.js +++ b/packages/enhanced-img/src/preprocessor.js @@ -131,7 +131,6 @@ export function image(opts) { * @type {Array<ReturnType<typeof update_element>>} */ const pending_ast_updates = []; - // TODO: switch to zimmerframe with Svelte 5 walk( /** @type {import('svelte/compiler').AST.Root} */ (ast), @@ -142,7 +141,7 @@ export function image(opts) { }, /** @param {import('svelte/compiler').AST.RegularElement} node */ // @ts-ignore - RegularElement(node) { + RegularElement(node, { next }) { if ('name' in node && node.name === 'enhanced:img') { // Compare node tag match const src = get_attr_value(node, 'src'); @@ -150,7 +149,11 @@ export function image(opts) { if (!src || typeof src === 'boolean') return; pending_ast_updates.push(update_element(node, src)); + + return; } + + next(); } } ); diff --git a/packages/enhanced-img/test/Input.svelte b/packages/enhanced-img/test/Input.svelte index 4b6d54d22125..3a29902d0930 100644 --- a/packages/enhanced-img/test/Input.svelte +++ b/packages/enhanced-img/test/Input.svelte @@ -15,6 +15,10 @@ <enhanced:img src="./dev.png" alt="dev test" /> +<div> + <enhanced:img src="./dev.png" alt="nested test" /> +</div> + <enhanced:img src="./prod.png" alt="production test" /> <enhanced:img src="./dev.png" width="5" height="10" alt="dimensions test" /> diff --git a/packages/enhanced-img/test/Output.svelte b/packages/enhanced-img/test/Output.svelte index 2cc0fe0609ae..80a8485485ad 100644 --- a/packages/enhanced-img/test/Output.svelte +++ b/packages/enhanced-img/test/Output.svelte @@ -24,6 +24,10 @@ <picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" alt="dev test" width=1440 height=1440 /></picture> +<div> + <picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" alt="nested test" width=1440 height=1440 /></picture> +</div> + <picture><source srcset={__DECLARED_ASSET_0__} type="image/avif" /><source srcset={__DECLARED_ASSET_1__} type="image/webp" /><source srcset={__DECLARED_ASSET_2__} type="image/png" /><img src={__DECLARED_ASSET_3__} alt="production test" width=1440 height=1440 /></picture> <picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" width="5" height="10" alt="dimensions test" /></picture> From 32c9788a4d660b79a129fbad84261916145c40d6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 3 Nov 2024 20:02:53 -0800 Subject: [PATCH 0736/1135] Version Packages (#12946) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/stale-moons-walk.md | 5 ----- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/stale-moons-walk.md diff --git a/.changeset/stale-moons-walk.md b/.changeset/stale-moons-walk.md deleted file mode 100644 index 4fa3cd36c61f..000000000000 --- a/.changeset/stale-moons-walk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': patch ---- - -fix: correctly handle `<enhanced:img />` elements nested in other DOM elements diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index 743a63056d66..31218412f370 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.4.1 +### Patch Changes + + +- fix: correctly handle `<enhanced:img />` elements nested in other DOM elements ([#12945](https://github.com/sveltejs/kit/pull/12945)) + ## 0.4.0 ### Minor Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index d3cf29e757a6..862b6a0c4e3b 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.4.0", + "version": "0.4.1", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", From 557897a8aa9322a427fbcb1c17877eb3ff24ceca Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Mon, 4 Nov 2024 16:40:35 -0500 Subject: [PATCH 0737/1135] use pull_request_target (#12949) --- .github/workflows/docs-preview-create-request.yml | 2 +- .github/workflows/docs-preview-delete-request.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs-preview-create-request.yml b/.github/workflows/docs-preview-create-request.yml index af4bcfce2046..bc5b40f95148 100644 --- a/.github/workflows/docs-preview-create-request.yml +++ b/.github/workflows/docs-preview-create-request.yml @@ -2,7 +2,7 @@ name: Docs preview create request on: - pull_request: + pull_request_target: branches: - main diff --git a/.github/workflows/docs-preview-delete-request.yml b/.github/workflows/docs-preview-delete-request.yml index 40a9bacbfded..fc96fcfa3fc1 100644 --- a/.github/workflows/docs-preview-delete-request.yml +++ b/.github/workflows/docs-preview-delete-request.yml @@ -2,7 +2,7 @@ name: Docs preview delete request on: - pull_request: + pull_request_target: branches: - main types: [closed] From 951224d496984f3919b17547b54af04226aec389 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Tue, 5 Nov 2024 08:44:19 +0800 Subject: [PATCH 0738/1135] fix: warn on invalid cookie name characters (#12806) --- .changeset/old-points-tell.md | 5 +++++ packages/kit/src/runtime/server/cookie.js | 11 +++++++++++ 2 files changed, 16 insertions(+) create mode 100644 .changeset/old-points-tell.md diff --git a/.changeset/old-points-tell.md b/.changeset/old-points-tell.md new file mode 100644 index 000000000000..b1bb7681fb01 --- /dev/null +++ b/.changeset/old-points-tell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: warn on invalid cookie name characters diff --git a/packages/kit/src/runtime/server/cookie.js b/packages/kit/src/runtime/server/cookie.js index 7acd24417848..33163fe77b55 100644 --- a/packages/kit/src/runtime/server/cookie.js +++ b/packages/kit/src/runtime/server/cookie.js @@ -1,6 +1,9 @@ import { parse, serialize } from 'cookie'; import { add_data_suffix, normalize_path, resolve } from '../../utils/url.js'; +// eslint-disable-next-line no-control-regex -- control characters are invalid in cookie names +const INVALID_COOKIE_CHARACTER_REGEX = /[\x00-\x1F\x7F()<>@,;:"/[\]?={} \t]/; + /** * Tracks all cookies set during dev mode so we can emit warnings * when we detect that there's likely cookie misusage due to wrong paths @@ -113,6 +116,14 @@ export function get_cookies(request, url, trailing_slash) { * @param {import('./page/types.js').Cookie['options']} options */ set(name, value, options) { + // TODO: remove this check in 3.0 + const illegal_characters = name.match(INVALID_COOKIE_CHARACTER_REGEX); + if (illegal_characters) { + console.warn( + `The cookie name "${name}" will be invalid in SvelteKit 3.0 as it contains ${illegal_characters.join(' and ')}. See RFC 2616 for more details https://datatracker.ietf.org/doc/html/rfc2616#section-2.2` + ); + } + validate_options(options); set_internal(name, value, { ...defaults, ...options }); }, From c80b1d8eefb6d5201fba41157bba5da49c4f82de Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Tue, 5 Nov 2024 08:45:38 +0800 Subject: [PATCH 0739/1135] fix: set no-op proxy config to get Vite HTTPS working (#12907) --- .changeset/unlucky-walls-drum.md | 5 +++++ packages/kit/src/exports/vite/index.js | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) create mode 100644 .changeset/unlucky-walls-drum.md diff --git a/.changeset/unlucky-walls-drum.md b/.changeset/unlucky-walls-drum.md new file mode 100644 index 000000000000..f0cb9a403960 --- /dev/null +++ b/.changeset/unlucky-walls-drum.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: when using `@vitejs/plugin-basic-ssl`, set a no-op proxy config to downgrade from HTTP/2 to TLS since `undici` does not yet enable HTTP/2 by default diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index e6521e979560..40fa4c6edb56 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -349,6 +349,22 @@ async function kit({ svelte_config }) { * Stores the final config. */ configResolved(config) { + // we search for this plugin by name because we can't detect it + // since it doesn't directly modify the https config unlike the mkcert plugin + const vite_basic_ssl = config.plugins.find(({ name }) => name === 'vite:basic-ssl'); + + // by default, when enabling HTTPS in Vite, it also enables HTTP/2 + // however, undici has not yet enabled HTTP/2 by default: https://github.com/nodejs/undici/issues/2750 + // we set a no-op proxy config to force Vite to downgrade to TLS-only + // see https://vitejs.dev/config/#server-https + if ((config.server.https || vite_basic_ssl) && !config.server.proxy) { + config.server.proxy = {}; + } + + if ((config.preview.https || vite_basic_ssl) && !config.preview.proxy) { + config.preview.proxy = {}; + } + vite_config = config; } }; From 425a0051803f7f76b0eb0850fe4c669c5225a7bc Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 4 Nov 2024 16:58:03 -0800 Subject: [PATCH 0740/1135] Version Packages (#12952) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/old-points-tell.md | 5 ----- .changeset/unlucky-walls-drum.md | 5 ----- packages/kit/CHANGELOG.md | 9 +++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 .changeset/old-points-tell.md delete mode 100644 .changeset/unlucky-walls-drum.md diff --git a/.changeset/old-points-tell.md b/.changeset/old-points-tell.md deleted file mode 100644 index b1bb7681fb01..000000000000 --- a/.changeset/old-points-tell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: warn on invalid cookie name characters diff --git a/.changeset/unlucky-walls-drum.md b/.changeset/unlucky-walls-drum.md deleted file mode 100644 index f0cb9a403960..000000000000 --- a/.changeset/unlucky-walls-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: when using `@vitejs/plugin-basic-ssl`, set a no-op proxy config to downgrade from HTTP/2 to TLS since `undici` does not yet enable HTTP/2 by default diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 2b7a95de623b..3aa4a28d781c 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/kit +## 2.7.5 +### Patch Changes + + +- fix: warn on invalid cookie name characters ([#12806](https://github.com/sveltejs/kit/pull/12806)) + + +- fix: when using `@vitejs/plugin-basic-ssl`, set a no-op proxy config to downgrade from HTTP/2 to TLS since `undici` does not yet enable HTTP/2 by default ([#12907](https://github.com/sveltejs/kit/pull/12907)) + ## 2.7.4 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 5793ae5eace0..6dbc94a6fb04 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.7.4", + "version": "2.7.5", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 985bacc7e0a3..3561a25c8c30 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.7.4'; +export const VERSION = '2.7.5'; From 9d0230e8a2a0142e9ff94556de1659be52040235 Mon Sep 17 00:00:00 2001 From: tkhs <34599544+tkhs0813@users.noreply.github.com> Date: Tue, 5 Nov 2024 13:01:41 +0900 Subject: [PATCH 0741/1135] chore: run CI tests on Node 22 (#12954) --- .github/workflows/ci.yml | 3 +++ packages/kit/src/runtime/server/cookie.js | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index a8e35a53dc16..486af3633207 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -45,6 +45,9 @@ jobs: - node-version: 20 os: ubuntu-latest e2e-browser: 'chromium' + - node-version: 22 + os: ubuntu-latest + e2e-browser: 'chromium' env: KIT_E2E_BROWSER: ${{matrix.e2e-browser}} steps: diff --git a/packages/kit/src/runtime/server/cookie.js b/packages/kit/src/runtime/server/cookie.js index 33163fe77b55..ddefa847a432 100644 --- a/packages/kit/src/runtime/server/cookie.js +++ b/packages/kit/src/runtime/server/cookie.js @@ -120,7 +120,9 @@ export function get_cookies(request, url, trailing_slash) { const illegal_characters = name.match(INVALID_COOKIE_CHARACTER_REGEX); if (illegal_characters) { console.warn( - `The cookie name "${name}" will be invalid in SvelteKit 3.0 as it contains ${illegal_characters.join(' and ')}. See RFC 2616 for more details https://datatracker.ietf.org/doc/html/rfc2616#section-2.2` + `The cookie name "${name}" will be invalid in SvelteKit 3.0 as it contains ${illegal_characters.join( + ' and ' + )}. See RFC 2616 for more details https://datatracker.ietf.org/doc/html/rfc2616#section-2.2` ); } From 70246e62912880f210c947fbcd1a912fefe821fd Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Tue, 5 Nov 2024 13:50:28 -0500 Subject: [PATCH 0742/1135] fix: update broken links in JSDoc (#12960) * fix: update broken links in JSDoc * bump * I WILL STAB YOU --- .changeset/thick-mails-wonder.md | 5 +++++ packages/kit/src/exports/public.d.ts | 6 +++--- packages/kit/src/types/ambient.d.ts | 2 +- packages/kit/types/index.d.ts | 8 ++++---- 4 files changed, 13 insertions(+), 8 deletions(-) create mode 100644 .changeset/thick-mails-wonder.md diff --git a/.changeset/thick-mails-wonder.md b/.changeset/thick-mails-wonder.md new file mode 100644 index 000000000000..36b3d813c0db --- /dev/null +++ b/.changeset/thick-mails-wonder.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: update broken links in JSDoc diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 77be062a3163..92136d609c10 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -689,7 +689,7 @@ export type Handle = (input: { }) => MaybePromise<Response>; /** - * The server-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. + * The server-side [`handleError`](https://svelte.dev/docs/kit/hooks#Shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. * * If an unexpected error is thrown during loading or rendering, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -702,7 +702,7 @@ export type HandleServerError = (input: { }) => MaybePromise<void | App.Error>; /** - * The client-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. + * The client-side [`handleError`](https://svelte.dev/docs/kit/hooks#Shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. * * If an unexpected error is thrown during loading or the following render, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -715,7 +715,7 @@ export type HandleClientError = (input: { }) => MaybePromise<void | App.Error>; /** - * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) */ export type HandleFetch = (input: { event: RequestEvent; diff --git a/packages/kit/src/types/ambient.d.ts b/packages/kit/src/types/ambient.d.ts index 16ef13016deb..496fc537cf4d 100644 --- a/packages/kit/src/types/ambient.d.ts +++ b/packages/kit/src/types/ambient.d.ts @@ -46,7 +46,7 @@ declare namespace App { export interface PageState {} /** - * If your adapter provides [platform-specific context](https://svelte.dev/docs/kit/adapters#platform-specific-context) via `event.platform`, you can specify it here. + * If your adapter provides [platform-specific context](https://svelte.dev/docs/kit/adapters#Platform-specific-context) via `event.platform`, you can specify it here. */ export interface Platform {} } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 491de54d9698..3f04154119cf 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -671,7 +671,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise<Response>; /** - * The server-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. + * The server-side [`handleError`](https://svelte.dev/docs/kit/hooks#Shared-hooks-handleError) hook runs when an unexpected error is thrown while responding to a request. * * If an unexpected error is thrown during loading or rendering, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -684,7 +684,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise<void | App.Error>; /** - * The client-side [`handleError`](https://svelte.dev/docs/kit/hooks#shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. + * The client-side [`handleError`](https://svelte.dev/docs/kit/hooks#Shared-hooks-handleError) hook runs when an unexpected error is thrown while navigating. * * If an unexpected error is thrown during loading or the following render, this function will be called with the error and the event. * Make sure that this function _never_ throws an error. @@ -697,7 +697,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise<void | App.Error>; /** - * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) */ export type HandleFetch = (input: { event: RequestEvent; @@ -2287,7 +2287,7 @@ declare namespace App { export interface PageState {} /** - * If your adapter provides [platform-specific context](https://svelte.dev/docs/kit/adapters#platform-specific-context) via `event.platform`, you can specify it here. + * If your adapter provides [platform-specific context](https://svelte.dev/docs/kit/adapters#Platform-specific-context) via `event.platform`, you can specify it here. */ export interface Platform {} } From 92e129e7e74f99eeee14b726778b555bc0ceb7ff Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 13:52:03 -0500 Subject: [PATCH 0743/1135] Version Packages (#12962) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/thick-mails-wonder.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/thick-mails-wonder.md diff --git a/.changeset/thick-mails-wonder.md b/.changeset/thick-mails-wonder.md deleted file mode 100644 index 36b3d813c0db..000000000000 --- a/.changeset/thick-mails-wonder.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: update broken links in JSDoc diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 3aa4a28d781c..804ad8debffe 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.7.6 +### Patch Changes + + +- fix: update broken links in JSDoc ([#12960](https://github.com/sveltejs/kit/pull/12960)) + ## 2.7.5 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 6dbc94a6fb04..d4ed25cc958d 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.7.5", + "version": "2.7.6", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 3561a25c8c30..b2782665011c 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.7.5'; +export const VERSION = '2.7.6'; From 567035779eb8d7755e7483292c8e0e1fab291f97 Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Tue, 5 Nov 2024 14:17:25 -0500 Subject: [PATCH 0744/1135] fix: update links in JSDoc (#12963) --- .changeset/serious-rats-jump.md | 5 +++++ packages/kit/src/exports/public.d.ts | 2 +- packages/kit/types/index.d.ts | 2 +- 3 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/serious-rats-jump.md diff --git a/.changeset/serious-rats-jump.md b/.changeset/serious-rats-jump.md new file mode 100644 index 000000000000..f6f39156ca16 --- /dev/null +++ b/.changeset/serious-rats-jump.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: update link in JSDoc diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 92136d609c10..7db17269967f 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -441,7 +441,7 @@ export interface KitConfig { */ lib?: string; /** - * a directory containing [parameter matchers](https://svelte.dev/docs/kit/advanced-routing#matching) + * a directory containing [parameter matchers](https://svelte.dev/docs/kit/advanced-routing#Matching) * @default "src/params" */ params?: string; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 3f04154119cf..c943a2bc7179 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -423,7 +423,7 @@ declare module '@sveltejs/kit' { */ lib?: string; /** - * a directory containing [parameter matchers](https://svelte.dev/docs/kit/advanced-routing#matching) + * a directory containing [parameter matchers](https://svelte.dev/docs/kit/advanced-routing#Matching) * @default "src/params" */ params?: string; From fc2736183514a902034464c79961568470f8a405 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 5 Nov 2024 14:19:08 -0500 Subject: [PATCH 0745/1135] Version Packages (#12964) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/serious-rats-jump.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/serious-rats-jump.md diff --git a/.changeset/serious-rats-jump.md b/.changeset/serious-rats-jump.md deleted file mode 100644 index f6f39156ca16..000000000000 --- a/.changeset/serious-rats-jump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: update link in JSDoc diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 804ad8debffe..505bf17e4fa0 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.7.7 +### Patch Changes + + +- fix: update link in JSDoc ([#12963](https://github.com/sveltejs/kit/pull/12963)) + ## 2.7.6 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index d4ed25cc958d..fb7a3b8d6bfd 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.7.6", + "version": "2.7.7", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index b2782665011c..2c2d0ed224ae 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.7.6'; +export const VERSION = '2.7.7'; From 92b2686314a7dbebee1761c3da7719d599f003c7 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Wed, 6 Nov 2024 03:30:45 +0800 Subject: [PATCH 0746/1135] feat: add action failure helper (#12878) closes #12611 Exposes a helper method to check if a variable is an instanceof ActionFailure --- .changeset/fresh-guests-knock.md | 5 +++++ packages/kit/src/exports/index.js | 9 +++++++++ packages/kit/types/index.d.ts | 5 +++++ 3 files changed, 19 insertions(+) create mode 100644 .changeset/fresh-guests-knock.md diff --git a/.changeset/fresh-guests-knock.md b/.changeset/fresh-guests-knock.md new file mode 100644 index 000000000000..19db1582ae4e --- /dev/null +++ b/.changeset/fresh-guests-knock.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add helper to identify `ActionFailure` objects diff --git a/packages/kit/src/exports/index.js b/packages/kit/src/exports/index.js index 32fb827dc629..5454a2e15e31 100644 --- a/packages/kit/src/exports/index.js +++ b/packages/kit/src/exports/index.js @@ -190,3 +190,12 @@ export function fail(status, data) { // @ts-expect-error unique symbol missing return new ActionFailure(status, data); } + +/** + * Checks whether this is an action failure thrown by {@link fail}. + * @param {unknown} e The object to check. + * @return {e is import('./public.js').ActionFailure} + */ +export function isActionFailure(e) { + return e instanceof ActionFailure; +} diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index c943a2bc7179..237b3e3ff57e 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1826,6 +1826,11 @@ declare module '@sveltejs/kit' { * @param data Data associated with the failure (e.g. validation errors) * */ export function fail<T extends Record<string, unknown> | undefined = undefined>(status: number, data: T): ActionFailure<T>; + /** + * Checks whether this is an action failure thrown by {@link fail}. + * @param e The object to check. + * */ + export function isActionFailure(e: unknown): e is ActionFailure<undefined>; export type LessThan<TNumber extends number, TArray extends any[] = []> = TNumber extends TArray['length'] ? TArray[number] : LessThan<TNumber, [...TArray, TArray['length']]>; export type NumericRange<TStart extends number, TEnd extends number> = Exclude<TEnd | LessThan<TEnd>, LessThan<TStart>>; export const VERSION: string; From 030a099ae7aa15a66833f82f6d9e3012aea17276 Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Wed, 6 Nov 2024 20:26:59 -0500 Subject: [PATCH 0747/1135] fix: disregard presence/absence of trailing slash in prerendered redirect (#12966) * fix: disregard presence/absence of trailing slash in prerendered redirect * handle edge case * tweak comment placement --- .changeset/seven-kangaroos-talk.md | 5 +++++ packages/adapter-vercel/index.js | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .changeset/seven-kangaroos-talk.md diff --git a/.changeset/seven-kangaroos-talk.md b/.changeset/seven-kangaroos-talk.md new file mode 100644 index 000000000000..a9eed6c82b20 --- /dev/null +++ b/.changeset/seven-kangaroos-talk.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +fix: disregard presence/absence of trailing slash in prerendered redirect diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index bef15fc1ccfe..bb9114a0c10e 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -444,7 +444,17 @@ function static_vercel_config(builder, config, dir) { /** @type {import('./index.js').ImagesConfig | undefined} */ const images = config.images; - for (const [src, redirect] of builder.prerendered.redirects) { + for (let [src, redirect] of builder.prerendered.redirects) { + if (src.replace(/\/$/, '') === redirect.location.replace(/\/$/, '')) { + // ignore the extreme edge case of a `/foo` -> `/foo/` redirect, + // which would only arise if the response was generated by a + // `handle` hook or outside the app altogether (since you + // can't declaratively create both routes) + } else { + // redirect both `/foo` and `/foo/` to `redirect.location` + src = src.replace(/\/?$/, '/?'); + } + prerendered_redirects.push({ src, headers: { From be39f069875a7de1dcf4b1419c3200c838f11198 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 6 Nov 2024 20:28:43 -0500 Subject: [PATCH 0748/1135] Version Packages (#12965) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/fresh-guests-knock.md | 5 ----- .changeset/seven-kangaroos-talk.md | 5 ----- packages/adapter-vercel/CHANGELOG.md | 9 +++++++++ packages/adapter-vercel/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 7 files changed, 18 insertions(+), 13 deletions(-) delete mode 100644 .changeset/fresh-guests-knock.md delete mode 100644 .changeset/seven-kangaroos-talk.md diff --git a/.changeset/fresh-guests-knock.md b/.changeset/fresh-guests-knock.md deleted file mode 100644 index 19db1582ae4e..000000000000 --- a/.changeset/fresh-guests-knock.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: add helper to identify `ActionFailure` objects diff --git a/.changeset/seven-kangaroos-talk.md b/.changeset/seven-kangaroos-talk.md deleted file mode 100644 index a9eed6c82b20..000000000000 --- a/.changeset/seven-kangaroos-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-vercel': patch ---- - -fix: disregard presence/absence of trailing slash in prerendered redirect diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index ba6d4a937ab8..6ef0f2787c62 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-vercel +## 5.4.7 +### Patch Changes + + +- fix: disregard presence/absence of trailing slash in prerendered redirect ([#12966](https://github.com/sveltejs/kit/pull/12966)) + +- Updated dependencies [[`92b2686314a7dbebee1761c3da7719d599f003c7`](https://github.com/sveltejs/kit/commit/92b2686314a7dbebee1761c3da7719d599f003c7)]: + - @sveltejs/kit@2.8.0 + ## 5.4.6 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 096e23b80779..f8e1f6cf0feb 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.4.6", + "version": "5.4.7", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 505bf17e4fa0..02f046987b9e 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.8.0 +### Minor Changes + + +- feat: add helper to identify `ActionFailure` objects ([#12878](https://github.com/sveltejs/kit/pull/12878)) + ## 2.7.7 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index fb7a3b8d6bfd..2d6c4df160ee 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.7.7", + "version": "2.8.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 2c2d0ed224ae..3b8f5a9e08c1 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.7.7'; +export const VERSION = '2.8.0'; From 598129a4f9436ba34d551c73dfa8f8932af92da2 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 7 Nov 2024 14:29:54 -0800 Subject: [PATCH 0749/1135] chore: move migrate package to CLI repo (#12971) --- .changeset/config.json | 2 +- .prettierrc | 3 +- README.md | 1 - packages/migrate/CHANGELOG.md | 345 -------------- packages/migrate/README.md | 31 -- packages/migrate/bin.js | 27 -- packages/migrate/migrations/package/index.js | 81 ---- .../migrations/package/migrate_config.js | 81 ---- .../migrations/package/migrate_config.spec.js | 78 ---- .../migrate/migrations/package/migrate_pkg.js | 211 --------- .../migrations/package/migrate_pkg.spec.js | 157 ------- packages/migrate/migrations/routes/index.js | 211 --------- .../routes/migrate_page_js/index.js | 195 -------- .../routes/migrate_page_js/index.spec.js | 10 - .../routes/migrate_page_js/samples.md | 380 ---------------- .../routes/migrate_page_server/index.js | 122 ----- .../routes/migrate_page_server/index.spec.js | 10 - .../routes/migrate_page_server/samples.md | 181 -------- .../routes/migrate_scripts/index.js | 150 ------- .../routes/migrate_scripts/index.spec.js | 14 - .../routes/migrate_scripts/samples.md | 247 ---------- .../migrations/routes/migrate_server/index.js | 190 -------- .../routes/migrate_server/index.spec.js | 10 - .../routes/migrate_server/samples.md | 212 --------- packages/migrate/migrations/routes/tasks.js | 5 - packages/migrate/migrations/routes/utils.js | 374 ---------------- .../migrations/self-closing-tags/index.js | 57 --- .../migrations/self-closing-tags/migrate.js | 192 -------- .../self-closing-tags/migrate.spec.js | 32 -- packages/migrate/migrations/svelte-4/index.js | 112 ----- .../migrate/migrations/svelte-4/migrate.js | 348 --------------- .../migrations/svelte-4/migrate.spec.js | 382 ---------------- packages/migrate/migrations/svelte-5/index.js | 216 --------- .../migrate/migrations/svelte-5/migrate.js | 129 ------ .../migrations/svelte-5/migrate.spec.js | 135 ------ .../migrate/migrations/sveltekit-2/index.js | 167 ------- .../migrate/migrations/sveltekit-2/migrate.js | 318 ------------- .../migrations/sveltekit-2/migrate.spec.js | 32 -- .../sveltekit-2/svelte-config-samples.md | 126 ------ .../sveltekit-2/tsconfig-samples.md | 40 -- .../migrations/sveltekit-2/tsjs-samples.md | 170 ------- packages/migrate/package.json | 54 --- packages/migrate/tsconfig.json | 12 - packages/migrate/utils.js | 421 ------------------ packages/migrate/utils.spec.js | 93 ---- pnpm-lock.yaml | 110 ----- 46 files changed, 2 insertions(+), 6472 deletions(-) delete mode 100644 packages/migrate/CHANGELOG.md delete mode 100644 packages/migrate/README.md delete mode 100755 packages/migrate/bin.js delete mode 100644 packages/migrate/migrations/package/index.js delete mode 100644 packages/migrate/migrations/package/migrate_config.js delete mode 100644 packages/migrate/migrations/package/migrate_config.spec.js delete mode 100644 packages/migrate/migrations/package/migrate_pkg.js delete mode 100644 packages/migrate/migrations/package/migrate_pkg.spec.js delete mode 100644 packages/migrate/migrations/routes/index.js delete mode 100644 packages/migrate/migrations/routes/migrate_page_js/index.js delete mode 100644 packages/migrate/migrations/routes/migrate_page_js/index.spec.js delete mode 100644 packages/migrate/migrations/routes/migrate_page_js/samples.md delete mode 100644 packages/migrate/migrations/routes/migrate_page_server/index.js delete mode 100644 packages/migrate/migrations/routes/migrate_page_server/index.spec.js delete mode 100644 packages/migrate/migrations/routes/migrate_page_server/samples.md delete mode 100644 packages/migrate/migrations/routes/migrate_scripts/index.js delete mode 100644 packages/migrate/migrations/routes/migrate_scripts/index.spec.js delete mode 100644 packages/migrate/migrations/routes/migrate_scripts/samples.md delete mode 100644 packages/migrate/migrations/routes/migrate_server/index.js delete mode 100644 packages/migrate/migrations/routes/migrate_server/index.spec.js delete mode 100644 packages/migrate/migrations/routes/migrate_server/samples.md delete mode 100644 packages/migrate/migrations/routes/tasks.js delete mode 100644 packages/migrate/migrations/routes/utils.js delete mode 100644 packages/migrate/migrations/self-closing-tags/index.js delete mode 100644 packages/migrate/migrations/self-closing-tags/migrate.js delete mode 100644 packages/migrate/migrations/self-closing-tags/migrate.spec.js delete mode 100644 packages/migrate/migrations/svelte-4/index.js delete mode 100644 packages/migrate/migrations/svelte-4/migrate.js delete mode 100644 packages/migrate/migrations/svelte-4/migrate.spec.js delete mode 100644 packages/migrate/migrations/svelte-5/index.js delete mode 100644 packages/migrate/migrations/svelte-5/migrate.js delete mode 100644 packages/migrate/migrations/svelte-5/migrate.spec.js delete mode 100644 packages/migrate/migrations/sveltekit-2/index.js delete mode 100644 packages/migrate/migrations/sveltekit-2/migrate.js delete mode 100644 packages/migrate/migrations/sveltekit-2/migrate.spec.js delete mode 100644 packages/migrate/migrations/sveltekit-2/svelte-config-samples.md delete mode 100644 packages/migrate/migrations/sveltekit-2/tsconfig-samples.md delete mode 100644 packages/migrate/migrations/sveltekit-2/tsjs-samples.md delete mode 100644 packages/migrate/package.json delete mode 100644 packages/migrate/tsconfig.json delete mode 100644 packages/migrate/utils.js delete mode 100644 packages/migrate/utils.spec.js diff --git a/.changeset/config.json b/.changeset/config.json index 246e927640ff..fc418611aeac 100644 --- a/.changeset/config.json +++ b/.changeset/config.json @@ -6,5 +6,5 @@ "access": "public", "baseBranch": "main", "bumpVersionsWithWorkspaceProtocolOnly": true, - "ignore": ["!(@sveltejs/*|create-svelte|svelte-migrate)"] + "ignore": ["!(@sveltejs/*|create-svelte)"] } diff --git a/.prettierrc b/.prettierrc index 2d14308ebeb3..6f5a1610c17f 100644 --- a/.prettierrc +++ b/.prettierrc @@ -27,8 +27,7 @@ "packages/package/test/fixtures/**/expected/**/*", "packages/package/test/watch/expected/**/*", "packages/package/test/watch/package/**/*", - "packages/kit/src/core/postbuild/fixtures/**/*", - "packages/migrate/migrations/routes/*/samples.md" + "packages/kit/src/core/postbuild/fixtures/**/*" ], "options": { "requirePragma": true diff --git a/README.md b/README.md index bdc90a935771..ada896b1fa99 100644 --- a/README.md +++ b/README.md @@ -20,7 +20,6 @@ Web development, streamlined. Read the [documentation](https://svelte.dev/docs/k | [@sveltejs/enhanced-img](packages/enhanced-img) | [Changelog](packages/enhanced-img/CHANGELOG.md) | | [@sveltejs/package](packages/package) | [Changelog](packages/package/CHANGELOG.md) | | [create-svelte](packages/create-svelte) | [Changelog](packages/create-svelte/CHANGELOG.md) | -| [svelte-migrate](packages/migrate) | [Changelog](packages/migrate/CHANGELOG.md) | [Additional adapters](https://sveltesociety.dev/packages?category=sveltekit-adapters) are maintained by the community. diff --git a/packages/migrate/CHANGELOG.md b/packages/migrate/CHANGELOG.md deleted file mode 100644 index 96020c5b63b7..000000000000 --- a/packages/migrate/CHANGELOG.md +++ /dev/null @@ -1,345 +0,0 @@ -# svelte-migrate - -## 1.6.8 -### Patch Changes - - -- fix: prevent duplicate imports ([#12931](https://github.com/sveltejs/kit/pull/12931)) - -## 1.6.7 -### Patch Changes - - -- fix: prefer TS in unclear migration situations if `tsconfig.json` found ([#12881](https://github.com/sveltejs/kit/pull/12881)) - -## 1.6.6 -### Patch Changes - - -- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) - -## 1.6.5 -### Patch Changes - - -- docs: demonstrate sv migrate over prior commands ([#12840](https://github.com/sveltejs/kit/pull/12840)) - - -- fix: bump enhanced-img version to avoid peer dep warning ([#12852](https://github.com/sveltejs/kit/pull/12852)) - -## 1.6.4 -### Patch Changes - - -- fix: migrate `svelte` and `vite-plugin-svelte` to latest ([#12838](https://github.com/sveltejs/kit/pull/12838)) - -## 1.6.3 -### Patch Changes - - -- chore: add `svelte-eslint-parser` to list of migratable dependencies ([#12828](https://github.com/sveltejs/kit/pull/12828)) - -## 1.6.2 -### Patch Changes - - -- chore: upgrade to ts-morph 24 ([#12781](https://github.com/sveltejs/kit/pull/12781)) - -## 1.6.1 -### Patch Changes - - -- chore: upgrade to ts-morph 23 ([#12607](https://github.com/sveltejs/kit/pull/12607)) - -## 1.6.0 -### Minor Changes - - -- feat: pass filename to `migrate` to allow for `svelte:self` migration ([#12749](https://github.com/sveltejs/kit/pull/12749)) - - -### Patch Changes - - -- fix: prompt SvelteKit 2 migration during Svelte 5 migration if necessary ([#12748](https://github.com/sveltejs/kit/pull/12748)) - -## 1.5.1 -### Patch Changes - - -- fix: use `next` versions for `svelte` and `vite-plugin-svelte` ([#12729](https://github.com/sveltejs/kit/pull/12729)) - -## 1.5.0 -### Minor Changes - - -- feat: add Svelte 5 migration ([#12519](https://github.com/sveltejs/kit/pull/12519)) - -## 1.4.5 -### Patch Changes - - -- chore: configure provenance in a simpler manner ([#12570](https://github.com/sveltejs/kit/pull/12570)) - -## 1.4.4 -### Patch Changes - - -- chore: package provenance ([#12567](https://github.com/sveltejs/kit/pull/12567)) - -## 1.4.3 - -### Patch Changes - -- chore: add keywords for discovery in npm search ([#12330](https://github.com/sveltejs/kit/pull/12330)) - -## 1.4.2 - -### Patch Changes - -- fix: bump import-meta-resolve to remove deprecation warnings ([#12240](https://github.com/sveltejs/kit/pull/12240)) - -## 1.4.1 - -### Patch Changes - -- fix: continue traversing the children of non-self-closing elements ([#12175](https://github.com/sveltejs/kit/pull/12175)) - -## 1.4.0 - -### Minor Changes - -- feat: add self-closing-tags migration ([#12128](https://github.com/sveltejs/kit/pull/12128)) - -## 1.3.8 - -### Patch Changes - -- chore(deps): update dependency ts-morph to v22 ([`4447269e979f2b5be18e0fded0b5843a6258542d`](https://github.com/sveltejs/kit/commit/4447269e979f2b5be18e0fded0b5843a6258542d)) - -## 1.3.7 - -### Patch Changes - -- fix: don't downgrade versions when bumping dependencies ([#11716](https://github.com/sveltejs/kit/pull/11716)) - -## 1.3.6 - -### Patch Changes - -- fix: correct link to docs ([#11407](https://github.com/sveltejs/kit/pull/11407)) - -## 1.3.5 - -### Patch Changes - -- chore: update primary branch from master to main ([`47779436c5f6c4d50011d0ef8b2709a07c0fec5d`](https://github.com/sveltejs/kit/commit/47779436c5f6c4d50011d0ef8b2709a07c0fec5d)) - -## 1.3.4 - -### Patch Changes - -- suggest running migrate command with latest if migration does not exist ([#11362](https://github.com/sveltejs/kit/pull/11362)) - -## 1.3.3 - -### Patch Changes - -- chore: insert package at sorted position ([#11332](https://github.com/sveltejs/kit/pull/11332)) - -- fix: adjust cookie migration logic, note installation ([#11331](https://github.com/sveltejs/kit/pull/11331)) - -## 1.3.2 - -### Patch Changes - -- fix: handle jsconfig.json ([#11325](https://github.com/sveltejs/kit/pull/11325)) - -## 1.3.1 - -### Patch Changes - -- chore: fix broken migration links ([#11320](https://github.com/sveltejs/kit/pull/11320)) - -## 1.3.0 - -### Minor Changes - -- feat: add sveltekit v2 migration ([#11294](https://github.com/sveltejs/kit/pull/11294)) - -## 1.2.8 - -### Patch Changes - -- chore(deps): update dependency ts-morph to v21 ([#11181](https://github.com/sveltejs/kit/pull/11181)) - -## 1.2.7 - -### Patch Changes - -- chore(deps): update dependency ts-morph to v20 ([#10766](https://github.com/sveltejs/kit/pull/10766)) - -## 1.2.6 - -### Patch Changes - -- fix: do not downgrade versions ([#10352](https://github.com/sveltejs/kit/pull/10352)) - -## 1.2.5 - -### Patch Changes - -- fix: note old eslint plugin deprecation ([#10319](https://github.com/sveltejs/kit/pull/10319)) - -## 1.2.4 - -### Patch Changes - -- fix: ensure glob finds all files in folders ([#10230](https://github.com/sveltejs/kit/pull/10230)) - -## 1.2.3 - -### Patch Changes - -- fix: handle missing fields in migrate script ([#10221](https://github.com/sveltejs/kit/pull/10221)) - -## 1.2.2 - -### Patch Changes - -- fix: finalize svelte-4 migration ([#10195](https://github.com/sveltejs/kit/pull/10195)) - -- fix: changed `index` to `index.d.ts` in `typesVersions` ([#10180](https://github.com/sveltejs/kit/pull/10180)) - -## 1.2.1 - -### Patch Changes - -- docs: update readme ([#10066](https://github.com/sveltejs/kit/pull/10066)) - -## 1.2.0 - -### Minor Changes - -- feat: add Svelte 4 migration ([#9729](https://github.com/sveltejs/kit/pull/9729)) - -## 1.1.3 - -### Patch Changes - -- fix: include index in typesVersions because it's always matched ([#9147](https://github.com/sveltejs/kit/pull/9147)) - -## 1.1.2 - -### Patch Changes - -- fix: update existing exports with prepended outdir ([#9133](https://github.com/sveltejs/kit/pull/9133)) - -- fix: use typesVersions to wire up deep imports ([#9133](https://github.com/sveltejs/kit/pull/9133)) - -## 1.1.1 - -### Patch Changes - -- fix: include utils in migrate's published files ([#9085](https://github.com/sveltejs/kit/pull/9085)) - -## 1.1.0 - -### Minor Changes - -- feat: add `@sveltejs/package` migration (v1->v2) ([#8922](https://github.com/sveltejs/kit/pull/8922)) - -## 1.0.1 - -### Patch Changes - -- fix: correctly check for old load props ([#8537](https://github.com/sveltejs/kit/pull/8537)) - -## 1.0.0 - -### Major Changes - -First major release, see below for the history of changes that lead up to this. -Starting from now all releases follow semver and changes will be listed as Major/Minor/Patch - -## 1.0.0-next.13 - -### Patch Changes - -- fix: more robust uppercase migration ([#7033](https://github.com/sveltejs/kit/pull/7033)) - -## 1.0.0-next.12 - -### Patch Changes - -- feat: do uppercase http verbs migration on the fly ([#6371](https://github.com/sveltejs/kit/pull/6371)) - -## 1.0.0-next.11 - -### Patch Changes - -- fix: git mv files correctly when they contain \$ characters ([#6129](https://github.com/sveltejs/kit/pull/6129)) - -## 1.0.0-next.10 - -### Patch Changes - -- Revert change to suggest props destructuring ([#6099](https://github.com/sveltejs/kit/pull/6099)) - -## 1.0.0-next.9 - -### Patch Changes - -- Handle Error without message, handle status 200, handle missing body ([#6096](https://github.com/sveltejs/kit/pull/6096)) - -## 1.0.0-next.8 - -### Patch Changes - -- Suggest props destructuring if possible ([#6069](https://github.com/sveltejs/kit/pull/6069)) -- Fix typo in migration task ([#6070](https://github.com/sveltejs/kit/pull/6070)) - -## 1.0.0-next.7 - -### Patch Changes - -- Migrate type comments on arrow functions ([#5933](https://github.com/sveltejs/kit/pull/5933)) -- Use LayoutLoad inside +layout.js files ([#5931](https://github.com/sveltejs/kit/pull/5931)) - -## 1.0.0-next.6 - -### Patch Changes - -- Create `.ts` files from `<script context="module" lang="ts">` ([#5905](https://github.com/sveltejs/kit/pull/5905)) - -## 1.0.0-next.5 - -### Patch Changes - -- Rewrite type names ([#5778](https://github.com/sveltejs/kit/pull/5778)) - -## 1.0.0-next.4 - -### Patch Changes - -- handle lone return statements ([#5831](https://github.com/sveltejs/kit/pull/5831)) -- Fix error placement on (arrow) function when checking load input ([#5840](https://github.com/sveltejs/kit/pull/5840)) - -## 1.0.0-next.3 - -### Patch Changes - -- handle more import cases ([#5828](https://github.com/sveltejs/kit/pull/5828)) -- check load function input ([#5838](https://github.com/sveltejs/kit/pull/5838)) - -## 1.0.0-next.2 - -### Patch Changes - -- Correctly rename files with spaces when migrating ([#5820](https://github.com/sveltejs/kit/pull/5820)) - -## 1.0.0-next.1 - -### Patch Changes - -- Add a README ([#5817](https://github.com/sveltejs/kit/pull/5817)) diff --git a/packages/migrate/README.md b/packages/migrate/README.md deleted file mode 100644 index 1dceb6d6f89e..000000000000 --- a/packages/migrate/README.md +++ /dev/null @@ -1,31 +0,0 @@ -# svelte-migrate - -A CLI for migrating Svelte(Kit) codebases. - -Run it directly using: - -``` -npx svelte-migrate [migration] -``` - -Or via the unified Svlete CLI with: - -``` -npx sv migrate [migration] -``` - -## Migrations - -| Migration | From | To | Guide | -| ------------- | --------------------- | --------------------- | --------------------------------------------------------------- | -| `sveltekit-2` | SvelteKit 1.0 | SvelteKit 2.0 | [Website](https://svelte.dev/docs/kit/migrating-to-sveltekit-2) | -| `svelte-4` | Svelte 3 | Svelte 4 | [Website](https://svelte.dev/docs/svelte/v4-migration-guide) | -| `svelte-5` | Svelte 4 | Svelte 5 | | -| `package` | `@sveltejs/package@1` | `@sveltejs/package@2` | [#8922](https://github.com/sveltejs/kit/pull/8922) | -| `routes` | SvelteKit pre-1.0 | SvelteKit 1.0 | [#5774](https://github.com/sveltejs/kit/discussions/5774) | - -Some migrations may annotate your codebase with tasks for completion that you can find by searching for `@migration`. - -## Changelog - -[The Changelog for this package is available on GitHub](https://github.com/sveltejs/kit/blob/main/packages/migrate/CHANGELOG.md). diff --git a/packages/migrate/bin.js b/packages/migrate/bin.js deleted file mode 100755 index df8d7de7479d..000000000000 --- a/packages/migrate/bin.js +++ /dev/null @@ -1,27 +0,0 @@ -#!/usr/bin/env node -import fs from 'node:fs'; -import process from 'node:process'; -import { fileURLToPath } from 'node:url'; -import colors from 'kleur'; - -const migration = process.argv[2]; -const dir = fileURLToPath(new URL('.', import.meta.url)); - -const migrations = fs - .readdirSync(`${dir}/migrations`) - .filter((migration) => fs.existsSync(`${dir}/migrations/${migration}/index.js`)); - -if (migrations.includes(migration)) { - const { migrate } = await import(`./migrations/${migration}/index.js`); - migrate(); -} else { - console.error( - colors - .bold() - .red( - `You must specify one of the following migrations: ${migrations.join(', ')}\n` + - 'If you expected this to work, try re-running the command with the latest svelte-migrate version:\n' + - ` npx svelte-migrate@latest ${migration}` - ) - ); -} diff --git a/packages/migrate/migrations/package/index.js b/packages/migrate/migrations/package/index.js deleted file mode 100644 index 0e36547686f8..000000000000 --- a/packages/migrate/migrations/package/index.js +++ /dev/null @@ -1,81 +0,0 @@ -import fs from 'node:fs'; -import colors from 'kleur'; -import path from 'node:path'; -import process from 'node:process'; -import prompts from 'prompts'; -import { pathToFileURL } from 'node:url'; -import { bail, check_git } from '../../utils.js'; -import { migrate_config } from './migrate_config.js'; -import { migrate_pkg } from './migrate_pkg.js'; - -export async function migrate() { - if (!fs.existsSync('svelte.config.js')) { - bail('Please re-run this script in a directory with a svelte.config.js'); - } - if (!fs.existsSync('package.json')) { - bail('Please re-run this script in a directory with a package.json'); - } - - console.log( - colors - .bold() - .yellow( - '\nThis will update your svelte.config.js and package.json in the current directory\n' - ) - ); - - const use_git = check_git(); - - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Continue?', - initial: false - }); - - if (!response.value) { - process.exit(1); - } - - const { default: config } = await import(pathToFileURL(path.resolve('svelte.config.js')).href); - const has_package_config = !!config.package; - - config.package = { - source: path.resolve(config.kit?.files?.lib ?? config.package?.source ?? 'src/lib'), - dir: config.package?.dir ?? 'package', - exports: - config.package?.exports ?? - ((/** @type {string} */ filepath) => !/^_|\/_|\.d\.ts$/.test(filepath)), - files: config.package?.files ?? (() => true), - emitTypes: config.package?.emitTypes ?? true - }; - config.extensions = config.extensions ?? ['.svelte']; - - migrate_pkg(config); - - if (has_package_config) { - migrate_config(); - } - - console.log(colors.bold().green('✔ Your project has been migrated')); - - console.log('\nRecommended next steps:\n'); - - const cyan = colors.bold().cyan; - - const tasks = [ - use_git && cyan('git commit -m "migration to @sveltejs/package v2"'), - 'Review the migration guide at https://github.com/sveltejs/kit/pull/8922', - 'Read the updated docs at https://svelte.dev/docs/kit/packaging' - ].filter(Boolean); - - tasks.forEach((task, i) => { - console.log(` ${i + 1}: ${task}`); - }); - - console.log(''); - - if (use_git) { - console.log(`Run ${cyan('git diff')} to review changes.\n`); - } -} diff --git a/packages/migrate/migrations/package/migrate_config.js b/packages/migrate/migrations/package/migrate_config.js deleted file mode 100644 index b401626d4393..000000000000 --- a/packages/migrate/migrations/package/migrate_config.js +++ /dev/null @@ -1,81 +0,0 @@ -import fs from 'node:fs'; -import colors from 'kleur'; -import MagicString from 'magic-string'; -import ts from 'typescript'; - -export function migrate_config() { - try { - const content = fs.readFileSync('svelte.config.js', 'utf8'); - fs.writeFileSync('svelte.config.js', remove_package_from_config(content)); - } catch { - console.log( - colors - .bold() - .yellow('Could not remove package config from svelte.config.js, please remove it manually') - ); - } -} - -/** - * @param {string} content - */ -export function remove_package_from_config(content) { - const ast = ts.createSourceFile( - 'filename.ts', - content, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS - ); - - const code = new MagicString(content); - - for (const statement of ast.statements) { - if (ts.isExportAssignment(statement)) { - if (ts.isObjectLiteralExpression(statement.expression)) { - remove(statement.expression); - } else if (ts.isIdentifier(statement.expression)) { - for (const statement2 of ast.statements) { - if (ts.isVariableStatement(statement2)) { - for (const declaration of statement2.declarationList.declarations) { - if ( - ts.isIdentifier(declaration.name) && - declaration.name.text === statement.expression.text && - declaration.initializer && - ts.isObjectLiteralExpression(declaration.initializer) - ) { - remove(declaration.initializer); - } - } - } - } - } - } - } - - return code.toString(); - - /** @param {ts.ObjectLiteralExpression} expression */ - function remove(expression) { - for (let i = 0; i < expression.properties.length; i++) { - const property = expression.properties[i]; - if ( - ts.isPropertyAssignment(property) && - ts.isIdentifier(property.name) && - property.name.text === 'package' && - ts.isObjectLiteralExpression(property.initializer) - ) { - if (expression.properties.length === 1) { - code.overwrite(expression.getStart(), expression.getEnd(), '{}'); - } else { - const next_property = expression.properties[i + 1]; - if (next_property) { - code.remove(property.getStart(), next_property.getStart()); - } else { - code.remove(property.getStart(), content.lastIndexOf('}', expression.getEnd())); - } - } - } - } - } -} diff --git a/packages/migrate/migrations/package/migrate_config.spec.js b/packages/migrate/migrations/package/migrate_config.spec.js deleted file mode 100644 index e0e9480b8c11..000000000000 --- a/packages/migrate/migrations/package/migrate_config.spec.js +++ /dev/null @@ -1,78 +0,0 @@ -import { assert, test } from 'vitest'; -import { remove_package_from_config } from './migrate_config.js'; - -test('Removes package config #1', () => { - const result = remove_package_from_config(` - export default { - kit: { - files: { - lib: 'src/lib' - } - }, - package: { - dir: 'package', - exports: (filepath) => !/^_|\\/_|\\.d\\.ts$/.test(filepath), - files: () => true - }, - preprocess: [] - }`); - assert.equal( - result, - ` - export default { - kit: { - files: { - lib: 'src/lib' - } - }, - preprocess: [] - }` - ); -}); - -test('Removes package config #2', () => { - const result = remove_package_from_config(` - export default { - package: { - dir: 'package', - exports: (filepath) => !/^_|\\/_|\\.d\\.ts$/.test(filepath), - files: () => true - }, - }`); - assert.equal( - result, - ` - export default {}` - ); -}); - -test('Removes package config #3', () => { - const result = remove_package_from_config(` - const config = { - package: { - dir: 'package', - exports: (filepath) => !/^_|\\/_|\\.d\\.ts$/.test(filepath), - files: () => true - }, - }; - export default config;`); - assert.equal( - result, - ` - const config = {}; - export default config;` - ); -}); - -test('Leaves config untouched', () => { - const content = ` - export default { - kit: { - files: { - lib: 'src/lib' - } - }, - }`; - const result = remove_package_from_config(content); - assert.equal(result, content); -}); diff --git a/packages/migrate/migrations/package/migrate_pkg.js b/packages/migrate/migrations/package/migrate_pkg.js deleted file mode 100644 index 3e5f5b6ab273..000000000000 --- a/packages/migrate/migrations/package/migrate_pkg.js +++ /dev/null @@ -1,211 +0,0 @@ -import fs from 'node:fs'; -import path from 'node:path'; -import colors from 'kleur'; -import { guess_indent, posixify, walk } from '../../utils.js'; - -/** - * @param {any} config - */ -export function migrate_pkg(config) { - const files = scan(config); - const pkg_str = fs.readFileSync('package.json', 'utf8'); - const pkg = update_pkg_json(config, JSON.parse(pkg_str), files); - fs.writeFileSync('package.json', JSON.stringify(pkg, null, guess_indent(pkg_str) ?? '\t')); -} - -/** - * @param {any} config - */ -function scan(config) { - return walk(config.package.source).map((file) => analyze(config, file)); -} - -/** - * @param {any} config - * @param {string} file - */ -function analyze(config, file) { - const name = posixify(file); - - const svelte_extension = config.extensions.find((/** @type {string} */ ext) => - name.endsWith(ext) - ); - - const dest = svelte_extension - ? name.slice(0, -svelte_extension.length) + '.svelte' - : name.endsWith('.d.ts') - ? name - : name.endsWith('.ts') - ? name.slice(0, -3) + '.js' - : name; - - return { - name, - dest, - is_included: config.package.files(name), - is_exported: config.package.exports(name), - is_svelte: !!svelte_extension - }; -} - -/** - * @param {any} config - * @param {any} pkg - * @param {ReturnType<typeof analyze>[]} files - */ -export function update_pkg_json(config, pkg, files) { - const out_dir = path.relative('.', config.package.dir); - - // See: https://pnpm.io/package_json#publishconfigdirectory - if (pkg.publishConfig?.directory || pkg.linkDirectory?.directory) { - console.log( - colors.yellow( - 'Detected "publishConfig.directory" or "linkDirectory.directory" fields in your package.json. ' + - 'This migration removes them, which may or may not be what you want. Please review closely.' - ) - ); - delete pkg.publishConfig?.directory; - delete pkg.linkDirectory?.directory; - } - - for (const key in pkg.scripts || []) { - const script = pkg.scripts[key]; - if (script.includes('svelte-package')) { - pkg.scripts[key] = script.replace('svelte-package', `svelte-package -o ${out_dir}`); - } - } - - pkg.type = 'module'; - pkg.exports = { - './package.json': './package.json', - ...pkg.exports - }; - - pkg.files = pkg.files || []; - if (!pkg.files.includes(out_dir)) { - pkg.files.push(out_dir); - } - - if (pkg.devDependencies?.['@sveltejs/package']) { - pkg.devDependencies['@sveltejs/package'] = '^2.0.0'; - } - - /** @type {Record<string, string>} */ - const clashes = {}; - /** @type {Record<string, [string]>} */ - const types_versions = {}; - - for (const file of files) { - if (file.is_included && file.is_exported) { - const original = `$lib/${file.name}`; - const key = `./${file.dest}`.replace(/\/index\.js$|(\/[^/]+)\.js$/, '$1'); - - if (clashes[key]) { - console.log( - colors.yellow( - `Duplicate "${key}" export. Closely review your "exports" field in package.json after the migration.` - ) - ); - } - - const has_type = config.package.emitTypes && (file.is_svelte || file.dest.endsWith('.js')); - const out_dir_type_path = `./${out_dir}/${ - file.is_svelte ? `${file.dest}.d.ts` : file.dest.slice(0, -'.js'.length) + '.d.ts' - }`; - - if (has_type) { - const type_key = key.slice(2) || 'index.d.ts'; - if (!pkg.exports[key]) { - types_versions[type_key] = [out_dir_type_path]; - } else { - const path_without_ext = pkg.exports[key].slice( - 0, - -path.extname(pkg.exports[key]).length - ); - types_versions[type_key] = [ - `./${out_dir}/${(pkg.exports[key].types ?? path_without_ext + '.d.ts').slice(2)}` - ]; - } - } - - if (!pkg.exports[key]) { - const needs_svelte_condition = file.is_svelte || path.basename(file.dest) === 'index.js'; - // JSON.stringify will remove the undefined entries - pkg.exports[key] = { - types: has_type ? out_dir_type_path : undefined, - svelte: needs_svelte_condition ? `./${out_dir}/${file.dest}` : undefined, - default: `./${out_dir}/${file.dest}` - }; - - if (Object.values(pkg.exports[key]).filter(Boolean).length === 1) { - pkg.exports[key] = pkg.exports[key].default; - } - } else { - // Rewrite existing export to point to the new output directory - if (typeof pkg.exports[key] === 'string') { - pkg.exports[key] = prepend_out_dir(pkg.exports[key], out_dir); - } else { - for (const condition in pkg.exports[key]) { - if (typeof pkg.exports[key][condition] === 'string') { - pkg.exports[key][condition] = prepend_out_dir(pkg.exports[key][condition], out_dir); - } - } - } - } - - clashes[key] = original; - } - } - - if (!pkg.svelte && files.some((file) => file.is_svelte)) { - // Several heuristics in Kit/vite-plugin-svelte to tell Vite to mark Svelte packages - // rely on the "svelte" property. Vite/Rollup/Webpack plugin can all deal with it. - // See https://github.com/sveltejs/kit/issues/1959 for more info and related threads. - if (pkg.exports['.']) { - const svelte_export = - typeof pkg.exports['.'] === 'string' - ? pkg.exports['.'] - : pkg.exports['.'].svelte || pkg.exports['.'].import || pkg.exports['.'].default; - if (svelte_export) { - pkg.svelte = svelte_export; - } else { - console.log( - colors.yellow( - 'Cannot generate a "svelte" entry point because the "." entry in "exports" is not a string. Please specify a "svelte" entry point yourself\n' - ) - ); - } - } else { - console.log( - colors.yellow( - 'Cannot generate a "svelte" entry point because the "." entry in "exports" is missing. Please specify a "svelte" entry point yourself\n' - ) - ); - } - } else if (pkg.svelte) { - // Rewrite existing "svelte" field to point to the new output directory - pkg.svelte = prepend_out_dir(pkg.svelte, out_dir); - } - - // https://www.typescriptlang.org/docs/handbook/declaration-files/publishing.html#version-selection-with-typesversions - // A hack to get around the limitation that TS doesn't support "exports" field with moduleResolution: 'node' - if ( - Object.keys(types_versions).length > 1 || - (Object.keys(types_versions).length > 0 && !types_versions['index.d.ts']) - ) { - pkg.typesVersions = { '>4.0': types_versions }; - } - - return pkg; -} - -/** - * Rewrite existing path to point to the new output directory - * @param {string} path - * @param {string} out_dir - */ -function prepend_out_dir(path, out_dir) { - if (!path.startsWith(`./${out_dir}`) && path.startsWith('./')) { - return `./${out_dir}/${path.slice(2)}`; - } -} diff --git a/packages/migrate/migrations/package/migrate_pkg.spec.js b/packages/migrate/migrations/package/migrate_pkg.spec.js deleted file mode 100644 index 0ef10decc463..000000000000 --- a/packages/migrate/migrations/package/migrate_pkg.spec.js +++ /dev/null @@ -1,157 +0,0 @@ -import { expect, test } from 'vitest'; -import { update_pkg_json } from './migrate_pkg.js'; - -test('Updates package.json', () => { - const result = update_pkg_json( - { package: { dir: 'package', emitTypes: true } }, - { - name: 'foo', - version: '1.0.0', - scripts: { - packages: 'svelte-package' - }, - exports: { - './ignored': './something.js' - }, - svelte: './index.js' - }, - [ - { - name: 'foo/Bar.svelte', - dest: 'foo/Bar.svelte', - is_exported: true, - is_included: true, - is_svelte: true - }, - { - name: 'foo/Bar2.svelte', - dest: 'foo/Bar2.svelte', - is_exported: false, - is_included: false, - is_svelte: true - }, - { - name: 'baz.js', - dest: 'baz.js', - is_exported: true, - is_included: true, - is_svelte: false - }, - { - name: 'bar/index.js', - dest: 'bar/index.js', - is_exported: true, - is_included: true, - is_svelte: false - }, - { - name: 'index.js', - dest: 'index.js', - is_exported: true, - is_included: true, - is_svelte: false - }, - { - name: 'ignored.js', - dest: 'ignored.js', - is_exported: true, - is_included: true, - is_svelte: false - } - ] - ); - expect(JSON.parse(JSON.stringify(result))).toEqual({ - name: 'foo', - version: '1.0.0', - type: 'module', - files: ['package'], - scripts: { - packages: 'svelte-package -o package' - }, - exports: { - './package.json': './package.json', - '.': { - types: './package/index.d.ts', - svelte: './package/index.js', - default: './package/index.js' - }, - './foo/Bar.svelte': { - types: './package/foo/Bar.svelte.d.ts', - svelte: './package/foo/Bar.svelte', - default: './package/foo/Bar.svelte' - }, - './baz': { - types: './package/baz.d.ts', - default: './package/baz.js' - }, - './bar': { - types: './package/bar/index.d.ts', - svelte: './package/bar/index.js', - default: './package/bar/index.js' - }, - './ignored': './package/something.js' - }, - svelte: './package/index.js', - typesVersions: { - '>4.0': { - 'index.d.ts': ['./package/index.d.ts'], - 'foo/Bar.svelte': ['./package/foo/Bar.svelte.d.ts'], - baz: ['./package/baz.d.ts'], - bar: ['./package/bar/index.d.ts'], - ignored: ['./package/something.d.ts'] - } - } - }); -}); - -test('Updates package.json #2', () => { - const result = update_pkg_json( - { package: { dir: 'dist', emitTypes: false } }, - { - name: 'foo', - version: '1.0.0' - }, - [ - { - name: 'foo/Bar.svelte', - dest: 'foo/Bar.svelte', - is_exported: true, - is_included: true, - is_svelte: true - }, - { - name: 'baz.js', - dest: 'baz.js', - is_exported: true, - is_included: true, - is_svelte: false - }, - { - name: 'index.js', - dest: 'index.js', - is_exported: true, - is_included: true, - is_svelte: false - } - ] - ); - expect(JSON.parse(JSON.stringify(result))).toEqual({ - name: 'foo', - version: '1.0.0', - type: 'module', - files: ['dist'], - exports: { - './package.json': './package.json', - '.': { - svelte: './dist/index.js', - default: './dist/index.js' - }, - './foo/Bar.svelte': { - svelte: './dist/foo/Bar.svelte', - default: './dist/foo/Bar.svelte' - }, - './baz': './dist/baz.js' - }, - svelte: './dist/index.js' - }); -}); diff --git a/packages/migrate/migrations/routes/index.js b/packages/migrate/migrations/routes/index.js deleted file mode 100644 index 9f043327de6a..000000000000 --- a/packages/migrate/migrations/routes/index.js +++ /dev/null @@ -1,211 +0,0 @@ -import fs from 'node:fs'; -import colors from 'kleur'; -import path from 'node:path'; -import process from 'node:process'; -import prompts from 'prompts'; -import glob from 'tiny-glob/sync.js'; -import { pathToFileURL } from 'node:url'; -import { migrate_scripts } from './migrate_scripts/index.js'; -import { migrate_page } from './migrate_page_js/index.js'; -import { migrate_page_server } from './migrate_page_server/index.js'; -import { migrate_server } from './migrate_server/index.js'; -import { adjust_imports, task } from './utils.js'; -import { bail, relative, move_file, check_git } from '../../utils.js'; - -export async function migrate() { - if (!fs.existsSync('svelte.config.js')) { - bail('Please re-run this script in a directory with a svelte.config.js'); - } - - const { default: config } = await import(pathToFileURL(path.resolve('svelte.config.js')).href); - - const routes = path.resolve(config.kit?.files?.routes ?? 'src/routes'); - - /** @type {string[]} */ - const extensions = config.extensions ?? ['.svelte']; - - /** @type {string[]} */ - const module_extensions = config.kit?.moduleExtensions ?? ['.js', '.ts']; - - /** @type {((filepath: string) => boolean)} */ - const filter = - config.kit?.routes ?? - ((filepath) => !/(?:(?:^_|\/_)|(?:^\.|\/\.)(?!well-known))/.test(filepath)); - - const files = glob(`${routes}/**`, { filesOnly: true, dot: true }).map((file) => - file.replace(/\\/g, '/') - ); - - // validate before proceeding - for (const file of files) { - const basename = path.basename(file); - if ( - basename.startsWith('+page.') || - basename.startsWith('+layout.') || - basename.startsWith('+server.') || - basename.startsWith('+error.') - ) { - bail(`It looks like this migration has already been run (found ${relative(file)}). Aborting`); - } - - if (basename.startsWith('+')) { - // prettier-ignore - bail( - `Please rename any files in ${relative(routes)} with a leading + character before running this migration (found ${relative(file)}). Aborting` - ); - } - } - - console.log(colors.bold().yellow('\nThis will overwrite files in the current directory!\n')); - - const use_git = check_git(); - - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Continue?', - initial: false - }); - - if (!response.value) { - process.exit(1); - } - - for (const file of files) { - const basename = path.basename(file); - if (!filter(file) && !basename.startsWith('__')) continue; - - // replace `./__types` or `./__types/foo` with `./$types` - const content = fs.readFileSync(file, 'utf8').replace(/\.\/__types(?:\/[^'"]+)?/g, './$types'); - - const svelte_ext = extensions.find((ext) => file.endsWith(ext)); - const module_ext = module_extensions.find((ext) => file.endsWith(ext)); - - if (svelte_ext) { - // file is a component - const bare = basename.slice(0, -svelte_ext.length); - const [name, layout] = bare.split('@'); - const is_error_page = bare === '__error'; - - /** - * Whether file should be moved to a subdirectory — e.g. `src/routes/about.svelte` - * should become `src/routes/about/+page.svelte` - */ - let move_to_directory = false; - - /** - * The new name of the file - */ - let renamed = file.slice(0, -basename.length); - - /** - * If a component has `<script context="module">`, the contents are moved - * into a sibling module with the same name - */ - let sibling; - - if (bare.startsWith('__layout')) { - sibling = renamed + '+layout'; - renamed += '+' + bare.slice(2); // account for __layout-foo etc - } else if (is_error_page) { - renamed += '+error'; - // no sibling, because error files can no longer have load - } else if (name === 'index') { - sibling = renamed + '+page'; - renamed += '+page' + (layout ? '@' + layout : ''); - } else { - sibling = `${renamed}${name}/+page`; - renamed += `${name}/+page${layout ? '@' + layout : ''}`; - - move_to_directory = true; - } - - renamed += svelte_ext; - - const { module, main, ext } = migrate_scripts(content, is_error_page, move_to_directory); - - if (move_to_directory) { - const dir = path.dirname(renamed); - if (!fs.existsSync(dir)) fs.mkdirSync(dir); - } - - move_file(file, renamed, main, use_git); - - // if component has a <script context="module">, move it to a sibling .js file - if (module) { - fs.writeFileSync(sibling + ext, migrate_page(module, bare)); - } - } else if (module_ext) { - // file is a module - const bare = basename.slice(0, -module_ext.length); - const [name] = bare.split('@'); - - /** - * Whether the file is paired with a page component, and should - * therefore become `+page.server.js`, or not in which case - * it should become `+server.js` - */ - const is_page_endpoint = extensions.some((ext) => - files.includes(`${file.slice(0, -module_ext.length)}${ext}`) - ); - - const type = is_page_endpoint ? '+page.server' : '+server'; - - const move_to_directory = name !== 'index'; - const is_standalone_index = !is_page_endpoint && name.startsWith('index.'); - - let renamed = ''; - if (is_standalone_index) { - // handle <folder>/index.json.js -> <folder>.json/+server.js - const dir = path.dirname(file); - renamed = - // prettier-ignore - `${file.slice(0, -(basename.length + dir.length + 1))}${dir + name.slice('index'.length)}/+server${module_ext}`; - } else if (move_to_directory) { - renamed = `${file.slice(0, -basename.length)}${name}/${type}${module_ext}`; - } else { - renamed = `${file.slice(0, -basename.length)}${type}${module_ext}`; - } - - // Standalone index endpoints are edge case enough that we don't spend time on trying to update all the imports correctly - const edited = - (is_standalone_index && /import/.test(content) ? `\n// ${task('Check imports')}\n` : '') + - (!is_standalone_index && move_to_directory ? adjust_imports(content) : content); - if (move_to_directory) { - const dir = path.dirname(renamed); - if (!fs.existsSync(dir)) fs.mkdirSync(dir); - } - - move_file( - file, - renamed, - is_page_endpoint ? migrate_page_server(edited, bare) : migrate_server(edited), - use_git - ); - } - } - - console.log(colors.bold().green('✔ Your project has been migrated')); - - console.log('\nRecommended next steps:\n'); - - const cyan = colors.bold().cyan; - - const tasks = [ - use_git && cyan('git commit -m "svelte-migrate: renamed files"'), - 'Review the migration guide at https://github.com/sveltejs/kit/discussions/5774', - `Search codebase for ${cyan('"@migration"')} and manually complete migration tasks`, - use_git && cyan('git add -A'), - use_git && cyan('git commit -m "svelte-migrate: updated files"') - ].filter(Boolean); - - tasks.forEach((task, i) => { - console.log(` ${i + 1}: ${task}`); - }); - - console.log(''); - - if (use_git) { - console.log(`Run ${cyan('git diff')} to review changes.\n`); - } -} diff --git a/packages/migrate/migrations/routes/migrate_page_js/index.js b/packages/migrate/migrations/routes/migrate_page_js/index.js deleted file mode 100644 index 2fdb5e66d942..000000000000 --- a/packages/migrate/migrations/routes/migrate_page_js/index.js +++ /dev/null @@ -1,195 +0,0 @@ -import ts from 'typescript'; -import { - automigration, - error, - get_function_node, - get_object_nodes, - is_new, - is_string_like, - manual_migration, - manual_return_migration, - parse, - rewrite_returns, - rewrite_type, - unwrap -} from '../utils.js'; -import * as TASKS from '../tasks.js'; -import { dedent } from '../../../utils.js'; - -const give_up = `${error('Update load function', TASKS.PAGE_LOAD)}\n\n`; - -/** - * @param {string} content - * @param {string} filename - */ -export function migrate_page(content, filename) { - // early out if we can tell there's no load function - // without parsing the file - if (!/load/.test(content)) return content; - - const file = parse(content); - if (!file) return give_up + content; - - const name = file.exports.map.get('load'); - - if (!name && !file.exports.complex) { - // there's no load function here, so there's nothing to do - return content; - } - - const match = /__layout(?:-([^.@]+))?/.exec(filename); - const load_name = match?.[1] ? `LayoutLoad.${match[1]}` : match ? 'LayoutLoad' : 'PageLoad'; - - for (const statement of file.ast.statements) { - const fn = name ? get_function_node(statement, name) : undefined; - if (fn?.body) { - check_fn_param(fn, file.code); - - /** @type {Set<string>} */ - const imports = new Set(); - - rewrite_type(fn, file.code, 'Load', load_name); - - rewrite_returns(fn.body, (expr, node) => { - const value = unwrap(expr); - const nodes = ts.isObjectLiteralExpression(value) && get_object_nodes(value); - - if (nodes) { - const keys = Object.keys(nodes).sort().join(' '); - - if (keys === '') { - return; // nothing to do - } - - if ( - keys === 'props' || - ((keys === 'status' || keys === 'props status') && - Number(nodes.status.getText()) === 200) - ) { - automigration(value, file.code, dedent(nodes.props?.getText() || '')); - return; - } - - // check for existence of `node`, otherwise it's an arrow function - // with an implicit body, which we bail out on - if (node) { - const status = nodes.status && Number(nodes.status.getText()); - - // logic based on https://github.com/sveltejs/kit/blob/67e2342149847d267eb0c50809a1f93f41fa529b/packages/kit/src/runtime/load.js - if (keys === 'redirect status' && status > 300 && status < 400) { - automigration( - node, - file.code, - `throw redirect(${status}, ${nodes.redirect.getText()});` - ); - imports.add('redirect'); - return; - } - - if (nodes.error) { - const message = is_string_like(nodes.error) - ? nodes.error.getText() - : is_new(nodes.error, 'Error') - ? /** @type {string | undefined} */ (nodes.error.arguments[0]?.getText()) - : false; - - if (message !== false) { - automigration( - node, - file.code, - `throw error(${status || 500}${message ? `, ${message}` : ''});` - ); - imports.add('error'); - return; - } - } else if (status >= 400) { - automigration(node, file.code, `throw error(${status});`); - imports.add('error'); - return; - } - } - } - - manual_return_migration(node || fn, file.code, TASKS.PAGE_LOAD); - }); - - if (imports.size) { - const has_imports = file.ast.statements.some((statement) => - ts.isImportDeclaration(statement) - ); - const declaration = `import { ${[...imports.keys()].join(', ')} } from '@sveltejs/kit';`; - - return declaration + (has_imports ? '\n' : '\n\n') + file.code.toString(); - } - - return file.code.toString(); - } - - if (ts.isImportDeclaration(statement) && statement.importClause) { - const bindings = statement.importClause.namedBindings; - - if (bindings && !ts.isNamespaceImport(bindings)) { - for (const binding of bindings.elements) { - if (binding.name.escapedText === 'Load') { - file.code.overwrite(binding.getStart(), binding.getEnd(), load_name); - } - } - } - } - } - - // we failed to rewrite the load function, so we inject - // an error at the top of the file - return give_up + content; -} - -/** - * Check the load function parameter, and either adjust - * the property names, or add an error - * @param {ts.FunctionDeclaration | ts.FunctionExpression | ts.ArrowFunction} fn - * @param {import('magic-string').default} str - */ -function check_fn_param(fn, str) { - const param = fn.parameters[0]; - if (!param) { - return; - } - if (ts.isObjectBindingPattern(param.name)) { - for (const binding of param.name.elements) { - if ( - !ts.isIdentifier(binding.name) || - (binding.propertyName && !ts.isIdentifier(binding.propertyName)) - ) { - bail(true); - return; - } - const name = binding.propertyName - ? /** @type {ts.Identifier} */ (binding.propertyName).text - : binding.name.text; - if (['stuff', 'status', 'error'].includes(name)) { - bail(); - return; - } - if (name === 'props') { - if (binding.propertyName) { - bail(); - return; - } else { - str.overwrite(binding.name.getStart(), binding.name.getEnd(), 'data: props'); - } - } - } - } else { - // load(param) { .. } -> bail, we won't check what is used in the function body - bail(true); - } - - function bail(check = false) { - manual_migration( - fn, - str, - (check ? 'Check if you need to migrate' : 'Migrate') + ' the load function input', - TASKS.PAGE_LOAD - ); - } -} diff --git a/packages/migrate/migrations/routes/migrate_page_js/index.spec.js b/packages/migrate/migrations/routes/migrate_page_js/index.spec.js deleted file mode 100644 index 3ea58066d1aa..000000000000 --- a/packages/migrate/migrations/routes/migrate_page_js/index.spec.js +++ /dev/null @@ -1,10 +0,0 @@ -import { assert, test } from 'vitest'; -import { migrate_page } from './index.js'; -import { read_samples } from '../../../utils.js'; - -for (const sample of read_samples(new URL('./samples.md', import.meta.url))) { - test(sample.description, () => { - const actual = migrate_page(sample.before, sample.filename ?? '+page.js'); - assert.equal(actual, sample.after); - }); -} diff --git a/packages/migrate/migrations/routes/migrate_page_js/samples.md b/packages/migrate/migrations/routes/migrate_page_js/samples.md deleted file mode 100644 index c38874cb297f..000000000000 --- a/packages/migrate/migrations/routes/migrate_page_js/samples.md +++ /dev/null @@ -1,380 +0,0 @@ -## A load function that only returns props - -```js before -/** @type {import('./$types').Load} */ -export function load() { - return { - props: { - a: 1 - } - }; -} -``` - -```js after -/** @type {import('./$types').PageLoad} */ -export function load() { - return { - a: 1 - }; -} -``` - -## A TypeScript load function that only returns props - -```ts before -import type { Load } from './$types'; - -export const load: Load = () => { - return { - props: { - a: 1 - } - }; -} -``` - -```ts after -import type { PageLoad } from './$types'; - -export const load: PageLoad = () => { - return { - a: 1 - }; -} -``` - -## A file without a load function - -```js before -export const prerender = true; -``` - -```js after -export const prerender = true; -``` - -## A renamed load function - -```js before -function myload() { - return { - props: { - a: 1 - } - }; -} - -export { myload as load }; -``` - -```js after -function myload() { - return { - a: 1 - }; -} - -export { myload as load }; -``` - -## A load function with a redirect - -```js before -export function load({ session }) { - if (!session.user) { - return { - status: 307, - redirect: '/login' - }; - } - - return { - props: { - a: 1 - }; - } -} -``` - -```js after -import { redirect } from '@sveltejs/kit'; - -export function load({ session }) { - if (!session.user) { - throw redirect(307, '/login'); - } - - return { - a: 1 - } -} -``` - -## String error - -```js before -export function load({ session }) { - if (!session.user?.admin) { - return { - status: 403, - error: 'unauthorized' - }; - } -} -``` - -```js after -import { error } from '@sveltejs/kit'; - -export function load({ session }) { - if (!session.user?.admin) { - throw error(403, 'unauthorized'); - } -} -``` - -## Error constructor - -```js before -export function load({ session }) { - if (!session.user?.admin) { - return { - status: 403, - error: new Error('unauthorized') - }; - } -} -``` - -```js after -import { error } from '@sveltejs/kit'; - -export function load({ session }) { - if (!session.user?.admin) { - throw error(403, 'unauthorized'); - } -} -``` - -## Error constructor with no arguments - -```js before -export function load({ session }) { - if (!session.user?.admin) { - return { - status: 403, - error: new Error() - }; - } -} -``` - -```js after -import { error } from '@sveltejs/kit'; - -export function load({ session }) { - if (!session.user?.admin) { - throw error(403); - } -} -``` - -## Error status with no error - -```js before -export function load() { - return { status: 518 }; -} -``` - -```js after -import { error } from '@sveltejs/kit'; - -export function load() { - throw error(518); -} -``` - -## Unknown error type - -```js before -export function load() { - return { error: blah }; -} -``` - -```js after -export function load() { - throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); - return { error: blah }; -} -``` - -## Arrow function load - -```js before -/** @type {import('./$types').Load} */ -export const load = () => ({ - props: { - a: 1 - } -}); -``` - -```js after -/** @type {import('./$types').PageLoad} */ -export const load = () => ({ - a: 1 -}); -``` - -## Arrow function that can't be migrated - -```js before -export const load = () => ({ - cache: { - maxage: 300 - } -}); -``` - -```js after -throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); -export const load = () => ({ - cache: { - maxage: 300 - } -}); -``` - -## Returns cache - -```js before -export function load() { - return { - cache: { - maxage: 300 - } - }; -} -``` - -```js after -export function load() { - throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); - return { - cache: { - maxage: 300 - } - }; -} -``` - -## Returns non-object-literal - -```js before -export async function load({ fetch }) { - const res = await fetch('/x.json'); - return await res.json(); -} -``` - -```js after -export async function load({ fetch }) { - const res = await fetch('/x.json'); - throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); - return await res.json(); -} -``` - -## Renames props -> data, leaves unchanged alone - -```js before -export async function load({ props, params }) { - return {}; -} -``` - -```js after -export async function load({ data: props, params }) { - return {}; -} -``` - -## Errors on stuff - -```js before -export async function load({ stuff }) { - return {}; -} -``` - -```js after -throw new Error("@migration task: Migrate the load function input (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); -export async function load({ stuff }) { - return {}; -} -``` - -## Bails on non-destructured param - -```js before -export const load = (input) => { - return {}; -} -``` - -```js after -throw new Error("@migration task: Check if you need to migrate the load function input (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292693)"); -export const load = (input) => { - return {}; -} -``` - -## A load function that returns nothing - -```js before -export function load() { - return; -} -``` - -```js after -export function load() { - return; -} -``` - -## A load function that returns props and status 200 - -```js before -export function load() { - return { - status: 200, - props: {} - }; -} -``` - -```js after -export function load() { - return {}; -} -``` - -## A load function that returns status 200 - -```js before -export function load() { - return { - status: 200 - }; -} -``` - -```js after -export function load() { - return ; -} -``` diff --git a/packages/migrate/migrations/routes/migrate_page_server/index.js b/packages/migrate/migrations/routes/migrate_page_server/index.js deleted file mode 100644 index d6556e7ac744..000000000000 --- a/packages/migrate/migrations/routes/migrate_page_server/index.js +++ /dev/null @@ -1,122 +0,0 @@ -import ts from 'typescript'; -import { - automigration, - error, - get_function_node, - get_object_nodes, - manual_migration, - manual_return_migration, - parse, - rewrite_returns, - rewrite_type, - unwrap, - uppercase_migration -} from '../utils.js'; -import * as TASKS from '../tasks.js'; -import { dedent } from '../../../utils.js'; - -const give_up = `${error('Update +page.server.js', TASKS.PAGE_ENDPOINT)}\n\n`; - -/** - * @param {string} content - * @param {string} filename - * @returns {string} - */ -export function migrate_page_server(content, filename) { - const file = parse(content); - if (!file) return give_up + content; - - const methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].filter((name) => - file.exports.map.has(name) - ); - - // If user didn't do the uppercase verbs migration yet, do it here on the fly. - const uppercased = uppercase_migration(methods, file); - if (!uppercased) { - return give_up + content; - } else if (uppercased !== content) { - return migrate_page_server(uppercased, filename); - } - - const non_get_methods = methods.filter((name) => name !== 'GET'); - - const unmigrated = new Set(methods); - - const match = /\+(?:(page)|(layout(?:-([^.@]+))?))/.exec(filename); - const load_name = match?.[3] - ? `LayoutServerLoad.${match[3]}` - : match?.[2] - ? 'LayoutServerLoad' - : 'PageServerLoad'; - - const has_load = file.exports.map.has('GET'); - const has_action = non_get_methods.some((method) => file.exports.map.has(method)); - - for (const statement of file.ast.statements) { - const GET_id = file.exports.map.get('GET'); - if (GET_id) { - const GET = get_function_node(statement, GET_id); - if (GET) { - if (GET.body) { - // possible TODOs — handle errors and redirects - rewrite_returns(GET.body, (expr, node) => { - const value = unwrap(expr); - const nodes = ts.isObjectLiteralExpression(value) && get_object_nodes(value); - - if (!nodes || nodes.headers || (nodes.status && nodes.status.getText() !== '200')) { - manual_return_migration(node || GET, file.code, TASKS.PAGE_ENDPOINT); - return; - } - - automigration(value, file.code, dedent(nodes.body?.getText() || '')); - }); - } - - rewrite_type(GET, file.code, 'RequestHandler', load_name); - - if (ts.isFunctionDeclaration(GET) && GET.name) { - automigration(GET.name, file.code, 'load'); - } else if (ts.isVariableDeclaration(GET.parent) && ts.isIdentifier(GET.parent.name)) { - automigration(GET.parent.name, file.code, 'load'); - } else { - manual_migration(GET, file.code, 'Rename GET to load', TASKS.PAGE_ENDPOINT); - } - - unmigrated.delete('GET'); - } - } - - for (const method of non_get_methods) { - const fn = get_function_node(statement, /** @type{string} */ (file.exports.map.get(method))); - if (fn?.body) { - rewrite_returns(fn.body, (expr, node) => { - manual_return_migration(node || fn, file.code, TASKS.PAGE_ENDPOINT); - }); - - rewrite_type(fn, file.code, 'RequestHandler', 'Action'); - - unmigrated.delete(method); - } - } - - if (ts.isImportDeclaration(statement) && statement.importClause) { - const bindings = statement.importClause.namedBindings; - - if (bindings && !ts.isNamespaceImport(bindings)) { - for (const binding of bindings.elements) { - if (binding.name.escapedText === 'RequestHandler') { - const types = [has_load && load_name, has_action && 'Action'].filter(Boolean); - - file.code.overwrite(binding.getStart(), binding.getEnd(), types.join(', ')); - } - } - } - } - } - - if (unmigrated.size) { - return give_up + file.code.toString(); - } - - return file.code.toString(); -} diff --git a/packages/migrate/migrations/routes/migrate_page_server/index.spec.js b/packages/migrate/migrations/routes/migrate_page_server/index.spec.js deleted file mode 100644 index 82a0e354b654..000000000000 --- a/packages/migrate/migrations/routes/migrate_page_server/index.spec.js +++ /dev/null @@ -1,10 +0,0 @@ -import { assert, test } from 'vitest'; -import { migrate_page_server } from './index.js'; -import { read_samples } from '../../../utils.js'; - -for (const sample of read_samples(new URL('./samples.md', import.meta.url))) { - test(sample.description, () => { - const actual = migrate_page_server(sample.before, sample.filename ?? '+page.server.js'); - assert.equal(actual, sample.after); - }); -} diff --git a/packages/migrate/migrations/routes/migrate_page_server/samples.md b/packages/migrate/migrations/routes/migrate_page_server/samples.md deleted file mode 100644 index c6cf6266ffc2..000000000000 --- a/packages/migrate/migrations/routes/migrate_page_server/samples.md +++ /dev/null @@ -1,181 +0,0 @@ -## A GET function that only returns body - -```js before -/** @type {import('./$types').RequestHandler} */ -export function GET() { - return { - body: { - a: 1 - } - }; -} -``` - -```js after -/** @type {import('./$types').PageServerLoad} */ -export function load() { - return { - a: 1 - }; -} -``` - -## A TypeScript GET function that only returns body - -```ts before -import type { RequestHandler } from './$types'; - -export const GET: RequestHandler = () => { - return { - body: { - a: 1 - } - }; -} -``` - -```ts after -import type { PageServerLoad } from './$types'; - -export const load: PageServerLoad = () => { - return { - a: 1 - }; -} -``` - -## A GET function in a +layout-foo.server.js - -> file: +layout-foo.server.js - -```js before -/** @type {import('./$types').RequestHandler} */ -export function GET() { - return { - body: { - a: 1 - } - }; -} -``` - -```js after -/** @type {import('./$types').LayoutServerLoad.foo} */ -export function load() { - return { - a: 1 - }; -} -``` - -## 200 status - -```js before -export function GET() { - return { - status: 200, - body: { - a: 1 - } - }; -} -``` - -```js after -export function load() { - return { - a: 1 - }; -} -``` - -## Arrow function GET - -```js before -/** @type {import('./$types').RequestHandler} */ -export const GET = () => ({ - body: { - a: 1 - } -}); -``` - -```js after -/** @type {import('./$types').PageServerLoad} */ -export const load = () => ({ - a: 1 -}); -``` - -## POST - -```js before -/** @type {import('./$types').RequestHandler} */ -export function POST() { - return {}; -} -``` - -```js after -/** @type {import('./$types').Action} */ -export function POST() { - throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292699)"); - return {}; -} -``` - -## A function that returns nothing - -```js before -export function GET() { - return; -} -``` - -```js after -export function load() { - return; -} -``` - -## A function that wrongfully has no body - -```js before -export function GET() { - return { - status: 200 - }; -} -``` - -```js after -export function load() { - return ; -} -``` - -## A get function that only returns body - -```js before -import something from 'somewhere'; - -/** @type {import('./$types').RequestHandler} */ -export function get() { - return { - body: { - a: something - } - }; -} -``` - -```js after -import something from 'somewhere'; - -/** @type {import('./$types').PageServerLoad} */ -export function load() { - return { - a: something - }; -} -``` diff --git a/packages/migrate/migrations/routes/migrate_scripts/index.js b/packages/migrate/migrations/routes/migrate_scripts/index.js deleted file mode 100644 index 080cf2e46cb1..000000000000 --- a/packages/migrate/migrations/routes/migrate_scripts/index.js +++ /dev/null @@ -1,150 +0,0 @@ -import ts from 'typescript'; -import { adjust_imports, error, parse } from '../utils.js'; -import * as TASKS from '../tasks.js'; -import { comment, dedent, except_str, guess_indent } from '../../../utils.js'; - -/** - * @param {string} content - * @param {boolean} is_error - * @param {boolean} moved - */ -export function migrate_scripts(content, is_error, moved) { - /** @type {string | null} */ - let module = null; - - let ext = '.js'; - - // instance script - const main = content.replace( - /<script([^]*?)>([^]+?)<\/script>(\n*)/g, - (match, attrs, contents, whitespace) => { - const indent = guess_indent(contents) ?? ''; - - if (moved) { - contents = adjust_imports(contents); - } - - if (/context=(['"])module\1/.test(attrs)) { - // special case — load is no longer supported in error - if (is_error) { - const body = `\n${indent}${error('Replace error load function', '3293209')}\n${comment( - contents, - indent - )}`; - - return `<script${attrs}>${body}</script>${whitespace}`; - } - - if (/lang(?:uage)?=(['"])(ts|typescript)\1/.test(attrs)) { - ext = '.ts'; - } - - module = dedent(contents.replace(/^\n/, '')); - - const declared = find_declarations(contents); - const delete_var = (/** @type {string } */ key) => { - const declaration = declared?.get(key); - if (declaration && !declaration.import) { - declared?.delete(key); - } - }; - delete_var('load'); - delete_var('router'); - delete_var('hydrate'); - delete_var('prerender'); - const delete_kit_type = (/** @type {string } */ key) => { - const declaration = declared?.get(key); - if ( - declaration && - declaration.import?.type_only && - declaration.import.from === '@sveltejs/kit' && - !new RegExp(`\\W${key}\\W`).test(except_str(content, match)) - ) { - declared?.delete(key); - } - }; - delete_kit_type('Load'); - delete_kit_type('LoadEvent'); - delete_kit_type('LoadOutput'); - - if (!declared || declared.size > 0) { - const body = `\n${indent}${error( - 'Check code was safely removed', - TASKS.PAGE_MODULE_CTX - )}\n${comment(contents, indent)}`; - - return `<script${attrs}>${body}</script>${whitespace}`; - } - - // nothing was declared here, we can safely remove the script - return ''; - } - - if (!is_error && /export let [\w]+[^"`'\w\s]/.test(contents)) { - contents = `\n${indent}${error('Add data prop', TASKS.PAGE_DATA_PROP)}\n${contents}`; - // Possible TODO: migrate props to data.prop, or suggest $: ({propX, propY, ...} = data); - } - - return `<script${attrs}>${contents}</script>${whitespace}`; - } - ); - - return { module, main, ext }; -} - -/** @param {string} content */ -function find_declarations(content) { - const file = parse(content); - if (!file) return; - - /** @type {Map<string, {name: string, import?: {from: string, type_only: boolean}}>} */ - const declared = new Map(); - /** - * @param {string} name - * @param {{from: string, type_only: boolean}} [import_def] - */ - function add(name, import_def) { - declared.set(name, { name, import: import_def }); - } - - for (const statement of file.ast.statements) { - if (ts.isImportDeclaration(statement) && statement.importClause) { - const type_only = statement.importClause.isTypeOnly; - const from = ts.isStringLiteral(statement.moduleSpecifier) - ? statement.moduleSpecifier.text - : ''; - - if (statement.importClause.name) { - add(statement.importClause.name.text, { from, type_only }); - } - - const bindings = statement.importClause.namedBindings; - - if (bindings) { - if (ts.isNamespaceImport(bindings)) { - add(bindings.name.text, { from, type_only }); - } else { - for (const binding of bindings.elements) { - add(binding.name.text, { from, type_only: type_only || binding.isTypeOnly }); - } - } - } - } else if (ts.isVariableStatement(statement)) { - for (const declaration of statement.declarationList.declarations) { - if (ts.isIdentifier(declaration.name)) { - add(declaration.name.text); - } else { - return; // bail out if it's not a simple variable - } - } - } else if (ts.isFunctionDeclaration(statement) || ts.isClassDeclaration(statement)) { - if (statement.name && ts.isIdentifier(statement.name)) { - add(statement.name.text); - } - } else if (ts.isExportDeclaration(statement) && !statement.exportClause) { - return; // export * from '..' -> bail - } - } - - return declared; -} diff --git a/packages/migrate/migrations/routes/migrate_scripts/index.spec.js b/packages/migrate/migrations/routes/migrate_scripts/index.spec.js deleted file mode 100644 index a52fc7128ff1..000000000000 --- a/packages/migrate/migrations/routes/migrate_scripts/index.spec.js +++ /dev/null @@ -1,14 +0,0 @@ -import { assert, test } from 'vitest'; -import { migrate_scripts } from './index.js'; -import { read_samples } from '../../../utils.js'; - -for (const sample of read_samples(new URL('./samples.md', import.meta.url))) { - test(sample.description, () => { - const actual = migrate_scripts( - sample.before, - sample.description.includes('error'), - sample.description.includes('moved') - ); - assert.equal(actual.main, sample.after); - }); -} diff --git a/packages/migrate/migrations/routes/migrate_scripts/samples.md b/packages/migrate/migrations/routes/migrate_scripts/samples.md deleted file mode 100644 index 6f57fb1f4c6d..000000000000 --- a/packages/migrate/migrations/routes/migrate_scripts/samples.md +++ /dev/null @@ -1,247 +0,0 @@ -## No module context, no page exports - -```svelte before -<script> - let hello = 'world'; -<script> - -<p>{hello}</p> -``` - -```svelte after -<script> - let hello = 'world'; -<script> - -<p>{hello}</p> -``` - -## Module context on error page - -```svelte before -<script context="module"> - export function load() { - return { - props: { - sry: 'not anymore' - } - } - } -</script> - -<script> - export let sry; -</script> - -<p>{sry}</p> -``` - -```svelte after -<script context="module"> - throw new Error("@migration task: Replace error load function (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3293209)"); - - // export function load() { - // return { - // props: { - // sry: 'not anymore' - // } - // } - // } -</script> - -<script> - export let sry; -</script> - -<p>{sry}</p> -``` - -## Module context that can be removed - -```svelte before -<script context="module"> - export function load() { - return { - props: { - a: 1 - } - } - } -</script> - -<script> - export let a; -</script> -``` - -```svelte after -<script> - throw new Error("@migration task: Add data prop (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292707)"); - - export let a; -</script> -``` - -## Module context with moved imports - -```svelte before -<script context="module"> - import Foo from './Foo.svelte'; - export function load() { - return { - props: { - sry: 'not anymore' - } - } - } -</script> - -<script> - export let sry; -</script> - -<Foo>{sry}</Foo> -``` - -```svelte after -<script context="module"> - throw new Error("@migration task: Check code was safely removed (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292722)"); - - // import Foo from '../Foo.svelte'; - // export function load() { - // return { - // props: { - // sry: 'not anymore' - // } - // } - // } -</script> - -<script> - throw new Error("@migration task: Add data prop (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292707)"); - - export let sry; -</script> - -<Foo>{sry}</Foo> -``` - -## Module context with type imports only - -```svelte before -<script context="module"> - import type { Load, LoadEvent, LoadOutput } from '@sveltejs/kit'; - export function load() { - return { - props: { - sry: 'not anymore' - } - } - } -</script> -``` - -```svelte after -``` - -## Module context with type imports only but used in instance script - -```svelte before -<script context="module"> - import type { Load, LoadEvent, LoadOutput } from '@sveltejs/kit'; - export function load() { - return { - props: { - sry: 'not anymore' - } - } - } -</script> - -<script> - const whywouldyoudothis: Load = 'I dont know lol'; -</script> -``` - -```svelte after -<script context="module"> - throw new Error("@migration task: Check code was safely removed (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292722)"); - - // import type { Load, LoadEvent, LoadOutput } from '@sveltejs/kit'; - // export function load() { - // return { - // props: { - // sry: 'not anymore' - // } - // } - // } -</script> - -<script> - const whywouldyoudothis: Load = 'I dont know lol'; -</script> -``` - -## Module context with export * from '..' - -```svelte before -<script context="module"> - export * from './somewhere'; -</script> -``` - -```svelte after -<script context="module"> - throw new Error("@migration task: Check code was safely removed (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292722)"); - - // export * from './somewhere'; -</script> -``` - -## Module context with named imports - -```svelte before -<script context="module"> - import { bar } from './somewhere'; -</script> - -<script> - let foo = bar; -</script> -``` - -```svelte after -<script context="module"> - throw new Error("@migration task: Check code was safely removed (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292722)"); - - // import { bar } from './somewhere'; -</script> - -<script> - let foo = bar; -</script> -``` - -## Module context with named imports that have same name as a load option - -```svelte before -<script context="module"> - import { router } from './somewhere'; -</script> - -<script> - let foo = router; -</script> -``` - -```svelte after -<script context="module"> - throw new Error("@migration task: Check code was safely removed (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292722)"); - - // import { router } from './somewhere'; -</script> - -<script> - let foo = router; -</script> -``` diff --git a/packages/migrate/migrations/routes/migrate_server/index.js b/packages/migrate/migrations/routes/migrate_server/index.js deleted file mode 100644 index d9092d554651..000000000000 --- a/packages/migrate/migrations/routes/migrate_server/index.js +++ /dev/null @@ -1,190 +0,0 @@ -import ts from 'typescript'; -import { - automigration, - uppercase_migration, - error, - get_function_node, - get_object_nodes, - is_new, - is_string_like, - manual_return_migration, - parse, - rewrite_returns, - unwrap -} from '../utils.js'; -import * as TASKS from '../tasks.js'; -import { dedent, guess_indent, indent_at_line } from '../../../utils.js'; - -const give_up = `${error('Update +server.js', TASKS.STANDALONE_ENDPOINT)}\n\n`; - -/** - * @param {string} content - * @returns {string} - */ -export function migrate_server(content) { - const file = parse(content); - if (!file) return give_up + content; - - const indent = guess_indent(content); - - const methods = ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'].filter((name) => - file.exports.map.has(name) - ); - - // If user didn't do the uppercase verbs migration yet, do it here on the fly. - const uppercased = uppercase_migration(methods, file); - if (!uppercased) { - return give_up + content; - } else if (uppercased !== content) { - return migrate_server(uppercased); - } - - const unmigrated = new Set(methods); - - /** @type {Map<string, string>} */ - const imports = new Map(); - - for (const statement of file.ast.statements) { - for (const method of methods) { - const fn = get_function_node(statement, /** @type{string} */ (file.exports.map.get(method))); - if (fn?.body) { - rewrite_returns(fn.body, (expr, node) => { - // leave `() => new Response(...)` alone - if (is_new(expr, 'Response')) return; - - const value = unwrap(expr); - const nodes = ts.isObjectLiteralExpression(value) && get_object_nodes(value); - - if (nodes) { - const body_is_object_literal = nodes.body && ts.isObjectLiteralExpression(nodes.body); - - if (body_is_object_literal || (nodes.body && ts.isIdentifier(nodes.body))) { - let result; - - let name = 'json'; - let i = 1; - while (content.includes(name)) name = `json$${i++}`; - - imports.set('json', name); - - const body = dedent(nodes.body.getText()); - - if (nodes.headers || (nodes.status && nodes.status.getText() !== '200')) { - const start = indent_at_line(content, expr.pos); - const properties = []; - - if (nodes.status && nodes.status.getText() !== '200') { - properties.push(`status: ${nodes.status.getText()}`); - } - - if (nodes.headers) { - properties.push(`headers: ${nodes.headers.getText()}`); - } - - const ws = `\n${start}`; - const init = `{${ws}${indent}${properties.join(`,${ws}${indent}`)}${ws}}`; - - result = `${name}(${body}, ${init})`; - } else { - result = `${name}(${body})`; - } - - if (body_is_object_literal) { - automigration(expr, file.code, result); - } else { - manual_return_migration( - node || fn, - file.code, - TASKS.STANDALONE_ENDPOINT, - `return ${result};` - ); - } - - return; - } - - let safe_headers = !nodes.headers || !ts.isObjectLiteralExpression(nodes.headers); - if (nodes.headers && ts.isObjectLiteralExpression(nodes.headers)) { - // if `headers` is an object literal, and it either doesn't contain - // `set-cookie` or `set-cookie` is a string, then the headers - // are safe to use in a `Response` - const set_cookie_value = nodes.headers.properties.find((prop) => { - return ( - ts.isPropertyAssignment(prop) && - ts.isStringLiteral(prop.name) && - /set-cookie/i.test(prop.name.text) - ); - }); - - if (!set_cookie_value || is_string_like(set_cookie_value)) { - safe_headers = true; - } - } - - const safe_body = - !nodes.body || - is_string_like(nodes.body) || - (ts.isCallExpression(nodes.body) && - nodes.body.expression.getText() === 'JSON.stringify'); - - if (safe_headers) { - const status = nodes.status ? nodes.status.getText() : '200'; - const headers = nodes.headers?.getText(); - const body = dedent(nodes.body?.getText() || 'undefined'); - - const multiline = /\n/.test(headers); - - const init = [ - status !== '200' && `status: ${status}`, - headers && `headers: ${headers}` - ].filter(Boolean); - - const indent = indent_at_line(content, expr.getStart()); - const end_whitespace = multiline ? `\n${indent}` : ' '; - const join_whitespace = multiline ? end_whitespace + guess_indent(content) : ' '; - - const response = - init.length > 0 - ? `new Response(${body}, {${join_whitespace}${init.join( - `,${join_whitespace}` - )}${end_whitespace}})` - : `new Response(${body})`; - - if (safe_body) { - automigration(expr, file.code, response); - } else { - manual_return_migration( - node || fn, - file.code, - TASKS.STANDALONE_ENDPOINT, - `return ${response};` - ); - } - - return; - } - } - - manual_return_migration(node || fn, file.code, TASKS.STANDALONE_ENDPOINT); - }); - - unmigrated.delete(method); - } - } - } - - if (imports.size) { - const has_imports = file.ast.statements.some((statement) => ts.isImportDeclaration(statement)); - const specifiers = Array.from(imports).map(([name, local]) => - name === local ? name : `${name} as ${local}` - ); - const declaration = `import { ${specifiers.join(', ')} } from '@sveltejs/kit';`; - file.code.prependLeft(0, declaration + (has_imports ? '\n' : '\n\n')); - } - - if (unmigrated.size) { - return give_up + file.code.toString(); - } - - return file.code.toString(); -} diff --git a/packages/migrate/migrations/routes/migrate_server/index.spec.js b/packages/migrate/migrations/routes/migrate_server/index.spec.js deleted file mode 100644 index 8ad424534ef0..000000000000 --- a/packages/migrate/migrations/routes/migrate_server/index.spec.js +++ /dev/null @@ -1,10 +0,0 @@ -import { assert, test } from 'vitest'; -import { migrate_server } from './index.js'; -import { read_samples } from '../../../utils.js'; - -for (const sample of read_samples(new URL('./samples.md', import.meta.url))) { - test(sample.description, () => { - const actual = migrate_server(sample.before); - assert.equal(actual, sample.after); - }); -} diff --git a/packages/migrate/migrations/routes/migrate_server/samples.md b/packages/migrate/migrations/routes/migrate_server/samples.md deleted file mode 100644 index 3bc08662552f..000000000000 --- a/packages/migrate/migrations/routes/migrate_server/samples.md +++ /dev/null @@ -1,212 +0,0 @@ -## A GET function that returns a JSON object - -```js before -export function GET() { - return { - body: { - a: 1 - } - }; -} -``` - -```js after -import { json } from '@sveltejs/kit'; - -export function GET() { - return json({ - a: 1 - }); -} -``` - -## A GET function that returns a JSON object and already specifies a 'json' identifier - -```js before -export function GET() { - const json = 'shadow'; - - return { - body: { - a: 1 - } - }; -} -``` - -```js after -import { json as json$1 } from '@sveltejs/kit'; - -export function GET() { - const json = 'shadow'; - - return json$1({ - a: 1 - }); -} -``` - -## A GET function that returns a JSON object with custom headers - -```js before -export function GET() { - return { - headers: { - 'x-foo': '123' - }, - body: { - a: 1 - } - }; -} -``` - -```js after -import { json } from '@sveltejs/kit'; - -export function GET() { - return json({ - a: 1 - }, { - headers: { - 'x-foo': '123' - } - }); -} -``` - -## A GET arrow function that returns a JSON object - -```js before -export const GET = () => ({ - body: { - a: 1 - } -}); -``` - -```js after -import { json } from '@sveltejs/kit'; - -export const GET = () => json({ - a: 1 -}); -``` - -## GET returns we can't migrate - -```js before -export function GET() { - if (a) { - return { - body - }; - } else if (b) { - return { - body: new ReadableStream(), - headers: { - 'content-type': 'octasomething' - } - } - } else if (c) { - return { - body: 'string', - headers: { - 'x-foo': 'bar' - } - } - } -} -``` - -```js after -import { json } from '@sveltejs/kit'; - -export function GET() { - if (a) { - throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); - // Suggestion (check for correctness before using): - // return json(body); - return { - body - }; - } else if (b) { - throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); - // Suggestion (check for correctness before using): - // return new Response(new ReadableStream(), { - // headers: { - // 'content-type': 'octasomething' - // } - // }); - return { - body: new ReadableStream(), - headers: { - 'content-type': 'octasomething' - } - } - } else if (c) { - return new Response('string', { - headers: { - 'x-foo': 'bar' - } - }) - } -} -``` - -## A function that returns a Response - -```js before -export const GET = () => new Response('text'); -``` - -```js after -export const GET = () => new Response('text'); -``` - -## A function that returns an unknown value - -```js before -export const GET = () => createResponse('text'); -``` - -```js after -throw new Error("@migration task: Migrate this return statement (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-3292701)"); -export const GET = () => createResponse('text'); -``` - -## A function that returns nothing - -```js before -export function GET() { - return; -} -``` - -```js after -export function GET() { - return; -} -``` - -## A GET function that returns a JSON object - -```js before -export function get() { - return { - body: { - a: 1 - } - }; -} -``` - -```js after -import { json } from '@sveltejs/kit'; - -export function GET() { - return json({ - a: 1 - }); -} -``` diff --git a/packages/migrate/migrations/routes/tasks.js b/packages/migrate/migrations/routes/tasks.js deleted file mode 100644 index 775623232882..000000000000 --- a/packages/migrate/migrations/routes/tasks.js +++ /dev/null @@ -1,5 +0,0 @@ -export const STANDALONE_ENDPOINT = '3292701'; -export const PAGE_ENDPOINT = '3292699'; -export const PAGE_LOAD = '3292693'; -export const PAGE_MODULE_CTX = '3292722'; -export const PAGE_DATA_PROP = '3292707'; diff --git a/packages/migrate/migrations/routes/utils.js b/packages/migrate/migrations/routes/utils.js deleted file mode 100644 index 0b8073e6c0fc..000000000000 --- a/packages/migrate/migrations/routes/utils.js +++ /dev/null @@ -1,374 +0,0 @@ -import ts from 'typescript'; -import MagicString from 'magic-string'; -import { comment, indent_at_line } from '../../utils.js'; - -/** - * @param {string} description - * @param {string} [comment_id] - */ -export function task(description, comment_id) { - return ( - `@migration task: ${description}` + - (comment_id - ? ` (https://github.com/sveltejs/kit/discussions/5774#discussioncomment-${comment_id})` - : '') - ); -} - -/** - * @param {string} description - * @param {string} comment_id - */ -export function error(description, comment_id) { - return `throw new Error(${JSON.stringify(task(description, comment_id))});`; -} - -/** @param {string} content */ -export function adjust_imports(content) { - try { - const ast = ts.createSourceFile( - 'filename.ts', - content, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS - ); - - const code = new MagicString(content); - - /** @param {number} pos */ - function adjust(pos) { - // TypeScript AST is a clusterfuck, we need to step forward to find - // where the node _actually_ starts - while (content[pos] !== '.') pos += 1; - - // replace ../ with ../../ and ./ with ../ - code.prependLeft(pos, content[pos + 1] === '.' ? '../' : '.'); - } - - /** @param {ts.Node} node */ - function walk(node) { - if (ts.isImportDeclaration(node)) { - const text = /** @type {ts.StringLiteral} */ (node.moduleSpecifier).text; - if (text[0] === '.') adjust(node.moduleSpecifier.pos); - } - - if (ts.isCallExpression(node) && node.expression.getText() === 'import') { - const arg = node.arguments[0]; - - if (ts.isStringLiteral(arg)) { - if (arg.text[0] === '.') adjust(arg.pos); - } else if (ts.isTemplateLiteral(arg) && !ts.isNoSubstitutionTemplateLiteral(arg)) { - if (arg.head.text[0] === '.') adjust(arg.head.pos); - } - } - - node.forEachChild(walk); - } - - ast.forEachChild(walk); - - return code.toString(); - } catch { - // this is enough of an edge case that it's probably fine to - // just leave the code as we found it - return content; - } -} - -/** - * - * @param {ts.Node} node - * @param {MagicString} str - * @param {string} comment_nr - * @param {string} [suggestion] - */ -export function manual_return_migration(node, str, comment_nr, suggestion) { - manual_migration(node, str, 'Migrate this return statement', comment_nr, suggestion); -} - -/** - * @param {ts.Node} node - * @param {MagicString} str - * @param {string} message - * @param {string} comment_nr - * @param {string} [suggestion] - */ -export function manual_migration(node, str, message, comment_nr, suggestion) { - // handle case where this is called on a (arrow) function - if (ts.isFunctionExpression(node) || ts.isArrowFunction(node)) { - node = node.parent.parent.parent; - } - - const indent = indent_at_line(str.original, node.getStart()); - - let appended = ''; - - if (suggestion) { - appended = `\n${indent}// Suggestion (check for correctness before using):\n${indent}// ${comment( - suggestion, - indent - )}`; - } - - str.prependLeft(node.getStart(), error(message, comment_nr) + appended + `\n${indent}`); -} - -/** - * - * @param {ts.Node} node - * @param {MagicString} str - * @param {string} migration - */ -export function automigration(node, str, migration) { - str.overwrite(node.getStart(), node.getEnd(), migration); -} - -/** - * @param {ts.ObjectLiteralExpression} node - */ -export function get_object_nodes(node) { - /** @type {Record<string, ts.Node>} */ - const obj = {}; - - for (const property of node.properties) { - if (ts.isPropertyAssignment(property) && ts.isIdentifier(property.name)) { - obj[property.name.text] = property.initializer; - } else if (ts.isShorthandPropertyAssignment(property)) { - obj[property.name.text] = property.name; - } else { - return null; // object contains funky stuff like computed properties/accessors — bail - } - } - - return obj; -} - -/** - * @param {ts.Node} node - */ -export function is_string_like(node) { - return ( - ts.isStringLiteral(node) || - ts.isTemplateExpression(node) || - ts.isNoSubstitutionTemplateLiteral(node) - ); -} - -/** @param {ts.SourceFile} node */ -export function get_exports(node) { - /** @type {Map<string, string>} */ - const map = new Map(); - - let complex = false; - - for (const statement of node.statements) { - if ( - ts.isExportDeclaration(statement) && - statement.exportClause && - ts.isNamedExports(statement.exportClause) - ) { - // export { x }, export { x as y } - for (const specifier of statement.exportClause.elements) { - map.set(specifier.name.text, specifier.propertyName?.text || specifier.name.text); - } - } else if ( - ts.isFunctionDeclaration(statement) && - statement.name && - ts.getModifiers(statement)?.[0]?.kind === ts.SyntaxKind.ExportKeyword - ) { - // export function x ... - map.set(statement.name.text, statement.name.text); - } else if ( - ts.isVariableStatement(statement) && - ts.getModifiers(statement)?.[0]?.kind === ts.SyntaxKind.ExportKeyword - ) { - // export const x = ..., y = ... - for (const declaration of statement.declarationList.declarations) { - if (ts.isIdentifier(declaration.name)) { - map.set(declaration.name.text, declaration.name.text); - } else { - // might need to bail out on encountering this edge case, - // because this stuff can get pretty intense - complex = true; - } - } - } - } - - return { map, complex }; -} - -/** - * @param {ts.Node} statement - * @param {string[]} names - * @returns {ts.FunctionDeclaration | ts.FunctionExpression | ts.ArrowFunction | undefined} - */ -export function get_function_node(statement, ...names) { - if ( - ts.isFunctionDeclaration(statement) && - statement.name && - names.includes(statement.name.text) - ) { - // export function x ... - return statement; - } - - if (ts.isVariableStatement(statement)) { - for (const declaration of statement.declarationList.declarations) { - if ( - ts.isIdentifier(declaration.name) && - names.includes(declaration.name.text) && - declaration.initializer && - (ts.isArrowFunction(declaration.initializer) || - ts.isFunctionExpression(declaration.initializer)) - ) { - // export const x = ... - return declaration.initializer; - } - } - } -} - -/** - * Utility for rewriting return statements. - * If `node` is `undefined`, it means it's a concise arrow function body (`() => ({}))`. - * Lone `return;` statements are left untouched. - * @param {ts.Block | ts.ConciseBody} block - * @param {(expression: ts.Expression, node: ts.ReturnStatement | undefined) => void} callback - */ -export function rewrite_returns(block, callback) { - if (ts.isBlock(block)) { - /** @param {ts.Node} node */ - function walk(node) { - if ( - ts.isArrowFunction(node) || - ts.isFunctionExpression(node) || - ts.isFunctionDeclaration(node) - ) { - // don't cross this boundary - return; - } - - if (ts.isReturnStatement(node) && node.expression) { - callback(node.expression, node); - return; - } - - node.forEachChild(walk); - } - - block.forEachChild(walk); - } else { - callback(block, undefined); - } -} - -/** @param {ts.Node} node */ -export function unwrap(node) { - if (ts.isParenthesizedExpression(node)) { - return node.expression; - } - - return node; -} - -/** - * @param {ts.Node} node - * @param {string} name - * @returns {node is ts.isNewExpression} - */ -export function is_new(node, name) { - return ( - ts.isNewExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === name - ); -} - -/** @param {string} content */ -export function parse(content) { - try { - const ast = ts.createSourceFile( - 'filename.ts', - content, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS - ); - - const code = new MagicString(content); - - return { - ast, - code, - exports: get_exports(ast) - }; - } catch { - return null; - } -} - -/** - * @param {ts.Node} node - * @param {MagicString} code - * @param {string} old_type - * @param {string} new_type - */ -export function rewrite_type(node, code, old_type, new_type) { - // @ts-ignore - const jsDoc = node.jsDoc || node.parent?.parent?.parent?.jsDoc; - if (jsDoc) { - // @ts-ignore - for (const comment of jsDoc) { - const str = comment.getText(); - const index = str.indexOf(old_type); - - if (index !== -1) { - code.overwrite(comment.pos + index, comment.pos + index + old_type.length, new_type); - } - } - } - - // @ts-ignore - const type = node.type || node.parent.type; // handle both fn and var declarations - - if (type?.typeName?.escapedText.startsWith(old_type)) { - const start = type.getStart(); - code.overwrite(start, start + old_type.length, new_type); - } -} - -/** - * Does the HTTP verbs uppercase migration if it didn't happen yet. If a string - * is returned, the migration was done or wasn't needed. If undefined is returned, - * the migration is needed but couldn't be done. - * - * @param {string[]} methods - * @param {NonNullable<ReturnType<typeof parse>>} file - */ -export function uppercase_migration(methods, file) { - const old_methods = new Set( - ['get', 'post', 'put', 'patch', 'del'].filter((name) => file.exports.map.has(name)) - ); - - if (old_methods.size && !methods.length) { - for (const statement of file.ast.statements) { - for (const method of old_methods) { - const fn = get_function_node( - statement, - /** @type{string} */ (file.exports.map.get(method)) - ); - if (!fn?.name) { - continue; - } - file.code.overwrite( - fn.name.getStart(), - fn.name.getEnd(), - method === 'del' ? 'DELETE' : method.toUpperCase() - ); - old_methods.delete(method); - } - } - } - - return old_methods.size ? undefined : file.code.toString(); -} diff --git a/packages/migrate/migrations/self-closing-tags/index.js b/packages/migrate/migrations/self-closing-tags/index.js deleted file mode 100644 index ced6ca3089e7..000000000000 --- a/packages/migrate/migrations/self-closing-tags/index.js +++ /dev/null @@ -1,57 +0,0 @@ -import colors from 'kleur'; -import fs from 'node:fs'; -import process from 'node:process'; -import prompts from 'prompts'; -import glob from 'tiny-glob/sync.js'; -import { remove_self_closing_tags } from './migrate.js'; -import { pathToFileURL } from 'node:url'; -import { resolve } from 'import-meta-resolve'; - -export async function migrate() { - let compiler; - try { - compiler = await import_from_cwd('svelte/compiler'); - } catch { - console.log(colors.bold().red('❌ Could not find a local Svelte installation.')); - return; - } - - console.log( - colors.bold().yellow('\nThis will update .svelte files inside the current directory\n') - ); - - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Continue?', - initial: false - }); - - if (!response.value) { - process.exit(1); - } - - const files = glob('**/*.svelte') - .map((file) => file.replace(/\\/g, '/')) - .filter((file) => !file.includes('/node_modules/')); - - for (const file of files) { - try { - const code = await remove_self_closing_tags(compiler, fs.readFileSync(file, 'utf-8')); - fs.writeFileSync(file, code); - } catch { - // continue - } - } - - console.log(colors.bold().green('✔ Your project has been updated')); - console.log(' If using Prettier, please upgrade to the latest prettier-plugin-svelte version'); -} - -/** @param {string} name */ -function import_from_cwd(name) { - const cwd = pathToFileURL(process.cwd()).href; - const url = resolve(name, cwd + '/x.js'); - - return import(url); -} diff --git a/packages/migrate/migrations/self-closing-tags/migrate.js b/packages/migrate/migrations/self-closing-tags/migrate.js deleted file mode 100644 index 73f4ec0a60f5..000000000000 --- a/packages/migrate/migrations/self-closing-tags/migrate.js +++ /dev/null @@ -1,192 +0,0 @@ -import MagicString from 'magic-string'; -import { walk } from 'zimmerframe'; - -const VoidElements = [ - 'area', - 'base', - 'br', - 'col', - 'embed', - 'hr', - 'img', - 'input', - 'keygen', - 'link', - 'menuitem', - 'meta', - 'param', - 'source', - 'track', - 'wbr' -]; - -const SVGElements = [ - 'altGlyph', - 'altGlyphDef', - 'altGlyphItem', - 'animate', - 'animateColor', - 'animateMotion', - 'animateTransform', - 'circle', - 'clipPath', - 'color-profile', - 'cursor', - 'defs', - 'desc', - 'discard', - 'ellipse', - 'feBlend', - 'feColorMatrix', - 'feComponentTransfer', - 'feComposite', - 'feConvolveMatrix', - 'feDiffuseLighting', - 'feDisplacementMap', - 'feDistantLight', - 'feDropShadow', - 'feFlood', - 'feFuncA', - 'feFuncB', - 'feFuncG', - 'feFuncR', - 'feGaussianBlur', - 'feImage', - 'feMerge', - 'feMergeNode', - 'feMorphology', - 'feOffset', - 'fePointLight', - 'feSpecularLighting', - 'feSpotLight', - 'feTile', - 'feTurbulence', - 'filter', - 'font', - 'font-face', - 'font-face-format', - 'font-face-name', - 'font-face-src', - 'font-face-uri', - 'foreignObject', - 'g', - 'glyph', - 'glyphRef', - 'hatch', - 'hatchpath', - 'hkern', - 'image', - 'line', - 'linearGradient', - 'marker', - 'mask', - 'mesh', - 'meshgradient', - 'meshpatch', - 'meshrow', - 'metadata', - 'missing-glyph', - 'mpath', - 'path', - 'pattern', - 'polygon', - 'polyline', - 'radialGradient', - 'rect', - 'set', - 'solidcolor', - 'stop', - 'svg', - 'switch', - 'symbol', - 'text', - 'textPath', - 'tref', - 'tspan', - 'unknown', - 'use', - 'view', - 'vkern' -]; - -/** - * @param {{ preprocess: any, parse: any }} svelte_compiler - * @param {string} source - */ -export async function remove_self_closing_tags({ preprocess, parse }, source) { - const preprocessed = await preprocess(source, { - /** @param {{ content: string }} input */ - script: ({ content }) => ({ - code: content - .split('\n') - .map((line) => ' '.repeat(line.length)) - .join('\n') - }), - /** @param {{ content: string }} input */ - style: ({ content }) => ({ - code: content - .split('\n') - .map((line) => ' '.repeat(line.length)) - .join('\n') - }) - }); - const ast = parse(preprocessed.code); - const ms = new MagicString(source); - /** @type {Array<() => void>} */ - const updates = []; - let is_foreign = false; - let is_custom_element = false; - - walk(ast.html, null, { - _(node, { next, stop }) { - if (node.type === 'Options') { - const namespace = node.attributes.find( - /** @param {any} a */ - (a) => a.type === 'Attribute' && a.name === 'namespace' - ); - if (namespace?.value[0].data === 'foreign') { - is_foreign = true; - stop(); - return; - } - - is_custom_element = node.attributes.some( - /** @param {any} a */ - (a) => a.type === 'Attribute' && (a.name === 'customElement' || a.name === 'tag') - ); - } - - if (node.type === 'Element' || node.type === 'Slot') { - const is_self_closing = source[node.end - 2] === '/'; - if ( - !is_self_closing || - VoidElements.includes(node.name) || - SVGElements.includes(node.name) || - !/^[a-z0-9_-]+$/.test(node.name) - ) { - next(); - return; - } - - let start = node.end - 2; - if (source[start - 1] === ' ') { - start--; - } - updates.push(() => { - if (node.type === 'Element' || is_custom_element) { - ms.update(start, node.end, `></${node.name}>`); - } - }); - } - - next(); - } - }); - - if (is_foreign) { - return source; - } - - updates.forEach((update) => update()); - return ms.toString(); -} diff --git a/packages/migrate/migrations/self-closing-tags/migrate.spec.js b/packages/migrate/migrations/self-closing-tags/migrate.spec.js deleted file mode 100644 index 421f00519732..000000000000 --- a/packages/migrate/migrations/self-closing-tags/migrate.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -import { assert, test } from 'vitest'; -import * as compiler from 'svelte/compiler'; -import { remove_self_closing_tags } from './migrate.js'; - -/** @type {Record<string, string>} */ -const tests = { - '<div/>': '<div></div>', - '<div />': '<div></div>', - '<custom-element />': '<custom-element></custom-element>', - '<div class="foo"/>': '<div class="foo"></div>', - '<div class="foo" />': '<div class="foo"></div>', - '\t<div\n\t\tonclick={blah}\n\t/>': '\t<div\n\t\tonclick={blah}\n\t></div>', - '<foo-bar/>': '<foo-bar></foo-bar>', - '<link/>': '<link/>', - '<link />': '<link />', - '<svg><g /></svg>': '<svg><g /></svg>', - '<slot />': '<slot />', - '<svelte:options customElement="my-element" /><slot />': - '<svelte:options customElement="my-element" /><slot></slot>', - '<svelte:options namespace="foreign" /><foo />': '<svelte:options namespace="foreign" /><foo />', - '<script>console.log("<div />")</script>': '<script>console.log("<div />")</script>', - '<script lang="ts">let a: string = ""</script><div />': - '<script lang="ts">let a: string = ""</script><div></div>', - '<div><i/></div>': '<div><i></i></div>' -}; - -for (const input in tests) { - test(input, async () => { - const output = tests[input]; - assert.equal(await remove_self_closing_tags(compiler, input), output); - }); -} diff --git a/packages/migrate/migrations/svelte-4/index.js b/packages/migrate/migrations/svelte-4/index.js deleted file mode 100644 index 4fea5173da0e..000000000000 --- a/packages/migrate/migrations/svelte-4/index.js +++ /dev/null @@ -1,112 +0,0 @@ -import colors from 'kleur'; -import fs from 'node:fs'; -import process from 'node:process'; -import prompts from 'prompts'; -import glob from 'tiny-glob/sync.js'; -import { bail, check_git, update_js_file, update_svelte_file } from '../../utils.js'; -import { transform_code, transform_svelte_code, update_pkg_json } from './migrate.js'; - -export async function migrate() { - if (!fs.existsSync('package.json')) { - bail('Please re-run this script in a directory with a package.json'); - } - - console.log( - colors - .bold() - .yellow( - '\nThis will update files in the current directory\n' + - "If you're inside a monorepo, don't run this in the root directory, rather run it in all projects independently.\n" - ) - ); - - const use_git = check_git(); - - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Continue?', - initial: false - }); - - if (!response.value) { - process.exit(1); - } - - const folders = await prompts({ - type: 'multiselect', - name: 'value', - message: 'Which folders should be migrated?', - choices: fs - .readdirSync('.') - .filter( - (dir) => fs.statSync(dir).isDirectory() && dir !== 'node_modules' && !dir.startsWith('.') - ) - .map((dir) => ({ title: dir, value: dir, selected: true })) - }); - - if (!folders.value?.length) { - process.exit(1); - } - - const migrate_transition = await prompts({ - type: 'confirm', - name: 'value', - message: - 'Add the `|global` modifier to currently global transitions for backwards compatibility? More info at https://svelte.dev/docs/svelte/v4-migration-guide#transitions-are-local-by-default', - initial: true - }); - - update_pkg_json(); - - // const { default: config } = fs.existsSync('svelte.config.js') - // ? await import(pathToFileURL(path.resolve('svelte.config.js')).href) - // : { default: {} }; - - /** @type {string[]} */ - const svelte_extensions = /* config.extensions ?? - disabled because it would break .svx */ [ - '.svelte' - ]; - const extensions = [...svelte_extensions, '.ts', '.js']; - // For some reason {folders.value.join(',')} as part of the glob doesn't work and returns less files - const files = folders.value.flatMap( - /** @param {string} folder */ (folder) => - glob(`${folder}/**`, { filesOnly: true, dot: true }) - .map((file) => file.replace(/\\/g, '/')) - .filter((file) => !file.includes('/node_modules/')) - ); - - for (const file of files) { - if (extensions.some((ext) => file.endsWith(ext))) { - if (svelte_extensions.some((ext) => file.endsWith(ext))) { - update_svelte_file(file, transform_code, (code) => - transform_svelte_code(code, migrate_transition.value) - ); - } else { - update_js_file(file, transform_code); - } - } - } - - console.log(colors.bold().green('✔ Your project has been migrated')); - - console.log('\nRecommended next steps:\n'); - - const cyan = colors.bold().cyan; - - const tasks = [ - use_git && cyan('git commit -m "migration to Svelte 4"'), - 'Review the migration guide at https://svelte.dev/docs/svelte/v4-migration-guide', - 'Read the updated docs at https://svelte.dev/docs/svelte' - ].filter(Boolean); - - tasks.forEach((task, i) => { - console.log(` ${i + 1}: ${task}`); - }); - - console.log(''); - - if (use_git) { - console.log(`Run ${cyan('git diff')} to review changes.\n`); - } -} diff --git a/packages/migrate/migrations/svelte-4/migrate.js b/packages/migrate/migrations/svelte-4/migrate.js deleted file mode 100644 index c459380ef441..000000000000 --- a/packages/migrate/migrations/svelte-4/migrate.js +++ /dev/null @@ -1,348 +0,0 @@ -import fs from 'node:fs'; -import { Project, ts, Node, SyntaxKind } from 'ts-morph'; -import { log_migration, log_on_ts_modification, update_pkg } from '../../utils.js'; - -export function update_pkg_json() { - fs.writeFileSync( - 'package.json', - update_pkg_json_content(fs.readFileSync('package.json', 'utf8')) - ); -} - -/** - * @param {string} content - */ -export function update_pkg_json_content(content) { - return update_pkg(content, [ - ['svelte', '^4.0.0'], - ['svelte-check', '^3.4.3'], - ['svelte-preprocess', '^5.0.3'], - ['@sveltejs/kit', '^1.20.4'], - ['@sveltejs/vite-plugin-svelte', '^2.4.1'], - [ - 'svelte-loader', - '^3.1.8', - ' (if you are still on webpack 4, you need to update to webpack 5)' - ], - ['rollup-plugin-svelte', '^7.1.5'], - ['prettier-plugin-svelte', '^2.10.1'], - ['eslint-plugin-svelte', '^2.30.0'], - [ - 'eslint-plugin-svelte3', - '^4.0.0', - ' (this package is deprecated, use eslint-plugin-svelte instead. More info: https://svelte.dev/docs/svelte/v4-migration-guide#new-eslint-package)' - ], - [ - 'typescript', - '^5.0.0', - ' (this might introduce new type errors due to breaking changes within TypeScript)' - ] - ]); -} - -/** - * @param {string} code - * @param {boolean} is_ts - */ -export function transform_code(code, is_ts) { - const project = new Project({ useInMemoryFileSystem: true }); - const source = project.createSourceFile('svelte.ts', code); - update_imports(source, is_ts); - update_typeof_svelte_component(source, is_ts); - update_action_types(source, is_ts); - update_action_return_types(source, is_ts); - return source.getFullText(); -} - -/** - * @param {string} code - * @param {boolean} migrate_transition - */ -export function transform_svelte_code(code, migrate_transition) { - code = update_svelte_options(code); - return update_transitions(code, migrate_transition); -} - -/** - * <svelte:options tag=".." /> -> <svelte:options customElement=".." /> - * @param {string} code - */ -function update_svelte_options(code) { - return code.replace(/<svelte:options([^]*?)\stag=([^]*?)\/?>/, (match) => { - log_migration( - 'Replaced `svelte:options` `tag` attribute with `customElement` attribute: https://svelte.dev/docs/svelte/v4-migration-guide#custom-elements-with-svelte' - ); - return match.replace('tag=', 'customElement='); - }); -} - -/** - * transition/in/out:x -> transition/in/out:x|global - * transition/in/out|local:x -> transition/in/out:x - * @param {string} code - * @param {boolean} migrate_transition - */ -function update_transitions(code, migrate_transition) { - if (migrate_transition) { - const replaced = code.replace(/(\s)(transition:|in:|out:)(\w+)(?=[\s>=])/g, '$1$2$3|global'); - if (replaced !== code) { - log_migration( - 'Added `|global` to `transition`, `in`, and `out` directives (transitions are local by default now): https://svelte.dev/docs/svelte/v4-migration-guide#transitions-are-local-by-default' - ); - } - code = replaced; - } - const replaced = code.replace(/(\s)(transition:|in:|out:)(\w+)(\|local)(?=[\s>=])/g, '$1$2$3'); - if (replaced !== code) { - log_migration( - 'Removed `|local` from `transition`, `in`, and `out` directives (transitions are local by default now): https://svelte.dev/docs/svelte/v4-migration-guide#transitions-are-local-by-default' - ); - } - return replaced; -} - -/** - * Action<T> -> Action<T, any> - * @param {import('ts-morph').SourceFile} source - * @param {boolean} is_ts - */ -function update_action_types(source, is_ts) { - const logger = log_on_ts_modification( - source, - 'Updated `Action` interface usages: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' - ); - - const imports = get_imports(source, 'svelte/action', 'Action'); - for (const namedImport of imports) { - const identifiers = find_identifiers(source, namedImport.getAliasNode()?.getText() ?? 'Action'); - for (const id of identifiers) { - const parent = id.getParent(); - if (Node.isTypeReference(parent)) { - const type_args = parent.getTypeArguments(); - if (type_args.length === 1) { - parent.addTypeArgument('any'); - } else if (type_args.length === 0) { - parent.addTypeArgument('HTMLElement'); - parent.addTypeArgument('any'); - } - } - } - } - - if (!is_ts) { - replaceInJsDoc(source, (text) => { - return text.replace( - /import\((['"])svelte\/action['"]\).Action(<\w+>)?(?=[^<\w]|$)/g, - (_, quote, type) => - `import(${quote}svelte/action${quote}).Action<${ - type ? type.slice(1, -1) + '' : 'HTMLElement' - }, any>` - ); - }); - } - - logger(); -} - -/** - * ActionReturn -> ActionReturn<any> - * @param {import('ts-morph').SourceFile} source - * @param {boolean} is_ts - */ -function update_action_return_types(source, is_ts) { - const logger = log_on_ts_modification( - source, - 'Updated `ActionReturn` interface usages: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' - ); - - const imports = get_imports(source, 'svelte/action', 'ActionReturn'); - for (const namedImport of imports) { - const identifiers = find_identifiers( - source, - namedImport.getAliasNode()?.getText() ?? 'ActionReturn' - ); - for (const id of identifiers) { - const parent = id.getParent(); - if (Node.isTypeReference(parent)) { - const type_args = parent.getTypeArguments(); - if (type_args.length === 0) { - parent.addTypeArgument('any'); - } - } - } - } - - if (!is_ts) { - replaceInJsDoc(source, (text) => { - return text.replace( - /import\((['"])svelte\/action['"]\).ActionReturn(?=[^<\w]|$)/g, - 'import($1svelte/action$1).ActionReturn<any>' - ); - }); - } - - logger(); -} - -/** - * SvelteComponentTyped -> SvelteComponent - * @param {import('ts-morph').SourceFile} source - * @param {boolean} is_ts - */ -function update_imports(source, is_ts) { - const logger = log_on_ts_modification( - source, - 'Replaced `SvelteComponentTyped` imports with `SvelteComponent` imports: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' - ); - - const identifiers = find_identifiers(source, 'SvelteComponent'); - const can_rename = identifiers.every((id) => { - const parent = id.getParent(); - return ( - (Node.isImportSpecifier(parent) && - !parent.getAliasNode() && - parent - .getParent() - .getParent() - .getParentIfKind(SyntaxKind.ImportDeclaration) - ?.getModuleSpecifier() - .getText() === 'svelte') || - !is_declaration(parent) - ); - }); - - const imports = get_imports(source, 'svelte', 'SvelteComponentTyped'); - for (const namedImport of imports) { - if (can_rename) { - namedImport.renameAlias('SvelteComponent'); - if ( - namedImport - .getParent() - .getElements() - .some((e) => !e.getAliasNode() && e.getNameNode().getText() === 'SvelteComponent') - ) { - namedImport.remove(); - } else { - namedImport.setName('SvelteComponent'); - namedImport.removeAlias(); - } - } else { - namedImport.renameAlias('SvelteComponentTyped'); - namedImport.setName('SvelteComponent'); - } - } - - if (!is_ts) { - replaceInJsDoc(source, (text) => { - return text.replace( - /import\((['"])svelte['"]\)\.SvelteComponentTyped(?=\W|$)/g, - 'import($1svelte$1).SvelteComponent' - ); - }); - } - - logger(); -} - -/** - * typeof SvelteComponent -> typeof SvelteComponent<any> - * @param {import('ts-morph').SourceFile} source - * @param {boolean} is_ts - */ -function update_typeof_svelte_component(source, is_ts) { - const logger = log_on_ts_modification( - source, - 'Adjusted `typeof SvelteComponent` to `typeof SvelteComponent<any>`: https://svelte.dev/docs/svelte/v4-migration-guide#stricter-types-for-svelte-functions' - ); - - const imports = get_imports(source, 'svelte', 'SvelteComponent'); - - for (const type of imports) { - if (type) { - const name = type.getAliasNode() ?? type.getNameNode(); - if (Node.isIdentifier(name)) { - name.findReferencesAsNodes().forEach((ref) => { - const parent = ref.getParent(); - if (parent && Node.isTypeQuery(parent)) { - const id = parent.getFirstChildByKind(ts.SyntaxKind.Identifier); - if (id?.getText() === name.getText()) { - const typeArguments = parent.getTypeArguments(); - if (typeArguments.length === 0) { - parent.addTypeArgument('any'); - } - } - } - }); - } - } - } - - if (!is_ts) { - replaceInJsDoc(source, (text) => { - return text.replace( - /typeof import\((['"])svelte['"]\)\.SvelteComponent(?=[^<\w]|$)/g, - 'typeof import($1svelte$1).SvelteComponent<any>' - ); - }); - } - - logger(); -} - -/** - * @param {import('ts-morph').SourceFile} source - * @param {string} from - * @param {string} name - */ -function get_imports(source, from, name) { - return source - .getImportDeclarations() - .filter((i) => i.getModuleSpecifierValue() === from) - .flatMap((i) => i.getNamedImports()) - .filter((i) => i.getName() === name); -} - -/** - * @param {import('ts-morph').SourceFile} source - * @param {string} name - */ -function find_identifiers(source, name) { - return source.getDescendantsOfKind(ts.SyntaxKind.Identifier).filter((i) => i.getText() === name); -} - -/** - * Does not include imports - * @param {Node} node - */ -function is_declaration(node) { - return ( - Node.isVariableDeclaration(node) || - Node.isFunctionDeclaration(node) || - Node.isClassDeclaration(node) || - Node.isTypeAliasDeclaration(node) || - Node.isInterfaceDeclaration(node) - ); -} - -/** - * @param {import('ts-morph').SourceFile} source - * @param {(text: string) => string | undefined} replacer - */ -function replaceInJsDoc(source, replacer) { - source.forEachChild((node) => { - if (Node.isJSDocable(node)) { - const tags = node.getJsDocs().flatMap((jsdoc) => jsdoc.getTags()); - tags.forEach((t) => - t.forEachChild((c) => { - if (Node.isJSDocTypeExpression(c)) { - const text = c.getText().slice(1, -1); - const replacement = replacer(text); - if (replacement && replacement !== text) { - c.replaceWithText(`{${replacement}}`); - } - } - }) - ); - } - }); -} diff --git a/packages/migrate/migrations/svelte-4/migrate.spec.js b/packages/migrate/migrations/svelte-4/migrate.spec.js deleted file mode 100644 index f0c34cddd1da..000000000000 --- a/packages/migrate/migrations/svelte-4/migrate.spec.js +++ /dev/null @@ -1,382 +0,0 @@ -import { assert, test } from 'vitest'; -import { transform_code, transform_svelte_code, update_pkg_json_content } from './migrate.js'; - -test('Updates SvelteComponentTyped #1', () => { - const result = transform_code( - `import { SvelteComponentTyped } from 'svelte'; - -export class Foo extends SvelteComponentTyped<{}> {} - -const bar: SvelteComponentTyped = null;`, - true - ); - assert.equal( - result, - `import { SvelteComponent } from 'svelte'; - -export class Foo extends SvelteComponent<{}> {} - -const bar: SvelteComponent = null;` - ); -}); - -test('Updates SvelteComponentTyped #2', () => { - const result = transform_code( - `import { SvelteComponentTyped, SvelteComponent } from 'svelte'; - -export class Foo extends SvelteComponentTyped<{}> {} - -const bar: SvelteComponentTyped = null; -const baz: SvelteComponent = null;`, - true - ); - assert.equal( - result, - `import { SvelteComponent } from 'svelte'; - -export class Foo extends SvelteComponent<{}> {} - -const bar: SvelteComponent = null; -const baz: SvelteComponent = null;` - ); -}); - -test('Updates SvelteComponentTyped #3', () => { - const result = transform_code( - `import { SvelteComponentTyped } from 'svelte'; - -interface SvelteComponent {} - -export class Foo extends SvelteComponentTyped<{}> {} - -const bar: SvelteComponentTyped = null; -const baz: SvelteComponent = null;`, - true - ); - assert.equal( - result, - `import { SvelteComponent as SvelteComponentTyped } from 'svelte'; - -interface SvelteComponent {} - -export class Foo extends SvelteComponentTyped<{}> {} - -const bar: SvelteComponentTyped = null; -const baz: SvelteComponent = null;` - ); -}); - -test('Updates SvelteComponentTyped (jsdoc)', () => { - const result = transform_code( - ` - /** @type {import('svelte').SvelteComponentTyped} */ - const bar = null; - /** @type {import('svelte').SvelteComponentTyped<any>} */ - const baz = null; - `, - false - ); - assert.equal( - result, - ` - /** @type {import('svelte').SvelteComponent} */ - const bar = null; - /** @type {import('svelte').SvelteComponent<any>} */ - const baz = null; - ` - ); -}); - -test('Updates typeof SvelteComponent', () => { - const result = transform_code( - `import { SvelteComponent } from 'svelte'; - import { SvelteComponent as C } from 'svelte'; - - const a: typeof SvelteComponent = null; - function b(c: typeof SvelteComponent) {} - const c: typeof SvelteComponent<any> = null; - const d: typeof C = null; - `, - true - ); - assert.equal( - result, - `import { SvelteComponent } from 'svelte'; - import { SvelteComponent as C } from 'svelte'; - - const a: typeof SvelteComponent<any> = null; - function b(c: typeof SvelteComponent<any>) {} - const c: typeof SvelteComponent<any> = null; - const d: typeof C<any> = null; - ` - ); -}); - -test('Updates typeof SvelteComponent (jsdoc)', () => { - const result = transform_code( - ` - /** @type {typeof import('svelte').SvelteComponent} */ - const a = null; - /** @type {typeof import('svelte').SvelteComponent<any>} */ - const c = null; - /** @type {typeof C} */ - const d: typeof C = null; - `, - false - ); - assert.equal( - result, - ` - /** @type {typeof import('svelte').SvelteComponent<any>} */ - const a = null; - /** @type {typeof import('svelte').SvelteComponent<any>} */ - const c = null; - /** @type {typeof C} */ - const d: typeof C = null; - ` - ); -}); - -test('Updates Action and ActionReturn', () => { - const result = transform_code( - `import type { Action, ActionReturn } from 'svelte/action'; - - const a: Action = () => {}; - const b: Action<HTMLDivElement> = () => {}; - const c: Action<HTMLDivElement, true> = () => {}; - const d: Action<HTMLDivElement, true, {}> = () => {}; - const e: ActionReturn = () => {}; - const f: ActionReturn<true> = () => {}; - const g: ActionReturn<true, {}> = () => {}; - `, - true - ); - assert.equal( - result, - - `import type { Action, ActionReturn } from 'svelte/action'; - - const a: Action<HTMLElement, any> = () => {}; - const b: Action<HTMLDivElement, any> = () => {}; - const c: Action<HTMLDivElement, true> = () => {}; - const d: Action<HTMLDivElement, true, {}> = () => {}; - const e: ActionReturn<any> = () => {}; - const f: ActionReturn<true> = () => {}; - const g: ActionReturn<true, {}> = () => {}; - ` - ); -}); - -test('Updates Action and ActionReturn (jsdoc)', () => { - const result = transform_code( - ` - /** @type {import('svelte/action').Action} */ - const a = () => {}; - /** @type {import('svelte/action').Action<HTMLDivElement>} */ - const b = () => {}; - /** @type {import('svelte/action').Action<HTMLDivElement, true>} */ - const c = () => {}; - /** @type {import('svelte/action').Action<HTMLDivElement, true, {}>} */ - const d = () => {}; - /** @type {import('svelte/action').ActionReturn} */ - const e = () => {}; - /** @type {import('svelte/action').ActionReturn<true>} */ - const f = () => {}; - /** @type {import('svelte/action').ActionReturn<true, {}>} */ - const g = () => {}; - `, - false - ); - assert.equal( - result, - - ` - /** @type {import('svelte/action').Action<HTMLElement, any>} */ - const a = () => {}; - /** @type {import('svelte/action').Action<HTMLDivElement, any>} */ - const b = () => {}; - /** @type {import('svelte/action').Action<HTMLDivElement, true>} */ - const c = () => {}; - /** @type {import('svelte/action').Action<HTMLDivElement, true, {}>} */ - const d = () => {}; - /** @type {import('svelte/action').ActionReturn<any>} */ - const e = () => {}; - /** @type {import('svelte/action').ActionReturn<true>} */ - const f = () => {}; - /** @type {import('svelte/action').ActionReturn<true, {}>} */ - const g = () => {}; - ` - ); -}); - -test('Updates svelte:options #1', () => { - const result = transform_svelte_code( - `<svelte:options tag="asd-asd" /> - - <div>hi</div>`, - true - ); - assert.equal( - result, - `<svelte:options customElement="asd-asd" /> - - <div>hi</div>` - ); -}); - -test('Updates svelte:options #2', () => { - const result = transform_svelte_code( - `<script> - export let foo; - </script> - - <svelte:options - immutable={true} - tag="asd-asd"></svelte:options> - - <div>hi</div>`, - true - ); - assert.equal( - result, - `<script> - export let foo; - </script> - - <svelte:options - immutable={true} - customElement="asd-asd"></svelte:options> - - <div>hi</div>` - ); -}); - -test('Updates transitions', () => { - const result = transform_svelte_code( - `<div transition:fade /> - <div transition:fade={true} /> - <div transition:fade></div> - <div transition:fade|local /> - <div in:fade /> - <div in:fade={true} /> - <div in:fade></div> - <div in:fade|local /> - <div out:fade /> - <div out:fade={true} /> - <div out:fade></div> - <div out:fade|local /> - - <div transitionn:fade /> - <div allin:fade /> - `, - true - ); - assert.equal( - result, - `<div transition:fade|global /> - <div transition:fade|global={true} /> - <div transition:fade|global></div> - <div transition:fade /> - <div in:fade|global /> - <div in:fade|global={true} /> - <div in:fade|global></div> - <div in:fade /> - <div out:fade|global /> - <div out:fade|global={true} /> - <div out:fade|global></div> - <div out:fade /> - - <div transitionn:fade /> - <div allin:fade /> - ` - ); -}); - -test('Updates transitions #2', () => { - const result = transform_svelte_code( - `<div transition:fade /> - <div transition:fade={true} /> - <div transition:fade></div> - <div transition:fade|local /> - <div in:fade /> - <div in:fade={true} /> - <div in:fade></div> - <div in:fade|local /> - <div out:fade /> - <div out:fade={true} /> - <div out:fade></div> - <div out:fade|local /> - - <div transitionn:fade /> - <div allin:fade /> - `, - false - ); - assert.equal( - result, - `<div transition:fade /> - <div transition:fade={true} /> - <div transition:fade></div> - <div transition:fade /> - <div in:fade /> - <div in:fade={true} /> - <div in:fade></div> - <div in:fade /> - <div out:fade /> - <div out:fade={true} /> - <div out:fade></div> - <div out:fade /> - - <div transitionn:fade /> - <div allin:fade /> - ` - ); -}); - -test('Update package.json', () => { - const result = update_pkg_json_content(`{ - "name": "svelte-app", - "version": "1.0.0", - "devDependencies": { - "svelte": "^3.0.0", - "svelte-check": "^1.0.0", - "svelte-preprocess": "^5.0.0" - }, - "dependencies": { - "@sveltejs/kit": "^1.0.0" - } -}`); - assert.equal( - result, - `{ - "name": "svelte-app", - "version": "1.0.0", - "devDependencies": { - "svelte": "^4.0.0", - "svelte-check": "^3.4.3", - "svelte-preprocess": "^5.0.3" - }, - "dependencies": { - "@sveltejs/kit": "^1.20.4" - } -}` - ); -}); - -test('Does not downgrade versions', () => { - const result = update_pkg_json_content(`{ - "devDependencies": { - "svelte": "^4.0.5", - "typescript": "github:idk" - } -}`); - assert.equal( - result, - `{ - "devDependencies": { - "svelte": "^4.0.5", - "typescript": "github:idk" - } -}` - ); -}); diff --git a/packages/migrate/migrations/svelte-5/index.js b/packages/migrate/migrations/svelte-5/index.js deleted file mode 100644 index a6b17d421232..000000000000 --- a/packages/migrate/migrations/svelte-5/index.js +++ /dev/null @@ -1,216 +0,0 @@ -import { resolve } from 'import-meta-resolve'; -import colors from 'kleur'; -import { execSync } from 'node:child_process'; -import process from 'node:process'; -import fs from 'node:fs'; -import { dirname } from 'node:path'; -import { fileURLToPath, pathToFileURL } from 'node:url'; -import prompts from 'prompts'; -import semver from 'semver'; -import glob from 'tiny-glob/sync.js'; -import { bail, check_git, update_js_file, update_svelte_file } from '../../utils.js'; -import { migrate as migrate_svelte_4 } from '../svelte-4/index.js'; -import { migrate as migrate_sveltekit_2 } from '../sveltekit-2/index.js'; -import { transform_module_code, transform_svelte_code, update_pkg_json } from './migrate.js'; - -export async function migrate() { - if (!fs.existsSync('package.json')) { - bail('Please re-run this script in a directory with a package.json'); - } - - console.log( - 'This migration is experimental — please report any bugs to https://github.com/sveltejs/svelte/issues' - ); - - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - - const svelte_dep = pkg.devDependencies?.svelte ?? pkg.dependencies?.svelte; - if (svelte_dep && semver.validRange(svelte_dep) && semver.gtr('4.0.0', svelte_dep)) { - console.log( - colors - .bold() - .yellow( - '\nDetected Svelte 3. You need to upgrade to Svelte version 4 first (`npx sv migrate svelte-4`).\n' - ) - ); - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Run svelte-4 migration now?', - initial: false - }); - if (!response.value) { - process.exit(1); - } else { - await migrate_svelte_4(); - console.log( - colors - .bold() - .green( - 'svelte-4 migration complete. Check that everything is ok, then run `npx sv migrate svelte-5` again to continue the Svelte 5 migration.\n' - ) - ); - process.exit(0); - } - } - - const kit_dep = pkg.devDependencies?.['@sveltejs/kit'] ?? pkg.dependencies?.['@sveltejs/kit']; - if (kit_dep && semver.validRange(kit_dep) && semver.gtr('2.0.0', kit_dep)) { - console.log( - colors - .bold() - .yellow( - '\nDetected SvelteKit 1. You need to upgrade to SvelteKit version 2 first (`npx sv migrate sveltekit-2`).\n' - ) - ); - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Run sveltekit-2 migration now?', - initial: false - }); - if (!response.value) { - process.exit(1); - } else { - await migrate_sveltekit_2(); - console.log( - colors - .bold() - .green( - 'sveltekit-2 migration complete. Check that everything is ok, then run `npx sv migrate svelte-5` again to continue the Svelte 5 migration.\n' - ) - ); - process.exit(0); - } - } - - let migrate; - try { - try { - ({ migrate } = await import_from_cwd('svelte/compiler')); - if (!migrate) throw new Error('found Svelte 4'); - } catch { - execSync('npm install svelte@^5.0.0 --no-save', { - stdio: 'inherit', - cwd: dirname(fileURLToPath(import.meta.url)) - }); - const url = resolve('svelte/compiler', import.meta.url); - ({ migrate } = await import(url)); - } - } catch (e) { - console.log(e); - console.log( - colors - .bold() - .red( - '❌ Could not install Svelte. Manually bump the dependency to version 5 in your package.json, install it, then try again.' - ) - ); - return; - } - - console.log( - colors - .bold() - .yellow( - '\nThis will update files in the current directory\n' + - "If you're inside a monorepo, don't run this in the root directory, rather run it in all projects independently.\n" - ) - ); - - const use_git = check_git(); - - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Continue?', - initial: false - }); - - if (!response.value) { - process.exit(1); - } - - const folders = await prompts({ - type: 'multiselect', - name: 'value', - message: 'Which folders should be migrated?', - choices: fs - .readdirSync('.') - .filter( - (dir) => fs.statSync(dir).isDirectory() && dir !== 'node_modules' && !dir.startsWith('.') - ) - .map((dir) => ({ title: dir, value: dir, selected: true })) - }); - - if (!folders.value?.length) { - process.exit(1); - } - - update_pkg_json(); - - const use_ts = fs.existsSync('tsconfig.json'); - - // const { default: config } = fs.existsSync('svelte.config.js') - // ? await import(pathToFileURL(path.resolve('svelte.config.js')).href) - // : { default: {} }; - - /** @type {string[]} */ - const svelte_extensions = /* config.extensions ?? - disabled because it would break .svx */ [ - '.svelte' - ]; - const extensions = [...svelte_extensions, '.ts', '.js']; - // For some reason {folders.value.join(',')} as part of the glob doesn't work and returns less files - const files = folders.value.flatMap( - /** @param {string} folder */ (folder) => - glob(`${folder}/**`, { filesOnly: true, dot: true }) - .map((file) => file.replace(/\\/g, '/')) - .filter((file) => !file.includes('/node_modules/')) - ); - - for (const file of files) { - if (extensions.some((ext) => file.endsWith(ext))) { - if (svelte_extensions.some((ext) => file.endsWith(ext))) { - update_svelte_file(file, transform_module_code, (code) => - transform_svelte_code(code, migrate, { filename: file, use_ts }) - ); - } else { - update_js_file(file, transform_module_code); - } - } - } - - console.log(colors.bold().green('✔ Your project has been migrated')); - - console.log('\nRecommended next steps:\n'); - - const cyan = colors.bold().cyan; - - const tasks = [ - "install the updated dependencies ('npm i' / 'pnpm i' / etc) " + - '(note that there may be peer dependency issues when not all your libraries officially support Svelte 5 yet. In this case try installing with the --force option)', - use_git && cyan('git commit -m "migration to Svelte 5"'), - 'Review the breaking changes at https://svelte-5-preview.vercel.app/docs/breaking-changes' - // replace with this once it's live: - // 'Review the migration guide at https://svelte.dev/docs/svelte/v5-migration-guide', - // 'Read the updated docs at https://svelte.dev/docs/svelte' - ].filter(Boolean); - - tasks.forEach((task, i) => { - console.log(` ${i + 1}: ${task}`); - }); - - console.log(''); - - if (use_git) { - console.log(`Run ${cyan('git diff')} to review changes.\n`); - } -} - -/** @param {string} name */ -function import_from_cwd(name) { - const cwd = pathToFileURL(process.cwd()).href; - const url = resolve(name, cwd + '/x.js'); - - return import(url); -} diff --git a/packages/migrate/migrations/svelte-5/migrate.js b/packages/migrate/migrations/svelte-5/migrate.js deleted file mode 100644 index eb9e750f46a0..000000000000 --- a/packages/migrate/migrations/svelte-5/migrate.js +++ /dev/null @@ -1,129 +0,0 @@ -import fs from 'node:fs'; -import { Project, ts, Node } from 'ts-morph'; -import { add_named_import, update_pkg } from '../../utils.js'; - -export function update_pkg_json() { - fs.writeFileSync( - 'package.json', - update_pkg_json_content(fs.readFileSync('package.json', 'utf8')) - ); -} - -/** - * @param {string} content - */ -export function update_pkg_json_content(content) { - return update_pkg(content, [ - ['svelte', '^5.0.0'], - ['svelte-check', '^4.0.0'], - ['svelte-preprocess', '^6.0.0'], - ['@sveltejs/enhanced-img', '^0.3.9'], - ['@sveltejs/kit', '^2.5.27'], - ['@sveltejs/vite-plugin-svelte', '^4.0.0'], - [ - 'svelte-loader', - '^3.2.3', - ' (if you are still on webpack 4, you need to update to webpack 5)' - ], - ['rollup-plugin-svelte', '^7.2.2'], - ['prettier', '^3.1.0'], - ['prettier-plugin-svelte', '^3.2.6'], - ['eslint-plugin-svelte', '^2.45.1'], - ['svelte-eslint-parser', '^0.42.0'], - [ - 'eslint-plugin-svelte3', - '^4.0.0', - ' (this package is deprecated, use eslint-plugin-svelte instead. More info: https://svelte.dev/docs/svelte/v4-migration-guide#new-eslint-package)' - ], - [ - 'typescript', - '^5.5.0', - ' (this might introduce new type errors due to breaking changes within TypeScript)' - ], - ['vite', '^5.4.4'] - ]); -} - -/** - * @param {string} code - */ -export function transform_module_code(code) { - const project = new Project({ useInMemoryFileSystem: true }); - const source = project.createSourceFile('svelte.ts', code); - update_component_instantiation(source); - return source.getFullText(); -} - -/** - * @param {string} code - * @param {(source: string, options: { filename?: string, use_ts?: boolean }) => { code: string }} transform_code - * @param {{ filename?: string, use_ts?: boolean }} options - */ -export function transform_svelte_code(code, transform_code, options) { - return transform_code(code, options).code; -} - -/** - * new Component(...) -> mount(Component, ...) - * @param {import('ts-morph').SourceFile} source - */ -function update_component_instantiation(source) { - const imports = source - .getImportDeclarations() - .filter((i) => i.getModuleSpecifierValue().endsWith('.svelte')) - .flatMap((i) => i.getDefaultImport() || []); - - for (const defaultImport of imports) { - const identifiers = find_identifiers(source, defaultImport.getText()); - - for (const id of identifiers) { - const parent = id.getParent(); - - if (Node.isNewExpression(parent)) { - const args = parent.getArguments(); - - if (args.length === 1) { - const method = - Node.isObjectLiteralExpression(args[0]) && !!args[0].getProperty('hydrate') - ? 'hydrate' - : 'mount'; - - if (method === 'hydrate') { - /** @type {import('ts-morph').ObjectLiteralExpression} */ (args[0]) - .getProperty('hydrate') - ?.remove(); - } - - add_named_import(source, 'svelte', method); - - const declaration = parent - .getParentIfKind(ts.SyntaxKind.VariableDeclaration) - ?.getNameNode(); - if (Node.isIdentifier(declaration)) { - const usages = declaration.findReferencesAsNodes(); - for (const usage of usages) { - const parent = usage.getParent(); - if (Node.isPropertyAccessExpression(parent) && parent.getName() === '$destroy') { - const call_expr = parent.getParentIfKind(ts.SyntaxKind.CallExpression); - if (call_expr) { - call_expr.replaceWithText(`unmount(${usage.getText()})`); - add_named_import(source, 'svelte', 'unmount'); - } - } - } - } - - parent.replaceWithText(`${method}(${id.getText()}, ${args[0].getText()})`); - } - } - } - } -} - -/** - * @param {import('ts-morph').SourceFile} source - * @param {string} name - */ -function find_identifiers(source, name) { - return source.getDescendantsOfKind(ts.SyntaxKind.Identifier).filter((i) => i.getText() === name); -} diff --git a/packages/migrate/migrations/svelte-5/migrate.spec.js b/packages/migrate/migrations/svelte-5/migrate.spec.js deleted file mode 100644 index 0f9e3e6d4db6..000000000000 --- a/packages/migrate/migrations/svelte-5/migrate.spec.js +++ /dev/null @@ -1,135 +0,0 @@ -import { assert, test } from 'vitest'; -import { transform_module_code, update_pkg_json_content } from './migrate.js'; - -test('Updates component creation #1', () => { - const result = transform_module_code( - `import App from './App.svelte' - -const app = new App({ - target: document.getElementById('app')! -}) - -export default app` - ); - assert.equal( - result, - `import App from './App.svelte' -import { mount } from "svelte"; - -const app = mount(App, { - target: document.getElementById('app')! -}) - -export default app` - ); -}); - -test('Updates component creation #2', () => { - const result = transform_module_code( - `import App from './App.svelte' - -new App({ - target: document.getElementById('app')!, - hydrate: true -})` - ); - assert.equal( - result, - `import App from './App.svelte' -import { hydrate } from "svelte"; - -hydrate(App, { - target: document.getElementById('app')! -})` - ); -}); - -test('Updates component creation #3', () => { - const result = transform_module_code( - `import App from './App.svelte' - -const x = new App({ - target: document.getElementById('app')! -}); - -function destroy() { - x.$destroy(); -} -` - ); - assert.equal( - result, - `import App from './App.svelte' -import { mount, unmount } from "svelte"; - -const x = mount(App, { - target: document.getElementById('app')! -}); - -function destroy() { - unmount(x); -} -` - ); -}); - -test('Updates component creation with multiple components', () => { - const result = transform_module_code( - `import App from './App.svelte'; -import Child from './Child.svelte'; - -const x = new App({ - target: document.getElementById('app')! -}); -const y = new Child({ - target: document.getElementById('child')! -}); -` - ); - assert.equal( - result, - `import App from './App.svelte'; -import Child from './Child.svelte'; -import { mount } from "svelte"; - -const x = mount(App, { - target: document.getElementById('app')! -}); -const y = mount(Child, { - target: document.getElementById('child')! -}); -` - ); -}); - -test('Update package.json', () => { - const result = update_pkg_json_content(`{ - "name": "svelte-app", - "version": "1.0.0", - "devDependencies": { - "svelte": "^4.0.0", - "svelte-check": "^3.0.0", - "svelte-preprocess": "^5.0.0", - "svelte-eslint-parser": "^0.41.1" - }, - "dependencies": { - "@sveltejs/kit": "^2.0.0" - } -}`); - assert.equal( - result, - `{ - "name": "svelte-app", - "version": "1.0.0", - "devDependencies": { - "svelte": "^5.0.0", - "svelte-check": "^4.0.0", - "svelte-preprocess": "^6.0.0", - "svelte-eslint-parser": "^0.42.0" - }, - "dependencies": { - "@sveltejs/kit": "^2.5.27" - } -}` - ); -}); diff --git a/packages/migrate/migrations/sveltekit-2/index.js b/packages/migrate/migrations/sveltekit-2/index.js deleted file mode 100644 index c62442aba5b2..000000000000 --- a/packages/migrate/migrations/sveltekit-2/index.js +++ /dev/null @@ -1,167 +0,0 @@ -import colors from 'kleur'; -import fs from 'node:fs'; -import process from 'node:process'; -import prompts from 'prompts'; -import semver from 'semver'; -import glob from 'tiny-glob/sync.js'; -import { - bail, - check_git, - update_js_file, - update_svelte_file, - update_tsconfig -} from '../../utils.js'; -import { migrate as migrate_svelte_4 } from '../svelte-4/index.js'; -import { - transform_code, - update_pkg_json, - update_svelte_config, - update_tsconfig_content -} from './migrate.js'; - -export async function migrate() { - if (!fs.existsSync('package.json')) { - bail('Please re-run this script in a directory with a package.json'); - } - - if (!fs.existsSync('svelte.config.js')) { - bail('Please re-run this script in a directory with a svelte.config.js'); - } - - console.log( - colors - .bold() - .yellow( - '\nThis will update files in the current directory\n' + - "If you're inside a monorepo, run this in individual project directories rather than the workspace root.\n" - ) - ); - - const use_git = check_git(); - - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Continue?', - initial: false - }); - - if (!response.value) { - process.exit(1); - } - - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - const svelte_dep = pkg.devDependencies?.svelte ?? pkg.dependencies?.svelte; - if (svelte_dep === undefined) { - bail('Please install Svelte before continuing'); - } - - if (semver.validRange(svelte_dep) && semver.gtr('4.0.0', svelte_dep)) { - console.log( - colors - .bold() - .yellow( - '\nSvelteKit 2 requires Svelte 4 or newer. We recommend running the `svelte-4` migration first (`npx sv migrate svelte-4`).\n' - ) - ); - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Run `svelte-4` migration now?', - initial: false - }); - if (!response.value) { - process.exit(1); - } else { - await migrate_svelte_4(); - console.log( - colors - .bold() - .green('`svelte-4` migration complete. Continue with `sveltekit-2` migration?\n') - ); - const response = await prompts({ - type: 'confirm', - name: 'value', - message: 'Continue?', - initial: false - }); - if (!response.value) { - process.exit(1); - } - } - } - - const folders = await prompts({ - type: 'multiselect', - name: 'value', - message: 'Which folders should be migrated?', - choices: fs - .readdirSync('.') - .filter( - (dir) => - fs.statSync(dir).isDirectory() && - dir !== 'node_modules' && - dir !== 'dist' && - !dir.startsWith('.') - ) - .map((dir) => ({ title: dir, value: dir, selected: dir === 'src' })) - }); - - if (!folders.value?.length) { - process.exit(1); - } - - update_pkg_json(); - update_tsconfig(update_tsconfig_content); - update_svelte_config(); - - // const { default: config } = fs.existsSync('svelte.config.js') - // ? await import(pathToFileURL(path.resolve('svelte.config.js')).href) - // : { default: {} }; - - /** @type {string[]} */ - const svelte_extensions = /* config.extensions ?? - disabled because it would break .svx */ [ - '.svelte' - ]; - const extensions = [...svelte_extensions, '.ts', '.js']; - // For some reason {folders.value.join(',')} as part of the glob doesn't work and returns less files - const files = folders.value.flatMap( - /** @param {string} folder */ (folder) => - glob(`${folder}/**`, { filesOnly: true, dot: true }) - .map((file) => file.replace(/\\/g, '/')) - .filter((file) => !file.includes('/node_modules/')) - ); - - for (const file of files) { - if (extensions.some((ext) => file.endsWith(ext))) { - if (svelte_extensions.some((ext) => file.endsWith(ext))) { - update_svelte_file(file, transform_code, (code) => code); - } else { - update_js_file(file, transform_code); - } - } - } - - console.log(colors.bold().green('✔ Your project has been migrated')); - - console.log('\nRecommended next steps:\n'); - - const cyan = colors.bold().cyan; - - const tasks = [ - 'Run npm install (or the corresponding installation command of your package manager)', - use_git && cyan('git commit -m "migration to SvelteKit 2"'), - 'Review the migration guide at https://svelte.dev/docs/kit/migrating-to-sveltekit-2', - 'Read the updated docs at https://svelte.dev/docs/kit' - ].filter(Boolean); - - tasks.forEach((task, i) => { - console.log(` ${i + 1}: ${task}`); - }); - - console.log(''); - - if (use_git) { - console.log(`Run ${cyan('git diff')} to review changes.\n`); - } -} diff --git a/packages/migrate/migrations/sveltekit-2/migrate.js b/packages/migrate/migrations/sveltekit-2/migrate.js deleted file mode 100644 index 9657be37d480..000000000000 --- a/packages/migrate/migrations/sveltekit-2/migrate.js +++ /dev/null @@ -1,318 +0,0 @@ -import fs from 'node:fs'; -import { Project, Node, SyntaxKind } from 'ts-morph'; -import { - add_named_import, - log_migration, - log_on_ts_modification, - update_pkg -} from '../../utils.js'; -import path from 'node:path'; - -export function update_pkg_json() { - fs.writeFileSync( - 'package.json', - update_pkg_json_content(fs.readFileSync('package.json', 'utf8')) - ); -} - -/** - * @param {string} content - */ -export function update_pkg_json_content(content) { - return update_pkg(content, [ - // All other bumps are done as part of the Svelte 4 migration - ['@sveltejs/kit', '^2.0.0'], - ['@sveltejs/adapter-static', '^3.0.0'], - ['@sveltejs/adapter-node', '^2.0.0'], - ['@sveltejs/adapter-vercel', '^4.0.0'], - ['@sveltejs/adapter-netlify', '^3.0.0'], - ['@sveltejs/adapter-cloudflare', '^3.0.0'], - ['@sveltejs/adapter-cloudflare-workers', '^2.0.0'], - ['@sveltejs/adapter-auto', '^3.0.0'], - ['vite', '^5.0.0'], - ['vitest', '^1.0.0'], - ['typescript', '^5.0.0'], // should already be done by Svelte 4 migration, but who knows - [ - '@sveltejs/vite-plugin-svelte', - '^3.0.0', - ' (vite-plugin-svelte is a peer dependency of SvelteKit now)', - 'devDependencies' - ] - ]); -} - -/** @param {string} content */ -export function update_tsconfig_content(content) { - if (!content.includes('"extends"')) { - // Don't touch the tsconfig if people opted out of our default config - return content; - } - - let updated = content - .split('\n') - .filter( - (line) => !line.includes('importsNotUsedAsValues') && !line.includes('preserveValueImports') - ) - .join('\n'); - if (updated !== content) { - log_migration( - 'Removed deprecated `importsNotUsedAsValues` and `preserveValueImports`' + - ' from tsconfig.json: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#updated-dependency-requirements' - ); - } - - content = updated; - updated = content.replace('"moduleResolution": "node"', '"moduleResolution": "bundler"'); - if (updated !== content) { - log_migration( - 'Updated `moduleResolution` to `bundler`' + - ' in tsconfig.json: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#updated-dependency-requirements' - ); - } - - if (content.includes('"paths":') || content.includes('"baseUrl":')) { - log_migration( - '`paths` and/or `baseUrl` detected in your tsconfig.json - remove it and use `kit.alias` instead: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#generated-tsconfig-json-is-more-strict' - ); - } - - return updated; -} - -export function update_svelte_config() { - fs.writeFileSync( - 'svelte.config.js', - update_svelte_config_content(fs.readFileSync('svelte.config.js', 'utf8')) - ); -} - -/** - * @param {string} code - */ -export function update_svelte_config_content(code) { - const regex = /\s*dangerZone:\s*{[^}]*},?/g; - const result = code.replace(regex, ''); - if (result !== code) { - log_migration( - 'Removed `dangerZone` from svelte.config.js: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#server-fetches-are-not-trackable-anymore' - ); - } - - const project = new Project({ useInMemoryFileSystem: true }); - const source = project.createSourceFile('svelte.ts', result); - - const namedImport = get_import(source, '@sveltejs/kit/vite', 'vitePreprocess'); - if (!namedImport) return result; - - const logger = log_on_ts_modification( - source, - 'Changed `vitePreprocess` import: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#vitepreprocess-is-no-longer-exported-from-sveltejs-kit-vite' - ); - - if (namedImport.getParent().getParent().getNamedImports().length === 1) { - namedImport - .getParent() - .getParent() - .getParentIfKind(SyntaxKind.ImportDeclaration) - ?.setModuleSpecifier('@sveltejs/vite-plugin-svelte'); - } else { - namedImport.remove(); - add_named_import(source, '@sveltejs/vite-plugin-svelte', 'vitePreprocess'); - } - - logger(); - return source.getFullText(); -} - -/** - * @param {string} code - * @param {boolean} _is_ts - * @param {string} file_path - */ -export function transform_code(code, _is_ts, file_path) { - const project = new Project({ useInMemoryFileSystem: true }); - const source = project.createSourceFile('svelte.ts', code); - remove_throws(source); - add_cookie_note(file_path, source); - replace_resolve_path(source); - return source.getFullText(); -} - -/** - * `throw redirect(..)` -> `redirect(..)` - * @param {import('ts-morph').SourceFile} source - */ -function remove_throws(source) { - const logger = log_on_ts_modification( - source, - 'Removed `throw` from redirect/error functions: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#redirect-and-error-are-no-longer-thrown-by-you' - ); - - /** @param {string} id */ - function remove_throw(id) { - const named_import = get_import(source, '@sveltejs/kit', id); - if (!named_import) return; - const name_node = named_import.getNameNode(); - if (Node.isIdentifier(name_node)) { - for (const id of name_node.findReferencesAsNodes()) { - const call_expression = id.getParent(); - const throw_stmt = call_expression?.getParent(); - if (Node.isCallExpression(call_expression) && Node.isThrowStatement(throw_stmt)) { - throw_stmt.replaceWithText((writer) => { - writer.setIndentationLevel(0); - writer.write(call_expression.getText() + ';'); - }); - } - } - } - } - - remove_throw('redirect'); - remove_throw('error'); - - logger(); -} - -/** - * Adds `path` option to `cookies.set/delete/serialize` calls - * @param {string} file_path - * @param {import('ts-morph').SourceFile} source - */ -function add_cookie_note(file_path, source) { - const basename = path.basename(file_path); - if ( - basename !== '+page.js' && - basename !== '+page.ts' && - basename !== '+page.server.js' && - basename !== '+page.server.ts' && - basename !== '+server.js' && - basename !== '+server.ts' && - basename !== 'hooks.server.js' && - basename !== 'hooks.server.ts' - ) { - return; - } - - const logger = log_on_ts_modification( - source, - 'Search codebase for `@migration` and manually add the `path` option to `cookies.set/delete/serialize` calls: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#path-is-now-a-required-option-for-cookies' - ); - - const calls = []; - - for (const call of source.getDescendantsOfKind(SyntaxKind.CallExpression)) { - const expression = call.getExpression(); - if (!Node.isPropertyAccessExpression(expression)) { - continue; - } - - const name = expression.getName(); - if (name !== 'set' && name !== 'delete' && name !== 'serialize') { - continue; - } - - if (call.getText().includes('path')) { - continue; - } - - const options_arg = call.getArguments()[name === 'delete' ? 1 : 2]; - if (options_arg && !Node.isObjectLiteralExpression(options_arg)) { - continue; - } - - const parent_function = call.getFirstAncestor( - /** @returns {ancestor is import('ts-morph').FunctionDeclaration | import('ts-morph').FunctionExpression | import('ts-morph').ArrowFunction} */ - (ancestor) => { - // Check if this is inside a function - const fn_declaration = ancestor.asKind(SyntaxKind.FunctionDeclaration); - const fn_expression = ancestor.asKind(SyntaxKind.FunctionExpression); - const arrow_fn_expression = ancestor.asKind(SyntaxKind.ArrowFunction); - return !!fn_declaration || !!fn_expression || !!arrow_fn_expression; - } - ); - if (!parent_function) { - continue; - } - - const expression_text = expression.getExpression().getText(); - if ( - expression_text !== 'cookies' && - (!expression_text.includes('.') || - expression_text.split('.').pop() !== 'cookies' || - !parent_function.getParameter(expression_text.split('.')[0])) - ) { - continue; - } - - const parent = call.getFirstAncestorByKind(SyntaxKind.Block); - if (!parent) { - continue; - } - - calls.push(() => - call.replaceWithText((writer) => { - writer.setIndentationLevel(0); // prevent ts-morph from being unhelpful and adding its own indentation - writer.write('/* @migration task: add path argument */ ' + call.getText()); - }) - ); - } - - for (const call of calls) { - call(); - } - - logger(); -} - -/** - * `resolvePath` from `@sveltejs/kit` -> `resolveRoute` from `$app/paths` - * @param {import('ts-morph').SourceFile} source - */ -function replace_resolve_path(source) { - const named_import = get_import(source, '@sveltejs/kit', 'resolvePath'); - if (!named_import) return; - - const logger = log_on_ts_modification( - source, - 'Replaced `resolvePath` with `resolveRoute`: https://svelte.dev/docs/kit/migrating-to-sveltekit-2#resolvePath-has-been-removed' - ); - - const name_node = named_import.getNameNode(); - if (Node.isIdentifier(name_node)) { - for (const id of name_node.findReferencesAsNodes()) { - id.replaceWithText('resolveRoute'); - } - } - if (named_import.getParent().getParent().getNamedImports().length === 1) { - named_import.getParent().getParent().getParent().remove(); - } else { - named_import.remove(); - } - - const paths_import = source.getImportDeclaration( - (i) => i.getModuleSpecifierValue() === '$app/paths' - ); - if (paths_import) { - paths_import.addNamedImport('resolveRoute'); - } else { - source.addImportDeclaration({ - moduleSpecifier: '$app/paths', - namedImports: ['resolveRoute'] - }); - } - - logger(); -} - -/** - * @param {import('ts-morph').SourceFile} source - * @param {string} from - * @param {string} name - */ -function get_import(source, from, name) { - return source - .getImportDeclarations() - .filter((i) => i.getModuleSpecifierValue() === from) - .flatMap((i) => i.getNamedImports()) - .find((i) => i.getName() === name); -} diff --git a/packages/migrate/migrations/sveltekit-2/migrate.spec.js b/packages/migrate/migrations/sveltekit-2/migrate.spec.js deleted file mode 100644 index a297d947657c..000000000000 --- a/packages/migrate/migrations/sveltekit-2/migrate.spec.js +++ /dev/null @@ -1,32 +0,0 @@ -import { assert, test } from 'vitest'; -import { - transform_code, - update_svelte_config_content, - update_tsconfig_content -} from './migrate.js'; -import { read_samples } from '../../utils.js'; - -for (const sample of read_samples(new URL('./svelte-config-samples.md', import.meta.url))) { - test('svelte.config.js: ' + sample.description, () => { - const actual = update_svelte_config_content(sample.before); - assert.equal(actual, sample.after); - }); -} - -for (const sample of read_samples(new URL('./tsconfig-samples.md', import.meta.url))) { - test('tsconfig.json: ' + sample.description, () => { - const actual = update_tsconfig_content(sample.before); - assert.equal(actual, sample.after); - }); -} - -for (const sample of read_samples(new URL('./tsjs-samples.md', import.meta.url))) { - test('JS/TS file: ' + sample.description, () => { - const actual = transform_code( - sample.before, - sample.filename?.endsWith('.ts') ?? false, - sample.filename ?? '+page.js' - ); - assert.equal(actual, sample.after); - }); -} diff --git a/packages/migrate/migrations/sveltekit-2/svelte-config-samples.md b/packages/migrate/migrations/sveltekit-2/svelte-config-samples.md deleted file mode 100644 index 9a06096a3986..000000000000 --- a/packages/migrate/migrations/sveltekit-2/svelte-config-samples.md +++ /dev/null @@ -1,126 +0,0 @@ -## Removes dangerZone (1) - -```js before -export default { - kit: { - foo: bar, - dangerZone: { - trackServerFetches: true - }, - baz: qux - } -}; -``` - -```js after -export default { - kit: { - foo: bar, - baz: qux - } -}; -``` - -## Removes dangerZone (2) - -```js before -export default { - kit: { - foo: bar, - dangerZone: { - trackServerFetches: true - } - } -}; -``` - -<!-- prettier-ignore --> -```js after -export default { - kit: { - foo: bar, - } -}; -``` - -## Replaces vitePreprocess import (1) - -```js before -import adapter from '@sveltejs/adapter-auto'; -import { vitePreprocess } from '@sveltejs/kit/vite'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - // Consult https://svelte.dev/docs/kit/integrations#preprocessors - // for more information about preprocessors - preprocess: vitePreprocess(), - - kit: { - adapter: adapter() - } -}; - -export default config; -``` - -```js after -import adapter from '@sveltejs/adapter-auto'; -import { vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -/** @type {import('@sveltejs/kit').Config} */ -const config = { - // Consult https://svelte.dev/docs/kit/integrations#preprocessors - // for more information about preprocessors - preprocess: vitePreprocess(), - - kit: { - adapter: adapter() - } -}; - -export default config; -``` - -## Replaces vitePreprocess import (2) - -```js before -import adapter from '@sveltejs/adapter-auto'; -import { vitePreprocess, foo } from '@sveltejs/kit/vite'; - -export default { - preprocess: vitePreprocess() -}; -``` - -<!-- prettier-ignore --> -```js after -import adapter from '@sveltejs/adapter-auto'; -import { foo } from '@sveltejs/kit/vite'; -import { vitePreprocess } from "@sveltejs/vite-plugin-svelte"; - -export default { - preprocess: vitePreprocess() -}; -``` - -## Replaces vitePreprocess import (3) - -```js before -import adapter from '@sveltejs/adapter-auto'; -import { vitePreprocess, foo } from '@sveltejs/kit/vite'; -import { a } from '@sveltejs/vite-plugin-svelte'; - -export default { - preprocess: vitePreprocess() -}; -``` - -```js after -import adapter from '@sveltejs/adapter-auto'; -import { foo } from '@sveltejs/kit/vite'; -import { a, vitePreprocess } from '@sveltejs/vite-plugin-svelte'; - -export default { - preprocess: vitePreprocess() -}; -``` diff --git a/packages/migrate/migrations/sveltekit-2/tsconfig-samples.md b/packages/migrate/migrations/sveltekit-2/tsconfig-samples.md deleted file mode 100644 index 93d357fac974..000000000000 --- a/packages/migrate/migrations/sveltekit-2/tsconfig-samples.md +++ /dev/null @@ -1,40 +0,0 @@ -## Removes importsNotUsedAsValues/preserveValueImports - -```json before -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - "importsNotUsedAsValues": "error", - "preserveValueImports": true - } -} -``` - -<!-- prettier-ignore --> -```json after -{ - "extends": "./.svelte-kit/tsconfig.json", - "compilerOptions": { - } -} -``` - -## Leaves tsconfig alone - -```json before -{ - "compilerOptions": { - "importsNotUsedAsValues": "error", - "preserveValueImports": true - } -} -``` - -```json after -{ - "compilerOptions": { - "importsNotUsedAsValues": "error", - "preserveValueImports": true - } -} -``` diff --git a/packages/migrate/migrations/sveltekit-2/tsjs-samples.md b/packages/migrate/migrations/sveltekit-2/tsjs-samples.md deleted file mode 100644 index 3fed9bf6b95f..000000000000 --- a/packages/migrate/migrations/sveltekit-2/tsjs-samples.md +++ /dev/null @@ -1,170 +0,0 @@ -## Removes throws - -```js before -import { redirect, error } from '@sveltejs/kit'; - -throw redirect(); -redirect(); -throw error(); -error(); -function x() { - let redirect = true; - throw redirect(); -} -``` - -```js after -import { redirect, error } from '@sveltejs/kit'; - -redirect(); -redirect(); -error(); -error(); -function x() { - let redirect = true; - throw redirect(); -} -``` - -## Leaves redirect/error from other sources alone - -```js before -import { redirect, error } from 'somewhere-else'; - -throw redirect(); -redirect(); -throw error(); -error(); -``` - -```js after -import { redirect, error } from 'somewhere-else'; - -throw redirect(); -redirect(); -throw error(); -error(); -``` - -## Notes cookie migration - -```js before -export function load({ cookies }) { - cookies.set('foo', 'bar'); -} -``` - -```js after -export function load({ cookies }) { - /* @migration task: add path argument */ cookies.set('foo', 'bar'); -} -``` - -## Notes cookie migration with multiple occurences - -```js before -export function load({ cookies }) { - cookies.delete('foo'); - cookies.set('x', 'y', { z: '' }); -} -``` - -```js after -export function load({ cookies }) { - /* @migration task: add path argument */ cookies.delete('foo'); - /* @migration task: add path argument */ cookies.set('x', 'y', { z: '' }); -} -``` - -## Handles non-destructured argument - -```js before -export function load(event) { - event.cookies.set('x', 'y'); -} -``` - -```js after -export function load(event) { - /* @migration task: add path argument */ event.cookies.set('x', 'y'); -} -``` - -## Recognizes cookies false positives - -```js before -export function load({ cookies }) { - cookies.set('foo', 'bar', { path: '/' }); -} - -export function foo(event) { - x.cookies.set('foo', 'bar'); -} - -export function bar(event) { - event.x.set('foo', 'bar'); -} - -cookies.set('foo', 'bar'); -``` - -```js after -export function load({ cookies }) { - cookies.set('foo', 'bar', { path: '/' }); -} - -export function foo(event) { - x.cookies.set('foo', 'bar'); -} - -export function bar(event) { - event.x.set('foo', 'bar'); -} - -cookies.set('foo', 'bar'); -``` - -## Replaces resolvePath - -```js before -import { resolvePath } from '@sveltejs/kit'; - -resolvePath('x', y); -``` - -<!-- prettier-ignore --> -```js after -import { resolveRoute } from "$app/paths"; - -resolveRoute('x', y); -``` - -## Replaces resolvePath taking care of imports - -```js before -import { resolvePath, x } from '@sveltejs/kit'; -import { y } from '$app/paths'; - -resolvePath('x'); -``` - -```js after -import { x } from '@sveltejs/kit'; -import { y, resolveRoute } from '$app/paths'; - -resolveRoute('x'); -``` - -## Doesn't replace resolvePath from other sources - -```js before -import { resolvePath } from 'x'; - -resolvePath('x'); -``` - -```js after -import { resolvePath } from 'x'; - -resolvePath('x'); -``` diff --git a/packages/migrate/package.json b/packages/migrate/package.json deleted file mode 100644 index be1a716729fb..000000000000 --- a/packages/migrate/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "svelte-migrate", - "version": "1.6.8", - "description": "A CLI for migrating Svelte(Kit) codebases", - "keywords": [ - "migration", - "upgrade", - "svelte", - "sveltekit", - "tool" - ], - "repository": { - "type": "git", - "url": "https://github.com/sveltejs/kit", - "directory": "packages/migrate" - }, - "license": "MIT", - "homepage": "https://svelte.dev", - "type": "module", - "bin": { - "svelte-migrate": "./bin.js" - }, - "files": [ - "bin.js", - "migrations", - "utils.js", - "!migrations/**/*.spec.js", - "!migrations/**/samples.md" - ], - "dependencies": { - "import-meta-resolve": "^4.1.0", - "kleur": "^4.1.5", - "magic-string": "^0.30.5", - "prompts": "^2.4.2", - "semver": "^7.5.4", - "tiny-glob": "^0.2.9", - "ts-morph": "^24.0.0", - "typescript": "^5.3.3", - "zimmerframe": "^1.1.2" - }, - "devDependencies": { - "@types/node": "^18.19.48", - "@types/prompts": "^2.4.9", - "@types/semver": "^7.5.6", - "svelte": "^4.2.10", - "vitest": "^2.0.1" - }, - "scripts": { - "test": "vitest run --silent", - "check": "tsc", - "lint": "prettier --check .", - "format": "pnpm lint --write" - } -} diff --git a/packages/migrate/tsconfig.json b/packages/migrate/tsconfig.json deleted file mode 100644 index 26885cff272f..000000000000 --- a/packages/migrate/tsconfig.json +++ /dev/null @@ -1,12 +0,0 @@ -{ - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "noEmit": true, - "strict": true, - "target": "es2022", - "module": "node16", - "moduleResolution": "node16", - "allowSyntheticDefaultImports": true - } -} diff --git a/packages/migrate/utils.js b/packages/migrate/utils.js deleted file mode 100644 index 944461f02a78..000000000000 --- a/packages/migrate/utils.js +++ /dev/null @@ -1,421 +0,0 @@ -import colors from 'kleur'; -import MagicString from 'magic-string'; -import { execFileSync, execSync } from 'node:child_process'; -import fs from 'node:fs'; -import path from 'node:path'; -import process from 'node:process'; -import semver from 'semver'; -import ts from 'typescript'; - -/** @param {string} message */ -export function bail(message) { - console.error(colors.bold().red(message)); - process.exit(1); -} - -/** @param {string} file */ -export function relative(file) { - return path.relative('.', file); -} -/** - * - * @param {string} file - * @param {string} renamed - * @param {string} content - * @param {boolean} use_git - */ -export function move_file(file, renamed, content, use_git) { - if (use_git) { - execFileSync('git', ['mv', file, renamed]); - } else { - fs.unlinkSync(file); - } - - fs.writeFileSync(renamed, content); -} - -/** - * @param {string} contents - * @param {string} indent - */ -export function comment(contents, indent) { - return contents.replace(new RegExp(`^${indent}`, 'gm'), `${indent}// `); -} - -/** @param {string} content */ -export function dedent(content) { - const indent = guess_indent(content); - if (!indent) return content; - - /** @type {string[]} */ - const substitutions = []; - - try { - const ast = ts.createSourceFile( - 'filename.ts', - content, - ts.ScriptTarget.Latest, - true, - ts.ScriptKind.TS - ); - - const code = new MagicString(content); - - /** @param {ts.Node} node */ - function walk(node) { - if (ts.isTemplateLiteral(node)) { - let pos = node.pos; - while (/\s/.test(content[pos])) pos += 1; - - code.overwrite(pos, node.end, `____SUBSTITUTION_${substitutions.length}____`); - substitutions.push(node.getText()); - } - - node.forEachChild(walk); - } - - ast.forEachChild(walk); - - return code - .toString() - .replace(new RegExp(`^${indent}`, 'gm'), '') - .replace(/____SUBSTITUTION_(\d+)____/g, (match, index) => substitutions[index]); - } catch { - // as above — ignore this edge case - return content; - } -} - -/** @param {string} content */ -export function guess_indent(content) { - const lines = content.split('\n'); - - const tabbed = lines.filter((line) => /^\t+/.test(line)); - const spaced = lines.filter((line) => /^ {2,}/.test(line)); - - if (tabbed.length === 0 && spaced.length === 0) { - return null; - } - - // More lines tabbed than spaced? Assume tabs, and - // default to tabs in the case of a tie (or nothing - // to go on) - if (tabbed.length >= spaced.length) { - return '\t'; - } - - // Otherwise, we need to guess the multiple - const min = spaced.reduce((previous, current) => { - const count = /^ +/.exec(current)?.[0].length ?? 0; - return Math.min(count, previous); - }, Infinity); - - return ' '.repeat(min); -} - -/** - * @param {string} content - * @param {number} offset - */ -export function indent_at_line(content, offset) { - const substr = content.substring(content.lastIndexOf('\n', offset) + 1, offset); - return /\s*/.exec(substr)?.[0] ?? ''; -} - -/** - * @param {string} content - * @param {string} except - */ -export function except_str(content, except) { - const start = content.indexOf(except); - const end = start + except.length; - return content.substring(0, start) + content.substring(end); -} - -/** - * @returns {boolean} True if git is installed - */ -export function check_git() { - let use_git = false; - - let dir = process.cwd(); - do { - if (fs.existsSync(path.join(dir, '.git'))) { - use_git = true; - break; - } - } while (dir !== (dir = path.dirname(dir))); - - if (use_git) { - try { - const status = execSync('git status --porcelain', { stdio: 'pipe' }).toString(); - - if (status) { - const message = - 'Your git working directory is dirty — we recommend committing your changes before running this migration.\n'; - console.log(colors.bold().red(message)); - } - } catch { - // would be weird to have a .git folder if git is not installed, - // but always expect the unexpected - const message = - 'Could not detect a git installation. If this is unexpected, please raise an issue: https://github.com/sveltejs/kit.\n'; - console.log(colors.bold().red(message)); - use_git = false; - } - } - - return use_git; -} - -/** - * Get a list of all files in a directory - * @param {string} cwd - the directory to walk - * @param {boolean} [dirs] - whether to include directories in the result - */ -export function walk(cwd, dirs = false) { - /** @type {string[]} */ - const all_files = []; - - /** @param {string} dir */ - function walk_dir(dir) { - const files = fs.readdirSync(path.join(cwd, dir)); - - for (const file of files) { - const joined = path.join(dir, file); - const stats = fs.statSync(path.join(cwd, joined)); - if (stats.isDirectory()) { - if (dirs) all_files.push(joined); - walk_dir(joined); - } else { - all_files.push(joined); - } - } - } - - return walk_dir(''), all_files; -} - -/** @param {string} str */ -export function posixify(str) { - return str.replace(/\\/g, '/'); -} - -/** - * @param {string} content - * @param {Array<[string, string, string?, ('dependencies' | 'devDependencies')?]>} updates - */ -export function update_pkg(content, updates) { - const indent = content.split('\n')[1].match(/^\s+/)?.[0] || ' '; - const pkg = JSON.parse(content); - - /** - * @param {string} name - * @param {string} version - * @param {string} [additional] - * @param {'dependencies' | 'devDependencies' | undefined} [insert] - */ - function update_pkg(name, version, additional = '', insert) { - /** - * @param {string} type - */ - const updateVersion = (type) => { - const existingRange = pkg[type]?.[name]; - - if ( - existingRange && - semver.validRange(existingRange) && - !semver.subset(existingRange, version) - ) { - // Check if the new version range is an upgrade - const minExistingVersion = semver.minVersion(existingRange); - const minNewVersion = semver.minVersion(version); - - if (minExistingVersion && minNewVersion && semver.gt(minNewVersion, minExistingVersion)) { - log_migration(`Updated ${name} to ${version}`); - pkg[type][name] = version; - } - } - }; - - updateVersion('dependencies'); - updateVersion('devDependencies'); - - if (insert && !pkg[insert]?.[name]) { - if (!pkg[insert]) pkg[insert] = {}; - - // Insert the property in sorted position without adjusting other positions so diffs are easier to read - const sorted_keys = Object.keys(pkg[insert]).sort(); - const index = sorted_keys.findIndex((key) => name.localeCompare(key) === -1); - const insert_index = index !== -1 ? index : sorted_keys.length; - const new_properties = Object.entries(pkg[insert]); - new_properties.splice(insert_index, 0, [name, version]); - pkg[insert] = Object.fromEntries(new_properties); - - log_migration(`Added ${name} version ${version} ${additional}`); - } - } - - for (const update of updates) { - update_pkg(...update); - } - - const result = JSON.stringify(pkg, null, indent); - if (content.endsWith('\n')) return result + '\n'; - return result; -} - -const logged_migrations = new Set(); - -/** - * @param {import('ts-morph').SourceFile} source - * @param {string} text - */ -export function log_on_ts_modification(source, text) { - let logged = false; - const log = () => { - if (!logged) { - logged = true; - log_migration(text); - } - }; - source.onModified(log); - return () => source.onModified(log, false); -} - -/** @param {string} text */ -export function log_migration(text) { - if (logged_migrations.has(text)) return; - console.log(text); - logged_migrations.add(text); -} - -/** - * Parses the scripts contents and invoked `transform_script_code` with it, then runs the result through `transform_svelte_code`. - * The result is written back to disk. - * @param {string} file_path - * @param {(code: string, is_ts: boolean, file_path: string) => string} transform_script_code - * @param {(code: string, file_path: string) => string} transform_svelte_code - */ -export function update_svelte_file(file_path, transform_script_code, transform_svelte_code) { - try { - const content = fs.readFileSync(file_path, 'utf-8'); - const updated = content.replace( - /<script([^]*?)>([^]+?)<\/script>(\n*)/g, - (_match, attrs, contents, whitespace) => { - return `<script${attrs}>${transform_script_code( - contents, - (attrs.includes('lang=') || attrs.includes('type=')) && - (attrs.includes('ts') || attrs.includes('typescript')), - file_path - )}</script>${whitespace}`; - } - ); - fs.writeFileSync(file_path, transform_svelte_code(updated, file_path), 'utf-8'); - } catch (err) { - // TODO: change to import('svelte/compiler').Warning after upgrading to Svelte 5 - const e = /** @type {any} */ (err); - console.warn(buildExtendedLogMessage(e), e.frame); - console.info(e.stack); - } -} - -/** - * Reads the file and invokes `transform_code` with its contents. The result is written back to disk. - * @param {string} file_path - * @param {(code: string, is_ts: boolean, file_path: string) => string} transform_code - */ -export function update_js_file(file_path, transform_code) { - try { - const content = fs.readFileSync(file_path, 'utf-8'); - const updated = transform_code(content, file_path.endsWith('.ts'), file_path); - fs.writeFileSync(file_path, updated, 'utf-8'); - } catch (err) { - // TODO: change to import('svelte/compiler').Warning after upgrading to Svelte 5 - const e = /** @type {any} */ (err); - console.warn(buildExtendedLogMessage(e), e.frame); - console.info(e.stack); - } -} - -/** - * @param {any} w - */ -export function buildExtendedLogMessage(w) { - const parts = []; - if (w.filename) { - parts.push(w.filename); - } - if (w.start) { - parts.push(':', w.start.line, ':', w.start.column); - } - if (w.message) { - if (parts.length > 0) { - parts.push(' '); - } - parts.push(w.message); - } - return parts.join(''); -} - -/** - * Updates the tsconfig/jsconfig.json file with the provided function. - * @param {(content: string) => string} update_tsconfig_content - */ -export function update_tsconfig(update_tsconfig_content) { - const file = fs.existsSync('tsconfig.json') - ? 'tsconfig.json' - : fs.existsSync('jsconfig.json') - ? 'jsconfig.json' - : null; - if (file) { - fs.writeFileSync(file, update_tsconfig_content(fs.readFileSync(file, 'utf8'))); - } -} - -/** @param {string | URL} test_file */ -export function read_samples(test_file) { - const markdown = fs.readFileSync(test_file, 'utf8').replaceAll('\r\n', '\n'); - const samples = markdown - .split(/^##/gm) - .slice(1) - .map((block) => { - const description = block.split('\n')[0]; - const before = /```(js|ts|svelte) before\n([^]*?)\n```/.exec(block); - const after = /```(js|ts|svelte) after\n([^]*?)\n```/.exec(block); - - const match = /> file: (.+)/.exec(block); - - return { - description, - before: before ? before[2] : '', - after: after ? after[2] : '', - filename: match?.[1], - solo: block.includes('> solo') - }; - }); - - if (samples.some((sample) => sample.solo)) { - return samples.filter((sample) => sample.solo); - } - - return samples; -} - -/** - * @param {import('ts-morph').SourceFile} source - * @param {string} _import - * @param {string} method - */ -export function add_named_import(source, _import, method) { - const existing = source.getImportDeclaration(_import); - if (existing) { - if (existing.getNamedImports().some((i) => i.getName() === method)) return; - existing?.addNamedImport(method); - } else { - source.addImportDeclaration({ - moduleSpecifier: _import, - namedImports: [method] - }); - } -} diff --git a/packages/migrate/utils.spec.js b/packages/migrate/utils.spec.js deleted file mode 100644 index a75641e6055f..000000000000 --- a/packages/migrate/utils.spec.js +++ /dev/null @@ -1,93 +0,0 @@ -import { assert, test } from 'vitest'; -import { update_pkg } from './utils.js'; - -test('Inserts package at correct position (1)', () => { - const result = update_pkg( - `{ - "dependencies": { - "a": "1", - "z": "3", - "c": "4" - } -}`, - [['b', '2', '', 'dependencies']] - ); - - assert.equal( - result, - `{ - "dependencies": { - "a": "1", - "b": "2", - "z": "3", - "c": "4" - } -}` - ); -}); - -test('Inserts package at correct position (2)', () => { - const result = update_pkg( - `{ - "dependencies": { - "a": "1", - "b": "2" - } -}`, - [['c', '3', '', 'dependencies']] - ); - - assert.equal( - result, - `{ - "dependencies": { - "a": "1", - "b": "2", - "c": "3" - } -}` - ); -}); - -test('Inserts package at correct position (3)', () => { - const result = update_pkg( - `{ - "dependencies": { - "b": "2", - "c": "3" - } -}`, - [['a', '1', '', 'dependencies']] - ); - - assert.equal( - result, - `{ - "dependencies": { - "a": "1", - "b": "2", - "c": "3" - } -}` - ); -}); - -test('Does not downgrade versions', () => { - const result = update_pkg( - `{ - "devDependencies": { - "@sveltejs/kit": "^2.4.3" - } -}`, - [['@sveltejs/kit', '^2.0.0']] - ); - - assert.equal( - result, - `{ - "devDependencies": { - "@sveltejs/kit": "^2.4.3" - } -}` - ); -}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0a360411ab50..a9eb3d780d8b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1028,52 +1028,6 @@ importers: specifier: ^2.0.1 version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) - packages/migrate: - dependencies: - import-meta-resolve: - specifier: ^4.1.0 - version: 4.1.0 - kleur: - specifier: ^4.1.5 - version: 4.1.5 - magic-string: - specifier: ^0.30.5 - version: 0.30.11 - prompts: - specifier: ^2.4.2 - version: 2.4.2 - semver: - specifier: ^7.5.4 - version: 7.6.3 - tiny-glob: - specifier: ^0.2.9 - version: 0.2.9 - ts-morph: - specifier: ^24.0.0 - version: 24.0.0 - typescript: - specifier: ^5.3.3 - version: 5.4.5 - zimmerframe: - specifier: ^1.1.2 - version: 1.1.2 - devDependencies: - '@types/node': - specifier: ^18.19.48 - version: 18.19.50 - '@types/prompts': - specifier: ^2.4.9 - version: 2.4.9 - '@types/semver': - specifier: ^7.5.6 - version: 7.5.8 - svelte: - specifier: ^4.2.10 - version: 4.2.19 - vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) - packages/package: dependencies: chokidar: @@ -1956,9 +1910,6 @@ packages: resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} - '@ts-morph/common@0.25.0': - resolution: {integrity: sha512-kMnZz+vGGHi4GoHnLmMhGNjm44kGtKUXGnOvrKmMwAuvNjM/PgKVGfUnL7IDvK7Jb2QQ82jq3Zmp04Gy+r3Dkg==} - '@types/connect@3.4.38': resolution: {integrity: sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==} @@ -1983,9 +1934,6 @@ packages: '@types/node@18.19.50': resolution: {integrity: sha512-xonK+NRrMBRtkL1hVCc3G+uXtjh1Al4opBLjqVmipe5ZAaBYWW6cNAiBVZ1BvmkBhep698rP3UM3aRAdSALuhg==} - '@types/prompts@2.4.9': - resolution: {integrity: sha512-qTxFi6Buiu8+50/+3DGIWLHM6QuWsEKugJnnP6iv2Mc4ncxE4A/OJkjuVOA+5X0X1S/nq5VJRa8Lu+nwcvbrKA==} - '@types/resolve@1.20.2': resolution: {integrity: sha512-60BCwRFOZCQhDncwQdxxeOEEkbc5dIMccYLwbxsS4TUNeVECQ/pBJ0j09mrHOl/JJvpRPGwO9SvE4nR2Nb/a4Q==} @@ -2234,9 +2182,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - code-block-writer@13.0.3: - resolution: {integrity: sha512-Oofo0pq3IKnsFtuHqSF7TqBfr71aeyZDVJ0HpmqB7FBM2qEigL0iPONSCZSO9pE9dZTAxANe5XHG9Uy0YMv8cg==} - code-red@1.0.4: resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} @@ -2818,10 +2763,6 @@ packages: keyv@4.5.4: resolution: {integrity: sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==} - kleur@3.0.3: - resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} - engines: {node: '>=6'} - kleur@4.1.5: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} @@ -3136,9 +3077,6 @@ packages: pascal-case@3.1.2: resolution: {integrity: sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==} - path-browserify@1.0.1: - resolution: {integrity: sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==} - path-exists@4.0.0: resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} engines: {node: '>=8'} @@ -3263,10 +3201,6 @@ packages: printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - prompts@2.4.2: - resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} - engines: {node: '>= 6'} - pseudomap@1.0.2: resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} @@ -3429,9 +3363,6 @@ packages: resolution: {integrity: sha512-BPwJGUeDaDCHihkORDchNyyTvWFhcusy1XMmhEVTQTwGeybFbp8YEmB+njbPnth1FibULBSBVwCQni25XlCUDg==} engines: {node: '>=18'} - sisteransi@1.0.5: - resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} - slash@3.0.0: resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} engines: {node: '>=8'} @@ -3606,10 +3537,6 @@ packages: resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} engines: {node: '>=4'} - tinyglobby@0.2.9: - resolution: {integrity: sha512-8or1+BGEdk1Zkkw2ii16qSS7uVrQJPre5A9o/XkWPATkk23FZh/15BKFxPnlTy6vkljZxLqYCzzBMj30ZrSvjw==} - engines: {node: '>=12.0.0'} - tinypool@1.0.0: resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} engines: {node: ^18.0.0 || >=20.0.0} @@ -3643,9 +3570,6 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-morph@24.0.0: - resolution: {integrity: sha512-2OAOg/Ob5yx9Et7ZX4CvTCc0UFoZHwLEJ+dpDPSUi5TgwwlTlX47w+iFRrEwzUZwYACjq83cgjS/Da50Ga37uw==} - tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -4583,12 +4507,6 @@ snapshots: transitivePeerDependencies: - encoding - '@ts-morph/common@0.25.0': - dependencies: - minimatch: 9.0.5 - path-browserify: 1.0.1 - tinyglobby: 0.2.9 - '@types/connect@3.4.38': dependencies: '@types/node': 18.19.50 @@ -4614,11 +4532,6 @@ snapshots: dependencies: undici-types: 5.26.5 - '@types/prompts@2.4.9': - dependencies: - '@types/node': 18.19.50 - kleur: 3.0.3 - '@types/resolve@1.20.2': {} '@types/semver@7.5.8': {} @@ -4906,8 +4819,6 @@ snapshots: ci-info@3.9.0: {} - code-block-writer@13.0.3: {} - code-red@1.0.4: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -5529,8 +5440,6 @@ snapshots: dependencies: json-buffer: 3.0.1 - kleur@3.0.3: {} - kleur@4.1.5: {} known-css-properties@0.34.0: {} @@ -5803,8 +5712,6 @@ snapshots: no-case: 3.0.4 tslib: 2.6.2 - path-browserify@1.0.1: {} - path-exists@4.0.0: {} path-is-absolute@1.0.1: {} @@ -5895,11 +5802,6 @@ snapshots: printable-characters@1.0.42: {} - prompts@2.4.2: - dependencies: - kleur: 3.0.3 - sisteransi: 1.0.5 - pseudomap@1.0.2: {} publint@0.2.7: @@ -6085,8 +5987,6 @@ snapshots: mrmime: 2.0.0 totalist: 3.0.1 - sisteransi@1.0.5: {} - slash@3.0.0: {} source-map-js@1.2.1: {} @@ -6251,11 +6151,6 @@ snapshots: tinydate@1.3.0: {} - tinyglobby@0.2.9: - dependencies: - fdir: 6.4.0(picomatch@4.0.2) - picomatch: 4.0.2 - tinypool@1.0.0: {} tinyspy@3.0.0: {} @@ -6284,11 +6179,6 @@ snapshots: dependencies: typescript: 5.6.3 - ts-morph@24.0.0: - dependencies: - '@ts-morph/common': 0.25.0 - code-block-writer: 13.0.3 - tslib@2.6.2: {} type-check@0.4.0: From b24d37e8ff2f04aef75798bba3906c1e36e5e1a5 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 11 Nov 2024 05:01:37 -0800 Subject: [PATCH 0750/1135] chore: remove marked test (#12982) --- packages/kit/test/apps/basics/package.json | 1 - .../test/apps/basics/src/routes/imports/+page.svelte | 1 - .../basics/src/routes/imports/markdown/+page.svelte | 5 ----- packages/kit/test/apps/basics/test/test.js | 6 ------ packages/kit/test/apps/basics/vite.config.js | 2 +- pnpm-lock.yaml | 10 ---------- 6 files changed, 1 insertion(+), 24 deletions(-) delete mode 100644 packages/kit/test/apps/basics/src/routes/imports/+page.svelte delete mode 100644 packages/kit/test/apps/basics/src/routes/imports/markdown/+page.svelte diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index eadca24b6a31..53776cdf43bd 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -17,7 +17,6 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^3.0.1", "cross-env": "^7.0.3", - "marked": "^14.0.0", "svelte": "^4.2.10", "svelte-check": "^4.0.1", "typescript": "^5.3.3", diff --git a/packages/kit/test/apps/basics/src/routes/imports/+page.svelte b/packages/kit/test/apps/basics/src/routes/imports/+page.svelte deleted file mode 100644 index f09d461a28b8..000000000000 --- a/packages/kit/test/apps/basics/src/routes/imports/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -<a href="/imports/markdown">markdown</a> diff --git a/packages/kit/test/apps/basics/src/routes/imports/markdown/+page.svelte b/packages/kit/test/apps/basics/src/routes/imports/markdown/+page.svelte deleted file mode 100644 index 95cb762881fc..000000000000 --- a/packages/kit/test/apps/basics/src/routes/imports/markdown/+page.svelte +++ /dev/null @@ -1,5 +0,0 @@ -<script> - import { marked } from 'marked'; -</script> - -<main>{@html marked('this is some **markdown**')}</main> diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 3922d127039e..fb21412290d6 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -35,12 +35,6 @@ test.describe('adapter', () => { }); test.describe('Imports', () => { - test('imports from node_modules', async ({ page, clicknav }) => { - await page.goto('/imports'); - await clicknav('[href="/imports/markdown"]'); - expect(await page.innerHTML('p')).toBe('this is some <strong>markdown</strong>'); - }); - // https://github.com/sveltejs/kit/issues/461 test('handles static asset imports', async ({ baseURL, page }) => { await page.goto('/asset-import'); diff --git a/packages/kit/test/apps/basics/vite.config.js b/packages/kit/test/apps/basics/vite.config.js index 0afea7f14a85..d6742f261346 100644 --- a/packages/kit/test/apps/basics/vite.config.js +++ b/packages/kit/test/apps/basics/vite.config.js @@ -10,7 +10,7 @@ const config = { optimizeDeps: { // for CI, we need to explicitly prebundle deps, since // the reload confuses Playwright - include: ['cookie', 'marked'] + include: ['cookie'] }, plugins: [sveltekit()], server: { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a9eb3d780d8b..aa95a3a3d02f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -451,9 +451,6 @@ importers: cross-env: specifier: ^7.0.3 version: 7.0.3 - marked: - specifier: ^14.0.0 - version: 14.1.1 svelte: specifier: ^4.2.10 version: 4.2.19 @@ -2876,11 +2873,6 @@ packages: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} - marked@14.1.1: - resolution: {integrity: sha512-eS59oxof5eBVDCKTs+mJbvB/6Vq137GbimF9wkTIlto2/B2ppY5nigUUQgKVmA3bI2mPTIshUyDj5j612ZxlQQ==} - engines: {node: '>= 18'} - hasBin: true - mdn-data@2.0.30: resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} @@ -5534,8 +5526,6 @@ snapshots: dependencies: semver: 6.3.1 - marked@14.1.1: {} - mdn-data@2.0.30: {} merge-stream@2.0.0: {} From d94a854f9f5e8ed474c97cf7d51f2e0db3fe16ac Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 11 Nov 2024 11:52:55 -0800 Subject: [PATCH 0751/1135] docs: remove outdated svelte-hmr FAQ (#12988) --- documentation/docs/60-appendix/10-faq.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/documentation/docs/60-appendix/10-faq.md b/documentation/docs/60-appendix/10-faq.md index 4e0b2d536c13..89e3db4b14fc 100644 --- a/documentation/docs/60-appendix/10-faq.md +++ b/documentation/docs/60-appendix/10-faq.md @@ -27,10 +27,6 @@ In order to support SSR, a JS backend — such as Node.js or Deno-based server, It is also possible to write custom adapters or leverage community adapters to deploy SvelteKit to more platforms such as specialized server environments, browser extensions, or native applications. See [integrations](./integrations) for more examples and integrations. -## How do I use HMR with SvelteKit? - -SvelteKit has HMR enabled by default powered by [svelte-hmr](https://github.com/sveltejs/svelte-hmr). If you saw [Rich's presentation at the 2020 Svelte Summit](/blog/whats-the-deal-with-sveltekit), you may have seen a more powerful-looking version of HMR presented. This demo had `svelte-hmr`'s `preserveLocalState` flag on. This flag is now off by default because it may lead to unexpected behaviour and edge cases. But don't worry, you are still getting HMR with SvelteKit! If you'd like to preserve local state you can use the `@hmr:keep` or `@hmr:keep-all` directives as documented on the [svelte-hmr](https://github.com/sveltejs/svelte-hmr) page. - ## How do I include details from package.json in my application? You cannot directly require JSON files, since SvelteKit expects [`svelte.config.js`](./configuration) to be an ES module. If you'd like to include your application's version number or other information from `package.json` in your application, you can load JSON like so: From c717db91236c7ab15045b296c73201c6c6ecd6fa Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 12 Nov 2024 08:30:41 -0800 Subject: [PATCH 0752/1135] chore: update playground and add an endpoint (#12983) --- packages/enhanced-img/package.json | 2 +- packages/kit/.gitignore | 10 +- playgrounds/basic/.gitignore | 4 + playgrounds/basic/package.json | 19 +- playgrounds/basic/src/app.html | 2 +- playgrounds/basic/src/routes/+page.svelte | 9 +- playgrounds/basic/src/routes/+page.ts | 6 + playgrounds/basic/src/routes/+server.ts | 7 + .../basic/src/routes/about/+page.svelte | 1 + .../basic/{jsconfig.json => tsconfig.json} | 0 playgrounds/basic/vite.config.js | 5 +- pnpm-lock.yaml | 282 ++++++++++++++---- 12 files changed, 275 insertions(+), 72 deletions(-) create mode 100644 playgrounds/basic/.gitignore create mode 100644 playgrounds/basic/src/routes/+page.ts create mode 100644 playgrounds/basic/src/routes/+server.ts create mode 100644 playgrounds/basic/src/routes/about/+page.svelte rename playgrounds/basic/{jsconfig.json => tsconfig.json} (100%) diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 862b6a0c4e3b..ed9ba2273a58 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -45,7 +45,7 @@ "@types/estree": "^1.0.5", "@types/node": "^18.19.48", "rollup": "^4.14.2", - "svelte": "^5.0.0", + "svelte": "^5.1.3", "typescript": "^5.6.3", "vite": "^5.3.2", "vitest": "^2.0.1" diff --git a/packages/kit/.gitignore b/packages/kit/.gitignore index 8f2b8468d607..c7b5684faca6 100644 --- a/packages/kit/.gitignore +++ b/packages/kit/.gitignore @@ -1,8 +1,5 @@ .DS_Store -/node_modules -/assets/* -/dist -/docs +/node_modules/ /test/**/build !/src/core/adapt/fixtures/*/.svelte-kit !/test/node_modules @@ -11,5 +8,6 @@ .custom-out-dir # these are already ignored by the top level .gitignore -# repeating them here as a faux prettier ignore -.svelte-kit +# repeating them here as a faux .prettierignore +/.svelte-kit/ +/dist/ diff --git a/playgrounds/basic/.gitignore b/playgrounds/basic/.gitignore new file mode 100644 index 000000000000..259afce74402 --- /dev/null +++ b/playgrounds/basic/.gitignore @@ -0,0 +1,4 @@ +# these are already ignored by the top level .gitignore +# repeating them here as a faux .prettierignore +/.svelte-kit/ +/dist/ diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index 700a42bb138a..05d510a132f4 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -8,8 +8,10 @@ "preview": "vite preview", "package": "svelte-kit sync && svelte-package && publint", "prepublishOnly": "npm run package", - "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", - "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch" + "check": "svelte-kit sync && svelte-check", + "check:watch": "svelte-kit sync && svelte-check --watch", + "format": "prettier --config ../../.prettierrc --write .", + "lint": "prettier --config ../../.prettierrc --check ." }, "devDependencies": { "@sveltejs/adapter-auto": "workspace:*", @@ -22,12 +24,14 @@ "@sveltejs/amp": "workspace:*", "@sveltejs/kit": "workspace:*", "@sveltejs/package": "workspace:*", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^4.0.0", + "prettier": "^3.3.2", + "prettier-plugin-svelte": "^3.2.6", "publint": "^0.2.0", - "svelte": "^4.2.10", + "svelte": "^5.1.13", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", - "vite": "^5.3.2" + "typescript": "^5.5.0", + "vite": "^5.4.4" }, "type": "module", "exports": { @@ -41,9 +45,6 @@ "!dist/**/*.test.*", "!dist/**/*.spec.*" ], - "peerDependencies": { - "svelte": "^4.0.0" - }, "svelte": "./dist/index.js", "types": "./dist/index.d.ts" } diff --git a/playgrounds/basic/src/app.html b/playgrounds/basic/src/app.html index 6769ed5e89c5..77a5ff52c923 100644 --- a/playgrounds/basic/src/app.html +++ b/playgrounds/basic/src/app.html @@ -1,4 +1,4 @@ -<!DOCTYPE html> +<!doctype html> <html lang="en"> <head> <meta charset="utf-8" /> diff --git a/playgrounds/basic/src/routes/+page.svelte b/playgrounds/basic/src/routes/+page.svelte index cc88df0ea352..a1c65230591f 100644 --- a/playgrounds/basic/src/routes/+page.svelte +++ b/playgrounds/basic/src/routes/+page.svelte @@ -1,2 +1,9 @@ +<script lang="ts"> + import type { PageData } from './$types'; + + let { data }: { data: PageData } = $props(); +</script> + <h1>Welcome to SvelteKit</h1> -<p>Visit <a href="https://svelte.dev/docs/kit">svelte.dev/docs/kit</a> to read the documentation</p> + +2 + 2 = {data.sum} diff --git a/playgrounds/basic/src/routes/+page.ts b/playgrounds/basic/src/routes/+page.ts new file mode 100644 index 000000000000..758f66e89fa6 --- /dev/null +++ b/playgrounds/basic/src/routes/+page.ts @@ -0,0 +1,6 @@ +import type { PageLoad } from './$types'; + +export const load: PageLoad = async ({ fetch }) => { + const response = await fetch('/', { method: 'POST', body: JSON.stringify({ a: 2, b: 2 }) }); + return { sum: await response.json() }; +}; diff --git a/playgrounds/basic/src/routes/+server.ts b/playgrounds/basic/src/routes/+server.ts new file mode 100644 index 000000000000..4d4494db055b --- /dev/null +++ b/playgrounds/basic/src/routes/+server.ts @@ -0,0 +1,7 @@ +import { json } from '@sveltejs/kit'; +import type { RequestHandler } from './$types'; + +export const POST: RequestHandler = async ({ request }) => { + const { a, b } = await request.json(); + return json(a + b); +}; diff --git a/playgrounds/basic/src/routes/about/+page.svelte b/playgrounds/basic/src/routes/about/+page.svelte new file mode 100644 index 000000000000..d73780a99efd --- /dev/null +++ b/playgrounds/basic/src/routes/about/+page.svelte @@ -0,0 +1 @@ +<a href="/">home</a> diff --git a/playgrounds/basic/jsconfig.json b/playgrounds/basic/tsconfig.json similarity index 100% rename from playgrounds/basic/jsconfig.json rename to playgrounds/basic/tsconfig.json diff --git a/playgrounds/basic/vite.config.js b/playgrounds/basic/vite.config.js index 7617d19b8849..23ac5e8dcd7b 100644 --- a/playgrounds/basic/vite.config.js +++ b/playgrounds/basic/vite.config.js @@ -1,11 +1,10 @@ import { sveltekit } from '@sveltejs/kit/vite'; -import { defineConfig } from 'vite'; -export default defineConfig({ +export default { plugins: [sveltekit()], server: { fs: { allow: ['../../packages/kit'] } } -}); +}; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aa95a3a3d02f..a33bda6a51ed 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.27.8 '@sveltejs/eslint-config': specifier: ^8.1.0 - version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) + version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.13))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 @@ -28,7 +28,7 @@ importers: version: 3.1.1 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.1.2(prettier@3.1.1)(svelte@5.1.9) + version: 3.1.2(prettier@3.1.1)(svelte@5.1.13) typescript-eslint: specifier: ^8.0.0 version: 8.4.0(eslint@9.6.0)(typescript@5.6.3) @@ -44,7 +44,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -137,7 +137,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -177,7 +177,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -274,7 +274,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -289,7 +289,7 @@ importers: dependencies: '@sveltejs/kit': specifier: ^1.0.0 || ^2.0.0 - version: 2.7.3(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) devDependencies: typescript: specifier: ^5.3.3 @@ -304,7 +304,7 @@ importers: version: 0.30.11 svelte-parse-markup: specifier: ^0.1.5 - version: 0.1.5(svelte@5.1.9) + version: 0.1.5(svelte@5.1.13) vite-imagetools: specifier: ^7.0.1 version: 7.0.1(rollup@4.24.0) @@ -322,8 +322,8 @@ importers: specifier: ^4.14.2 version: 4.24.0 svelte: - specifier: ^5.0.0 - version: 5.1.9 + specifier: ^5.1.3 + version: 5.1.13 typescript: specifier: ^5.6.3 version: 5.6.3 @@ -1045,7 +1045,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1101,23 +1101,29 @@ importers: specifier: workspace:* version: link:../../packages/package '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^4.0.0 + version: 4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + prettier: + specifier: ^3.3.2 + version: 3.3.3 + prettier-plugin-svelte: + specifier: ^3.2.6 + version: 3.2.7(prettier@3.3.3)(svelte@5.1.13) publint: specifier: ^0.2.0 version: 0.2.7 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.1.13 + version: 5.1.13 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@5.1.13)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.0 + version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^5.4.4 + version: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) packages: @@ -1896,6 +1902,14 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte-inspector@3.0.1': + resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte@3.1.0': resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==} engines: {node: ^18.0.0 || >=20} @@ -1903,6 +1917,13 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte@4.0.0': + resolution: {integrity: sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0-next.96 || ^5.0.0 + vite: ^5.0.0 + '@svitejs/changesets-changelog-github-compact@1.1.0': resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} @@ -2264,6 +2285,15 @@ packages: supports-color: optional: true + debug@4.3.7: + resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dedent-js@1.0.1: resolution: {integrity: sha512-OUepMozQULMLUmhxS95Vudo0jb0UchLimi3+pQ2plj61Fcy8axbP9hbiD4Sz6DPqn6XG3kfmziVfQ1rSys5AJQ==} @@ -2869,6 +2899,9 @@ packages: magic-string@0.30.11: resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} + magic-string@0.30.12: + resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} @@ -2944,6 +2977,9 @@ packages: ms@2.1.2: resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + mustache@4.2.0: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true @@ -3176,6 +3212,12 @@ packages: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier-plugin-svelte@3.2.7: + resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -3186,6 +3228,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.3.3: + resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} + engines: {node: '>=14'} + hasBin: true + pretty-format@29.7.0: resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} @@ -3500,8 +3547,8 @@ packages: resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} engines: {node: '>=16'} - svelte@5.1.9: - resolution: {integrity: sha512-nzq+PPKGS2PoEWDjAcXSrKSbXmmmOAxd6dAz1IhRusUpVkFS6DMELWPyBPGwu6TpO/gsgtFXwX0M4+pAR5gzKw==} + svelte@5.1.13: + resolution: {integrity: sha512-xVNk8yLsZNfkyqWzVg8+nfU9ewiSjVW0S4qyTxfKa6Y7P5ZBhA+LDsh2cHWIXJQMltikQAk6W3sqGdQZSH58PA==} engines: {node: '>=18'} tapable@2.2.1: @@ -3656,6 +3703,37 @@ packages: terser: optional: true + vite@5.4.10: + resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} + engines: {node: ^18.0.0 || >=20.0.0} + hasBin: true + peerDependencies: + '@types/node': ^18.0.0 || >=20.0.0 + less: '*' + lightningcss: ^1.21.0 + sass: '*' + sass-embedded: '*' + stylus: '*' + sugarss: '*' + terser: ^5.4.0 + peerDependenciesMeta: + '@types/node': + optional: true + less: + optional: true + lightningcss: + optional: true + sass: + optional: true + sass-embedded: + optional: true + stylus: + optional: true + sugarss: + optional: true + terser: + optional: true + vitefu@0.2.5: resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} peerDependencies: @@ -3664,6 +3742,14 @@ packages: vite: optional: true + vitefu@1.0.3: + resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 + peerDependenciesMeta: + vite: + optional: true + vitest@2.0.1: resolution: {integrity: sha512-PBPvNXRJiywtI9NmbnEqHIhcXlk8mB0aKf6REQIaYGY4JtWF1Pg8Am+N0vAuxdg/wUSlxPSVJr8QdjwcVxc2Hg==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4417,20 +4503,20 @@ snapshots: eslint-visitor-keys: 4.1.0 espree: 10.2.0 - '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': + '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.13))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': dependencies: '@stylistic/eslint-plugin-js': 2.1.0(eslint@9.6.0) eslint: 9.6.0 eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.9.0(eslint@9.6.0) - eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.1.9) + eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.1.13) globals: 15.10.0 typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/cookie': 0.6.0 cookie: 0.6.0 devalue: 5.1.0 @@ -4442,9 +4528,9 @@ snapshots: sade: 1.8.1 set-cookie-parser: 2.6.0 sirv: 3.0.0 - svelte: 5.1.9 + svelte: 5.1.13 tiny-glob: 0.2.9 - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: @@ -4455,12 +4541,30 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.3.5 - svelte: 5.1.9 - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + svelte: 4.2.19 + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.3.5 + svelte: 5.1.13 + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.3.7 + svelte: 5.1.13 + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - supports-color @@ -4478,17 +4582,44 @@ snapshots: transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.9)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.3.5 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.11 - svelte: 5.1.9 - svelte-hmr: 0.16.0(svelte@5.1.9) - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 0.2.5(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + svelte: 4.2.19 + svelte-hmr: 0.16.0(svelte@4.2.19) + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 0.2.5(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.3.5 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.11 + svelte: 5.1.13 + svelte-hmr: 0.16.0(svelte@5.1.13) + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 0.2.5(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + transitivePeerDependencies: + - supports-color + + '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.3.7 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.12 + svelte: 5.1.13 + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.3(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) transitivePeerDependencies: - supports-color @@ -4884,6 +5015,10 @@ snapshots: dependencies: ms: 2.1.2 + debug@4.3.7: + dependencies: + ms: 2.1.3 + dedent-js@1.0.1: {} deep-eql@5.0.2: {} @@ -5027,7 +5162,7 @@ snapshots: minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.9): + eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.13): dependencies: '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 @@ -5040,9 +5175,9 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.4.47) postcss-selector-parser: 6.1.2 semver: 7.6.3 - svelte-eslint-parser: 0.39.2(svelte@5.1.9) + svelte-eslint-parser: 0.39.2(svelte@5.1.13) optionalDependencies: - svelte: 5.1.9 + svelte: 5.1.13 transitivePeerDependencies: - ts-node @@ -5522,6 +5657,10 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 + magic-string@0.30.12: + dependencies: + '@jridgewell/sourcemap-codec': 1.5.0 + make-dir@3.1.0: dependencies: semver: 6.3.1 @@ -5593,6 +5732,8 @@ snapshots: ms@2.1.2: {} + ms@2.1.3: {} + mustache@4.2.0: {} nanoid@3.3.7: {} @@ -5775,15 +5916,22 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.1.2(prettier@3.1.1)(svelte@5.1.9): + prettier-plugin-svelte@3.1.2(prettier@3.1.1)(svelte@5.1.13): dependencies: prettier: 3.1.1 - svelte: 5.1.9 + svelte: 5.1.13 + + prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.1.13): + dependencies: + prettier: 3.3.3 + svelte: 5.1.13 prettier@2.8.8: {} prettier@3.1.1: {} + prettier@3.3.3: {} + pretty-format@29.7.0: dependencies: '@jest/schemas': 29.6.3 @@ -6045,7 +6193,19 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.39.2(svelte@5.1.9): + svelte-check@4.0.1(picomatch@4.0.2)(svelte@5.1.13)(typescript@5.6.3): + dependencies: + '@jridgewell/trace-mapping': 0.3.25 + chokidar: 3.6.0 + fdir: 6.3.0(picomatch@4.0.2) + picocolors: 1.1.0 + sade: 1.8.1 + svelte: 5.1.13 + typescript: 5.6.3 + transitivePeerDependencies: + - picomatch + + svelte-eslint-parser@0.39.2(svelte@5.1.13): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -6053,19 +6213,19 @@ snapshots: postcss: 8.4.47 postcss-scss: 4.0.9(postcss@8.4.47) optionalDependencies: - svelte: 5.1.9 + svelte: 5.1.13 svelte-hmr@0.16.0(svelte@4.2.19): dependencies: svelte: 4.2.19 - svelte-hmr@0.16.0(svelte@5.1.9): + svelte-hmr@0.16.0(svelte@5.1.13): dependencies: - svelte: 5.1.9 + svelte: 5.1.13 - svelte-parse-markup@0.1.5(svelte@5.1.9): + svelte-parse-markup@0.1.5(svelte@5.1.13): dependencies: - svelte: 5.1.9 + svelte: 5.1.13 svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.4.5): dependencies: @@ -6101,7 +6261,7 @@ snapshots: magic-string: 0.30.11 periscopic: 3.1.0 - svelte@5.1.9: + svelte@5.1.13: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 @@ -6237,12 +6397,13 @@ snapshots: debug: 4.3.5 pathe: 1.1.2 picocolors: 1.1.0 - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - '@types/node' - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color @@ -6258,10 +6419,28 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.24.1 + vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1): + dependencies: + esbuild: 0.21.5 + postcss: 8.4.47 + rollup: 4.24.0 + optionalDependencies: + '@types/node': 18.19.50 + fsevents: 2.3.3 + lightningcss: 1.24.1 + vitefu@0.2.5(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)): optionalDependencies: vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu@0.2.5(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)): + optionalDependencies: + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + + vitefu@1.0.3(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)): + optionalDependencies: + vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + vitest@2.0.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: '@ampproject/remapping': 2.3.0 @@ -6288,6 +6467,7 @@ snapshots: - less - lightningcss - sass + - sass-embedded - stylus - sugarss - supports-color From 6df00fc8448bf72c91e8f6faee0605995b0fdd65 Mon Sep 17 00:00:00 2001 From: Mathias Picker <48158184+MathiasWP@users.noreply.github.com> Date: Wed, 13 Nov 2024 03:36:23 +0100 Subject: [PATCH 0753/1135] fix: csp nonce in `script-src-elem`, `style-src-attr` and `style-src-elem` when using unsafe-inline (#11613) * add nonce to script-src-elem csp directive if defined * added changeset * also handle hashes and style-src-attr and style-src-elem * changed order of variable declaration * fixed typo * updated changeset * fix bug and update test * update test * write better tests and fix bugs * Update .changeset/giant-years-drum.md * fix csp nonce in script-src-elem, style-src-attr and style-src-elem when using unsafe-inline * fix test desc * Update giant-years-drum.md * refactor * rename variable * avoid duplicate empty comment hash * add back removed test * added back another test * add back skips nonce in style-src when using unsafe-inline test * put tests in same order --------- Co-authored-by: Rich Harris <hello@rich-harris.dev> Co-authored-by: Chew Tee Ming <chew.tee.ming@nindatech.com> --- .changeset/giant-years-drum.md | 5 + packages/kit/src/runtime/server/page/csp.js | 130 +++++++++--------- .../kit/src/runtime/server/page/csp.spec.js | 49 ++++++- 3 files changed, 117 insertions(+), 67 deletions(-) create mode 100644 .changeset/giant-years-drum.md diff --git a/.changeset/giant-years-drum.md b/.changeset/giant-years-drum.md new file mode 100644 index 000000000000..e1129e0d0486 --- /dev/null +++ b/.changeset/giant-years-drum.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: only add nonce to `script-src-elem`, `style-src-attr` and `style-src-elem` CSP directives when `unsafe-inline` is not present diff --git a/packages/kit/src/runtime/server/page/csp.js b/packages/kit/src/runtime/server/page/csp.js index 547c43cd8835..336d50261ad3 100644 --- a/packages/kit/src/runtime/server/page/csp.js +++ b/packages/kit/src/runtime/server/page/csp.js @@ -31,9 +31,24 @@ class BaseProvider { /** @type {boolean} */ #script_needs_csp; + /** @type {boolean} */ + #script_src_needs_csp; + + /** @type {boolean} */ + #script_src_elem_needs_csp; + /** @type {boolean} */ #style_needs_csp; + /** @type {boolean} */ + #style_src_needs_csp; + + /** @type {boolean} */ + #style_src_attr_needs_csp; + + /** @type {boolean} */ + #style_src_elem_needs_csp; + /** @type {import('types').CspDirectives} */ #directives; @@ -121,92 +136,81 @@ class BaseProvider { } } - this.#script_needs_csp = - (!!effective_script_src && - effective_script_src.filter((value) => value !== 'unsafe-inline').length > 0) || - (!!script_src_elem && - script_src_elem.filter((value) => value !== 'unsafe-inline').length > 0); + /** @param {(import('types').Csp.Source | import('types').Csp.ActionSource)[] | undefined} directive */ + const needs_csp = (directive) => + !!directive && !directive.some((value) => value === 'unsafe-inline'); + this.#script_src_needs_csp = needs_csp(effective_script_src); + this.#script_src_elem_needs_csp = needs_csp(script_src_elem); + this.#style_src_needs_csp = needs_csp(effective_style_src); + this.#style_src_attr_needs_csp = needs_csp(style_src_attr); + this.#style_src_elem_needs_csp = needs_csp(style_src_elem); + + this.#script_needs_csp = this.#script_src_needs_csp || this.#script_src_elem_needs_csp; this.#style_needs_csp = !__SVELTEKIT_DEV__ && - ((!!effective_style_src && - effective_style_src.filter((value) => value !== 'unsafe-inline').length > 0) || - (!!style_src_attr && - style_src_attr.filter((value) => value !== 'unsafe-inline').length > 0) || - (!!style_src_elem && - style_src_elem.filter((value) => value !== 'unsafe-inline').length > 0)); + (this.#style_src_needs_csp || + this.#style_src_attr_needs_csp || + this.#style_src_elem_needs_csp); this.script_needs_nonce = this.#script_needs_csp && !this.#use_hashes; this.style_needs_nonce = this.#style_needs_csp && !this.#use_hashes; + this.#nonce = nonce; } /** @param {string} content */ add_script(content) { - if (this.#script_needs_csp) { - const d = this.#directives; + if (!this.#script_needs_csp) return; - if (this.#use_hashes) { - const hash = sha256(content); - - this.#script_src.push(`sha256-${hash}`); - - if (d['script-src-elem']?.length) { - this.#script_src_elem.push(`sha256-${hash}`); - } - } else { - if (this.#script_src.length === 0) { - this.#script_src.push(`nonce-${this.#nonce}`); - } - if (d['script-src-elem']?.length) { - this.#script_src_elem.push(`nonce-${this.#nonce}`); - } - } + /** @type {`nonce-${string}` | `sha256-${string}`} */ + const source = this.#use_hashes ? `sha256-${sha256(content)}` : `nonce-${this.#nonce}`; + + if (this.#script_src_needs_csp) { + this.#script_src.push(source); + } + + if (this.#script_src_elem_needs_csp) { + this.#script_src_elem.push(source); } } /** @param {string} content */ add_style(content) { - if (this.#style_needs_csp) { - // this is the hash for "/* empty */" - // adding it so that svelte does not break csp - // see https://github.com/sveltejs/svelte/pull/7800 - const empty_comment_hash = '9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc='; + if (!this.#style_needs_csp) return; - const d = this.#directives; + /** @type {`nonce-${string}` | `sha256-${string}`} */ + const source = this.#use_hashes ? `sha256-${sha256(content)}` : `nonce-${this.#nonce}`; - if (this.#use_hashes) { - const hash = sha256(content); + if (this.#style_src_needs_csp) { + this.#style_src.push(source); + } - this.#style_src.push(`sha256-${hash}`); + if (this.#style_src_needs_csp) { + this.#style_src.push(source); + } - if (d['style-src-attr']?.length) { - this.#style_src_attr.push(`sha256-${hash}`); - } - if (d['style-src-elem']?.length) { - if ( - hash !== empty_comment_hash && - !d['style-src-elem'].includes(`sha256-${empty_comment_hash}`) - ) { - this.#style_src_elem.push(`sha256-${empty_comment_hash}`); - } + if (this.#style_src_attr_needs_csp) { + this.#style_src_attr.push(source); + } - this.#style_src_elem.push(`sha256-${hash}`); - } - } else { - if (this.#style_src.length === 0 && !d['style-src']?.includes('unsafe-inline')) { - this.#style_src.push(`nonce-${this.#nonce}`); - } - if (d['style-src-attr']?.length) { - this.#style_src_attr.push(`nonce-${this.#nonce}`); - } - if (d['style-src-elem']?.length) { - if (!d['style-src-elem'].includes(`sha256-${empty_comment_hash}`)) { - this.#style_src_elem.push(`sha256-${empty_comment_hash}`); - } + if (this.#style_src_elem_needs_csp) { + // this is the sha256 hash for the string "/* empty */" + // adding it so that svelte does not break csp + // see https://github.com/sveltejs/svelte/pull/7800 + const sha256_empty_comment_hash = 'sha256-9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc='; + const d = this.#directives; + + if ( + d['style-src-elem'] && + !d['style-src-elem'].includes(sha256_empty_comment_hash) && + !this.#style_src_elem.includes(sha256_empty_comment_hash) + ) { + this.#style_src_elem.push(sha256_empty_comment_hash); + } - this.#style_src_elem.push(`nonce-${this.#nonce}`); - } + if (source !== sha256_empty_comment_hash) { + this.#style_src_elem.push(source); } } } diff --git a/packages/kit/src/runtime/server/page/csp.spec.js b/packages/kit/src/runtime/server/page/csp.spec.js index 670d27305065..6dc1a9435856 100644 --- a/packages/kit/src/runtime/server/page/csp.spec.js +++ b/packages/kit/src/runtime/server/page/csp.spec.js @@ -84,10 +84,20 @@ test('skips nonce with unsafe-inline', () => { { mode: 'nonce', directives: { - 'default-src': ['unsafe-inline'] + 'default-src': ['unsafe-inline'], + 'script-src': ['unsafe-inline'], + 'script-src-elem': ['unsafe-inline'], + 'style-src': ['unsafe-inline'], + 'style-src-attr': ['unsafe-inline'], + 'style-src-elem': ['unsafe-inline'] }, reportOnly: { 'default-src': ['unsafe-inline'], + 'script-src': ['unsafe-inline'], + 'script-src-elem': ['unsafe-inline'], + 'style-src': ['unsafe-inline'], + 'style-src-attr': ['unsafe-inline'], + 'style-src-elem': ['unsafe-inline'], 'report-uri': ['/'] } }, @@ -97,9 +107,16 @@ test('skips nonce with unsafe-inline', () => { ); csp.add_script(''); + csp.add_style(''); - assert.equal(csp.csp_provider.get_header(), "default-src 'unsafe-inline'"); - assert.equal(csp.report_only_provider.get_header(), "default-src 'unsafe-inline'; report-uri /"); + assert.equal( + csp.csp_provider.get_header(), + "default-src 'unsafe-inline'; script-src 'unsafe-inline'; script-src-elem 'unsafe-inline'; style-src 'unsafe-inline'; style-src-attr 'unsafe-inline'; style-src-elem 'unsafe-inline'" + ); + assert.equal( + csp.report_only_provider.get_header(), + "default-src 'unsafe-inline'; script-src 'unsafe-inline'; script-src-elem 'unsafe-inline'; style-src 'unsafe-inline'; style-src-attr 'unsafe-inline'; style-src-elem 'unsafe-inline'; report-uri /" + ); }); test('skips nonce in style-src when using unsafe-inline', () => { @@ -151,6 +168,30 @@ test('skips hash with unsafe-inline', () => { assert.equal(csp.report_only_provider.get_header(), "default-src 'unsafe-inline'; report-uri /"); }); +test('does not add empty comment hash to style-src-elem if already defined', () => { + const csp = new Csp( + { + mode: 'hash', + directives: { + 'style-src-elem': ['self', 'sha256-9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc='] + }, + reportOnly: { + 'report-uri': ['/'] + } + }, + { + prerender: false + } + ); + + csp.add_style('/* empty */'); + + assert.equal( + csp.csp_provider.get_header(), + "style-src-elem 'self' 'sha256-9OlNO0DNEeaVzHL4RZwCLsBHA8WBQ8toBp/4F5XV2nc='" + ); +}); + test('skips frame-ancestors, report-uri, sandbox from meta tags', () => { const csp = new Csp( { @@ -179,7 +220,7 @@ test('skips frame-ancestors, report-uri, sandbox from meta tags', () => { ); }); -test('adds nonce to script-src-elem, style-src-attr and style-src-elem if necessary', () => { +test('adds nonce style-src-attr and style-src-elem and nonce + sha to script-src-elem if necessary', () => { const csp = new Csp( { mode: 'auto', From 7b5c98d65a6433cc4b3caeefa7d7677b9965103c Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 12 Nov 2024 19:06:49 -0800 Subject: [PATCH 0754/1135] chore: setup pkg.pr.new (#12977) --- .github/workflows/ci.yml | 13 ++++++++++++- CONTRIBUTING.md | 10 +++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 486af3633207..c754c5f185f8 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,6 +19,17 @@ permissions: contents: read # to fetch code (actions/checkout) jobs: + pkg-pr-new: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v4.0.0 + - uses: actions/setup-node@v4 + with: + node-version: 22 + cache: pnpm + - run: pnpm install --frozen-lockfile + - run: pnpx pkg-pr-new publish --comment=off ./packages/kit lint-all: runs-on: ubuntu-latest steps: @@ -26,7 +37,7 @@ jobs: - uses: pnpm/action-setup@v4.0.0 - uses: actions/setup-node@v4 with: - node-version: '18.x' + node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - run: pnpm run lint diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index ca6709e3b704..df548cfa14bc 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -22,7 +22,7 @@ pnpm install You can use the playground at [`playgrounds/basic`](./playgrounds/basic/) to experiment with your changes to SvelteKit locally. -### Linking +### Linking local changes If you want to test against an existing project, you can use [pnpm `overrides`](https://pnpm.io/package_json#pnpmoverrides) in that project: @@ -39,6 +39,14 @@ If you want to test against an existing project, you can use [pnpm `overrides`]( } ``` +### Testing PR changes + +Each pull request will be built and published via [pkg.pr.new/](https://pkg.pr.new/). You can test the change by installing the package with your PR number: + +``` +npm add https://pkg.pr.new/sveltejs/kit/@sveltejs/kit@YOUR_PR_NUMBER_GOES_HERE +``` + ## Code structure Entry points to be aware of are: From 7a17bd2712203ca8ec3a3343174a8e4185729bfa Mon Sep 17 00:00:00 2001 From: Scott <sw@scottwu.ca> Date: Wed, 13 Nov 2024 11:12:31 +0800 Subject: [PATCH 0755/1135] docs: fix title for the code block (#12991) * . * this is better? * similar changes to other files * Update documentation/docs/30-advanced/25-errors.md --------- Co-authored-by: Chew Tee Ming <chew.tee.ming@nindatech.com> Co-authored-by: Tee Ming <chewteeming01@gmail.com> --- documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md | 2 +- .../docs/25-build-and-deploy/70-adapter-cloudflare-workers.md | 2 +- documentation/docs/30-advanced/25-errors.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index b1dea91bdd6b..3704dc0454b8 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -84,7 +84,7 @@ export async function POST({ request, platform }) { To include type declarations for your bindings, reference them in your `src/app.d.ts`: -```dts +```ts /// file: src/app.d.ts declare global { namespace App { diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index 6635f566d38a..b4e270f62283 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -105,7 +105,7 @@ export async function POST({ request, platform }) { To include type declarations for your bindings, reference them in your `src/app.d.ts`: -```dts +```ts /// file: src/app.d.ts declare global { namespace App { diff --git a/documentation/docs/30-advanced/25-errors.md b/documentation/docs/30-advanced/25-errors.md index 7449b5137723..5fd17455add9 100644 --- a/documentation/docs/30-advanced/25-errors.md +++ b/documentation/docs/30-advanced/25-errors.md @@ -126,7 +126,7 @@ The exception is when the error occurs inside the root `+layout.js` or `+layout. If you're using TypeScript and need to customize the shape of errors, you can do so by declaring an `App.Error` interface in your app (by convention, in `src/app.d.ts`, though it can live anywhere that TypeScript can 'see'): -```dts +```ts /// file: src/app.d.ts declare global { namespace App { From 0bd4426944ce9995b86199900e39c8d3929fa2f2 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 12 Nov 2024 20:14:38 -0800 Subject: [PATCH 0756/1135] fix: support custom servers using HTTP/2 in production (#12989) Co-authored-by: Chew Tee Ming <chew.tee.ming@nindatech.com> --- .changeset/shy-needles-warn.md | 5 +++++ packages/kit/src/exports/node/index.js | 16 +++++++++++++++- packages/kit/src/exports/vite/index.js | 16 ---------------- packages/kit/src/exports/vite/preview/index.js | 2 +- 4 files changed, 21 insertions(+), 18 deletions(-) create mode 100644 .changeset/shy-needles-warn.md diff --git a/.changeset/shy-needles-warn.md b/.changeset/shy-needles-warn.md new file mode 100644 index 000000000000..543a36d18102 --- /dev/null +++ b/.changeset/shy-needles-warn.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: support HTTP/2 in dev and production. Revert the changes from [#12907](https://github.com/sveltejs/kit/pull/12907) to downgrade HTTP/2 to TLS as now being unnecessary diff --git a/packages/kit/src/exports/node/index.js b/packages/kit/src/exports/node/index.js index b3fe17c5a4f7..c4def8f89cd0 100644 --- a/packages/kit/src/exports/node/index.js +++ b/packages/kit/src/exports/node/index.js @@ -106,11 +106,25 @@ function get_raw_body(req, body_size_limit) { // TODO 3.0 make the signature synchronous? // eslint-disable-next-line @typescript-eslint/require-await export async function getRequest({ request, base, bodySizeLimit }) { + let headers = /** @type {Record<string, string>} */ (request.headers); + if (request.httpVersionMajor >= 2) { + // the Request constructor rejects headers with ':' in the name + headers = Object.assign({}, headers); + // https://www.rfc-editor.org/rfc/rfc9113.html#section-8.3.1-2.3.5 + if (headers[':authority']) { + headers.host = headers[':authority']; + } + delete headers[':authority']; + delete headers[':method']; + delete headers[':path']; + delete headers[':scheme']; + } + return new Request(base + request.url, { // @ts-expect-error duplex: 'half', method: request.method, - headers: /** @type {Record<string, string>} */ (request.headers), + headers: Object.entries(headers), body: request.method === 'GET' || request.method === 'HEAD' ? undefined diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 40fa4c6edb56..e6521e979560 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -349,22 +349,6 @@ async function kit({ svelte_config }) { * Stores the final config. */ configResolved(config) { - // we search for this plugin by name because we can't detect it - // since it doesn't directly modify the https config unlike the mkcert plugin - const vite_basic_ssl = config.plugins.find(({ name }) => name === 'vite:basic-ssl'); - - // by default, when enabling HTTPS in Vite, it also enables HTTP/2 - // however, undici has not yet enabled HTTP/2 by default: https://github.com/nodejs/undici/issues/2750 - // we set a no-op proxy config to force Vite to downgrade to TLS-only - // see https://vitejs.dev/config/#server-https - if ((config.server.https || vite_basic_ssl) && !config.server.proxy) { - config.server.proxy = {}; - } - - if ((config.preview.https || vite_basic_ssl) && !config.preview.proxy) { - config.preview.proxy = {}; - } - vite_config = config; } }; diff --git a/packages/kit/src/exports/vite/preview/index.js b/packages/kit/src/exports/vite/preview/index.js index 37e04f72f602..481fa087eab7 100644 --- a/packages/kit/src/exports/vite/preview/index.js +++ b/packages/kit/src/exports/vite/preview/index.js @@ -185,7 +185,7 @@ export async function preview(vite, vite_config, svelte_config) { // SSR vite.middlewares.use(async (req, res) => { - const host = req.headers['host']; + const host = req.headers[':authority'] || req.headers.host; const request = await getRequest({ base: `${protocol}://${host}`, From ff86b70e6f584c60c5ba1f7d24a45dac1cb24d35 Mon Sep 17 00:00:00 2001 From: Bishwas Bhandari <42182303+Bishwas-py@users.noreply.github.com> Date: Wed, 13 Nov 2024 11:22:39 +0545 Subject: [PATCH 0757/1135] docs: block controls visible #815 (#12969) * chore: block controls visible #815 * chore: reverted --- documentation/docs/98-reference/54-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/98-reference/54-types.md b/documentation/docs/98-reference/54-types.md index 691da2193d68..2b24ed69034c 100644 --- a/documentation/docs/98-reference/54-types.md +++ b/documentation/docs/98-reference/54-types.md @@ -25,7 +25,7 @@ To solve this problem, SvelteKit generates `.d.ts` files for each of your endpoi ```ts /// file: .svelte-kit/types/src/routes/[foo]/[bar]/[baz]/$types.d.ts -/// link: false +/// link: true import type * as Kit from '@sveltejs/kit'; type RouteParams = { From 98de316fafacc4051ae2385442bbf1c7986c7787 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:21:25 -0800 Subject: [PATCH 0758/1135] chore(deps): update pnpm to v9.13.0 (#12994) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 42303946f718..2626d1c03486 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.12.3", + "packageManager": "pnpm@9.13.0", "engines": { "pnpm": "^9.0.0" } From 435984bf61b047d1e1a8efe88354ca7ac4e9109f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 13 Nov 2024 09:22:53 -0800 Subject: [PATCH 0759/1135] Version Packages (#12992) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/giant-years-drum.md | 5 ----- .changeset/shy-needles-warn.md | 5 ----- packages/kit/CHANGELOG.md | 9 +++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 .changeset/giant-years-drum.md delete mode 100644 .changeset/shy-needles-warn.md diff --git a/.changeset/giant-years-drum.md b/.changeset/giant-years-drum.md deleted file mode 100644 index e1129e0d0486..000000000000 --- a/.changeset/giant-years-drum.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/kit": patch ---- - -fix: only add nonce to `script-src-elem`, `style-src-attr` and `style-src-elem` CSP directives when `unsafe-inline` is not present diff --git a/.changeset/shy-needles-warn.md b/.changeset/shy-needles-warn.md deleted file mode 100644 index 543a36d18102..000000000000 --- a/.changeset/shy-needles-warn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: support HTTP/2 in dev and production. Revert the changes from [#12907](https://github.com/sveltejs/kit/pull/12907) to downgrade HTTP/2 to TLS as now being unnecessary diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 02f046987b9e..dfb013500e2b 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/kit +## 2.8.1 +### Patch Changes + + +- fix: only add nonce to `script-src-elem`, `style-src-attr` and `style-src-elem` CSP directives when `unsafe-inline` is not present ([#11613](https://github.com/sveltejs/kit/pull/11613)) + + +- fix: support HTTP/2 in dev and production. Revert the changes from [#12907](https://github.com/sveltejs/kit/pull/12907) to downgrade HTTP/2 to TLS as now being unnecessary ([#12989](https://github.com/sveltejs/kit/pull/12989)) + ## 2.8.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 2d6c4df160ee..f6677fca7a25 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.8.0", + "version": "2.8.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 3b8f5a9e08c1..81d457f85270 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.8.0'; +export const VERSION = '2.8.1'; From 143dbf9da9d65dedfc370160c229c317fe18361c Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 17 Nov 2024 18:44:02 -0800 Subject: [PATCH 0760/1135] docs: update vitePreprocess section for Svelte 5 (#13011) --- documentation/docs/60-appendix/20-integrations.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/docs/60-appendix/20-integrations.md b/documentation/docs/60-appendix/20-integrations.md index d3d9a8fcf780..63e3fa5ad553 100644 --- a/documentation/docs/60-appendix/20-integrations.md +++ b/documentation/docs/60-appendix/20-integrations.md @@ -4,7 +4,7 @@ title: Integrations ## `vitePreprocess` -Including [`vitePreprocess`](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/preprocess.md) in your project will allow you to use the various flavors of JS and CSS that Vite supports: TypeScript, PostCSS, SCSS, Less, Stylus, and SugarSS. If you set your project up with TypeScript it will be included by default: +Including [`vitePreprocess`](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/preprocess.md) in your project will allow you to use the various flavors of CSS that Vite supports: PostCSS, SCSS, Less, Stylus, and SugarSS. If you set your project up with TypeScript it will be included by default: ```js // svelte.config.js @@ -15,6 +15,8 @@ export default { }; ``` +You will also need to use a preprocessor if you're using TypeScript with Svelte 4. TypeScript is supported natively in Svelte 5 if you're using only the type syntax. To use more complex TypeScript syntax in Svelte 5, you will need still need a preprocessor and can use `vitePreprocess({ script: true })`. + ## Adders Run `npx sv add` to setup many different complex integrations with a single command including: From 570562b74d9e9f295d9b617478088a650f51e96b Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Tue, 19 Nov 2024 11:45:57 +0800 Subject: [PATCH 0761/1135] fix: handle empty Headers when serialising Request passed to fetch (#13023) --- .changeset/honest-hornets-doubt.md | 5 +++++ packages/kit/src/runtime/client/client.js | 4 +++- .../load/fetch-request-empty-headers/+page.js | 6 ++++++ .../load/fetch-request-empty-headers/+page.svelte | 6 ++++++ packages/kit/test/apps/basics/test/client.test.js | 15 +++++++++++++++ 5 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 .changeset/honest-hornets-doubt.md create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.svelte diff --git a/.changeset/honest-hornets-doubt.md b/.changeset/honest-hornets-doubt.md new file mode 100644 index 000000000000..b34bed919926 --- /dev/null +++ b/.changeset/honest-hornets-doubt.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: prevent duplicate fetch request when using Request with load function's fetch diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index df35010c65c1..656174365198 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -669,7 +669,9 @@ async function load_node({ loader, parent, url, params, route, server_data_node : await resource.blob(), cache: resource.cache, credentials: resource.credentials, - headers: resource.headers, + // the headers are undefined on the server if the Headers object is empty + // so we need to make sure they are also undefined here if there are no headers + headers: [...resource.headers].length ? resource.headers : undefined, integrity: resource.integrity, keepalive: resource.keepalive, method: resource.method, diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.js b/packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.js new file mode 100644 index 000000000000..895e97248da7 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.js @@ -0,0 +1,6 @@ +/** @type {import('@sveltejs/kit').Load} */ +export async function load({ url, fetch }) { + const res = await fetch(new Request(url.origin + '/load/fetch-request.json')); + const { answer } = await res.json(); + return { answer }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.svelte new file mode 100644 index 000000000000..c890e7840e38 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-request-empty-headers/+page.svelte @@ -0,0 +1,6 @@ +<script> + /** @type {import('./$types').PageData} */ + export let data; +</script> + +<h1>the answer is {data.answer}</h1> diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 351cbdbeb7ad..56b2c96bc744 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -252,6 +252,21 @@ test.describe('Load', () => { expect(logs).toContain('Called a patched window.fetch'); }); + test('does not repeat fetch on hydration when using Request object', async ({ page }) => { + const requests = []; + page.on('request', (request) => { + if (request.url().includes('/load/fetch-request.json')) { + requests.push(request); + } + }); + + await page.goto('/load/fetch-request-empty-headers'); + + console.log({ requests }); + + expect(requests).toEqual([]); + }); + if (process.env.DEV) { test('using window.fetch causes a warning', async ({ page, baseURL }) => { await Promise.all([ From 94c45b9372a9ed2b80e21cdca3f235c45edaa5b0 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 19 Nov 2024 14:27:20 -0800 Subject: [PATCH 0762/1135] chore(deps): update pnpm to v9.13.2 (#13001) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 2626d1c03486..7108060b84a7 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.13.0", + "packageManager": "pnpm@9.13.2", "engines": { "pnpm": "^9.0.0" } From 239fe18849a0db5ee3114c943d24677b1c01c7be Mon Sep 17 00:00:00 2001 From: Bae Junehyeon <devunt@gmail.com> Date: Thu, 21 Nov 2024 11:36:21 +0900 Subject: [PATCH 0763/1135] docs: use svelte 5 syntax (#13030) * docs: use svelte 5 syntax * apply change to other pages too --------- Co-authored-by: Chew Tee Ming <chew.tee.ming@nindatech.com> --- documentation/docs/20-core-concepts/10-routing.md | 2 +- documentation/docs/20-core-concepts/20-load.md | 2 +- documentation/docs/20-core-concepts/30-form-actions.md | 4 ++-- documentation/docs/30-advanced/67-shallow-routing.md | 4 ++-- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 78c2b0ac719d..3cb2ba3ef3aa 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -330,7 +330,7 @@ By exporting `POST`/`PUT`/`PATCH`/`DELETE`/`OPTIONS`/`HEAD` handlers, `+server.j <input type="number" bind:value={b}> = {total} -<button on:click={add}>Calculate</button> +<button onclick={add}>Calculate</button> ``` ```js diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 7231b588d06a..bba63fd2be93 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -661,7 +661,7 @@ export async function load({ fetch, depends }) { </script> <p>random number: {data.number}</p> -<button on:click={rerunLoadFunction}>Update random number</button> +<button onclick={rerunLoadFunction}>Update random number</button> ``` ### When do load functions rerun? diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index dddae80da99f..74d08c9fdc15 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -451,7 +451,7 @@ We can also implement progressive enhancement ourselves, without `use:enhance`, } </script> -<form method="POST" on:submit|preventDefault={handleSubmit}> +<form method="POST" onsubmit|preventDefault={handleSubmit}> <!-- content --> </form> ``` @@ -484,7 +484,7 @@ Form actions are the preferred way to send data to the server, since they can be } </script> -<button on:click={rerun}>Rerun CI</button> +<button onclick={rerun}>Rerun CI</button> ``` ```js diff --git a/documentation/docs/30-advanced/67-shallow-routing.md b/documentation/docs/30-advanced/67-shallow-routing.md index f10edd0ad5ef..af7d38959946 100644 --- a/documentation/docs/30-advanced/67-shallow-routing.md +++ b/documentation/docs/30-advanced/67-shallow-routing.md @@ -57,7 +57,7 @@ For this to work, you need to load the data that the `+page.svelte` expects. A c {#each data.thumbnails as thumbnail} <a href="/photos/{thumbnail.id}" - on:click={async (e) => { + onclick={async (e) => { if (innerWidth < 640 // bail if the screen is too small || e.shiftKey // or the link is opened in a new window || e.metaKey || e.ctrlKey // or a new tab (mac: metaKey, win/linux: ctrlKey) @@ -86,7 +86,7 @@ For this to work, you need to load the data that the `+page.svelte` expects. A c {/each} {#if $page.state.selected} - <Modal on:close={() => history.back()}> + <Modal onclose={() => history.back()}> <!-- pass page data to the +page.svelte component, just like SvelteKit would on navigation --> <PhotoPage data={$page.state.selected} /> From 1358cccd52190df3c74bdd8970dbfb06ffc4ec72 Mon Sep 17 00:00:00 2001 From: kkarikos <kalle.karikoski@gmail.com> Date: Thu, 21 Nov 2024 22:28:02 +0200 Subject: [PATCH 0764/1135] fix: use default cookie decoder (#13037) Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/plenty-oranges-count.md | 5 +++++ packages/kit/src/runtime/server/cookie.js | 6 ++---- 2 files changed, 7 insertions(+), 4 deletions(-) create mode 100644 .changeset/plenty-oranges-count.md diff --git a/.changeset/plenty-oranges-count.md b/.changeset/plenty-oranges-count.md new file mode 100644 index 000000000000..3031d3cc6f43 --- /dev/null +++ b/.changeset/plenty-oranges-count.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: do not override default cookie decoder to allow users to override the `cookie` library version diff --git a/packages/kit/src/runtime/server/cookie.js b/packages/kit/src/runtime/server/cookie.js index ddefa847a432..f4442872fbeb 100644 --- a/packages/kit/src/runtime/server/cookie.js +++ b/packages/kit/src/runtime/server/cookie.js @@ -67,8 +67,7 @@ export function get_cookies(request, url, trailing_slash) { return c.value; } - const decoder = opts?.decode || decodeURIComponent; - const req_cookies = parse(header, { decode: decoder }); + const req_cookies = parse(header, { decode: opts?.decode }); const cookie = req_cookies[name]; // the decoded string or undefined // in development, if the cookie was set during this session with `cookies.set`, @@ -95,8 +94,7 @@ export function get_cookies(request, url, trailing_slash) { * @param {import('cookie').CookieParseOptions} opts */ getAll(opts) { - const decoder = opts?.decode || decodeURIComponent; - const cookies = parse(header, { decode: decoder }); + const cookies = parse(header, { decode: opts?.decode }); for (const c of Object.values(new_cookies)) { if ( From a3ef25f0cf7d5c5896581fb8701fe0daf8109e6a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 21 Nov 2024 15:40:45 -0800 Subject: [PATCH 0765/1135] chore(deps): update pnpm to v9.14.2 (#13029) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7108060b84a7..e1cd905dffd9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.13.2", + "packageManager": "pnpm@9.14.2", "engines": { "pnpm": "^9.0.0" } From 20df74854c674dc61eb34512b063ca94c8a6d856 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 22 Nov 2024 20:57:45 +0100 Subject: [PATCH 0766/1135] chore: support building with Node 22 (#13043) Also adjust the validation logic to not care at all when building on Vercel, to not have to update the adapter each time right away. Closes #13040 --- .changeset/long-rivers-stare.md | 5 ++++ .../25-build-and-deploy/90-adapter-vercel.md | 4 +-- packages/adapter-vercel/index.js | 26 ++++++++++++++----- 3 files changed, 27 insertions(+), 8 deletions(-) create mode 100644 .changeset/long-rivers-stare.md diff --git a/.changeset/long-rivers-stare.md b/.changeset/long-rivers-stare.md new file mode 100644 index 000000000000..8247736f92a9 --- /dev/null +++ b/.changeset/long-rivers-stare.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +chore: support building with Node 22 diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index 57867ce7c986..f8150c0fd7cd 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -44,13 +44,13 @@ export const config = { /// file: admin/+layout.js /** @type {import('@sveltejs/adapter-vercel').Config} */ export const config = { - runtime: 'nodejs18.x' + runtime: 'nodejs22.x' }; ``` The following options apply to all functions: -- `runtime`: `'edge'`, `'nodejs18.x'` or `'nodejs20.x'`. By default, the adapter will select the `'nodejs<version>.x'` corresponding to the Node version your project is configured to use on the Vercel dashboard +- `runtime`: `'edge'`, `'nodejs18.x'`, `'nodejs20.x'` or `'nodejs22.x'`. By default, the adapter will select the `'nodejs<version>.x'` corresponding to the Node version your project is configured to use on the Vercel dashboard - `regions`: an array of [edge network regions](https://vercel.com/docs/concepts/edge-network/regions) (defaulting to `["iad1"]` for serverless functions) or `'all'` if `runtime` is `edge` (its default). Note that multiple regions for serverless functions are only supported on Enterprise plans - `split`: if `true`, causes a route to be deployed as an individual function. If `split` is set to `true` at the adapter level, all routes will be deployed as individual functions diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index bb9114a0c10e..3fdd2f027b66 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -11,13 +11,27 @@ const name = '@sveltejs/adapter-vercel'; const DEFAULT_FUNCTION_NAME = 'fn'; const get_default_runtime = () => { - const major = process.version.slice(1).split('.')[0]; - if (major === '18') return 'nodejs18.x'; - if (major === '20') return 'nodejs20.x'; + const major = Number(process.version.slice(1).split('.')[0]); + + // If we're building on Vercel, we know that the version will be fine because Vercel + // provides Node (and Vercel won't provide something it doesn't support). + // Also means we're not on the hook for updating the adapter every time a new Node + // version is added to Vercel. + if (!process.env.VERCEL) { + if (major < 18 || major > 22) { + throw new Error( + `Building locally with unsupported Node.js version: ${process.version}. Please use Node 18, 20 or 22 to build your project, or explicitly specify a runtime in your adapter configuration.` + ); + } - throw new Error( - `Unsupported Node.js version: ${process.version}. Please use Node 18 or Node 20 to build your project, or explicitly specify a runtime in your adapter configuration.` - ); + if (major % 2 !== 0) { + throw new Error( + `Unsupported Node.js version: ${process.version}. Please use an even-numbered Node version to build your project, or explicitly specify a runtime in your adapter configuration.` + ); + } + } + + return `nodejs${major}.x`; }; // https://vercel.com/docs/functions/edge-functions/edge-runtime#compatible-node.js-modules From 5f8399d88fd9461a6111e03e6168067fba42e2c1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 22 Nov 2024 20:58:38 +0100 Subject: [PATCH 0767/1135] Version Packages (#13024) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/honest-hornets-doubt.md | 5 ----- .changeset/long-rivers-stare.md | 5 ----- .changeset/plenty-oranges-count.md | 5 ----- packages/adapter-vercel/CHANGELOG.md | 9 +++++++++ packages/adapter-vercel/package.json | 2 +- packages/kit/CHANGELOG.md | 9 +++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 8 files changed, 21 insertions(+), 18 deletions(-) delete mode 100644 .changeset/honest-hornets-doubt.md delete mode 100644 .changeset/long-rivers-stare.md delete mode 100644 .changeset/plenty-oranges-count.md diff --git a/.changeset/honest-hornets-doubt.md b/.changeset/honest-hornets-doubt.md deleted file mode 100644 index b34bed919926..000000000000 --- a/.changeset/honest-hornets-doubt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: prevent duplicate fetch request when using Request with load function's fetch diff --git a/.changeset/long-rivers-stare.md b/.changeset/long-rivers-stare.md deleted file mode 100644 index 8247736f92a9..000000000000 --- a/.changeset/long-rivers-stare.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-vercel': patch ---- - -chore: support building with Node 22 diff --git a/.changeset/plenty-oranges-count.md b/.changeset/plenty-oranges-count.md deleted file mode 100644 index 3031d3cc6f43..000000000000 --- a/.changeset/plenty-oranges-count.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: do not override default cookie decoder to allow users to override the `cookie` library version diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index 6ef0f2787c62..9002d1d318e4 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-vercel +## 5.4.8 +### Patch Changes + + +- chore: support building with Node 22 ([#13043](https://github.com/sveltejs/kit/pull/13043)) + +- Updated dependencies [[`570562b74d9e9f295d9b617478088a650f51e96b`](https://github.com/sveltejs/kit/commit/570562b74d9e9f295d9b617478088a650f51e96b), [`1358cccd52190df3c74bdd8970dbfb06ffc4ec72`](https://github.com/sveltejs/kit/commit/1358cccd52190df3c74bdd8970dbfb06ffc4ec72)]: + - @sveltejs/kit@2.8.2 + ## 5.4.7 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index f8e1f6cf0feb..1a415a47c947 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.4.7", + "version": "5.4.8", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index dfb013500e2b..d0433dd2574a 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/kit +## 2.8.2 +### Patch Changes + + +- fix: prevent duplicate fetch request when using Request with load function's fetch ([#13023](https://github.com/sveltejs/kit/pull/13023)) + + +- fix: do not override default cookie decoder to allow users to override the `cookie` library version ([#13037](https://github.com/sveltejs/kit/pull/13037)) + ## 2.8.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index f6677fca7a25..7d0b0e436fe7 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.8.1", + "version": "2.8.2", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 81d457f85270..75f77aa519aa 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.8.1'; +export const VERSION = '2.8.2'; From d338d4635a7fd947ba5112df6ee632c4a0979438 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 24 Nov 2024 19:03:15 -0800 Subject: [PATCH 0768/1135] fix: escape values included in dev 404 page (#13039) --- .changeset/five-maps-yawn.md | 5 ++ packages/kit/src/core/postbuild/prerender.js | 9 +-- packages/kit/src/exports/vite/utils.js | 11 +++- packages/kit/src/runtime/server/page/csp.js | 4 +- .../src/runtime/server/page/serialize_data.js | 4 +- packages/kit/src/utils/escape.js | 56 ++++++++++++------- packages/kit/src/utils/escape.spec.js | 20 +++---- 7 files changed, 69 insertions(+), 40 deletions(-) create mode 100644 .changeset/five-maps-yawn.md diff --git a/.changeset/five-maps-yawn.md b/.changeset/five-maps-yawn.md new file mode 100644 index 000000000000..b4df5751e4f9 --- /dev/null +++ b/.changeset/five-maps-yawn.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: escape values included in dev 404 page diff --git a/packages/kit/src/core/postbuild/prerender.js b/packages/kit/src/core/postbuild/prerender.js index f2f511d4a98a..107448c338ff 100644 --- a/packages/kit/src/core/postbuild/prerender.js +++ b/packages/kit/src/core/postbuild/prerender.js @@ -4,7 +4,7 @@ import { pathToFileURL } from 'node:url'; import { installPolyfills } from '../../exports/node/polyfills.js'; import { mkdirp, posixify, walk } from '../../utils/filesystem.js'; import { decode_uri, is_root_relative, resolve } from '../../utils/url.js'; -import { escape_html_attr } from '../../utils/escape.js'; +import { escape_html } from '../../utils/escape.js'; import { logger } from '../utils.js'; import { load_config } from '../config/index.js'; import { get_route_segments } from '../../utils/routing.js'; @@ -359,9 +359,10 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { dest, `<script>location.href=${devalue.uneval( location - )};</script><meta http-equiv="refresh" content=${escape_html_attr( - `0;url=${location}` - )}>` + )};</script><meta http-equiv="refresh" content="${escape_html( + `0;url=${location}`, + true + )}">` ); written.add(file); diff --git a/packages/kit/src/exports/vite/utils.js b/packages/kit/src/exports/vite/utils.js index aaa33971bede..a4ff95178803 100644 --- a/packages/kit/src/exports/vite/utils.js +++ b/packages/kit/src/exports/vite/utils.js @@ -3,6 +3,7 @@ import { loadEnv } from 'vite'; import { posixify } from '../../utils/filesystem.js'; import { negotiate } from '../../utils/http.js'; import { filter_private_env, filter_public_env } from '../../utils/env.js'; +import { escape_html } from '../../utils/escape.js'; /** * Transforms kit.alias to a valid vite.resolve.alias array. @@ -89,11 +90,17 @@ export function not_found(req, res, base) { if (type === 'text/html') { res.setHeader('Content-Type', 'text/html'); res.end( - `The server is configured with a public base URL of ${base} - did you mean to visit <a href="${prefixed}">${prefixed}</a> instead?` + `The server is configured with a public base URL of ${escape_html( + base + )} - did you mean to visit <a href="${escape_html(prefixed, true)}">${escape_html( + prefixed + )}</a> instead?` ); } else { res.end( - `The server is configured with a public base URL of ${base} - did you mean to visit ${prefixed} instead?` + `The server is configured with a public base URL of ${escape_html( + base + )} - did you mean to visit ${escape_html(prefixed)} instead?` ); } } diff --git a/packages/kit/src/runtime/server/page/csp.js b/packages/kit/src/runtime/server/page/csp.js index 336d50261ad3..7596385ba8a5 100644 --- a/packages/kit/src/runtime/server/page/csp.js +++ b/packages/kit/src/runtime/server/page/csp.js @@ -1,4 +1,4 @@ -import { escape_html_attr } from '../../../utils/escape.js'; +import { escape_html } from '../../../utils/escape.js'; import { base64, sha256 } from './crypto.js'; const array = new Uint8Array(16); @@ -300,7 +300,7 @@ class CspProvider extends BaseProvider { return; } - return `<meta http-equiv="content-security-policy" content=${escape_html_attr(content)}>`; + return `<meta http-equiv="content-security-policy" content="${escape_html(content, true)}">`; } } diff --git a/packages/kit/src/runtime/server/page/serialize_data.js b/packages/kit/src/runtime/server/page/serialize_data.js index f879a50b3156..7c2e552d4fe0 100644 --- a/packages/kit/src/runtime/server/page/serialize_data.js +++ b/packages/kit/src/runtime/server/page/serialize_data.js @@ -1,4 +1,4 @@ -import { escape_html_attr } from '../../../utils/escape.js'; +import { escape_html } from '../../../utils/escape.js'; import { hash } from '../../hash.js'; /** @@ -70,7 +70,7 @@ export function serialize_data(fetched, filter, prerendering = false) { const attrs = [ 'type="application/json"', 'data-sveltekit-fetched', - `data-url=${escape_html_attr(fetched.url)}` + `data-url="${escape_html(fetched.url, true)}"` ]; if (fetched.is_b64) { diff --git a/packages/kit/src/utils/escape.js b/packages/kit/src/utils/escape.js index 543e1a13c0a5..a73fd951daf8 100644 --- a/packages/kit/src/utils/escape.js +++ b/packages/kit/src/utils/escape.js @@ -6,41 +6,57 @@ const escape_html_attr_dict = { '&': '&', '"': '"' + // Svelte also escapes < because the escape function could be called inside a `noscript` there + // https://github.com/sveltejs/svelte/security/advisories/GHSA-8266-84wp-wv5c + // However, that doesn't apply in SvelteKit }; +/** + * @type {Record<string, string>} + */ +const escape_html_dict = { + '&': '&', + '<': '<' +}; + +const surrogates = // high surrogate without paired low surrogate + '[\\ud800-\\udbff](?![\\udc00-\\udfff])|' + + // a valid surrogate pair, the only match with 2 code units + // we match it so that we can match unpaired low surrogates in the same pass + // TODO: use lookbehind assertions once they are widely supported: (?<![\ud800-udbff])[\udc00-\udfff] + '[\\ud800-\\udbff][\\udc00-\\udfff]|' + + // unpaired low surrogate (see previous match) + '[\\udc00-\\udfff]'; + const escape_html_attr_regex = new RegExp( - // special characters - `[${Object.keys(escape_html_attr_dict).join('')}]|` + - // high surrogate without paired low surrogate - '[\\ud800-\\udbff](?![\\udc00-\\udfff])|' + - // a valid surrogate pair, the only match with 2 code units - // we match it so that we can match unpaired low surrogates in the same pass - // TODO: use lookbehind assertions once they are widely supported: (?<![\ud800-udbff])[\udc00-\udfff] - '[\\ud800-\\udbff][\\udc00-\\udfff]|' + - // unpaired low surrogate (see previous match) - '[\\udc00-\\udfff]', + `[${Object.keys(escape_html_attr_dict).join('')}]|` + surrogates, + 'g' +); + +const escape_html_regex = new RegExp( + `[${Object.keys(escape_html_dict).join('')}]|` + surrogates, 'g' ); /** - * Formats a string to be used as an attribute's value in raw HTML. - * - * It escapes unpaired surrogates (which are allowed in js strings but invalid in HTML), escapes - * characters that are special in attributes, and surrounds the whole string in double-quotes. + * Escapes unpaired surrogates (which are allowed in js strings but invalid in HTML) and + * escapes characters that are special. * * @param {string} str - * @returns {string} Escaped string surrounded by double-quotes. - * @example const html = `<tag data-value=${escape_html_attr('value')}>...</tag>`; + * @param {boolean} [is_attr] + * @returns {string} escaped string + * @example const html = `<tag data-value="${escape_html('value', true)}">...</tag>`; */ -export function escape_html_attr(str) { - const escaped_str = str.replace(escape_html_attr_regex, (match) => { +export function escape_html(str, is_attr) { + const dict = is_attr ? escape_html_attr_dict : escape_html_dict; + const escaped_str = str.replace(is_attr ? escape_html_attr_regex : escape_html_regex, (match) => { if (match.length === 2) { // valid surrogate pair return match; } - return escape_html_attr_dict[match] ?? `&#${match.charCodeAt(0)};`; + return dict[match] ?? `&#${match.charCodeAt(0)};`; }); - return `"${escaped_str}"`; + return escaped_str; } diff --git a/packages/kit/src/utils/escape.spec.js b/packages/kit/src/utils/escape.spec.js index 15d3bfe62f0a..3c4e6a042a86 100644 --- a/packages/kit/src/utils/escape.spec.js +++ b/packages/kit/src/utils/escape.spec.js @@ -1,19 +1,19 @@ import { assert, test } from 'vitest'; -import { escape_html_attr } from './escape.js'; +import { escape_html } from './escape.js'; test('escape_html_attr escapes special attribute characters', () => { assert.equal( - escape_html_attr('some "values" are &special here, <others> aren\'t.'), - '"some "values" are &special here, <others> aren\'t."' + escape_html('some "values" are &special here, <others> aren\'t.', true), + "some "values" are &special here, <others> aren't." ); }); test('escape_html_attr escapes invalid surrogates', () => { - assert.equal(escape_html_attr('\ud800\udc00'), '"\ud800\udc00"'); - assert.equal(escape_html_attr('\ud800'), '"�"'); - assert.equal(escape_html_attr('\udc00'), '"�"'); - assert.equal(escape_html_attr('\udc00\ud800'), '"��"'); - assert.equal(escape_html_attr('\ud800\ud800\udc00'), '"�\ud800\udc00"'); - assert.equal(escape_html_attr('\ud800\udc00\udc00'), '"\ud800\udc00�"'); - assert.equal(escape_html_attr('\ud800\ud800\udc00\udc00'), '"�\ud800\udc00�"'); + assert.equal(escape_html('\ud800\udc00', true), '\ud800\udc00'); + assert.equal(escape_html('\ud800', true), '�'); + assert.equal(escape_html('\udc00', true), '�'); + assert.equal(escape_html('\udc00\ud800', true), '��'); + assert.equal(escape_html('\ud800\ud800\udc00', true), '�\ud800\udc00'); + assert.equal(escape_html('\ud800\udc00\udc00', true), '\ud800\udc00�'); + assert.equal(escape_html('\ud800\ud800\udc00\udc00', true), '�\ud800\udc00�'); }); From 134e36343ef57ed7e6e2b3bb9e7f05ad37865794 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 24 Nov 2024 21:36:56 -0800 Subject: [PATCH 0769/1135] fix: ensure error messages are escaped (#13050) --- .changeset/fast-swans-perform.md | 5 +++++ packages/kit/src/exports/vite/dev/index.js | 3 ++- packages/kit/src/runtime/server/utils.js | 3 ++- 3 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 .changeset/fast-swans-perform.md diff --git a/.changeset/fast-swans-perform.md b/.changeset/fast-swans-perform.md new file mode 100644 index 000000000000..f20bd74d6924 --- /dev/null +++ b/.changeset/fast-swans-perform.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: ensure error messages are escaped diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 0dbc912940a2..23c0fae2eeb0 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -18,6 +18,7 @@ import { compact } from '../../../utils/array.js'; import { not_found } from '../utils.js'; import { SCHEME } from '../../../utils/url.js'; import { check_feature } from '../../../utils/features.js'; +import { escape_html } from '../../../utils/escape.js'; const cwd = process.cwd(); @@ -508,7 +509,7 @@ export async function dev(vite, vite_config, svelte_config) { const error_template = ({ status, message }) => { return error_page .replace(/%sveltekit\.status%/g, String(status)) - .replace(/%sveltekit\.error\.message%/g, message); + .replace(/%sveltekit\.error\.message%/g, escape_html(message)); }; res.writeHead(500, { diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index f211739140e1..473804cf9183 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -5,6 +5,7 @@ import { negotiate } from '../../utils/http.js'; import { HttpError } from '../control.js'; import { fix_stack_trace } from '../shared-server.js'; import { ENDPOINT_METHODS } from '../../constants.js'; +import { escape_html } from '../../utils/escape.js'; /** @param {any} body */ export function is_pojo(body) { @@ -50,7 +51,7 @@ export function allowed_methods(mod) { * @param {string} message */ export function static_error_page(options, status, message) { - let page = options.templates.error({ status, message }); + let page = options.templates.error({ status, message: escape_html(message) }); if (DEV) { // inject Vite HMR client, for easier debugging From c84de62e168ac2759abe7130f6ce237233281e0e Mon Sep 17 00:00:00 2001 From: Elliott Johnson <sejohnson@torchcloudconsulting.com> Date: Sun, 24 Nov 2024 22:38:58 -0700 Subject: [PATCH 0770/1135] fix: `repository` field in `package.json` (#13051) * fix: `repository` field in `package.json` * Update packages/enhanced-img/package.json --------- Co-authored-by: Tee Ming <chewteeming01@gmail.com> --- packages/enhanced-img/package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index ed9ba2273a58..6b475bbf7e4c 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -5,7 +5,7 @@ "repository": { "type": "git", "url": "https://github.com/sveltejs/kit", - "directory": "packages/image" + "directory": "packages/enhanced-img" }, "keywords": [ "component", From 429bfb74fe823ea13a5fa0547dcf4cd6bb358a93 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 24 Nov 2024 21:58:14 -0800 Subject: [PATCH 0771/1135] Version Packages (#13049) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/fast-swans-perform.md | 5 ----- .changeset/five-maps-yawn.md | 5 ----- packages/kit/CHANGELOG.md | 9 +++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 .changeset/fast-swans-perform.md delete mode 100644 .changeset/five-maps-yawn.md diff --git a/.changeset/fast-swans-perform.md b/.changeset/fast-swans-perform.md deleted file mode 100644 index f20bd74d6924..000000000000 --- a/.changeset/fast-swans-perform.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: ensure error messages are escaped diff --git a/.changeset/five-maps-yawn.md b/.changeset/five-maps-yawn.md deleted file mode 100644 index b4df5751e4f9..000000000000 --- a/.changeset/five-maps-yawn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: escape values included in dev 404 page diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index d0433dd2574a..a3961354fe3e 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/kit +## 2.8.3 +### Patch Changes + + +- fix: ensure error messages are escaped ([#13050](https://github.com/sveltejs/kit/pull/13050)) + + +- fix: escape values included in dev 404 page ([#13039](https://github.com/sveltejs/kit/pull/13039)) + ## 2.8.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 7d0b0e436fe7..a0c67b9ced3c 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.8.2", + "version": "2.8.3", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 75f77aa519aa..234b011d507e 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.8.2'; +export const VERSION = '2.8.3'; From efb9019f2171d603c44c150f650b637af4438a1f Mon Sep 17 00:00:00 2001 From: Bjorn Lu <bjornlu.dev@gmail.com> Date: Mon, 25 Nov 2024 22:27:59 +0800 Subject: [PATCH 0772/1135] fix: update inline css url in dev (#13007) --- .changeset/ninety-dragons-carry.md | 5 +++++ packages/kit/src/exports/vite/dev/index.js | 20 ++++++++------------ 2 files changed, 13 insertions(+), 12 deletions(-) create mode 100644 .changeset/ninety-dragons-carry.md diff --git a/.changeset/ninety-dragons-carry.md b/.changeset/ninety-dragons-carry.md new file mode 100644 index 000000000000..bf6bf5189b9b --- /dev/null +++ b/.changeset/ninety-dragons-carry.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: update inline css url generation for FOUC prevention in dev diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 23c0fae2eeb0..3935daf28565 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -21,6 +21,8 @@ import { check_feature } from '../../../utils/features.js'; import { escape_html } from '../../../utils/escape.js'; const cwd = process.cwd(); +// vite-specifc queries that we should skip handling for css urls +const vite_css_query_regex = /(?:\?|&)(?:raw|url|inline)(?:&|$)/; /** * @param {import('vite').ViteDevServer} vite @@ -188,6 +190,7 @@ export async function dev(vite, vite_config, svelte_config) { // in dev we inline all styles to avoid FOUC. this gets populated lazily so that // components/stylesheets loaded via import() during `load` are included result.inline_styles = async () => { + /** @type {Set<import('vite').ModuleNode>} */ const deps = new Set(); for (const module_node of module_nodes) { @@ -198,19 +201,12 @@ export async function dev(vite, vite_config, svelte_config) { const styles = {}; for (const dep of deps) { - const url = new URL(dep.url, 'dummy:/'); - const query = url.searchParams; - - if ( - (isCSSRequest(dep.file) || - (query.has('svelte') && query.get('type') === 'style')) && - !(query.has('raw') || query.has('url') || query.has('inline')) - ) { + if (isCSSRequest(dep.url) && !vite_css_query_regex.test(dep.url)) { + const inlineCssUrl = dep.url.includes('?') + ? dep.url.replace('?', '?inline&') + : dep.url + '?inline'; try { - query.set('inline', ''); - const mod = await vite.ssrLoadModule( - `${decodeURI(url.pathname)}${url.search}${url.hash}` - ); + const mod = await vite.ssrLoadModule(inlineCssUrl); styles[dep.url] = mod.default; } catch { // this can happen with dynamically imported modules, I think From 7246a54968649d1bea0e608a72968f8bdc7c2e5c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 25 Nov 2024 12:10:19 -0800 Subject: [PATCH 0773/1135] Version Packages (#13052) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/ninety-dragons-carry.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/ninety-dragons-carry.md diff --git a/.changeset/ninety-dragons-carry.md b/.changeset/ninety-dragons-carry.md deleted file mode 100644 index bf6bf5189b9b..000000000000 --- a/.changeset/ninety-dragons-carry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: update inline css url generation for FOUC prevention in dev diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index a3961354fe3e..42c91d271493 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.8.4 +### Patch Changes + + +- fix: update inline css url generation for FOUC prevention in dev ([#13007](https://github.com/sveltejs/kit/pull/13007)) + ## 2.8.3 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index a0c67b9ced3c..02f752fae5df 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.8.3", + "version": "2.8.4", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 234b011d507e..8f91fc16c967 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.8.3'; +export const VERSION = '2.8.4'; From d660ff43c899e775ca5c8de5f18db3fd712f1451 Mon Sep 17 00:00:00 2001 From: "Dominik G." <dominik.goepel@gmx.de> Date: Tue, 26 Nov 2024 16:44:30 +0100 Subject: [PATCH 0774/1135] fix: ensure prettier doesn't process build output or test results of test apps (#13058) --- .prettierrc | 3 ++- packages/kit/.prettierignore | 5 ++++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/.prettierrc b/.prettierrc index 6f5a1610c17f..a7c0228bf8d4 100644 --- a/.prettierrc +++ b/.prettierrc @@ -23,6 +23,7 @@ "**/CHANGELOG.md", "**/vite.config.js.timestamp-*", "**/.svelte-kit/**", + "**/test-results/**", "documentation/**/*.md", "packages/package/test/fixtures/**/expected/**/*", "packages/package/test/watch/expected/**/*", @@ -30,7 +31,7 @@ "packages/kit/src/core/postbuild/fixtures/**/*" ], "options": { - "requirePragma": true + "rangeEnd": 0 } } ] diff --git a/packages/kit/.prettierignore b/packages/kit/.prettierignore index db7d272040ac..c7b4cb017736 100644 --- a/packages/kit/.prettierignore +++ b/packages/kit/.prettierignore @@ -1,3 +1,6 @@ test/build-errors/apps/syntax-error/src/routes/+page.svelte /types -src/runtime/components/svelte-5/layout.svelte \ No newline at end of file +src/runtime/components/svelte-5/layout.svelte +.svelte-kit +test-results +/test/apps/basics/test/errors.json From 84eca420bf3300be27af89091738e74597633d36 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 26 Nov 2024 17:25:55 +0100 Subject: [PATCH 0775/1135] fix: don't hydrate when falling back to error page (#13056) --- .changeset/funny-lies-beam.md | 5 +++++ packages/kit/src/runtime/client/client.js | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .changeset/funny-lies-beam.md diff --git a/.changeset/funny-lies-beam.md b/.changeset/funny-lies-beam.md new file mode 100644 index 000000000000..c60dc07a066a --- /dev/null +++ b/.changeset/funny-lies-beam.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: don't hydrate when falling back to error page diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 656174365198..37660a425e65 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -2358,6 +2358,7 @@ async function _hydrate( /** @type {import('./types.js').NavigationFinished | undefined} */ let result; + let hydrate = true; try { const branch_promises = node_ids.map(async (n, i) => { @@ -2422,13 +2423,16 @@ async function _hydrate( url, route }); + + target.textContent = ''; + hydrate = false; } if (result.props.page) { result.props.page.state = {}; } - initialize(result, target, true); + initialize(result, target, hydrate); } /** From c468f8220490f7770e360bb9ff17350875e8f05e Mon Sep 17 00:00:00 2001 From: "Dominik G." <dominik.goepel@gmx.de> Date: Tue, 26 Nov 2024 17:28:37 +0100 Subject: [PATCH 0776/1135] chore: add ignores to eslint and prettier (#13059) --- .prettierrc | 2 ++ eslint.config.js | 8 ++++---- packages/kit/.prettierignore | 2 ++ 3 files changed, 8 insertions(+), 4 deletions(-) diff --git a/.prettierrc b/.prettierrc index a7c0228bf8d4..0fd4cd0a2cc1 100644 --- a/.prettierrc +++ b/.prettierrc @@ -23,6 +23,8 @@ "**/CHANGELOG.md", "**/vite.config.js.timestamp-*", "**/.svelte-kit/**", + "**/.custom-out-dir/**", + "**/build/**", "**/test-results/**", "documentation/**/*.md", "packages/package/test/fixtures/**/expected/**/*", diff --git a/eslint.config.js b/eslint.config.js index 8efec2c35168..082e3ada57fa 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -11,10 +11,10 @@ export default [ { ignores: [ '**/.svelte-kit', - 'packages/adapter-static/test/apps/*/build', - 'packages/adapter-cloudflare/files', - 'packages/adapter-netlify/files', - 'packages/adapter-node/files' + '**/test-results', + '**/build', + '**/.custom-out-dir', + 'packages/adapter-*/files' ] }, { diff --git a/packages/kit/.prettierignore b/packages/kit/.prettierignore index c7b4cb017736..e0904af006f2 100644 --- a/packages/kit/.prettierignore +++ b/packages/kit/.prettierignore @@ -2,5 +2,7 @@ test/build-errors/apps/syntax-error/src/routes/+page.svelte /types src/runtime/components/svelte-5/layout.svelte .svelte-kit +.custom-out-dir +build test-results /test/apps/basics/test/errors.json From 361f9fe6469ba5b064570b1bcfde95c9d95b8888 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 26 Nov 2024 14:30:33 -0800 Subject: [PATCH 0777/1135] Version Packages (#13060) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/funny-lies-beam.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/funny-lies-beam.md diff --git a/.changeset/funny-lies-beam.md b/.changeset/funny-lies-beam.md deleted file mode 100644 index c60dc07a066a..000000000000 --- a/.changeset/funny-lies-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: don't hydrate when falling back to error page diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 42c91d271493..31784d40d540 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.8.5 +### Patch Changes + + +- fix: don't hydrate when falling back to error page ([#13056](https://github.com/sveltejs/kit/pull/13056)) + ## 2.8.4 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 02f752fae5df..fcf5d8bb928c 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.8.4", + "version": "2.8.5", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 8f91fc16c967..616f0dae624f 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.8.4'; +export const VERSION = '2.8.5'; From fb146e7a19c4a125ff8a006140598f65fb8b9f68 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Wed, 27 Nov 2024 11:02:19 +0800 Subject: [PATCH 0778/1135] chore: fix ecosystem CI (#13054) Co-authored-by: dominikg <dominik.goepel@gmx.de> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- .../basics/src/routes/cookies/+page.svelte | 2 +- .../cookies/enhanced/basic/+page.svelte | 4 +- .../src/routes/cookies/nested/a/+page.svelte | 2 +- .../src/routes/cookies/nested/b/+page.svelte | 2 +- .../after-navigate/a/+page.svelte | 2 +- .../prevent-navigation/+page.svelte | 2 +- .../on-navigate/[x]/+page.svelte | 2 +- .../routes/store/client-access/+page.svelte | 2 +- .../basics/test/cross-platform/client.test.js | 4 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- packages/kit/test/apps/no-ssr/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- .../apps/options/source/pages/+layout.svelte | 13 ++ packages/kit/test/apps/writes/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../apps/private-dynamic-env/package.json | 2 +- .../package.json | 2 +- .../apps/private-static-env/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-folder/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-module/package.json | 2 +- .../package.json | 2 +- .../service-worker-private-env/package.json | 2 +- .../apps/syntax-error/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 2 +- .../test/prerendering/options/package.json | 2 +- .../test/prerendering/paths-base/package.json | 2 +- pnpm-lock.yaml | 154 +++++++++--------- 36 files changed, 125 insertions(+), 114 deletions(-) diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index fb9cf6de4b67..804403145aae 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -19,7 +19,7 @@ "dropcss": "^1.0.16", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index 53776cdf43bd..644e52e62a05 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -19,7 +19,7 @@ "cross-env": "^7.0.3", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/apps/basics/src/routes/cookies/+page.svelte b/packages/kit/test/apps/basics/src/routes/cookies/+page.svelte index cbf03a5f3d6d..32a7c43875c5 100644 --- a/packages/kit/test/apps/basics/src/routes/cookies/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/cookies/+page.svelte @@ -3,4 +3,4 @@ export let data; </script> -Cookie: <span id="cookie-value">{data.cookie}</span> +Cookie: <span id="cookie-value">{`${data.cookie}`}</span> diff --git a/packages/kit/test/apps/basics/src/routes/cookies/enhanced/basic/+page.svelte b/packages/kit/test/apps/basics/src/routes/cookies/enhanced/basic/+page.svelte index e8c04bc7b5bf..e0b0c59e7fd7 100644 --- a/packages/kit/test/apps/basics/src/routes/cookies/enhanced/basic/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/cookies/enhanced/basic/+page.svelte @@ -5,9 +5,7 @@ export let data; </script> -Cookie: <span id="cookie-value"> - {data.cookie} -</span> +Cookie: <span id="cookie-value">{`${data.cookie}`}</span> <form method="post" action="?/setTeapot" use:enhance> <button id="teapot">Set cookie to "teapot"</button> diff --git a/packages/kit/test/apps/basics/src/routes/cookies/nested/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/cookies/nested/a/+page.svelte index cbf03a5f3d6d..32a7c43875c5 100644 --- a/packages/kit/test/apps/basics/src/routes/cookies/nested/a/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/cookies/nested/a/+page.svelte @@ -3,4 +3,4 @@ export let data; </script> -Cookie: <span id="cookie-value">{data.cookie}</span> +Cookie: <span id="cookie-value">{`${data.cookie}`}</span> diff --git a/packages/kit/test/apps/basics/src/routes/cookies/nested/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/cookies/nested/b/+page.svelte index cbf03a5f3d6d..32a7c43875c5 100644 --- a/packages/kit/test/apps/basics/src/routes/cookies/nested/b/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/cookies/nested/b/+page.svelte @@ -3,4 +3,4 @@ export let data; </script> -Cookie: <span id="cookie-value">{data.cookie}</span> +Cookie: <span id="cookie-value">{`${data.cookie}`}</span> diff --git a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate/a/+page.svelte index 7e9eeeaa4b09..f7b17c56d18a 100644 --- a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate/a/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate/a/+page.svelte @@ -13,5 +13,5 @@ }); </script> -<h1>{from?.url.pathname} -> {to?.url.pathname}</h1> +<h1>{`${from?.url.pathname} -> ${to?.url.pathname}`}</h1> <a href="/navigation-lifecycle/after-navigate/b">/b</a> diff --git a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/before-navigate/prevent-navigation/+page.svelte b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/before-navigate/prevent-navigation/+page.svelte index 67607376e397..adc5b6404c20 100644 --- a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/before-navigate/prevent-navigation/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/before-navigate/prevent-navigation/+page.svelte @@ -22,4 +22,4 @@ <a href="https://google.de">external</a> <!-- svelte-ignore a11y-invalid-attribute --> <a download href="">external</a> -<pre>{times_triggered} {unload} {navigation_type}</pre> +<pre>{times_triggered} {unload} {`${navigation_type}`}</pre> diff --git a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/on-navigate/[x]/+page.svelte b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/on-navigate/[x]/+page.svelte index f05f035822f3..64128aa9fde5 100644 --- a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/on-navigate/[x]/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/on-navigate/[x]/+page.svelte @@ -25,5 +25,5 @@ }); </script> -<h1>{from?.url.pathname} -> {to?.url.pathname} ({type ?? '...'}) {called_return}</h1> +<h1>{`${from?.url.pathname} -> ${to?.url.pathname}`} ({type ?? '...'}) {called_return}</h1> <a href="/navigation-lifecycle/on-navigate/b">/b</a> diff --git a/packages/kit/test/apps/basics/src/routes/store/client-access/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/client-access/+page.svelte index 7f54b2f671d0..96eaa6f14a32 100644 --- a/packages/kit/test/apps/basics/src/routes/store/client-access/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/store/client-access/+page.svelte @@ -4,7 +4,7 @@ let pathname; </script> -<h1>{pathname}</h1> +<h1>{`${pathname}`}</h1> <button on:click={() => { diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 71338a8422ce..1b13a6d46e31 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -50,10 +50,10 @@ test.describe('a11y', () => { expect(has_live_region).toBeTruthy(); // live region should exist, but be empty - expect(await page.innerHTML('[aria-live]')).toBe(''); + expect(await page.innerText('[aria-live]')).toBe(''); await clicknav('[href="/accessibility/b"]'); - expect(await page.innerHTML('[aria-live]')).toBe('b'); // TODO i18n + expect(await page.innerText('[aria-live]')).toBe('b'); // TODO i18n } else { expect(has_live_region).toBeFalsy(); } diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index 44f3eabcca98..48a7f63ef7e3 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -25,7 +25,7 @@ "e2e-test-dep-server": "file:./_test_dependencies/cjs-only", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index bd0ca11cce7b..a552ae5b9af6 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -17,7 +17,7 @@ "cross-env": "^7.0.3", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index 9e3db447c5a4..e91c96955eef 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -17,7 +17,7 @@ "cross-env": "^7.0.3", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index 963d87a3c03e..b6853c3ff978 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -18,7 +18,7 @@ "cross-env": "^7.0.3", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 31cca4c82f20..2d13c0c82cce 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -17,7 +17,7 @@ "cross-env": "^7.0.3", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/apps/options/source/pages/+layout.svelte b/packages/kit/test/apps/options/source/pages/+layout.svelte index 5e1f1fed86c2..65d3d04b2070 100644 --- a/packages/kit/test/apps/options/source/pages/+layout.svelte +++ b/packages/kit/test/apps/options/source/pages/+layout.svelte @@ -1,7 +1,20 @@ <script> + import { onMount } from 'svelte'; import { setup } from '../../../../setup.js'; setup(); + + // TODO: remove this when Svelte 5 addresses this issue https://github.com/sveltejs/svelte/issues/14438 + onMount(() => { + // @ts-expect-error trustedTypes is a limited availability global + // see https://developer.mozilla.org/en-US/docs/Web/API/Window/trustedTypes + if (window.trustedTypes && trustedTypes.createPolicy) { + // @ts-expect-error + trustedTypes.createPolicy('default', { + createHTML: (/** @type {string} */ str) => str + }); + } + }); </script> <slot /> diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index 2fec107eb70b..1e699e60a736 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -17,7 +17,7 @@ "cross-env": "^7.0.3", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index c8da1a1e510b..2388c4bee763 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index c8da1a1e510b..2388c4bee763 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index e6ad8f27dda6..3a68c0d05832 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index cbb97b6d7a6f..eaeb97a03561 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index 347837acefd3..caae5316af01 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index 4b6718dc1b17..41167a62cfdb 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index a44ed37aaee8..64b2995ad026 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -15,7 +15,7 @@ "cross-env": "^7.0.3", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index 5d2c7d311a5b..d846ef1fe053 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index b71138bff3dc..5fc1c187f609 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index 2c2e3a52fff4..ed531ea11636 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index cd5e3a98a6b2..7605391aefdf 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index fe1784670ae3..ab5338950f09 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index 453e06b094e5..e49775aa5e9a 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index 04e9f9f75ba7..f199b59239f9 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -12,7 +12,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2" }, "type": "module" diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index 5fb1ec051699..fb0ce874382e 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -15,7 +15,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2", "vitest": "^2.0.1" }, diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index c579cc38d31d..182c7e58855d 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2", "vitest": "^2.0.1" }, diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index 8dbf0e8f7218..d501d3372620 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^3.0.1", "svelte": "^4.2.10", "svelte-check": "^4.0.1", - "typescript": "^5.3.3", + "typescript": "^5.5.4", "vite": "^5.3.2", "vitest": "^2.0.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a33bda6a51ed..0c80878cb9d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -432,10 +432,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -456,10 +456,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -510,10 +510,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -534,10 +534,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -558,10 +558,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -582,10 +582,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -609,10 +609,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -633,10 +633,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -663,10 +663,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -687,10 +687,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -711,10 +711,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -732,10 +732,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -753,10 +753,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -777,10 +777,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -798,10 +798,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -819,10 +819,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -840,10 +840,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -861,10 +861,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -882,10 +882,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -903,10 +903,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -924,10 +924,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -945,10 +945,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -966,10 +966,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -990,10 +990,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1014,10 +1014,10 @@ importers: version: 4.2.19 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5) + version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) typescript: - specifier: ^5.3.3 - version: 5.4.5 + specifier: ^5.5.4 + version: 5.6.3 vite: specifier: ^5.3.2 version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) @@ -6181,7 +6181,7 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.4.5): + svelte-check@4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 @@ -6189,7 +6189,7 @@ snapshots: picocolors: 1.1.0 sade: 1.8.1 svelte: 4.2.19 - typescript: 5.4.5 + typescript: 5.6.3 transitivePeerDependencies: - picomatch From 10d09425a04709d17d7940a2450298911db92ad0 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 27 Nov 2024 19:46:34 -0800 Subject: [PATCH 0779/1135] chore: remove unnecessary awaits (#13066) --- .../kit/test/apps/basics/test/cross-platform/client.test.js | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 1b13a6d46e31..2b6da59b9cc2 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -633,13 +633,13 @@ test.describe('Prefetching', () => { await page.goto('/routing/hashes/a'); await clicknav('[href="#preload"]'); - await expect(page.url()).toBe(`${baseURL}/routing/hashes/a#preload`); + expect(page.url()).toBe(`${baseURL}/routing/hashes/a#preload`); await clicknav('[href="/routing/hashes/a"]'); - await expect(page.url()).toBe(`${baseURL}/routing/hashes/a`); + expect(page.url()).toBe(`${baseURL}/routing/hashes/a`); await clicknav('[href="#preload"]'); - await expect(page.url()).toBe(`${baseURL}/routing/hashes/a#preload`); + expect(page.url()).toBe(`${baseURL}/routing/hashes/a#preload`); }); test('does not rerun load on calls to duplicate preload hash route', async ({ app, page }) => { From 67dd214863cbc5852eb0e8512efbb7bad5358e8a Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Sat, 30 Nov 2024 01:34:40 +0800 Subject: [PATCH 0780/1135] fix: transform link[rel] `shortcut icon` and `apple-touch-icon` to be absolute (#13077) closes #10317 This PR builds upon https://github.com/sveltejs/kit/pull/5583/files to include the shortcut icon and apple-touch-icon rel attributes in addition just icon when transforming the asset URL to be absolute. --- .changeset/slow-toes-clap.md | 5 +++++ packages/kit/src/runtime/client/client.js | 6 +++++- 2 files changed, 10 insertions(+), 1 deletion(-) create mode 100644 .changeset/slow-toes-clap.md diff --git a/.changeset/slow-toes-clap.md b/.changeset/slow-toes-clap.md new file mode 100644 index 000000000000..77838348c450 --- /dev/null +++ b/.changeset/slow-toes-clap.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: transform link[rel='shortcut icon'] and link[rel='apple-touch-icon'] to be absolute to avoid console error when navigating diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 37660a425e65..09618a4b2b9e 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -46,6 +46,8 @@ import { INVALIDATED_PARAM, TRAILING_SLASH_PARAM, validate_depends } from '../sh import { get_message, get_status } from '../../utils/error.js'; import { writable } from 'svelte/store'; +const ICON_REL_ATTRIBUTES = new Set(['icon', 'shortcut icon', 'apple-touch-icon']); + let errored = false; // We track the scroll position associated with each history entry in sessionStorage, @@ -2307,7 +2309,9 @@ function _start_router() { // URLs after a pushState/replaceState, resulting in a 404 — see // https://github.com/sveltejs/kit/issues/3748#issuecomment-1125980897 for (const link of document.querySelectorAll('link')) { - if (link.rel === 'icon') link.href = link.href; // eslint-disable-line + if (ICON_REL_ATTRIBUTES.has(link.rel)) { + link.href = link.href; // eslint-disable-line + } } addEventListener('pageshow', (event) => { From da965d73c212772cfe560ee0fabf5ff124b4ea45 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 10:08:10 -0800 Subject: [PATCH 0781/1135] chore(deps): update pnpm to v9.14.4 (#13075) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e1cd905dffd9..6801ee9b2c2d 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.14.2", + "packageManager": "pnpm@9.14.4", "engines": { "pnpm": "^9.0.0" } From d030f4bb285e70844d09b3f0c87809bae43014b8 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Fri, 29 Nov 2024 10:08:59 -0800 Subject: [PATCH 0782/1135] feat: support Vite 6 (#12270) --- .changeset/curvy-garlics-walk.md | 8 + .changeset/purple-comics-know.md | 5 + packages/adapter-auto/package.json | 2 +- .../adapter-cloudflare-workers/package.json | 2 +- packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/package.json | 6 +- packages/adapter-node/package.json | 4 +- packages/adapter-static/package.json | 6 +- .../test/apps/prerendered/package.json | 6 +- .../adapter-static/test/apps/spa/package.json | 6 +- packages/adapter-vercel/package.json | 6 +- packages/enhanced-img/package.json | 8 +- packages/kit/package.json | 16 +- packages/kit/src/exports/public.d.ts | 11 +- packages/kit/src/runtime/client/client.js | 2 +- .../kit/src/runtime/server/page/load_data.js | 2 +- .../kit/src/runtime/server/page/render.js | 2 +- packages/kit/test/apps/amp/package.json | 6 +- packages/kit/test/apps/basics/package.json | 6 +- .../basics/test/cross-platform/client.test.js | 40 +- packages/kit/test/apps/dev-only/package.json | 6 +- packages/kit/test/apps/embed/package.json | 6 +- packages/kit/test/apps/no-ssr/package.json | 6 +- packages/kit/test/apps/options-2/package.json | 6 +- packages/kit/test/apps/options/package.json | 6 +- packages/kit/test/apps/writes/package.json | 6 +- .../package.json | 6 +- .../package.json | 6 +- .../package.json | 6 +- .../package.json | 6 +- .../apps/private-dynamic-env/package.json | 6 +- .../package.json | 6 +- .../apps/private-static-env/package.json | 6 +- .../package.json | 6 +- .../apps/server-only-folder/package.json | 6 +- .../package.json | 6 +- .../apps/server-only-module/package.json | 6 +- .../package.json | 6 +- .../service-worker-private-env/package.json | 6 +- .../apps/syntax-error/package.json | 6 +- packages/kit/test/build-errors/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 8 +- .../test/prerendering/options/package.json | 8 +- .../test/prerendering/paths-base/package.json | 8 +- packages/kit/test/utils.d.ts | 3 +- packages/kit/test/utils.js | 30 + packages/kit/types/index.d.ts | 43 +- packages/package/package.json | 4 +- .../javascript/expected/Test.svelte.d.ts | 95 +- .../javascript/expected/Test2.svelte.d.ts | 52 +- .../expected/internal/Test.svelte.d.ts | 52 +- .../resolve-alias/expected/Test.svelte | 12 +- .../resolve-alias/expected/Test.svelte.d.ts | 35 +- .../svelte-3-types/expected/Test.svelte | 2 +- .../svelte-kit/expected/Test.svelte.d.ts | 95 +- .../typescript-esnext/expected/Plain.svelte | 11 +- .../expected/Plain.svelte.d.ts | 52 +- .../typescript-esnext/expected/Test.svelte | 2 +- .../expected/Test.svelte.d.ts | 54 +- .../typescript-esnext/expected/Test2.svelte | 2 +- .../expected/Test2.svelte.d.ts | 37 +- .../typescript-esnext/src/lib/Plain.svelte | 7 +- .../typescript-nodenext/expected/Test.svelte | 2 +- .../expected/Test.svelte.d.ts | 54 +- .../test/watch/expected/Test.svelte.d.ts | 34 +- playgrounds/basic/package.json | 6 +- pnpm-lock.yaml | 1982 +++++++---------- 67 files changed, 1365 insertions(+), 1593 deletions(-) create mode 100644 .changeset/curvy-garlics-walk.md create mode 100644 .changeset/purple-comics-know.md diff --git a/.changeset/curvy-garlics-walk.md b/.changeset/curvy-garlics-walk.md new file mode 100644 index 000000000000..aa68c7585d68 --- /dev/null +++ b/.changeset/curvy-garlics-walk.md @@ -0,0 +1,8 @@ +--- +'@sveltejs/adapter-cloudflare-workers': minor +'@sveltejs/adapter-cloudflare': minor +'@sveltejs/adapter-netlify': minor +'@sveltejs/adapter-vercel': minor +--- + +chore: upgrade esbuild to 0.24.0 diff --git a/.changeset/purple-comics-know.md b/.changeset/purple-comics-know.md new file mode 100644 index 000000000000..9334ee1fdab6 --- /dev/null +++ b/.changeset/purple-comics-know.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: Vite 6 support diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index 2d4016ac220d..ef4fbc3ba707 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -40,7 +40,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "typescript": "^5.3.3" }, diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 3e82abd677d4..6715b2b8adeb 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -40,7 +40,7 @@ "dependencies": { "@cloudflare/workers-types": "^4.20231121.0", "@iarna/toml": "^2.2.5", - "esbuild": "^0.21.5" + "esbuild": "^0.24.0" }, "devDependencies": { "@cloudflare/kv-asset-handler": "^0.3.0", diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index fb99d2887e70..27cc3471295f 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -41,7 +41,7 @@ }, "dependencies": { "@cloudflare/workers-types": "^4.20231121.0", - "esbuild": "^0.21.5", + "esbuild": "^0.24.0", "worktop": "0.8.0-next.18" }, "devDependencies": { diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 1b92f575e208..f2f87d9d5edf 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -42,7 +42,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "esbuild": "^0.21.5", + "esbuild": "^0.24.0", "set-cookie-parser": "^2.6.0" }, "devDependencies": { @@ -51,12 +51,12 @@ "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^15.3.0", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "@types/set-cookie-parser": "^2.4.7", "rollup": "^4.14.2", "typescript": "^5.3.3", - "vitest": "^2.0.1" + "vitest": "^2.1.6" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index a7a0357b352b..a5410682c9bd 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -43,12 +43,12 @@ "devDependencies": { "@polka/url": "^1.0.0-next.28", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "polka": "^1.0.0-next.28", "sirv": "^3.0.0", "typescript": "^5.3.3", - "vitest": "^2.0.1" + "vitest": "^2.1.6" }, "dependencies": { "@rollup/plugin-commonjs": "^28.0.1", diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 82d2cad95370..23f53f0746d1 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -41,12 +41,12 @@ "devDependencies": { "@playwright/test": "^1.44.1", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "sirv": "^3.0.0", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "typescript": "^5.3.3", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0" diff --git a/packages/adapter-static/test/apps/prerendered/package.json b/packages/adapter-static/test/apps/prerendered/package.json index da2f395ac99d..c040f5a6b7e2 100644 --- a/packages/adapter-static/test/apps/prerendered/package.json +++ b/packages/adapter-static/test/apps/prerendered/package.json @@ -10,10 +10,10 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", - "svelte": "^4.2.10", - "vite": "^5.3.2" + "svelte": "^5.2.9", + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/adapter-static/test/apps/spa/package.json b/packages/adapter-static/test/apps/spa/package.json index 318c10363757..a13507f14424 100644 --- a/packages/adapter-static/test/apps/spa/package.json +++ b/packages/adapter-static/test/apps/spa/package.json @@ -11,10 +11,10 @@ "devDependencies": { "@sveltejs/adapter-node": "workspace:^", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", - "svelte": "^4.2.10", - "vite": "^5.3.2" + "svelte": "^5.2.9", + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 1a415a47c947..884c460f24e1 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -40,14 +40,14 @@ }, "dependencies": { "@vercel/nft": "^0.27.1", - "esbuild": "^0.21.5" + "esbuild": "^0.24.0" }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "typescript": "^5.3.3", - "vitest": "^2.0.1" + "vitest": "^2.1.6" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 6b475bbf7e4c..4fc2bbc76dcb 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -44,11 +44,11 @@ "devDependencies": { "@types/estree": "^1.0.5", "@types/node": "^18.19.48", - "rollup": "^4.14.2", - "svelte": "^5.1.3", + "rollup": "^4.27.4", + "svelte": "^5.2.9", "typescript": "^5.6.3", - "vite": "^5.3.2", - "vitest": "^2.0.1" + "vite": "^6.0.1", + "vitest": "^2.1.6" }, "peerDependencies": { "svelte": "^5.0.0", diff --git a/packages/kit/package.json b/packages/kit/package.json index fcf5d8bb928c..a0ed5b02bef5 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -21,7 +21,7 @@ "@types/cookie": "^0.6.0", "cookie": "^0.6.0", "devalue": "^5.1.0", - "esm-env": "^1.0.0", + "esm-env": "^1.2.1", "import-meta-resolve": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", @@ -33,22 +33,22 @@ }, "devDependencies": { "@playwright/test": "^1.44.1", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/connect": "^3.4.38", "@types/node": "^18.19.48", "@types/set-cookie-parser": "^2.4.7", - "dts-buddy": "^0.5.3", + "dts-buddy": "^0.5.4", "rollup": "^4.14.2", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", - "vite": "^5.3.2", - "vitest": "^2.0.1" + "vite": "^6.0.1", + "vitest": "^2.1.6" }, "peerDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1", + "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", - "vite": "^5.0.3" + "vite": "^5.0.3 || ^6.0.0" }, "bin": { "svelte-kit": "svelte-kit.js" diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 7db17269967f..84a3f041c322 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -79,11 +79,12 @@ export interface ActionFailure<T extends Record<string, unknown> | undefined = u [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } -type UnpackValidationError<T> = T extends ActionFailure<infer X> - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; +type UnpackValidationError<T> = + T extends ActionFailure<infer X> + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 09618a4b2b9e..bec38c9122fa 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -972,7 +972,7 @@ async function load_route({ id, invalidating, url, params, route, preload }) { server_data_node: create_data_node( // server_data_node is undefined if it wasn't reloaded from the server; // and if current loader uses server data, we want to reuse previous data. - server_data_node === undefined && loader[0] ? { type: 'skip' } : server_data_node ?? null, + server_data_node === undefined && loader[0] ? { type: 'skip' } : (server_data_node ?? null), loader[0] ? previous?.server : undefined ) }); diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index e2af144654e6..42446393ad83 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -244,7 +244,7 @@ export function create_universal_fetch(event, state, fetched, csr, resolve_opts) } } else { // simulate CORS errors and "no access to body in no-cors mode" server-side for consistency with client-side behaviour - const mode = input instanceof Request ? input.mode : init?.mode ?? 'cors'; + const mode = input instanceof Request ? input.mode : (init?.mode ?? 'cors'); if (mode === 'no-cors') { response = new Response('', { status: response.status, diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index be44c3c7a860..6197d5ba63c6 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -79,7 +79,7 @@ export async function render_response({ const form_value = action_result?.type === 'success' || action_result?.type === 'failure' - ? action_result.data ?? null + ? (action_result.data ?? null) : null; /** @type {string} */ diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index 804403145aae..7a6f03eebcb9 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -14,13 +14,13 @@ "devDependencies": { "@sveltejs/amp": "workspace:^", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "dropcss": "^1.0.16", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index 644e52e62a05..fda8f31a4ee2 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -15,12 +15,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 2b6da59b9cc2..ce0758ea8dea 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -283,13 +283,12 @@ test.describe('Scrolling', () => { test('url-supplied non-ascii anchor works on navigation to page after manual scroll', async ({ page, in_view, - clicknav + clicknav, + scroll_to }) => { await page.goto('/anchor'); await clicknav('#non-ascii-anchor'); - await page.evaluate(() => { - window.scrollTo(0, 50); - }); + await scroll_to(0, 50); await page.locator('#non-ascii-anchor').click(); expect(await in_view('#go-to-encöded')).toBe(true); }); @@ -359,7 +358,8 @@ test.describe('Scrolling', () => { test('scroll is restored after hitting the back button for an in-app cross-document navigation', async ({ page, - clicknav + clicknav, + scroll_to }) => { await page.goto('/scroll/cross-document/a'); @@ -368,7 +368,7 @@ test.describe('Scrolling', () => { if (!rect) throw new Error('Could not determine bounding box'); const target_scroll_y = rect.y + rect.height - height; - await page.evaluate((y) => scrollTo(0, y), target_scroll_y); + await scroll_to(0, target_scroll_y); await page.locator('[href="/scroll/cross-document/b"]').click(); expect(await page.textContent('h1')).toBe('b'); @@ -441,7 +441,8 @@ test.describe('Scrolling', () => { test('scroll positions are recovered on reloading the page', async ({ page, app, - browserName + browserName, + scroll_to }) => { // No idea why the workaround below works only in dev mode // A better solution would probably be to set fission.webContentIsolationStrategy: 1 @@ -451,9 +452,9 @@ test.describe('Scrolling', () => { } await page.goto('/anchor'); - await page.evaluate(() => window.scrollTo(0, 1000)); + await scroll_to(0, 1000); await app.goto('/anchor/anchor'); - await page.evaluate(() => window.scrollTo(0, 1000)); + await scroll_to(0, 1000); await page.reload(); if (browserName === 'firefox') { @@ -461,10 +462,11 @@ test.describe('Scrolling', () => { // See https://github.com/microsoft/playwright/issues/22640 await page.goBack(); } - expect(await page.evaluate(() => window.scrollY)).toBe(1000); + await page.waitForFunction(() => window.scrollY === 1000); + const waiter = page.waitForFunction(() => window.scrollY === 1000); await page.goBack(); - expect(await page.evaluate(() => window.scrollY)).toBe(1000); + await waiter; }); test('scroll position is top of page on ssr:false reload', async ({ page }) => { @@ -474,26 +476,32 @@ test.describe('Scrolling', () => { expect(await page.evaluate(() => window.scrollY)).toBe(0); }); - test('clicking # or #top takes you to the top of the current page', async ({ page }) => { + test('clicking # or #top takes you to the top of the current page', async ({ + page, + scroll_to + }) => { await page.goto('/scroll/top'); for (const href of ['#', '#top']) { - await page.evaluate(() => window.scrollTo(0, 1000)); + await scroll_to(0, 1000); await page.click(`a[href="${href}"]`); expect(await page.evaluate(() => window.scrollY)).toBe(0); - await page.evaluate(() => window.scrollTo(0, 1000)); + await scroll_to(0, 1000); await page.click(`a[href="${href}"]`); expect(await page.evaluate(() => window.scrollY)).toBe(0); } }); - test('Scroll position is correct after going back from a shallow route', async ({ page }) => { + test('Scroll position is correct after going back from a shallow route', async ({ + page, + scroll_to + }) => { await page.goto('/scroll/push-state'); await page.locator('#subpage-link').click(); await page.locator('#back-button').click(); - await page.evaluate(() => window.scrollTo(0, 9999)); + await scroll_to(0, 9999); const scroll = await page.evaluate(() => window.scrollY); expect(scroll).toBeGreaterThan(0); diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index 48a7f63ef7e3..d2bef02977a2 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -11,7 +11,7 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "e2e-test-dep-error": "file:./_test_dependencies/cjs-only", "e2e-test-dep-hooks": "file:./_test_dependencies/cjs-only", @@ -23,10 +23,10 @@ "e2e-test-dep-page-svelte": "file:./_test_dependencies/cjs-only", "e2e-test-dep-page-universal": "file:./_test_dependencies/cjs-only", "e2e-test-dep-server": "file:./_test_dependencies/cjs-only", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index a552ae5b9af6..680dfe2235f6 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -13,12 +13,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index e91c96955eef..4cc3a5c14f15 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -13,12 +13,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index b6853c3ff978..623d6cd62285 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -14,12 +14,12 @@ "devDependencies": { "@sveltejs/adapter-node": "workspace:^", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 2d13c0c82cce..96d2a80b24fa 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -13,12 +13,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index 1e699e60a736..fb7f7f684c78 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -13,12 +13,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index 2388c4bee763..0dbfaafe1eb4 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -11,11 +11,11 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index 2388c4bee763..0dbfaafe1eb4 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -11,11 +11,11 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index 3a68c0d05832..8797667db0c7 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -11,11 +11,11 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index eaeb97a03561..1fa4ba71aa7c 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index caae5316af01..9195222826b2 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index 41167a62cfdb..eb04f276dffa 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index 64b2995ad026..fd63031f7d86 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -11,12 +11,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index d846ef1fe053..92bbc16f021b 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index 5fc1c187f609..e599b0fd8b7d 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index ed531ea11636..977fb6d29bca 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index 7605391aefdf..2229d146edaa 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index ab5338950f09..d70025311be1 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index e49775aa5e9a..c58e53b08db5 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -11,11 +11,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index f199b59239f9..819dcb848a2b 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -9,11 +9,11 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2" + "vite": "^6.0.1" }, "type": "module" } diff --git a/packages/kit/test/build-errors/package.json b/packages/kit/test/build-errors/package.json index 50c386bfeabd..1a10dab30e56 100644 --- a/packages/kit/test/build-errors/package.json +++ b/packages/kit/test/build-errors/package.json @@ -8,6 +8,6 @@ }, "type": "module", "devDependencies": { - "vitest": "^2.0.1" + "vitest": "^2.1.6" } } diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index fb0ce874382e..6ef2d6bda23f 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -12,12 +12,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2", - "vitest": "^2.0.1" + "vite": "^6.0.1", + "vitest": "^2.1.6" }, "type": "module" } diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index 182c7e58855d..0adfad3a14c2 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -11,12 +11,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2", - "vitest": "^2.0.1" + "vite": "^6.0.1", + "vitest": "^2.1.6" }, "type": "module" } diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index d501d3372620..960a2b2dd33e 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -11,12 +11,12 @@ }, "devDependencies": { "@sveltejs/kit": "workspace:^", - "@sveltejs/vite-plugin-svelte": "^3.0.1", - "svelte": "^4.2.10", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.4", - "vite": "^5.3.2", - "vitest": "^2.0.1" + "vite": "^6.0.1", + "vitest": "^2.1.6" }, "type": "module" } diff --git a/packages/kit/test/utils.d.ts b/packages/kit/test/utils.d.ts index 2477beb87ae0..7992ee76c493 100644 --- a/packages/kit/test/utils.d.ts +++ b/packages/kit/test/utils.d.ts @@ -7,7 +7,7 @@ import { TestType, Page } from '@playwright/test'; -import { IncomingMessage, ServerResponse } from 'http'; +import { IncomingMessage, ServerResponse } from 'node:http'; import { Plugin } from 'vite'; export const test: TestType< @@ -22,6 +22,7 @@ export const test: TestType< preloadData(url: string): Promise<void>; }; clicknav(selector: string, options?: Parameters<Page['waitForNavigation']>[0]): Promise<void>; + scroll_to(x: number, y: number): Promise<void>; in_view(selector: string): Promise<boolean>; get_computed_style(selector: string, prop: string): Promise<string>; /** diff --git a/packages/kit/test/utils.js b/packages/kit/test/utils.js index 7ddbf3709361..cf03a52ab718 100644 --- a/packages/kit/test/utils.js +++ b/packages/kit/test/utils.js @@ -70,6 +70,36 @@ export const test = base.extend({ await use(clicknav); }, + scroll_to: async ({ page }, use) => { + /** + * @param {number} x + * @param {number} y + */ + async function scroll_to(x, y) { + // The browser will do this for us, but we need to do it pre-emptively + // so that we can check the scroll location. + // Otherwise, we'd be checking a decimal number against an integer. + x = Math.trunc(x); + y = Math.trunc(y); + const watcher = page.waitForFunction( + /** @param {{ x: number, y: number }} opt */ (opt) => + // check if the scroll position reached the desired or maximum position + window.scrollX === + Math.min(opt.x, document.documentElement.offsetWidth - window.innerWidth) && + window.scrollY === + Math.min(opt.y, document.documentElement.offsetHeight - window.innerHeight), + { x, y } + ); + await page.evaluate( + /** @param {{ x: number, y: number }} opt */ (opt) => window.scrollTo(opt.x, opt.y), + { x, y } + ); + await watcher; + } + + await use(scroll_to); + }, + in_view: async ({ page }, use) => { /** @param {string} selector */ async function in_view(selector) { diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 237b3e3ff57e..63fdcb004bf3 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -61,11 +61,12 @@ declare module '@sveltejs/kit' { [uniqueSymbol]: true; // necessary or else UnpackValidationError could wrongly unpack objects with the same shape as ActionFailure } - type UnpackValidationError<T> = T extends ActionFailure<infer X> - ? X - : T extends void - ? undefined // needs to be undefined, because void will corrupt union type - : T; + type UnpackValidationError<T> = + T extends ActionFailure<infer X> + ? X + : T extends void + ? undefined // needs to be undefined, because void will corrupt union type + : T; /** * This object is passed to the `adapt` function of adapters. @@ -1786,9 +1787,9 @@ declare module '@sveltejs/kit' { * Checks whether this is an error thrown by {@link error}. * @param status The status to filter for. * */ - export function isHttpError<T extends number>(e: unknown, status?: T | undefined): e is HttpError_1 & { + export function isHttpError<T extends number>(e: unknown, status?: T | undefined): e is (HttpError_1 & { status: T extends undefined ? never : T; - }; + }); /** * Redirect a request. When called during request handling, SvelteKit will return a redirect response. * Make sure you're not catching the thrown redirect, which would prevent SvelteKit from handling it. @@ -1830,8 +1831,8 @@ declare module '@sveltejs/kit' { * Checks whether this is an action failure thrown by {@link fail}. * @param e The object to check. * */ - export function isActionFailure(e: unknown): e is ActionFailure<undefined>; - export type LessThan<TNumber extends number, TArray extends any[] = []> = TNumber extends TArray['length'] ? TArray[number] : LessThan<TNumber, [...TArray, TArray['length']]>; + export function isActionFailure(e: unknown): e is ActionFailure; + export type LessThan<TNumber extends number, TArray extends any[] = []> = TNumber extends TArray["length"] ? TArray[number] : LessThan<TNumber, [...TArray, TArray["length"]]>; export type NumericRange<TStart extends number, TEnd extends number> = Exclude<TEnd | LessThan<TEnd>, LessThan<TStart>>; export const VERSION: string; class HttpError_1 { @@ -1924,19 +1925,19 @@ declare module '@sveltejs/kit/hooks' { * * @param handlers The chain of `handle` functions * */ - export function sequence(...handlers: import('@sveltejs/kit').Handle[]): import('@sveltejs/kit').Handle; + export function sequence(...handlers: import("@sveltejs/kit").Handle[]): import("@sveltejs/kit").Handle; export {}; } declare module '@sveltejs/kit/node' { export function getRequest({ request, base, bodySizeLimit }: { - request: import('http').IncomingMessage; + request: import("http").IncomingMessage; base: string; bodySizeLimit?: number; }): Promise<Request>; - export function setResponse(res: import('http').ServerResponse, response: Response): Promise<void>; + export function setResponse(res: import("http").ServerResponse, response: Response): Promise<void>; /** * Converts a file on disk to a readable stream * @since 2.4.0 @@ -1961,7 +1962,7 @@ declare module '@sveltejs/kit/vite' { /** * Returns the SvelteKit Vite plugins. * */ - export function sveltekit(): Promise<import('vite').Plugin[]>; + export function sveltekit(): Promise<import("vite").Plugin[]>; export {}; } @@ -2048,7 +2049,7 @@ declare module '$app/navigation' { * * `afterNavigate` must be called during a component initialization. It remains active as long as the component is mounted. * */ - export function afterNavigate(callback: (navigation: import('@sveltejs/kit').AfterNavigate) => void): void; + export function afterNavigate(callback: (navigation: import("@sveltejs/kit").AfterNavigate) => void): void; /** * A navigation interceptor that triggers before we navigate to a new URL, whether by clicking a link, calling `goto(...)`, or using the browser back/forward controls. * @@ -2060,7 +2061,7 @@ declare module '$app/navigation' { * * `beforeNavigate` must be called during a component initialization. It remains active as long as the component is mounted. * */ - export function beforeNavigate(callback: (navigation: import('@sveltejs/kit').BeforeNavigate) => void): void; + export function beforeNavigate(callback: (navigation: import("@sveltejs/kit").BeforeNavigate) => void): void; /** * A lifecycle function that runs the supplied `callback` immediately before we navigate to a new URL except during full-page navigations. * @@ -2070,7 +2071,7 @@ declare module '$app/navigation' { * * `onNavigate` must be called during a component initialization. It remains active as long as the component is mounted. * */ - export function onNavigate(callback: (navigation: import('@sveltejs/kit').OnNavigate) => MaybePromise<(() => void) | void>): void; + export function onNavigate(callback: (navigation: import("@sveltejs/kit").OnNavigate) => MaybePromise<(() => void) | void>): void; /** * If called when the page is being updated following a navigation (in `onMount` or `afterNavigate` or an action, for example), this disables SvelteKit's built-in scroll handling. * This is generally discouraged, since it breaks user expectations. @@ -2124,11 +2125,11 @@ declare module '$app/navigation' { * @param href Page to preload * */ export function preloadData(href: string): Promise<{ - type: 'loaded'; + type: "loaded"; status: number; data: Record<string, any>; } | { - type: 'redirect'; + type: "redirect"; location: string; }>; /** @@ -2225,7 +2226,7 @@ declare module '$app/stores' { * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. * * */ - export const page: import('svelte/store').Readable<import('@sveltejs/kit').Page>; + export const page: import("svelte/store").Readable<import("@sveltejs/kit").Page>; /** * A readable store. * When navigating starts, its value is a `Navigation` object with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties. @@ -2233,13 +2234,13 @@ declare module '$app/stores' { * * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. * */ - export const navigating: import('svelte/store').Readable<import('@sveltejs/kit').Navigation | null>; + export const navigating: import("svelte/store").Readable<import("@sveltejs/kit").Navigation | null>; /** * A readable store whose initial value is `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. * * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. * */ - export const updated: import('svelte/store').Readable<boolean> & { + export const updated: import("svelte/store").Readable<boolean> & { check(): Promise<boolean>; }; diff --git a/packages/package/package.json b/packages/package/package.json index d5369848ccf5..1ab629b29654 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -27,11 +27,11 @@ "svelte2tsx": "~0.7.16" }, "devDependencies": { - "@sveltejs/vite-plugin-svelte": "^3.0.1", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "@types/semver": "^7.5.6", "prettier": "^3.1.1", - "svelte": "^4.2.10", + "svelte": "^5.2.9", "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", "uvu": "^0.5.6" diff --git a/packages/package/test/fixtures/javascript/expected/Test.svelte.d.ts b/packages/package/test/fixtures/javascript/expected/Test.svelte.d.ts index 674fa1a2ab93..4d8d06cf9ae1 100644 --- a/packages/package/test/fixtures/javascript/expected/Test.svelte.d.ts +++ b/packages/package/test/fixtures/javascript/expected/Test.svelte.d.ts @@ -1,42 +1,55 @@ -/** @typedef {typeof __propDef.props} TestProps */ -/** @typedef {typeof __propDef.events} TestEvents */ -/** @typedef {typeof __propDef.slots} TestSlots */ -export default class Test extends SvelteComponent< - { - astring?: string; - }, - { - event: CustomEvent<any>; - } & { - [evt: string]: CustomEvent<any>; - }, - { - default: { - astring: string; - }; - } -> { - get astring(): string; -} -export type TestProps = typeof __propDef.props; -export type TestEvents = typeof __propDef.events; -export type TestSlots = typeof __propDef.slots; -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - astring?: string; - }; - events: { - event: CustomEvent<any>; - } & { - [evt: string]: CustomEvent<any>; - }; - slots: { - default: { - astring: string; - }; - }; - exports?: {}; - bindings?: string; +export default Test; +type Test = SvelteComponent<$$__sveltets_2_PropsWithChildren<{ + astring?: string; +}, { + default: { + astring: string; + }; +}>, { + event: CustomEvent<any>; +} & { + [evt: string]: CustomEvent<any>; +}, { + default: { + astring: string; + }; +}> & { + $$bindings?: string; +} & { + astring: string; }; -export {}; +declare const Test: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{ + astring?: string; +}, { + default: { + astring: string; + }; +}>, { + event: CustomEvent<any>; +} & { + [evt: string]: CustomEvent<any>; +}, { + default: { + astring: string; + }; +}, { + astring: string; +}, string>; +type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends { + default: any; +} ? Props extends Record<string, never> ? any : { + children?: any; +} : {}); +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; + }; + z_$$bindings?: Bindings; +} diff --git a/packages/package/test/fixtures/javascript/expected/Test2.svelte.d.ts b/packages/package/test/fixtures/javascript/expected/Test2.svelte.d.ts index b01420475cf3..0774e4032afb 100644 --- a/packages/package/test/fixtures/javascript/expected/Test2.svelte.d.ts +++ b/packages/package/test/fixtures/javascript/expected/Test2.svelte.d.ts @@ -1,28 +1,26 @@ -/** @typedef {typeof __propDef.props} Test2Props */ -/** @typedef {typeof __propDef.events} Test2Events */ -/** @typedef {typeof __propDef.slots} Test2Slots */ -export default class Test2 extends SvelteComponent< - { - foo: boolean; - }, - { - [evt: string]: CustomEvent<any>; - }, - {} -> {} -export type Test2Props = typeof __propDef.props; -export type Test2Events = typeof __propDef.events; -export type Test2Slots = typeof __propDef.slots; -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - foo: import('./foo').Foo; - }; - events: { - [evt: string]: CustomEvent<any>; - }; - slots: {}; - exports?: {}; - bindings?: string; +export default Test2; +type Test2 = SvelteComponent<{ + foo: boolean; +}, { + [evt: string]: CustomEvent<any>; +}, {}> & { + $$bindings?: string; }; -export {}; +declare const Test2: $$__sveltets_2_IsomorphicComponent<{ + foo: import("./foo").Foo; +}, { + [evt: string]: CustomEvent<any>; +}, {}, {}, string>; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; + }; + z_$$bindings?: Bindings; +} diff --git a/packages/package/test/fixtures/javascript/expected/internal/Test.svelte.d.ts b/packages/package/test/fixtures/javascript/expected/internal/Test.svelte.d.ts index 406a883fc969..1c3abfd7fb6e 100644 --- a/packages/package/test/fixtures/javascript/expected/internal/Test.svelte.d.ts +++ b/packages/package/test/fixtures/javascript/expected/internal/Test.svelte.d.ts @@ -1,28 +1,26 @@ -/** @typedef {typeof __propDef.props} TestProps */ -/** @typedef {typeof __propDef.events} TestEvents */ -/** @typedef {typeof __propDef.slots} TestSlots */ -export default class Test extends SvelteComponent< - { - foo: boolean; - }, - { - [evt: string]: CustomEvent<any>; - }, - {} -> {} -export type TestProps = typeof __propDef.props; -export type TestEvents = typeof __propDef.events; -export type TestSlots = typeof __propDef.slots; -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - foo: import('./foo').Foo; - }; - events: { - [evt: string]: CustomEvent<any>; - }; - slots: {}; - exports?: {}; - bindings?: string; +export default Test; +type Test = SvelteComponent<{ + foo: boolean; +}, { + [evt: string]: CustomEvent<any>; +}, {}> & { + $$bindings?: string; }; -export {}; +declare const Test: $$__sveltets_2_IsomorphicComponent<{ + foo: import("./foo").Foo; +}, { + [evt: string]: CustomEvent<any>; +}, {}, {}, string>; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; + }; + z_$$bindings?: Bindings; +} diff --git a/packages/package/test/fixtures/resolve-alias/expected/Test.svelte b/packages/package/test/fixtures/resolve-alias/expected/Test.svelte index d6dbdc91b465..e1ffec195b89 100644 --- a/packages/package/test/fixtures/resolve-alias/expected/Test.svelte +++ b/packages/package/test/fixtures/resolve-alias/expected/Test.svelte @@ -1,6 +1,8 @@ -<script> - import { foo } from './sub/foo'; - import { util } from './utils'; - export let bar = foo; - util(); +<script lang="ts"> + import { foo } from './sub/foo'; + import { util } from './utils'; + + export let bar = foo; + + util(); </script> diff --git a/packages/package/test/fixtures/resolve-alias/expected/Test.svelte.d.ts b/packages/package/test/fixtures/resolve-alias/expected/Test.svelte.d.ts index 66031c66a487..f2b4fd180e4a 100644 --- a/packages/package/test/fixtures/resolve-alias/expected/Test.svelte.d.ts +++ b/packages/package/test/fixtures/resolve-alias/expected/Test.svelte.d.ts @@ -1,17 +1,20 @@ -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - bar?: import('./sub/foo').Foo; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; }; - events: { - [evt: string]: CustomEvent<any>; - }; - slots: {}; - exports?: {}; - bindings?: string; -}; -export type TestProps = typeof __propDef.props; -export type TestEvents = typeof __propDef.events; -export type TestSlots = typeof __propDef.slots; -export default class Test extends SvelteComponent<TestProps, TestEvents, TestSlots> {} -export {}; + z_$$bindings?: Bindings; +} +declare const Test: $$__sveltets_2_IsomorphicComponent<{ + bar?: import("./sub/foo").Foo; +}, { + [evt: string]: CustomEvent<any>; +}, {}, {}, string>; +type Test = InstanceType<typeof Test>; +export default Test; diff --git a/packages/package/test/fixtures/svelte-3-types/expected/Test.svelte b/packages/package/test/fixtures/svelte-3-types/expected/Test.svelte index 661b1b8276b0..7613c3ebf28b 100644 --- a/packages/package/test/fixtures/svelte-3-types/expected/Test.svelte +++ b/packages/package/test/fixtures/svelte-3-types/expected/Test.svelte @@ -1,4 +1,4 @@ -<script> +<script lang="ts"> import { createEventDispatcher } from 'svelte'; export const astring = 'potato'; const dispatch = createEventDispatcher(); diff --git a/packages/package/test/fixtures/svelte-kit/expected/Test.svelte.d.ts b/packages/package/test/fixtures/svelte-kit/expected/Test.svelte.d.ts index 674fa1a2ab93..4d8d06cf9ae1 100644 --- a/packages/package/test/fixtures/svelte-kit/expected/Test.svelte.d.ts +++ b/packages/package/test/fixtures/svelte-kit/expected/Test.svelte.d.ts @@ -1,42 +1,55 @@ -/** @typedef {typeof __propDef.props} TestProps */ -/** @typedef {typeof __propDef.events} TestEvents */ -/** @typedef {typeof __propDef.slots} TestSlots */ -export default class Test extends SvelteComponent< - { - astring?: string; - }, - { - event: CustomEvent<any>; - } & { - [evt: string]: CustomEvent<any>; - }, - { - default: { - astring: string; - }; - } -> { - get astring(): string; -} -export type TestProps = typeof __propDef.props; -export type TestEvents = typeof __propDef.events; -export type TestSlots = typeof __propDef.slots; -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - astring?: string; - }; - events: { - event: CustomEvent<any>; - } & { - [evt: string]: CustomEvent<any>; - }; - slots: { - default: { - astring: string; - }; - }; - exports?: {}; - bindings?: string; +export default Test; +type Test = SvelteComponent<$$__sveltets_2_PropsWithChildren<{ + astring?: string; +}, { + default: { + astring: string; + }; +}>, { + event: CustomEvent<any>; +} & { + [evt: string]: CustomEvent<any>; +}, { + default: { + astring: string; + }; +}> & { + $$bindings?: string; +} & { + astring: string; }; -export {}; +declare const Test: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{ + astring?: string; +}, { + default: { + astring: string; + }; +}>, { + event: CustomEvent<any>; +} & { + [evt: string]: CustomEvent<any>; +}, { + default: { + astring: string; + }; +}, { + astring: string; +}, string>; +type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends { + default: any; +} ? Props extends Record<string, never> ? any : { + children?: any; +} : {}); +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; + }; + z_$$bindings?: Bindings; +} diff --git a/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte b/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte index 29329add3320..f46e78994ae5 100644 --- a/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte +++ b/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte @@ -4,5 +4,14 @@ </script> <svelte:head> - <script type="application/ld+json">{JSON.stringify(jsonLd)}</script> + <script type="application/ld+json"> + { + "@context": "http://schema.org", + "@type": "Corporation", + "name": "Svelte Corp", + "description": "Svelte will cybernetically enhance you", + "naics": "523910", + "url": "https://svelte.dev" + } + </script> </svelte:head> diff --git a/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte.d.ts b/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte.d.ts index 5da27ce522c5..e2632ad81c35 100644 --- a/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte.d.ts +++ b/packages/package/test/fixtures/typescript-esnext/expected/Plain.svelte.d.ts @@ -1,28 +1,26 @@ -/** @typedef {typeof __propDef.props} PlainProps */ -/** @typedef {typeof __propDef.events} PlainEvents */ -/** @typedef {typeof __propDef.slots} PlainSlots */ -export default class Plain extends SvelteComponent< - { - foo: boolean; - }, - { - [evt: string]: CustomEvent<any>; - }, - {} -> {} -export type PlainProps = typeof __propDef.props; -export type PlainEvents = typeof __propDef.events; -export type PlainSlots = typeof __propDef.slots; -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - foo: import('./foo').Foo; - }; - events: { - [evt: string]: CustomEvent<any>; - }; - slots: {}; - exports?: {}; - bindings?: string; +export default Plain; +type Plain = SvelteComponent<{ + foo: boolean; +}, { + [evt: string]: CustomEvent<any>; +}, {}> & { + $$bindings?: string; }; -export {}; +declare const Plain: $$__sveltets_2_IsomorphicComponent<{ + foo: import("./foo").Foo; +}, { + [evt: string]: CustomEvent<any>; +}, {}, {}, string>; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import("svelte").ComponentConstructorOptions<Props>): import("svelte").SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; + }; + z_$$bindings?: Bindings; +} diff --git a/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte b/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte index 661b1b8276b0..7613c3ebf28b 100644 --- a/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte +++ b/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte @@ -1,4 +1,4 @@ -<script> +<script lang="ts"> import { createEventDispatcher } from 'svelte'; export const astring = 'potato'; const dispatch = createEventDispatcher(); diff --git a/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte.d.ts b/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte.d.ts index 5ed842ee8097..f5601c7243ed 100644 --- a/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte.d.ts +++ b/packages/package/test/fixtures/typescript-esnext/expected/Test.svelte.d.ts @@ -1,25 +1,37 @@ -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - astring?: string; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; }; - events: { - event: CustomEvent<boolean>; - } & { - [evt: string]: CustomEvent<any>; + z_$$bindings?: Bindings; +} +type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends { + default: any; +} ? Props extends Record<string, never> ? any : { + children?: any; +} : {}); +declare const Test: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{ + astring?: string; +}, { + default: { + astring: string; }; - slots: { - default: { +}>, { + event: CustomEvent<boolean>; +} & { + [evt: string]: CustomEvent<any>; +}, { + default: { astring: string; - }; }; - exports?: {}; - bindings?: string; -}; -export type TestProps = typeof __propDef.props; -export type TestEvents = typeof __propDef.events; -export type TestSlots = typeof __propDef.slots; -export default class Test extends SvelteComponent<TestProps, TestEvents, TestSlots> { - get astring(): string; -} -export {}; +}, { + astring: string; +}, string>; +type Test = InstanceType<typeof Test>; +export default Test; diff --git a/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte b/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte index 8754c5335039..497284d14e32 100644 --- a/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte +++ b/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte @@ -1,3 +1,3 @@ -<script> +<script lang="ts"> export let foo; </script> diff --git a/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte.d.ts b/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte.d.ts index d47a70a6e3f6..c8d660dcb43f 100644 --- a/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte.d.ts +++ b/packages/package/test/fixtures/typescript-esnext/expected/Test2.svelte.d.ts @@ -1,18 +1,21 @@ -import { SvelteComponent } from 'svelte'; import type { Foo } from './foo'; -declare const __propDef: { - props: { - foo: Foo; - }; - events: { - [evt: string]: CustomEvent<any>; - }; - slots: {}; - exports?: {}; - bindings?: string; -}; -export type Test2Props = typeof __propDef.props; -export type Test2Events = typeof __propDef.events; -export type Test2Slots = typeof __propDef.slots; -export default class Test2 extends SvelteComponent<Test2Props, Test2Events, Test2Slots> {} -export {}; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; + }; + z_$$bindings?: Bindings; +} +declare const Test2: $$__sveltets_2_IsomorphicComponent<{ + foo: Foo; +}, { + [evt: string]: CustomEvent<any>; +}, {}, {}, string>; +type Test2 = InstanceType<typeof Test2>; +export default Test2; diff --git a/packages/package/test/fixtures/typescript-esnext/src/lib/Plain.svelte b/packages/package/test/fixtures/typescript-esnext/src/lib/Plain.svelte index 1e058c33318f..dea0160a9343 100644 --- a/packages/package/test/fixtures/typescript-esnext/src/lib/Plain.svelte +++ b/packages/package/test/fixtures/typescript-esnext/src/lib/Plain.svelte @@ -6,7 +6,12 @@ <svelte:head> <script type="application/ld+json"> { - JSON.stringify(jsonLd); + "@context": "http://schema.org", + "@type": "Corporation", + "name": "Svelte Corp", + "description": "Svelte will cybernetically enhance you", + "naics": "523910", + "url": "https://svelte.dev" } </script> </svelte:head> diff --git a/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte b/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte index 661b1b8276b0..7613c3ebf28b 100644 --- a/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte +++ b/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte @@ -1,4 +1,4 @@ -<script> +<script lang="ts"> import { createEventDispatcher } from 'svelte'; export const astring = 'potato'; const dispatch = createEventDispatcher(); diff --git a/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte.d.ts b/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte.d.ts index 5ed842ee8097..f5601c7243ed 100644 --- a/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte.d.ts +++ b/packages/package/test/fixtures/typescript-nodenext/expected/Test.svelte.d.ts @@ -1,25 +1,37 @@ -import { SvelteComponent } from 'svelte'; -declare const __propDef: { - props: { - astring?: string; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; }; - events: { - event: CustomEvent<boolean>; - } & { - [evt: string]: CustomEvent<any>; + z_$$bindings?: Bindings; +} +type $$__sveltets_2_PropsWithChildren<Props, Slots> = Props & (Slots extends { + default: any; +} ? Props extends Record<string, never> ? any : { + children?: any; +} : {}); +declare const Test: $$__sveltets_2_IsomorphicComponent<$$__sveltets_2_PropsWithChildren<{ + astring?: string; +}, { + default: { + astring: string; }; - slots: { - default: { +}>, { + event: CustomEvent<boolean>; +} & { + [evt: string]: CustomEvent<any>; +}, { + default: { astring: string; - }; }; - exports?: {}; - bindings?: string; -}; -export type TestProps = typeof __propDef.props; -export type TestEvents = typeof __propDef.events; -export type TestSlots = typeof __propDef.slots; -export default class Test extends SvelteComponent<TestProps, TestEvents, TestSlots> { - get astring(): string; -} -export {}; +}, { + astring: string; +}, string>; +type Test = InstanceType<typeof Test>; +export default Test; diff --git a/packages/package/test/watch/expected/Test.svelte.d.ts b/packages/package/test/watch/expected/Test.svelte.d.ts index fecde1b0e9cb..f642196d7c16 100644 --- a/packages/package/test/watch/expected/Test.svelte.d.ts +++ b/packages/package/test/watch/expected/Test.svelte.d.ts @@ -1,18 +1,20 @@ -import { SvelteComponent } from "svelte"; -declare const __propDef: { - props: { - answer: number; +interface $$__sveltets_2_IsomorphicComponent<Props extends Record<string, any> = any, Events extends Record<string, any> = any, Slots extends Record<string, any> = any, Exports = {}, Bindings = string> { + new (options: import('svelte').ComponentConstructorOptions<Props>): import('svelte').SvelteComponent<Props, Events, Slots> & { + $$bindings?: Bindings; + } & Exports; + (internal: unknown, props: Props & { + $$events?: Events; + $$slots?: Slots; + }): Exports & { + $set?: any; + $on?: any; }; - events: { - [evt: string]: CustomEvent<any>; - }; - slots: {}; - exports?: {}; - bindings?: string; -}; -export type TestProps = typeof __propDef.props; -export type TestEvents = typeof __propDef.events; -export type TestSlots = typeof __propDef.slots; -export default class Test extends SvelteComponent<TestProps, TestEvents, TestSlots> { + z_$$bindings?: Bindings; } -export {}; +declare const Test: $$__sveltets_2_IsomorphicComponent<{ + answer: number; +}, { + [evt: string]: CustomEvent<any>; +}, {}, {}, string>; +type Test = InstanceType<typeof Test>; +export default Test; diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index 05d510a132f4..bd69a0b29525 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -24,14 +24,14 @@ "@sveltejs/amp": "workspace:*", "@sveltejs/kit": "workspace:*", "@sveltejs/package": "workspace:*", - "@sveltejs/vite-plugin-svelte": "^4.0.0", + "@sveltejs/vite-plugin-svelte": "^5.0.1", "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.2.6", "publint": "^0.2.0", - "svelte": "^5.1.13", + "svelte": "^5.2.9", "svelte-check": "^4.0.1", "typescript": "^5.5.0", - "vite": "^5.4.4" + "vite": "^6.0.1" }, "type": "module", "exports": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0c80878cb9d1..4c7a7dca9fbb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.27.8 '@sveltejs/eslint-config': specifier: ^8.1.0 - version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.13))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) + version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 @@ -25,10 +25,10 @@ importers: version: 1.44.1 prettier: specifier: ^3.1.1 - version: 3.1.1 + version: 3.3.3 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.1.2(prettier@3.1.1)(svelte@5.1.13) + version: 3.2.7(prettier@3.3.3)(svelte@5.2.9) typescript-eslint: specifier: ^8.0.0 version: 8.4.0(eslint@9.6.0)(typescript@5.6.3) @@ -43,14 +43,14 @@ importers: specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 packages/adapter-cloudflare: dependencies: @@ -58,8 +58,8 @@ importers: specifier: ^4.20231121.0 version: 4.20240405.0 esbuild: - specifier: ^0.21.5 - version: 0.21.5 + specifier: ^0.24.0 + version: 0.24.0 worktop: specifier: 0.8.0-next.18 version: 0.8.0-next.18 @@ -78,7 +78,7 @@ importers: version: 8.5.10 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 packages/adapter-cloudflare-workers: dependencies: @@ -89,8 +89,8 @@ importers: specifier: ^2.2.5 version: 2.2.5 esbuild: - specifier: ^0.21.5 - version: 0.21.5 + specifier: ^0.24.0 + version: 0.24.0 wrangler: specifier: ^3.28.4 version: 3.63.1(@cloudflare/workers-types@4.20240405.0) @@ -106,7 +106,7 @@ importers: version: 18.19.50 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 packages/adapter-netlify: dependencies: @@ -114,8 +114,8 @@ importers: specifier: ^2.2.5 version: 2.2.5 esbuild: - specifier: ^0.21.5 - version: 0.21.5 + specifier: ^0.24.0 + version: 0.24.0 set-cookie-parser: specifier: ^2.6.0 version: 2.6.0 @@ -125,19 +125,19 @@ importers: version: 2.6.0 '@rollup/plugin-commonjs': specifier: ^28.0.1 - version: 28.0.1(rollup@4.24.0) + version: 28.0.1(rollup@4.27.4) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.24.0) + version: 6.1.0(rollup@4.27.4) '@rollup/plugin-node-resolve': specifier: ^15.3.0 - version: 15.3.0(rollup@4.24.0) + version: 15.3.0(rollup@4.27.4) '@sveltejs/kit': specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -146,28 +146,28 @@ importers: version: 2.4.7 rollup: specifier: ^4.14.2 - version: 4.24.0 + version: 4.27.4 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-node: dependencies: '@rollup/plugin-commonjs': specifier: ^28.0.1 - version: 28.0.1(rollup@4.24.0) + version: 28.0.1(rollup@4.27.4) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.24.0) + version: 6.1.0(rollup@4.27.4) '@rollup/plugin-node-resolve': specifier: ^15.3.0 - version: 15.3.0(rollup@4.24.0) + version: 15.3.0(rollup@4.27.4) rollup: specifier: ^4.9.5 - version: 4.24.0 + version: 4.27.4 devDependencies: '@polka/url': specifier: ^1.0.0-next.28 @@ -176,8 +176,8 @@ importers: specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -189,10 +189,10 @@ importers: version: 3.0.0 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static: devDependencies: @@ -203,8 +203,8 @@ importers: specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -212,14 +212,14 @@ importers: specifier: ^3.0.0 version: 3.0.0 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/prerendered: devDependencies: @@ -227,17 +227,17 @@ importers: specifier: workspace:^ version: link:../../../../kit '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/spa: devDependencies: @@ -248,17 +248,17 @@ importers: specifier: workspace:^ version: link:../../../../kit '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-vercel: dependencies: @@ -266,34 +266,34 @@ importers: specifier: ^0.27.1 version: 0.27.1 esbuild: - specifier: ^0.21.5 - version: 0.21.5 + specifier: ^0.24.0 + version: 0.24.0 devDependencies: '@sveltejs/kit': specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/amp: dependencies: '@sveltejs/kit': specifier: ^1.0.0 || ^2.0.0 - version: 2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + version: link:../kit devDependencies: typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 packages/create-svelte: {} @@ -301,13 +301,13 @@ importers: dependencies: magic-string: specifier: ^0.30.5 - version: 0.30.11 + version: 0.30.14 svelte-parse-markup: specifier: ^0.1.5 - version: 0.1.5(svelte@5.1.13) + version: 0.1.5(svelte@5.2.9) vite-imagetools: specifier: ^7.0.1 - version: 7.0.1(rollup@4.24.0) + version: 7.0.1(rollup@4.27.4) zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -319,20 +319,20 @@ importers: specifier: ^18.19.48 version: 18.19.50 rollup: - specifier: ^4.14.2 - version: 4.24.0 + specifier: ^4.27.4 + version: 4.27.4 svelte: - specifier: ^5.1.3 - version: 5.1.13 + specifier: ^5.2.9 + version: 5.2.9 typescript: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit: dependencies: @@ -346,8 +346,8 @@ importers: specifier: ^5.1.0 version: 5.1.0 esm-env: - specifier: ^1.0.0 - version: 1.0.0 + specifier: ^1.2.1 + version: 1.2.1 import-meta-resolve: specifier: ^4.1.0 version: 4.1.0 @@ -356,7 +356,7 @@ importers: version: 4.1.5 magic-string: specifier: ^0.30.5 - version: 0.30.11 + version: 0.30.14 mrmime: specifier: ^2.0.0 version: 2.0.0 @@ -377,8 +377,8 @@ importers: specifier: ^1.44.1 version: 1.44.1 '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/connect': specifier: ^3.4.38 version: 3.4.38 @@ -389,26 +389,26 @@ importers: specifier: ^2.4.7 version: 2.4.7 dts-buddy: - specifier: ^0.5.3 - version: 0.5.3(typescript@5.4.5) + specifier: ^0.5.4 + version: 0.5.4(typescript@5.6.3) rollup: specifier: ^4.14.2 - version: 4.24.0 + version: 4.27.4 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-preprocess: specifier: ^6.0.0 - version: 6.0.0(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.4.5) + version: 6.0.0(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/amp: devDependencies: @@ -419,8 +419,8 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -428,17 +428,17 @@ importers: specifier: ^1.0.16 version: 1.0.16 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/basics: devDependencies: @@ -446,23 +446,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/dev-only: devDependencies: @@ -470,8 +470,8 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -506,17 +506,17 @@ importers: specifier: file:./_test_dependencies/cjs-only version: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/embed: devDependencies: @@ -524,23 +524,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/no-ssr: devDependencies: @@ -548,23 +548,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options: devDependencies: @@ -572,23 +572,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options-2: devDependencies: @@ -599,23 +599,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/writes: devDependencies: @@ -623,29 +623,29 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors: devDependencies: vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch: devDependencies: @@ -656,20 +656,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment: devDependencies: @@ -680,20 +680,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-not-prerendered: devDependencies: @@ -704,20 +704,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env: devDependencies: @@ -725,20 +725,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import: devDependencies: @@ -746,20 +746,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env: devDependencies: @@ -767,23 +767,23 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env-dynamic-import: devDependencies: @@ -791,20 +791,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder: devDependencies: @@ -812,20 +812,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder-dynamic-import: devDependencies: @@ -833,20 +833,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module: devDependencies: @@ -854,20 +854,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module-dynamic-import: devDependencies: @@ -875,20 +875,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-dynamic-public-env: devDependencies: @@ -896,20 +896,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-private-env: devDependencies: @@ -917,20 +917,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/syntax-error: devDependencies: @@ -938,20 +938,20 @@ importers: specifier: workspace:^ version: link:../../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/basics: devDependencies: @@ -959,23 +959,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/options: devDependencies: @@ -983,23 +983,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/paths-base: devDependencies: @@ -1007,23 +1007,23 @@ importers: specifier: workspace:^ version: link:../../.. '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^5.3.2 - version: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.0.1 - version: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/package: dependencies: @@ -1041,11 +1041,11 @@ importers: version: 7.6.3 svelte2tsx: specifier: ~0.7.16 - version: 0.7.18(svelte@4.2.19)(typescript@5.4.5) + version: 0.7.18(svelte@5.2.9)(typescript@5.6.3) devDependencies: '@sveltejs/vite-plugin-svelte': - specifier: ^3.0.1 - version: 3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1054,16 +1054,16 @@ importers: version: 7.5.8 prettier: specifier: ^3.1.1 - version: 3.1.1 + version: 3.3.3 svelte: - specifier: ^4.2.10 - version: 4.2.19 + specifier: ^5.2.9 + version: 5.2.9 svelte-preprocess: specifier: ^6.0.0 - version: 6.0.0(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.4.5) + version: 6.0.0(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.3.3 - version: 5.4.5 + version: 5.6.3 uvu: specifier: ^0.5.6 version: 0.5.6 @@ -1101,29 +1101,29 @@ importers: specifier: workspace:* version: link:../../packages/package '@sveltejs/vite-plugin-svelte': - specifier: ^4.0.0 - version: 4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) prettier: specifier: ^3.3.2 version: 3.3.3 prettier-plugin-svelte: specifier: ^3.2.6 - version: 3.2.7(prettier@3.3.3)(svelte@5.1.13) + version: 3.2.7(prettier@3.3.3)(svelte@5.2.9) publint: specifier: ^0.2.0 version: 0.2.7 svelte: - specifier: ^5.1.13 - version: 5.1.13 + specifier: ^5.2.9 + version: 5.2.9 svelte-check: specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.1.13)(typescript@5.6.3) + version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.0 version: 5.6.3 vite: - specifier: ^5.4.4 - version: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages: @@ -1251,9 +1251,9 @@ packages: peerDependencies: esbuild: '*' - '@esbuild/aix-ppc64@0.21.5': - resolution: {integrity: sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==} - engines: {node: '>=12'} + '@esbuild/aix-ppc64@0.24.0': + resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1263,9 +1263,9 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.21.5': - resolution: {integrity: sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==} - engines: {node: '>=12'} + '@esbuild/android-arm64@0.24.0': + resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1275,9 +1275,9 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.21.5': - resolution: {integrity: sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==} - engines: {node: '>=12'} + '@esbuild/android-arm@0.24.0': + resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1287,9 +1287,9 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.21.5': - resolution: {integrity: sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==} - engines: {node: '>=12'} + '@esbuild/android-x64@0.24.0': + resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1299,9 +1299,9 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.21.5': - resolution: {integrity: sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==} - engines: {node: '>=12'} + '@esbuild/darwin-arm64@0.24.0': + resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1311,9 +1311,9 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.21.5': - resolution: {integrity: sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==} - engines: {node: '>=12'} + '@esbuild/darwin-x64@0.24.0': + resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1323,9 +1323,9 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.21.5': - resolution: {integrity: sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==} - engines: {node: '>=12'} + '@esbuild/freebsd-arm64@0.24.0': + resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1335,9 +1335,9 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.21.5': - resolution: {integrity: sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==} - engines: {node: '>=12'} + '@esbuild/freebsd-x64@0.24.0': + resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1347,9 +1347,9 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.21.5': - resolution: {integrity: sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==} - engines: {node: '>=12'} + '@esbuild/linux-arm64@0.24.0': + resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1359,9 +1359,9 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.21.5': - resolution: {integrity: sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==} - engines: {node: '>=12'} + '@esbuild/linux-arm@0.24.0': + resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1371,9 +1371,9 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.21.5': - resolution: {integrity: sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==} - engines: {node: '>=12'} + '@esbuild/linux-ia32@0.24.0': + resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1383,9 +1383,9 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.21.5': - resolution: {integrity: sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==} - engines: {node: '>=12'} + '@esbuild/linux-loong64@0.24.0': + resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1395,9 +1395,9 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.21.5': - resolution: {integrity: sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==} - engines: {node: '>=12'} + '@esbuild/linux-mips64el@0.24.0': + resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1407,9 +1407,9 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.21.5': - resolution: {integrity: sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==} - engines: {node: '>=12'} + '@esbuild/linux-ppc64@0.24.0': + resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1419,9 +1419,9 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.21.5': - resolution: {integrity: sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==} - engines: {node: '>=12'} + '@esbuild/linux-riscv64@0.24.0': + resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1431,9 +1431,9 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.21.5': - resolution: {integrity: sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==} - engines: {node: '>=12'} + '@esbuild/linux-s390x@0.24.0': + resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1443,9 +1443,9 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.21.5': - resolution: {integrity: sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==} - engines: {node: '>=12'} + '@esbuild/linux-x64@0.24.0': + resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + engines: {node: '>=18'} cpu: [x64] os: [linux] @@ -1455,21 +1455,27 @@ packages: cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.21.5': - resolution: {integrity: sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==} - engines: {node: '>=12'} + '@esbuild/netbsd-x64@0.24.0': + resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/openbsd-arm64@0.24.0': + resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.17.19': resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} engines: {node: '>=12'} cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.21.5': - resolution: {integrity: sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==} - engines: {node: '>=12'} + '@esbuild/openbsd-x64@0.24.0': + resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1479,9 +1485,9 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.21.5': - resolution: {integrity: sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==} - engines: {node: '>=12'} + '@esbuild/sunos-x64@0.24.0': + resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1491,9 +1497,9 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.21.5': - resolution: {integrity: sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==} - engines: {node: '>=12'} + '@esbuild/win32-arm64@0.24.0': + resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1503,9 +1509,9 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.21.5': - resolution: {integrity: sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==} - engines: {node: '>=12'} + '@esbuild/win32-ia32@0.24.0': + resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1515,20 +1521,20 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.21.5': - resolution: {integrity: sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==} - engines: {node: '>=12'} + '@esbuild/win32-x64@0.24.0': + resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.0': - resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + '@eslint-community/eslint-utils@4.4.1': + resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/regexpp@4.11.1': - resolution: {integrity: sha512-m4DVN9ZqskZoLU5GlWZadwDnYo3vAEydiUayB9widCl9ffWx2IvPnp6n3on5rJmziJSw9Bv+Z3ChDVdMwXCY8Q==} + '@eslint-community/regexpp@4.12.1': + resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} '@eslint/config-array@0.17.0': @@ -1675,10 +1681,6 @@ packages: cpu: [x64] os: [win32] - '@jest/schemas@29.6.3': - resolution: {integrity: sha512-mo5j5X+jIZmJQveBKeS/clAueipV7KgiX1vMgCxam1RNYiqE1w62n0/tJJnHtjW8ZHcQco5gY85jA3mi0L+nSA==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -1785,89 +1787,96 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.24.0': - resolution: {integrity: sha512-Q6HJd7Y6xdB48x8ZNVDOqsbh2uByBhgK8PiQgPhwkIw/HC/YX5Ghq2mQY5sRMZWHb3VsFkWooUVOZHKr7DmDIA==} + '@rollup/rollup-android-arm-eabi@4.27.4': + resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.24.0': - resolution: {integrity: sha512-ijLnS1qFId8xhKjT81uBHuuJp2lU4x2yxa4ctFPtG+MqEE6+C5f/+X/bStmxapgmwLwiL3ih122xv8kVARNAZA==} + '@rollup/rollup-android-arm64@4.27.4': + resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.24.0': - resolution: {integrity: sha512-bIv+X9xeSs1XCk6DVvkO+S/z8/2AMt/2lMqdQbMrmVpgFvXlmde9mLcbQpztXm1tajC3raFDqegsH18HQPMYtA==} + '@rollup/rollup-darwin-arm64@4.27.4': + resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.24.0': - resolution: {integrity: sha512-X6/nOwoFN7RT2svEQWUsW/5C/fYMBe4fnLK9DQk4SX4mgVBiTA9h64kjUYPvGQ0F/9xwJ5U5UfTbl6BEjaQdBQ==} + '@rollup/rollup-darwin-x64@4.27.4': + resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} cpu: [x64] os: [darwin] - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': - resolution: {integrity: sha512-0KXvIJQMOImLCVCz9uvvdPgfyWo93aHHp8ui3FrtOP57svqrF/roSSR5pjqL2hcMp0ljeGlU4q9o/rQaAQ3AYA==} + '@rollup/rollup-freebsd-arm64@4.27.4': + resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + cpu: [arm64] + os: [freebsd] + + '@rollup/rollup-freebsd-x64@4.27.4': + resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + cpu: [x64] + os: [freebsd] + + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.24.0': - resolution: {integrity: sha512-it2BW6kKFVh8xk/BnHfakEeoLPv8STIISekpoF+nBgWM4d55CZKc7T4Dx1pEbTnYm/xEKMgy1MNtYuoA8RFIWw==} + '@rollup/rollup-linux-arm-musleabihf@4.27.4': + resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.24.0': - resolution: {integrity: sha512-i0xTLXjqap2eRfulFVlSnM5dEbTVque/3Pi4g2y7cxrs7+a9De42z4XxKLYJ7+OhE3IgxvfQM7vQc43bwTgPwA==} + '@rollup/rollup-linux-arm64-gnu@4.27.4': + resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.24.0': - resolution: {integrity: sha512-9E6MKUJhDuDh604Qco5yP/3qn3y7SLXYuiC0Rpr89aMScS2UAmK1wHP2b7KAa1nSjWJc/f/Lc0Wl1L47qjiyQw==} + '@rollup/rollup-linux-arm64-musl@4.27.4': + resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': - resolution: {integrity: sha512-2XFFPJ2XMEiF5Zi2EBf4h73oR1V/lycirxZxHZNc93SqDN/IWhYYSYj8I9381ikUFXZrz2v7r2tOVk2NBwxrWw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.24.0': - resolution: {integrity: sha512-M3Dg4hlwuntUCdzU7KjYqbbd+BLq3JMAOhCKdBE3TcMGMZbKkDdJ5ivNdehOssMCIokNHFOsv7DO4rlEOfyKpg==} + '@rollup/rollup-linux-riscv64-gnu@4.27.4': + resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.24.0': - resolution: {integrity: sha512-mjBaoo4ocxJppTorZVKWFpy1bfFj9FeCMJqzlMQGjpNPY9JwQi7OuS1axzNIk0nMX6jSgy6ZURDZ2w0QW6D56g==} + '@rollup/rollup-linux-s390x-gnu@4.27.4': + resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.24.0': - resolution: {integrity: sha512-ZXFk7M72R0YYFN5q13niV0B7G8/5dcQ9JDp8keJSfr3GoZeXEoMHP/HlvqROA3OMbMdfr19IjCeNAnPUG93b6A==} + '@rollup/rollup-linux-x64-gnu@4.27.4': + resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.24.0': - resolution: {integrity: sha512-w1i+L7kAXZNdYl+vFvzSZy8Y1arS7vMgIy8wusXJzRrPyof5LAb02KGr1PD2EkRcl73kHulIID0M501lN+vobQ==} + '@rollup/rollup-linux-x64-musl@4.27.4': + resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.24.0': - resolution: {integrity: sha512-VXBrnPWgBpVDCVY6XF3LEW0pOU51KbaHhccHw6AS6vBWIC60eqsH19DAeeObl+g8nKAz04QFdl/Cefta0xQtUQ==} + '@rollup/rollup-win32-arm64-msvc@4.27.4': + resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.24.0': - resolution: {integrity: sha512-xrNcGDU0OxVcPTH/8n/ShH4UevZxKIO6HJFK0e15XItZP2UcaiLFd5kiX7hJnqCbSztUF8Qot+JWBC/QXRPYWQ==} + '@rollup/rollup-win32-ia32-msvc@4.27.4': + resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.24.0': - resolution: {integrity: sha512-fbMkAF7fufku0N2dE5TBXcNlg0pt0cJue4xBRE2Qc5Vqikxr4VCgKj/ht6SMdFcOacVA9rqF70APJ8RN/4vMJw==} + '@rollup/rollup-win32-x64-msvc@4.27.4': + resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} cpu: [x64] os: [win32] - '@sinclair/typebox@0.27.8': - resolution: {integrity: sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA==} - '@stylistic/eslint-plugin-js@2.1.0': resolution: {integrity: sha512-gdXUjGNSsnY6nPyqxu6lmDTtVrwCOjun4x8PUn0x04d5ucLI74N3MT1Q0UhdcOR9No3bo5PGDyBgXK+KmD787A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -1885,44 +1894,20 @@ packages: typescript: '>= 5' typescript-eslint: '>= 7.5' - '@sveltejs/kit@2.7.3': - resolution: {integrity: sha512-Vx7nq5MJ86I8qXYsVidC5PX6xm+uxt8DydvOdmJoyOK7LvGP18OFEG359yY+aa51t6pENvqZAMqAREQQx1OI2Q==} - engines: {node: '>=18.13'} - hasBin: true - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.3 - - '@sveltejs/vite-plugin-svelte-inspector@2.1.0': - resolution: {integrity: sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==} - engines: {node: ^18.0.0 || >=20} - peerDependencies: - '@sveltejs/vite-plugin-svelte': ^3.0.0 - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 - - '@sveltejs/vite-plugin-svelte-inspector@3.0.1': - resolution: {integrity: sha512-2CKypmj1sM4GE7HjllT7UKmo4Q6L5xFRd7VMGEWhYnZ+wc6AUVU01IBd7yUi6WnFndEwWoMNOd6e8UjoN0nbvQ==} + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': + resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - '@sveltejs/vite-plugin-svelte': ^4.0.0-next.0||^4.0.0 - svelte: ^5.0.0-next.96 || ^5.0.0 - vite: ^5.0.0 - - '@sveltejs/vite-plugin-svelte@3.1.0': - resolution: {integrity: sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==} - engines: {node: ^18.0.0 || >=20} - peerDependencies: - svelte: ^4.0.0 || ^5.0.0-next.0 - vite: ^5.0.0 + '@sveltejs/vite-plugin-svelte': ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 - '@sveltejs/vite-plugin-svelte@4.0.0': - resolution: {integrity: sha512-kpVJwF+gNiMEsoHaw+FJL76IYiwBikkxYU83+BpqQLdVMff19KeRKLd2wisS8niNBMJ2omv5gG+iGDDwd8jzag==} + '@sveltejs/vite-plugin-svelte@5.0.1': + resolution: {integrity: sha512-D5l5+STmywGoLST07T9mrqqFFU+xgv5fqyTWM+VbxTvQ6jujNn4h3lQNCvlwVYs4Erov8i0K5Rwr3LQtmBYmBw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} peerDependencies: - svelte: ^5.0.0-next.96 || ^5.0.0 - vite: ^5.0.0 + svelte: ^5.0.0 + vite: ^6.0.0 '@svitejs/changesets-changelog-github-compact@1.1.0': resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==} @@ -2026,20 +2011,34 @@ packages: engines: {node: '>=16'} hasBin: true - '@vitest/expect@2.0.1': - resolution: {integrity: sha512-yw70WL3ZwzbI2O3MOXYP2Shf4vqVkS3q5FckLJ6lhT9VMMtDyWdofD53COZcoeuHwsBymdOZp99r5bOr5g+oeA==} + '@vitest/expect@2.1.6': + resolution: {integrity: sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==} - '@vitest/runner@2.0.1': - resolution: {integrity: sha512-XfcSXOGGxgR2dQ466ZYqf0ZtDLLDx9mZeQcKjQDLQ9y6Cmk2Wl7wxMuhiYK4Fo1VxCtLcFEGW2XpcfMuiD1Maw==} + '@vitest/mocker@2.1.6': + resolution: {integrity: sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==} + peerDependencies: + msw: ^2.4.9 + vite: ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + msw: + optional: true + vite: + optional: true + + '@vitest/pretty-format@2.1.6': + resolution: {integrity: sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==} + + '@vitest/runner@2.1.6': + resolution: {integrity: sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==} - '@vitest/snapshot@2.0.1': - resolution: {integrity: sha512-rst79a4Q+J5vrvHRapdfK4BdqpMH0eF58jVY1vYeBo/1be+nkyenGI5SCSohmjf6MkCkI20/yo5oG+0R8qrAnA==} + '@vitest/snapshot@2.1.6': + resolution: {integrity: sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==} - '@vitest/spy@2.0.1': - resolution: {integrity: sha512-NLkdxbSefAtJN56GtCNcB4GiHFb5i9q1uh4V229lrlTZt2fnwsTyjLuWIli1xwK2fQspJJmHXHyWx0Of3KTXWA==} + '@vitest/spy@2.1.6': + resolution: {integrity: sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==} - '@vitest/utils@2.0.1': - resolution: {integrity: sha512-STH+2fHZxlveh1mpU4tKzNgRk7RZJyr6kFGJYCI5vocdfqfPsQrgVC6k7dBWHfin5QNB4TLvRS0Ckly3Dt1uWw==} + '@vitest/utils@2.1.6': + resolution: {integrity: sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==} abbrev@1.1.1: resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} @@ -2063,8 +2062,8 @@ packages: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} - acorn@8.12.1: - resolution: {integrity: sha512-tcpGyI9zbizT9JbV6oYE477V6mTlXvvi0T0G3SNIYE2apm/G5huBa1+K89VGeovbg+jycCrfhl3ADxErOuO6Jg==} + acorn@8.14.0: + resolution: {integrity: sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==} engines: {node: '>=0.4.0'} hasBin: true @@ -2087,10 +2086,6 @@ packages: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} - ansi-styles@5.2.0: - resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} - engines: {node: '>=10'} - anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} @@ -2169,8 +2164,8 @@ packages: capnp-ts@0.7.0: resolution: {integrity: sha512-XKxXAC3HVPv7r674zP0VC3RTXz+/JKhfyw94ljvF80yynK6VkTnqE3jMuN8b3dUVmmc43TjyxjW4KTsmB3c86g==} - chai@5.1.1: - resolution: {integrity: sha512-pT1ZgP8rPNqUgieVaEY+ryQr6Q4HXNg8Ei9UnLUrjN4IA7dvQC5JB+/kxVcPNDHyBcc/26CXPkbNzq3qwrOEKA==} + chai@5.1.2: + resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} engines: {node: '>=12'} chalk@4.1.2: @@ -2200,9 +2195,6 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} - code-red@1.0.4: - resolution: {integrity: sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==} - color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2225,7 +2217,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} @@ -2258,10 +2250,6 @@ packages: resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} engines: {node: '>= 8'} - css-tree@2.3.1: - resolution: {integrity: sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==} - engines: {node: ^10 || ^12.20.0 || ^14.13.0 || >=15.0.0} - cssesc@3.0.0: resolution: {integrity: sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==} engines: {node: '>=4'} @@ -2276,15 +2264,6 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - debug@4.3.5: - resolution: {integrity: sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==} - engines: {node: '>=6.0'} - peerDependencies: - supports-color: '*' - peerDependenciesMeta: - supports-color: - optional: true - debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -2334,10 +2313,6 @@ packages: devalue@5.1.0: resolution: {integrity: sha512-N1MxQrdI1KmHTVfiGzEi6J2rEtrGZU1f2CELFpqjqlBwl/KgQDjPpszqySb4W3+w3YWwjt2++OExkh2r6O2VPA==} - diff-sequences@29.6.3: - resolution: {integrity: sha512-EjePK1srD3P08o2j4f0ExnylqRs5B9tJjcp9t1krH2qRi8CCdsYfwe9JgSLurFBWwq4uOlipzfk5fHNvwFKr8Q==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - diff@5.2.0: resolution: {integrity: sha512-uIFDxqpRZGZ6ThOk84hEfqWoHx2devRFvpTZcTHur85vImfaxUbTW9Ryh4CpCuDnToOP1CEtXKIgytHBPVff5A==} engines: {node: '>=0.3.1'} @@ -2353,11 +2328,11 @@ packages: dropcss@1.0.16: resolution: {integrity: sha512-QgA6BUh2SoBYE/dSuMmeGhNdoGtGewt3Rn66xKyXoGNyjrKRXf163wuM+xeQ83p87l/3ALoB6Il1dgKyGS5pEw==} - dts-buddy@0.5.3: - resolution: {integrity: sha512-wS2DC5T+F6R+sG/YNlJ21yn8CKVhy1QQlpKA34G+uO4PUXkwz+JQWbGcIryUByxoJgbH98O0dTGzE2RqsRR3KA==} + dts-buddy@0.5.4: + resolution: {integrity: sha512-a3jJYbMXK98aJvhdV/v+tEKTTEJXXWtMjrl5L8jJL7rnZzGtPA6JNHJZ5//NVRw4JiB5T10Ie5T7h/QsP3aaYw==} hasBin: true peerDependencies: - typescript: '>=5.0.4 <5.6' + typescript: '>=5.0.4 <5.8' e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: resolution: {directory: packages/kit/test/apps/dev-only/_test_dependencies/cjs-only, type: directory} @@ -2373,14 +2348,17 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} + es-module-lexer@1.5.4: + resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true - esbuild@0.21.5: - resolution: {integrity: sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==} - engines: {node: '>=12'} + esbuild@0.24.0: + resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + engines: {node: '>=18'} hasBin: true escape-string-regexp@4.0.0: @@ -2433,8 +2411,8 @@ packages: resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - eslint-visitor-keys@4.1.0: - resolution: {integrity: sha512-Q7lok0mqMUSf5a/AdAZkA5a/gHcO6snwQClVNNvFKCAVlxXucdU8pKydU5ZVZjBx5xr37vGbFFWtLQYreLzrZg==} + eslint-visitor-keys@4.2.0: + resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint@9.6.0: @@ -2442,11 +2420,11 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true - esm-env@1.0.0: - resolution: {integrity: sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==} + esm-env@1.2.1: + resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} - espree@10.2.0: - resolution: {integrity: sha512-upbkBJbckcCNBDBDXEbuhjbP68n+scUd3k/U2EkyM9nw+I/jPiL4cLF/Al06CF96wRltFda16sxDFrxsI1v0/g==} + espree@10.3.0: + resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} espree@9.6.1: @@ -2486,14 +2464,14 @@ packages: resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} engines: {node: '>=0.10.0'} - execa@8.0.1: - resolution: {integrity: sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==} - engines: {node: '>=16.17'} - exit-hook@2.2.1: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} + expect-type@1.1.0: + resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + engines: {node: '>=12.0.0'} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2517,14 +2495,6 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.3.0: - resolution: {integrity: sha512-QOnuT+BOtivR77wYvCWHfGt9s4Pz1VIMbD463vegT5MLqNXy8rYFT/lPVEqf/bhYeT6qmqrNHhsX+rWwe3rOCQ==} - peerDependencies: - picomatch: ^3 || ^4 - peerDependenciesMeta: - picomatch: - optional: true - fdir@6.4.0: resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} peerDependencies: @@ -2592,9 +2562,6 @@ packages: engines: {node: '>=10'} deprecated: This package is no longer supported. - get-func-name@2.0.2: - resolution: {integrity: sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==} - get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -2602,10 +2569,6 @@ packages: get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - get-stream@8.0.1: - resolution: {integrity: sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==} - engines: {node: '>=16'} - get-tsconfig@4.8.1: resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} @@ -2633,12 +2596,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.10.0: - resolution: {integrity: sha512-tqFIbz83w4Y5TCbtgjZjApohbuh7K9BxGYFm7ifwDR240tvdb7P9x+/9VvUKlmkPoiknoJtanI8UOrqxS3a7lQ==} - engines: {node: '>=18'} - - globals@15.11.0: - resolution: {integrity: sha512-yeyNSjdbyVaWurlwCpcA6XNBrHTMIeDdj0/hnvX/OLJ9ekOXYbLsLinH/MucQyGvNnXhidTdNhTtJaffL2sMfw==} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -2675,10 +2634,6 @@ packages: human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} - human-signals@5.0.0: - resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} - engines: {node: '>=16.17.0'} - iconv-lite@0.4.24: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} @@ -2749,12 +2704,8 @@ packages: is-reference@1.2.1: resolution: {integrity: sha512-U82MsXXiFIrjCK4otLT+o2NA2Cd2g5MLoOVXUZjIOhLurrRxpEXzI8O0KZHr3IjLvlAH1kTPYSuqer5T9ZVBKQ==} - is-reference@3.0.2: - resolution: {integrity: sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==} - - is-stream@3.0.0: - resolution: {integrity: sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} + is-reference@3.0.3: + resolution: {integrity: sha512-ixkJoqQvAP88E6wLydLGGqCJsrFUnqoH6HnaczB8XmDH1oaWU+xxdptvikTgaEhtZ53Ky6YXiBuUI2WXLMCwjw==} is-subdir@1.2.0: resolution: {integrity: sha512-2AT6j+gXe/1ueqbW6fLZJiIw3F8iXGJtt0yDrZaBhAZEG1raiTxKWU+IPqMCzQAXOUCKdA4UDMgacKH25XG2Cw==} @@ -2884,8 +2835,8 @@ packages: lodash.startcase@4.4.0: resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} - loupe@3.1.1: - resolution: {integrity: sha512-edNu/8D5MKVfGVFRhFf8aAxiTM6Wumfz5XsaatSxlD3w4R1d/WEKUTydCdPGbl9K7QG/Ca3GnDV2sIKIpXRQcw==} + loupe@3.1.2: + resolution: {integrity: sha512-23I4pFZHmAemUnz8WZXbYRSKYj801VDaNv9ETuMh7IrMc7VuVVSo+Z9iLE3ni30+U48iDWfi30d3twAXBYmnCg==} lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} @@ -2896,22 +2847,13 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.11: - resolution: {integrity: sha512-+Wri9p0QHMy+545hKww7YAu5NyzF8iomPL/RQazugQ9+Ez4Ic3mERMd8ZTX5rfK944j+560ZJi8iAwgak1Ac7A==} - - magic-string@0.30.12: - resolution: {integrity: sha512-Ea8I3sQMVXr8JhN4z+H/d8zwo+tYDgHE9+5G4Wnrwhs0gaK9fXTKx0Tw5Xwsd/bCPTTZNRAdpyzvoeORe9LYpw==} + magic-string@0.30.14: + resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} make-dir@3.1.0: resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} engines: {node: '>=8'} - mdn-data@2.0.30: - resolution: {integrity: sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==} - - merge-stream@2.0.0: - resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2925,10 +2867,6 @@ packages: engines: {node: '>=10.0.0'} hasBin: true - mimic-fn@4.0.0: - resolution: {integrity: sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==} - engines: {node: '>=12'} - min-indent@1.0.1: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} @@ -2974,9 +2912,6 @@ packages: resolution: {integrity: sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==} engines: {node: '>=10'} - ms@2.1.2: - resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} - ms@2.1.3: resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} @@ -3037,10 +2972,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true - npm-run-path@5.3.0: - resolution: {integrity: sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==} - engines: {node: ^12.20.0 || ^14.13.1 || >=16.0.0} - npmlog@5.0.1: resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} deprecated: This package is no longer supported. @@ -3052,10 +2983,6 @@ packages: once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} - onetime@6.0.0: - resolution: {integrity: sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==} - engines: {node: '>=12'} - optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} engines: {node: '>= 0.8.0'} @@ -3117,10 +3044,6 @@ packages: resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} engines: {node: '>=8'} - path-key@4.0.0: - resolution: {integrity: sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==} - engines: {node: '>=12'} - path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} @@ -3138,11 +3061,8 @@ packages: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} - periscopic@3.1.0: - resolution: {integrity: sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==} - - picocolors@1.1.0: - resolution: {integrity: sha512-TQ92mBOW0l3LeMeyLV6mzy/kWr8lkd/hp3mTg7wYK7zJhuBStmGMBG0BdeDZS/dZx1IukaX6Bk11zcln25o1Aw==} + picocolors@1.1.1: + resolution: {integrity: sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==} picomatch@2.3.1: resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} @@ -3198,20 +3118,14 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.47: - resolution: {integrity: sha512-56rxCq7G/XfB4EkXq9Egn5GCqugWvDFjafDOThIdMBsI15iqPqR5r15TfSr1YPYeEI19YeaXMCbY6u88Y76GLQ==} + postcss@8.4.49: + resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} engines: {node: '>= 0.8.0'} - prettier-plugin-svelte@3.1.2: - resolution: {integrity: sha512-7xfMZtwgAWHMT0iZc8jN4o65zgbAQ3+O32V6W7pXrqNvKnHnkoyQCGCbKeUyXKZLbYE0YhFRnamfxfkEGxm8qA==} - peerDependencies: - prettier: ^3.0.0 - svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 - prettier-plugin-svelte@3.2.7: resolution: {integrity: sha512-/Dswx/ea0lV34If1eDcG3nulQ63YNr5KPDfMsjbdtpSWOxKKJ7nAc2qlVuYwEvCr4raIuredNoR7K4JCkmTGaQ==} peerDependencies: @@ -3223,20 +3137,11 @@ packages: engines: {node: '>=10.13.0'} hasBin: true - prettier@3.1.1: - resolution: {integrity: sha512-22UbSzg8luF4UuZtzgiUOfcGM8s4tjBv6dJRT7j275NXsy2jb4aJa4NNveul5x4eqlF1wuhuR2RElK71RvmVaw==} - engines: {node: '>=14'} - hasBin: true - prettier@3.3.3: resolution: {integrity: sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==} engines: {node: '>=14'} hasBin: true - pretty-format@29.7.0: - resolution: {integrity: sha512-Pdlw/oPxN+aXdmM9R00JVC9WVFoCLTKJvDVLgmJ+qAffBMxsV85l/Lu7sNx4zSzPyoL2euImuEwHhOXdEgNFZQ==} - engines: {node: ^14.15.0 || ^16.10.0 || >=18.0.0} - printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} @@ -3255,9 +3160,6 @@ packages: queue-microtask@1.2.3: resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} - react-is@18.3.1: - resolution: {integrity: sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==} - read-yaml-file@1.1.0: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} @@ -3319,8 +3221,8 @@ packages: rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.24.0: - resolution: {integrity: sha512-DOmrlGSXNk1DM0ljiQA+i+o0rSLhtii1je5wgk60j49d1jHT5YYttBv1iWOnYSTG+fZZESUOSNiAl89SIet+Cg==} + rollup@4.27.4: + resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3386,10 +3288,6 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: - resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} - engines: {node: '>=14'} - simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3430,8 +3328,8 @@ packages: stacktracey@2.1.8: resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - std-env@3.7.0: - resolution: {integrity: sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==} + std-env@3.8.0: + resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} @@ -3452,10 +3350,6 @@ packages: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} - strip-final-newline@3.0.0: - resolution: {integrity: sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==} - engines: {node: '>=12'} - strip-indent@3.0.0: resolution: {integrity: sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==} engines: {node: '>=8'} @@ -3489,12 +3383,6 @@ packages: svelte: optional: true - svelte-hmr@0.16.0: - resolution: {integrity: sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==} - engines: {node: ^12.20 || ^14.13.1 || >= 16} - peerDependencies: - svelte: ^3.19.0 || ^4.0.0 - svelte-parse-markup@0.1.5: resolution: {integrity: sha512-T6mqZrySltPCDwfKXWQ6zehipVLk4GWfH1zCMGgRtLlOIFPuw58ZxVYxVvotMJgJaurKi1i14viB2GIRKXeJTQ==} peerDependencies: @@ -3543,12 +3431,8 @@ packages: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@4.2.19: - resolution: {integrity: sha512-IY1rnGr6izd10B0A8LqsBfmlT5OILVuZ7XsI0vdGPEvuonFV7NYEUK4dAkm9Zg2q0Um92kYjTpS1CAP3Nh/KWw==} - engines: {node: '>=16'} - - svelte@5.1.13: - resolution: {integrity: sha512-xVNk8yLsZNfkyqWzVg8+nfU9ewiSjVW0S4qyTxfKa6Y7P5ZBhA+LDsh2cHWIXJQMltikQAk6W3sqGdQZSH58PA==} + svelte@5.2.9: + resolution: {integrity: sha512-LjO7R6K8FI8dA3l+4CcsbJ3djIe2TtokHGzfpDTro5g8nworMbTz9alCR95EQXGsqlzIAvqJtZ7Yy0o33lL09Q==} engines: {node: '>=18'} tapable@2.2.1: @@ -3569,19 +3453,26 @@ packages: tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - tinybench@2.8.0: - resolution: {integrity: sha512-1/eK7zUnIklz4JUUlL+658n58XO2hHLQfSk1Zf2LKieUjxidN16eKFEoDEfjHc3ohofSSqK3X5yO6VGb6iW8Lw==} + tinybench@2.9.0: + resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} tinydate@1.3.0: resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} engines: {node: '>=4'} - tinypool@1.0.0: - resolution: {integrity: sha512-KIKExllK7jp3uvrNtvRBYBWBOAXSX8ZvoaD8T+7KB/QHIuoJW3Pmr60zucywjAlMb5TeXUkcs/MWeWLu0qvuAQ==} + tinyexec@0.3.1: + resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + + tinypool@1.0.2: + resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} - tinyspy@3.0.0: - resolution: {integrity: sha512-q5nmENpTHgiPVd1cJDDc9cVoYN5x4vCvwT3FMilvKPKneCBZAxn2YWQjDF0UMcE9k0Cay1gBiDfTMU0g+mPMQA==} + tinyrainbow@1.2.0: + resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + engines: {node: '>=14.0.0'} + + tinyspy@3.0.2: + resolution: {integrity: sha512-n1cw8k1k0x4pgA2+9XrOkFydTerNcJ1zWCO5Nn9scWHTD+5tp8dghT2x1uduQePZTZgd3Tupf+x9BxJjeJi77Q==} engines: {node: '>=14.0.0'} tmp@0.0.33: @@ -3625,11 +3516,6 @@ packages: typescript: optional: true - typescript@5.4.5: - resolution: {integrity: sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==} - engines: {node: '>=14.17'} - hasBin: true - typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} engines: {node: '>=14.17'} @@ -3670,55 +3556,32 @@ packages: resolution: {integrity: sha512-23jnLhkTH0HR9Vd9LxMYnajOLeo0RJNEAHhtlsQP6kfPuOBoTzt54rWbEWB9jmhEXAOflLQpM+FrmilVPAoyGA==} engines: {node: '>=18.0.0'} - vite-node@2.0.1: - resolution: {integrity: sha512-nVd6kyhPAql0s+xIVJzuF+RSRH8ZimNrm6U8ZvTA4MXv8CHI17TFaQwRaFiK75YX6XeFqZD4IoAaAfi9OR1XvQ==} - engines: {node: ^18.0.0 || >=20.0.0} + vite-node@2.1.6: + resolution: {integrity: sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@5.3.6: - resolution: {integrity: sha512-es78AlrylO8mTVBygC0gTC0FENv0C6T496vvd33ydbjF/mIi9q3XQ9A3NWo5qLGFKywvz10J26813OkLvcQleA==} - engines: {node: ^18.0.0 || >=20.0.0} - hasBin: true - peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 - less: '*' - lightningcss: ^1.21.0 - sass: '*' - stylus: '*' - sugarss: '*' - terser: ^5.4.0 - peerDependenciesMeta: - '@types/node': - optional: true - less: - optional: true - lightningcss: - optional: true - sass: - optional: true - stylus: - optional: true - sugarss: - optional: true - terser: - optional: true - - vite@5.4.10: - resolution: {integrity: sha512-1hvaPshuPUtxeQ0hsVH3Mud0ZanOLwVTneA1EgbAM5LhaZEqyPWGRQ7BtaMvUrTDeEaC8pxtj6a6jku3x4z6SQ==} - engines: {node: ^18.0.0 || >=20.0.0} + vite@6.0.1: + resolution: {integrity: sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: - '@types/node': ^18.0.0 || >=20.0.0 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + jiti: '>=1.21.0' less: '*' lightningcss: ^1.21.0 sass: '*' sass-embedded: '*' stylus: '*' sugarss: '*' - terser: ^5.4.0 + terser: ^5.16.0 + tsx: ^4.8.1 + yaml: ^2.4.2 peerDependenciesMeta: '@types/node': optional: true + jiti: + optional: true less: optional: true lightningcss: @@ -3733,32 +3596,28 @@ packages: optional: true terser: optional: true - - vitefu@0.2.5: - resolution: {integrity: sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 - peerDependenciesMeta: - vite: + tsx: + optional: true + yaml: optional: true - vitefu@1.0.3: - resolution: {integrity: sha512-iKKfOMBHob2WxEJbqbJjHAkmYgvFDPhuqrO82om83S8RLk+17FtyMBfcyeH8GqD0ihShtkMW/zzJgiA51hCNCQ==} + vitefu@1.0.4: + resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0-beta.0 + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 peerDependenciesMeta: vite: optional: true - vitest@2.0.1: - resolution: {integrity: sha512-PBPvNXRJiywtI9NmbnEqHIhcXlk8mB0aKf6REQIaYGY4JtWF1Pg8Am+N0vAuxdg/wUSlxPSVJr8QdjwcVxc2Hg==} - engines: {node: ^18.0.0 || >=20.0.0} + vitest@2.1.6: + resolution: {integrity: sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' - '@types/node': ^18.0.0 || >=20.0.0 - '@vitest/browser': 2.0.1 - '@vitest/ui': 2.0.1 + '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 + '@vitest/browser': 2.1.6 + '@vitest/ui': 2.1.6 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3927,7 +3786,7 @@ snapshots: outdent: 0.5.0 p-limit: 2.3.0 package-manager-detector: 0.2.0 - picocolors: 1.1.0 + picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.3 spawndamnit: 2.0.0 @@ -3951,7 +3810,7 @@ snapshots: dependencies: '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 - picocolors: 1.1.0 + picocolors: 1.1.1 semver: 7.6.3 '@changesets/get-github-info@0.5.2': @@ -3982,7 +3841,7 @@ snapshots: '@changesets/logger@0.1.1': dependencies: - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/parse@0.4.0': dependencies: @@ -4004,7 +3863,7 @@ snapshots: '@changesets/types': 6.0.0 fs-extra: 7.0.1 p-filter: 2.1.0 - picocolors: 1.1.0 + picocolors: 1.1.1 '@changesets/should-skip-package@0.1.1': dependencies: @@ -4062,152 +3921,155 @@ snapshots: escape-string-regexp: 4.0.0 rollup-plugin-node-polyfills: 0.2.1 - '@esbuild/aix-ppc64@0.21.5': + '@esbuild/aix-ppc64@0.24.0': optional: true '@esbuild/android-arm64@0.17.19': optional: true - '@esbuild/android-arm64@0.21.5': + '@esbuild/android-arm64@0.24.0': optional: true '@esbuild/android-arm@0.17.19': optional: true - '@esbuild/android-arm@0.21.5': + '@esbuild/android-arm@0.24.0': optional: true '@esbuild/android-x64@0.17.19': optional: true - '@esbuild/android-x64@0.21.5': + '@esbuild/android-x64@0.24.0': optional: true '@esbuild/darwin-arm64@0.17.19': optional: true - '@esbuild/darwin-arm64@0.21.5': + '@esbuild/darwin-arm64@0.24.0': optional: true '@esbuild/darwin-x64@0.17.19': optional: true - '@esbuild/darwin-x64@0.21.5': + '@esbuild/darwin-x64@0.24.0': optional: true '@esbuild/freebsd-arm64@0.17.19': optional: true - '@esbuild/freebsd-arm64@0.21.5': + '@esbuild/freebsd-arm64@0.24.0': optional: true '@esbuild/freebsd-x64@0.17.19': optional: true - '@esbuild/freebsd-x64@0.21.5': + '@esbuild/freebsd-x64@0.24.0': optional: true '@esbuild/linux-arm64@0.17.19': optional: true - '@esbuild/linux-arm64@0.21.5': + '@esbuild/linux-arm64@0.24.0': optional: true '@esbuild/linux-arm@0.17.19': optional: true - '@esbuild/linux-arm@0.21.5': + '@esbuild/linux-arm@0.24.0': optional: true '@esbuild/linux-ia32@0.17.19': optional: true - '@esbuild/linux-ia32@0.21.5': + '@esbuild/linux-ia32@0.24.0': optional: true '@esbuild/linux-loong64@0.17.19': optional: true - '@esbuild/linux-loong64@0.21.5': + '@esbuild/linux-loong64@0.24.0': optional: true '@esbuild/linux-mips64el@0.17.19': optional: true - '@esbuild/linux-mips64el@0.21.5': + '@esbuild/linux-mips64el@0.24.0': optional: true '@esbuild/linux-ppc64@0.17.19': optional: true - '@esbuild/linux-ppc64@0.21.5': + '@esbuild/linux-ppc64@0.24.0': optional: true '@esbuild/linux-riscv64@0.17.19': optional: true - '@esbuild/linux-riscv64@0.21.5': + '@esbuild/linux-riscv64@0.24.0': optional: true '@esbuild/linux-s390x@0.17.19': optional: true - '@esbuild/linux-s390x@0.21.5': + '@esbuild/linux-s390x@0.24.0': optional: true '@esbuild/linux-x64@0.17.19': optional: true - '@esbuild/linux-x64@0.21.5': + '@esbuild/linux-x64@0.24.0': optional: true '@esbuild/netbsd-x64@0.17.19': optional: true - '@esbuild/netbsd-x64@0.21.5': + '@esbuild/netbsd-x64@0.24.0': + optional: true + + '@esbuild/openbsd-arm64@0.24.0': optional: true '@esbuild/openbsd-x64@0.17.19': optional: true - '@esbuild/openbsd-x64@0.21.5': + '@esbuild/openbsd-x64@0.24.0': optional: true '@esbuild/sunos-x64@0.17.19': optional: true - '@esbuild/sunos-x64@0.21.5': + '@esbuild/sunos-x64@0.24.0': optional: true '@esbuild/win32-arm64@0.17.19': optional: true - '@esbuild/win32-arm64@0.21.5': + '@esbuild/win32-arm64@0.24.0': optional: true '@esbuild/win32-ia32@0.17.19': optional: true - '@esbuild/win32-ia32@0.21.5': + '@esbuild/win32-ia32@0.24.0': optional: true '@esbuild/win32-x64@0.17.19': optional: true - '@esbuild/win32-x64@0.21.5': + '@esbuild/win32-x64@0.24.0': optional: true - '@eslint-community/eslint-utils@4.4.0(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.4.1(eslint@9.6.0)': dependencies: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/regexpp@4.11.1': {} + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.17.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.5 + debug: 4.3.7 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4215,8 +4077,8 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.5 - espree: 10.2.0 + debug: 4.3.7 + espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -4313,10 +4175,6 @@ snapshots: '@img/sharp-win32-x64@0.33.3': optional: true - '@jest/schemas@29.6.3': - dependencies: - '@sinclair/typebox': 0.27.8 - '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -4404,222 +4262,139 @@ snapshots: '@polka/url@1.0.0-next.28': {} - '@rollup/plugin-commonjs@28.0.1(rollup@4.24.0)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.24.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.0(picomatch@4.0.2) is-reference: 1.2.1 - magic-string: 0.30.11 + magic-string: 0.30.14 picomatch: 4.0.2 optionalDependencies: - rollup: 4.24.0 + rollup: 4.27.4 - '@rollup/plugin-json@6.1.0(rollup@4.24.0)': + '@rollup/plugin-json@6.1.0(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.24.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) optionalDependencies: - rollup: 4.24.0 + rollup: 4.27.4 - '@rollup/plugin-node-resolve@15.3.0(rollup@4.24.0)': + '@rollup/plugin-node-resolve@15.3.0(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.24.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.24.0 + rollup: 4.27.4 '@rollup/pluginutils@4.2.1': dependencies: estree-walker: 2.0.2 picomatch: 2.3.1 - '@rollup/pluginutils@5.1.0(rollup@4.24.0)': + '@rollup/pluginutils@5.1.0(rollup@4.27.4)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 2.3.1 optionalDependencies: - rollup: 4.24.0 + rollup: 4.27.4 - '@rollup/rollup-android-arm-eabi@4.24.0': + '@rollup/rollup-android-arm-eabi@4.27.4': optional: true - '@rollup/rollup-android-arm64@4.24.0': + '@rollup/rollup-android-arm64@4.27.4': optional: true - '@rollup/rollup-darwin-arm64@4.24.0': + '@rollup/rollup-darwin-arm64@4.27.4': optional: true - '@rollup/rollup-darwin-x64@4.24.0': + '@rollup/rollup-darwin-x64@4.27.4': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.24.0': + '@rollup/rollup-freebsd-arm64@4.27.4': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.24.0': + '@rollup/rollup-freebsd-x64@4.27.4': optional: true - '@rollup/rollup-linux-arm64-gnu@4.24.0': + '@rollup/rollup-linux-arm-gnueabihf@4.27.4': optional: true - '@rollup/rollup-linux-arm64-musl@4.24.0': + '@rollup/rollup-linux-arm-musleabihf@4.27.4': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.24.0': + '@rollup/rollup-linux-arm64-gnu@4.27.4': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.24.0': + '@rollup/rollup-linux-arm64-musl@4.27.4': optional: true - '@rollup/rollup-linux-s390x-gnu@4.24.0': + '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': optional: true - '@rollup/rollup-linux-x64-gnu@4.24.0': + '@rollup/rollup-linux-riscv64-gnu@4.27.4': optional: true - '@rollup/rollup-linux-x64-musl@4.24.0': + '@rollup/rollup-linux-s390x-gnu@4.27.4': optional: true - '@rollup/rollup-win32-arm64-msvc@4.24.0': + '@rollup/rollup-linux-x64-gnu@4.27.4': optional: true - '@rollup/rollup-win32-ia32-msvc@4.24.0': + '@rollup/rollup-linux-x64-musl@4.27.4': optional: true - '@rollup/rollup-win32-x64-msvc@4.24.0': + '@rollup/rollup-win32-arm64-msvc@4.27.4': optional: true - '@sinclair/typebox@0.27.8': {} + '@rollup/rollup-win32-ia32-msvc@4.27.4': + optional: true + + '@rollup/rollup-win32-x64-msvc@4.27.4': + optional: true '@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0)': dependencies: '@types/eslint': 8.56.12 - acorn: 8.12.1 + acorn: 8.14.0 eslint: 9.6.0 - eslint-visitor-keys: 4.1.0 - espree: 10.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 - '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.13))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': + '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': dependencies: '@stylistic/eslint-plugin-js': 2.1.0(eslint@9.6.0) eslint: 9.6.0 eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.9.0(eslint@9.6.0) - eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.1.13) - globals: 15.10.0 + eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.2.9) + globals: 15.12.0 typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/kit@2.7.3(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) - '@types/cookie': 0.6.0 - cookie: 0.6.0 - devalue: 5.1.0 - esm-env: 1.0.0 - import-meta-resolve: 4.1.0 - kleur: 4.1.5 - magic-string: 0.30.11 - mrmime: 2.0.0 - sade: 1.8.1 - set-cookie-parser: 2.6.0 - sirv: 3.0.0 - svelte: 5.1.13 - tiny-glob: 0.2.9 - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.5 - svelte: 4.2.19 - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.5 - svelte: 4.2.19 - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte-inspector@2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte': 3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.5 - svelte: 5.1.13 - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte-inspector@3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.3.7 - svelte: 5.1.13 - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + svelte: 5.2.9 + vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.5 - deepmerge: 4.3.1 - kleur: 4.1.5 - magic-string: 0.30.11 - svelte: 4.2.19 - svelte-hmr: 0.16.0(svelte@4.2.19) - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 0.2.5(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@4.2.19)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.5 - deepmerge: 4.3.1 - kleur: 4.1.5 - magic-string: 0.30.11 - svelte: 4.2.19 - svelte-hmr: 0.16.0(svelte@4.2.19) - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 0.2.5(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 2.1.0(@sveltejs/vite-plugin-svelte@3.1.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.5 - deepmerge: 4.3.1 - kleur: 4.1.5 - magic-string: 0.30.11 - svelte: 5.1.13 - svelte-hmr: 0.16.0(svelte@5.1.13) - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 0.2.5(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 3.0.1(@sveltejs/vite-plugin-svelte@4.0.0(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.1.13)(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.3.7 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.12 - svelte: 5.1.13 - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 1.0.3(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)) + magic-string: 0.30.14 + svelte: 5.2.9 + vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.4(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) transitivePeerDependencies: - supports-color @@ -4669,7 +4444,7 @@ snapshots: '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/regexpp': 4.12.1 '@typescript-eslint/parser': 8.4.0(eslint@9.6.0)(typescript@5.6.3) '@typescript-eslint/scope-manager': 8.4.0 '@typescript-eslint/type-utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) @@ -4691,7 +4466,7 @@ snapshots: '@typescript-eslint/types': 8.4.0 '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.4.0 - debug: 4.3.5 + debug: 4.3.7 eslint: 9.6.0 optionalDependencies: typescript: 5.6.3 @@ -4707,7 +4482,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) - debug: 4.3.5 + debug: 4.3.7 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -4721,7 +4496,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.4.0 '@typescript-eslint/visitor-keys': 8.4.0 - debug: 4.3.5 + debug: 4.3.7 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -4734,7 +4509,7 @@ snapshots: '@typescript-eslint/utils@8.4.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) '@typescript-eslint/scope-manager': 8.4.0 '@typescript-eslint/types': 8.4.0 '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) @@ -4752,8 +4527,8 @@ snapshots: dependencies: '@mapbox/node-pre-gyp': 1.0.11 '@rollup/pluginutils': 4.2.1 - acorn: 8.12.1 - acorn-import-attributes: 1.9.5(acorn@8.12.1) + acorn: 8.14.0 + acorn-import-attributes: 1.9.5(acorn@8.14.0) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -4766,55 +4541,67 @@ snapshots: - encoding - supports-color - '@vitest/expect@2.0.1': + '@vitest/expect@2.1.6': dependencies: - '@vitest/spy': 2.0.1 - '@vitest/utils': 2.0.1 - chai: 5.1.1 + '@vitest/spy': 2.1.6 + '@vitest/utils': 2.1.6 + chai: 5.1.2 + tinyrainbow: 1.2.0 - '@vitest/runner@2.0.1': + '@vitest/mocker@2.1.6(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@vitest/utils': 2.0.1 + '@vitest/spy': 2.1.6 + estree-walker: 3.0.3 + magic-string: 0.30.14 + optionalDependencies: + vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + + '@vitest/pretty-format@2.1.6': + dependencies: + tinyrainbow: 1.2.0 + + '@vitest/runner@2.1.6': + dependencies: + '@vitest/utils': 2.1.6 pathe: 1.1.2 - '@vitest/snapshot@2.0.1': + '@vitest/snapshot@2.1.6': dependencies: - magic-string: 0.30.11 + '@vitest/pretty-format': 2.1.6 + magic-string: 0.30.14 pathe: 1.1.2 - pretty-format: 29.7.0 - '@vitest/spy@2.0.1': + '@vitest/spy@2.1.6': dependencies: - tinyspy: 3.0.0 + tinyspy: 3.0.2 - '@vitest/utils@2.0.1': + '@vitest/utils@2.1.6': dependencies: - diff-sequences: 29.6.3 - estree-walker: 3.0.3 - loupe: 3.1.1 - pretty-format: 29.7.0 + '@vitest/pretty-format': 2.1.6 + loupe: 3.1.2 + tinyrainbow: 1.2.0 abbrev@1.1.1: {} - acorn-import-attributes@1.9.5(acorn@8.12.1): + acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 - acorn-jsx@5.3.2(acorn@8.12.1): + acorn-jsx@5.3.2(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 - acorn-typescript@1.4.13(acorn@8.12.1): + acorn-typescript@1.4.13(acorn@8.14.0): dependencies: - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk@8.3.2: {} - acorn@8.12.1: {} + acorn@8.14.0: {} agent-base@6.0.2: dependencies: - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -4833,8 +4620,6 @@ snapshots: dependencies: color-convert: 2.0.1 - ansi-styles@5.2.0: {} - anymatch@3.1.3: dependencies: normalize-path: 3.0.0 @@ -4900,17 +4685,17 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.5 + debug: 4.3.7 tslib: 2.6.2 transitivePeerDependencies: - supports-color - chai@5.1.1: + chai@5.1.2: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 deep-eql: 5.0.2 - loupe: 3.1.1 + loupe: 3.1.2 pathval: 2.0.0 chalk@4.1.2: @@ -4942,14 +4727,6 @@ snapshots: ci-info@3.9.0: {} - code-red@1.0.4: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 - acorn: 8.12.1 - estree-walker: 3.0.3 - periscopic: 3.1.0 - color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -4998,11 +4775,6 @@ snapshots: shebang-command: 2.0.0 which: 2.0.2 - css-tree@2.3.1: - dependencies: - mdn-data: 2.0.30 - source-map-js: 1.2.1 - cssesc@3.0.0: {} data-uri-to-buffer@2.0.2: {} @@ -5011,10 +4783,6 @@ snapshots: date-fns@3.6.0: {} - debug@4.3.5: - dependencies: - ms: 2.1.2 - debug@4.3.7: dependencies: ms: 2.1.3 @@ -5042,8 +4810,6 @@ snapshots: devalue@5.1.0: {} - diff-sequences@29.6.3: {} - diff@5.2.0: {} dir-glob@3.0.1: @@ -5054,18 +4820,18 @@ snapshots: dropcss@1.0.16: {} - dts-buddy@0.5.3(typescript@5.4.5): + dts-buddy@0.5.4(typescript@5.6.3): dependencies: '@jridgewell/source-map': 0.3.6 '@jridgewell/sourcemap-codec': 1.5.0 globrex: 0.1.2 kleur: 4.1.5 locate-character: 3.0.0 - magic-string: 0.30.11 + magic-string: 0.30.14 sade: 1.8.1 tiny-glob: 0.2.9 - ts-api-utils: 1.3.0(typescript@5.4.5) - typescript: 5.4.5 + ts-api-utils: 1.3.0(typescript@5.6.3) + typescript: 5.6.3 e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: {} @@ -5081,6 +4847,8 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 + es-module-lexer@1.5.4: {} + esbuild@0.17.19: optionalDependencies: '@esbuild/android-arm': 0.17.19 @@ -5106,31 +4874,32 @@ snapshots: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - esbuild@0.21.5: + esbuild@0.24.0: optionalDependencies: - '@esbuild/aix-ppc64': 0.21.5 - '@esbuild/android-arm': 0.21.5 - '@esbuild/android-arm64': 0.21.5 - '@esbuild/android-x64': 0.21.5 - '@esbuild/darwin-arm64': 0.21.5 - '@esbuild/darwin-x64': 0.21.5 - '@esbuild/freebsd-arm64': 0.21.5 - '@esbuild/freebsd-x64': 0.21.5 - '@esbuild/linux-arm': 0.21.5 - '@esbuild/linux-arm64': 0.21.5 - '@esbuild/linux-ia32': 0.21.5 - '@esbuild/linux-loong64': 0.21.5 - '@esbuild/linux-mips64el': 0.21.5 - '@esbuild/linux-ppc64': 0.21.5 - '@esbuild/linux-riscv64': 0.21.5 - '@esbuild/linux-s390x': 0.21.5 - '@esbuild/linux-x64': 0.21.5 - '@esbuild/netbsd-x64': 0.21.5 - '@esbuild/openbsd-x64': 0.21.5 - '@esbuild/sunos-x64': 0.21.5 - '@esbuild/win32-arm64': 0.21.5 - '@esbuild/win32-ia32': 0.21.5 - '@esbuild/win32-x64': 0.21.5 + '@esbuild/aix-ppc64': 0.24.0 + '@esbuild/android-arm': 0.24.0 + '@esbuild/android-arm64': 0.24.0 + '@esbuild/android-x64': 0.24.0 + '@esbuild/darwin-arm64': 0.24.0 + '@esbuild/darwin-x64': 0.24.0 + '@esbuild/freebsd-arm64': 0.24.0 + '@esbuild/freebsd-x64': 0.24.0 + '@esbuild/linux-arm': 0.24.0 + '@esbuild/linux-arm64': 0.24.0 + '@esbuild/linux-ia32': 0.24.0 + '@esbuild/linux-loong64': 0.24.0 + '@esbuild/linux-mips64el': 0.24.0 + '@esbuild/linux-ppc64': 0.24.0 + '@esbuild/linux-riscv64': 0.24.0 + '@esbuild/linux-s390x': 0.24.0 + '@esbuild/linux-x64': 0.24.0 + '@esbuild/netbsd-x64': 0.24.0 + '@esbuild/openbsd-arm64': 0.24.0 + '@esbuild/openbsd-x64': 0.24.0 + '@esbuild/sunos-x64': 0.24.0 + '@esbuild/win32-arm64': 0.24.0 + '@esbuild/win32-ia32': 0.24.0 + '@esbuild/win32-x64': 0.24.0 escape-string-regexp@4.0.0: {} @@ -5145,39 +4914,39 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@eslint-community/regexpp': 4.12.1 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) eslint-plugin-n@17.9.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) enhanced-resolve: 5.17.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) get-tsconfig: 4.8.1 - globals: 15.11.0 + globals: 15.12.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 - eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.1.13): + eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9): dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) esutils: 2.0.3 known-css-properties: 0.34.0 - postcss: 8.4.47 - postcss-load-config: 3.1.4(postcss@8.4.47) - postcss-safe-parser: 6.0.0(postcss@8.4.47) + postcss: 8.4.49 + postcss-load-config: 3.1.4(postcss@8.4.49) + postcss-safe-parser: 6.0.0(postcss@8.4.49) postcss-selector-parser: 6.1.2 semver: 7.6.3 - svelte-eslint-parser: 0.39.2(svelte@5.1.13) + svelte-eslint-parser: 0.39.2(svelte@5.2.9) optionalDependencies: - svelte: 5.1.13 + svelte: 5.2.9 transitivePeerDependencies: - ts-node @@ -5193,12 +4962,12 @@ snapshots: eslint-visitor-keys@3.4.3: {} - eslint-visitor-keys@4.1.0: {} + eslint-visitor-keys@4.2.0: {} eslint@9.6.0: dependencies: - '@eslint-community/eslint-utils': 4.4.0(eslint@9.6.0) - '@eslint-community/regexpp': 4.11.1 + '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 '@eslint/js': 9.6.0 @@ -5208,11 +4977,11 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.5 + debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.0.1 - eslint-visitor-keys: 4.1.0 - espree: 10.2.0 + eslint-visitor-keys: 4.2.0 + espree: 10.3.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -5234,18 +5003,18 @@ snapshots: transitivePeerDependencies: - supports-color - esm-env@1.0.0: {} + esm-env@1.2.1: {} - espree@10.2.0: + espree@10.3.0: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) - eslint-visitor-keys: 4.1.0 + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) + eslint-visitor-keys: 4.2.0 espree@9.6.1: dependencies: - acorn: 8.12.1 - acorn-jsx: 5.3.2(acorn@8.12.1) + acorn: 8.14.0 + acorn-jsx: 5.3.2(acorn@8.14.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -5275,20 +5044,10 @@ snapshots: esutils@2.0.3: {} - execa@8.0.1: - dependencies: - cross-spawn: 7.0.3 - get-stream: 8.0.1 - human-signals: 5.0.0 - is-stream: 3.0.0 - merge-stream: 2.0.0 - npm-run-path: 5.3.0 - onetime: 6.0.0 - signal-exit: 4.1.0 - strip-final-newline: 3.0.0 - exit-hook@2.2.1: {} + expect-type@1.1.0: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -5315,10 +5074,6 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.3.0(picomatch@4.0.2): - optionalDependencies: - picomatch: 4.0.2 - fdir@6.4.0(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -5388,8 +5143,6 @@ snapshots: strip-ansi: 6.0.1 wide-align: 1.1.5 - get-func-name@2.0.2: {} - get-port@5.1.1: {} get-source@2.0.12: @@ -5397,8 +5150,6 @@ snapshots: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - get-stream@8.0.1: {} - get-tsconfig@4.8.1: dependencies: resolve-pkg-maps: 1.0.0 @@ -5432,9 +5183,7 @@ snapshots: globals@14.0.0: {} - globals@15.10.0: {} - - globals@15.11.0: {} + globals@15.12.0: {} globalyzer@0.1.0: {} @@ -5464,14 +5213,12 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.3.5 + debug: 4.3.7 transitivePeerDependencies: - supports-color human-id@1.0.2: {} - human-signals@5.0.0: {} - iconv-lite@0.4.24: dependencies: safer-buffer: 2.1.2 @@ -5530,12 +5277,10 @@ snapshots: dependencies: '@types/estree': 1.0.6 - is-reference@3.0.2: + is-reference@3.0.3: dependencies: '@types/estree': 1.0.6 - is-stream@3.0.0: {} - is-subdir@1.2.0: dependencies: better-path-resolve: 1.0.0 @@ -5636,9 +5381,7 @@ snapshots: lodash.startcase@4.4.0: {} - loupe@3.1.1: - dependencies: - get-func-name: 2.0.2 + loupe@3.1.2: {} lower-case@2.0.2: dependencies: @@ -5653,11 +5396,7 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.11: - dependencies: - '@jridgewell/sourcemap-codec': 1.5.0 - - magic-string@0.30.12: + magic-string@0.30.14: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -5665,10 +5404,6 @@ snapshots: dependencies: semver: 6.3.1 - mdn-data@2.0.30: {} - - merge-stream@2.0.0: {} - merge2@1.4.1: {} micromatch@4.0.8: @@ -5678,14 +5413,12 @@ snapshots: mime@3.0.0: {} - mimic-fn@4.0.0: {} - min-indent@1.0.1: {} miniflare@3.20240701.0: dependencies: '@cspotcode/source-map-support': 0.8.1 - acorn: 8.12.1 + acorn: 8.14.0 acorn-walk: 8.3.2 capnp-ts: 0.7.0 exit-hook: 2.2.1 @@ -5730,8 +5463,6 @@ snapshots: mrmime@2.0.0: {} - ms@2.1.2: {} - ms@2.1.3: {} mustache@4.2.0: {} @@ -5774,10 +5505,6 @@ snapshots: npm-bundled: 2.0.1 npm-normalize-package-bin: 2.0.0 - npm-run-path@5.3.0: - dependencies: - path-key: 4.0.0 - npmlog@5.0.1: dependencies: are-we-there-yet: 2.0.0 @@ -5791,10 +5518,6 @@ snapshots: dependencies: wrappy: 1.0.2 - onetime@6.0.0: - dependencies: - mimic-fn: 4.0.0 - optionator@0.9.3: dependencies: '@aashutoshrathi/word-wrap': 1.2.6 @@ -5849,8 +5572,6 @@ snapshots: path-key@3.1.1: {} - path-key@4.0.0: {} - path-parse@1.0.7: {} path-to-regexp@6.2.2: {} @@ -5861,13 +5582,7 @@ snapshots: pathval@2.0.0: {} - periscopic@3.1.0: - dependencies: - '@types/estree': 1.0.6 - estree-walker: 3.0.3 - is-reference: 3.0.2 - - picocolors@1.1.0: {} + picocolors@1.1.1: {} picomatch@2.3.1: {} @@ -5888,56 +5603,43 @@ snapshots: '@polka/url': 1.0.0-next.28 trouter: 4.0.0 - postcss-load-config@3.1.4(postcss@8.4.47): + postcss-load-config@3.1.4(postcss@8.4.49): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.47 + postcss: 8.4.49 - postcss-safe-parser@6.0.0(postcss@8.4.47): + postcss-safe-parser@6.0.0(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 - postcss-scss@4.0.9(postcss@8.4.47): + postcss-scss@4.0.9(postcss@8.4.49): dependencies: - postcss: 8.4.47 + postcss: 8.4.49 postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.47: + postcss@8.4.49: dependencies: nanoid: 3.3.7 - picocolors: 1.1.0 + picocolors: 1.1.1 source-map-js: 1.2.1 prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.1.2(prettier@3.1.1)(svelte@5.1.13): - dependencies: - prettier: 3.1.1 - svelte: 5.1.13 - - prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.1.13): + prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.2.9): dependencies: prettier: 3.3.3 - svelte: 5.1.13 + svelte: 5.2.9 prettier@2.8.8: {} - prettier@3.1.1: {} - prettier@3.3.3: {} - pretty-format@29.7.0: - dependencies: - '@jest/schemas': 29.6.3 - ansi-styles: 5.2.0 - react-is: 18.3.1 - printable-characters@1.0.42: {} pseudomap@1.0.2: {} @@ -5945,15 +5647,13 @@ snapshots: publint@0.2.7: dependencies: npm-packlist: 5.1.3 - picocolors: 1.1.0 + picocolors: 1.1.1 sade: 1.8.1 punycode@2.3.1: {} queue-microtask@1.2.3: {} - react-is@18.3.1: {} - read-yaml-file@1.1.0: dependencies: graceful-fs: 4.2.11 @@ -6011,26 +5711,28 @@ snapshots: dependencies: estree-walker: 0.6.1 - rollup@4.24.0: + rollup@4.27.4: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.24.0 - '@rollup/rollup-android-arm64': 4.24.0 - '@rollup/rollup-darwin-arm64': 4.24.0 - '@rollup/rollup-darwin-x64': 4.24.0 - '@rollup/rollup-linux-arm-gnueabihf': 4.24.0 - '@rollup/rollup-linux-arm-musleabihf': 4.24.0 - '@rollup/rollup-linux-arm64-gnu': 4.24.0 - '@rollup/rollup-linux-arm64-musl': 4.24.0 - '@rollup/rollup-linux-powerpc64le-gnu': 4.24.0 - '@rollup/rollup-linux-riscv64-gnu': 4.24.0 - '@rollup/rollup-linux-s390x-gnu': 4.24.0 - '@rollup/rollup-linux-x64-gnu': 4.24.0 - '@rollup/rollup-linux-x64-musl': 4.24.0 - '@rollup/rollup-win32-arm64-msvc': 4.24.0 - '@rollup/rollup-win32-ia32-msvc': 4.24.0 - '@rollup/rollup-win32-x64-msvc': 4.24.0 + '@rollup/rollup-android-arm-eabi': 4.27.4 + '@rollup/rollup-android-arm64': 4.27.4 + '@rollup/rollup-darwin-arm64': 4.27.4 + '@rollup/rollup-darwin-x64': 4.27.4 + '@rollup/rollup-freebsd-arm64': 4.27.4 + '@rollup/rollup-freebsd-x64': 4.27.4 + '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 + '@rollup/rollup-linux-arm-musleabihf': 4.27.4 + '@rollup/rollup-linux-arm64-gnu': 4.27.4 + '@rollup/rollup-linux-arm64-musl': 4.27.4 + '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 + '@rollup/rollup-linux-riscv64-gnu': 4.27.4 + '@rollup/rollup-linux-s390x-gnu': 4.27.4 + '@rollup/rollup-linux-x64-gnu': 4.27.4 + '@rollup/rollup-linux-x64-musl': 4.27.4 + '@rollup/rollup-win32-arm64-msvc': 4.27.4 + '@rollup/rollup-win32-ia32-msvc': 4.27.4 + '@rollup/rollup-win32-x64-msvc': 4.27.4 fsevents: 2.3.3 run-parallel@1.2.0: @@ -6102,8 +5804,6 @@ snapshots: signal-exit@3.0.7: {} - signal-exit@4.1.0: {} - simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -6147,7 +5847,7 @@ snapshots: as-table: 1.0.55 get-source: 2.0.12 - std-env@3.7.0: {} + std-env@3.8.0: {} stoppable@1.1.0: {} @@ -6167,8 +5867,6 @@ snapshots: strip-bom@3.0.0: {} - strip-final-newline@3.0.0: {} - strip-indent@3.0.0: dependencies: min-indent: 1.0.1 @@ -6181,100 +5879,63 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.0.1(picomatch@4.0.2)(svelte@4.2.19)(typescript@5.6.3): - dependencies: - '@jridgewell/trace-mapping': 0.3.25 - chokidar: 3.6.0 - fdir: 6.3.0(picomatch@4.0.2) - picocolors: 1.1.0 - sade: 1.8.1 - svelte: 4.2.19 - typescript: 5.6.3 - transitivePeerDependencies: - - picomatch - - svelte-check@4.0.1(picomatch@4.0.2)(svelte@5.1.13)(typescript@5.6.3): + svelte-check@4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 3.6.0 - fdir: 6.3.0(picomatch@4.0.2) - picocolors: 1.1.0 + fdir: 6.4.0(picomatch@4.0.2) + picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.1.13 + svelte: 5.2.9 typescript: 5.6.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.39.2(svelte@5.1.13): + svelte-eslint-parser@0.39.2(svelte@5.2.9): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.47 - postcss-scss: 4.0.9(postcss@8.4.47) + postcss: 8.4.49 + postcss-scss: 4.0.9(postcss@8.4.49) optionalDependencies: - svelte: 5.1.13 - - svelte-hmr@0.16.0(svelte@4.2.19): - dependencies: - svelte: 4.2.19 - - svelte-hmr@0.16.0(svelte@5.1.13): - dependencies: - svelte: 5.1.13 + svelte: 5.2.9 - svelte-parse-markup@0.1.5(svelte@5.1.13): + svelte-parse-markup@0.1.5(svelte@5.2.9): dependencies: - svelte: 5.1.13 + svelte: 5.2.9 - svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.4.47))(postcss@8.4.47)(svelte@4.2.19)(typescript@5.4.5): + svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@5.2.9)(typescript@5.6.3): dependencies: detect-indent: 6.1.0 strip-indent: 3.0.0 - svelte: 4.2.19 + svelte: 5.2.9 optionalDependencies: - postcss: 8.4.47 - postcss-load-config: 3.1.4(postcss@8.4.47) - typescript: 5.4.5 + postcss: 8.4.49 + postcss-load-config: 3.1.4(postcss@8.4.49) + typescript: 5.6.3 - svelte2tsx@0.7.18(svelte@4.2.19)(typescript@5.4.5): + svelte2tsx@0.7.18(svelte@5.2.9)(typescript@5.6.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 4.2.19 - typescript: 5.4.5 - - svelte@4.2.19: - dependencies: - '@ampproject/remapping': 2.3.0 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - '@types/estree': 1.0.6 - acorn: 8.12.1 - aria-query: 5.3.2 - axobject-query: 4.1.0 - code-red: 1.0.4 - css-tree: 2.3.1 - estree-walker: 3.0.3 - is-reference: 3.0.2 - locate-character: 3.0.0 - magic-string: 0.30.11 - periscopic: 3.1.0 + svelte: 5.2.9 + typescript: 5.6.3 - svelte@5.1.13: + svelte@5.2.9: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 - acorn: 8.12.1 - acorn-typescript: 1.4.13(acorn@8.12.1) + acorn: 8.14.0 + acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - esm-env: 1.0.0 + esm-env: 1.2.1 esrap: 1.2.2 - is-reference: 3.0.2 + is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.11 + magic-string: 0.30.14 zimmerframe: 1.1.2 tapable@2.2.1: {} @@ -6297,13 +5958,17 @@ snapshots: globalyzer: 0.1.0 globrex: 0.1.2 - tinybench@2.8.0: {} + tinybench@2.9.0: {} tinydate@1.3.0: {} - tinypool@1.0.0: {} + tinyexec@0.3.1: {} + + tinypool@1.0.2: {} + + tinyrainbow@1.2.0: {} - tinyspy@3.0.0: {} + tinyspy@3.0.2: {} tmp@0.0.33: dependencies: @@ -6321,10 +5986,6 @@ snapshots: dependencies: regexparam: 3.0.0 - ts-api-utils@1.3.0(typescript@5.4.5): - dependencies: - typescript: 5.4.5 - ts-api-utils@1.3.0(typescript@5.6.3): dependencies: typescript: 5.6.3 @@ -6346,8 +6007,6 @@ snapshots: - eslint - supports-color - typescript@5.4.5: {} - typescript@5.6.3: {} ufo@1.5.3: {} @@ -6384,22 +6043,23 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 - vite-imagetools@7.0.1(rollup@4.24.0): + vite-imagetools@7.0.1(rollup@4.27.4): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.24.0) + '@rollup/pluginutils': 5.1.0(rollup@4.27.4) imagetools-core: 7.0.0 transitivePeerDependencies: - rollup - vite-node@2.0.1(@types/node@18.19.50)(lightningcss@1.24.1): + vite-node@2.1.6(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: cac: 6.7.14 - debug: 4.3.5 + debug: 4.3.7 + es-module-lexer: 1.5.4 pathe: 1.1.2 - picocolors: 1.1.0 - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - '@types/node' + - jiti - less - lightningcss - sass @@ -6408,70 +6068,60 @@ snapshots: - sugarss - supports-color - terser + - tsx + - yaml - vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1): + vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: - esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.24.0 + esbuild: 0.24.0 + postcss: 8.4.49 + rollup: 4.27.4 optionalDependencies: '@types/node': 18.19.50 fsevents: 2.3.3 lightningcss: 1.24.1 - vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1): - dependencies: - esbuild: 0.21.5 - postcss: 8.4.47 - rollup: 4.24.0 + vitefu@1.0.4(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)): optionalDependencies: - '@types/node': 18.19.50 - fsevents: 2.3.3 - lightningcss: 1.24.1 - - vitefu@0.2.5(vite@5.3.6(@types/node@18.19.50)(lightningcss@1.24.1)): - optionalDependencies: - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - - vitefu@0.2.5(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)): - optionalDependencies: - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - - vitefu@1.0.3(vite@5.4.10(@types/node@18.19.50)(lightningcss@1.24.1)): - optionalDependencies: - vite: 5.4.10(@types/node@18.19.50)(lightningcss@1.24.1) - - vitest@2.0.1(@types/node@18.19.50)(lightningcss@1.24.1): - dependencies: - '@ampproject/remapping': 2.3.0 - '@vitest/expect': 2.0.1 - '@vitest/runner': 2.0.1 - '@vitest/snapshot': 2.0.1 - '@vitest/spy': 2.0.1 - '@vitest/utils': 2.0.1 - chai: 5.1.1 - debug: 4.3.5 - execa: 8.0.1 - magic-string: 0.30.11 + vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + + vitest@2.1.6(@types/node@18.19.50)(lightningcss@1.24.1): + dependencies: + '@vitest/expect': 2.1.6 + '@vitest/mocker': 2.1.6(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + '@vitest/pretty-format': 2.1.6 + '@vitest/runner': 2.1.6 + '@vitest/snapshot': 2.1.6 + '@vitest/spy': 2.1.6 + '@vitest/utils': 2.1.6 + chai: 5.1.2 + debug: 4.3.7 + expect-type: 1.1.0 + magic-string: 0.30.14 pathe: 1.1.2 - picocolors: 1.1.0 - std-env: 3.7.0 - tinybench: 2.8.0 - tinypool: 1.0.0 - vite: 5.3.6(@types/node@18.19.50)(lightningcss@1.24.1) - vite-node: 2.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + std-env: 3.8.0 + tinybench: 2.9.0 + tinyexec: 0.3.1 + tinypool: 1.0.2 + tinyrainbow: 1.2.0 + vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + vite-node: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.50 transitivePeerDependencies: + - jiti - less - lightningcss + - msw - sass - sass-embedded - stylus - sugarss - supports-color - terser + - tsx + - yaml webidl-conversions@3.0.1: {} From 42c8bf390a14ff18f604ae444d0f7a15c76ce911 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 10:11:39 -0800 Subject: [PATCH 0783/1135] Version Packages (#13081) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/curvy-garlics-walk.md | 8 -------- .changeset/purple-comics-know.md | 5 ----- .changeset/slow-toes-clap.md | 5 ----- packages/adapter-cloudflare-workers/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare-workers/package.json | 2 +- packages/adapter-cloudflare/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/CHANGELOG.md | 12 ++++++++++++ packages/adapter-netlify/package.json | 2 +- packages/adapter-vercel/CHANGELOG.md | 12 ++++++++++++ packages/adapter-vercel/package.json | 2 +- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 14 files changed, 66 insertions(+), 24 deletions(-) delete mode 100644 .changeset/curvy-garlics-walk.md delete mode 100644 .changeset/purple-comics-know.md delete mode 100644 .changeset/slow-toes-clap.md diff --git a/.changeset/curvy-garlics-walk.md b/.changeset/curvy-garlics-walk.md deleted file mode 100644 index aa68c7585d68..000000000000 --- a/.changeset/curvy-garlics-walk.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare-workers': minor -'@sveltejs/adapter-cloudflare': minor -'@sveltejs/adapter-netlify': minor -'@sveltejs/adapter-vercel': minor ---- - -chore: upgrade esbuild to 0.24.0 diff --git a/.changeset/purple-comics-know.md b/.changeset/purple-comics-know.md deleted file mode 100644 index 9334ee1fdab6..000000000000 --- a/.changeset/purple-comics-know.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: Vite 6 support diff --git a/.changeset/slow-toes-clap.md b/.changeset/slow-toes-clap.md deleted file mode 100644 index 77838348c450..000000000000 --- a/.changeset/slow-toes-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: transform link[rel='shortcut icon'] and link[rel='apple-touch-icon'] to be absolute to avoid console error when navigating diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md index 02072ab969d8..a91453abbb70 100644 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ b/packages/adapter-cloudflare-workers/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare-workers +## 2.6.0 +### Minor Changes + + +- chore: upgrade esbuild to 0.24.0 ([#12270](https://github.com/sveltejs/kit/pull/12270)) + + +### Patch Changes + +- Updated dependencies [[`d030f4bb285e70844d09b3f0c87809bae43014b8`](https://github.com/sveltejs/kit/commit/d030f4bb285e70844d09b3f0c87809bae43014b8), [`67dd214863cbc5852eb0e8512efbb7bad5358e8a`](https://github.com/sveltejs/kit/commit/67dd214863cbc5852eb0e8512efbb7bad5358e8a)]: + - @sveltejs/kit@2.9.0 + ## 2.5.6 ### Patch Changes diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 6715b2b8adeb..7db97724aa11 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare-workers", - "version": "2.5.6", + "version": "2.6.0", "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", "keywords": [ "adapter", diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 16a1b821899f..a845c8a85189 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare +## 4.8.0 +### Minor Changes + + +- chore: upgrade esbuild to 0.24.0 ([#12270](https://github.com/sveltejs/kit/pull/12270)) + + +### Patch Changes + +- Updated dependencies [[`d030f4bb285e70844d09b3f0c87809bae43014b8`](https://github.com/sveltejs/kit/commit/d030f4bb285e70844d09b3f0c87809bae43014b8), [`67dd214863cbc5852eb0e8512efbb7bad5358e8a`](https://github.com/sveltejs/kit/commit/67dd214863cbc5852eb0e8512efbb7bad5358e8a)]: + - @sveltejs/kit@2.9.0 + ## 4.7.4 ### Patch Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 27cc3471295f..4d49b21f4841 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "4.7.4", + "version": "4.8.0", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/adapter-netlify/CHANGELOG.md b/packages/adapter-netlify/CHANGELOG.md index 27ad75b65eaa..c1d077ff49aa 100644 --- a/packages/adapter-netlify/CHANGELOG.md +++ b/packages/adapter-netlify/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-netlify +## 4.4.0 +### Minor Changes + + +- chore: upgrade esbuild to 0.24.0 ([#12270](https://github.com/sveltejs/kit/pull/12270)) + + +### Patch Changes + +- Updated dependencies [[`d030f4bb285e70844d09b3f0c87809bae43014b8`](https://github.com/sveltejs/kit/commit/d030f4bb285e70844d09b3f0c87809bae43014b8), [`67dd214863cbc5852eb0e8512efbb7bad5358e8a`](https://github.com/sveltejs/kit/commit/67dd214863cbc5852eb0e8512efbb7bad5358e8a)]: + - @sveltejs/kit@2.9.0 + ## 4.3.6 ### Patch Changes diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index f2f87d9d5edf..c407c76922ba 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-netlify", - "version": "4.3.6", + "version": "4.4.0", "description": "A SvelteKit adapter that creates a Netlify app", "keywords": [ "adapter", diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index 9002d1d318e4..57bebeed2707 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-vercel +## 5.5.0 +### Minor Changes + + +- chore: upgrade esbuild to 0.24.0 ([#12270](https://github.com/sveltejs/kit/pull/12270)) + + +### Patch Changes + +- Updated dependencies [[`d030f4bb285e70844d09b3f0c87809bae43014b8`](https://github.com/sveltejs/kit/commit/d030f4bb285e70844d09b3f0c87809bae43014b8), [`67dd214863cbc5852eb0e8512efbb7bad5358e8a`](https://github.com/sveltejs/kit/commit/67dd214863cbc5852eb0e8512efbb7bad5358e8a)]: + - @sveltejs/kit@2.9.0 + ## 5.4.8 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 884c460f24e1..d768f98b909a 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.4.8", + "version": "5.5.0", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 31784d40d540..4ec70d7dc666 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.9.0 +### Minor Changes + + +- feat: Vite 6 support ([#12270](https://github.com/sveltejs/kit/pull/12270)) + + +### Patch Changes + + +- fix: transform link[rel='shortcut icon'] and link[rel='apple-touch-icon'] to be absolute to avoid console error when navigating ([#13077](https://github.com/sveltejs/kit/pull/13077)) + ## 2.8.5 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index a0ed5b02bef5..bbff055c4720 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.8.5", + "version": "2.9.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 616f0dae624f..dc207ff654d2 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.8.5'; +export const VERSION = '2.9.0'; From 8aef436e06c1e2b3186d3ceb7e8c29c54a5b02bd Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Sun, 1 Dec 2024 09:42:59 -0500 Subject: [PATCH 0784/1135] fix cloudflare docs (#13086) * fix cloudflare docs * gah missed a spot --- documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md | 2 ++ .../docs/25-build-and-deploy/70-adapter-cloudflare-workers.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index 3704dc0454b8..9a4b2b7e717a 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -86,6 +86,8 @@ To include type declarations for your bindings, reference them in your `src/app. ```ts /// file: src/app.d.ts +import { KVNamespace, DurableObjectNamespace } from '@cloudflare/workers-types'; + declare global { namespace App { interface Platform { diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index b4e270f62283..bd53dd4d8e7d 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -107,6 +107,8 @@ To include type declarations for your bindings, reference them in your `src/app. ```ts /// file: src/app.d.ts +import { KVNamespace, DurableObjectNamespace } from '@cloudflare/workers-types'; + declare global { namespace App { interface Platform { From 38d65e31c53055694165b7a042d10d8a54c141cb Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 1 Dec 2024 17:59:03 -0800 Subject: [PATCH 0785/1135] chore: upgrade @vercel/nft to 0.27.7 (#13082) --- .changeset/few-lamps-work.md | 5 ++++ packages/adapter-vercel/package.json | 2 +- pnpm-lock.yaml | 38 +++++++++++----------------- 3 files changed, 21 insertions(+), 24 deletions(-) create mode 100644 .changeset/few-lamps-work.md diff --git a/.changeset/few-lamps-work.md b/.changeset/few-lamps-work.md new file mode 100644 index 000000000000..e3f0846f5a37 --- /dev/null +++ b/.changeset/few-lamps-work.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +chore: upgrade @vercel/nft to 0.27.7 diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index d768f98b909a..69e6f19a3b0c 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -39,7 +39,7 @@ "test": "vitest run" }, "dependencies": { - "@vercel/nft": "^0.27.1", + "@vercel/nft": "^0.27.7", "esbuild": "^0.24.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 4c7a7dca9fbb..b932daa819d1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -263,8 +263,8 @@ importers: packages/adapter-vercel: dependencies: '@vercel/nft': - specifier: ^0.27.1 - version: 0.27.1 + specifier: ^0.27.7 + version: 0.27.7(rollup@4.27.4) esbuild: specifier: ^0.24.0 version: 0.24.0 @@ -1774,12 +1774,8 @@ packages: rollup: optional: true - '@rollup/pluginutils@4.2.1': - resolution: {integrity: sha512-iKnFXr7NkdZAIHiIWE+BX5ULi/ucVFYWD6TbAV+rZctiRTY2PL6tsIKhoIOaoskiWAkgu+VsbXgUVDNLHf+InQ==} - engines: {node: '>= 8.0.0'} - - '@rollup/pluginutils@5.1.0': - resolution: {integrity: sha512-XTIWOPPcpvyKI6L1NHo0lFlCyznUEyPmPY1mc3KpPVDYulHSTvyeLNVW00QTLIAFNhR3kYnJTQHeGqU4M3n09g==} + '@rollup/pluginutils@5.1.3': + resolution: {integrity: sha512-Pnsb6f32CD2W3uCaLZIzDmeFyQ2b8UWMFI7xtwUezpcGBDVDW6y9XgAWIlARiGAo6eNF5FK5aQTr0LFyNyqq5A==} engines: {node: '>=14.0.0'} peerDependencies: rollup: ^1.20.0||^2.0.0||^3.0.0||^4.0.0 @@ -2006,8 +2002,8 @@ packages: resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vercel/nft@0.27.1': - resolution: {integrity: sha512-K6upzYHCV1cq2gP83r1o8uNV1vwvAlozvMqp7CEjYWxo0CMI8/4jKcDkVjlypVhrfZ54SXwh9QbH0ZIk/vQCsw==} + '@vercel/nft@0.27.7': + resolution: {integrity: sha512-FG6H5YkP4bdw9Ll1qhmbxuE8KwW2E/g8fJpM183fWQLeVDGqzeywMIeJ9h2txdWZ03psgWMn6QymTxaDLmdwUg==} engines: {node: '>=16'} hasBin: true @@ -4264,7 +4260,7 @@ snapshots: '@rollup/plugin-commonjs@28.0.1(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.27.4) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.0(picomatch@4.0.2) @@ -4276,13 +4272,13 @@ snapshots: '@rollup/plugin-json@6.1.0(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.27.4) optionalDependencies: rollup: 4.27.4 '@rollup/plugin-node-resolve@15.3.0(rollup@4.27.4)': dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.27.4) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 @@ -4290,16 +4286,11 @@ snapshots: optionalDependencies: rollup: 4.27.4 - '@rollup/pluginutils@4.2.1': - dependencies: - estree-walker: 2.0.2 - picomatch: 2.3.1 - - '@rollup/pluginutils@5.1.0(rollup@4.27.4)': + '@rollup/pluginutils@5.1.3(rollup@4.27.4)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 - picomatch: 2.3.1 + picomatch: 4.0.2 optionalDependencies: rollup: 4.27.4 @@ -4523,10 +4514,10 @@ snapshots: '@typescript-eslint/types': 8.4.0 eslint-visitor-keys: 3.4.3 - '@vercel/nft@0.27.1': + '@vercel/nft@0.27.7(rollup@4.27.4)': dependencies: '@mapbox/node-pre-gyp': 1.0.11 - '@rollup/pluginutils': 4.2.1 + '@rollup/pluginutils': 5.1.3(rollup@4.27.4) acorn: 8.14.0 acorn-import-attributes: 1.9.5(acorn@8.14.0) async-sema: 3.1.1 @@ -4539,6 +4530,7 @@ snapshots: resolve-from: 5.0.0 transitivePeerDependencies: - encoding + - rollup - supports-color '@vitest/expect@2.1.6': @@ -6045,7 +6037,7 @@ snapshots: vite-imagetools@7.0.1(rollup@4.27.4): dependencies: - '@rollup/pluginutils': 5.1.0(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.27.4) imagetools-core: 7.0.0 transitivePeerDependencies: - rollup From 78404dfe1eb346723eefc183278b85f25485b419 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Tue, 3 Dec 2024 18:30:10 +0800 Subject: [PATCH 0786/1135] fix: correctly match route groups preceding optional parameters (#13099) fixes #13095 This PR changes the RegExp to ensure that routes such as /[[optional]]/(group) are treated the same as [[optional]]. Previously, /[[optional]]/(group) was being treated the same as / which is incorrect since it has an optional segment. It wasn't recognised as /[[optional]] because the RegExp didn't consider the route group preceding it (it only looked for the end of the string). --- .changeset/fifty-cars-lie.md | 5 +++ .../sync/create_manifest_data/index.spec.js | 42 +++++++++++++++++++ .../core/sync/create_manifest_data/sort.js | 3 +- .../[[optional]]/(group)/+page.svelte | 0 4 files changed, 49 insertions(+), 1 deletion(-) create mode 100644 .changeset/fifty-cars-lie.md create mode 100644 packages/kit/src/core/sync/create_manifest_data/test/samples/optional-group/[[optional]]/(group)/+page.svelte diff --git a/.changeset/fifty-cars-lie.md b/.changeset/fifty-cars-lie.md new file mode 100644 index 000000000000..cac282e057be --- /dev/null +++ b/.changeset/fifty-cars-lie.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly match route groups preceding optional parameters diff --git a/packages/kit/src/core/sync/create_manifest_data/index.spec.js b/packages/kit/src/core/sync/create_manifest_data/index.spec.js index 758206be45d5..2642e0c3cce0 100644 --- a/packages/kit/src/core/sync/create_manifest_data/index.spec.js +++ b/packages/kit/src/core/sync/create_manifest_data/index.spec.js @@ -412,6 +412,48 @@ test('nested optionals', () => { ]); }); +test('group preceding optional parameters', () => { + const { nodes, routes } = create('samples/optional-group'); + + expect( + nodes + .map(simplify_node) + // for some reason linux and windows have a different order, which is why + // we need sort the nodes using a sort function (doesn't work either without), + // resulting in the following expected node order + .sort((a, b) => a.component?.localeCompare(b.component ?? '') ?? 1) + ).toEqual([ + default_error, + default_layout, + { + component: 'samples/optional-group/[[optional]]/(group)/+page.svelte' + } + ]); + + expect(routes.map(simplify_route)).toEqual([ + { + id: '/', + pattern: '/^/$/' + }, + { + id: '/[[optional]]/(group)', + pattern: '/^(?:/([^/]+))?/?$/', + page: { + layouts: [0], + errors: [1], + // see above, linux/windows difference -> find the index dynamically + leaf: nodes.findIndex((node) => + node.component?.includes('optional-group/[[optional]]/(group)') + ) + } + }, + { + id: '/[[optional]]', + pattern: '/^(?:/([^/]+))?/?$/' + } + ]); +}); + test('ignores files and directories with leading underscores', () => { const { routes } = create('samples/hidden-underscore'); diff --git a/packages/kit/src/core/sync/create_manifest_data/sort.js b/packages/kit/src/core/sync/create_manifest_data/sort.js index 9addd2c390c8..1629d146bf3e 100644 --- a/packages/kit/src/core/sync/create_manifest_data/sort.js +++ b/packages/kit/src/core/sync/create_manifest_data/sort.js @@ -136,7 +136,8 @@ function split_route_id(id) { return get_route_segments( id // remove all [[optional]] parts unless they're at the very end - .replace(/\[\[[^\]]+\]\](?!$)/g, '') + // or it ends with a route group + .replace(/\[\[[^\]]+\]\](?!(?:\/\([^/]+\))*$)/g, '') ).filter(Boolean); } diff --git a/packages/kit/src/core/sync/create_manifest_data/test/samples/optional-group/[[optional]]/(group)/+page.svelte b/packages/kit/src/core/sync/create_manifest_data/test/samples/optional-group/[[optional]]/(group)/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 From b77753ea26ea41dc8d2f35970321616d0184bd89 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Wed, 4 Dec 2024 10:42:54 +0800 Subject: [PATCH 0787/1135] chore: publish other packages to pkg.pr.new (#13096) * add other packages to pkg.pr.new * Update .github/workflows/ci.yml Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .github/workflows/ci.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index c754c5f185f8..b8529b9a6a7b 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile - - run: pnpx pkg-pr-new publish --comment=off ./packages/kit + - run: pnpx pkg-pr-new publish --comment=off ./packages/* lint-all: runs-on: ubuntu-latest steps: From 72a70838f9e3b1070ef3da7d5f8e02cc402b744d Mon Sep 17 00:00:00 2001 From: Tom Adler <me@arty.name> Date: Wed, 4 Dec 2024 14:24:00 +0100 Subject: [PATCH 0788/1135] docs: remove extraneous dash (#13105) --- documentation/docs/20-core-concepts/10-routing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 3cb2ba3ef3aa..b54074cdd75a 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -169,7 +169,7 @@ To create a layout that applies to every page, make a file called `src/routes/+l ...but we can add whatever markup, styles and behaviour we want. The only requirement is that the component includes a `@render` tag for the page content. For example, let's add a nav bar: ```svelte -<!---- file: src/routes/+layout.svelte ---> +<!--- file: src/routes/+layout.svelte ---> <script> let { children } = $props(); </script> From 5819e66f8fec555decfa857a14d3ca7ba3241505 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 6 Dec 2024 12:37:43 -0800 Subject: [PATCH 0789/1135] chore(deps): update pnpm to v9.15.0 (#13116) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 6801ee9b2c2d..704805dd4ecd 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.14.4", + "packageManager": "pnpm@9.15.0", "engines": { "pnpm": "^9.0.0" } From ec35c837db9768342d69743474eac7488175fa38 Mon Sep 17 00:00:00 2001 From: Devr <bhargavj2804@pm.me> Date: Sun, 8 Dec 2024 05:01:17 +0530 Subject: [PATCH 0790/1135] docs: update Lucia URL (#13119) --- documentation/docs/40-best-practices/03-auth.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/40-best-practices/03-auth.md b/documentation/docs/40-best-practices/03-auth.md index b2b8e07aa82c..a68197ef8bbb 100644 --- a/documentation/docs/40-best-practices/03-auth.md +++ b/documentation/docs/40-best-practices/03-auth.md @@ -18,6 +18,6 @@ Auth [cookies](@sveltejs-kit#Cookies) can be checked inside [server hooks](hooks ## Guides -[Lucia](https://lucia-next.pages.dev/) is a reference for session-based web app auth. It contains example code snippets and projects for implementing session-based auth within SvelteKit and other JS projects. You can add code which follows the Lucia guide to your project with `npx sv create` when creating a new project or `npx sv add lucia` for an existing project. +[Lucia](https://lucia-auth.com/) is a reference for session-based web app auth. It contains example code snippets and projects for implementing session-based auth within SvelteKit and other JS projects. You can add code which follows the Lucia guide to your project with `npx sv create` when creating a new project or `npx sv add lucia` for an existing project. -An auth system is tightly coupled to a web framework because most of the code lies in validating user input, handling errors, and directing users to the appropriate next page. As a result, many of the generic JS auth libraries include one or more web frameworks within them. For this reason, many users will find it preferrable to follow a SvelteKit-specific guide such as the examples found in [Lucia](https://lucia-next.pages.dev/) rather than having multiple web frameworks inside their project. +An auth system is tightly coupled to a web framework because most of the code lies in validating user input, handling errors, and directing users to the appropriate next page. As a result, many of the generic JS auth libraries include one or more web frameworks within them. For this reason, many users will find it preferrable to follow a SvelteKit-specific guide such as the examples found in [Lucia](https://lucia-auth.com/) rather than having multiple web frameworks inside their project. From eb25a62436aa946214de19d0c3f3d64baf814069 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 7 Dec 2024 15:31:56 -0800 Subject: [PATCH 0791/1135] perf: directly inline values since Svelte no longer inlines (#13035) --- .changeset/wild-flies-run.md | 5 +++ packages/enhanced-img/src/preprocessor.js | 48 ++++++----------------- packages/enhanced-img/test/Output.svelte | 11 ++---- 3 files changed, 19 insertions(+), 45 deletions(-) create mode 100644 .changeset/wild-flies-run.md diff --git a/.changeset/wild-flies-run.md b/.changeset/wild-flies-run.md new file mode 100644 index 000000000000..3f1f70ec0170 --- /dev/null +++ b/.changeset/wild-flies-run.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': patch +--- + +perf: directly inline values since Svelte no longer inlines variables into template diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js index dbba1aa5514f..7331cff18e11 100644 --- a/packages/enhanced-img/src/preprocessor.js +++ b/packages/enhanced-img/src/preprocessor.js @@ -5,7 +5,6 @@ import * as path from 'node:path'; import MagicString from 'magic-string'; import { walk } from 'zimmerframe'; -import { VERSION } from 'svelte/compiler'; import { parse } from 'svelte-parse-markup'; // TODO: expose this in vite-imagetools rather than duplicating it @@ -43,13 +42,6 @@ export function image(opts) { */ const imports = new Map(); - /** - * Vite name to declaration name - * e.g. __VITE_ASSET_0__ => __DECLARED_ASSET_0__ - * @type {Map<string, string>} - */ - const consts = new Map(); - /** * @param {import('svelte/compiler').AST.RegularElement} node * @param {AST.Text | AST.ExpressionTag} src_attribute @@ -110,7 +102,7 @@ export function image(opts) { image = await process(resolved_id, opts); images.set(resolved_id, image); } - s.update(node.start, node.end, img_to_picture(consts, content, node, image)); + s.update(node.start, node.end, img_to_picture(content, node, image)); } else { // e.g. <img src="./foo.svg" /> => <img src={__IMPORTED_ASSET_0__} /> const name = '__IMPORTED_ASSET_' + imports.size + '__'; @@ -160,7 +152,7 @@ export function image(opts) { await Promise.all(pending_ast_updates); - // add imports and consts to <script module> block + // add imports let text = ''; if (imports.size) { for (const [path, import_name] of imports.entries()) { @@ -168,19 +160,11 @@ export function image(opts) { } } - if (consts.size) { - for (const [vite_name, declaration_name] of consts.entries()) { - text += `\tconst ${declaration_name} = "${vite_name}";\n`; - } - } - - if (ast.module) { + if (ast.instance) { // @ts-ignore - s.appendLeft(ast.module.content.start, text); + s.appendLeft(ast.instance.content.start, text); } else { - s.prepend( - `<script ${VERSION.startsWith('4') ? 'context="module"' : 'module'}>${text}</script>\n` - ); + s.prepend(`<script>${text}</script>\n`); } return { @@ -318,12 +302,11 @@ function stringToNumber(param) { } /** - * @param {Map<string,string>} consts * @param {string} content * @param {import('svelte/compiler').AST.RegularElement} node * @param {import('vite-imagetools').Picture} image */ -function img_to_picture(consts, content, node, image) { +function img_to_picture(content, node, image) { /** @type {import('../types/internal.ts').Attribute[]} attributes */ const attributes = node.attributes; const index = attributes.findIndex( @@ -338,11 +321,11 @@ function img_to_picture(consts, content, node, image) { let res = '<picture>'; for (const [format, srcset] of Object.entries(image.sources)) { - res += `<source srcset=${to_value(consts, srcset)}${sizes_string} type="image/${format}" />`; + res += `<source srcset=${to_value(srcset)}${sizes_string} type="image/${format}" />`; } res += `<img ${serialize_img_attributes(content, attributes, { - src: to_value(consts, image.img.src), + src: to_value(image.img.src), width: image.img.w, height: image.img.h })} />`; @@ -351,20 +334,11 @@ function img_to_picture(consts, content, node, image) { } /** - * @param {Map<string, string>} consts * @param {string} src */ -function to_value(consts, src) { - if (src.startsWith('__VITE_ASSET__')) { - let var_name = consts.get(src); - if (!var_name) { - var_name = '__DECLARED_ASSET_' + consts.size + '__'; - consts.set(src, var_name); - } - return `{${var_name}}`; - } - - return `"${src}"`; +function to_value(src) { + // __VITE_ASSET__ needs to be contained in double quotes to work with Vite asset plugin + return src.startsWith('__VITE_ASSET__') ? `{"${src}"}` : `"${src}"`; } /** diff --git a/packages/enhanced-img/test/Output.svelte b/packages/enhanced-img/test/Output.svelte index 80a8485485ad..4d8bcc402272 100644 --- a/packages/enhanced-img/test/Output.svelte +++ b/packages/enhanced-img/test/Output.svelte @@ -1,11 +1,6 @@ -<script module> +<script lang="ts"> import __IMPORTED_ASSET_0__ from "./foo.svg"; - const __DECLARED_ASSET_0__ = "__VITE_ASSET__2AM7_y_a__ 1440w, __VITE_ASSET__2AM7_y_b__ 960w"; - const __DECLARED_ASSET_1__ = "__VITE_ASSET__2AM7_y_c__ 1440w, __VITE_ASSET__2AM7_y_d__ 960w"; - const __DECLARED_ASSET_2__ = "__VITE_ASSET__2AM7_y_e__ 1440w, __VITE_ASSET__2AM7_y_f__ 960w"; - const __DECLARED_ASSET_3__ = "__VITE_ASSET__2AM7_y_g__"; -</script> -<script lang="ts"> + import manual_image1 from './no.png'; @@ -28,7 +23,7 @@ <picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" alt="nested test" width=1440 height=1440 /></picture> </div> -<picture><source srcset={__DECLARED_ASSET_0__} type="image/avif" /><source srcset={__DECLARED_ASSET_1__} type="image/webp" /><source srcset={__DECLARED_ASSET_2__} type="image/png" /><img src={__DECLARED_ASSET_3__} alt="production test" width=1440 height=1440 /></picture> +<picture><source srcset={"__VITE_ASSET__2AM7_y_a__ 1440w, __VITE_ASSET__2AM7_y_b__ 960w"} type="image/avif" /><source srcset={"__VITE_ASSET__2AM7_y_c__ 1440w, __VITE_ASSET__2AM7_y_d__ 960w"} type="image/webp" /><source srcset={"__VITE_ASSET__2AM7_y_e__ 1440w, __VITE_ASSET__2AM7_y_f__ 960w"} type="image/png" /><img src={"__VITE_ASSET__2AM7_y_g__"} alt="production test" width=1440 height=1440 /></picture> <picture><source srcset="/1 1440w, /2 960w" type="image/avif" /><source srcset="/3 1440w, /4 960w" type="image/webp" /><source srcset="5 1440w, /6 960w" type="image/png" /><img src="/7" width="5" height="10" alt="dimensions test" /></picture> From e2746ef39f5f2ca2d45ab3a081edf4f7200a5b98 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:14:58 -0800 Subject: [PATCH 0792/1135] feat: set intrinsic width and height for SVGs (#13126) --- .changeset/tricky-squids-provide.md | 5 + packages/enhanced-img/package.json | 1 + packages/enhanced-img/src/preprocessor.js | 74 +++--- packages/enhanced-img/test/Input.svelte | 2 - packages/enhanced-img/test/Output.svelte | 6 +- .../enhanced-img/test/preprocessor.spec.js | 2 +- playgrounds/basic/package.json | 1 + playgrounds/basic/src/routes/+page.svelte | 6 + .../basic/src/routes/about/+page.svelte | 1 - .../basic/src/routes/images/+page.svelte | 11 + .../src/routes/images/state-of-js-chart.png | Bin 0 -> 190480 bytes .../basic/src/routes/images/svelte-logo.svg | 1 + playgrounds/basic/vite.config.js | 3 +- pnpm-lock.yaml | 216 +++++++++--------- 14 files changed, 169 insertions(+), 160 deletions(-) create mode 100644 .changeset/tricky-squids-provide.md delete mode 100644 playgrounds/basic/src/routes/about/+page.svelte create mode 100644 playgrounds/basic/src/routes/images/+page.svelte create mode 100644 playgrounds/basic/src/routes/images/state-of-js-chart.png create mode 100644 playgrounds/basic/src/routes/images/svelte-logo.svg diff --git a/.changeset/tricky-squids-provide.md b/.changeset/tricky-squids-provide.md new file mode 100644 index 000000000000..d15da40874d9 --- /dev/null +++ b/.changeset/tricky-squids-provide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': patch +--- + +feat: set intrinsic width and height for SVGs diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 4fc2bbc76dcb..41157706762f 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -37,6 +37,7 @@ "types": "types/index.d.ts", "dependencies": { "magic-string": "^0.30.5", + "sharp": "^0.33.5", "svelte-parse-markup": "^0.1.5", "vite-imagetools": "^7.0.1", "zimmerframe": "^1.1.2" diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js index 7331cff18e11..de800b653734 100644 --- a/packages/enhanced-img/src/preprocessor.js +++ b/packages/enhanced-img/src/preprocessor.js @@ -4,8 +4,9 @@ import { existsSync } from 'node:fs'; import * as path from 'node:path'; import MagicString from 'magic-string'; -import { walk } from 'zimmerframe'; +import sharp from 'sharp'; import { parse } from 'svelte-parse-markup'; +import { walk } from 'zimmerframe'; // TODO: expose this in vite-imagetools rather than duplicating it const OPTIMIZABLE = /^[^?]+\.(avif|heif|gif|jpeg|jpg|png|tiff|webp)(\?.*)?$/; @@ -70,33 +71,36 @@ export function image(opts) { const original_url = src_attribute.raw.trim(); let url = original_url; - const sizes = get_attr_value(node, 'sizes'); - const width = get_attr_value(node, 'width'); - url += url.includes('?') ? '&' : '?'; - if (sizes && 'raw' in sizes) { - url += 'imgSizes=' + encodeURIComponent(sizes.raw) + '&'; - } - if (width && 'raw' in width) { - url += 'imgWidth=' + encodeURIComponent(width.raw) + '&'; + if (OPTIMIZABLE.test(url)) { + const sizes = get_attr_value(node, 'sizes'); + const width = get_attr_value(node, 'width'); + url += url.includes('?') ? '&' : '?'; + if (sizes && 'raw' in sizes) { + url += 'imgSizes=' + encodeURIComponent(sizes.raw) + '&'; + } + if (width && 'raw' in width) { + url += 'imgWidth=' + encodeURIComponent(width.raw) + '&'; + } + url += 'enhanced'; } - url += 'enhanced'; - if (OPTIMIZABLE.test(url)) { - // resolves the import so that we can build the entire picture template string and don't - // need any logic blocks - const resolved_id = (await opts.plugin_context.resolve(url, filename))?.id; - if (!resolved_id) { - const file_path = url.substring(0, url.indexOf('?')); - if (existsSync(path.resolve(opts.vite_config.publicDir, file_path))) { - throw new Error( - `Could not locate ${file_path}. Please move it to be located relative to the page in the routes directory or reference it beginning with /static/. See https://vitejs.dev/guide/assets for more details on referencing assets.` - ); - } + // resolves the import so that we can build the entire picture template string and don't + // need any logic blocks + const resolved_id = (await opts.plugin_context.resolve(url, filename))?.id; + if (!resolved_id) { + const query_index = url.indexOf('?'); + const file_path = query_index >= 0 ? url.substring(0, query_index) : url; + if (existsSync(path.resolve(opts.vite_config.publicDir, file_path))) { throw new Error( - `Could not locate ${file_path}. See https://vitejs.dev/guide/assets for more details on referencing assets.` + `Could not locate ${file_path}. Please move it to be located relative to the page in the routes directory or reference it beginning with /static/. See https://vitejs.dev/guide/assets for more details on referencing assets.` ); } + throw new Error( + `Could not locate ${file_path}. See https://vitejs.dev/guide/assets for more details on referencing assets.` + ); + } + if (OPTIMIZABLE.test(url)) { let image = images.get(resolved_id); if (!image) { image = await process(resolved_id, opts); @@ -104,17 +108,14 @@ export function image(opts) { } s.update(node.start, node.end, img_to_picture(content, node, image)); } else { - // e.g. <img src="./foo.svg" /> => <img src={__IMPORTED_ASSET_0__} /> const name = '__IMPORTED_ASSET_' + imports.size + '__'; - const { start, end } = src_attribute; - // update src with reference to imported asset - s.update( - is_quote(content, start - 1) ? start - 1 : start, - is_quote(content, end) ? end + 1 : end, - `{${name}}` - ); - // update `enhanced:img` to `img` - s.update(node.start + 1, node.start + 1 + 'enhanced:img'.length, 'img'); + const metadata = await sharp(resolved_id).metadata(); + const new_markup = `<img ${serialize_img_attributes(content, node.attributes, { + src: `{${name}}`, + width: metadata.width || 0, + height: metadata.height || 0 + })} />`; + s.update(node.start, node.end, new_markup); imports.set(original_url, name); } } @@ -175,15 +176,6 @@ export function image(opts) { }; } -/** - * @param {string} content - * @param {number} index - * @returns {boolean} - */ -function is_quote(content, index) { - return content.charAt(index) === '"' || content.charAt(index) === "'"; -} - /** * @param {string} resolved_id * @param {{ diff --git a/packages/enhanced-img/test/Input.svelte b/packages/enhanced-img/test/Input.svelte index 3a29902d0930..35fd9c59901d 100644 --- a/packages/enhanced-img/test/Input.svelte +++ b/packages/enhanced-img/test/Input.svelte @@ -45,8 +45,6 @@ <enhanced:img {src} alt="attribute shorthand test" /> -<enhanced:img src="./foo.svg" alt="svg test" /> - {#each images as image} <enhanced:img src={image} alt="opt-in test" /> {/each} diff --git a/packages/enhanced-img/test/Output.svelte b/packages/enhanced-img/test/Output.svelte index 4d8bcc402272..d8c18c1ad88f 100644 --- a/packages/enhanced-img/test/Output.svelte +++ b/packages/enhanced-img/test/Output.svelte @@ -1,6 +1,4 @@ -<script lang="ts"> - import __IMPORTED_ASSET_0__ from "./foo.svg"; - +<script lang="ts"> import manual_image1 from './no.png'; @@ -50,8 +48,6 @@ </picture> {/if} -<img src={__IMPORTED_ASSET_0__} alt="svg test" /> - {#each images as image} {#if typeof image === 'string'} <img src={image.img.src} alt="opt-in test" width={image.img.w} height={image.img.h} /> diff --git a/packages/enhanced-img/test/preprocessor.spec.js b/packages/enhanced-img/test/preprocessor.spec.js index 5c05b11107b4..96d1b5740eb7 100644 --- a/packages/enhanced-img/test/preprocessor.spec.js +++ b/packages/enhanced-img/test/preprocessor.spec.js @@ -37,7 +37,7 @@ it('Image preprocess snapshot test', async () => { // Make imports readable const ouput = processed.code.replace(/import/g, '\n\timport'); - expect(ouput).toMatchFileSnapshot('./Output.svelte'); + await expect(ouput).toMatchFileSnapshot('./Output.svelte'); }); it('parses a minimized object', () => { diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index bd69a0b29525..a24de2d8ba70 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -22,6 +22,7 @@ "@sveltejs/adapter-static": "workspace:*", "@sveltejs/adapter-vercel": "workspace:*", "@sveltejs/amp": "workspace:*", + "@sveltejs/enhanced-img": "workspace:*", "@sveltejs/kit": "workspace:*", "@sveltejs/package": "workspace:*", "@sveltejs/vite-plugin-svelte": "^5.0.1", diff --git a/playgrounds/basic/src/routes/+page.svelte b/playgrounds/basic/src/routes/+page.svelte index a1c65230591f..b3872f2e7f2c 100644 --- a/playgrounds/basic/src/routes/+page.svelte +++ b/playgrounds/basic/src/routes/+page.svelte @@ -7,3 +7,9 @@ <h1>Welcome to SvelteKit</h1> 2 + 2 = {data.sum} + +<h2>Pages:</h2> + +<ul> + <li><a href="images">images</a></li> +</ul> diff --git a/playgrounds/basic/src/routes/about/+page.svelte b/playgrounds/basic/src/routes/about/+page.svelte deleted file mode 100644 index d73780a99efd..000000000000 --- a/playgrounds/basic/src/routes/about/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -<a href="/">home</a> diff --git a/playgrounds/basic/src/routes/images/+page.svelte b/playgrounds/basic/src/routes/images/+page.svelte new file mode 100644 index 000000000000..60bdbf3fd21c --- /dev/null +++ b/playgrounds/basic/src/routes/images/+page.svelte @@ -0,0 +1,11 @@ +<div><a href="/">home</a></div> +<br /> +<div> + <enhanced:img + src="./state-of-js-chart.png" + style="width:700px; height:auto" + alt="Svelte Collective" + /> +</div> +<br /> +<div><enhanced:img src="./svelte-logo.svg" alt="Svelte" /></div> diff --git a/playgrounds/basic/src/routes/images/state-of-js-chart.png b/playgrounds/basic/src/routes/images/state-of-js-chart.png new file mode 100644 index 0000000000000000000000000000000000000000..d0e4b3e6d80a921b31dc57ac94beeec88a63d32f GIT binary patch literal 190480 zcmeFZcQjqy`Y(<UEr_1zktoqyh%Q8L(K|u(va$6V5<~<M-PU{Wy@%+%_f3ep^{unH zOWyaKH^1+_zcJ1o<NkT}SXQ5FuKCQTKc6M!jgmAD78w>25)zKA%xhI7B=jaEq<fz+ z?gM8q>e<nN4Ki3&S{$ilh++#kh&9ueHCI$bV!FGIgo;dt^!pazNCcVu-}_R?j7azH znj)bfAq86@q5j@SLQ(>@cfYT|AM(GqsNaH+(19ZY;O}D^^4~3i>uD(eYKh*IcJE*N z_dWynA-z(Qkd+0tYNk$RX7*r9kn^Rzegtp=(?LcDjD$o&clU=ZtNQE!=xf?aUE5h( zQ9-~IWXERw4rF4+=5FV3_Z%c4cL8A6&dk}E#@)`=9xUK4O#Ax|0bu{`G&?QL?^~R0 zglV-E-_S^aoXlu=**MrZXhpDSXlR6--kA%izLxsCIdCLQYw7IlAi&P<=H|xc#?1zD zvS8=r=jUhV;9}?EVg>GC1$)>#8@sdGgP;EOkbgbrwHesd$;!dm3S>`n_grHWkc+c0 zE$v-L|Ni~;o@VY=|MX-J{(D%!0NL-Zuye9;u>bqnKvSW+vjT6d+|6utUR&7#Gz0n& z;pgBL`hEZZcIBTQ|7fZGPfJezmmGgK{o~UAY^nh^bCLkr0ew1){4-yFH~#bD-wlP> z?}q*dDgL7K@3R1*MX-d}|2=6USU1}nuYh@^uzIbm4r~FAyZa$`0xQP9w!l7enS1E$ z#uyTk7?SMkSL*J_JIQGAMAC#o%*ZIBWHjFiSn3)ZQGxk#!`%D*BcnihB7;G~qmAMC zt+kL{SdiPst+vsP*+>*`ph`jcY`zjaZeXB6oh2K&Z6uC_{O~_ssGlAnqe4Y^O)S|k z-Xr~I%ll_Y{(MxZ|9K~=K!aLkTyioT6dI)eaPj9$`M(&(e|z{(X5+t9`Y)CK{{`^B z68E2|rvFmuzf}4^S=ayS*8l3(|Hrx&a>jSr2nwIEeK)5dS#|8`QZUlyYfxP$pi}S3 zjYG*PD`|DLP8ZE3$;Dct#H4PeP}|zdoLLVx%g)Bm&12bhU*Dm#o+zp$Nfk22h<UD| z9$Fa1wunBu*Bordqm&e}^(&H<NnWtU`y%m(G{2}*u*yb`a*lU&W&7RbfFzI4lnHT+ zi(~S78?d6NQ(WK$FY`Lit1pW<84dbh_4ur{6~!m;b1<9dpj2*fa-f?Jo2CUcmp3`R zY+(w>jKlwwx<ksO%9$HijWvk;|8eH_Y2SiMK6n(GC3*Wmt+zrB6-2v|DouKw`yz#- z%D;Y^1TFXv8J$bX?@whDS6dqz0dF1>wK2AU#;hLwnPf=1(&Ee1%J#2=QMHL2A8O+4 zN28gevuc6>Z9J~}1^Z%3lRo#YPKAXsx)iWKu%gIUFMht*<RUFkJ<&=&S!}1%_~x-h zkaCuW4T}vWabHZ<q3QiR+ub^!4d3liuXqyWcn%TDxkgQ(+wO=|)pFHpb#<zGia0)W zw(d2J<*Osap#OgVnU??6cLXQ;9{QOy+IqY9fPXy)wa;7Vz#>IFA6U!3JED7(!u{Hv zLSuQuKNTDNdrf?Pv9d8hako~W-f4y$n;mbUVeyS+jAlw_3kzD<IJzA5v$v{lIoYX4 z6VRW3oGPv6P=6eedj0x^wN8AlT*5~Zc8ZdU>eb@;vwYdg8(ks28fP9KIU|4x*bJML zC<P)^RhaY{(Zk4$b#m1nOGhN<wjfwwo@;$18NNPx1;9AL)0||S)+r>V8kIaQdzJ`@ zexp5}VuJaFA}>fcCNacsz3lBMy)NTT{@vXFW&kFK`MR+6HoH~cf;OKu5y-u>n5&}p z<9s8Pnj$L=bwSrno^Nc1mr9{<?SuIEdl6_6Ay`5+LS5@^rv0WxD5A{Q1M&Cn)_D#q zo2o8kMNgsS&z2nByLG8ZjeNTkQ!TvqEu+C~cq<Gj*8#qyEvHS|zJpMo`~J0V5fQ^R zY%kf_Fq)nmoX(;zgpv=n@16HTBQGLyNckQs-usie{2iXW_kfv%34$(9yTj&m(G?li zF9=YfBw`QU(aYbr34XeV3VlUEa}d;~*GyNQFB3^qKg;xxmpGyIaR40A6a9v5QwLe} zb_V0^#hTaIV^k<qSVUxA;6$9Sb;P?y!m>_EEUefUy*xG~%7G!xb#bMZbWg(n{-4p4 zJ3sP^+V8cMad_&CiNWPKXgvBW)u<EjFD{QtDKp;NJeo>DvF|}NbZk?G?!RiKGIwT+ zNA*UWA^E#;pp$iqOSMh=J$eGOdmE!^8X6Mo7A{Cn3FT+AB>p2ndw+)i229T4;JGwY zH%I%WxDeH`nGgTXF!z*kla)G3BdfL-*3RKsEws>$r3D>f_ii+G<l(`|5-|Go$1eJ- z(eF!dIg(sC-ec#LcfRfyq()H?XaehxF#V~=_n)S%^J*_2x0E|pOFq)m!d&qL(Wa$X z6m__d=b^glm7NmJtnP!Fwf42W@h<0kGDOp#EW=vSF`6W}x9hr|BOBcszubL`MEd6U zI7Cq6o!vL;(lq|mlu&80LA$cHEg#cW>rjrG5`rHm(AQ$Z!`i`zIVzYtHE(yHmvt{K zd6q)U`UBPIRBB>?*1J#-H?pK!zhNYWXWOhnZ56^WkG@Fk-q!5>8WS43MUg9PJX zL;100&v39ZDO@`pg7pdsRSZ~Ys!(YTa9R2F(NU0<kO*1#y^&}RPKO*{72aL_A4?lC zigvJLAXUi;Dl$fs@GD}MfZsiQj70*dN*4?hqiMr@o3WOR2OR&;3H$fEhy(9ZGSX3< zLIZ@w40#z!zbWoNLI5yl)h~x+2^2Fq;+TuZGb&eY+=Lcsv9R6QO3`z})q82301vm( zWQP7pKl>-Z9L3i*pyg_51eBi?{1h|QfA)Kh>M#i68pFg6P3p}IV7w(@z2rO$)b`N# zp4}^698FS4XD9S1EjM28+vXuD^rF_GrGm9*nduH*S`#xQj0-)xE}7!fm}1Mj0umE{ zhV2g@p-wE&+vU*ukN!m3rt9K;e_s%(q2P`yP}|;K$&i+x{(5>Z(ER@2J!#jy=^4g6 zzuZSg0g3vFbrgEF+;m{D+qXCvy{L(|^w_X89{ZWR8ldU_FA@Q=<W7AjLMXXsVPS== z?K2H>52w8dkxzt7DZ3z2bY=4a)wyj{etxj#yTObsNs%BhaR6=;7F(uFROx=91oVg3 zVTFFL?md~FLRAy|Nn2KjU^iMZ${)JoKm^6w{sWrQJ~_FT-p6v67@CqZdX#OCE`cw6 zVRCP4(QK6cg>P=AyiUS9&(d1MSS|_4{vwzlPiDAH62ZX<b<jBOeFx;f#v$=uHrOp3 zTNmvQ7kSwSAl7~CBq$$mNezZ6jOmsBzT#i107MqkW{(Z10<UXC@!4-x;76`=%)s-v zDzKEIoPJ5S3=@5jOZi|K#oCs0^k^s;DGGO=g0u?j59VyU!pN(~A$i#hvemc4@0!vG zsDnZ<@-`mBIG{XC{);3<!f2=GS9<%Cf+R~HZg?v;l`S!T&&U4A7l9H-xwl6jpHwKs z?R`j!l|){mP3v-<IS6c-JV3HyrKd#Z8rh`(L#E#M-;D^a8K>fDfc8kQl$?O42kkGa zVLx=t*TZ~3KK5#Ax<pO6b}F<_j7A6}?@j}Cd=S~&vioajwY9=3mUtNF82)wTQI|6E z_X-mL#-4J|to@U*|JwI|1&E73=TOT;KWXXSg(`Sd^Dhl0$^eK@Djr7zI!X%d`;ge& zo(4^JRA|Xz$K?P16q@BQ)H2-FuuOs(yMQ*qvTo{T^gB)fJp~?88-_7=4@E@$PW&kt zF`AnHryBfQB{~EmO&RN_2ipk0YKv{tyYM^tfq27kN1Bg($mgDT`}hvtei%)Z@K^SX znCA_}w{KhpY1q_Ev6ob!{0k4=z5b7?Z@F^xs;g^~#Mst=?h~vz<h^G~Iqs_B-J3f8 z>L5qiZ}a6H@p^dRhH}Gppt(fRA|MKk;DN6{r)gJOHM514+a;{DHQ!{CUUz|7d7?Y4 zwH4{waVP0SHq6eyJuHb>()Z;<K($b$t;YUCn1@}cOd5=m$pSo?uQ6B0Q~hpaD>qnk zXTfoSj?CV-u7F^86z)f4*P}nu<HrBtlknGT^=EDx*|}Ane%zRB?ILRi+&T=}<;~^| z<u4P03tAh}BF_)@#>&y?<cO9ID8i@&KNz-n+Q}3eR#U9?CM(Kc?ba??Z63%T-=z9g zRh7NGI3BNa-dUFFDE2<_=X7p=^#d?`xD8TkeMGrEkx%DYj;?b_ov(j9hIrh3%j+T` zWL^D~b3w~2d9&%qb$9~VaK1gXGxg{AjMhiJ#L*ry|Bn?G%fom;Iq@Omb@{+!HlvGJ z&7!$?wIx9(g=#rptg5fU8|>qAC-c>H7r(Bz42W2D)mbkPS7*_zZdOmOZ{+1WLcoA> zSlx$%H=bRWqION)cJX}m%KEM3j?|V7eEuRrV;5F2Km-Ro<P&IrQf8LXaQ(jtA>wAu zAQ?e5c#u_M*cf;p4`M0P=xv|+P{H?|46|y6fUwVL)RVz+e2k_=>6bx|+z{d;?EAji z%uD*U9`~k-hT}!5W8Gj^jmOs)*sN5EQ7_9ybE2ecXPS?5Qw>$Wn`rE=Ur7XcZh2T| zoakKtB6|Mq(5<izaXK&Pd3q#$dA8)I@ok#I0(VxC+WWxYc6c$E&vIZv>E{^lN%yqY zEn^@y&jQguYGgrS8MZpls96-RTfG0HiB1|?p}XMibT~kDxpbRh*=sRukP)OPXyXVE zxul=YjmsZ-zX$b7Q*N&(MERV_(30%27tgDRRgA`GznD(SZfNBwa&cYxG5VP!E$i;L znMa2Jms&X{eN1`J&^@(Kz>+YoR+aY(lBz+~r5f2bN(m^%oqU&g;QWX*wd4a$wNxRW zS9nxHn3}U+i7pR1@ED~}kLT#(*p_H&zJ|O_6)TD#eeSZIRnbQ6cl~@y8Z^tkvrZvx zqnzSvxVS*9j((?wztg5cz0h$fb5D~m`J3s%InG3gR-C??bz~)Gj9ip$%Ds>a6>aBU z5Gqu(6%pvP!CuN~%DND;df&>?1;xLX_UCM7uJ0o&)!Z~zauVw>i|-aeMV(vJ<hoZM z(48{{s+nxe-1dbPN-n8Bk@N8;ziiSe9QOtqCdl-xMqPoXc(Qj55OS7p*tPjSx3u~V z8b)#`2e%0hM6L$?BaF+{sOE~~lAWK|`Ks8Be##whPm)WJNw0KYeGI3Vc`HNB>r^2T zb}-&uGuln9hq~=|i{LXGI?NvQh)g$m{Qy<y1!xUYWk37A!PPo{5j2&Q&0}_n!aBsj zofDo$(1~SjHK=!%M#wO1{WtwJmkRR4M|^(57B8Q9h`8N2CB8IE(GVaIqv5%mhUflg z<sI^$(1yNaf_!fR`!p;`lQNz#bwFB9_Y(>YxV?sSb!*yNvI&ddBBf3gs3Z!w6_n!V zY1e0#`C22A(}^8cLkO;C2tK)AdbpVKz4`68qC(z#?jL%GZ@3Hv7+RgJWEZN}8hcs9 zxl6Wq2G4u8dP&|(=4l5eVqy4xnBZ7Fw${5izLI3+t?}%NZ4p$cri{?H<zDI_9dN5l zBh>lVj8&oU4zwld8=YcNw%g`H>M6BQPNxL8oopSZIn1e_$kV%#XbxC}`#kBNQKgrQ znG9Pz2$JjGHrJ&cbsS;%yJ?SgHUHz{wKZbS%)J+O8sO1w@NU-V(BmzXUTm!4&9WF) z>q^f7MT&b^y}7j)4;8vE?0)`fon2pY-ffR>!v7N(B_*j=e0evil|kO!$@XNo#Hf}D z=e!_PL^j3GZ-XkPbfJfd5|id38DJ()@B5$4*Y4*jT-2m*1$EdApzPPfr^ml#>romK zZYG%fyTxoL2b#%e(%~y}ss>Q&q2McvmZoeIZlm29ENRpUuZUut>4NDl6_tcsQuj)) z!nu>h+uCufr{XGN%^h~lOA;yu@kT3JDEp<u`dM9rjSsQuhLaZ3F`t~MKRK8hKUnZc zP?a=WE7I8AD>Lt8F^Mu}vV~SaE|00RGv*HGvOf?#5l4M&fphR>R?hwP>Q4yvRUqb` z%#nyc&4H$=*Xa%(nT=aYJQ~ywfygZqG5IK?*=jWedyzwexRE}GAU?FsCo3aw|KVya z(LdxgdA;Hh;N;QK%#S!hvmVPR)ace^OIDh#G#eYcXRMU&!keT#vCu^b*YqQCCuL2F zxIDIIFCz42lKxt)nOMC|HI!-9)XdPW>6c3^pM%Xk5W7^`2meL(u>n2YUjhgiQgnk8 z_$<me8m&3|Q=iF-<LrsvUd!WA>ng-o^1}^%7_2V#1pM0se?98}6nK-i{p_*}`Lxap zeN1_w>Q^1xK{9uVJ%0|GG*svs(~B%Y(FHe8X(M9yLJ+R<Ktz%_SOU3~z`fP)HigTA zU3RgdDq~#{Huu9+c^UCDn3`aIayX7Jm?-Dw=8D?+=L(<m(FA`30$~7gNg#xW+Juty zD(9=x<>o4<5Q-87N2FwYy*x1Y_wm23X9T6}MDuKIIA5I_m>A#mj&D%x9r4u$`)JqN z8b*AhzxiU=dXZp0Xdo3qE&75KUhh8MRh{pK7kZIJO)Z>GkZnVL`JGTH#l65`A1c9Q z@ZDrxI=gZ8ktGVKlf{0AM)VcaUP-3mGGcE!HNSf^v0@uf^o!V*+Irghi`ERrNLIq~ z$@$#zNbdOsm#a6^_x#=RMt_R`?ezdeIgm%Wax0A$Nz~XFu&+}WfJm5E_Au?txV&#T zBP+;=rn$+De&R#MY7hIhUA@1#RhepQHmhK2V~KXOmSL;IJ?2%;f8JCU?Rsa)!A7T& zgKO&NmphV|YjJK|iJTH-ikrQd-Adkyem56!1Ex=WcOp!C;mlg4*u|BkM+?`ftwVYU zon<@TeCnRLfw-Z)bVikocxs!+7PsL$8~Dhm3zBVWFpl+8O8&Y}v{DaLX*}TTtTBa~ z9^6IsPUdO7gkCm^{z0`t?R&CIP}V&0i*{XKZEN>JNQ=9Ra<a8FM$-$Tmw+8Vc#0yo zOi3|l5&Och*<Gv-`{E730UZv=h?*-E5VcY+sBmd}Uio;wM(8CGpOS6DyP;aTgPV$X z#$=+NNRr{#kp*22zd}65V;60eZt7{Sl=Nz?ap`V^B7X{mA1G}oE#4n1|3Hr8aq9c% zY0zoTwnqQsz5<M^!W7nzQ|7HkOiSKEex9U~p(K-E_0#1{8xb5t$151{b<7&9Ca{1{ ztO*lSge|nx-Y)cZ&y1OO<kP4cj+ttXjMVNtZzMUT$&XKLaKmPAMIjvv@CQ6UZ(BwX zI{|_J*^CO}6X}<iNu=aVGZ7Gxi9F4e2{tmN{ZWfY&Ay1rmQO+!gh4NC)YB%Ox6+(4 z->h^pH#ow=58$;b*5TR)%l@d!id8$9O&X-uF*fp@N17@s0>1VP#WMnup>WyH&mO-^ z7$$g@yLlTbTZDPDa-!DYxIwVXUnA9pL;6XksV-HeJ|k8UpXIgR(KYhgpzb#(3pOQ3 zk#OmV)Wu96hN<yty(!<5B+MqbIpW(`PEXF_X>jn;Xk_UkD24f%pLccFGU`9Bidfq& z>HwIa<<%Yv@#aSAlJ!}|T5F>uBt`YS2+IYwpgQ14o|iYcn%zI0r*yAB=Pe}gH7)iK z=@2EmLb~3yAFN-*^H^P1(Ug0ODSoi>Y*Sc)JN4$|&@QM!w`NziJ3KWqZX4|)7&kSm zhVrU_2}jy5xwb)md9YpG_rAM?P$~Fe9RoUY)3J!|ymh3J$PMC097=!HV7aG_|Fa%! zbGTC`dJ$pTNf6shOMqQUCF~)`ZNW+c*&c?lbN=uM%LJ9;Mz4fsIYBSFQ~k!G7>28G z9yLjQ|9R<Fo3C3;5@f@_f&<qql&a@^qPR^|W!52HETtLWlgge;Vi9M(qpKKr=~Adt zPJ8h#8trG{lx^h3&KQkBV)W7VJdE$f($eJ-c)c{Oa)T|ufRP9Gcxx;tYtP`z9-(^R z4%OFbh{z=)!DNY!ti4mn^C?+gd#I$K8?}08mFa5Gi@<hi5xGdAd~bRkeE)e7mo8e! zXOgBNjhZU6#T<*JpU1KbFQ38iN$!a}yvf{$`pA3;R!q~Y-PMa)U6P0kA2hp~X{HeU za7KO2$hTWI>}+_iid6rC)iK$_$s*IWn0(wKmF{6{Zv1gX-PzO8{rw;CR*(4<4xP}$ z34t#OIx?uxWPypycfBG}8cp68K|v8o%+VngZzh@Oet7CJUGCP3{t#S22hx{p&0ZGe zL)~or_i-?|F#CrM8mf#w4L*%^nN9Weq?_8HB1?3IPYIhWLD$=+tF2W&aG5DcrutB& z{`l~uYAkhZ4P-x-R1f<BK7@LQ5D}5G$96L%6Y|>5DKjYPXPqCes@7KoGTJ4+8>?9T zAuHdho30Yc=(vKq!e8<_UyXs7d_n~Ovs~-=qF2Ob&nURc3XTjpDSU132Ge{I81w0v zNYGW`Gt+ha?KNDm!R?mQpxG4?%QjzNN4siswBD;wZ5<mM=f`rMEf+Jf?1g|7*8W0h zAiNivuU_sh`pKpKngRon!Dqr4AT8p~iCn#IuiV0G{!a9;_@<o53C>5`Z>zoxazVIJ z<ig!vfWm)`v?!W(++TGhv=|SAEcFW^{H_txxw&S9bC+R)S!2a53TdfVO>L0D=JGdj zic1d5$?KzmK~-25Lxvd(^%Vt-320E3_eJXI(XpWYkD?jD;qh6DGV1&!HL3jNi)BxZ z*78?#SR3=K*D3%lWbV(0J%6^Z%Ub;%2hHxaJ=S;gY->fkU)tZ?#RYBV80FjjEUs`V zGQ$m62-ylzM7}v}Z)zTLKFVTkQ?#e&eYVK}GrwJ2C&kB(4aV8C;^55N7l=5!mMpYv z&*Hy)2ibUn?=HyPZ`x&=E1rLJvU!7`)=;+xLJX_;^e?d&OPG2jn^5qli3yI4dhWga zkXUYix2}o$e4h`-x>_ZEe*QUZ<t!<aEb~F1Hwp{ZAj;b3!XA#G2Jo$(L~K2@7@b5d zKcE_C?$>sJPxtg_S2J8gor)5(sa|-2jritbLpUsXI&cr+u0~hCn|E`bxWsASh|Khd zPxBCi1et^lq|H73#<k}lB#1wI){jq*wf}2%-Ot2jjHVBnFWO=&JY7IGZn#<YedM13 z8GC(oN*yCB`^{U*%dJR#md9tEHj(XPHbqObx6HWy@=MUB26@$qM`&D0_UNj)1HQz; zhDV_wDwO4|9uFwPzZ^O3)Ai~6zDX1U$u85sPdSE*zt~84dauiuZDX^3YpIsI+|RmM z$5(@o+T&-5Ni}`YMM2+&3jrvhwt&}T<z<<XR)JP`#bbz~zWscaHn{jy%2uIAtt`V8 zhG~kfdQn05E{P9Qy?9nX1y=pT4{^fRmy-KMVX46pKU?V}P$>1K2iu@QnRrUDtMG^E z7I&Nh&A0tQ&8=jz{iMp1Q`2<|AyF3j9x$poI$KARt@h_X_R;kGm#CX$8ZCRtBu>BN zKh1kx9-uqd_GHy^Gc83|KlwmcA=US(Rew!0ldNC`-H)xPVDh<Kv(Hg(KrGBld8y0F z2!5>PEAQPrTTPXl(DCyrLw0*;g_H4+oAkn+(XR=7z1(cq&yzlbUnO!jZR9t88Fuv% z<+CGBG|YnSgzOZboHnI@zWl3qrz*@v9;|nKXfbT4I!R`5ENe2z_cV-bR0pH~DfyVj zN3@aVO9dh<*`@qv9u&eA*u+fni(hkSZKn6rgYi;S<A!i>P}Up?NygV%V{vH0$Tc!Z z1`Ejh@&wL%0``>*q_F8?rZ3-lqzLN?By#0PEZWpR)T7?zdz(0;;3#Q0p5wx5t=$?R zgtzDCb(Wm<q{AG&*8Nlet7S@)cXdFjxlI}~?}b|m;GlO=lq4;&^Wi3r?{;257!1}k zxFE%k;rfbbH#y57GH^V<%QIqjO)>esNjFrxMSH|x7BNN};hm3i3X3$&&3BTtNq=Eu zUK!+)&mL+iQAp|z$KC3LGgx_ew*%gL{}F1Kn*{9MKGC32)@NgB5r{HqvZ<vdUg#Ex z(m#<h?<CZ4VQ12ZlfP~P8&cOHlv6}<Ux%#NkinSzj;b!4&Wb-nBFrn7n3hIAYQ{Kr zt0a_io{dwwfGNj+Jlp6e2&~$6=aavEWm;Va_2X0iQTgjywckd&Rp10RE*mN+z==I( z7vn<zW6Ef?sEFJD>>FCt+G|Cl++uk1Rd`QGY_X8m_{5B7A87=)f2~fM&*hk}ZiQpg zj%EkbBBS5wm{MbpNbA*?LS|Q09amBa5Q?;tPCcd7E|QLCrsOKl9zkj?rJE;oC+*iu z06do57<g701e9@e?zvr?>w?PgPwb6^qJ$YwDl*XiwDQ(oFDHHR$-(+yI|D9=7emRz zxBq5iW&%pu8};Z&`x9X2b?gX>6Yn_$>pYyiD#RaapKUQHeDFZK5mMdcA#t__zN%_! zK}ZvVQ2EgPQfeER4$Q-(p__I!b6qwh=1+LAA6Kri6<c{$_Fe*+JMyBR3A2TDtTvYa zszK5o^#o{>Fg_pul5~Ex-zx84qSLVeSuajWBHdaf;Rr3Nmy0r#8T^7pR7^V^f1XtB zCQt+F$~{)7qhZv~XrOq?>yeLV`#rq-_&i<lxR=54ohHn+d2KF^8TL3F6?(mA?B-oG zS&Vn-MiL>+?7bPIaBOz6vFL@DO)1EV;KFY5Xl4=rNE0=C2|G{HSs&1XrWGf%SeeXK z+a*j^f?8thiJ1%)O@}T@u4B(Hd5g)gik)n*?<ZN{UZ<>{B{zQXMEA0$>{@`1U^QJJ zetf?US3Ri=avfiPwNK)P(WKMpIeEnCx}Uq(@7u$ywfmags98n!m&~%yuT2l2X4$CG z?CI}jmu|I~pLyb0=KA4Q$q=LXOin|9?Az>I*N`1|;E_6!M8odcRjYc2I(EHr8w3>^ zK9$mb>G4AB^=}VR=(Sk$nGi6Epu$Q9H%mV^?V5PmI(uGp#Dc1iS7Lu1nby98vadwr zoRswRojF9LX%vqp;qGwmQLQNrCslsrGMAAL#MV`q*hGU0{hWr7xU(pLCkv*f;H<GP z<nOP9Btj?ZZ%kA7)0aZ}9ep3oz9Yu|$$#(~e6eDsNw$26-Zd3`1t>VHUC+>2dpIpR zyHXjyP>S;$R;pj@SN9_`+$O?Qw_jcY?w7$T74A<GMa=4^aHayx?JRM3n8QiK)t43V zT*!45gb%9K7;s_;U3eLK6kK=tUwb&2Wh$8*<uBzAw2YJU@$FG*oD^hoKdE8rmbNeh zjMpH-^YDncnpn`M#2ajInVib!mBh=x7V)kIWx0nazQy1Pzm_QsFqXppe9G~v48!8Z zum@SUlI7Zt+Rdgx=44F@KLyn5-+ev#01?$sZ|<HRNk(5%IXy<px6WTDVl6Nu?9ae4 z-5N0KM_ph!FsHv#wtr}btGZt0k^k<7?7khS^0|v1%06v9vuZLHB~KH}Yihw-Zee$C zJ$dk1$mMFGUw7RVRUY0SzC4XP>VU4ld6;tZEU3g0+8(2+nWL?3O5zz#HYFWTI8^$g zeYVTI66xr0HCJ6{AT!3pWomAr#Utd^*G{-fN}SW%pVf(^h5Q6I3Aof_@;3KU%bp*z z_fN&Zm&0sWNg|oFK<48tsiMPr2E^`gdOH&Pg0?A`C-$HgmEdWzVYceye1idTndSr! zwp*PH)G8|k3cu((WEws8c_v<_GECzdrZhj-89Bot@3jfLUyj|e*<)Yo<=%lWY<Wck z>ZX5%NZ>$*8!=%fo>9|KUeL)z)2Enc?!Kj{UK{M*5+~$tU)MKI*f4SiwPm=?*&`Ws zIug)YDcsdCL8?8G!i2@zCOWOlO=K>*nBXqH2QbA8Y%P-ZhUs5@p7%>#c#14Ma*l^d zOF11=UmkFGpjhGBzACXuO{*rYJjE9!+!Z{_)Dr)sT`Z@QUcM+X|M0twM*R=)iQz=& z_t-Ybw28ZLrg5{icwM|!V{AVp)e0^Zu*S?c=58FhzvOotX?_NqsHm&rE=8_C(p#xH z2tpMmHw@<YU3nl$7&<N)$bTBX3+clVvz=;=cE8ORfmiQgr5FZt)^b;&fJ%ZDos^SX z#IY=4)2zx?ANd`87}cvnyt^{6ZIW3NwZ<!e&{Sde<5VTqlJAwU0pabjzoIMk%k%2k zD(6Ft!xFio&S}sL14~#D{>iO;av(>8oLQ&|zR`TnB1bU`#9%l|FzQR?a?)U6VH^EO z3?BG~)xn2CDm;;4@B@5lt+{bsh7Uh!Xs!E;o=oEzMcn!xL-_vlfiQ-jERSa%TvZUy zYeY9VThlBM=@Ql6p(8pzK0nV@HhMEx)f;$m8=zinEqe$#e;@Q9IXmH*a_Sy-`h?lV zyit~e(q~fkaLxTwO6j#mN%@Bijjtj03w4FcPW|<n)wyLrih1mbI?7#&SqUTWEJfJg zZGI|@N2})AXGY9>DX$Hy=5pUm>2|AAek)NXh7<IW7evJal36UXVmKjxDP^!%lj#}k zwM{-}hf}Q<IgH&j`RwO%O0_DX?nxAyFaM8lXHB?;qCIgm;IDg?=RYT|6H*=+^o7`9 ziuQVP%U`EwDhwR%X;p&kE7KBTwbh}Tw`~VmX_`2p3Cz{+)8=x*z1drGvDPu)%V|mT zYIKUCR^PkIpLum{HY;%dmc5{;F(T#0*df(@Ed8>JkZY}beup^%(ZH@#Gc+Q3n%TCX zSF@YVdgOq7`k@V5n5isQcpul5C<(LtWLkh3CbL{@#Ikxr@?1w^KI!|}+scc~ptDi? zZjtZN)EKOzI1JXd9pcM_gBrRsk+i<gy5{TdC86~g1Z&ZY6nv#K@a_A`#ZbJ!t3lWM z^a^2qyTn96a#J~tVO)=8?tfNaC~f(DE|Ll2WX>cvXrrqTve4odL(j5VvIZD>bR|2U z=ndZRgz*q65l*F<Dy#)(z^-ot{&@k}<UjQvpeXlM44&hXZ&Aw|RH$9oBQB)}mraS< zMp%%uO-LT+MDoujwCRBilltQr4ItVtGx313dv-5jkfm%BN5@<~ML5+A4auZv<c8=% zvoeruiEg(i@dUrowUQfeYodvIWmz;wh;jjIn$++=^Da-Xf9t>Sjs4bwgau4CY&4!L zZ#N$O<mxg-(1xY_`3^Q|>(3S45zyP^*V!sXSetN<u&j3p0!*O;z8h{k0%D6^IFm=s zcF^s74}87H?~KBjzEE(7#j+VGuPah4E!HV&{8%TzZ7TnDaC35`Uu+zoN;pKp?VH1c z>5J$ye*R`-DUQpd_hL_X_{|A8nL^uPvB3xQ{3EU$=S`{B`A93Zdj9OV^kZJN%|Y8l zH0V<)Wnz>zoNZNI9zWW({wRr1*dk4Q!kjLQqp^9s6%0h|hx8FP?Jgg%b~MZ1a@vqu zH$}ed+*WjrQJpwR7xwf7tUQ|*kSJxY&Ydn@vewv}<=3;#`CQPc(*b$WJm?=dF5JjB z`fX##NLfDCesX0!>LaFT_K6L>Wp8)5QJRR6;?#<F1$h2J{irk@lX2tc!l&5b(ztxO z0q^|1l#Q_rmPj>PtfH7EG7`*+9X1bUt1R|qV-$fja;Cw&g*CZ}c4d>vTDYzV_K%pd zWI}Y@6yt}#z+^UUx%j@{PfnZ~L=+N7<P)8>tTYPTNMIjJ)h9Bgf$ESkqRF!=GmqlV z0^K|Xszax!P|r8(`{)+n7cIONrvp{qy*$N<pwgu*>uOzVN2tO;Up3QaF-AU*8^xsH zg4)u^o@HjHfVbgt@qh-zC)EdhB3PhPTRm~SM%l&0=<l{T7ZZY($rSH4SLh7y=-s-& z()vb-oZ@{HT#2<V`$=wE*;+mE#$Tt|o4%a49;>O}Wl#VXAz+9xqKpJoDH&anlvLto zg^o%(w98Eh&W59WKMwHWg;IB=>@qW2jSW}pP1{VoQu;O6II2TvXvJn3NSUNBR4EO| z%sxvs+b6IPw?()N^$8HT!x$WzJp5V7HzhuP!r%N9FI1?AWc@_WsEcv~5Ky^gyVAjH zFGx)hwLz;7)DT}nz{V|N-*ooe;i6HE$7}6v@fV%tX5TXk0SBkdSnB7h?-B*tjvBpB zSER{!vJ+xUN!@QxuLRR^s5Br84tml9w(_DPh*!+}`GhCkTDRec6U}ef|3nU$qS(qM zwXUALN;u<%z%?QDCuY0J!LOI?NQ&STxz1=d+(kv--7WWZcVjOHp|(_l;2fGkL6Xmh zN!qDh;wmI^jy>_kA9;`$((MQz*IIm2HorMb6&=zW3{YtH15dhDKK$xKSE<2|y8~+0 zAq-7RK+9qgYIZneGHCMFxZJ_*71COaidcVvku6-*x5<k4lF+^Kz60q`xB(gnQtN4L zSmm&X+6QFWwri@|a=Rpkm2U-C+C86eHyW-kaoO0x=^sI}+Tb2jNMu5`89dZO)2J2( z0sW2`y`DiWtU?y7r)G*<n(TS>tGCy_BM`%-r(Hfh4w<2CN&J-~>c+@ofiZ=A<0JU5 z%m#)%1DV1?5J81+p<-<(Za4e&T%bLRwTP(Pp?vwZa?n1mdU;c4Omc->TSCcA>@n=6 zKDFMwpx+JFVZ-XQ1^e70O`F*wu~0LvslA0I8g!?l(Gs&?0CQT<T%EMsgQ3wCTd&<< z=s|v4qyDV;L}{ty!?wf`iy?!_y$*(=wc_bd_KU80WhoBxZ-SlzN*BTh%Gd8a)m&3= zpBY`u6T2zm>T6BLieZgKs3)L-gWm+8z9R2D7k*QxtrjD>J3om}BG6~$I7QRyaz*6> zA7q^sIh{qE?h3LlK`~LGr#&>3cM`UsELL3aCAU1tI^`z~Uy8G>@0ZbHzYcT1Ic8Iw zN?UrfwU<%=lvjKt8XKF}FR!JR2MK@4Tbx<9w*a|vf-6p52+A9j{m6Dy3W&by&%I`J z^&Ihg#4jiYscR`4anpRRB2=TKs`HeU`_aD=w2-rr;KNbwZNR7>H5<{xtHW0|*!0uy zhp`HxQpVuGn##_N;|EorFPVCR)r9b$(_EK8?zKL1N6u*)d2d0jVVk0yK&vL*LjRIb z9sxH7)s{B2R#pIklV|I%0ukx%<*LQelhdP#nV{UZtD8){Doey8&!h2sh338#a6%@v zJYF-osJM(9_WP1IjGr~7L~Djnp)l9MoDaFYR?|nlL{AQGWH4Izh5Rl)-B+qn&^|^1 z>9id$ZSqrYK_mDS^Y<bOL|ZQ1zFh4Gko^r%`wc-0kY7G7w>v)UCYcuaE2(xlzH$-u zV5(<F=d!{j^(#hGf6Q|w!fqYZZ#CPMaXGwR@DqJJbf`=+zqG8~tDp@^+oAe5-)ZdL z@xt^Q&FQSRzVy$Jp{_ZDFaVT82*^SU4O-MZsJV3ve#Fg9QpToV5oA7WU_SKC=Bcf0 ziEL)#@fL$4&Q0y03t&CuNtN(*KfG$ED2bn@bVv9TqvR-2N!cdqp^*##SO-bT-gzKq zeWbU?!Y;t1b+3u0H>Y0XZ4}(|cH%PZfv3OoWa8i&h})y$nd&(?P)1o%<l+M@Mxub$ z3I?0D+6-WiJ^lGW1sf+^Uf*pCpoaWD4P5XcE1))7FNd==gm+fGV$S@fDWx0cNim># zT@^}^^ab(~LV}@oL!pmgO)wCT2lYc#+^<{7IOawe!2DV(+Xid-E|0+T3(pVimozcl zV7eb0_Xyn2HmBkXG@l#WH*}nT(J8cAD@fKf8$bc^LWXv$NHt3z$=lu+e&&z1$s)7S zHaFiN_r>|#*TVm-;6)>ab-lzg<u`mWox4JrL)d#=@L5({qZ)upEO9X{PPfgs+6y55 zu|6i~R>mk=A-{$|kFZ)>@W=q>{{&}usAjI9|E}82f9mz)CgM22!V6_T5Kgap)5On1 zzqC{@edngHToN{OyDL!(8k4Z<H|Zwkm=d}$F~aSbO2Prwy2OlVpnoZyf?A$x4tijG z*ukOv$$sJ5@X})pQZT)brI|E?IuA`Q<e_$ETAbp1DQ*hb2A}5Nwt+e4@{%ICFpyE& zOgt)g?k5lwLWB8i<nWTlqPcSV6vGNnMiToI$2u$?DM~n*Z~scjmyasPWxy%;Rz~6u zHu8)plm`-o!PWuN;oA|Vr8g=^7)0t=|3Ke<%Cxa;ssv<nGt{UJ#B)}~CZGlD28Bfd zygFZHEn^^1Q>GFMe@4<{aJ$D_4I0-z&&L^?GyO>g(b6;@^MIf42?u9u@=d?A+7@Dp z7bRWmd;E;!B<p?voa!Z8`Z{mQxvP0<JAlF%Cu?ixBWd5d2ccls=ZJ_^FV@7qJiTOP zHOzK;Oh&KoDEXO4R=(1uo$R~qkv>{JU6admI(h3uyTT(|%0U!RrL1R5(6kP%<mbHS zj~&Q{<7S(<sWsjxXe`W*j>9#Tzu2t|6OOhRylPjsK&*Nr&Nmki%RybnA3Ws-?WdxZ zuRX;3zKY-=u1`tHm<JN^fFM-U?{tCAdZwyU$Zf+j$Z&aZZmP(|j{T$g>I2dKYXvYz zE4l>jK?<!tYcvTPsW`#<kdYE$?!Y)3<}N6N`R%T2jb%FD(*lhmL1P<|HMEYaGrx)K zh7EN@iBL75@Uz)5nu76mWdOhk7vG|>_w13K$%n6<N2yG<B<`gKt-(182I&>W;d*?E z*>#ShHF9pzZ%SW*fGR|}W|nP2z(k`3_aI(ftg(ROGw<NGc~oqbJ03ou0jdmpvi^L` zW)(#vw%^_M!(*bK^;%T8?L!ev2K-(Hh1-x0!ljWE>&g~GpcKwbxY~G1kx?Rizu$L` z&>e4QS|dIpKcjpZZ%lO!X61+oF*J=IpWM^0)N%GAd|`pI|FoT&Oj%d`?a!;-dC|PQ z#nnK0tzvJrdDflW$DT_jLdZtXTx;P0;aGNpr`Zz0tiH}KePCUZ(E^jC1)q*1yVuKR zC?>DYZa*z{82s2fqbYu?jMWtLT&(!X%8$r4y?u7r2`n{#|GmnkeDP4Ku-B{UmS*Fa zy^@ar(6FJ9NkZ7u|E$r-FNZ4Artf-GSWC6&kz;j56zN$Gxf>gRSQ@o?3%>3P8+V2W z_luKXm5)e$5-Z+*u>9_^5bJ@6-w9(U;-v`Pl~7m%ok62ZYz{lDv{Tp-h(9j3sp*tC zUM2sNSbUg*D(9o~<L!DJT37v1TrN2Gi>~=BJem^&m$I7w8K7h0gnarOiUp>m-i4Zd z$F!|DUn`te&5T3SWGZ_Yis*5C>As0tY{32zgIlWqrA--t{Z}BYsW?Tpd4j6TsL9is zw3P2#IbZQgf*~(Yh)s`2a{f^prd+0>(WgMWB2J?s84<ZdN!2IsLL_W|4pCIBGqEaC zIW^3F<c9Q%xUM`%7WC5*GHq2WBsuw1{aJ$pyNSQq7_oh<u^;ZrM+gtPl^Se#!~?ky z0DL1S$O2`9o1Nm0CVSm0kcU#MROjAK^p+p=K_r)?stJ7YIy|18S0>NPcBU%o5{Kd` zXk+N)3n1#E^3m^ccXTpc5~^!A*md(e?UEOoJc50_k6)YD(;k>hQO@Z^3+D{$zn=bR zBromHYQD*5;xIdM9eaHC*57S#oA|lj)Prb7WAC52{0)=)tABs<fiSZdJ_9O-^^q+! z2li7{OfN`p)wRnk2^Z@;v?T4Q*!Am_c0_(qh%+6e0HBZ=Bx4<|oyloS=#u`eQ9D;( zLZuWKrca;Ypr~E1>S#qJtTXnSh(U=3f^tBRt^4WhDs|oZxeyw(fRo*DQ7v~)1yjD= z`a_VbY0_PY`5yf)QxC9S{e`Eb!43VpIPT!n;_(*#fYtSx509E!tO4oZwln0((<luy zmy!`pSoSs>TiBuQfev9nHNJ~$_`D&M)uT`5diPvvzY`@uq>Q~1(WnKBdO$xo`&d{o zTg$(?TPJjZ(jQS&PJdjvAu3C4w3jyy+19SM4T`sYH<9>*oOHsT)Ue0+*3o+cy}3)o zZ*#pzZ|aQ{C~;sB1%&vOI{(gaf{We#fc`<XU_3*dQ17oc2y?|6li5iTn&L9k*k=tX zwS^;EzT1u889}$bfzEuZFsLrOujfhpeFf``PMtcTrg>G?o58SBtM$+Rx=B9P%G(w{ zS7iNbkM=2_&UN!tbYp#f^dw^{d=0`d8iL(eUDv2QL2U$7E)_{m{sDB0ZDN!?-Yks6 zwGJiH$Ho@b`IO%d-(b&sb7;-9ef)^Pzjijl-ND-$LjDy1lQ_HIda@>v>TXZtSnpRo z#<tozI&nS~MHYcP4=21b9sJU$Gp<_r+HEBQu1OM}uZX-b2?~5)qFWr>U`Tj}!NVvs zwXs?UojY5pVTH9(7o)lfZ5WihCpxF*uuVaD7pm-$538Bt5p<AgnmcR%UDUKsrZ0sx zGl>}<1Y=a8#rE%~ZtsS33wZ9>n51WV?0(qau!C!Mwk3Bb>&1<d_Og=ScOMT<kPI<F z<JqNXaf6Bzhwz6}LAB1A*q%bbDvX?YCl5~flb`rllO1S~778KS3k0XR#c2=LrMCL# zD_{25kUah<>&7cvvRXvc{;&T9fLDUi6yp?HFbqw69Ord;Tz?Q~TP#K}w?wcMRb2#B zu;t@Qy$cg*BChR06J_)#d!tJ7S|mbMsC=pJcZqieqlfMry~!c;;rsb7eAc#;c}#O0 zcVoEg7vLMEKLidXii<9uWubshDThRUXjm>(r8>wTh)GtPuE}*;PVcQc;V8>r??2Nh zcy@g7lbad&dLy+nH(~thF;CCcDTEf<xG|_9wrnSfig~B#mibYv2Mulw%=hiD!yI;x zp0Gk%pIA?W3Ogy2%c@gxY}TzM-R-km1a**7a^Fgt)JkF0V4f$pK@?rfWnT~jc#^?J zwR$1QClfW5%eT<_!s!+BR$0;(UaS&ZANR^xc*^43X5kBrCUoyf9X*z1@un*QWq&M9 zLV81<nF{0di8;IR^wM+@J$(3(5y>72vxb^dg>B4PXH}Pp(`c<0Iz+K{BhElnb~R4I z{<|(3oXy(}sB!QqwWA(R?8;nFZlD@g&D5LaFSr0H88m3e{WGG*5LP>3@F~Fyo5^GV z$pz9$BBkTSWDWgjl3Na4iYe${l>Q3}Q;%5nEY02=HL)^CXm;W#Ury{Gl^s(XCW$qu zwkV~@2!u)7m=(rZNz%c!rdLvk+?RaZKXeW3KHHCB26I|#W=6O!`Q3OZf5_p<Of?i9 z9RplLpw3L%zu<v4@#iN554li0xt+b~{5s&~8pJibGt$CW542Qry8-oD&sAw;wwBZH z{j?@_GRN#*!F1k-?^V2U<HMQ9<YDA|`{G54`7D`-=1x;$;Y816uoDJ(_h&rXyqQ_| zO5vJROUxT*R^rNrY1Yi^hegPJ--Y7LxTop^*ITigWc`jmm1cddH-n^%1=sYgW+vzX z#iXsC^6`pKP+Q)mTA-x+Bj6=2XNGiUX&}Fk8B^pqAWY3--aj_;ouGYd0fbF<P_iW6 z;H(GWRSSc|RhL-XdU-vKavwOsmY}W~W9r!D$&;yXT2pJ<9xK@C-%ItYw%`+>FR-y& zTmysQk?FO8EdHhWYbuD4UCVbr@7RGYtJ#eFqcc&59(St?|I*dv&ux&$$)e3_@X(tZ zgqM}a;qf$S02ApgpY<Dw5}d=v7{1ueKqyeI(#8y${^?#ES*+zu;@f#5N8F?nJeXW~ zusN#6WY`e<xdE|x7a&M<NGu!VI3tsdlvYng1ISFlV<SqsKItmAX^IZ;X!X@g0l)7R zoavfjV-xwN!iRik!Y^z%M@mKnvrzUI>bc~ME3J15wM6?bQ-%GWN1Y=$Othu%KF1UG zI{jun4YPXa2{yX&o0Mz#yg6msG^1c#HB<-W!i`6tmKUUW9w&<BDj5OaHohCkV^c2^ zb0yAZniQ1(*%JHkKEucX?!BHmG{F35J$z%c_Z{CIzJ%<0n<Wl_X1oVgjPV6hhG?BF zVJg#TW25`1(Dm<?3<v8@>zK64i~_EdX;$KVHmbp%7-|~Uv>nq$04RN?HW6!`a#koo zzXEWD@oxgOwfh>Ojc!)iKJW8k$L)+H>Q2J=w6EXHuH0KgJJ}NbtduIE975<P1yn3) z?D4Q?`6)!4zENN{bAP6+hH2@!2IPGn+|}CJ6Nv>rIMwX+%@cY&vq5>)Qb|n0ZXkb+ z!WCQ^0m=jtTh_fhTHEcNpe%Z!tM}9FLXPQtAm1GP%-qqbU9XVpr{R<fc?SIq>ql}( zgC4fD!tz7x7wY%n&msst2+?eo;q+hdM9yjQmi=yFXi)D|aIUK*p$S|2++*b*xa-;h zAE39?8~K<oQX9GR%7wkAJg2J!_f}<=liBs2TdP+$x&jH0&i!}#!jB_}o^vTumTB~_ zF0CXmqi<~~<2_eAVrg%6Be`cZ<ae?DI4p581&TP0<;odS+$Dc74#0bDcqxU<Mlm)X zH1{5Fuv3q=^^#Ota|iECZBJu2T{I|#NvSqO^Pj5+#g(RxzV8jgAvBBG*j7OtPPUrr z7ZXl@_~TQjI;pm%-dTOU%GkxttoW;0tRiInDhCk>lE#gd#apJbuV!64odDuyXInnu zn3AtSRD%VS5O+|^VUwUtsM`PvOsjSuMR5Y#A^-G(+#9x<aY}@y@?1q-0kHiZZ<6yo z52tksy0xUB4cVQceu_SI%eOPpCBtWD9x$Nn9_VV!>k~&;h$nj8W=&OZJxD^vC1hFr z#3uGZmFI;*hYP!569L&rw-7#}EXAmA1azNE*D8@X<cCz}%s0`%UD$;6uS|Ob&*vme zaGo?gbln(^i!#Ad8@OzP?44n8pBdp`%yD?Hd>RpoAk6X@a)F-|Ee;Ojpii0m(xYxN zD5YehwTmYkB5eZZ)vZ)E-T?JL>R1ZMh&uMc?UVJe#t(6-oL$p3EA4Ig*@Q$c+iX;9 zWxsv^>cV}$`n1BKpE*~S`#ihi=&;AL96zX6YYwORvVOoW@AWifR{37!_+#r@=m?I_ zZm8d(i?*@lceP&q_3Qb;dV_$QrIMW<--;URfsY^Ij&{CSYf6rmzQalFyPDWG7#|*$ z$Tt)hUYnuBRckOF-+-EpJy7_XEpyE%>%*5Y?I)pBUtSV!e5n4jTY5N8CCZmcZoWo= zP*XU7i16kT24d39NQmub*qxtB_jKvEvbu*pOmix4hg&q;WIp*)f~(c<7|3Ty2YJ=n zsw5}!6cn-3E;ux$i+;S=cRyTtl!6USQmt@iE@rW@io4`${Q_U&_GK?@^I1O;B6i<Z z^kdCsPZEtD%Tmhu+;jHS=9~1VgLEFn5~HO?r?s4!1EQ*YR@0zp9*fvcvL{+?b}e3K zk=Kx9E=dBpuWc)*-yRd)Rs<5w+3;QM|5&&MfVWyz9b@)vHD)m5L=LNv3)Q&Q&d{}3 zm!f&gT|!FwL4&SPEFhuR^cBc+Y~*aUCTMHc`L5y?lE4fOopLTfWT39G{;*@>O+K0J zamvBRCu{orT1ymrH$kr1icji!(|`n%N~6UUmZD5{TfS`4&FV+^d1e9wnWvgYwY7Ry z`UlTEc{{3l5wL-|akNg<g1KbF>y$UKjB3GDqP_+4)k(Z|`txr!W!FAB^My39Wl5hn zn(kT1z%Z3O5byMjptd!NYd{(yUZ950_kE#|NJZLAQDiC4nMZjD9|J1i!Ax$yzB;qL z4fsRfuZo>kVYAQgm}D<wwCD%<%k>jhczg$t>>Op8Ed_q|Ixhz8;;<X3MZS@q{0%~R z>d(jL>7D9wR{`&6UjZuMu>MzMPg%;$zgHI@%<u1S_9WP;=QvPG@M0J1xbMpPyG8fh zW^y)9jYx|#mbM>)1+6-#o-=LNWL~b4le7xgz91w1$2)$XO87P%16#=!&G5Phz>gKP zB$$&V&9Ykd<ry}{RN;2@7CHKy{!%ir>s-DMr-w;+P0QJ+Ucz)RGDxfkAcGqG(o5Ml zA|Ny5pNYiW#i*g5!vrcGhE<o%8Z}_q($~vo>T23xG8y?LaaiFF>RBG<4v=F`6(^dW z>DKUQ=4#S?NK*o3c>WlHsy7!%ie<OPT_mL<*I+p8>V*bn@D1uw3j3|MpfcE#EZ~y! z&*sQ;R@w-z$-SRORid6ZuOlA5@Te3-Zw`GC4xdx@Oh*(40C<xars$0FOqKvSjofBa zhV(&OUPTcAf3||dHx!_Q{C$8Ga6?<DZFF;GliPn5U--<`&(qBL9mH!6#Viq&l9%WT zbS!&{70x)f)5GLri=P(rCRXT&1BIvcnV)p`{Yx|NxB6U#_eIyno4LfbLH2u5KqTJt z*hQ=c)l#Gqr{5%>{t(bLkx1lkAC|oJAICBOE*-HW9*Ct|l{q*azq<aS48VAf9noce zG*KOq;sARPTNo-r@Y1@K1Bz@NJcCbNItA;#EV@-S#70!E7iF(8+cICi4m}l}s}H;F z(k99~o<6#O0$&yMaD)=0fPF1j0U(MHqA93munzYw_pSc~s4lGw<P7Vw7$D-u2Q?!G zF3jsAMN$<rj7VZLjz7m1Mfa``2vY)Ij4c9575mx(Q9w!__zzN@Y|TRRk^UEZ?-|w9 z*Y%4^q$ypRfHdh{rAcop2m;bOi1ZqI522{2h;)!%r1##NqI3w-dq8>%Ef63O?&jZ~ z=e+NI?mZvQhx6ebgORb>N%r1rtyz9^t~q~+_6F76VgEkB4r?T?HsDYj4STq3V|XjW zN$NrPntD!vFRx+dxj1rNlExW`y5p~yAT&mppJLF?ytFa!;$4VFWNO$diACQVX6<vC z2)A*XOJckDJefmw91)T-`1=m>V_yPY()OHpggg8-TPm70wi>Hez^>2<G{1awqS4o_ z&uYpHotk7((<Bz*{S>H;(LUYllWnmu#xX^{B65bjy7DDhQ;TY&L+-98t^gj@4%XHw zWV?ZV$>uDjXW@XE@}5*>Kc0QT%e1!N-z+-j{(?_o9LGK3>v=q{#Ky7V0`E&_jbcV1 zYu@cbl$ccO_Tch#g;==wES}VPJzI$^lnNc!Au&j8P^d!Q54IRTvGYKFa@AZ?>h$kg zO#3Z$N2vD{gAt~cX-~-_qS0K<CMJro=APaWa|i|ezD!%)!b3z0$-j4^kmA!|9q~gw zg;N$v^=m(TG^D>S_);dI98ewQh{R7AMh`E=j@4P1DH!SUrDUDa>C*TewT7O1e{HIb zNcQpzZfJT2C4A${1B2`Grt$OnZK8+PCBx8&F4S0!m0n6&w-4g6--;fE*%zTPhv*_d zpPQ29qEjOsuY!dMIF3{9>2GveXQtF6<XU{&Et>O^b=!dSV7SAMbNE}xw_9~oi!D|Q zTL|Ci={_^HEQ)Wmhjk$aJ|+O;N0aN3zuj+51Et07sR2mJiJWuA0Os3Z9-=Y8c2dxX z<@=MgccPQ4oKtsv+|Mq2-QWA+5=6Y}f99dKeoP{gCZkYN_(eF4J%aItm5LEIicNVk z4`?1)>bF#if7EC_lt#YOXy-6plCJ$~QC0H1gYGtiWWWm(f5L=M$G!oGKJbU`kENCr z++P%%u!qY#UFI*EXIKIfs^2B%2iRY42U7;45+bxVV%0-<<uCY!idEw5zv<VI8WVxr zm~;m=g#5JivcxisTaNDAdlp>tYG_5w%md63A_Zo_hC;>Go<t6*GIu5k?+MNKb&CMG zT*Du)Zz&WH41FjSen2HeLO&;Wd+3<<w=qsR3lud^^4+ADl}BbiHG|Ea*8F>GyroTX zxq3z$DJV|IV}F>2-&r*0dF+cX>U&QPq$8Y$ZS|;krhMa`eNHdWc9sw~^gl!%ZPlq| z-oMU#;$s2*n}TMq)fWfhB-f37%9L$2RUw_8Q!#X#+amq9ecgG$ZpR)k_guW83jR&= zMS<<qJ_06>fsVnxqH~p}%G#3wdWBCGd?lbmkCl^G+(U1~9i4q!zQwG5;#=j+v)?HJ zIdtJREeT>y;VAFdbEarMNEqn_wvZ$hn?<KAJ6<joPdmQ;B(S#a^Dswe)>K#iWvScz z2jA=;j7x8yUQO@B=7$PgJeW$QBlsfoflkknp@BW%Yz`$vrEm#!$YtMqjkO&2z@#T{ zQ=VL#US<vg#1UzN`i%IhkZ+C8B1%gmFBgp&sjQ}8-oM{)Z7P`G#|(vTe;-KN#d%+0 ztD+BAxI8!>mr*t!BtZR(Pb0YE{&j~~Wk=e=mY4fmiINXmYX-T+Z;0hNr-40KN}>~u z@}*M#*VG1r`Jdz5En7QOSF3dd7k2syMAshp`Ir@HHhyAG8my?clOj&-wn7G*cwSc! zW>|VMa31NNq?tVVl4n!B$4emrU7~BwTPS7va2?C6^?ZFAp-l4j`RcZ)^C*uw?xe=6 z-6-Dgl72uczE2qYq!z)uFL@TH-~JNhB?7tnoohw3)JY;8my7{ghe!Kd(tHVYYPf3F zTlQ1y&$nARTL29)HrN<Q(beBRpF88h<%15PEMFx$`yN^5tIK>)!25|y?>|A}RLd;X z&Za}sE;=0|Uspo2IztP7)xg4gyvZk5RE3Z{|1SPX0!=s51a#W4PfU*xBobC`oc4zQ zkYBF2ed{gFA+Ny*{$waL+;fFTzH+tx6<l1m<nHf1w`YZX7^N?t+I_d%v~6#B;Viuz z{xw6MKIw9obnXsN`n!yM4=7u7Jqq=ou;>4z|ExEKH@=x$eNKJ6aAB$KoM<-|1jd1r zD`H#*W5hy9J=*h^Ifj(slHXcM_ColX*fWzJ<;73ZO9Xbkis5ZIb`cYHRZ0|zr|^I` zU%j+VG^=ZNpE8}7#Og_Xm_~XiL){Egw++nLiTBoP0(d~?etu)z*09(Hc0-^m40F<N zj~U^Mbp)$`7yIY0CA`Dt!=0DXS%ow_x-b0B4r_-$wm9ui(<hYvY!T+QlW5bc=PxbL zIXbT*O|i9>t1IoG<3Ofh+IfvcpKNo~ZF$%vC)b~Ey-t%b$mEA}{6SH1iqSt;A-Pv7 zwd8x8sPRk&xEu0%CXlOhu0uyPH~lAUbt=a<|L8kbPcQIpC=XOnSlsQ+X9?OqIc9uz zgCuRVtoWM1gsaGfi!=cm(3u<B!1ZrM2RHB=J_IGto^FMFPI+**$b58=vL9NQTiJCr zG>`W-0p*aCz&=i`Ioc99UzB`iY{O1d+xLAR+k)<0g)2`a`5%NTlAmcs@!7F}>JcB) zP`pZ)ta}tveo;KCmz1bInY`jj=j~V*#5#7K8bX0fi#_XUxaerpvHxXD{kLs~X2@OP zs_L4tUqyqYc2X=pdVXbbUs352h?!<ZiPwow?%h}X?C7EbY+8jsnEg@$EcSJO|17;a z%T~qx2L`9(Ys0x{reaCfQxSk>qVt^qa`*G8-L}+a_oRAdmeIfV8*YHGlmI4`2jE&l z>1G2hW8T8gFd(mPIZD{JTr8PVd>&MJ%xg2oAo2(M#FvVth~~!}4;+>73<^y0({<m* zSFo0d+E(-jzkcej@loK8*6$w&xdvzC90JeDj~wk6W<w0y1?#tG!R`48@*UJMQG5=D zOG5`Fo1)UJlV^U@14&v0D1MpIP&{=@y(uZ#E$!z&-UaV%*24q6r&_Nr1wOiHM9U}m zUYv6Hoi1yItx83o0d14`qRk4Ns>zl>w<O!vw10NztV^S@n4soIiVwMTNyU2L@NIsH z-Qpr4p!G((#zpO1-WUd(UShG?JaZ49rPUdlcnEDP3DHwNn+5i_ZkaT?g$|{*+7}n- z7*<(k^rG2SlV3IwVh~*>;vT0ZT9ZUTSrQq4?8nhq4jGMk+}2H)%vDv91TXm*ctR^= zkw#1LC6LoCZL0CxrJ|J_IH)%Fj3&4R?0f08XEE=4neV%D;bT9#Ca%DBL$%iJrDK-2 zYv~m`|Iw2_59Z`EeMg(dDow~g0wHtf`P7P-LlDfQ;=8$+B|sX}5C%|5%yp90Hbi!W z>!C`x2}pvyi>ZVQOy}JwxHO*>pSXYso*32BD+3MKKdl3OSViphdtGK%dhciy3LL4( zSt{WybVu@%IlqMFK3bin-9oP8H-}2qK!Yi!bPE|Qw;KH?yMXe>TR_pe6rV}mxHD?G zJ5oi3ia7u7!|dKiK!bihahl>Z-(KM-SBs`w#bO4V8<j_6^>B*j`sZ<+46f6b&&dtq zmj>^R=9T9VrJNY87Gfjze&cj<Sr24liaex&9=cDo!n<HSThmNg5g^OW6A_OwTyWgi zx#IFzO))yR+?DjJDG;*olTqfv-dWoRW_o1Eq}z7v%h?*QLW=^rNxR<5pb3JO7IvP1 zM^R6Zsh2kbC4NBLZh~5>xFP^Ph_}nmk(U4?&*qZCvK-R|{;O=tz#aPe=}~9^{XCuT zzl%R`j8R}xJb4i(s7UpZjza{fU`;47I6_Xl`yC?1Od3v!=G(8nUU^VSVPP>c1$o|O zyqj~wAzKu`MZ&vCz1BW1VFlRej6Olgu)Xntz0Ct_z9w1}DvW(D_t@b=1T6L*aVvId z;jaFEul(S!tq)#yhlD!fg^+82`hk>NnmC4|1Ss}nvLZF?agrdUrtJ}RA{KOb4oiO+ zr2h)jJp3{84%?%*K=Z#pK-lG^Y*v_MT4=BM8mpqTL;fscn_Xk9K*Q2s)LB|q6uj^i za7wDVD%8VodM|Nb#L~{LiR(A}{kq7iY6ptuvse^|$Q<--$l4>apStz>!CQP)JhxGG zGo;@WZZ<>!d=FSsRE86P{NypdWe+%9$>@*3seJt`AGHV9$}LKJ({*OlS(>yrp{kXe znfmq+sNl=8=oU~S0@wYBQblHTcB$e4eOPSo90sE)`=6<p%Mf(e?>)93BCc-8pPXCn zicmdRhTKOVt@OJ4opJZ1z5L=itnQ2r5V8=mHerFxRd0}&R<JX)pncCH!TW~6n*U{? z{`?og3M_*6$P*I;6X^o54Py~_+5!4V$_yGzYfn$$t)1Ai3SJs{%ED>d^4R0|kEdJX z-Z2tQh!b&uvWaFyq|`y9^PJKasM!#*n6URf0Qv*o4<=J{&pg48x~eRSqKTv#kDrP= z-7GIxa$lTp5+bAyMh)!>a^?Amq}1J&t#_WUw=Y(Hl_gDp^6kWR*uT0&`Ny+GhT_&l zCtxkKq9c^!ot%1>ds?PLIU(m19;gKtdtl3C$&X6E`hl3&&X*bolq;>YTiMb%P?Pw) zbl>57egKa-vmE1>rKWLmPPq_u!W3fdq`KDuwC@kjE>SXt*1HIKAM`V;UW-B6+ya$+ zT;yK+mFCiGNz*zUjPYaVxk$Uw^XFABk`A3L)86%c=L``>Jpk?gc4FH1B4gsOSM8W| zx|~H&Y9;~1MyH<-ht{#60soD#<`3Skwym#2==Xl=0IAl3AeHTh?LQ3v-ARLNToma( z72^Vcee!NC`zb-^>)t?$>d9E1MHw#g=<R7gH}xhg?MOj;tt{U61A5YBlZ0#rEhb_R zzZ^hm;t+$+>i|8(8{7j%Z6HBad{Amy%j!w_-DyI1p=FgRBBkO>ksdncJCH~(vXrJ3 zswkys^4=3$C@MY2MvxOE0;QUAc*KFFu$Xm8OxTG)oK*wd55BsS9{@*)RT(F_Ic+9- zw;P&dh&Z_!KJb1|aX*oBT)rO`EhVLzHm7(yiHCs5xw<2nV68vpZCB*3Giusmo4~Pd zE?pLA&2RkSv@>QUl-9mq>IF99kZKanE7DOO&So>R#e@*mee{v!dpR*TE*e%o6baas zQ+4JC;LMBKoI!2Y2Uw@B<>P;FUq$+FHk%N{$+Wde$lHqj8=MHLCk1HN28>#*p3F@W ze=0@mXXowziDlkg>1X1|VFO_1?dp+XnIrSoWIdY{g>{0%<SxzcB^sU@2=r=Mo$E!7 z_d^1T?oT_)C`Rc#E-k$&-jg$%gF@dU`#648x59|?-#;CIXpes|rCqLWaP4W{kHy<9 z(`I4>TslfItjuf_hINjH=X1UeS<KBWG!JaWD-G=2T@;%QHm1v*oX)pl?RLm19FL=f zS~Kq>$UGUm%Jnwn{(xU~R6^~0at<}wV!coC$pgo9ClBXB(2YPgGO253v4nDnxdnUS zXpJxrx!IPPH;DIm^(Us>eRV*ocw#5UsqQ#q<OgEJi7-vdTa{-d+t<^6rlE@Bv8bIh z{Hk{3la0*p9d%=z6F5EFp`r-RuJN-o4V&E^`KNTn{UMOKn!u`>mIofEjx*J$oX%~1 zcWC#-=7^0y(1&*~;aEElz(n~78iwN{0OMV+3~^*W`whhAw#=s+ce7u5Yeev|8)iM* z_(gDYHL_fhIos`D^aMA8gO~sgw6>;9a?((WKDF153b%+8ecAq`3*!mnV4_>K-R0uV z(4(TQ+K<9X_uCy?B<`CS9OZOQ)h8By5x=>*4WG}VD#bO@F=^C%xb>^_!&rsY(Et=5 z>s*l$!n(|he^1akYhNPZ$CkLeybI0(-Go}4b<W_V#7Dit1%unSkFDm$ovB!>Ws`0a z7#VDAeHbn<XHzDXDbw}*dHd;GUqpMMe(&0&2;qiiPp2m`m&lK5sVzD2DUzOImBZ~0 z>+b-MnS#6I<b&VB^7Nw;9*U2&tr@NapEOi3c`O$2DhsIvrpi=L9u5a0PNjZbM}Vqn zVy3lo>d#`$8tYx>WN}FDyxZERvBH><Y@E)VB;@^{DaqCJUDNd6vMveUi^gdePsgWA zLzXHeZTJlyr)uWCkk={p&a#1-iSz9tK%W=<5p8-t6ZwCEPzlKl2AQ^cAU?S8u{A~{ zUo)v0KiiDH4Z2=}#VpPLWeM*8wFECiDZdW^OMp-Kvo-lo)~NALikA`YH767aFdl+I zVnm9-TS!UL47fu(tSx9TH0Od);?7uA<T8LbriHi$+oGox9}zSqmd}}!a@PUbaasak zXL;Cq*U;ZOO(!LUXWyE9nDJItp>&1Jh8grS&3<evPkmwtesK}*HN=5%M9mr8<WhJS zR~0B?CiQwuva@xLa!I-hW(OH|IH~^NB0}j*yvkjd5BS;SSSv|M?1d8H!2}#)dTEtQ zJhkfSvM5&W(dB@MY45XZyaVipyN&*wa0=ViEgpEwDCzOc@MeY4aNMtYZ}*~?ZSRG= zO)K3LwaP9zQ*3R_1BUL=Y<vsl(9RDOK)>}A+d>shj!atlUyS|ohb@bebkbdiF@K17 zXBb<Q^C}?Xvb4ofCpy<6&df$FvI>Yecxw2E$-iUDi=@Az7@5e3Vo2wIXT<vrh<HiH zq@QP>2HMMWC8%N;HFxIVv2%(e&QTMQW*6M`o-D%amfRLlJ{84BG`{gGdjyeIorCM} z>&{>aZknoXHP`N@pzgGg*r5C#dj$7r8Y6>dXP23QNx3?HS%(ocLVW!I{{sowyDo)B zr&w3hb_2s&n}3Btx7sHdMP>xjro4vU)0!{<s8#HzGPCck14aG`cKr#Tas*<aYOUvL z+3PUgnRbAt7VJ&_1dw#PiE>#d!%4Rk0sGvv%gZ#pv4ZC^H{GoswOFic02C^oNr^y^ z!EMS*vODD&*M>&mCFz!zof6fSvIs4LHD*sb2|XWw<kZ>#oK_Bvpx!KBUl|?%w-uvV z6ti<akZYdoZ077Cs0H9J!xKVNF={$L`%q^<Pmdh{LAk{SJ_8bOKJorRL$qHQdg}ro zwD-VA33Nc!2JjR9cu3%!F+TM=o6`8Txe@<M%;`HmojIa^#lx~4jJFCJBg*+VPM5y` zok4evyrZ8;Ey(^!UHR^pEZvtNpjBw!$5e#^rU3C1&M(mTdKdTor7qO}(%-P{HC~#e z)kF7EfgJ4I&SwKz^ZsfZ)k?QY41&tAi;HCE8W=|bc$RiMIlj@3szBlnZdiQB?EJ2- z<oCm=Vnwaju{+gok`SxkjYY#C&Fh+RoY4v^D&l}F@3^PqbeJ7yC@X$WcfXZ#Xbz*o zovERFrdK{MGFA`lV}GRDg^rc1$~L(!mkmhx*^)hdPbz2MT74oB2DnQ6>Wc`494D#k zeQQJ3L>G>Iy!g^#wd9Dz_~}#iT7`_`(*t*NOrT>0WbUZ8PhEmw&)_}d#J6Am0wuG* zd(nk|N%zUhC|QSRBCrj75{O#p#Cq{frn#)^WM?|l<P~OG1-`43d2w(&PbT00@0HFi zZvioXwXns<^1IFJmE(N(9pSe!e;9K1i*67f{{0Txx_c8&#?*0{XfvQD%OdnyAH|2a zOf`>lpQpu1QzuXQkx%)bq~~OH+H4!rdKebI*4Ub_rUA;r5|eB1+V<$tR$0S)j0=>O zQia@nIPwiEw<lj@UiYRXIK3MNf>m&V8RIRU;QHp-(me(JG+2hjmyz7dkmPz=*4nt~ zn#;=0@V90=8HMtz#NV8s0aDDNzVj4dnITL_@>ircuSU9C6UVjv=1?<zMkj)(=5DiD zcl^j8RV24K7+5WH&KZN;9BP{v;|xXt%n=2Fozl9;U&v`ii=LDkj*%viEojAB-^{_e z=}rS_d9ewi;PB%8h}3wZd|#+V&_<a}xNW-ovf);EPjsUvM9T5@C9oOdfkH%Tw`-U| zbibtH^(8l-ukDYYkzp^GAG&v_%644g|A<H%yAof;le!Hcn!pFz8=!wfG=J|zW2XQi zX-LFvoX+=ugro?HbP(9xVrtH-JYDsJaEBNnqgbNXuCy~}mwb%^n)-I>BuU|EBA<}z zxKBn`mMR@PIl7&nLr8xx7$=bT)PnCY1KuWR<8TmZ@idXPHa4F>9|%$GH`ih-?)Wq} z&#wjg+#j-T(8^cK)0tQP@-gz>84I^@$p<05bTN1PWZ_nsR-c1ppdqF(ewO)#+0`LJ zkIz~9mU?i#>GsSVzs<q5pEF*PkdE13ZS&n`rWFm09#j!2NmIIYCqRDQ@6*?ESO81^ zzIz(G>LZ$~BUrm-@|{;^6v?CXskUl*<%Tg$o=&Xg7R7jumrO!(PD18cq67=RJE?Eq zld%j(hlT@)8<)G|h<TrQAMeII9zf9A@r0*lMbe)hdm()_eCFT9_Ag5fkX^o_XO}Ek zPXCPW)7)WHYmyXgE!Zb)@2%H6<Jy<A0EDKv$qyZbOE1)4&1iiYEW1BoT@J5^WLGuF zi`U`kD-j`R31uls5%Z5gx|WuSG6G#Xy9loo^wNihk($ZL%fGmxEj35kbqbzV+n+o7 zmI-x~KEkNr0~rJuLbX77^|xjJo3>W3tx<yp87DWh*Gqdz)p~^vsLFH4&a>~n3b`)+ zzjJbH%tr$i(xpf8^#qIbvp9EUT#|8#k_usuQhBbHQ*B}3)+G=JS#DuFKx{%Q<N6_X zgcbcA;x+-!r+iy=V`5I>7XK%K&<=@D!OLDuivrjW0Cv*oAB<-Im7VnO6rwRR5bWt~ zEE%ek?o$SPXFoZxo!>h64&TqXZsq2on6A$KYNvIs4E<iaeG+#jQ4fn_|JAQ&uU>A} zUfY!CHF#Zc11VgxKiPBAd3^VlIorOMcXQ}3;l%KjzNBDj%H-aAF&yYmTjP9+KxCI_ z{Y}j2djmt9sJit`!{!a3%AA;^7ic6i061jeI%8XR831-H=pQ9=Yxcz=V#<rspXo+T zk{`<WY!DLN6`I#@)u^L8aIgIvT2;leBLSk6N6OHR9qM^q+u0@{Ut<<LWp)baqh0tg zueWdw*hum7s_>G3i_UD8TCtYl(l^Q|iP8sea4Oaq<X<gm-vjNrfcEz4b=DjL#v5DP zBO`e(wJhiu+I)=dyfcl%W!i!tjcokEDf(9{V^Hy*bgO#L{ou!UjrQosYdDdArtpRZ zf5ao$7HxNX=`tqOWg=8lL|;U&b%!U|T9bFR&AW5ik8x_3z4ixMSw;9vAEW{sI`W=d z$5jTVNxz88;LBIl-i-TBaqBm`8GGw^VN+_aZNQ-C__u<w@#9GQxc%czIL#G;F1X?n zrZuf;azBBrv^b07RHyyfSuOEEx28V`I(BO<T%n|ls;pE_daH7pkM^W9o-{S15DO^u z!glrX1_U0(VORUm6l)JL<XwFK$7(6D*S74Y(G~iIbJME%axx~X`FQxq58tm^<vwV^ z&*ub<XjE>yux~SVT{W?;wkPbrTHh9+NbF~`zS+ic4_aaD*IOuOwu0{|chw60_7wVX zEeD*^B{LID>}7_^M?b}zZMOL3JL+p(0$Ny4!uK%~*%r;-eu2WB#62(-KX0VoYx!~L zhsjv-x<tPZ^5)(9%n;z*Ec%JT*fWi4-mLy2Yn)3*{thxO3@q=`$O*z{3c7Lq67&`O z0y;Z&e3M>L=b0$=yQW?1muiVGv92x$)*sv|#pPd6&io2X|LxnJ?(>~F+dqAw1eCGY zcBNB%54U|>O3Sm!MIm{63}X)S1nbYI_*`vjt)%;BM6a6#aGY8WIxwhz4A@7oaNpoM z+>YfJ9hw)(V(>cuxsHe%cM$0*>Hkh5RT>$t*U{X3G+#GR2@t|{saValHTUw>OL2o+ z&OW#{M#}gM_z<D2-nsZHKj|=9f4W{@R;EV$_;k+2fM6!@)O_>_i9}iGe5A}-k>ufq ziX6JLv|--avs5ucY$a06Il*y3bBw<bAzbF)6P8kJiZ@Mix|*(OW+u?y{F^xGXg9`d z9lv%dxp*jkZq9M}%S-fe9aPG<`qN$Mf>DMI%<}Q@$$38y9)p`{m=x-Avl(6cHN$@% zQu-tvb|pAh24y7MS6i81UUZmkHGkY-pUt1#?tG@eW8e2BH8Wo_z#^pkIhpJYENs&2 z7r(fmD==MiVCLvoZl3SoHS5VjqUT0H7<3ZMoYzEEirbwYazX(^9|xn$$mT5!1W1aq zzFZv-(Cu!SBZ(EB!YEVY;>MPu1_4^v_$x_hJ_RK>5h+yeBgv2y*g;77r3CD)c7=Nt zFpwhR6i;JgHd*F<pg>~GArVQJ3tFICjT<dPGEyB1n___>2Z#Ywd8CZekQCadbF<3` z!(|q5VA6BwIoY+IepXD#FsJ_c^7!hx`I1O)Utd%`JV4fi{+{=DD>4&y4J_~#=?=8z zeD846#$95d8l&0GCaC^!<l-{jX65bG8w}`KL+qSqH)U0K+(B1s;oi52&La}7&Q2Lj z57CyXdbCZ(RmMXB@9m@0qr&w<8M9*yP??%xv`36KorG1Z!>zG5)*<yT_}h>PUUoLA zzMoQaF`K5#`Dw24C5E+aCdm_Y9;O+-TT}*>Zl$T1*<z!;kF)5{fry`c<gN`-S2hhM zSJL+v>BCZTI847Ih`w@6Buzg;Zzssq41D}4YNGCY+NBp?%>1V&0P65qqvNVR!bE1+ z^>vzuUQ)p<B4$NWmvkQv3m~?5JHtd`_?IqhF_frFo>0?>y{^!BDE^>6u+#dNJBWjW zqrX5S^d?%QV7H0GOEDZFmz)6?(nEfK+rJu;B<dAsY{Jrem)itoIX;<wwELQ}VV23F z>r>Q22_oupQ5|j`h#S&1QTgdpo#94g>XLXQ<|)c}7hWEjY|~<xP<&QsBmgTqOP9F) zX^Xi~OH0eLcO>Dg*oYDOb8j#1@MB*`p6wz1<L5^yS8b=FT$~$DC4Bm)p~jDo^6H*9 zd77Y#)B%zvNPdQ0s&~6x>}p=SF|Qf4x}tO8hu`TAS8O-lYOea;z21QriOI=^(-p2N z!_rb$_0#ENa(K!52P8ajKZZk>Fv!V4Y**?$#$Uo%+@kq5Lx$fuV`$8V0Jh{&xlyjS zslYPBB_=Gxs`DM+Bgd&5G{SBb2T!9i0u5Pg()=OAi4w?`O>g)(l8xw+Eox-sW9Ctv z$uF$!;__C}3IizFZ%yIuRz!SRyHJ%gB#YPd;;W@)4xO3iud`qM7Lo0|kwwrnK4|Ol zqiO%GCuiIAk>33mOKBzoV;ErN-ztMAo&L6h^(K3g;p?;T2Q${yo(f{CIbT<sim%F@ z?wq0A%X^4KFZn7iBlOa>WrD(RCN9CmGUtS6c0ai-Jo{EY9FAE)QG2&rhSCMi)G}P{ zUR@$2u6V=l)tJ4Szp|d#D@&}0Ury-{_V-5%$oP)8^XwaHYv0$(r>E4<@LfuJbQA)| z1+IxecQ3oaZ>pc_MYwOe*O?$2kz&W$M>$6mUcY>SZZLtSPfaCG)F#hNbX#qCoPe{s zGXw3m{w8=%)K2Bw9qn(5``<EBpT_RnGY5y5Q))gaF*d9hCa{Vu`OAP`Tk%&k!7kA4 z8jMMDyV35Yw?jipsVDum5KPiHV@HJRG}NW_a!k;=Z_YOyX=KspIML{aFvvgGyIJl% zf2n@9{uPEjftvLe@ZHB4-Q32AGD6Sex7d#Hu8J(Jtb0<+7jBoJ;c@YLJu9um$K|x; z<(DW|n%2(unNEJIJr*$SZ_x=%-N%#0>>L?WhtqGbf@I)6iCf>s4-LAP!Wfvm=e$ax z-iyZ(^$Usp<rgZiTA^2<vyFLb5O6O#QK~*<sM<boS@ASAxYw^u55KGI^5SyfaB_SS zCD3%QNfMYKViSg|Y?B)G*{996857|r69^~j-O~BX@G=>bNZ@^F6T@YA8zU0(%j*{^ zv`ye5ysaGx0p=5x*akBcSPB%WRU18rY|AzfFSHy@gqC{K?e+KbtS&0RNE|1FYp+^{ zUvI!GHI8E>+jIna>7Nm4VEv@KY`$48Q*@&jY-3EW5BHpW=$3JNvDTzbs}*fsw>4kC zCouN%hiGkp+PZpqsBcsKSEv|Lul>QhFDK<_Gb7k+aedmpgRo-h?V=hJ)0dquuS|#( zcg;N1<>$Xv>}KEO6JPvob}bUK{O88!shFQK7q!s&tD<#^316f@Q%Tc+Q(~Qz#Bpky zpEJC!e?Y}KVQ&q}I90MOKlyz2>Ezoo@~iA^-APyAxU|gTDtnI-0;@4Wwr20qT>U0N zo=y(7)U^o==0vg&(&RI8ais0@^bP@+@~qe$pOlXCN1(l5$_k7f4_)m3ay$8C5n<vN zXe9-6vk50|g1e2fao?>kCYy6eGc__R3mMGvD}VO-{D)R~UuWbS#;)@xp0IStglpHm zmD2J(X!%WqQ5^+ZFJiK6O=5%9eznfXx>wp?{gH@w0<5mv%gUtLiD!mikpWWadU|GG za1JkE-kz;nty>Q~{kCnjGZpP58fHQ=DJZssMTXcXSub7xfm!SXe`mNn<4~__F8|K1 zD<NMiF&}CaDFRT}Y}}}U{_2c_B~?EOM4=@vQb6UHtf8B9;=WqO#@u0ylo!0CGNZ`h zwM+R6-VrS1>|Vg!SiquR9CjL%-bdzlL7v|ptHi_UU2ru9&fF<ge2KnHa#0qC`j%jn zJ7%|pEk`es?0N!RUhR<(<NFxZyKZHoYFK8j<gDiJ#R~rE&Hr%ezXdwrrRvzj$BAue zr%!ifv1VKB(B`aIdsIxI1yw5SmXv$=KB8iz`+-HPVQ+f9vp`^Wl3lk)QoM}_gVLLh z;vLP7)5>3M>=M=QE(J>zI;h{3F~nI@wyNB+DqAP4@4VyGc3g4bSFrQa{mE?B#fP4+ z82LT|`#^7c59y1ZBsr;lizG&RNrpl{uWb#|K*LIrgv8sa&GlQ)Wz-<kuNH#>EU@3< z*dyQU&h~@Q5`JIXzZ^_#qv#YSGrYeMJ!{_Lgz%!s_CM!3qta4>yio>j?Ef~rKgRg4 z7r&gKtA5K5_&z8lm)lN8So1tr1A?C)wZ*w6(|$B2F&etVyRSZ8?Voykr2Pny=++sr zt0-_wjefSa4r_19G@{yDCn(5UZ}l<pUx?^mm;TogAr@$14j=yu^%u`xyX^Jm36?vl zfSZ{aJa)#s7*a0u_mVl7GP7KH|E=rdxHP{-N&ERN9}Z>ds_i@bp9jLn{)V@IVBG)p zW%wCzdpc5GvW+LQFu8WL^YV&}Kr2T^z_}Agp??>m&|ft!R{cDl)(aAG4P|&WY(WbN z1@F`Z<$yNm`*;4$?*0QD{yHbC2*PfW7%^uA;ZFgBte3L?47_Z8Fuwm^Kl#riy)pns znovsn=-myF20rQjXOO_>FklQUB8k8+p8khb==cEKCr!UN?iLm{zR&D31Jj~Yq~HC- z|2%4aUEp!7ir;-=4w9t+zWlW#d^rodW%>PJ?!PAezaF_{1HUA}F~MyGJPBywqyZ1O z*VptOwts?$e@5~5@DeD2Cz&o{w!mj1eR~6Ik8}UG4=2{%<Jaz7|6wS=7*jcAJ7z!B zDkqW3Ue6ig`d$SbZXf>J)&Cw|kQEM~k9GDvcR~11m}NU8Znr#UQ0|cUJY{_QKTX*U zERNfx`(Ce0H38ASo-Y6Ed;QPS{Lj+--=H=7crAP>a@RHh5a^20Q#*}&gISeSOpEjm z=0lPHSrIw`MUZF-;bH(u83XcM3%&tbm?&d(3;T~>`R5JNYcqKFt_aKDy8E|w{qu=` z-q1I?zV>$5+`l5F|7Zl?kO2>k`)=?*U+tf-P5|R`+C69X{@?hlIbi3)g3Sg0v+4Q! zB0;s+#-TZ|hyMTnv$A&qTVwue>eGK8^FL4d*L7bx0U!OJsr{d+{U50X;s1|80AlX{ z;|76MjVYH&Yov?ny|*^_fN+Pc7c#=eC8%TE>uguz5OscNUpQ;XCA?i9zL)Q$SzGhc zo}iyR(Yy?>Ubg_Nn?~xz|MCCRkPYj~;#F7YN5+-3hS3Bg>d+EKlfipc0=myP6?r~o z`q*qv1HR^j8ZgUO;yKuVTh#xzYX<G&xJBM&5etjZXl;<vNX%_(d8WKz%>J`nApG1o z6+m?*d;qGOIaWYiqslNIckREq0RAHoR3ymR8!<aieWW27>gVY%<}l%uSbCK%5KkcL zg>DpM2INiwa74me!N&j9I{)LUuHTSSW7_-T8sj~8`X#Y>Blo8!^6>W;voHdtAlVDR zH*~{OdHypVzy7`{(^V>0jFi)pxqHeo23#qO>Gbv6uFTk^?;`<Bd-~X&@;{E@`i)@g z;1Gh7>q++9(x}eT=5C*5(&?{%&ye0y)}T!5u=R8GdCbb3(Df4ANu0zZKinKc@2J7_ zPJVK81uSl>jYb3Wx5EO=pS0&wHG1}_l}#QRNZtog8@&U|9j4yGv)^v{$`%T>V>;l3 z<d2L$^$ydt9WS43In+HaK~mraBd9Y~J=?i#cBVnkeYZ${a&3tTJIDCED_qwGAEzD` ztZPU3sX1xE3U#)`YAw^Xhjd|u_tUkc(9T&%YiwlL1Da-%n3{)YG2*O>F-Id2BsRz} zA<w7rnyq<HiV~a>K7uD{7#F^XaoCY=^nz*%(~Z$_QdGc!eu3LiI<IWXR&TBP^x$pe z*&u7Ln2$$TFV8wSD#klOWi?xsKF^_55E3A>nLCt{6#}Q{J8v<%5-$JBx}$Idi|!Wb zew~I@w2lqF&!cC`<#PGT*5ArsP#3i9L#rV3g53CR-;oblpJe9a59j$Qt7;AT-12$% zDQ@ShTI_%wnPk57Sw>vjdCgeKk{D&V-*52~vVB4XTVq&6bP42L(vZjWdU4L_pp|B| zSM#QY(tBBTvP{+Exa7RlgFBh3KUI>qkrY@n+UkXNeKe)AC&=g+=)_7zexblYZ$ke1 z^Rr2Z?|GY!ific#IWW6sWj8g$shkwX6qa1ZLxX4fOkPZ{SOA<LQp8(j4-HPu5@hw> z5HsOdI@k)!wLG>kkxsu!=8}BFsn1SW+4l}#)X_FgjQj6Klc8t5M^|w%)V^w-G*LI{ zIikD=9`{N(2PF3EAV=<V`T0Iij9iz+PGy%(aWjn2On*W!oOj3MrZL<ORKt}&&bj&_ zURGHykFas~r7K&rf@!wBUDm_728KGxnWvF;FI_O{F(PG5D}}V%w3dVM;O9=}zCD+Y zPi|nLfsnIK-6UEog<vJJ)qu!cT53xZkR>G%fmZIVBNq_%4!>+ll|NAowD=aX)mSS3 zWKL$wQ77Os%ds(ZU3)Alwc`YI$v<uMD4+0i)4kQ|$-X@Qw)f|ffDLE{o^r=DbOmk? zJZ14X{#j)+Fm!~l5@wle7`&$atF>H#kJ29hD8f5{)?QD0_S~!uJjFcJ-)_K?g1CHC zbmaa3gwJZ)@epfoo;@PbX;#^Ce5>}Iy|c3bP4zNoQoBo`wyxKOY9<mXl+@6#zue$S zC(@fNyiIN<xYD5k!jXV;ZTf1>#uw%VG{%8_)d$C=)a`lnR1_d@8)6@^vOx-xXZ>R= zPo!Q-Che|2EaW}cyiI*oHh(r1^zV|v*|5d`JcZ)7*zu8D;i<e-J{2r}=6Fj?CpTTo z4$!TaQu$sBs*g?pHCo!u(9$^?bKhF){~Zr03k_Pu{to$~*;+JpH%1+$UofqoHv`nK zYjOSF%wV&#AoxTA(F|Ly<54e>M%sBZi!i;?z?zAB%Ja@~S~p0<YPN`FnTj$~)u85e zPXZeb5-xSK{PsN8i>uZe#5+`OWnSCt5#o@wH*=df>LnDs8D83c#_|iAU&%yDg7rJ8 zQp4*>hlKDr3qc!1{kAAL-mYD8D5?pubrq|nCT@uFf^{AacdCbtZ^PSVO)p_zW75*B za+0KM+ES&LM=Ca_gJp9-5U&Q!s&htq4}Hj>2$!L6MjSX$!q&eae&9lZ75wAH^Ft)@ zj7i-A<@EWoliaMnTqei0a?0~*b@|*zO7D@xc)m(m*FF&8!c4YmVhTU3kF|v<A;A0z zIddYgLX>H=6UjU+EZc<-o0mCC#-hq{Pv#M)fFGu@6gHFyxF;MZlG>PB)Pqg;!za)C z4sdrTj`}vwR`p3Y0P!zO*IkYiowznW1n!u0Kts0dgw=e%Qf|mNF!oMCUiOTZv?5Fj zO${jA%)A|6&_{EGf**6P6mqwjaM0~xBv+(G?hmJdeh4;e37#4Q1rB@FC<@<|Z?mf@ z)9_vzo54rQrx$`GJ=o(8=)bb)Au97NBF;OX4*|+|a!9C-&KWD;AP;tnf@Wo9I4J21 z?>RgTbI+p&j1HJ?*%2=+pT1Mm`Zb<a-K>|<J=Divl~B2E6}_!9d@-NtRKm1q2`qW6 zLt+)1Jd*|EacZ)s!f-A`WxYS4xjg<n8$Vsk7c%aPxxY~9l&<A%#zC2JlzJOv{qq;d zz@I2SB>dzyx5YThC}$rdz!r11{>gWZKbhN3;+RNWZ|TzP`LtefXkBGUP%MtEmRgxf zUjja0;qH$$=KXzwiU3Q>8#OFJLgKrXotUWfOC@XhF*C`=@2-~RE|rCc%km7Z=icB4 ziQY;yB3}774h9fogwlyDpoPRialIj_ZEauR$0t@#ni+(YPsj7iKQK%L%)Qyvgb$M% z+t=2?+x&ZF5UmDt&h-H&XO3s5qvb0z#r$lG^J*W7e&G`)Uxei3)DFxSggt;aEP{kR ze64=udvfHeT-_qUCUP}3s@0ts6l4DF?s@~{1?a+b?OIR04i4@DIy(mm__OmfylIa# zKQ$fCC9(Jf{!8bVfEr5Rel%)!EiGw3oecI|U|RGD&hoy;&UKmm?DL4#xWZv+`=)}$ z#-UPwS(rGZ&oM?$0Wt2(9Xp=bPP1946dB|MOjcc~_#@~4rjEDn^hmw_gp_ubZ!Q+q z9_xWox6{UE4a}OpAaRnuSor!QZON`#rB13{_M@5EgtG)4>4qAhit~ju0sM;CEg1nw z=V^<+GPi}ddVL%j5T`ho&5+0+>%|Gr{qNl|eqHOe)!W@83~kXi=1-JFeJ?)DZ=cJp zqgUx@PNSg9ChOVqeuJce=nQj-1c)jW^*3RLUkuW+-1LI*ZloF|!g;MyOi5<CZiCb) zGF8PYb-A?e<2*v?!3qh=iTl2H$rP-QsjGz6J*|onw=Y4q*ABXGF^WDv3zN*h@5)*# zg;SLu5q067hixT2!+a)B)L4JEG_85w+n2dr5fVgxEkY$aeQ`?HB6QqX_xA}3hv4AJ zi>i4}-ScENa3J^v7UlLf8djbk)hFi2ab>@#6FF3i=^_Dbx5zP30m^2PHRGWMOoz<n zB3mzPkA<9ru_R<pnnuK<qUEw{wCeS$z1U8{Xeja>Ar0qV+Zos*1wmBi|91OrQ2n<K z=sf2zG!gwHrP^rmQ|@*~q7x5-xWxNdbuYS_)qn9ra3_S#-D>%J(jRND4XBrvLxLNd zawa?jLA^Irnyv+w27bg;@hY`XLQ5*2Sc2;%FZ_37)uuW%&V+AhkQNTEsjvwE#j!u? z9iEU>9dGV|woM?T>oq29>rn~O<V6Woedj4MTU(nz8haKncaB;*mSgOIpG(oEn68Nc z{G5o+(`S757nQyGdpP7HwP|;$-?H$%E)bwX!zzE*3n*EbghJ!>u$xSRe5~tZan)@5 zgHXQfsq8oLkOUOJPc2AdXJ*8cD$v1QBJ-i>nPThSwLznZtiH=z;HG1S!m_f5e%>&& zb9Bq`Nf^ciyXEGcmQ7+TZ?`(av~#uL!U>3f%oxDcy8c@E{3T5d+Ffql^m6sv$V)xi zng~klR8{~=XgX<9@!&TIR$KLue{**zZ$~~UG=USr3WF7_7U3Br+-u2j23Dd~$^4L) z`mS+748-6c3f;Kzc7uEHm}H_~a8x>0Q7h(nIMcmca<4r*?9xK6qwpG%Oz^HM$K7z^ z);Kht{QJbm+#v5KU>Xkvt&6;4&n=aJ!=nK`L-5Cb^b(4m@4485*QBBMy#H^b#?pB& z5vE}sKx<6m!!I5i;kLA6c07A~dx^Ps0q?$=*{SxhZr*ja*6lP44|{i#$A8y9hk_am zt~UW^hIuPdiFj!+@p%J1d~Lajsp-u?&!S+HPu)ovQ7Y1M*mxm@YA~kgH+Y7_k^n>u z06?*v`&{p=ut(StTsV_8erlI3#v;aKlH6)SN%SsgEqngGU%^@w3kB&~NA1KVN4Qw| zx2{7K+>1cNO#SiVaI4+%Z)SmnJ3HS~zKPQF7Am;kRCGSw=Fn_(v3QjxivL(ONMyB! zHdpckRi-Li6K+G>C^n!-#TtF&B*7(x3b~8lTW3s)USn{leY*2^>$?3EuKH2&pFZ52 zG0EF!1Wb71FK=91@7E$oePB`!iv55oAsE|VZS@z0EV}o|p?e!`GT0ddkd4M3&qpQW z%G)pA>^!h<Fm^d$%&l-ykv&2)>MAKHY%Fo&``~@?86^Tu-~61o@HLS7acsJU5v+FJ zBs`tY7-lmNBCAgM-ZN$9WHe2)X-P&ZKG6+zBe+BXfHXV(H`(~E7KNwJWksd)`5TlU zL47S3FJ>7U75WzPRB>c|mLCV3;vtwIFk9iL9o;-uM=aINrKx8&>d`xw&pc+&9+QE* z$T@RWr%U^K%6|gJgsPmW%0>dv&)uR=ghooQ(9JS^3HfVXQi>3DxT+t0jY9LbGh|JI z>kLk^TUU)0Ty~ojwo_!h(mnkMXnp!3Y7A{mb-5sOTZc2mgfTiKr}!f#uVQP2%0Hz& zX!RT+hLi6jqQcV1Zm$p~F*kM&-MXh!wdTrYdJOCEs{y-(rSXU<41GEgx_52zU(e@# z)RW?6b6}`0C81Hw6bw#Xwow{-zK$Ccf3fb$<%`Jr<6COt>TaI_y2yA*lseZLi4(V> z-sk!<S-?}W?ll|)6H>KSJ^6^K=B!}YO=(%~R$2J9oGnGv&GO0!7^ze7=TAo30Ji(} zk=dy3+Mm^J0rXecP0g2I_%s{ZD?geVvOX0Mc<4_%!b}<sc-!|4_thMmgHYySm=VsE z6flJ8{IVn*mhdeUx94C>VKz$v@5AhF%q+N3w~mssf3SX@PN^7PBVD)KB(vE1dX*cn zq<LBS63XzCQ=jtfmR)gI8;HS~Gv@WO@YwkSt1A0raTe8rOU&|Rx}Qn=WO#f(`1pcs zU&NUi=sdIrRTBH4jsut=Qj7;jQR~63BoYU{4OYKBrX>rl&J*?VT8`FR1%RK?>8ea` zdUb&rtA;`^xIM|Sz+c}UF@h?|HV`E8osbTilsR`@>=F(jo-j>|V)4I@4osjc(v_h3 z`M`k$_PM=K2$gQnBos3LID%Y;WCX{3WSv@kjgnh>E%NQz9v+nT%CAAMUA5uzmoxNW zI?VE7NP^~I;HOGp6l=Xv0`F<hdmDt*uI*?(s$0+omL!l5YZybis;S!olgB1#)6)@r zX*FHNXf^PKenk&YH8C#El19`OdN$5HYIRz{d|kBBm%ul>(hp94_kGyT?0he!YOl?o z_IR`1&giP+5Y7Z_yB*(D*YhbjpO`h8gnE|?<}^}S$uW6>Dj7yvBG)Z?Q7su!8H|Q} z2{IXv0n%&C$Tw$t<cYxb+j|$0mO~LxA^z^m`NLJ!nXm3M%j>lccSq)~ZobvSe$CYJ zvhtzqYMhi|kjVJg;*9UzvOyx0H?`HKEwD>Oa(po@ZfA#OqJ&WC_6p28wJwQ|`T`{T z6P<+kaJoR6Z-P&2;WJ4s_4bz8oP)!GSQIcfiWxrqQEJ_S{e3*3Z72BYauRk+sFfr2 zK4znpIv3i0k*OJ%5Z@nH7)CS8FMdVXc$!Tkhd%y@z$$BhNannRdyAv<qzpf26~TPj z1*d;p0|Zh)H-?a#>?;cjFs_=PreqSI45uhxGMmm%_!HM>#7{eBKnKoRhF|OKOYQZl zQ!w!Z30-~}wb4LAo*utJbClKTyXEs)tB*b$FQVfx3L%=47uV+2)o-}YRu^{;6X)}; zUNRrqXfIku1_zDjQ58W6)|4zfb%YWZ^|5)`qS{oTH2Y|~U`d^F{)Ae+c5?m5lflIl z;)JoR#^6!M|Fd?tc-G10Cdh=0DSeu<wv5pNkfbpw@7R!#ydYFTw8CnMpn8H8{ED^v z;+$7uX$j9c(QHTXDduvHr^@yKg_Y#JfY#^c>4a8njRkqnf|&s$Nv`#$m!`d7UT*@c z$ISF?FeU)p6;{ItKKRKm9D~2y^ynj3H|#rHq<bQiMI}0H?#VY7-E;CJFQ^OT>H9^n z?=UaYw0*tpR(zxWwp;%0qsCF*lK<ks_mF-%1nci%_<^v5<P1Blw2<hI5fFkf@{`ZT zRHkIv*`<+YHS;+fCV8{Us>h6kNF3F7gyA8g6uu7QI-UcboMW8bsxkzCGq-DH8U6+h z2|&_C5t$$-dT$EhcFZPy=DWso?X^1h(Vr7??tz>8OPUc<2c>h@@OOtRYUA|o!NBQ) zXdQu1{o1c@2p)b3Gt<Ch=wY{mv#=NBbco>5E7{<kvv8K2oF5l>FR)vT`VZSAu+R70 zGJM><2vUnYE|035o~o4Zb$rH$BN@b0s_@e9KJL?dq$k3kN~6C{1X81Xub1*@Sx?WT zAOx<8<&v>=X=2tqKVY6C$CL*`l$bsvafU`oG^)!zndE^SiE;T!p08^!ByEX#PCX|x zX?AunXF4tQ4-$?0m3JS+TFHj}Cj_jkX^yFfMwO~VsXZ6YQ|pRX?p0YVO6sT(SX~Y> z{)H9+XI^U17taZx;_Q{iGOcTv44k0k!P2WTdIp3FJ)`CS1fjeld7pb?zlq+XI2_{% zM284X2)~)@euloqD!w>x_{qoGA!4ef-m?R}&<u{d2|XidTsv>?gN}VU@iP$GgDiWt zB&R%z`B{jyr$neU+X^zc{2V3ywfwgD=DR&>CC}-qOsD9Q9P5Z^tY&E{kDiHD(eQNG z7aXj7f*-}I<Jx5u>N5|>5@&@9%RRDwp=a~o$)e)<A3^TjB73jP<k@}jOu$)6+jmQi zd>}(@kX*akIUdNc;fq@@GXfYOKUZ${zQJ>PVcl~$?L}&l!Pl9wO!NEBM@~iOXq-WX z3|PVzqpeo-7?vG5N0gM)o0SYfHqM*B0$s?rLca`>z!FB(b#YC?00hbjAW&dGKJUqG zAemJNt4;g+ggyab%UWVgofh0Hk<0hUfBJmq!fV!|HVf8E&bD5WHj~!2h32aQ!ikw{ z<(y}hm8_PakdO{5y}1BxKd2$36W7mU^aydB)90L?Hh6>%7q#qsCqI3)I1Hz{-7VK4 zkxDrGmF%w28P4<PboU;=P4D+#4k5_NYI{^MxI^cy*@Vp4mmQv)_xrr$>3+X?a?mu= z17BZ*$<(QDRV}*ao-m<@^Jse<(mYRW%RwbM1YWdWkH9h2Yn?_`0=Y@S;GBgsxz>i* zDtB=S){1todDt`3Mmq*4;V>_!2*MWBQ{fEn;`KOM!+=pwAd58qc3s=B3E3<sl|S}! z3zO@$Y-j*IDE}G%`{6sC$)m9C#elxdB@Am?+eBgl_A#am{w!sSA_Dss`CY$m^Oz9< z9+%54ou5^hJQAIhA|gjYbXQu!{hQ?rW}0C@Ty4@^_(Iog0r}LddYzdb<ON{R>Bf_u zW=cRxbxSA@Eo}f)lI9TE!XeLudjD_){o}-JVscdYGT@+iL|=>X$gxrK`6D2*eWI>9 z>@|II0pbd5-A)^yNssizHY6a0IhK;8pz4TyU>QfBb8>Qe8a|-u#PR4Kt0Ee=anE*+ zrrm~c^xjZ5Z}o*+?G?s`o}hMTjjF02<u)}vn<$0ftx<<vL12(?t??mu^nHFRD~RZS z;j%X9ACOTxM<CZTkI;3n#KHcu*z;sQxmgKAAmJ2$@lf=A{p62KOQW`S(>~F5x<7&% z-lzhR-1dgo*zNA@bme6^LZbuYtMKr0-_xU_7_cg%qCEBmXyKq4FJvyAY_~mlM}6|7 z_Lm;z23zTR-^91|I+ZSIAfLDWE_1Lg_sFV$eo`5tfekBcY1@*7lI=|a>8j@P*pIMT znS76^`7cH-VmA<n$zUyEp7z8doGk*jq8DvXYYH>_EZCO*NzU|zA=qB}TqSDi8B<=T zfq>M%XL{kTpA5yqReT(zw&|<FbQn;FZ>#mWNbR--7O)yP+`+t$m4Tq4U@PZ=E2$D! zPh6Ha1H+**fD5Cu6JN`GH(GFAW&^f4n2#!e)Qr+~LKos#lOGiS+X4u#p(NAdi<g(# z>XzFR_or>nAHEy2sve4Whl%U_U6J}`+#i#KXZfAqq7wmbUj8fBW#2qawXJJETz4Z} zjvc+@0%Waa#5V?xg=ceYS0UW`mtMmsFL{#A!ju-?C&jF6($_RQF7s3!ch80ZDJEHU z(hB($WkC>J^&42-S_M2YbaA{v{A_=A<FXVKrL!$A@#a$MWhU3%5`@4wxgqMkm;b0L z&sfPt7F$oN?dQT}zYG*!uXx3vdy!8H#nrYc*VWh$cYC-3D@v4FMbkNDeayeSr!LG{ zI391$M`vMevEJqhwo_mJOq|SVtBYDsW?La)6n?NXMNh^<gDMmwjYrq{os5T1%%-V} zL+Zi|duRN=Y%rh1xV6YNtH>BLr!WdmmW2{q;$Wo!aMaN>*b?prc)fm|TQpUTfY)22 zR61GaABIjy$5f&-qb4J~lnbIboN6DA#c5#XDdA<Y5#CUQ+3GkmNcUqT8SK-gs?~Oo z_l|D^2sF>~vf?N$CSA04z86WlzG}2UZq_SVSZZAQPQ0AdTk~B`4hbcAh_!de|J5+* z8irh(3c~d^9J+3{N*T<+@hVp&KDFrGmkEW8V&>u2##lBkwr&r|m~Ihs-gpb#Z{z6y zq3b)K;q1D$V={v15+r(!5+x*v=n=goN<^0+dher*5<*08(TU!PGCC=uh0#W5^v-Bw zFv@>>p67l4@BPYJSu3-aG49!CpS`cW_jR4aO$m0i3-j$Z7@=m(vA{L#;gUBsz-x$H zXv0%@G~<~<vpdbWr&H-}M7P^KU((EGuNk&B3h&EbBt)m{i|g8qm#%3iLe%q%*G8q$ z=~Lb!Jrf2Jg`v?7mIgu^5`_+JWwRcSY2y%8JC`|dw5{fAu)U4_NY#!!%5i1rjY68B znR@Cj^*Z#lEl$8$y7|u5b?e@k6-bTw@6A#KMjIKLW=5n`fHsOEFfa)UeT2!%{-?&h z)G;PscLtia47w|KpZ*43+`H*|#sJg?o6b7wfw^RZPz+Iv4W#?=dVBKN?4G}BsPMRK z3Te}BKn&34{!<3DxtCD2G55__0j}M1U@XX660Z78h6%deA2-Bt^iw?UK<A$^Mx3l- zL;x#p*;GNxWb-{7C;Ia-lp22|TJ1ZEg7W;e%wFmz$^ugMoC~nHto*H@rY6gpv-<dr z=i1Qrs$yyw&9Ff`sv;k?0?f)RN1g}_rPnNOky`Z8&tlS*XO-%TSNU(QV+xXQAqw>U z?q|Ozw(qT_Cuo+-MzZ^;tR{Sal~w9{tUu`nr+$_7@eY%zC$PU~ZDY<2fTn;&9SyUT z2QaOhY`xV36~{d@64w#L+@m;%t3LbY*uY<~u9^U?kr$rDT6CXRk^g%th{#XZx9$$* zqwIK#w?dS`+$am*a4G(zE5*ZJx+9w9n@rdri0{T^iWbiI@hRNsfNfrs`vh*y&A(56 zh74VuLzdt*Y+lU1)O~yWa#-(WM@HtPxTX8Z%atD7n`&#Cm?@H@#n&>sXTuaDUGk}q z*2W*Rt^IOkmEehKTRw#<_e50tsIyzFJrNZq#Z>qNrx|VD9v30SNGcqquM#Kz>9ZJ% zax<bHbp5#@y4cjTF1meW=)r@}Gzc`E7S*M*eSpj}yVWyEmaXPY%4Di84PTL1u9xjh z+$QmsM#Mem^4+s7epqq4Q7SI7r_oyTU-PTCk?zFbR(oMzn#J;>E<`98YoPS<njp|z ztkvWrUg9Z8;%d)5uGU)_+`v_of*FkmKdyR?-Qj~vBenMkeBuH!rnE~^QPZU#r9?ud zkrH2RhP4>iJ75f#ElqaTFS_EM3V@1pe+%O^BAhTw59AUEvQnYbNHINlA3a<SBMFz> zeA1In_1$$d{z_@1R70i3=hfC}TO?r4<d#f4@wiUdi#jgEO+&o)Qs`GTxpxXv-C*%x zAEn*5W^A@uZwp9yu)c|R+Z$DF#vDZahzQ8nxvmEonj;C1je!?lO0F51EWj4v5>gY* zrR<)A<}JhVuRMMI!Zqr}CE#BuN=nCvwdB#F_PR;~N`yY2`lI_}he_{~^YO&=dy+BM zc;m`{@dM2Pk|MgmT?)m6BOTdv4J`>NPfCs7B=T^LWHFuo1p{7pM4FBhRzV1c@zktF z-vQ<m!$!#~;`mQrcR1MhW+aT=Js)@_;jeQ;oW1|N3WgRki0ps~T)}P!jgQ|ItvBA$ zuF6XnXFb`>f<EJdMQ?16I~dx6jW1+&<xP%|?}YvK9}&bKoGG8(MW<_ihrk~J|Fsqy zF`&~+UctE#TP^Q_uv47vykdt==T<&<?Ojo`CGan0nCH4+wbJS=Q7i6%wR8CS5!iG8 zvH!lx33h`AeV)Zrn)>3aL?6f6<GoR$#(w{B1VO2zj83H}*00wCra9xh68FD$bAMzp zB?PwEbv&3-1h!aiFH31X;AxXzQ@hQBaL>-)$1T%|H~lnRXC8pH*BEkB+iyNH+RE5i z!Yc8*&jC$0eMbjO+lvg(t@hQr>495dvZ_LW2<tOO+bDlc$#wc7t$gNWc5+xSht&GD zqAp<cWAht(-~!xldM!;d>cbGBSJy7hy%KTvj~QxNRn_(NTpi^>WzV{ens+Tny5a`Y zrF)qW1=?`O*_$(^myMb%R$5YguhGL#jv5^|JXiS?x&H^hAWSiPK1hPy7WFoRLF+G0 zf!4?sFOo%QtDe?`!lA5Kr0qpnyXoTn36)_FZIc;Y83%aB|HUZ)qKBZlZ1TiYeBj$C zmId_jTK6CNZ;5tD+|N~AE6l0jAv>?&PGNO#i!6v{f4c_i@x#)}Xwyq0zH58Rzh1)w zH2-=RS}$V^XlPU!Reo^d&XlOt-S+nhl^-nN)=slwI5TV?v(HhJ)1#$}`fv0RY3YBl zD@-NE9RJ0y*y?lgC&ULlSehL;q2QXBoDrrnlzk^>KnRe|1?~cAn8Yd-V}RT4&NP#e zZhZ!VK)@0xn83Mr^`%AI5P-Y2L43M{k5(X7jx{Q>7T!+TZilyOKF0C=2KAhlsBL(+ zUzivwMrW%P=gb(8Lir+rl%q>ssBpca{}$(wIW+)XJTa9y=T(J)EpCM&m5BWHl};mx z^d-9o(!PJ*Q&L%Y0JSec_rl-om|q4R)3)QQH%{&<_0!m%9YhifsRcR;p<pBd<F6}( z{p>W9zX&?LQF-K+-1EBy@xIUGVq~~Od=TPqOXY*V?%f-i1J@xFch?5nEB9L(*Hu}s zyP8>@p-Z=4nf?z3bU-I~*mHy5Pd$Y*Q>L{^!V+@t=x>6|{krmLXMiC?1@M6EV?Qy` z{{3`ra!frV&0Ht;M1hieM@^IY^)_m*a8v=qd?c}C&Btfl84nS*V6h7cf2~_Y0!D3T zarQE;ep?Z+6v?CyV|NvMb?lYl*jaHfL{lBe{XbI+-fkfV*P5uk%-rF2T4QB;E+PN9 zyry`8GpxTA2Y`UbHFC$@W2?_LZyBIloS%Iwf_D;-Ndw&>a7($7)T^~9X4<b0makbx z0p(!Ln%}sgQsWZeS@k}@g#+;BtggV<o9*KiU%BPUdUp1EHrzel3%<dK=CdyLSUP2W z+S_@%*;CrCH)h0ye+cIX&9$x0d-lTz9JGYX^uPT#LMJd&2kP)|e>0!LJrhp(zhWbn zu-0h_e$~p#Qu@q5Ub*aVIevt*XeLqmg8<;vwpkC7RGNOeCepew&8rV+en%B}w~x3K zDt?1O@rr{z5jxbun9J7^Iyz)6IUYVvptSPF8i){j(SgM90fy_5QBYGqZ7{@HL_6Wy zngbM0mPNvd5{##dKVZtgn+;Hrgvn+#(bD%^#Q#ZF4bZ{Wye-IXZx={@a{M<FOb3P1 z9+GjU|5L$VnbcICs9EFRye{pD7=B*N%LB7<?$)Kl4U6t1p9Uqf%-aVlGZFsdp|TzE z0^E-<p85mkK-GU_;WtfP)B(%H`b23b17*J<%bkMVr)^wMi*F{FJ@^7wHVa-q{o?*o z6Eje*cM*STrZkxg03!w5P|0!GMTOCVBwj0;OT$@9gw#Z?8oH=Azv}Nl^q-up`fE>2 zD`Cm~#}l&x`gW`{u?FZHx~=V6!yi*5z5VQ~$xi@ui`6D;senXmn3<(K;;O7%&(3Yf zbI|mt*yux47$EM>zy7X3zwJ;~F5t&QKt2enxQi$ly;##R0ZxK3?ah8$@OD!r!T<s- z#a6a;)7baA;V6dvr&IpT4wD7}<Sz~~DTd_t-JxEbuEfB;@3;hUS<9w|O6h(_)uwYT zDj%fsX}eEi0EC-$J3u$_kC30CC)?3(iw{%x&i%&t4K3l<Sbd0dDU;_;s1OhwnL+Qt znzx7uz}Imp(WXreQTEcl<g|~vtrMBrNN4?DLd(B{j6MMwqix90%{hua4=?tSY<lDG zcS(UL6c#JpH-n7tjBm`{D19=jOXCU^!EIktv`0J}=}J}lGUFIC<THkhAInH`SbfB* z)(@AuC*zPs!p4_wcJ`ElWsn|Z-K^?xJD?P(ioC$~B_-di*AG|U9&ZV|JEm<$eRC%H zuc7Ym=jpHk{pu=v&05`03aE3=Ts;1MiyePVy8fUz1_mrO`qHEDNYJPtwKs853&;}- zaCH0c-@r3%eyCVpmW~;`_W-hoKhh<VVDGrWUK%vxZa}EUsPY{Ajw@!SkZHZm!!pHD ztIk&U*6etsdu(0to1_TW|CM$ggAb6W!e6eX{_QjqZ#vRiRa|fQe#(0vEn*b+`!|I0 z+~GEGB5`B8E%)nC@v+C|=1ljB)?_`{*+W#RZOqW55uooKn<(lJ%0Gm`JRC7iBOf{j z&x^%?#I&iCc0lS^VQf2AR%JNZP4=HV?jMi&n{&Sa&dOq@r7*-XWVp`v4bqy*>P#m) z{V6;E_pU(2aLoYu<lGzaJeHZISWE=>B98D@s-(h2eShE$7|A&zIq3_q<F6Y=Tw)x1 zA*8?|DViw!DeW8^EucY$9krF!389Qo%>19u5%`6Wj4?vAI-d_9|7jwIE>d!2JOLsf zz|;bh;q%9&HpY|Rz^raAz&%N`s-$;lc!r<;Vi)A}{r1wwH=>Og+-UpSpOKqjn#}2Q zfaM1pEt@$<`t#!`RJK|OXSL(LVQ%?4f3WsdEzgVF!v71Kf8Z{Y<mw*?u`V}gZoz!w zU%C4gK|}no&YsUVFCa2o2Oq~J(4UFmHt0Ay^gM!YHmT8SS0XCYK%PzGC6&YH-}7E{ z$bcLio4hW*JEBvE;pZ^9&4_wozgI7S^o>HD?Z}bD<#7IQQA0ux5G80-`1St%m!*kt zTg)EZ3UV#Z^%REYLlWJ}!)(=ZyJ^tIohv0O)DfAO<`S={lX|!aluwgo-ZU`b`_ITs zB(QxcZ+Nm7e&Mr6yC4cugOP0(wOk`kY=7DD-y897`&R)>HOD?3CCvLUX4<Cl_?o}$ z@_|}$ce>JgVr7+~X!p<dUikFxWPxzed_DQ{>+cTMR%zK5tvMB=_`bT7r8gP?V0<cE zx4ldclF(t|;^I8nxi2_e`$D!6Sn=<U7y7UeVGEk*5C7vUn<@brC#fvyi^Zn^&p%e> z&hKby|HW^Oy6e=K3YxKTcq`FWWjR4o5Ha~uj~QaTz%5k!jijo_Lm*U2qfci|Q#QLf zzCYUASnJZv6?L85ZQeVLoH8*3EpbJ@dlPqW=-Q8zP8Eqs1PRwE1NDh;q;Sc!C98dJ zF@|8}zl+R(@%^u^bp4u~KDiFDT0(<=4lZE&Al=)MBO~LG%pvrmWH7A+s!xOOf=&8E zm{H_iDq<N2L~_@F!uOFokL<THB8jgPoz}bo=CY#Pa26thB44it%{iB-3E{PCDaZ{L z*Z?Sz^1Q-GBW<%<gdF$3p|I-};^79iz*kDy`hQj_D1gKY8*F|iWYO_*WU_>x%ZBDb zV<U&B-~Q{7u6p$^%Nw~s4#-4u15JD=hxdU#YIm=d#0!Yw)+9l2Dta<Yne0MBwv`fL z1l{@AA(Ug~#UQYt!YiZ!rQ`CHz>ohE3I6RROtAo5xl_#e(e|;qEL}_^7>FA4k8t2s zL%iP~QQnO(-{;L>ymzY+a=NHUB9tL4<YVZHaum{btqd=S9wA5r9*JST1OsEZoq>x3 zexa#=qPy4l{Ti|$xKE5~Y(&%lhff3qu!F;*^}f<9CJ_KO%T@mqVl^1<yjB9dGav&z zlQJpedhr0WWBCm0ZXkRMeQa06`Pk3Slg*98QV4T7<_gtFGIxZI6qc9HjS8MO(%ias z)a%AHu(rEIh=TLhc7&}95`StmNiEQtuw=BGgm?wuY|L>a5dH@k224;2#G@JrvAg3X zzL#euhb2JKy-u4{Ao=Kl)$AlsRj|Y}TH3TwF5T8=?$V|26YC&KK7t-rG-osSKt>pK z&y)&M<S{NVk3nFYo1O@_j;L9N0-^Cm$79txE}`v4-HVpN%EeFFYP_}#`!W|TVTdqN zs<$lv0NDS;6a;qxmb<hsU*uoGTDk=scW`zKy{NvKXnQtXw}nV=<!;!qC2^Uy7%)yY z=$EQkyBPcKD1`A;hJX*F$EjdMP-AfgfF=FqnB{tRIC=l&h3fb3$)rsg(~V-A+rorb zMzJ4U{+H0Wf33!H+<$5k%}l#UG_Z2*mV^Xeo^!lp>B{t?zug9CO8w*mnoGPL=B9{k zRT*tpJ^<K4AHWuYPRY}@&zcbyeV@JCOSSi=bp^+doPqV|0dd_74b#Q#K$ERMBimJu z%vLLZLv=zC=_p{|+k+vn_}kq7-!YlUf!#@wli6TPv8SHyXIP;c97Xt;`r35?>g0^0 zsTTk4D#MrETB4EDl2dQ*m;4SRcvDZ`YW)TJGye<~s0_a}$$>!O0+0ag=nS&14gD92 zQKzz+#ZEsK4-(eVA;<UM8e-cN9x6!p&3Y;P-!a1?v$QV{L+@DQEgZ+KQC!i#_YD&Z zj;^MQsj<;)-|%De4;xFgy()5;`D0QYW0-sVhFQj!N1}Dv0Ep#UR38vF`jh%85s1=2 zD=u*FFDwy9hEsT(4YNUga+>E8(EJ$a1K7S6CWg+5Cq6fm_}^m{@U5EwMS!O#r^`Rc zW|1vM(CdZiiD~6+mW^!KWd7MlIW-&y`WO239ougu1T$dcV6!<#2|O>GW3Q20&nArW zK}gBjn=R(`>!wc$LHJ=_U8>jc)=!kfy$gRT;kE}hwLLwzJx{ASNx1Xk!~X&-$#?(- z>cmfHTcXMN2JU=mpw0CYJY&5f<GTC+Lu;;|-Daht!tX%2T!A#UJ9|S>kI$CBd|f*H z%vw{8%^Pjw6%+H;HK<eXKb?JY-bnI6WK`F~1>8*T)F!Q2IU~IXL{atL$H;<B;qu3A z4Y|QcNwjNu&L`oObFom0|E^>pYrL^v-QB<K3&wF28_x`H8Oc^-iUk9^w(5)YX172f z6U=jMmZdktaeqcSrulv6x3DPoYSF;avW!$8s0O*C`UkYu*G&ZgDFw|VEJmY6oi#;` zI&%G2H%{B#_nJ$k4&C;eQ?r1(Qgt{1o%4V0&;p<YNhxr7@f<W4RV07=ttXDBe9};J z&&s}{nOfw!aSAb|g$F;?sRGkmkcX|-k%#I;IR!doR%s)!vAtC^o}HaHh~WfLg4afK zYzW7e2hXGH#&!Zx>H~4+8jM08{7asU>8cp@zqT$~5~V~F|00+oI7)cMyM3H)qx;HE zy5k+typPbqpR8_`PSVZOC{Qd(l_+jfH@9t6Oo1PFe!YRurpnZ_6_>yRYlt`6L=^!S z7}&-@Ow4{9{0t$lYQ6#IY940-o=+Hv`({hMdgSZcO!mXtJrib9`%y@vxI?^J6%&|u z@ClXQLrSDCkIrG69W09&&^z;(!h|Wmz+a=SRO#uz`_{YLNE#sGtCg?JB&X-oIzYCW zL_%Fnw|#wFbsTlj@Rd)dQRv~$ejpgX?4Q0P)dhjfX)B>>vbf<6aofcE=?C^Naj=b= zjcBuCo<&iMz-f4_p5pzosf07pVxIsXgp{reP)MG#EUo2Trfe7_od{dN))H79Id883 zbLfQJlK3BQq)j)w<tIHAVrN5zdjrys?@zsC5%jE6k-U&u?xU<YCYT7i0g?f=%6qd} zDny%;sKk!ac@9dpY8nkQt(4m2FMp(&ywp-_zOVzDFs3+}THhJU00p@Z0MmEW=;}h4 zY0Gpo?qliLTBAgbfFdzvz_5Qa%N*OMq13sCN|gjcJ)oy(t}R}cy!bUuS3C5b*7JS+ z26u^GjUd_baWRvpS?lKe@9(^E=(mqoOS}OOGw8o44_<hm9NIKoFb}k54be9$OXtjw z2a855mKixkgAuOWtU+tqof?|oUP}}Tw^O6hqBx)hu%XgFO(-C*_v)l+N=c!ULyq7> zP36vZTIaje70Q!Q(#hcMgJzRtU<i!QCOzL#9qBS<94W|+Jnw`~@f;lK@_9RQ1v(zu z<ZW|-8kaQlk)uzP`ZNTMmP`84-!}TVxr{aK&+Y-WmKNAc9ng(LsfmV1cm76{ShCOC zBT_dCe221|3BJ*)FR8;5=GKh3?)xxK0C$J@?q}NhtP5KgX)lFW0|5eed$8d1sTI1V zb~DTJ#A-xn?4{0Iu=#mw!`AKbwCnE6b;pZ{2%1>{TG-7a8c8YVGMSsfHd~*#j^N41 z3}&Qr`FWhQnjb|jiq@@20MvUE#3Mg|#GB1wO^q8zsGW9z*MX)EAHHrbmI~(wBl~kL z+yn^e8Qy<f)BcES$^oLf1Lz9Mo_9y>;0kKVRXojmMe-5{Rl$cU4Z!R;Hs__^Gtwmx z9gqPj74zM9u?k&|(upjMP}v{0(K~z{GOFv@YUHs$Ocx4B9K6)^DwOR~m>13J%j)?o zr~Xs0aZCO`1RJkIaA`z56jGYj9KJ0@vE~;Qy;$Xc!vdT-qw}%rgT#F?GJMvUVQAP< z>mt=Y(f#{^A-m;zFzePQC)}MoYRSv~Hxc5+IUl#n^lF~h&s-`L&o(?*ZkzzLJY-ci zY0CE>{lafsf9vTUGo4uSp#5>9cI6u?0IO2Lg}m?fZ1c?P$cAinz;-V(QiXoIy`rJ@ zm9KOJT8Wps29y_vOziem%h5XU;?IxZ#qvPIS`%Ij0ovDxNgRcMeCo@>6i|6~ujXHm z?T^G#HiBZw0y%M8!~hffA8#7Z7qbGH3-OmHjytS}3U{LXUyVKZ$O?o91o9%twTA|D zOnxt&!{xA=Sn#Xky7;(ISQ$T6v1Tq$q4$ehtDo4KWebfO<(5mXnk?*JtzX#50dk7G zRra2+rEfouHyyO?OPU&tX>4dZcbt`M9O4>&)N;*E`>d!~Xc}oF@2qpOf|zl=)I-eQ z<_3eqEPodW(gVknsiC`r9Fg%q`VB0m_@f`^RWzSnEhofBCAH5UR*4_&jqDuVBBfy> zor9KsrW2^0ZJV0XZ$uwsS5hoZ9AMGJ_%FC)5~dZ-E>0Q0-h6AHd=NdC@CiOAAZc#j ztN}Gm+m8rlcRhP+?-_o{<S~M#R`%N;^T1971dQO8jTRVYj!HYp!6p*|ce1z^Hgo-b zVmI}QAX~zu)dnVcl3edLszFMblI0MnMr__)bn(}o{CbzVR286gS^iN9m~oaxM7DWc z5nxo5^~2V*7t%D_PK{Wr=7hx{MaO^6gV}1Bez_{+E{O0oC~n$%sn@xiNk{_HH^0a% zxEiayYEqu@X1rg#$_@l520u!US4Ikv*K_$}9&@P)g8vY_+3=Kd6@5Sn8lzf|=W;<6 z6AQBa%H1yy;q&$^?oQ8|Ce@Mj_R6Ju@_KpDXbK~4lp8clEwz+XPIO?l)63y0K(5&1 z)<;rk5drhmY(8`}c*83fQJTNKHsyi+7Fwt{H&8t6lYA`k!*6<XrK?aSzur);SC4G{ zEl9i&@+Jh+u}A^`Y?Lp?GT#cH(^`(jb4+%859P2-7wQ{?{4=Cq`IqzrTvJoCoa<>4 z^ZBz|amhhX4ZNL2C5bmV=)BEklpL=oDmM)xV&pREez5D41*W%!QHI(n`bJV3y2A3* zW*&30w#gxthvK2hsX9`(0AbDI{rceL4Ci96E)+v;v(4qWrkB~s1w(BxC76ycW?eXc zI<Fls$6sgGP%Q$R)K7Y}SYg~Y0l?R7Z&2~17_CIRJE@anWjOhbC&I*j6(Hm@d}FP- zQ`Z8d7dpLnmUW#*haH%lE;1Asub+EqghJFKTVAZdfC>Kz?PM*mnq)i=3GOJ;mjlgQ zlq2d3&?m{Y(JBu@zW4W3IdbKG+iiF+@E*Zn!8>rDwNF`x5r=Ru18Y$5n5%B%@*Jt* zL2hbVbBzU_&^V^E-7aA^6gO)rEs?Kr+xrko>+V5+%xX#<_=>|)<v1)MdpoJTB+(tE ztE}_Z=$go2joTx*9^lqPL**MaoLF}-Qj?!U@|G49MKv$Fvc4JVvru-Aku~#v^K=I} z4yx~c#>2Ht_Y(25lNuMS5h;zniQif3`rH04wJ&^V;_t}Nk?+oaS{pe7h1-4&qX^uq z17~dccsKb+dd`&<%5PZXkH6KWNG$8$1xLwN^SXu`D`avv7Mjo{WF3&209w}uE~~VZ zL`iC6-V`h&c|z?;v5y7T77n&I!^PnsWc#Yt_!v=T{!H=f<wj-@FqBDqP%-_Di}U61 z%K^sHf_=q%WKJBGB7Z^4Qe#9<@dXI`%tvc&x(Fa-{MERl-Run_*$`U4+e1r!p3Xg; zm#Nj~NTO`{J|Dhb%2sN!=UQTw4^c12!cu-J1xwEW)#hI{JNoZ>kqYR%cGLZyL2{GL zy#yHF`^_dZo3VswqQDpDyW@||xhym&pL$2jr!+#Hvd<!M`5ITsyKf?(;<c|xvdDZZ zu##>)HOLqK6`A^s3DcJ#T%UrT4wC{rO7rP+8@-G7%RlLfBzUwS8brH0t(U>dT<6cu zwKHU>-{a!o;qRrpNVDsg;lKWT&9j(QTMP@p#7EEZ`lwFo3^ea4pDx!_5|`%_N>XH1 z>Oa_VRuq$Hh3|OuS?HeY%|Wm~J+Sfd@fHg+n9onnPNG(CIC?&!C9|S(DzxmKhqm$Y zIqG-h9i&BD9PU8z%M{KYTzxWN_lv#&eH1z?G2dxaP?WV;Zdb%p|3M43V<CeJCkk4< z0lLEUv@#mfuOx6Hr4@nsxln1+^owM>DW#71V)^?o0i(~u04{Cl{YM#o$m3Hri4I^~ zQ16mRG`A!q#NpZJTJmm-!{%~_GgHgVG4ZqH2<X(h2oUQyMrj9nWNP8uoqMC+@z}0* zKjZ<5Z&QVRGeV8Lt~lRjnS}CWthK{-y!bl9B$b*7nwtcAUG8=vwT@dgx*NR%RVfvG zEZzqTaKNsLH2j^4PhtI6d>c{&SCGT%NJ0Cqq-<E`A$A=*qscI7$8<Te{|Okw#AzA{ zUd9=ksXIV_tN0hiCSDO-KF@<@rHqqzSt<=gWlC#GtYN<Te9CWY%Fn>{IJkxLkpNhj zHzAtoRe-AJ=kSZxpTJJhkn&PGIK+1U>cJ~zf@y>j)AL*t^UB^d>XV3V9(gE2x(|wd zcKCoJJAIq|E{T!8mrX~TiM)>o8dclQAr;WamH1z%*4;;~<FIKdfk!~u@a;10jvRb? z8X*Ul65Y#O>&%Fyd@8r!z8k+&S)WxX8502LEM5Q<y^`;`Tn>(VBDG>HM1RmFHyOAm z=r;^2=`+&&@ZBEFyOeq_1Jmr={%fj92}d~@^b`}wmzBHdyd)nZ%%!o&8e4HCfT<GW zID#KYaqKQ9t!WRzF@48%;)S5Smg?GozFeRzgwW<fisq19H-T(#pUHT>Yq?SKz*U$m zY#il(E@2Uz7Rcif(NXLp+#51t5cJ+cGB*BdBWdwdMV6$9?DC{5EnDBTOBB?1InJ_e z7edy$qS_)0jK*+%isxpruyY9=lx+e#X_BIm+@4}?YyykuPu`^gcr2Tv3a$QC&gRMm zWorxTUwSPs^~svKZue!t`m7?4eLnEsoLkFqO(mim6g-;W?_zjRSLZJH7IQPwB@1#O z;IgArV}7_=ez0F?g3IIZmyqbSiHJ}&Pb#MEn!8uck<P1<>@Eq-57&CY7EbxmP7(hF zi0|3_apAAWzHalqomc+S^;ejl4u~%D=-Dw*kHkt)$AXX)e=@Od?bSO4CLBjHr!eW3 zDQ!!`XW6rmrv~(U?`1l;LC@yPZz3<58kh|}#{KIo0FtmYqfbzOY2`6V3t{gGH_>2? z<e3FPp0(0v0cdu96j<VcUQ-R?pvFe@*8>_RLy#ALlw(N(2SNL1v(fE^&#^TKZ;-|x zs~Gy*`n~AEE<W$g(xhztzRd2qj5giebeM?>(?!?wSfu1?)HYk5d`BqAY+#oia%q3{ zZ6Q~A@(8%QZ^K_}#JuAuNxCT$&v%k_`XYIO5~u4n;MR7C2eqcJ!>;2ElGhZ_XN_mI z@`;L0$|wUvgydinvCavPF8lFb;FLqMT9eA{I#jHt;mj#NzR#|JQl{6k<L~{P>p=64 z(6Q=yaQ!2VKi>-0g6NJq9?GnlxUK?Xtg+JzYPXkRl%B8o?;o6q$@q*JIn}N=2I-MG zl}NWtYa1v?Jn`Pj>6Ifk8VCwN;~M^sS(D#0AP%hf_#9=WcZgsv@$@``7Xzp%eQIkb zTcte1@AK%XmpX1v)jL@nM8W4dq?&BjR?eW9{>f}5EB!I^V6}7$6tjdXj@k-tJ*HkC zS6R*{4ED)jfWQpu6&TavjjdT6`)^BPoUfev3f7_JwNm2jPGtdw$p#*oDYV*cA<&0$ zO}*<<4;9rtd-$%Bsoi!vF_bF($MYUk2?3N~JH8HAfH-Hhux-FBDKGxmUnC50N?e<h zgSpl;|Kg|1*%!+*H5&1xl4pi|P0Kd2yXfSs7~sUkWJ12n+`Ci`1Xli6KW|%Gt)C|c z<Dr`6j?;v7lCBywqr{K@bnLgtbd*V-C0NH@VW$CRf{lNd+IR*dpaD>8r)5YOJG@OT z;T?UF^e5uD77+DV;I=G1P@21+3_hUV5=In-=9i~q@=r#|Rv^Z&+g?&+uSG`U#%W=N zFz1;(fL6Q{Ve`~g0*3jG%iH=bm-juOLA~agc39s|Hsng2mL$HGe{tZi2c!>S4RF7Y za1;w8Y@U67BUN}Z3n%a-vshPTnrp|}UzS4D`!Dlyd8$cq3<$TynqE1GR<M(aK+C)3 zG(1iCx3L<wG2y`mVV5UyDw0MFeyIJV#|I=hwgl_m^=RMe%Y0w8a-J*QVyMvO_)vRK z(jR87z{7R#@96V+9{i^|0c(Fr8m+J8V9lg<_xBw7U4NpJ`v|%inLRIen7vP`p|s7b z{ufe8Du=xj1S19<Lg>pcx&G|1nG-x~JG+E<sB7#Wld4~%&TP-K>!gntIF#lbEpdet zTQB15e3p-|l}?Z>zYueJ7sJ}Z1uwAOL$WPlougl~nrFXV>(R_hKsX(=&AtY7Ph!g4 zf&tx}n}Vstlt`<B5#QuZ{Y)*nhnIZQ<0A!M-B-M}Ztpc`xo?H0i^>KdFVbH{C$Kn! zIMf{yR7k7{yskVmRd#&~v7q60v4&Ss8KW+jK69QuhptVi^YHkkUi=SK-C2u?GI%9Q z+iA(Xu72N+cWz(Vj8+Dd_QbR`d*58s!x)FyW$qCEEzbis@AWwePS-i9#|`c=joV^C zDwB<bH=Wqs7q<$agAO+ex~(%gHygQNdB=O}zrJfct@k0$7eStNc-i}v%?)~71RZK5 ztMH{W^ChcXx*Q_&&3#5rRNhBB`n0{N*m6YyDym#VWWR}BOQ=3$f$HmWV~%Hlit0?d zRU=s-=@c=(p|l1+Me6}4Jcu?;{MI~J%+)+N|9OchGC?<@g#h__F{s)>>lEq7<kyZJ zJee$t^cjZp_f9|F^ik=*{Caho9EXTj-rrO>FMZX%N+Mz45?U`_cm|P7m_&(0{*v`M z%U`hVMDn};F3PGvz^U*5JelR+%%V%b5x57czMR##DzEqK<Yv8j?kkKrC4fg%Nbpm* zLuVnYPN#D1l!5Zc6Kj0lM>V^IidpCg`IKr6l@4r;8tY2U4{{)h9ULl7#kWqyS5zMO zr{$Gh6-cK|o#-Xno!1Ip3)?QS1u9o2MW>+D<g&<%<@m1DXBN)w6Da>7#FwJ1E00E# z+sa7l3!Z)cYJc?&%j~vLBi{z-k1PKYGvk~^v&%PMt}+h__bWg8pbb7wGwvKyXZb1q zMzzF~!wp-O@swPeEqa0grON8uNL1AN(H)Qb58;<v{*-szY4`tFW?neH=n@mC-T_4D zf6|$6;vFYj^!X<Un0dsQ&_6NK)Qq#3`E{|P`%yJ{;b&;~A430!2K9FF{Ou{Wqbcgx zVJI@e4>LRR27|0Ehh|6WtPP780KX)DwP@>dLF}o2hL<_e+&*+hYg^<F%%o34zK%Ov zD)08J;rhR~yF$flo}=(UTSIL?`U7paZ{Huv3|%6xDwi&s*1nv<<e`G1PlG>@T74EC zKEvR)eka&6usx3N7s3Pk-%2P0+6!5XL}d!t2c9RVagQ5TL=#coCT-qV`b)Lydn336 zXl&k``YB`;?`2jY@q(w+?2R|q^nfxb=Hcrs+-<G8-`x^Y$e+;cqQJfCLU_MrRE+h7 z|Lxkr!Zx=a*(^7c4s45cq|4c8l5{6WntTs+$j?TT6QACOwe%CLvv>P*%DuUJR$6Io zMRCN8o+ceW9sV1`j;Jvl)Ft=)?C3&IcqUEUT7*Ov|E#;zF_*W=fDWAEiehVRR0{EU zPYKPlU2*Pu^<ek14$|RsuzSa1W@6~lz<}@n5}{e$zyIo5g!VI<?(0$tT<S33Q)B^n zF(okKX#QFi1U;II7;ZQ5f0>y0f2+}KhC~q8fFIBSA9N<WE|(qhktTk&2Y_Ptvw5ox zze`5Y#zRRzgZi1n!t3C5W_-ZWGl7Zeu->e9hzlK#>v#r0lhgn)F@-oRps{{9W^Xec z3{#%OR)Q<KXo1sJVh~rH8#S^3D)&7U`?i9WayJmb?jCXU{E>R<)b>rSvN+)Erlv_> z4R^o~S_J|ip#9xty^i>aetW42MWmkrG79fY$hQD#3?ZFp^{a|=9Tld9S$4kDL)%&E zy|&A4c~L9FzEcyE`8Yf&4<#i`=T#G9$YU0=5a}$VR>9@LB<B7ID&4*k-M-wXW_vk5 zfxF;aGPG{ej<@JA8?+z(r8tTQy9~<>AS+)*eHlEU3rD+d)?YO)*PYH{=-f2@UMB5Q z0(!O9%#4hF4;)mn&+hTnb_SlWxy~sjYvb`otG$QFw2zr*jonQuuyqg<3;kWW)K8pH zIb3f!IXUu;FqYPE{4h<bH>QMkNfthiJr2UHu#}!!jHu`PUGq4xo(%H`DJkb9Su4QJ zTB2*2hZ3$Xai_Cu-keg%hh7?)PckbmR`Y8uQ8G;(YjdaJ3aI?Vhsqlv$;O5BVwm0~ zs3%%s6k(BAdBO2@dx`YQSP%<cYmHt{V!RlJ5-O10dxCTL2UmNqG(ZlPyU9s^b=ev0 zQ0dtzK-%&=^sBRrM}LM$j6H_xl!k*T#tK|jKw&R0kQw{HRNX{6<d7k@dBL=_zE=$y zQ~431*>YkbSk-BZGIyMo8Cw<nR&U2*uvI??b0!8ktK7h9QsW5@-E`ly`>OknmU z>oPFK_7>*I2)|x9Zr2INqbw+|&xs36JjP7zMY4EBBJiOH!=AHGgi9SCibdVAfA%%@ z(!O%rhf$P?tP-sG`@Yp?qO}WVM~!a^ZMAH?o8c~dE9IM;3l^JYpBt4+a{bg~DDW!P z9p23O*vtO=Bc4x&<_aAk#wrG_1Ab?cbifD6fCeA4;%muiIdgbn=;Fzm9h=dRGYqZc z$WHr7hTGOpPm`RlUwxlBujm%#=a*aVORiaFd2?TEka{W$G@JOI5}!fa+bT6uyx{9Q zNvv~Scla;Hs~(2$^ZPzOUx;fqyf{R~oPaEfdY;&mP+k@&h&x4p<mM9#7biJi6w|IR zVr&NN`p(l~u;zp<dx)mUyt8ZOv_n#-4*iTG=;&oU7w~KSS6c!74fN%4d%OhmJV9bR zbvMUkaLB@RKof=U+}{sYda*w$v*iY}d5WR5B=@I(D_Gt<E+#9Ap~nLgl>vOY{@KHa zx0^2S^AgBFij?pvqm3xZMr7;8dxbgUPK<UX#*VKNjf&pKkb(qcq;p3GgR=Gv7y_jV zt&k(-qk0>3E?038=qEdyN77<;M@=gjwPk1AGLxGk&bL7OGE7-W(pc~=1xi3-zFKPe z#@9NHecg@PO=DhBLuSTET7nl$Nk;<fDMMGLoptjU^B3&}BN_%u?I$aY>pI8Q{KHZF zbIDPz>iEC%69gd_sIP?ZoMu#$8bvds_qjD>K8M36QSo!%8~wp>8SM+s0|zWUJFlo* z#bD#EL`nM<5WcH88e!+3;&juQbx~6%<cL{XCzXfD4g!3(dpKpq;Ix-SmcIy=`&&N7 zxvIxvhxA~no5v)6S-oikSnatDmu4G{Cb45|S^MO-3h($S8%{isfGps#e^haw#W8_H zZPki95q=*qT=nNvi!ibuvC>R)_~*yZNi)QGnZA_ImFG0it>=spyGVOxpmIhmZ%ye; z|MB<#_{;X9zw00eBfI1JiUiCeXSz79$z=ur)C%w9jHnh#H`wZ(w$$e-HK5%;Ar`Qz zJ$X=|7i(3+i#JX_xVy!t3m8d#>}VJE$x+RC73zZ&>%JcAKb9oAw&Z{T{8i6Mb?xTo zh~lQEq~T%BV!I0iZ5<tzLVwX(?7D45(-(ipv>L@M^72v!vf8Mdt3ji2&m9~`Rhie4 zHADNvfmxL>5K^UtzrGlem07%tfxQ|psFSF1A^{O7-LU0mE~E^m0p=2u54oUYj6sl> zFs#R>-3ccre>x#^HX(DX<)+;mS%?-+il*h!pIyw%(zj|fjI6D75$4nw1qM~C17<9P zlbumJUYpU~?~Hll;C9awuFrnGfbB`Q9Lay&CIG+7==j9NaCRa0{YUM|58!4DsR=f) z8*?5;m2n60Ql{x+0rl~povWGOBwOcWNQ-TdQNuSmP~aPm7)gX;d|M{XX#da3dab^; z-Ru@8KEZ<f){AoA?LVDGPH$_sRzx%z+&V5G8#sJP1!hr_{!q_J>Cmgv!UCJjZbP>s zUI>-bJhOo8Wl}`?ZE{rFSj`50NBM0kgv2qCsosFRe-v$H2w1z-eWcmkbbP30HH*7i zbm=I5BM|E^XFHxa<mu4B%T_r%J*FtoOur2}TL-R=UHL^!ifwp`Db>Xo+!B#tx*HhO z%*cB9`SiekfvR%#YF2f21#elrj^lS6m-b%YN5wQ6CtLIBnnau324nj>fCoBj0QTQ4 zB)b_V00LqyyDKEx@6+sOUB@d1cTbXcS<0EuLtGiz%5%CT5lx9Duvw-^eak=0D({QW zH7vWe)qW1?@ag$s<(#5@_Dooc{W)(3bui(ZX3>D3XyXL>;}fl=4qNO?3V9OfttQ5K zJ8*3b|C}g{I+R?2U9RSK1^Sg_S$CF`v+Z?LI;4sS58^DmKgaT0ZI~J{Y3xici+{!A zbJfy-)lNr|&z_{ewqfDu<nTQy!wSZa)~jj{ty6aNMR}FCHv^hH{fnQkD8N6Mm=?Vv zyyh;KYa#0$hjbLV!oDUwNxt-Ijp7+cNrTS~(a#<t%63>t-5jM{=oDfCUcr9|8#pJQ z`42?HUn5gi`H&In=dQ*r>!b6oQIFEG31@R(+3;V4-Z=Wx?X+E)*g(~S***C}Lz8ON zSwfg6FbC;#cblzC9+8bc4`zTI6~`>i)m*UlBzkv)S{+ogTwN;DPZ~e7Cll|>^14U} z!40Kx+aXViWOTJ|BBY$CCq4Wb5|GFc?_-wUi%TQ6whtRAHoGl>cFnM(KR-nA*`5H= z<wK@1kpme2%Lw($g%*XN%<aupKO2;h-P=}C&h~afmEX^MGX}7CBc>#@(Dk%EV<jyb zDZ}sM*?&F^NE=y0mkD<?c3Gb8)ZIYsia(Y1p1Bpcz#8CZbMj_MDL1%7v4U$vd#;de z--n?67u|2kPX2zveS<dv(<c)~<d-Vuxn>>$y|GM>pmak&lkpx}JU2f<q|r<nlIxpq z&5nmGNw}?fGf;f>fV+(x>QB-9SoppzU>qUE9CdVe)@Mxj8FlsRkbB>XXC6io$*1eu zP<u0x5rCd=Q+@S>FI#zPou<)`8t<;B%%Z$)!UL5DRG4K;Fd?y*w<C^A$MuWf0;iz8 zYrq4&VrDY-IOtlW8k?a(8{mZ}e|>>ZxG-e4=De~Sxh$DK!@B%iEbz^6SGJ}6)yUoP zAkU-yUsreDS<7@u^?#3Ky7*DbbtqWrZUCp!H-RSUUtJJ2icR~x$IGyd*W$VeD&@Q= z)xEV65wS|mkUut_xf>r%M5gEldZQIC`STvq=}z~(F08hai6e7)S7tud<(kKFjmCzk z!|cREu8b?RdjCrFtG-w6*o4<v4-EVb1gTZ{27O@En^V@M$G7Ks)AG!q7sQBL2Qo}? z;3^HdxCc`poUd=*XieRnE1cLgpy<#8kFVV=%A~QRM`=AjKW>ypp-@tY$gfQJM1dVT zed0&6@p^K*iJ4ecS-4+G&awZKTJ6U}lqwQ#o#B34QkT`CnUmS-r;1A+Y~Rg;#&3&D zz2V<R)Xev7zRuDyZNyBNK!a@;Z-c+eW}7yKd{W=o`jLICRsVa=ls&l|1=+{Euv{g( z(Z`d}KDr2xi&hicHt!vK<wBk|#GN;=q+aqi0yP%A$Ne<`Pmi31$$uA%>)_0zs*7~u z{g|0-{N~x>h4<_j{BpPk@n)hBa*VgOuXf|?jW67!q4ncDJ)b}VUZ4zF_t{u^g2!>E zpAE!NokC#AuDL!Yw<LYW$S6-unML*$L5d}Bc3ysAocuV3db<9q^|_kH+<2jcc|eC1 zbAXVL{(G7wIzG^3yuYHg+1+EV==f(_<5h{r)XVE7Ot1(H7hpW4rAf*&f`s(uPssJx zK)7jt9{KT7e0`TztDt)f`GXkpwCA_OXlr$QU-w+w!}JnPLJ&Ey9k}0d4w2z2g5TMz z-B&5-t$>H%GpJKAG@UQPE^ZtbJ5A)+E#uF)G<|GqE2_j_Ghadp(FOYu8dx*hkG|yC zvg(ol>O9Gy-!ZmO`n0~p`1=iXR+jDhC1UfJL;fq(9!r`0j|PVMf;k8Ew<BcU;tX7Q zpc(5PY2WF_3uL~-Dao30Kvg3+@sMDAiPvX))PGc|{uXs(vqYYdO?P^3?x-`Q_sd(B z$RDXC)8@Iom}mK8F6xi87H+F3ZlRJ|XX%jBy$+)b*mi1vLz1|TGL|b9C5BWaD^Y0b z>M!^^=+jR(>uhW|lf&!$lpB+~aRFo}1R`rOvzH&t`oJFJy@5`+tg{UjZySS3$o2C} z3NL#M-oXDQ21FmPESV#zF?{nR-(<nxMvs>r>gZPdO3wG0VM~tExkBiwOFs7Ckal~W z6vJ7y?bO+=GsCd?3I`JWa4_iSiyPR{M}fc1<cR~{7-`Y4qO{r?kV)PuCo3zDj*F@0 z3Vkc!okNJ3M>eZ>Zqj>$#;X%C2)iAL(W55@?pKNB&8&&4EDv}L$j{7vMD=MRUG8iJ zU&F~dZaZ_&9Yv-`hTsp0u&QGQn-V?8{F3OVpwyxDFgZtutPs>orLg56i_?>x++q~? zA7q%)ern-kmLpVJq@Xo%2wlmk<%`CL;WIoQ)2t_Ra%H<(n;Y3|_yHYGcLL@mW`2D< z^>&(k^rr*Q%kUt)P;*sBBwjMwB$4p3=vGP5Y0Af<!y3|`W#NlVF%8#ci>HIYw^-(w z^qNoK9vnzoF#M9VDE(USvqeLwEZk--#Jy4E81qgEpE{^v%G?pj+bjjE^UbNJ=?(12 zCIC|AlV{ps968W_RRNKiSJpes+Iy<+ov-j0ZQ?KH9k_O3Y(c0WlKDxry~LRTRTFL2 zl+8u``0bIKR8e?s@~nCvKAIT#MLJLN{Hj7@-g!XzJ~%Olm8$ua+}w48(M6_nRvw>n zik#t_tBPpuTlbj%dHHCX;f8`|L>jl$I@{Z7dhV2lSrAoQ%^DYq_eYT78y`Z?O+}_b z#z5Sq7Af73L5bX|_PFnu57|5DlJ8O`q70ZJ&UP&ZQmpnPX2VVzoOQEmVb-A?QZQ=$ zfPR0hI$Oc__L)b3A7wstMN?VyqSTy|Zi4@F?%6%}GXD(yt3#I9y^s%J&@}+E<^F<K zA#K_X_R8XJOVA{QTiV)CViVB!fCFJ<$`e~OhW1ceKUNx#_;V9JJant;+1WPTa&(+= ze0#BD{+)pU{Pj720kx~X4!u%k8W>BcIy;U){*D72jBgGY%0tC$t2H7QHT<+cR#?!V z#A%Xdw0FpMrreY&`IfRC$x8z%R+Zh&p$#KF?=WU(d-x*jM1s9?yx*TsY#V3Gk$FtJ z+B6yrWS|aPZfJOj3)PqIgwBG=n`}Pu5j6D^#U88?quk@#y>EiecQS;BvL~9#huHOe zM0S=*B`NS91+w^87hCe|-d*v0a95AMXp7n95Ds5Z->=so7GV^xgn|aU&er0sJej>X zrar$Dcb4mT;>VX_$;Y&G(vt@tSb|;kFK^Vx)>KC|JtT<>L%l~fOH};+Fc8$CNYRl> zqjcuw!9ww<a9=X<J68L^d^iO-32|)H0hVFtF<1D^JIiL_X`X#Gkge2kWp?3pXWEF7 z;aTr)%L`t^Y{y0ZG{cfDAj=f72ly%TawXivaR)Ejt8KV?XT_DbC&vi0fA-s4XP!Kp zZYuwb6!<BbzpE9bxj^>CK=nyh`Q?KZij{ot^5PI76Qi_H62u*Qi-#LKi3_#&X20QX z@XVi-wTF;pPKkVQ=_U!=KPkT}Ql0qK_5?XiG$}HpNC)ETgec#4WKzkDGIQEe>^rNS zmH|*fY~6qyJtfIz5nT)E`X9XqTy3y0f{KKxK6>reF=cv%(;UUzPXSRGL?=+m+c^g3 zhPr7}_Bg0}i)&_TrBkUx{M3$E?W6E{0w&-HXaecIU8S3Az{`LCBarP#mqc1#w0=>w zuF;9^`-yz+Z3gw>?VvYO&>okQ`RCT~mnt3NW^HyC_Ng?#C0E?Q;m9cEZ7rLWT*G&F zzH|+Q=ba#Vg5Wf{{$(Wo&^*g+)WI#ZJAgyq1xjCrQ}rwwSZda{+0Qs6^R(^sd+Bjg ztv=NE<Ln`b>a>69Px^d+zd6dsC?O&%WIBqAO6I}!jkmwVaq#B^q~v6`m<)x9A{lLh z|8@B-+bx_7=EvP<2A0c?H?<$&HQQ6aMm`6_s<EyxLV<nlud)JvKXxM6Z6k%ppFftT zgO~2gAo)Ik>E2e^ZC@HTNK=m?8EB8W5+`2q1QM7(!0WmkP<kcxW})6FOw!_<FTBd3 zHk72etnF0-IFR$spurPOUsTKRU<HZIm;w93^p5t1m_)Ci{GlwXsQ{$BLB;Pa!{~?n zJ*ny(*7=p^zZM;KkC5NV!4wfUj;ep9!UN@Re)nN|?(EM<_-ufKY!(maAIpZ_#?jg& z5<P~AE`6xVd~1Jd=mO>Y<>=GZR<-%{(LY!J7BQQqKKTh$xQj6FvFAcM%YyavEgGl4 zP`f{UR(#U|Oz_}Q?x5{OYr}{25Bm$@erb9{+z&CIWU)5#kL5l~FyP~3HgF%tak}0r z&AHt(w2<@yb=JQPqv6`cSA7UbV3_o~=Xic7nP^*`urr|G-y{$Vqc8Nx!c2fIx#+oj zYs3|QE;uLj*}we;ctId5U8-`d2jx$Sg4945zo<u9I#?`Bk1e`GcU@}Ph^UFc;Onb) znS}AJczeEWxxT$9hm)FR*_0jXLu*!GRUps0w^^Se_2l^F<D|b;eOmrfA2G?T`RkIe z_a!o|={P_quj<laL(_zsUB>h&L7tkRlP`)*dG+a{a&hUD5@M@tw26_ADB<Lnvax*J z_$Pz&778iYfhGb|_6c?l99&$j<W)Lv#!;XzA)WvR61@tL=$Blk2Ce_G{S9Cd0<Fj& zJ<woNkuPTRPkXGQl>3VD{Lfgutcwp{_`LmeE<&!B@UQLi=o7)cE;Y78Ll5Y{BFw^p zD^~qN(gF!H0^Z5fvEy?cS)<8A=Yl(a%>;DjktMiIF^J$joqg5woPrSfTy<(-O_7Pr z7VNT`#unjd)^vbpfIs*AgbMUj(+-Fs+df<$c^lUD8mE?Bd_wHo6+Zn$+t_}kyY>LU z;qm9f1)`Z1aFU6chvskn;}*b=h!mxBhpxLR`8+_RXY;Q!wr~;EpFBugD*lGs5Qei` zJ6=*2{_dZ3%Z>_=FHAPdGI#?P`K;5f(Ku~j0d%ma<_F}rwKj`#wOQ^A);!>R;Rsco zArReEn6@E)1C997;BLRUbzS|%2gu9vKn#jZEhyUml%BIKEVhJ(I4&H}S$h#I=U2lB zs9+bbXEvzNaH-+>JB@y?XVg`*AYPoJ-1yRrw3H(}q!dB0&nyBORoQo3jRm;>wGM%? z%%)X$RmPC3s+CyR@+iMQ#j3M(C<A<C+>HUg!PtM@*gOnA!fny0M!>2rg%735MS*~f zkJ94tCERkH_Sn{n&7`fR&I127hs<V1Ody}*YiN>0ls#>@06yvsG`X4#Ey@@xZJI}L zZ=^PEowuwlF>ZPz_5~^xeSUmPQ=5S2U7!J^Iy72Kln*vF+Ud{}qCh|%VbJhUYObvQ z0RT|e*>3pRx%G>IQA0w=d%XXD83Lri1YaIg^-|3jBy5xz95<AiqdPCCKn*`3s_sU2 z0q48+HJm!|pBn0(3V3AvkBP$V77e9E%!6<C(~40x{|csWo=TdAh)NK}_O9-A4)bC@ z>2#%1q}`FHo(8`#bR<U_{5pNDeEcAJd9}s*qtS-&!7Uk6yCkGqBZi%(MiA1Og!z<g z`Jua?A8uFC(f9aMObo%b_p06q5|O<1Uw1DP84l=~Rs|h)`o}KZJ(LJh{;a9jF9~Uk zSz{1sZvxW%-|r@8%kEqB>!rp_i#rl*3<J;2?VUxDgp?$7ioS`}1{dB^>*NZY88yXu zDBCKF%k4;n|K@r3rbj0i*iEd0z<l75@_s9?_p?rCH|?iv3(c+R$O-A&5dpEWw=2o~ zMON4+H%nn|xa~|@$ci>T<scx)1JUfpcd_r5jC`~dzCi-w|MrqE?54_TKgW>UXX3%L zy#;VBq(*dFd3);*z#n#Z#f$#=ec&SkltBg7K!lvhN-OwSt<mV6^=^NfAGn~+G)ps_ zu9G6Y11QY{OB3WO8ap@fwvNGucM12grWt2VoCKg)rWjqDqz{g*a+8n->p~+JcL&>F zY4<PoGt;TP2;{?N^)1prso7N?h0mNnHeGY>Wa$PL_#PO5e!&4$T{=u&UHi+$8_%d} zX_Pr{{$oeLnnUc_h(ciXL(s6fgvzr(bpv<OEtH^(nAm^Kw6fA^Kd^TV{8XyjuPfmX z)f$L>Np?M`V?xxf`u`*BEyJSh*7so@K}teUP`bO6Zln~D?oLIzyFpq&5J9>mrMrhl zI;6WBhHi#;;q&ahfB#SKarnUx!_2zZeXT3c^IX78eq_Ek#Cca<GGiFgzf-;6C#NJd zzpYyQfZ5O+?P0?s-K?=T(e5`mL-Fk3q|)Ar!4Cr8Ri<iEg;_guL9=|t=m=4DkY^Mb ztpstie+4Pd;2s>ws}`kmewI<g#H4yd`UJTAR-f+=#6cF;OlgSxe~so)y!prLF$SOV zQ{cTZX{I!*T@Vk}Wk4GLTvjCp)KY(~Tm|6^4#?b>W_Im;i}It3@2475r?vkn9+$Cy z^uWIU-VfJ6#-y<n=!s2b3`RM0cUIx%P{2iKrO_W4w)L<^`!Hb0p+?42KO4QN1MSYX z;W{k;h<hn!rQ3Df6~HwwGs1g@I(Kc}_A6}UpCvxJuU1$oV*ak-zc!Qmbm&vR;Epx$ z+T#n4!>+7lwdcYay{wOFg;^+U!~bLEQIu(~4h7fjJ+0O=(`mnW<_Db9MO<6rFb`dB zE}K(gz1TzOdyL!X0qW-4%SpylF?_y9s_7#9=AT6oPY>i@GeS&po+y`$h|n2bKKk{w zpi)-y!fI-!(1y#ltV{{AqtZ|jom}8$(Uovx)#EyM<W@=ctPXg_zo*lm^g)X|*3fbu zsy1i)AB*(j|LwW3@jLv5wyXLWcFjyP#<R0I@F=)=lh}kPe`D(d1ag^X*1&T*Q0TN< zFF|ySkd0D#Yi2+~7iCco+AD5WL%JT=FH-l)UnDO+AOGTZx`Ktfp!-V!-O@nXh7v27 z-FMfOx_hjaPBdrIVW-6^U&B0WfIesW)}>Fo8RjTS{PLpXnZa-&rz0Cs1HD~Bray>? z({un$Qw53#o{VOnjLHl^p2ouzwet+uVO2eY>OWf#j)WHkKlQZQ##2|SbG19ap48A& zOKUQtNaJQkOqReyKR+<Y@1IBAM*ifIdQ>lHayY~76<X(}-80wmw`FZYbVfIJAkS)m zau6L|0KI+XOS6$jk{^7^G@D|*Jh{+{=;j#q_tZXmignnCrbZbhp>dua$YKF>Ycl5q z<dt4ILs|WEM>ibbAkUF=R!=*W4Ak#aMkP)p(=-GlnvwY1fhG9gJNB=O%N6(tFz#e- z2ZDch_df9GpFAB(MC*=Ta`a?IuqhN&;rP5i;1B$y$O99yB>uzm4>8*<pl$%s*rz!d zYiQ$0u%oql;YuqJ^bl2S<()jOKHzPxb_#Nke+v%k1l?%|++}qiE$!t>ZW)eWuz51F z_R|thN6}y<Z~&j9yilwJxn>ehj8HH!Ug_qXILA&w=&2Ev5`!+|k|R~4daKC!PgY$< z(~Y6Ekua(?UFS89!qV6DCy)MFH1PC~{%1fS*T>31=-WE}fM%n#%{Z2MP(vh809ro7 zDn)h7sQ3Q%-d}1$*5i*gZgj~*7PILLc9k&RVjj9v@X+^;31Y7alcuBek?h!4_8HC< zuxc~$sRutJPhLQ+Y#>X2WniN~{Z;#C+-y>goC1dF@Z56jXIQ7@t`n(*qNHreIf5v% zv}4x(K6d&eN*D_MwA=eUgrk1~x}om_1ep4d0NS&M%mf+8cryP@@qL7!JRN#jK6y0* znkeetJ6{N~6hGLhNB-kIyPnUezN8NdF#P8+Ux^9F4P3{Rz}LNTaa$bY!ScttAQ0~Q zH|LY3avejX84MI+qzqFuUU4pk&E-m?&a3L*Ca$z<gz!XC#?tSjhEJ++CwnHP2hDR@ zq!bwUy0JNo*^H0>hJ-b&<<2fxZId{04R+ex)rnDjdX{YmyZW?ESc4%2wyvG}zT)R$ z8Qy-50Q(db9_3V;W@Jo0g#Ley!AD5;XuQSko};&wtPoj2j+U0-Im+UP(YaEVf;!qK z|3(Ni<R8?7F*>P<CIQuQQ%)Aq%id@c8*?Ch<t>H34w2KBNLO0~4hioInsq~J`HsEh z&H74H!ohY1JMt>?Yo#SAw5@Lyp{xncGg%k&Rc=lkSRL$z%?ws7DZ&-OI^To7RS}+o zkOldjvTb9Q!HDc5%!uP7h}&C^bJ_IfAc9}10{MTz3T*8wap7Nb7-jJB#IfsUhv}V$ zWiBnR8E$xWudlG<D~{UDC-=5P`QV|YVwv2{$MX$)X~|TQPQfwtx13d1V0z~`BVku< zlq%&Di4e#t2I<aToLmrpxlK@Dj&`4pT}+?`p>8jQFGp+oOJFx1$7zZv=FWWj{@FT? ziT@R^vj5f%EnTMo+H9D{;(#=oN}08nO4x*(mbz`&psUHQiymx7WA)y8A0X$FKWNc< zPW=q>ZwUIk`M&LB`tMU#!*BQOeP!`Km_NySIx}4*4XG(~#R;*e{PzU~vp-y^krbTR z*oAw{W0MzNdG<8LozqF)FjHI${x_$jUUMsi2CV(ULaxL=U71waa)uR<*@CIt?Ne5h z9ZIeZjq=Mvv;fNX{q0H}Wwnn=HGDSXNruHWOoCm@+Lm_Zoy?ytp#*oL|4r(Bgd4DY z7KvEcIDUJzerO|YNyq<t6#qWY7i<WA_!}or5Y!2xFB0Xycdvai_+{<H&^x}MS_Q`) zUwrrP5yz5*;5ViRUG!fo+rGF~zMo0&Slc?3ad2ZJe{q65PL{i2J`7!;;@J*CHixBT z80gdkcga(S{4@3i<r1GGKhhu7cjLTq&lc)k<*HlfgjIFT4tnuh^R+DLtq-6DOO@+R zViTEl(^l!A7HMY1_7UX#Qew2I0D7kS*cnrZjGLcE#Ap8JaK5@AJc%^~U6MXXjcN{D zi|Xlp9zP-!@d)hJKOY0223p#W50i9K2aWC{bI~hc<hBjg(9`PRzn>CTPTG3@O!`s> zdkJ^iP+3mA{d#^i?2c*Khr(Cb8lqwUUb&`KB%9Iej|f>MkzGmRG4pnTLyxogjpb6f zum`cYwpC?!&vfkte=N}<>g@Oae<~^A46ypxT()2Q%*gXS+F$=E?Ec#gX+~gt8Aka~ zJ9r^G#xy_PMO!uXpda@h15nWQe={`D3kf=>!)*$9V3owJW65ze31U~RVD;g!Lb#_C z2miD8pCD)&#*9pdp^F9~;TXlgX|*NL7;J*WQEp$MxZ5E1GJ@a~d|DWzNN?#-))*$s z>=Y$FMXQ~MFUg{Fuu)i$^odQkPTu(Q`+FOG!Gu8S5*Zuc$^8aIqyPTX4@Nl2=I_3( zox;1;GWjh(my!9aA?VckrR(fXAuaa5wj}n|hdJ?_F7?84J(HOU<TXdg8tyeh=iH@o z;x=YO%1PM2KRAz&tClTHb5cm&3V-I?N*S-Rp(#w!$%q}LF$dyYv*I5+$WZBS-pk?L z?NAmPqGZG}!!~;E48;Xzw}VInEdDOi6D*SEBB||zsGl5bAkzOF3B|kS7|yO8cv2y> z-_(BWynQ8h#S3i*wm%^Hx2XL008{EGbY92U+}GBoZZEE5z@n$F+$kLYm$4_k((Q$H zfHo78s*rkhm-+3UGlyrcuBT4S`zMfZc8#e-OT1A1jEMO^l*3NplD0PStDw#CfjH5@ z+dXT+-6znAP_4l4@0QAgaR2_Pbn8cv1KG*EQ;a8Qye%{@+8+Jad-%Q}OXK)ier@kW z*SlPOK~vB&Mx9gGV{+TSKd9C7dv8}>>-pNh??U+bLrZ#?lGk5L9vo0pk$Yx0ekj-h zQpM9+?mCc#<$*j0MVfSO84o&znlzWTk(Ebc=7?4=aNYr*Z{N@5+XXve?1A;pfJv+2 z1zE$R;K8@)er@4I_!NzqlG&L*)d*vnx+S{=_cONV4r<bok>kNZdUSsjNi#mvgJLN? z8^{0Qe^(Fw<2y;J|302RY$5hbhk;|yc%8VDx0Uq*k*dzK$Nzqg1ElHMlD5zQWUCZ{ zb-~IVv~I|3Cm8aOp3!kMC{Q1wykB#E_qmyl(FL!x`K9c%-Ka@RFZsoOK8PL`j8A`P zw5L8yaX;iyXO;CF95-V;A#ujmaO{cb(>ilfI-O=N8?PPZ3XT5f%x6Y`Sg*jf_ToQ1 zt$*J86PAbJ1BAx6mL*?Q<{qj!XR6(N?6qEk&yLOg{6FalJ_H{Jretwy8DIao&x8G0 zV5uC(v0z8+g2+vk)xx_X-2W6ttOO8%8WHaLm`7qw!6%PZ3R1>|MBcFp@$Mz6uips? zR|NRPZ;vAnBYRR_&F>M11HY%wQ;&fhwcTT(TwWBGG=89)i#$wN_RnF%{sNYbkT^8o z=Gz-MFJ^=OKf@+v9YJ^^Nd=NA&^21K7FVHmzh=g5nmXkPTWI}%5_I`Kke%GbirLKP zJdqfSEFoF+?4j|QaWYC(M8`nHNf4HF!aN_hxHTWjBPlAmU^c4W5FwoFiCuh0A+0Z{ zWfd0pLdummK)iZ-Re#08lsM9*@UoZSyLrNEN9B@MktzG{EAI8X#JG)x%GdEKwGUVC zvpQi+P{_G8zd+2vYQXV`E=|MvzqK^zhPgvDaiMs<keXMnW!q0f)E7WA$`;x&Z2C)8 z2M_UIUjvLA9gJZw*1f?PCVT~;7C;}}@RxP*DHlx1aWY5w)!X#X)M;ZE?J(?O$Ah2z zr)_&Bh+Xg^D;3bTLwcLW+St{L%IJ{uW31Xfci^tfPi@sH$lyov>j6>?j~rQfuUF&a ziy3CPO^MEA4;rpszLCUw;fatI8D7K_v?x%wPLLV?2BP7HCd2+gv4||>JwDNt0CT>x z!?1xn8wbx}mEjZFmvzrp?r~inenX8l6kjdbM`B{0^{^%WE*OjI-^<`lOvZ3<kT-I6 zo()GLitvQE*{7@B4CvdEmB&=Loi;tK=fiYEv?2357Rq34QX!yb=QYB8`HebyAf_#L zkNT))Z?%j|-g&~H#+)RZr`ZU!bjOtq`%U=2NThaM#~9x>iea}@N`kEOITGlm)mc(l zE4`|b%QA^Fm=zl_S&Q!ceXU%boFsF)%H4CV%rINo)n>vzf3=CHEWT^~^qNO}szl9J z9Z5rej#9(hJz(sGwj$-Mm)!3|c`N!TNjYO@?6GPbBGVyx#yazf12mLYH+S0*XF=+q zV-bk?prK%ohw5yU3mKVttYp~*=LT&(;wPcyub*K6me(<e{2C|HC*V%7k9|#{OfdWe zUw}tIcH5y!p}aAo;6{WU1d8TODo}r(3<yXF`XQ8QtO|13(<diz`ew&Z6)Oc-4357e zsUk|RPB>ShXoq3Nd_{+dsViMP^AR>iSxtEFu=InRmqIA@WA-5z8`;Qym6Ka>Rje+b zuK1}_g9Zr%r!44Qb5fIV6`V6`KzS~qYi_R`epV;s?C||p5y6%puMuY!Zjy92&#&J< zUNadV&k<ecmK&f~PBe5ZJ0lB4l9{hOM*cz!@CTVDMJonB*W*E7rvNIW^f7P0tgGcZ zM(B*I>&}UgMNNlm1kv&3RE!<)#xyBXogufoN<prvSG%Iy7hliwfRBhuL8{oGBGvu~ zZY3+lg0|Vl&-IJg4NfjRr?`0fytH62ekWb!4?lY)DF9d%lWCUAiQdf>kv*;V_&MSN zH&eu}?T|+5oB!R~FiojFAWiNZqcgCP`YGM-JMPF!jVQHu;o!!SU-s^7*RpS=xFM2P z$_cThKGZ)4G6?NI>0O~$(et*Fm7G;tq%+e%HT*z6#F~#Rd?0(U71$d%nYg%fj61?n zd)&4^sdTEfRa)0?Fd>Tg|9~%QKJ*x0?Tf*)Df&(>mM9$VeEki^MQpK<BYjF%pQ$e3 zf_fXPag;jfRK58sQ76q^dl$$4h2qC<XF8)<4g;aQwN0f_ZMe(isr*9(>||ic8G|++ zk#fjgUWZzQ9hK9oxq_YJ3j|b8XL}$uU4rkgN3$lBt|p2UW@Ku$cc3n*Zilb_f<4h8 zt-PAJh8hnB*Uc-pUhq*Kpq9>OTK;(AQ_MFds>Xu0;NJF!fc<15@_UDNrID)EK%Z`F z2O44))%?mNV<krjK3^k0SLyTW;BJ8=)or)1Kyeslj~3x{v0J|zgGzDb5$tMd(AN!> zmL~}Tcf%_LcQuLdjG~&|<9*`x0%koiJtZzEy+SxrAB8{mI~V@Ed;=~9*nPkFUYhx~ z;1i+@XV9URaq&J$1;?=Uukm3kbI)SF8U)|rw-3zCPWpKy2z4O#BY(E`HP}ow^WCbG z8r>_38~yhuD-)e6$baZsbJj#)JTy4`ivmTHKCp?d>@dG%(oS`D-o?xTGISZ%JWAF% zHipsXR_ZmMtS5my`Hb^<Q-C=ZK>d|uOU%X4wEM_>Gl|v+y=(mZnaYK`yUr75Y7znx z%(=H`0ZJ+=8pGAQ1YWqR?~mruoy)_{I^TLrpZNpSNO_B+12S@$wSg~V`!u2j3bE`} z64Te)qN?+WKqVy|@OP;xYuSH)Tcf=JJ~yL@t@<ZQR_WN2oC`YB5d1RmpJK0%72gvr zhb5zcO0Vm%@f$4wM3&}fw#jfXx=nb$;%C92bArT+Qhzm}%l?Ksn8T>lk~U*jHZepq zW-XswX*Xn<X6SKWBQ6}{S;2554s=~w3C%1l(vL!ou>Je`91>nxzP6leO026B>3XBv zWbulLPDj`%EG)OGD#dAcS{l|+9;j{QT*Ih9j39!oo}l>tJc2KICG^wt-rZ8pq0)WT zZ96_X$zM6867U;MyJx+;0#<c<n`T!Pj|eKsNsS{=@6Wwq!mHl~ls1a87y=Hh9<PIa zEKyBO%n4K+92IhUCA)bA!sVngrnXE`sX_<|xnb)pRU<U$=%MFPD3D=t&~&<H0!a?D zq3<slS$8Ha?`s5`D!3D0;MqtZl{wwo;MF5j?(8JRvT7Kaf$hGnhGb^>*Ou3@@AKGV zLhW4CXvX%hgvvNQ^Ib^dNm=oc^<}~XHDqsIg{m(I6hcp3({;+uvX?A!zjs(KJ)WBr zZ1*&4QS7<yZu~hMG?|03PiE5p%1*2Pow+2r=R=s%H_=@sS(>q1IA@tvi{P01ybX~K zgnS$TIq}MU7z&!j8Eq=_iu%oy8vs&lwJH$4t*-J-n#Oh0S?~C(E>9o(ULJM6#kjm0 zmjbqVMMpew!qa6n6&m+d_!gA?WQ%MK+OO;wjFzS4;UU%FaTIgsp=2T3K94&-(;BL! z-t9d3JS^Ph<CSsdvjslaFGquAMf5o!2|9h?|2C8XVx*Kk5*NloQ7GZ6Fg6pR#1Q0T zXY+!=fBfCn?j^$nzl7}<tH`kVLJ!{v@g*vg4kU6M1Z6Crlsw1?X(;9AMa$POO=mWK z<y95=$_nn8V+Zni!$s?Mql-sUNnHGhy_ahRKdleMzw!25#f*s>cCN0TvN)-CCrOXf zb<LCm@Fw9JgmucbVI!)I=%Tn_`Mu4wI0EP4878FMv9WWmE{Eihfu0{C3%^su0|NEU z`S8L}CgPyte03LNa-d85;r`%FeKx95pkWoF@K0gT88u1GFPq+s4@Gs$%umoH^t`?M z@ZyPsmjam%hZp~I4L_Zp5YO$<vO!aGY3b4HNF*O&T1e-rWEt?It#s{SK~krdmNOsD zH_obvq{Kzm<44xzha28ry0+*Ia9eVWI^BFQD|XjXke|RGq2qutN)a5R<L<a?ygG<u zSDCR&v$@7D`&RQ1Vk-vF9TC)MI_P0Owl~JF2iI7MS|Lf1KUKWm=;kS0>jDJO{@~tq z>ugSTe|l^E)brY^2|*P-8OuA*cwWJEPpLQZ6WQ5HJ>3m*$!*ulRxDWqdl}n&ML9Ot z8SI>^zRmh5$h~F;w>rRYW3^TqY<A2rc;fak?(cIG>tcQ^?>qzG(vefmRt`pdXqlua zY<Ki)bQ&|l7MqFt=5hxy{U+6T{UpXt=SD>ZTVGS(Qj?1w<X~vl@N~tdyrp^-u7f;l z(ZR&nze2ah$SU1h{i<++^5XGuS+Q0qY)+-kcRtE6MY!n$VKNt7)613HMR10Qsp6X+ zL~y9?yG2ov;0o(b^e3q+kA!{}k{tZke*5l|KD+&)P^H4tPx6Ay!upiR!h>IkPd{Td zs4=o+K?R&xEE#7+)b!lL#CFy;NU~h*O-9z#7Tza9k>P9J<9((lauIAl*Mz92r>D1$ z`)9T?<v8WtH1R!GmXC8?zMSKo!)9#=3U$<Q1+LnLUIP@tqg5|rgH;yZ)Z`Ntd~4Ks zV?E1h(Q_4VDJ%TRfUmLa4(3aWb+il@mfNWAXgaQ&j@#=j!eC-pfd$|tOl;w{7<dmU z?wC(tA81C}R~PkNSO^6qpi}jcvy9r9F%>r=6N5Q&nZ2Fi==5$i<=>bm4_-R9nag6~ zX@7b0Fnk;f)H(0y73QAed6$yUri6KO0zWh@8WcNR;@I*7CxuLO<Ra~CCLb;y9<)!f z%%b`D{Y{7L*-tIH!r#~A#n6V#Uw#qZw$Hg9qCFSFA;d`q;d^=TmBc1h+Ax9f#D>TX z=d-w6i4`+*lrp#zN1$px`(ujdw}%?9zo5+LOfR^8$G;=)6m;AxjB#5Rf8*&uSe%v* zF5)9b0-{B%H7}k*9($#VB15Au`pI2F%5cOxnkq{osKxZWzieMQbr>pUN1=zMUd1MM znjpnpPJBe4gKD;U%OP$s=%5(DWB&-8R0gyJFyMz2xhhJ}-F~X5%@Z(8I_74Jj!8*N zQX9aiZRftVnkTY_pJoh6piTC>E}?pTBW>@+I8B`aLvfRw(1q^rrDR+^2oAesJLWjn zKc5&`4SjRsu>Oh8akpkY;y)oNPqq*cDD<Egbs$|MUfR#9+F{}k6hlaa`7AAf-3_@t zL-4Txn_DUrn2~kk8gJeHbnh1I&LwKUF>*n1?PQC_I@-ou(0o2$aKBs6`xM5WJeN$u ztNmsp$y<e_PEOF4go)4A;A@9Vs)%j$(=aq%*&*?ti9)pMB5@xFG0b+NrU$p;11;aU znlTsk#J}ZQXF;XEGF*|plJ4(J<Ja~PCdX+`kXoJUn3V8qmdlaJ`X%iLJ!r7Ld*inJ zJF2AqI2i?Ja~xb4vn`;b`vy8wEkuinM~a1p@EOh4d)HdJ)3Cd+X4-3t?<`uz$s6t} zUs(_$ly<T#?RS(A$uGs!m4ecvWFPhFjJ_wyMpS-yyeBSq>p;)%$mSs=<Q_s6WrAn4 z6X}y~V*xTire+RmTpQ(V02Ilpxo=2VzAg6LP9Tw=u8n(KIeK$LF?t0%IL|vlb4jhc z=}fDdo_C8%NNE*(j(~{w>P;Fq8|f1?fWh;>vfBHFqAp}zgsiFv^-c(CQov_y7C4Iv zOu1#RNlF0fJ~53vDcG~)y&v%17X25ia3e6)OXYUfp5;O}CMQkfz>Jz(mGfMU*9-RY z&;5jB7hIyFOIAxn+&x|Yu?_2XlA$8JARR|N!5g=~TN8IwUSrN|dip|AJ|!XSa*9U5 zbbjlNxHG$Dnw<FpMo*i#Ax^Nk=M%S&CxZ4UWG+It=hs=>vkQ%fG$)7CgOr-})rDk< z{jxNSJmr{;qcO%;mvT^Wi`=!GarL?9F*_gMw{h<i-r6a0Q)+M%8!77xh*7xd$snB` zX8sj+Ju4L2dHoW-F8ydZ)(>Y3+sSsG&GWWdhzHJvL?Qz5MWFHF_`ZnqWeJ_{;nSe& z<nO)y0Fd0FP#45he}WQ=_a7|)q(mzdY1psMNVI&f_32YUuuOXoY~;(+5@W__L>r?X z_OV8L`zKb3C2-L9c>1kgf8fy@#{jhBPSJCuwE+7lfi2wb4%b26?}^N@DPwGy8>C-@ z5!%D(I>Pi&@bSl$u`sm1kVDpa!ahuFbcSr7(?#}g<3PEh%eP;w-5s@%npxhh;pM?! zU3k*(B!bX^bCWS~2=h!P9P9E+@khHyzlKfXYlZ^$OrAk-rz#x3wqVx$*0VrT)Vr2_ zQc=Bz^{)521>(qUbk`Esz&zkSe%TVHiJ$m<vpB%W=a<a2M#1^{x&8k6Cn*47qgRg? zGsXG7U{%6pOB?8@YBp^^BBO5TRzQw%&UFDxO)*8PXT7U9^A;#?<<(2@=0w|+_TO&k z^G*%9SO9N95dpx~BRxcr=TkinSbBPU(=WrIedN{QQk{`m&hu`}KM||(liaJk+il6& zqZgSzTT@~o$2H4bhHdpE)!J3sIlb}fZt?D(@E343J(|e<85DM6LQwUmtupcP4B@t~ z@GNlUp^14SZ&yAyM`p{WTg%Z#xie^gO)a<b_Yj!;c2}g1yGnj*{kCUI?i%w+70>7+ zUjv#nt~J*VYcLQVV5B1I8Yg~l=kQ%=ZKFli!QV8;WjJh?yiu%Z+HF_EjQ1$mBOC|o zoiaoN$Li-vsaj84TSBzLqHzq)kjaMYT<V|>n6Z&po#{tsmL)|jU^A*>W+%Tohdx{N zYdk$Q$-Ar#Li+P;`+k)8+o*c6?Ajjm`%5d4zV&Db)!!8Fs<{VmUGB^(kMxSyO;d{( z*zn+TY1vMku0-fqCLZcC+h;2Pz(V&2p>x!{##S;7kLtK`6#kK5Z1rg8$Njy!bm!>- zqLPhv+!q0cmmgoy;K|(xe)s`l9;xOi$_jUc1q?$%{Xl6CVlm@jN?}LV;_Vzv`;Ad3 zq<BHcVTotehTC+Wyf`ehm!;8X|6+<sS#6@Zv{vYQ*LC88K-#BaCcJ~>;K>E@$2C}k z0l~zBbhtX4?QDZKS8!M!o>IE6xA|Gtf@)zVS0a)%$A<Mr0|?~h8PDO;`A!vo5U>52 zNLCZMANnGYgA*qFEhN1i!S`HF^NkUsueJSsb*5X$FSy#Iqs$+;pTePJwNW!BrFUhV ze820#T#)sO+UN&h7H&UHI5u}*lz~P<UY$p-UmoIy!ocXv+Kj9g2N6TPd{ZZ&tkL_H zW)(-xYtv$4noCLe;$R_@>n8vPN!M*v$&US>ie~BaHv!L>@riGl96eZ1Jn7fi0jcpK z{szHBheKuF#rNM|wGZ{&ADp_<O8O-Oy-p2;ms@VCj_Sp4q^G73?M^p91$T2#x|YYk za=%ri{#xD6Sj#&R|9vCZG$%QKLQ_)Riz57quQbhqRNmtVp+)IbWvHyX7Uwk!l4nv% z=~r3$n|y8P-0*uA;s&{<PD$YS5P{=cKk)2aRy=@P?0M5tP%s6L3}<$2eX(c$b_Bn; z=G&Ythdy)A(`FRd;y1Ih+WWS^M#04NeI7no9+UiClBMzJ@tmWx$K63#0OH&?*e9OU zX52}ZGO8+}saaXg%8i#t2i~GG_#;CJFV&(ne#Ir$#V~b6mLT$AgIxn)c(G)SFXlgy z-!C69TQliV0}P7Ya0cf1*BQ1GPpMvFJ3%4K=Nb;aT$_VBP+ts3hn~SU6y$b>hX#A# z%%W*|hrL*A#n+~D)#jwv^QK?Gze*s7&lMYA1`(RfG79A%9fJwAquAe<g#S=<1c6@n z#E+k`fbJzCxN1iaGClgFc*h<W+Rx~RW^R+US~`=v9IDbFBd(viyl~qoR2{hT1!OfV z)!I_`NL8ubC_Fuc&z04|mrS#%U>0M5UKAtdvCDERNsvb+4!iqJ^m?GCWExj>Hqj*{ zM18h3pFoo6A(<0iQHlI~baU83qxra<h4s?5cKekCz91z2#(8Xl#!JpC?ayAC_ijC( z;X;<T{WQ_fiN~`ucgF|*qZY;AQiHy=Q(>W9y*TMxy7mAkDS2?eS3JowYJh*`S>67O z+7OcY_^`~vU2V*Hs<)81617|!L6bAz*!Z}#>$11|IZ^boUGGZ|yEf-ya{o7STZ|5J z3F;zYc>NSa-f!wlEzmr7_^PAP_WRtITWh5tIXQAa>%%T1-|AgeWJY_b9~Rx&{q7Qq zynD?ggVONv>akV?tn{(qj;PlI{0F`-C|KK~r8ml*A9;tKCDdiwp%+>S?0OSMkbbp6 z7+|JN6Y57(&o8q4l(xfZ9Wu#%S7-CEu&+C6=6bk_=md(7K^lYrL6Hz{zs7BKmV(C{ zzfYiz9GE_NIktO~?jbPx&2P$^T6#Rhj%|;_`fH<S<X^wY4rbvmV>E4=_zON2=hX=~ z%bVO@A0693AR!|6Up2l!N0TfbXe)4*$CRqLXH8x$w|19wo`)#?!Q#|=ouksL^6&RN zgZ!CX%EfAe@`rsgv=YX;-7N|9Iw>n#JJ9ch=UBUJwukthVNRHD>l;yOY2R@SlvN z@qTo&)~z8A`CM<GwYuvdo#A}D0kq(Lhe3QLcO`c!Ug7mJk?e2_Ta&m;G!buiYZw)0 zl+r1!eiY<}qY|0Tkm;=;AY@1aq9Xg&<7%QfKj%TRo9#HE>@b!q)Z4AW$Uiu8ZVL|< zZl-38OMhft%n0<J3CbDlWDg46>cK3ojOQe-;Fz!&?S%8%kSAF3Zx)Y|cupE`6l+(d z!}+%03E@Yl@^V&mAlEb=BsOEq#RPP2(rNSUmg(1SO%I_LoqI?KL?mCEtEHqit4w`` z&QglFrJytQ*3E8aXg3a5>~(H8+_e{t*BC?J*4B<VWQ9qGk$>Xp$!g$O#|DkLfnt@{ z0eb&(3M8xLuYOoRseCz#<Xc09wZ}2$a6x8P=pkrznYKd8isgH9%#zc`@F>>a(z;Ph z28;_+>(+6l_|CCw3Hk>G-xXTx%XACdMB5-RYb~cI%AzBWuvm`_J%YWJJ%GdG_)o$+ ze9uVW@}evjU$n1LxXAno<)_8`LD%7fMRVB4!R$J-B#;Hhdd>-y+Y%!}j?2`Bq8o%i zO%cfuZ2p<9ra1eVb!jr3RNxa=55m$&Rj1=qa}so4096@c8;i!*uC2joaIYi9+Nkz` z&9GP11OwR}UVNdZ9~GMDbMAvgqm!fWp|`jG*x&Equt!^y<wd_QdTRADzNsd?b3Y^g zsf-JaW6=^*%6U&-J|(83qw2OBVzT9;f*z2+P~W)JfIFzk3Yh;^Q*}!CsUwakY;?uB zlnN4CO}VuDA+In@?mFyoE?pM}bc7cM_})BGlJfqwAObGzX!Yh<&HSXr{|E&^g25LU zc_f?W=C_mBA2*jQ>-<sPUWOiRY)}&yc85T|gMjX~AdEkvNSNZgZ+rT`(G1IcgQ$wZ zOa)H-s~cnOFK$w(Z6kmhN-6v?6h024PwzWih@Fs^?pVmHUADfr7O|O^E5$_rvlXd= ziM8?`D#44(f}2~EGuXvERN5O(kgv5!<bRP?-EhRUm3opM*?jk!dEGPg?ow$!7L(Sw zH|WBhzWqE(UGA_krTwO`Pv|`Z8pK;jpjKAYTaV!4x(AB;*uB9iE2s(d<y?vj<Hdw- zyPoFpczBWDU2gSQWn5L*z5e*=c~0MKf`pbHpM;KztOrS3s&^Fm?X{vzd?N083jOiI zYzesX&YM;b^Hi*&k=5k;?3eqU+M(k;ez`UH)_V`7Us{sn*xUdvc^-GD7sPv&`g|KM ze|&ejyuxmB<{&vZTWe0TRiQauX&L_0gjt9O%UpMhCu4U^%~gO5S-^hzvu%MXGqu4a z!%1Inag)Xf@AvJ9*al!KQ19dFPklc`rpq@T^#6DjFu-f{eKp!+{6=Z3fK6@qbF{6) zG5UnOrzeHwWQ|6`TZJ>d;@db`-tL{pLwD)ur;qlM*yJ*m)R=P4&M@kBCeFogkS>G= z)$H|7=AfT$!&J8L{hU|1^f`|0RR;L$UU^5|*ss<G?w!c*QD3^{(r|6CWHZ>UWBl*H zof=5670OwMcc<PNj)?5(nRyAO3tof_4(2hsq|S*Rz^|k1u2$fWo?gcvtmG+ePNPuS zx!)PJT))L?pdwa>9^N5U{`fsFWIX|UAsUZk^;PH?P%<;KDKL8{L<PDNY;dw78x3>& z(*%**neGj7og#ANh^LE6uyKN`h|DJpQ=$R3AnkR<kgwwqc*B-<8orTxITf_Jlb&L% z>&ljuN-~*qB;*}wSLHox0&RC|b;C}rbkUQ`xRXAP7|L(;KN@j`v!M%=QQP^QhyUVt zxD0vN;x2P)eAS^eUt%88Eawx}k%|<+z@%LBI{qDwK8xJzRCW)8%=pfLpY|^d%kDCY z53eq{n}*+Hx#slN1e{iuv_>dnkFT_b&ZhQktNt19lv|EfV=N+RaiSFTE@gIM(PdBl z*q^k0w>gYy)uj5m=DAyTVjCR`zX688-HB*)%H?^EZgek-KzU=PQqw*R=#F|ZY{jFa z%TySSA>KZhxo`*K6U7?0a`cS9(Gq@e;$}<7B~z@;Ioyt&G$uAZ2PqRWn$2P7=Y*eY zTvSby7o6S)eGXG9Tz~Mi7ROc5xnfYTxcQ7w=XlmBd5mPVc)%_1*FoV)JfFY0ccw`E z8j)JXZQ3lz&YUa!*ZqEB%l?DX9dJ~V(U>i0S^P6D!AVi0%T^K2_I4i?IA~@RkILNO z{rEQD4G&XCOCnG29nQP8uaTI2sc&;Oki7J?W`^F$#i<Pic1jfFk^K>WRQisT>dvAk z*(qqYav(4=*Xn%l-V+>soEPop$@$$sso6vtbeek~CttjTL|q#~o$t_NON|GRUHU+% z2fb{mR?E7|+AsBf3vjnVq@tBn;T}2@rGb9uo=00(7U*NQul%k@BVp-3ae)6<jd;pD zo2^xSoNxqO{-SL(E5bm+O1fSW!G(o)g`B96H<R7<vNiL`5Zxch-rW@wdSfGn-5yP! zn3w@+pfXd~JZ_JMzN*FC%F(++kVk1ehf&zuAY^B=q$!0m$1sqXF39|1(2D^YBzA6x zS?pwv*|U9bRf>n<<4k||Q1iYh3@fm!2d|EW&z5ZMx=A>h-;`hHx?h@#?G~-ctB}2w zhPW|KwTLzgPuDHkX?K<(@@j63MDpXUUFQQD>zf_P1Wrfnxx2-M%~Gf!pRg(5e(OWn z7<o=2LpFNj!v~moP4redx9()?W6Dk??XDO2ZyxWJa{itGrHB{>>#TXt;NZTkWCrNd z_wq(61rV{sUQ8{%SU~uglQS$Nr%jHTF>jUgP4G(WK5?MQNfN82R!aT2dvmt^7#A9F z(3oBtg5jL+u2m@~`ujfl(w9npBaW65<G!|S^)oXynF07j<Jl1FsDU3$TuPN|S^!l| zai4Eshd0|4(+LSh&M=3}j{~%|B^||EwSYU^2vV#Gg!kV*$}hq0$Rb<DX5V!+t#A-V zu?5+@J`1^vW@amqyG%TCI8HDeo~bH)&&wNOBy;)Cq7SYwyz4ueFf&U1Hye;D@6Bia zCM6L-l?y$t>6rHNFtk?~uMncUHhG$=14d{Fo|AmEwpHlYWZ<x>W|)8b(FMV--)Peh zWuo_cUDDpktgp~-;B;yYd+rpX1y!up7v2(Qx+PB3M<#`Ux(xDgGhV@GTJGCl<(IJk zf902wfd#i)(**v!&+waOoRbTj!2lJmSk!YTil@?^(kD#?DPB}r+YsopIVT5>LQ9f5 zs)3$STL)N;PgtCj8dq`?9?J*Hs|}PD3j89DF%ok!7qlh!Z<Ic201>cT%)Rd`{2pi0 zWt(1#ZF5a<zTyLer@9)89_HEVXoI$!ON)mJfN9)!7oZQU>}!?BM9Hv%#UU$kjc=!k z^)g1mKxo@cn{Ty<`a|*08x3C;_t~2@xsE^|t!Xl$2k4-`gZ%>h?7~3+4Why6-W?5s zEr439K~_?9Wu{k~<8B?H(C|7=P^@S+L?3zC71J|D<fE3AU0BWxuzWul{$r`6f*Bx8 zii^^4EXtL2#tMOV|H9XF)(1RphHRJ3b3DX?`We^wq|1%pAzP)tU&mg@yqbF#!04fM z^vIj<eAl{50SUz%Rz(q!GQ~}T;QK2F{^dPynD+5p&qiK`fc_Be0`jr3$F{?j-Qk)Y zQ+=<L9PF;pBm7%CHJ0>!y|U>&zN~rRbpY4<vz1f$Q}5;o^MwAo0?)Jy4<_BkL*pUI zdj?NMUWcE2JO2ajPr#rvCJ29gb@QiMl8~k0Vx}U|$fwIZGz*ca_zBVsEcJO|+VSh0 z?lG?NnZv}MJDU5gUWzU^HNc!0u;zqif`$Nrg?%oN;t<uZ8CT{OzKLD<K%`Q!F#h76 zS>XGW#^$^r-a+B;MJ)+IV!~#EOyb&3OA3Fb3mH>)55BS^^nj_L`MjbUGap?U;u}T& zmF?6?iium!tD*1%n~F75qltJ|a%nbbvhrA@*3G>?akS))_^;Md?!8({K-(aThn5zn zf^!$#CLe%fzi|74(X2#X&go>1lT~&?y%oM46m{S2M_)Ohy>O$ubpQ;E^ZC<)dqVu~ zZ=8#*DdMZ11|Qa2FqmpOZyiE}A+a0}p{zXGgPSA<dYwbltND)Fm+O&S!}<aIPf+r5 z&3|3T2|(`)AF|kDI%Uhz-_Xmz4xQyxHVoW$J~i`o>(2-{&vNC_x@Ks5vfL$~NuKTi ze~6tZ%(!JV#Flxd5oX?Uom`!g8GUGEI`$Gz$<dK1D=SNJ>Z&?7KR;IX_NXKDq^Rj= z$Km?U73y;JCzT|JCdGp+H%YfR$K>u154&ZbkDK-;Bg+J7t_u+`Us-ABB2#`Gd{0|G zpYV`i;n+v*LEBi4-qmoBZV7p#(qz9XRFV0M`MzTf+K^!11azz8QJ>H$C%g_sy#!YQ za`QIq5Ayx`X_SbDD{MBEKKmO>{cF@47Df%ilLPm&{Y(@3$FT6#{KJ*avn}7aMzIxd z9+$77eYl#j$>N~JQ(fs#TwtT{p&U?m01H)%$i+zaAx@cLu+Kl*Oy=^D_?UBYmV|gN zC3Kd3T(s^ZOmD`1Rq4J3^SL*!H4l8nC|R}5^J{NxM-owgM{7vAv0dk?#3!BMSKWMM zP)S9snc;E4w5KNlq&QYez!I|0J>Zf<s2o0d22&z5cQ2vao0X>BNm%sEU+d_SjO#Tw zV=m5XU>#Q$4d1=eMqb*-D9CFWK-)&g^yRtPKQK~5oJ|PJ5j<!L)SYK{vArS)6F9kL zL2S1gUOyfDWQxSkg7%Cer9vVcaH7G0cA>H|RRfT5;sjiX-!>fE4*7cYa`Qr0`Q8ZJ zR-9Q*4_A-@!JjZ5joweDaE&)A^R(W6W>aC9*vL<~fD;|2A)fF%AD4kex9F#79Ls%w zmu!30ebVd+&8Xbz+2rGz#f_eC!@LQU)v6S!v#y-}bm!Yfh;;LyUW6r$Dh%&yw=rd8 zmuQ@}ErsPw6Q4037)?HUdf|9Tf2HWQi2hmuer7~6lu&i#n}1ddr7!%v|I%Gk9)4XI zw1xNG{NEvie$B+Fu|4j0>d15|Mz6T+XHkK7N{LmDV^;_VD=u{6OzbfPPLT8dL{XFH z&kzL8k+iD+xK~!*k4y%B59UDoQVEn#_7d>x9JPdhB*rGRwmMgxSi8zPy<iCaWN#lf zc<M@FX=#e?hQTaMs*1eYUy~SZ?=K)Twg-Rd$ocv1TGMWTz9;eJu32$8+%td1{%ye% zyxRx9xi~NOIX=8kVMGDAK-@dpFUbJ-C=+_kgka-7Gmu-}@<>>p6~WH?!dyys-aPec zWpDIU<KkL*B&0#^mV0vL-Nw~<9()iAZjd1qitjsi5$M+u!4-^_xLr`H5}27h<<ask zzpz{&x$so9A_RhGj}W|0RWOq|Dby!#F3s_;KBZm_)_K3kd4D`)&HTh_$6o-y?)daz z=BPTv$N~9Bxnp#t^SH&g<wr@Xm|^n(C*BF)jA|vfnf?)GiVb}?%T`$A5fV`mWG&1| z=7^iD>mfOqy@>_ozG*pB`@8pT;-L3%BH0BblAOD`Mu&#P7*usgqv}p$cQ)(HS#pAi zFOdXJHkEEi>eutbwmNr;v)SRxmCn2lHGW<;JIM|Q@~$u~TW2C^W`bo5T?Afji}#ru zG<xr-!<lm{g;cH6)Dq7S)=r&m6~>=j*)El(kvm0(F$-Pbt2nI`Zh#@-yH5~`+Uze4 z5dmW$6$(JsHSCe^ubVRcX6OxsUU=Znjpfq!j7Q&3*e~K@#H^Y1q^JuyH(xo!rli5N z6gOsKq2t3!=LiuSP)IMWpL3YMlH2+eceFA0d+^!v`B4(%7WXS2o?I_)Jej#UyII)j zF1%p?BNFxYu(ffC0?<VN{0JC~k|4NQQ(I{fQq&rQDmzmaZkopkTz0)#6W?82Nh~G} zs(ejL0({hO1PMDC(+Y{=i)6BPScfr~zJ^b)eLB<d0?tKe?lk|N@DFIMO+M#&*C{mN zr4xdu)k2Ebe8u@*4%_i~3TM^sdrET+a&vAxJmxXybm6`e&%)+E0&%jpZ9lNb2JI_3 z0YLb>xQ!alc#N3~?F$u%(d&?u+p5I(SBqUYTLS2fRT_=*o=YN_x0_$|OK0{e>yE57 zdFKgdIg1Q~gn`lzs+uP4hom>9N&tmV>A?ltQf-LrYeE?LqH%H>vOtkc?V?av>>37! zpg?+9Y@nczs-j_WHm#mH@*CXs;*Hsk6>3k{{WOf~?=(!v+?L7ZEo5+2l8W7P+PG(l zMJwR@`M72MZ!5VZ8QNG}2g-E@;u&rVPwd<Lix@#2y#=o?x}Rp>kXJe9QW`qy#R>$) z=0xl%tq$}=ZZ?jKdLBiA$)YT&>i8(PQJvZiE;%>a;z!E^mX+K7Hez#sMxXO@wlpZG z4JMFXTbyl$)Hz!n5R7K*MeY!6b|2Z%o1@;MOPi`vd;a?QS$3d*>re7b6)def-~4Jd zsE5|z(DS91CwLv@zcbLhG#HfyqM+r4VD!ms7)9X=lpWr6^ZDE5+(89(HqA8U3cs^_ zEnEu|JimFl{so7&@#3{qkLEtm={a@xmLzh7b>AoK!y;g{F)gn-fk;3m$FCHK`!#VD z{48{VGlBq!u~0~ox>CWEgf3K4nbo<D1y4!lbGZL``W)}I*JX^#lR0oZ8pk3)k$#EV z<yr`(LOW0#`O&Jb6m<3*;sOMWI51ZIg(*>z1baoDlkpf;!_K$}M~A{bi2Y|5dj>FL zW%jl1inur`+|)Mf(x(9v6X$n|c{F2_Oni@bTNRNVptA$s!fN%4ua7BNc`TWedDnM5 zdx-WX-_8(BD5*?D-9M$cB+e(RGduja*ZrwfBtrafIo`=Cou<z2O&}9_rJk`9FM6vS z;nw1w`#^yNVHB%|+Z=aJ^97;%j2<kwF#vewAq95^$6BJ8pBzKnO1%Bj^l2z$jPGE- z;9qo2Q5U|4-NkeJ2{+&bcW_j4$1_1SZgBSpa}vr`C~$Xl%Wn4h2fFB8Eahb|5Gf=V zQ6m~}k9A9{Z}&*HH;tW_`yD<rRn{lTN{#H8Lc;!_v9XydhL)+ES##rF*oy`uGN&}g z7<ozKE?OW8QZS7zBtMKyp6x;ppRZY1e$mtF(HtoM03lGAG+gKKgWOfRAzDO{U0J2o z2kE`cRVT+N)i|-o5o#u~sU#zQ6^BEqJh<H2Fgl3%dM+ten7Nd?rxxW7O!0O0dldmp z!@27fuNlpr3zLVC@_TCGQ;M%ZVJYUcQ0w`Oy)rS`lI*O4V+{W|^N2doS6TKn>*Rm^ zOisSw&&jIi=ovJ9Pbs!G%yWD}`ZqV(7mg0klX^j*5|Pf>_na@{JytN5Z!yc!5L3?i z^Fs0CHFU9=2-8hkXxvN(r>Z27Jkk(5?sUuj33G2#jNI2NO!xM}DCHCR!)DR{jIsJ% zYqe@IzcaelZghvUvzE>7xxtP;p};4n@sJ9}JHifPu9=;@PEFauGYPvAJjO@v6H;6s zlzg*3zm};Db>tj{$2oC&X1ieC<NiZLANV;h_fbh;uOI*{)O+VIJRubZ?Y=t#lw7Wx z`zxtK04?Rd(8_`Qg%?uVkbQ*S4akZXmrP;@4mu^h&2Z|SlEx`O;=R!6B(M47FZB6p zCBQw3!UkZXZk^5;M*^Q}m7f2ZBgVY7*kE?cq^~%So_8G8#!Kke?X^z5K7Qg~*2|q$ z1whpZ2sTdM`>TTFzRfmR@4AJ;>~ib~m1Jyw`;?^gy9?jK^_1T3%^0YN8eqK>yI;#m zwg&*Hsv!Wdl#1LN=M4k8v+BYr^N0He&WT|9ONgK-D;Q>HRp+0p_9+p32bl#vaZ@6% zV8pIq)?oL&a=|2G9jD4|f*s)sM+e|8Tv)DTb_H-eA5Y3SNJB~DnGqEdngEy-^g0x~ z<5YU6t26*Q5sFawd-Iz~`1p{CGlb07qJ3{v4K8*O^MGwTsxBA1MqQDy2IwIRW^IbV zsXY&NTH3w}<-3Jr9H4dG)2u?|z=rz`+Gf;R1fOqV<IVugNA~x;l~&@O>9fp}cYD;> zxJ&mR)P)?DWv^4M^+GO^e)5m~p=q}wb3^O3Hb7)<zvtRg`*vHDdhW!~RnW^_7H+~* z8ncU1_W5jlFv`STD*m9vzbxB1Mtu1)pM<7;A3Z!A%znuN0pp1s<;7%{?)YZ{Iy!gp z$;d4;?YA;-iOJpyF<-Y@J$o)pI)KvNoAA1vK~_3D_*O?MyQ0ZJR7A!ftG<xYV<thP z0I;n7^F^JqX??w}shSn9ce@-sn_?4EH$1l|qe^xHwOZIcQ=Xk`0s51vK>;0ZeZVGD zyET~~+ABad&XClHXj$lahX$#>N73unb`}<m^!%AlVevHL*&RYO>ghcpYfEYBryiMO zbsg1Gy}>V?CFZglgx4~z$_dWA;d1f&gNmL7o0HNX9Dn6a>E_g7pi&dx19-V|Zo`rN zoV^{e7m0BlEMzlmTs?Hx*?E~PTYZRb()N%Wry3$T%O(Q=TsrMNY09{A;K1&4XaFGR z_^0%aFPi;1+~>q?1~Qmf&3sctyx7QM{>^p~S)Ri`UO9Yx1NZ5NDk(`96AQ`iOu4yH zDrOJA>jl%=0JIa2a<@p-uDSx<he_fGAkWaQ5q%5s{e)Fw%$z>zcTCH3KKd{bR&e)q z+I-%4*nGw3gTjORp1zBw60c|=qgUb-Vx8dUUou&>4wDh?9oA$%<yiYp;&)lEv%E-I z4pG$CnbKoefcox9#Y3c-%PpkQLqV9*jKs&(k*p601<=}sI>u8LGhXxiKL+PwCX|C? z@pEQ#8gh*6!I0WIPBO2j{?c_@BmNa8L24|~%ZBGWX}lp)Z6c)ph%g{h74QH|G5?i? zkU*75<92;5GpPO!=g-F==GA)p8cUiz%c=L@laY`Z!|u)aN_~0IcJQglKQch9eF%)2 z0{t86bKm;nV}8j|<LJ%I$>uvdjgV=vS*}gat2RjhLZ$p$QsRkG2WgD&QbmJdpPr&E zF8%CJ9=rD`h)rFg6U}V~L1o*>lv@sp1^an<bTQViqe6=JnDNG@_bQ-`qM>_p9TTN7 zAG5MbPXSW@<1oCP5hDUmVtSI&(A#~*8)jjNmPsAz=fexZPYy709HcNBp~P)Gnw+T( z;U{z+=vGCV(+T3PI_Gq1?Ab?;0<<gTr@>tu9}Ll`3@$BW4SiS?Ib^-b2)tbxJ_98z zOY4P|!Oo`$<PyS0KpwKw<8?$LB}z9w{C2PndS08bop((OQ*y70?!wi&j<F>#&U4*W z@CEEN`&MlwK3AE`cI#`hg1lhQuR~woH@8Op5G&XZxzUvXWQ_P?%L4OpK*lIK?>ws# z*@$taItsC|)djr&K;t!=xBc#QptLjBvAFdlGPgGzIzmH`T%ikV>!#fK^Dc+uYgqUj z-ek*B<KnD@BGibTIU@5p32*Q`fgylpWB>{8`iB(d(=3d@coTLN9Ydb_Krk>g-1L!3 z6l{X8-lG&cg~+Sr%f)B36GmH`2~r&cN>T)OG7lD$UT{<+rKJ>aPk7;W&X2STuMrPA zt!{=3@QMFrdFPU+J!fgT&<0NQYDS+<^`5BaH~~zr`>OtnHpb^B1$0bAoLC=K<TH!Y zzej%u4WvAb+t)g&GwKM=m4-4@yGV$S9{D~cPa89*9In@or!vL_#3|6v=;bYO_W2tA zk2cL0MWD2U<FUL{M)ohS4wMb#60US0qT(*LTGs1k-cXlde@@nMw7aohVuAoQ1D|*8 zw0Ks7jdx|g(^R0@RaF%|`-5Cu)emU?LuE|z30ByTyk&~O2cA(W3u$J`GpFRHs_X%C zgE*=017xg_7i(UJGyKjdrY8mkdAAMO-22s7(0~s>^$u*TSf~%3(%S%wy=0EJJcMz* z`v&IL3}ar8MFZcxddrs?2ZWl2InM9b-Sl6wl&^xQaL({=z%xTgHSSRsIOB|)+qjw~ zxU26RPQT};0ZJ*Bc@K+6*pD?OMMY)I%CV)dOi(VH8yNjBng65wqJqHATYS+UyMPOL zc<)nw<|ojueymOrxrm)jJsvjg>W$1_O4nb;9y&_EE*iW{jb~~Om~pD?o@+4=4FFxp z{erFp#a@hi&Y=j-yO-8!A`!4;&DN&<=h1~N;$!B8qYX1fHh3B!3Yh_|9VJmZ+a5qH zNvdss_YX}`;;ApW5j|6sp?5hV$ltqnF?1}at<8-eCIMX2t<Jcuwk1c*Bj3-|@)o6E zv6^nlU8G*%3cJtDP@Qk=cpgG=@Si>Yht<hSj&QP`LAqmI$gJTgRL6$_#3V(K-vUoT zI<f(J&A-5Mi)2uZWWK}VfKT+J0I$ZUSsvNApHtx>+QPa;vLTyg5D`d(x?Ul8s3H8r zay@wJvlt!;`S)E@KJdkfM)SP)H-S`Yr@^~cInRy(jacMCaY=Q4QJCL-X(v_w8sM@4 zheH{2Y~2pXFIr_#Bq#qZ>HZ~^Qt1zH`-;t4FI~;X@QMPaZp|KGM^~v@PKiYnp^iB! zU?E_~`?%s3({*3Dqr_7Om1frg2cVrAmYInPkd#6+F9<++C=6EwcVZWEm^~x;Q`0}t z>Wnv~HT#!d0Jb|b`JN$ohtT|gn6Ib^b|;ealM8g>(a0%T)wD5+13>s_;YcfZ(J4~8 zmelTz{<EjQIpTrTtg90)lM%y#MW({(X24=&i^*kUQ+m{{l?PAy|2?>D>p(vaPnx`D z;73+|3N0mqHJOLIPFkF#U(I$8Eiwc}N;t0Dyl3M|o6vC!82?H`HhAt-GzUzy<-b(% zv{)ZO$@}Cdte@;x@WuQXqsPil!q;G%M+nA%C}{jFa~T0-IdW{c4*w<a(j)g(t(HC* zSmvr1Oifiz%LuFv4#M>6wYKHgH&?tT36e&k^hwLbeTIEt^kM1gQx;Gz%@*r}fpOc2 zLe2lj)OSEr{r~@S&B$IQTZpVe_9fYyt7JDQd&_o>ln5Ew+_El}U9Npeva(m^wKvxu zmwWI3t@?a_|8ty9=Wy?R-`DH)+>giOrE+m5F4S1UG#SJTdK0H%fC%qv06Y)i=ztl< z90mJ@*>_0VRhts9@SMCAA5DHeW<s-DU(e=50TTdT>O(Ai8X#op@bRrfmzah8#55pj zQ#?nRSx0KLj<53N*zvHsk5d}T3~)=a>u&VrdqJ;BBSlPpO%wF-9(_vlcUbTCpuE|g z>)s$@aviSgFKM|*5`Vw3m3Q@UOLRWGBQ!LLpOTg^U=0*T!JqUfU`081Cu)7Su}!|$ zpNF8ch(J}zfL9pzS>X2TD?N)H`Ky-k%M(<~|Ct_ek!Vs}arvSq!`kK8>%{J*_#V)S zA@Kmk;Lf8W3y?oEr3RE`AZ6YUixz6HMg34>P^s_ZWND5h?=_l@;2yS>Poj(a%d_Oy zXtwXY-{zJ8ns!cwp5EF-vq8=R<<(m6C1qX?hzO-7zhVVYTn~JS(siUxOlZ!MX`5va zYk#Y2%tGY+u9p+jrab_iQhqUM`HuM9m38E$u=Tj0>3DYF(Zq(#AB~x+ix4yJji`9= zXG;iaWg?nY0*w@~wV%z$3(FXN)ZstoT-^jHQ69Tzb~e5Nyjdh+X6lc$TuXUEV}@5U z0WqR^h&&l7<6PiP%GtoFh^n`2DU^Tcu<qRC53MLQhG1S;x51s%E~OfI4#M66RM^K< zu^-;MSGnHp5`Xd8gnX9S%T#l(;EOm%;?Bu@KhOKlk_QPbxZU9=2T5ptu+6s80+5SR zh1rp3?(gJa`w57fSx0jEe>9<-0gW7s72m6Z*Std_D*k9frKx}(L}<OiFb|+I9}>Wv zx>GqCl{WLXa$YztcDT`Dr>`ApA4hVNuf7lMu{Tk5;|__zp!O|A*9wkEB6e5Ns+j$4 zg4;rxtr6UR+)gMXVZ=ZNJ=Vpe_x-xSTb_@E-?kA&c=k*Gdz+T;;BR$znUEqQtU-?D zHYI0U3*<W;1VP$meV0Z_Kn#4%Hsj^1TlvvCY%6TJ&+Bcpd^nEO`y3)Dxx_O8x16cx zn~9RQv_u*vGpG&;63TqlcN0z_xmZM&P~{RSB>-nQ2&@0p@k|${a&y{*8WT|5$-sj2 z4Uij5pJgNeB?s~mg=b(a^Y0=uPp(mR9_`H<@?iayq>hetj>510^PU|H<uZ;MB<^vz zJ6Bu=vx!>C7}oj_NvK9h9p~k{%6-Jb_rKY$6alBrihPdrGbv0i#4r|jguDzJ-1iFq z78d#dGz!Y&31TVJ$IJ7vz7@>%9is%7+-v0^_SPW4q;0#d)li1dDvEMg{-<n4t4SZF z5n?LHbHWqov3KB)$g#g+eP*Ewts<XcW&^u%UI}e>=HfEWp`5c&4Ha85S*>)r&i23< z<_2+u9uEkLHFdnRBa{DoHvK`=%#G|M*O=(0GO9G|o=VQYfrD2rwv_z{q4j4=)0=+} zuZ;S$26e3%wO#yTJKSLHRJLV8Svf_ymrX(=P+rijiO+=vYNJ|=p2pv<j4U8|nFK6! z9WQW@d=ZS4|2d~M0Ylf$xq}tq5CKQ%O8OwuEX$Q&07Mi`P@1o_BDtDy#n`1_;iXqq zjB>$rDLIPgu$K1wzQ`K#tER@%YKNvaX5antrK~}Z@3Mcr-5Un+$u3APGIm*EttC8% z;ms<Vf3J#wBStO%>^m*-fp)W{ac^<owd6V!4`?bauLW*yaD5OaEd(T4;DWIg;tdet zRZwKNvv#mspabUelhz(?wG$54OP!a=u3daYhdGd5RUM6X>ahu4Ta;;`_#+GP$dmYi zeD}gypBaJ8ns5?_@UJJn3WxsnJQo!l72s*@gCE~*z)8oToGA7R638n8E!;R=?&l)U z)~>|N*#k>+@gqJ$ym|Ur7L&=_EK4z!f=~%Kc_{ovHJEa4Qo1}le1>5#_%S&sfd7$A zow**=)#9shK=G~K^958l?s|v}M&6qO%tuA@itB>}Xo-sYQ_b*Q{!H$zF5tePWRsP! zkcR6?%(VLJi3A6?tY${NfDGzbc3^b@#AeQUO!xUuuyE!vw6Ff0fa0MFC>|G7#16G^ zGdG!?>ks3PJmtJ4Y16idqrZ&$tpn&!gga*cc4m-z<byJ4K5VVPTQTWpXZtS?FLZ>O zO&G+@C>RD%y9X=$PQ?crFN5H<%f~O&h*{S9^61LEZLWleT3<@rqmaeO8=Yl3g=R)C z1`AF3n*+5aEyrOC`~Z^$2=Kp)3+;6M(4~`YQr(%eUFlism1*$iB<|I_tD9Nx-0w;Q zT=li(2ihXU;Rr_lD;K%WpC8@iW_pcFQrC@PWxn?vSpk#)Zw@YtWanO!wO;V!%b)<h zas@F1x+XO&`c*EEUbpim+LU;wgpH&LYOe{gx$;j6DfBX-#WuYZX41Ocx-iCZ!595D z2DQykahcP&?<pDaGYLW`#j{}{eP}OFO>m?-EFe8Nnim-ycumlc4J?%j<NXr+g3jGN zV4s4yi89rENK|3*jSwI>PYwMqFpO&g-HkglQopYL6BnsW4jr;Lg1}-}XGb2Kn)@hn zm$9CT@HCTsKcT4-4!$hDC3t=IcINQ#O74+w$q=_<fGO99d?i$hCUl1L@*j`;cL_RZ z#WS)Tx7_66$_SZHc6EYx5|rc3&n)tl;$Ip9C|ZuoK03{-?w^VQg>l!?{#gjX*N#4! zRt=d^e>DrK3pOklr`4qG_zVb$xe3%d{&Gn7lW!e9&5EDW*g=Im5Y7P_)yfZmyfOPe zLg&mjq4KW0#KFZ8BBZTxCtjYUSOCeypfY7BrkusKp(kKBgit7Y_l4Fm;O|${o5Qo% zCcY;ClcJelYkfVh4h|;=Z~fllSX@Pem!7YL%4c8d{kNOV`Q#6?_ss}UnlDPRBJ0p= zm)DS?2FKh$d>dJH!_Ve;^UIKds^UWJsLzr$p@40xv3f^nMHsM;!^vj>e}U%;avW7u zc)0V0$FSjNAvtRF`~X#ZxpH=Tw;{fPea@_nBxXbjXog^r?N3d~TLOit*tc6h`uIUA z{>T*d3lcKKOlMl&A8z(Rs%-(yobKw6n#x+iqCCiJwWNNg_Nvu4H<gtU#4mqmGd8JV z_9KOXKWQ=4q-#PPc~E%kLuckR)Je=<loS0~pLe{E#M4aXCR+wj55|IO<D8kOXo@f1 z8tqOXrlj2(@zM3t72QohT2uZ(`w)!smSwe?#&7uWDq5Z5_&eNoyoH*$@)ZFRAj!Rn z5R#ccv#cOhl*ej++V9ttbV`YQ6W;81A>yE+0UhJ=+d$_$QTyj#K2U;2MlJc)fi{y0 zV2S;9lXOrU6#_TY>PqY*GQhEjzaGk_Bn*m)!aXCLvP+34kdsl!(u9gSh90k7Wf&#> z>!t1y|2lG%!q!INn1T1Oa9`Bq!35S<zTX03NWTQ3m+V<GD|T9$hrQ03GRGE1pMbhV zXIag;2^2%OVWCoe9l3}I?a_%L{X492KzLhuVDq0nq-z8AP&jk-7v+CqJ6w^#wV(y& z_`u@4>q`@UWH@`71dM`c2!fQXU7}rzHcg6{HClCj-w(6Tbm~92aiqZ`9MB$#E)foq z4s7`2FaLh|O5#nDjrRvDJebLpdXwsFZMh-LjSJrqQ8?;T^MXIILASXnJXk0JGxeaX z1r7o>AS8y|JprdMO#L@D_i%tp9VPBtuU|J>k+-6}tjai7@8-reZI^Yiv0-n4;3mJ| z+BvLGE_kglML_-Uc6VF`@jbi98-{VBl5nVm?6k85$d$QyVcvH^^BT$11n*}T2RK?e zy$7&j>wMKv7PFGU4W+r=A0+Pj!J@fHBBOj{(krrie*?52h~G&|`vB3&V}s#ebm4|& zw#hLg+YE$RlQFti!a{Q{rBRH->HpXPq=^*f2#A2GL(vZT4}m7@%5xH@A*HZzz6WY2 zFOt&-MPKAg<qscofUjx?vJ2ehO1h-X*}YgVap)B>t9Ym@;ixL(tv*eyOZqp;WsrYy zPj1UY0+%|+R;gehPn^ep<RXf&BGnpL?7!etUdN@BfN4k@WntD7yMK~gbP7Ou=tx4M zARqJovuP8C@}&|kx>FHj*yO&c(-m+b1&W74VO93iM={;I%1C18nBQ<2Y%MKvOJ}S@ zO!6oAJtNZpn)54z&ejM%a$DxGO1&2aO^ET9wx*%4I4t3MP_G6KOiY#E5&^lY4fNVx z&7?VGFcYJJ!N}u(aw-JG&t56#bf#zqTNgOr6qX%iSR;@9L9+9b9L#q2Yq+GsmGu<m zrncNdFv`+c_x_91w-j4or8i$!v<QQ4yeuM^2H$vi<s!oTq9x3e70bZ@)jM}+rpum~ z(kpDX-~ehs+<G|U<78BP4;Sbs+Yz8rl?1A(HHk1d^ezIngW{lw4E+8sf*C>>woflU zepx#hy%)o_@^veq1)eV#Pu#ZA`zI54CkyB~J@0L7*8ST)0RAlu0}6&)aHZ$FnGl#; zSMlh<rTWI~Xo4A;LH)Df=?u*GD?n}o6bz!5<^pwcaflS3?JHLdd5~(1Cpj&5MXVnG ztriGC#>8J_DFM&P9qQzOYngT=_Iu=qOerlVA)KZ!9|feqFkW<65mk4Q9;mzYsoBYq z$NGM=(MdA%i*k~%^y`nrZW%4{Q43kR>d42IOaIJ8q}CzMhOFDQE>36KB_KI^9*!Y7 z*UfjX2`%3>`fGew4Vs^c^BKdcPJk-S(xT}g>#Viu!fLVTnR3%QF(5H6BX(Bjb$PrS z=v8qdnCmZ^dSHAOewPn>`T(#2p5{Oh;aZdUe;Myp5NV!B!4aa(=;n}K#T()?Ak~;; zqEn#Xe7{Y3kGB6NVZ{3jOSW_tx$jkw%6irILW8!ixUcQbZ30;0g)OCVgKGDMqj$0) zPFnIrHl`1Y(Ock`n|?rOTYL-1F5Fo_%!ca|gddZ%1<xs6rVgG<Utsuqk}6+^(l#Uk zNfO3_e7<rkwCr^rFt}UBpv3&;Z0iB<?5(H#S6&(*gGX|SP99NF17H5w2!aoFmj3<E z2tp+ZW4uH)pl&8=z%2>g)y+FCeg}w568U4D%4xtG*YR@^yQvX8-?hlU3*6V>Ovxty zAsU6l?g*N>mJ@}ga~U>tsWYX@bv$^7lTT`SdY7-K7A~T|Fx2`yyjd2oV|f8qE9=nN zlJ3c9wf{?vUWU>(UIV-X%S256>mAhykKIfssB|U442NoooP(eEuvA#h4m(S;nvnPS z9eV1|K1hToW`76_b2k0|o;+dC@>KA*Di2egbBwxz<GL40nIRIpRcZD3;=yU-aju4{ z?g<oD)oP6#_s@^ET=Lyng0xfEH<f2q=!<^Of6!)bqT;_d5x+IPWcm_4Ybd$plXbDX zVQbd`Jsi2UCx4X9E)t5cFMNiNJKw;SfD}!rOQKWbCL7J=8{d#X*~vmToA6NBN%qk^ zm-v0+Pi#kj13{1u=BwWt7`@s-4p@T)4^}ovh@J0`lLn6HWx}cwl~`bsUNaz!&wbGE zr2teg22lNq4%@=;CN3aGE*l>S#$l=jfGR>32q_fR9Pwi~{d^_(jUa6xak~2`<I+RV zx6!LsmAyGfNl(52BB(R$efv7yCqmancrU(28V6tp@Yha1-$o}>UG=&tPWQ)mhY1Um z|1@g>`Mu`}FLO`UD&zlw|CY+w)OKXsEHcdkB<{~a8<dpxF~(>0X%AQyb;P6?V?TWd z9Bi=j58jJE_**A%=``mc&0}%ZOC|5N)GHoFwV`WvL~@b$W|ID|LQrQyy2MDHn8--- zV={x+8H2R@fI>M%kvQxAvw|jHoQl(g78zNda6n+On=jYJ@`q90CBXcS{E#IJBW#iP z+HU*$i<nwb<l(IwfAZ>PVF5$?7w%hVA;($9RiHw6GcKsN=<Tk_)C}Z7HDauZe{C=9 z$!94JtQEZh)cRRcUs3=1p%Ccg0Z=e_FxE(ilXEqK1s<~e@uQ4{Nd@A3m`PiagdFV- z-+-@2(v-6U<XzrCTL4Ic()K7jflfx;2v9{7s!)MP{DJR$1VpkTPH@2_83|=K1&Ac3 z#KhxGL>ANX*L`+brUyJtuk~l^<G+Twdzu3_kolnDs<aF-`fWX58tuR8AXK@U?&124 z$Amx{aZw*+;HV7(f!YiXR$AN`8TPG<-BOo$({V&{q#`6$-|@3O%swsPJBQpd=ZEPT z{k{ELtmL{<VL-MKO#nD1X(lE|R$Ln{MD2umt?!tI%3)o8`sa(JH+MX3&v;6oTleNR z#l{l}_xqB7ylwr`s%dIEX<9<++=zaT(Gf<Bs4Pbw+Lo4H&+B01*5-Su!stU|TvHP9 zT_YYM93^Jz<J~RsOt5;Y!0`al_$a&3|8z>e0~SR<^OkM!;!&y8uZ{1IC62U(*xlsy zV2dHW!M4huP(7_wqa&NM?f>X}T%-8`(gZjwWe>|Pg+fu(dw?q<Gq6oFFx#@Vsebjv zi{)K$QS#*nN5zjqd9aF%&a&z_qWaU{We$zvq+z;zhIK8aszI4nKfglQWN1xZy4m#o zura)2ei^tfnqQ+hUD#h;R7vG}QzE%XkGqXQn!0%_BNcaiz{IuCBrb7EKw>F}MEa`E zf3EwYJg`*PX*dEhuV-`(6GArl3W3Fs>S_cl6R0fQ6nlEQn3C!uW`mMth{=DyL!4S} z7nWc^lbx?YMh)TZW1%80j0o*^ULIcA?LhYkhxU2M<tr6-bIz{18J*R~10xAAEl>$% zYqyH<wH++4JJwa_o;Lu{qF&K}q7uDgGw^$_=7(G#1VAZvF`Z3IJe8#uYPMHa#O@2L zx1=5=LN{U<<=h_{ke8=i=6NJp`|y0GNIf)jYh<vBk}RMD?Ha8S>UH3IT~eaJjV+QY z*<v@q^SyPi7iT-X=E`UI%2n3wpyZXQ8;$xvjmr#Df33rWWVggmT8aW%Zkk6P!w5Hn zq(oB1+miRdZ3!E)rWFQO-fjMPeShnq40Rx1p7+lSQ?6#94fp2L2uyVYA498rq%rSJ zR_Kro;@Q$Dl{TkMlbV-9@Ob?5Xi{nt+1NT5tx?XF0mCv4XacxrWVBcKa{!m!y$92x zy3BtPH|5tCB^eW;r53c;p<nOS0Z<oOV8CwDQXY%Il;+s4elT5ktya#0aN4LTLA0l2 zL}A;jwd4R>x;6Zkbtz-~W5gX0rI+V0kUxW_By)cI{Oqrva{Y!o)?w3AoGt;ktKlo$ zxvi`pd^*j`+1~z$W>eH|H_Ee=koWEvBZSz=%DVZ9n3;-<HFV6*U>Ac=Zbf_R;!%*E zq<dsmbmeu+NqM0VDHc~AdHj{j{A-6Kua1i65m5UwZ{!<R^DG||N%RX(W}8p`<ZdXh zVd$Q9snN`rS~0m$V1-l6kBU_>UJ0br%~w5bEoQ~fOn5Nz?)LHG`Vd+I0%Za%)w?Fn zh)a`Zj_XA`De@h)k3ryX3$m<!vuBKQ(+YEa8XB}6jG$_sB%tk9qHFU>J8C+&30RkQ zrz3iX`!;j=UL%({%h0m}T;CM8_@L+?yj|_rIL9g@fClwujR8bThkOR2cKcp?*uCeg zu`OT!rftvo2qj{sJAwAC=O@jmxk?vtdPAoRo%k4_>r~nJ=@DUY;kq%sSC&0xd+x!~ z(aLJs_EQFS5LQ{4;o_B<vH|Ags7zUkAi|ir%AOvF`1h-5YyGfZx><JIF48%HUE0An z_-L!0MO@vaJO;^-RUahyJOv-@l<;VABaRE82%6&1RbOO@=kfuwVwmFxZ9%15Lg zawt#HP_ytwM}`nIbhr7@?AOo20RnAqpS^Mp+EwpGECT&A#7!PQ8S!soPK(LNXl>@; z43g6WDN{Rs)|klR;|^2%{Ef2P%jJY&S`6Z8zjjyM;w}QJU2o9Zt-RJv$R!}znsi4q zo(<o$R%=5*Uy+<@otRwL4L%M@SI3dS5}PW-f7yd-y+lkriX(p9v0_;3kv9VzXm6jh ziZJYKf=#r{W0~pnDK0wPoa5R@TrlCOe)%vHP^H(^Wv^JhbtOh0Zagryfn{b`=nKY( z3jcx^#IW>lH<ER19A>kq4nCR-_ct*&R>dj5v!3`S=Fe*Jw|e@MrFw#-Mit_4rN(OR z0`PmOE*j^-+N>VjA#Om&G0DMA&|IIhq~XREtq5C1V~mpzf|RuL8dXBt(-INbsHY3M zmW?i_G#I`>f<fYl)<oynfO}lR%;6BAp|tMB{jy$?{3+S%SF&6F3fNQ1EL_m-t&|CK z%&);Vhu1Q5yZv!tgpNmkoeXjBx}9_7Qj_j5G7ko&-gJS9aVqH2e622Qd<8hpYvjMh zkja+#7xyL#)aB|0e|)RUvr=TFB<^@rl~B=;ENnSBX=0R89lzpBlY~!S8MJQIqD|8W zF>6ST1KF?&v2;e(ASVl(EPXsqKWcW6edx;aeUxU~A*Y^K<i>{pi)8a@ZkwBGyw-Mc z%o-)elaupVnbiiUU39<UBzoxIyDdj&s2)f^H+e)iWj{6x5g3Qd#MaOPJuZZSV}^fO z2qjbF1{-(;(6xEQ5;<WZxO|)#wqjrW1ZG~HB0RDd{0aYj6B3U{<uAYN<$9+@{L)Xv zI6I~T?X8#3$@2ZULr}D%r^Guid)YDxhm1WBJ_kK@iaHNAiY9$(`<1oB+IewehIyut z6F-bn9Igs>v~kx*Py?Bq8Nfre({iX9ikx++GIQvQgBqIpiZ#x6NedE#@#*pXldb_o z!N-A0g`Bt(LP4Q#-$o7)?IAsG2-X{H)I-tVOtlXq=>AIx2*`Cw!VXKdqv7DPLcTcq zHE!%cc?PDzAwSzZB4RMOtg{R*Hr%i$d{)v5UzH9%vxl!tB@{eqa=U4*W#PG!HG<!V z<F%li3L&HZSp;E}S|2`Y0_8rB(Y-)_>zo6PGZ_l+YcVss<U3%;qkw|5rozhbrf-f* zW=Ht-wE~zl!tg1+w$1w%%6GJ<z%)5$3(q-OACDUx@E@%Kj5I*t(PT}W=S*<7S@-2_ zd1agcUh8A)O0Uq9xzyP$)5gRvH&e4mpo?%C!$)U2&$HVv(bl}X=y!~eyIb_quf@ly zodb<<pxSzePWDD+RXP=UcS2!y=q;3b1RUBb)#jVyBjT^}OB%WCvM4-}rBL7+NR1VU z^~PH%{-h@VMND``aU@s@19HrgL)IXnX7KyBIH2J9NPWseWtCcPFnt(Vm9i1&aFYt$ z1wP!90k`e<K(Uh@6|UW8*uZU^f`86ygKQE~fy#`~q6-xQqYZhhjY$SBH&dCC-->?1 zMfu8{uG9q^pR&43stnB{viDfrOVASL`!JcoKqa2WzUJ`Ot6T(%UYHLXDmzWK-TatN znkKDSz4}#lbd%1<!+IN(#%EKJyiAmbz*dl!sPS2+07rhtx^@B5n%FJhISsth((x~U z7SATu?$IweIxfs|<O4PIJE!7gj5Oq}&+4tTA~@a_l$qUk=_#-oLndtg9R3=JnkV0S zEvagcthK)y{AF)G`SkSROXSiCXR(M(mL~@pmpFvDOJ*HHj?zAmj+s>(twIvZj!mhW zRMR36{DUyEysT?tdYKFE{k#^U{Owm0mTVOKqC$p*#MB!~UQh?SI;^LDRe6aF*`W09 z5`Z-d^)Px+5LZTrz6rjA-{%x)y^34+--%zuuj~&xRUr51J*N+TGM+sY*Nm_^;a3Yd zGwxjgnj6ufo#vmSfvR-URtu&jFnzAd?t&tKgH3ahnKziJ3MF`}8Z#V6m6`=pA$Y5C z-%Sh2VchGl!GqbqJ_j%`iJd&`;^Y1foAIZN#JUKsco2Xj)S69xfZuCgG@<nT_m=Wi zTrS#@HwRD+v5~!Vkfjk5EIV~hW%e9I>6DpDY4_d1pjTO-1QT-QGK}J+Xe)0MVznda z@J{>}1?X9-5nZE>bUvoXFG=Z8I<9|)oAaZ{&m1oo$CrMRjCm1Ctofnx*kj&>U~s9O zSeWiGaEq!wYCoT{<t)#)F@ENFJ97=Lgck|kmsc{hZ`|3;yFQp9W)m!{*1H=y{O}8B z5Pov4)wd~A{|>@<E6Xw3qftRo)$e)kz4)cL;QzUQS<uaFJID3?kzUVQeP^Zx{F@@Q zI?!WK-Fb=|SRE7_vD7zR>NB{yF$B*kgum7=%u152;c?>#w(DgQEHt3b`OudW!oS2u zt;_`>|03975QS>{+GJ>L615Aeu2e3(7`uh|`KekBB23HjO-)UT+MleHP6w{JSxq>p zT3cA_`<9u#zdgE;oqfO=xM;nsw-!Z2+hGinMc2M}zBXF;E9682`C(Qk(73mg?crES z;nZ;>Z<}QKQ<m8CMN`2QcLGqlN^=T=M>N!n!aES>NHrAQ27%H1$U{ct3<#6k=^!;r z2R|GCTnFzs>>W7bk25|mdJ0(_y-%)CP&6<;Zs{w?Y9%DMr68QleGe2d0OpFG3fzXG zquiZDqz=LM@BF^K4k_R~rLV2d$C&gX#^Kg}=KGaaEH-xw@E)%WT!Iq=n$FC6o_-`E zw<RKc9+@sAGg1F&_e6{bcG4<dOH%+{vu*HU7OogPmtHDNyUa%3-}zbte<rfTL+!1_ z#c&ARl0I}?w5GCyYcoI>zS47A!y=&JxWlO!iV~v09B!nN@&;?EyjUYeDf;jLwcuk^ z+OW+Zuvdm0iJc9eX>0wT6g$@j`C_`W_JMCiOdb+w$Jg>{1W>Vmq~lw!myl6Gi`l>i z0l9PafO7OwvX?ovtC00w-}{pJ-u~!Lr6I7JZ<j1vsB$4)2jU@6b{|{hD~lCs*9U#Q zdriYK=3r$jgfrN$B|Nzxc&q<0Moq`5OICyooo1l}vrIInJTHmW`#PyuWOwCvxbg#f z@xHRWbNn${(ChddN4KYRSa$J=o2E_SmeSU+LA#x6sJxvw%gJ6c1Yx?ok0e(LRH6Uc zhwRY=9Ms;%kEhQdDWlMHsD1fX%f*ZLKD*`SVrbyr4k)ZO#bv#7RFYuC9MBJZ6ME}) zu=X3E&*BKp)B(zT=`%*SQv89paf?OYPVpJK@MAmwHpIWo4pt|U(<oVc5NA+jz}`X` zuf_3uJzg27@|k{j>&tD}x0)gRj-hW-knM3gQL;-Vq-Uf!VdgcO^SXh>i7tdKqM3yE z!tELYZa3tpSjo`L>{7|NpGeG9$fr#C*ExQhgmNLdk=9<=$vz!)9}UWYlI2%k;C4N1 zyY_hHEA)7XwxLgliu9lBy*Rs%5*lT4a8vgSoCR)|rPe$+-s*`r$am6)1#VdDZPZlz zRw~|hPivaM1?|yV&~{LObiBMAsuFPuqM-)1gL+t^gSahu{z0jNKCwHlAN17n1ZAMm zx>zt0uN+N9t*jhR?CI)HIWAhOX=T3Jaf=nx+qk}~>bnOHkT+wFZOWqe!>O_QbKyYe zs_m*uv^D)eOEhM9)lFmW=cV8V6qep+v+=1)aQll-mWRQWEMFi7RK8&CMvbOV9KhJG zGAz`G<BV|(3qT*9$R{kL@bo^ol`V#~j6wK363utEcME*D$UA&YbYenroozL-ITx`4 z>CG}42&~~#)!@96abV6elc)hCzw0uM^+dxM7FGYx%H>`yfb3Hic+pJI4~cI?82XIZ ze`=OS?n*IIL^>S4`pjf3jXWg9Ou^B)+uPQdl`65KgQoLuXd|w78Myh;Oq43@bP)*& z3}mtL*s@@>P`osgo>qCck^A@m#Oc#KLAe~qg{q4Hvck%#Cl&J+KZd!kC_lwxC!aH5 zSL?NQ?VD*ae?$U-Rp2V&;T3tVcP_-6mhpiSW9JWenq@Kdy-UgF-?Qsq3_+$9jjI=~ zTA4l2KK^2rmr-+%yY6HS`l%iGv_|?Hn4{DV@t>$y=(DRN$GTw0;kp2lrH~yfq3X1D z9V|Y~yF!R|)0Q2;e571pK8CeRK04tAIwp_5Byaht_s(}01)YxFPqMd<GPkaIaFK)9 zUIUsX9Pv2j;y$zUYLm`WljAWwr$53V%)q7LZ5Mc#ipj#;_MN#~gh8=#d7cI6GuT}9 z+3UMjs9hAz&}@Q<h(=@4V*zNw`*k-qJr|CnHhZ+Mx=y3R6^cSLO)iE5z$LM4w{&W^ zoVBgsbV*431(VG!CRa1Y8uVn3OUj^e)@SPjV&+M&SZt00Sg%~s!wWbDDIFhhcK)z= z@<wxqL11Bx6u7tR&Hq~MT<^AsmnZg^2phsKCIuE$g;gn%v_}J<sqxES_8Am+$J*TT zRI2W6;d&Y3`|sM61-xaa?RW;-w-Qw&h}Q^ZN$RmzaFPvf;j-HM^<zjBCOf;IiVTk~ z$@{kD8uT&2nj<6VYil|z;^{^C`mA>%1z#LrH1vi#zQ4I$sf@$m1$-ydhU@9Jz3jV| zvXIp8B5;0rVN8UwI&HbkN@B!Dh&;uD66wM!Dt?ie_amWW@Z3metCpLSSV)#`%7F9r zt@;_Qu(^9l94thk%KWtDCRGN&n1d>s*0nr;x44B+?r_^wZ`^z3{GiOXi*o@2^AjM6 z=gg|yy+uoI%S!mXAU&nQ>A((KE}$KV=18k_D6RYa?pNsm-c|mf>h9hPu9DMa!rs}i z+jn<f<@nEWy!*n~&@CJ6@8NMCkMkL8NSry&u~;pBo&%T1VI?SPZKL;SLI4fz5h>RD z9;-VZ(dv0Z(<m$kY~JX26}uPqdiACa-sZ3&huF=>=>I$Rhr~bX2UQN5itS0PvMloU zPF4&hg7=0Y>$|qTO?Otb1MIA`<$keD<P@||Ym7YI3=Op=Cx_90Kb~CaE$H^kbjGi) z7eY~u0{${<TgRhc3O{#u4|{;WxhY|b8~<d;tFb_t9h>YmX)$6);=5Ha$2oJc{sPBX zM1s$jkWX5|8B`~X1@Za9KCranH@^FZ93m6)R-gEo<;*~hkHZX#+mogREspMczHcyQ zFI?GSame5BxUj(w*FdDeFbSzv;?h201lzk)X%M`h1gZX284r!kqAD|K-)LN+l-x5o zNv0r{uj9R#3wYT`V{YdHNG^Q^Nd>!&Ec~*i&_e}GrFJ(=qsYzeQP<CQWiD}m0+7Bi zkUrrA_?&pPok;xomByu>vOG8F@#}*H7*@UZ>wX(DvGp<B?z0%DQ${5eyHWbF47wyS zJUMBQY8i5`ONx9(PzK0I{<(JmdEzE!riVy%Gc-L^MuY3%pS2WoHhZ&|GFMX)->-`w zzu5X<bEKbr0;j$>?6e?swsbsLu8@Dnz~IghB2IT&hlA7N>$@4nGJUHp-<p)&c!M01 z_zEIW0Pk$gwzg-}oYZ<{5ES~V0eW5)pfJw9a?M5~&Pg39wu4&}TMT@%ZhfAydEU=S zT$rKUl7)cGHPC!&rOv@g9l~lffM?MkIF}bhE<f{03rjjqI2#uGv*9!3i>PL>&;HhW zB`K$WC~1h45BR>{&9mV{M9~7xImVhb=nA+1)DpK%ZsPpHaAZl}$I40!Q?w;m20TRe z`ps;UkO6z<x})a}!?iuq<Btb8i6t2TZRV@#h16yOe(`#DxsK47{y=+uJ*LLf!sCId zS}9ve*40cKEZgBBO_9+g)L#L|S=!lz4>(erI4aZVcv8{ti#+DV3>buzDC=0`Nh#+l z9=-+drkCAV>Dz=|YJXDdH1@@C8R6vH5NB4mAopx=$}{7oUfsqM0uQ|}g0(o^hp;r3 zWv_zf4^!7FNN9GN_X(iQ=#^pQ%Iqx<j#Mh<{+m-I^JCG2A%j&hA%j@sJ@>)M<K&XO z<K)u&?Wd+;nc#{;nyy>8oH=y5AML?1(&x3oU^eCY$aCCTyFtHVd)#N>*wQ^k87bMY ztG^Wi6XA%V^fZw(=UQLdcPE@WJC!<@12^3kmte(?Pn>tJcJlvh;$by#D%Qw(l6?|< zs~&3OT({mm%+SDd+L2Vh1efgJV>tAyl#ld6-6Qcrl~6+*gEM~6oIA|pty#od#Jo-q zzchx|js1j{MFlS5kgyv{PoP5PEf&AwCj#SLFBH}EY~r5ZX+!UiW6vzhj`0O^E++ot zMF89*D_$-qTdu|8t(E^;(X7Z%X4ps5oT@eS>;8tpwWnGl!l!|f4oM2&u{)jHmSX~e zxML)iyTr0WbwI*q2AZa8$>W00dCsWl)qQj3-HVefHdB>8$)QZ#R-^aqqxJ4X@>%w_ z6rb>8B<fW3Q)y{_L=YrZ)Jn5#9#JX6EFog!Mbfxl*X>|!B{F^5GFb$N$5%^jn>-M5 z#_zNv`|VP#^4U-)KgR~us5Xim&Rj9m_u_L7X*9`a($8qLJ&2N!-aBNM@Xf7%Hj(JO zi5W?@bF6%Ziiml=xArMaCCtEq=4cCEFK?sEp&t-v+NS0W+4c0v5}+hot?I)Y$^OI+ zh9HS$&YQY7QNBxLaYOAaVkWRto9eHFrZnsi;sxsWi}_+?T>?tveo51C7Qm#W7mhiR z#KNrSyj9qzJjd-Ghf9k=LmR`-XYj*Si>FxF@IvQyjcX9mcv*uk`_Hr2N<&P{d7cUh zr_pgIXQWWZzPp8BB^E2-51DH8b&VYExghhJ7JLP01R6z3kuiHRE&-MACv!eL>E6HE zO@yO>GWD(7o`3UQDj5Fe@zy}`i0crg1el`tH6Xv$GpOF%GB8{i!|TZY*pFE;RUl9D z50R+A$KhPA=awgx)OQ-d@pD?hx3}>67SnZSe8fZbpeBmvwUQlD$*yj;(W8~syvaEM zvl)ES>zg#~3OUd<3h~F*y+7EnnaW#DS8BxH9noJ+Z{_viticPQ?jQV8QaG0hUf#Dc zbxD*5#=h61D)o0lmN}8|uIS1Erk$Do9defmHUr-m?PN1|IqMdz1jpLKq6k>rbS?c) z`3|t?;B->5*Q@j0r3S@o*_$uPu4{q*uNkRGUn2(v2Uk3ke7_OH3tuZuDUQji58VFd zZKNL?y{-Bv6t@mm*W-2Z{*8j?v{RF>MmB%GDYQEI+4NJle<>n<2H~|{$$xH-m8<jC zjor!P<vp+uBy-u=fD_%jx4!a(jQBvMx%#olQp3svAK8!C*Y>MWX#PcPLf=F4cJJ}6 zizgiEQ%G)q=x^a=bX6?*`yrv94}^p)Fls)sO<^p>UMP)=jW+pmE;>dLPnI540YEDy z2eHJbq!~A4Zu^LZ>b=NWr2#?In!hbM3Sm30z$UOfKEZ3H#jH79N`ca{qi-=LMel>x z$B~I{VrRpbPKJ}iekxzR_rX0qc6nOdyftvuFDgz^#s{BWHCw3A^%+sLp?JDOPQ^xE z1jNj+H6EY{sp}}@l-?jl_pp?}_x5UL8$X1IHlAg>6-2y_8=#VIvM`&AN1yRq1$6Rb zdLp2?!D5`ora)nNp44E?x#c(KK`%(a5xj}kRvLNqtG8VVL%6h>i8>9doUTU`Yy~-> zu263NyOa^Y5h@?i7gaI!M^Mh>i*j9w>1QH?YRx?~QIsBFuWHdW5DS(!qbmG*&-=B) z@S+3c2f8rfg{Q{3!<IWeapfE3#%{HEt4gzMPs4^{?BdWS<ksPos_!pSqOFE?ib~H< zRo*2-Xkhg15}Y*`4J8f#_y-1L26SAE^hxlCmwb9F4AU@Z45QKY+?>pvxK33yU+DYG zS%RWgG1N6obMoFh;v{AS@q9ct2gm2x$ZaVJW2)jD@0>r#b`@sLPbo3=ltuapK@YzZ zzqm{)(KEfrc=he**T&W`SGAL)+RTnVkl%I5v{7mR^^-~d5EzYMwg)sD9^TL_L0I0c z=wLia?$rH8qtF9|1D&4W>BZ-BlL!GE1N)2T406AihzIG*Q`79n&nSnT2Hf8s1y#Wc zXKzyA&Q!l*7SwDduMO|gocHVDW&}@s3*>lSD03+S$;Mi(?%4PjhKBZV+9wEFIA_RW z*+Fq%h+gf%0SXuY=~LHQu8xg{>+!f7A^U95$xp8!Gszd56=x+SF5W#(Gk1<mMmJ&U zDZEbnac};&Q9$!uNi>M^zM0oZ---6w{=sVVVjhXLO-&lu%IA&T_UVhGfcl33%8l5) zBAyg9u06|{YNa9-H&Even}mjP$W7l_TWY8+%xJ0!N<WYR=2~h5s4k=BC!AEomG713 zQo;9r-b$zXGd6K{$vW_KwqU)nGCDBay>d-Fs3DzXr{;tm9I_X*Ttf}Is`IF~Q0d*c zbwO_#Feh=S**7}$%ayNXDuXAgovTFK?$c~R06Y}H;hwlTPWg=Moj<W-6JFzXYW!~T zS(6H{f!++<v(y%bnS~dyu*oz?i-uH@bI1_G5=qHg-}089$Ej2@y=_{Y#H7-#Pb;3@ z*i4kV^C`H;{=l!9y#R~i?5H_>sxowsE9s)58S;v6kINVdKgQ2s`RXuTI%`$<Q>uU{ zuZfsybb-M8tu7x^!AS``nrh5OgSt0C$@&Z^FnNeHjDzO7QTKo8XK#O4LEMQQ<9k|W zmw4~F@O9nG|Dbu#xWnYTqz6m*J`cY~5R<N<;uHb5;=STaIiu_4a>}p{?iiTiS+7q3 z(5yGy>8Rp>rB|6%Viw6i{`DCG4;)<hXsU$NQ_NZIU0{<1$Mbdw3{HKdy)-A!ft@zs zVFh5*m64(Quf`G=CT<R|0W*+Jtj#XV^hgrJZ^4r?gT%GBw;d{5qwL-24gryo1e~R6 z#Kqv0_C|&;*-~GvTDEJ)qzc@3>f)*3&srmFJ$kbZed)GDa+}l+0KTf4qzo%yHeug^ z)M3W`v)r_y1?9Kkhqy?gZwpuDftJ2}rHR2Wcy4RNrQQ03b2dVbWqWr?+74#Wh^b8R z`TPJ&6gHSnZYQD>Z{ajfM$uudkP%k8LBa_P3454@(^jruvP}d8@x2nIA-RDMC}#{5 zjtEA2vhStZ>@%;guI4s0SUOH%u6#rI4ls>1sXaMe(=%+9S7gch?=olFewr{=Cl1B0 zJ3o_26n`UN+uK36ma<YJ>V;TW3+I^xt+t(UH%BT7nmX_6QOVw46ptJ2(Y~eY#kC$B zQ-_*=F0T;=ED1kDk&oP(TdJ#8`n;Hh`P%2#{5i67Njl6!^2?)zZ%=#K<sCSnqs#M8 zCVmZ+>Ff6iPf}l|68M1z2ZU`v|Ga_t`xL_#76|Xuxq+fi4hrw^edxuspW=8~keW9B zBYLJC<R@sBBDxGyvn`LshoArM&7A=xN|*@G`v)pg%V|JYHJay(K4!!s4bsPe`BD-3 zWLj|LD;whoG;QxQL~Xyfk@E>*Lkb&7W`}jno418VyYoR$V*-GC(H?|M$@e~w+u#z< zBmTv-2|3Ph5?46*9We~WUk_TZuD^l)Rtz3FMENGxMh82N@Oyr7<%+P1Fz{$}GXnZ~ zO2_C)a9+dC9G5#7RIS1wf^6h!`|>AIxV6hN=T!Q_Xq-Q=EA0&J19?QS_6zc1b~YTi zR7Dn>R%O03(};Dmt$1jEnsH)*8neVwU}k)ql=~D>s%Y$NyMQiD`0>kukG%g4l9ZY0 zPQ)pP-4ySAXhJxVVJm&(m+v=Z=e4=56zx`QA%ew*@ZN=mu<6-Pxq8Au0MzzPp6!>@ znzJT*Kiw_#9XTd8)-ev2yN~$EgFHKVn2R91o`CMt4eW_+)$&?{uQhvca^BDOYMZZL z`^Tu+uLeeo3JDp%MEA6*eN_+>y8y_7OCyDOkcgwBo0H69xokfdBAq1eab+uS1)qp5 zo=rkB1Qu(Kv^{5bGLl1Za9kS*!z;KV9K(`mH_oF*AU!skZ+Q*P#Z3MQKxY%jdmq1j z9_Pd*&PzOaX_!a=&3jyI<CtTB%d#l8pV<<`l1@I{l*cIvuCS3@W1O2bs!4E`)iExO z^`(tDk=YBZ7YcnH1poO5s7nV@Lj<RhtRo78j+)ER1ud@yW+BoI*%WU2hs7V;L%Kl$ zpA5!LT{WXnnH_RA5e6i`;q(A3nrg?8EJ$eS=NuO=c|JqYBy87s<qmB5^u5~)!^5TC z<d7t$eh4Yh&$ho#pa|hDzm)d;+ib8s3R#qj{7}2NcP+U9dQf^ia5fVxG3|x!Tgy4y zh7rX1v2goo@EDnY0|%QQT%u7RVwVuKYrQPY$@zz}by3fXQxgJ#o@N-O>{C6ADB@gK zYEGDmWsFm6Ut>qw&ffxm|9+YolTz^e4%w7<_wMU<_PpWwTv9cHG62|;L7`jhW(~jW z_cQE@jcSOr=Q@B;P-JYqHu0S6``l&P@++|i@E(?da|z>j_`<_v`Ze~rwqE(05~&a9 z6Q-rddbKJPTLcGD<y&eLYJFR&OO|z7Z_bxj(IUd3EaoMGPv82wXSJj5@MHbmv-+;O zu~`y@3Gy{xy-Wc<z7^LjYH)QF-?y@$B89B+n0a<PapR}-JM8<^{4~Ikc3=V84!#}Q zby`98GyL3d(N~2)db#GOHHWX#ceB;R0f7G@7umWnvA{!aNe&{7NdGj3kLE4kFb2C8 zVY$_cfG5Rgv0mmE`m}Om_>(mJE#2N7$YigDL&L3K)y9=xi--tbWLtb^BF3#hnXpfW zb|GFJDs3dpD%T2n&E-CK>B_HXpD?3Dw#CIdr#o{3zu_Sv(rrBS;5O(+^vo$;SL60& znB27P7H56rlZA7vIMaI}BLE1NWfaEStOqcUqTAy&pa3|&{rgUFa%NP-Rqkf!6Z^G5 z84~|X=(i4v^79EZ^fpGcP_?@%GGf#3FxYUUv<ew?{uz=@Li~k~!N2f`ud(|!tBCch z#53IP{8$C!fAC)`1H)TBXr_KV()jA-iDI?SEA`d8as46RgR`bAEzW-N|5)3gSbxvB z%#@Oq+^up0|7hRF9)^%#IzOfUVF@%?X_2P#kha)ejJjZ9A=qtxc%}VZb3}nd%res& z<n)m1Y@{%D6Y?sVW_=bjek_gXhsn!1a9z=@<)?lrgRSeLs4H<5y*~j#X3?pfmgr47 zAOd&3ge+t~v@mQ2$!LUD5j2$=;wbxXKxgjg`<JSQdNH0P%q8rCNyn5QnO{m<88gB` zr|x<Kn%DMtf>Rk4`QJ53xqlzs!KpRC)1AWWsnO$gJLXz4BsQ1=X0NXZ&EdVp0>Iya zON?qmX8gajTRwwPut$wysXei1O^f!lnBOE}lsdrZDN)E2rK57rG5I}AlvM$1vFDAC z<>5a5t<%*+3%9ZxGY;v|v#q|LZ^^>r+nzHiDE?LK@5&_3BNW|6PJd~X?IWd<e1NOL zI1bo28(%5X)-(g4Z&TwoC`#kc8#iW49;}dc?oTl=Ue#WJ2<z92HpcB)w}bC{zA~sV zoH;$EF`g|~ht1di01(kUlZhiw;SxA7a<!-syt0aZ)LpT=<-tT;m=OB;r*4dErvP_I zyh}^V4Ik;#BK#6pWaD!HW&VP-*go<-Bu%~}1BSuAqV0-5cYLP+@59q~{qFk_as=Rj zQ?SQ|-4tAYP9I7BuWF<1=MIbUa$Mc`W}0yL3!kg|<?usUDkO>~F_qUL%Q7M`P70Qi z!^`gf&L$P7x{-A7y<<%)p-Xz4aZX+^G}TM8#@UI6+6%LPR6`EHd3Y15+SJA?0MIW3 zx4W6vB`kVk#C9nP?Y*_s!tJ=sIB$)+J>+m3!alZWod5%~*G7HC^_MChIJ>#kea!D; zau+P}n?~0VgcKHmXO!W=V72oZfJ*>Y(9a+6TbKp#ipimNZN^>LX8AsPhQx(P05c=_ z<0+0{?9R7@;xEa+yjHG@!JXCer*>#U^gpK36lRSDJaU)q6j~1v$U}Z>F!?T)Ow0hP z0SKA<+1MxPqo>Ur#9wLM8Lf1ex|@C)xvxot5x=5I)a2%f@iTLGPi(vO+PPL|C`1(~ zMM{Za*KP2W4rSdrlIDBw0pcA%;%n)-bDGN8ii=BLMcZEybL{kdJv~h8{-rUk3x^u( zd?fqYfL%%Ru|7A)p?~M9dtz;3@FyG_n2EypSQ>n{$tvlf*z!oQVB1##GijOI0<W7~ z@If*hBJ-?IhKCgduc)OcTQ^3oyZu^1-YpiR695Rk-xtyGhLTr!^G1}9co<}FLTu!; zCVukVlEa-nW|fN*Ce`BqeZfit0CXGKZFT>{-YY8;h1ta!V@yW)zV=(^e>DA69Q6eU z6dK;mV@UyzDdL#NV~WFgk!lCW>iQ9-1zUUG{KhbZUiZ}3UnJF4ubZ`*%aJufS4Dbz zvUhT6XlRC3jyOLA3%@h)vB*g6cIb;?qC0;Q2O1l!_Of+Rz|_N53Psi}yH}c-iGR|I zkBu1jinwt@VylsaPuruiT;U01xcKiqB~J|uI-C6U5A8Agd@+)-SLFgMV+mk!wGJ7V z-#(`TsB5={%nk%A>zH-@dhYh!T36h=4^Y?AcCM_f+xM6;#^W9se{fSsHJjMSwOD;3 z0JD4PoPCs$-MI9dSvYT=rqZCtO6D;$Ph}mtsmyTpx8%vN!cp-EmG-(<yHG6HCp6g6 zK;iJz`<Ki2=6<8G3s`Z+Sq7VDayH$1$>WixZSrsDb}t*YqBciEsS3H?eY+qvY?UNs z${642@Cax6U(S@(OxAU$UtZfZAq+1t`6SEuoJBEkjci)pwqCcZ*H!X!ai8>(iIIp# zR(Ew%xd8y(mTGRh0O1OR)iaBJIPQVLTk@h5qgOQq^arOk#B}Af$l%fXe`p+ERI|Eo zuTc@(JMjQ)l9oWCjv}sZ>K6>WvkkbBMWCNNAM|UF$X(k5#bA(doY1~>ru%)cnU6wP zhou-)6D5=CGVt;7{c~W{H-7~Ho+c?jo+c~$aI|$!2gD$}ajgYZi>OB_t+%-N>9v~V zxTm^XZgd`^lRPa=H78rH#?=X2+Nh4oi0L2Xj7?ia$<S7LNqjbI&<Ts=PA26d<jzsC z?Sb?dzS?9|TkOvKGuXtCDo*tPA)`(N0O1V}wFT}wzp%$jsAW$E4dV>Z-uhHepA!No zI5YR8LicC@V@~^wpPJ-#?~nR$*?$;+<!1~xZp*J8M#ik}HOQGei^;Co(wqgZrGI=D z;5|!z*!RKR^7&0o^4a^^#3!}JRd9=rkT`Xg@4gIhFiXO$J(oB;vG&9B0EnKH6~tP- zdv6df$^r{~WFLi_8PS8vOsh9KtOpsiPYuS(qLz$-Tr>H{5Da!xDzL68P<Gy;7(YF! zF-b=HhcvC55t<;u_`6#29WVvCJvN%<)!@G2K(Rfc6IK!{A;gv`)WrZ01!udNVG_U_ zL`FrSZLw~2mw;jsKqlIX<W5D8B~&eXRxSyHS2T##sgn@L0KoQKq9@<o*<;k>06=XU zM9r>f_vE;8^UPZeW0{qB=z-D^zz7$Ai1IA;Q>+!O%lfk4w*_foc-^@_FCn>ikjLoJ zH`RS5#qolpvvrB?+_HFlsDgrRx-1$M5=X27EI!vGkE_Lgv9S~>4?E2gz&^DnmTu3} zre22+BjlC2`^J5m;7?tzNK{?$r8dtbMyde5)QIXWj{i<I0r_f_^2c%g!)hL(Z!(=f zrJ9H=^Xdf_3l_pcSjnGT_ZZQoi{>@~gtSse^AFr=^+kswFVX7Uq48fK8stVkaskNz z?psYbMC@1RN6%6TXX%U%&R9d1F?O)rZ56D<4Nn;5y96R!@&pRtK=bGcPN<cjU4(<& zmO2304}^yZP^qRlf__f1-M)W6v4RVB`2l5HICpd%nc(2e-GRBwUu3%y);d?+Zfb-% zX$^2Z<)mO&$R(e>JEJ~c*022N)1@@w$gJfcaJqAW<-(+Tg?%Vb7zagwzTx%cH)6N1 z&KLL90t9_*3E#z|mqel70Pt(di-pe!6)bxv{O!<I^a-pI;1j*ba);7Hn#V(IZx8`@ z9_Rzu(28gPWHKse+O!!4yjB(Jh4JFl2z^~Y2Z3M}9xL!v4Hf0fA{JRY?e7>$vgP%= zC#z!i%2{}%bLeQ(dH_Gtw_G3p?H@}Q=+uSwUNSNFOfCWd;DHR3vw%RvLA08lCwD02 zu7zrt#(UMF!D)avU3cAZ%e@F-;{(iP%l%qj;a+0*v^I@|BL&=$fswvMEGeieJG7!E z>gA4$S=~dr?^OEw<AUQnE?d`MqWcMP08brg!(1nmPy|TkH`|AS`{SQz#vOR7>FwDb zAlx3wA4j<J0Q~DZzDJ@@Ve`O7gv68#yuaD_z$j^|Z>=x#MC7G=NQC+Y-{~)YMfoNn z`HcA+yL3h4JGSFgt=|8msujL(Hh&%|6e{N1F=j&LX&VTz$t}-ascYaqIak<#&PemC z?<(4bV4L?aF~zM%lAkD07P1uQFWdjnL;xO1O5~v<#%sT!c2FnQLp>6Bz~4aT|Ca=> z3(!Z@V+jyTqN&!7!mI#{gxWvze;i2Xk_^mLwPA!oWO(#W3HhvW$m@xW!?%~506rry zu<LKXy{K;a!9jVaN%_O`^{2D_5^5Z<|LA30@79P_OFZdLr<?z<$SVLA`4XgsTaCbU z5az{Lqr{r>k0nB%DaD8N7ldymyNFneU77<NM~~5LljeVHTGf(0TZ~tQ)bff}nbcs< znkS&6&~_&!jE^Cog$Uqp@qlt4_*ZTtG@-7Q%sTOGd)ch9xMjxG3eDyBM+w%K0iI4Y zd6fAQAT~j2=Oi>d3t@-T4*(PcfC&DO04$}3AZZ22d~dl4f}JnFH7loV31ptK6{h>w z-nt0?v**Mq9zQOK{7fZY_j8b~S7Nqu{1y>WAf-+8H7}BSF7d!iUlya#Jz1sxlw<gr zhbBdreo$Iw%A^Cz>HXz}P2!{g8UhI6aTK#L>rx^T-kSM}@nd*unB&ke%TKNkrl9I6 zJAm4u2rVhJ!%R)yCsdH}RK1{}1BnO_hanKyWNO*aS6#d{0CHd7pVbl_3j0gLB>=Hr zq$=c>m;VQ?0sey#c-Q)^Nv+2XAXir3zo3v?aU0|w0f3Kb^@xN}T-f7CE_V)4?&$F| z<|gS>M!`weQWDWgIcx~uUf}1Vi!InT)ci+izWo2lI_s#Yw*T+LILH7>hteTkDiYEm zA=02CARs6xElPJch)78)jZ)H5Lw6$$Gk|mr-SF%&?)To`vlf5Ansb<ac6@5@_v_$` zgdn!QBOXmtj+H;xeG8|dsH@y?c(>}&s-_`HPP6t_Npk4ep437M%ci(S(YbU+vYf;H z1ds?QDL?!X;-y8o1+ThK0An%wu@jtAGI%TsB>xv8!T@-&`o`N1?X}=q#GXj8=sSEi zT<I2V@C0x6fAnh4X}p|Wi0}|Vea+q{OIi_mWx#xNbv-ysVsU8kq<U)L%n(gPC}b0q zSN5p&OM{19c1m$>Uw`Cl9eM6bv5A(P62|9pl3`AE01f8xo7<EbMZOU!>4vwDPwo}J zl>j1*WE}0Md%1_)1F2C`(^;o7E?^XHmZ<i|6$%i(V=>IjQ~hP4$l;}@Nx0NTDH@;a zsMu|;0oDQyT9E~Hv#=L~5?0%}*Uj_^*VSwP;{@PXtcEkZqH{UDbF&Acx?a1~lX{!# z_uK@-Y;fO_!>jJ1i<~ARn0R<^fJ}f9w_3cFIqW(8H4TjvaK@4vb9x@=#?hKQUd*2C zcR*WCT9NZj&pEH3h(O+h?$Kb1{8V5rS{Xb=eDfN&v6+YUjSz5#Ux$gIoYDOR`=bI- z4)&ux`UFV0$@xLpUB}H2=qYW==l8%#b#M7&q-OD%Q^T>8p(t3_Eoo_W=7iOI4yr|r z{~VVD0z5ng!*G6HSqz73-2*A^Z6lox4%O!e_|u=!ecNp(tT~V(qRjG&>m<Pc0}zPp z9fbff@b7Uk<ls~X5_Zf<!(v5V!AWOlEewgbT7O9>;diOex|e(JZiB*6&=r=W+caL0 zjp>1iV2oOszrCN6n3gH-0Q$@4>2#JiD}E#|$WZGD{&qfnstl0Y{Ug>#3kK1e!FZ-Z zFHm=ep)TiN)QsvgiV+#yNk>;<el1=a>fcf|KCcj=`O3gkaHc4Be*Ql152_$GaCH83 zx?{Olw?_Y$;8cvHkn2e{E^=X<ayg>~Qm?+1kOpU(s`(?dL$Zyg!Vvc4b(VKSfY3DT zaCTO3<ZQnPgLXUVx25C5JW&LC!c+UNX7sDBPAS1hZa^<75rX`ra`+)Rh2$&1gJ3{= zfb8)^iBVWYuH$mjlo}WIUo%Ai1@_^Io*p1Kh)0AVu~@2hPgO5Z0!17SrYLF1AI6TP z-xT1bP(UgU*-LcNW1SN<`B}l^g9F;XC5wRdpsk%cbV_blmj_g<GWWd{<YPHJu?eVI zW@D9ryDtMCtz&k!ocOFJQi=R%K#*bce(65ir!^aW8Ve^`#m2l%5u4Kwp0r-MlG1hM z&WYCT<Am~}o36MKq_8dlFnvr$XabOVJ118IhL5hcZ2yx#eG7(jnBK)hzTVPZ>nwZ8 zCD+~t9Q8?shvY9aGXfnZCj~O>_eMIcC*QaM<tNPC{THc*?)vq}bzHy{;KzL9mPCBU zZRVM<I&Yp!Tqj8^?C9$qbc~2B!+-jwVHSXAJjJY;gW9aY<VY@8ETbZ-TVnfM>jqA} zr!H2w8fbfah68(Apa@p7oF6kfcvm^vzr#U<1X7_<+?0VWWA6+vPoNx+3pRSR1~hAA z<<~?0(X4?v)piGRM7^FAdTND4?`H5!jQcd|om7QU-raK=R1k6cEH#!701s2dY=zn{ z@$eA9?JyGeBfqVe^k)6x*2p(J`*RIp|FrZW7z|lxMd0OFOLh0i8vt$0#^BlN>i*}F zn@_gele5wIbo7@sobUH9S(DeNJ&Qo=a6JJb;?2&(t%=(2QbCtvpITIexS8?RX*Dob zq?D`k{#M!o2S%?6Ttv^1h>z1h1{JMe=YWK)H!H4Nt6#V<f$;AY&@Gc<>IEXOUBz_1 zH;_Z$J}`WuZzX-olNnM8q~yax67K>rHq+dEWd3|CIRxH2SH4~RJTlYHKb-n;^QO(4 zFMqsUp=}M|qlw@OzE3ku15ORwKoN!nB_LPHKW;7184><)O*8R$vQ{Hab=~xLq=X%g zhQ5RX=nHUSEC3UPIEa1sO=?l_TIX+$0vLlnX3T*8M1UJu@pwE)ZJxX<eA1vFerlx( zLs|~e?f<3|MSC_r*8tf#>7ibhrgM&%m!#<4U3quw`RpIH^uLHxXugKUu<s#F#JNCp zv|<5&2XAEH?qd7W=2BnbA2iK1C4AZ4a6Du}+iV<D&5%MNFY~bo@mlO3ujUix2GD@u zHBRG*7{#mN{BZHoSn!=^*5^T28h*oTj#)9>lr9b&*KipeBQicUx(SuwTXVz!km~Oe z<IPpr&=~G4h)9mB8M1=8E=S$*Iiud1YC^lI9iTK_cE1V56eG!YsC)?yzg8;{HRQ>q z?b;sT<8uH>@I{TWq2wP!suVrX4ymZOh|#w?eBPOj;lAtp*Rdtqfxw)6P3Y?P`j?UV zRzT~|;dz4X@ZdLx#WTa-jf25m<PrZnuLm=2WpMR<cIM**S=6OJDsv@z3^y*4jRwDj zOVCZcR?3urn*Zw|qF4-X$T03XMH6Gy!g*41orH+Bm_Si)nus!f*Yzd_?70YLT0Q); zgWe(eULD2af&%X=Hqu9$z#~+LnS;G4_*YiLJB45*PRq83wVtwv-B{RTk3?)8BjnjS z-2Fg6p6pql9XJh&4k}(&cHHmeh_4cSnJw?FNoqL9|7D=3h>;XDKZX{$ymc4NQ0xRi z{RiM|{w`>WjS8UH00B7~%&}^9o#o2kzW>$uG-&SEN-kHxBmf15*HFjsc46l&Q5Qh6 z0H?{LvXsYKdW<7F(Mqf#A?h?xboE*^3)B)56;;xGk~+}>@(936I2^KYG%9S_A-cJZ z$2|PvHKyLsg+O6Mds*AEeQ*dOAezl4xc&=Zwy4wrYD(_CDfFTvx!%3aYlbD(Du;#g zV)2K9BkED!(e1=HV~bRo)9UV?RrcoqFjaU9mJNBGo8ASLN7nP4MtrnO$V>((xg67v z>P(C;Wd29y_?1p%Cc$+c`vF!;rA%$6*-i4G5Co`tWF_f9HeRK0ierGI%kY*4Y5udL z+*8+OcI?mnzG$Vts-x&%)%X)_I#o2ys51W%nk<$5?&}G6S!9pZUr)GL@Nh6?!Z!9k zFF*O!mS$@~JUfsbRCE8m-=IajxuHBs)@Gt%9^@T<f2cL3fNwEVPY6z}1Ht4gNW!N^ zX;e=i72m@_Zy8mx`=OWqH!frHsiSLZU@1W>gkmi7>g#<mrt{OK4&)nuvjv#djEcb- zR9&IHN(CRD@E5wptzTeBUD;hhd9M>DqQAy-VZLQBg;zJ-qPfT-<n3NM3|VCOH>y<{ zo~<~1TBtr2Y&=H3UCM$MJ5Fd1@lKH0)2He}G9mjpzK7gpv)W}q(bnFpj%MZbBZ>fN z4$Utx%tf>0INp!l!iR1G@n;<K|5AQnTS37i@DS9VKqW=zWA@QhQzXL3r3sOh!D%4{ z5JC5v$~7(k!Xre%hFkg9v?hlW;9oUg#?>Y4<HjV~${V^M2UE@4{M9EPc`Zy)*IeZX zk3m_|3MVkoI&xp{G!Wd`EeLOL0FDc!3jh0%=qN7`NsW`Afzv;cLRja+I-{vGTK`M` z`y7a{V?IHt{uR^#V|pD^eN}hp^br)5$dUW4P5y_SpD0jr=ATWq0hHp6R6b#CeAr7? zdNVg`lNnvWQi4?L$Ry3;*BK~#0O32fOrX{eckDhHYmo3+tMBNZ22vtFlUG=T>{mV9 z5@}oRHBNkn`76E!-$PV~Hw&p4(+4Y@dI@-8uy-ThDD!*XFdM!tQVkkM;DE&giM5=W z=0PJPUZpR={&8eTJ&^UMgoLW}Fum|mvAPk1`M)VMsAT9>1AHd{;Gxrll#14g3|!<% zb#@NNReb;NEQLaX0qFDBt+F<0Aime9w9y0^9o@P;!OBMxa%{*qsM3#z&y`_Fa&kD} zM)^e~-C%GHVMC#UOvWO7X<$nqJ%5yXVxa)_3_Aq*{H9{Th(rY|(OFFrMCK&@1kCGQ zCAhGI7l%6@Lt-e1jrwRGVh~XK|7POxaDj3iMa+Sc2PJefzV_1K>5<LStIMG?|D^ho zK%M>dGD*lZmn$nHeANPL;LF>9v!OO%21%DJhe)Kgl76viJfrJSN@z|__4NFEeRGeS z*<kPnQV#ajA7fl60}D*89C{^Doq_hOMtkfdM`y+eB@L~*@1~kGM#O9e@hf|D9^uok z7!HgO5th~K;rqM-#I|5#?hWp)LaO{93d<GpeRiU=Zo9hXVGT{znxVFL3C){w8NXnR z%K@tQ(ZI$;G$-P^<Xd+bz(W4pLH~-q+lk|hyC0;BFOn{Cd5eUaEHe-sIalt3H2O$I zHQ<k9>ar6CwJ%*E*<!*58kQ*F)(Eb$1CzSHuW9U2_vfOx4#gk4i=Qu7)SE=>TUE?! zNn<QhA_F26|9G$FTk?5lpr+!}&QLQ6Z)13faZu&(_rna^a1Jzd@-leyI#xun>gzLf zaCmY1HwOdc&^Pab%z?F)pyq!g0nDi3Fwy8zaF!Sa@K+Nd86%rv{s3UL-m(9duyh68 z$s<r66#&CM)sKk<l^yFF(z<t7bc4<}R<j=Q{thqlakOKa%ss%Vmp7JSyE?{+QVefB z{WkCII;3a)hTZf+f!_x){4g~SJN?*aq5^cfR>sNRCsRB4UhLUr5CIt)G@suv^Vo^7 z0}Q8a7m!2VMI&ryK+;f~Li!ar14%q|@#y7?Pu!q*G^5=3;eXFT9|HTJs|V5yu;q++ z9-DmD4#(gRFFZ_A@S+Wu{axu%Ol`1Q%-(eTc|fk>p>J5Ez`Hlv7WnZTyk==eTj|ei z2=&7PRV4LGlkb=eH0THVb8wMT`4`Hk?{O$$UG@+Y-6x{Q2_U@(F01`LZ`h3`vHRzk z<SWDyMcUeb{zX^wJTTZTdQK_0Ny6<7f&gNKIoT^w1Qs`%+{u3nqz)`C+`2AOsGeaF z*1Oh1B{$gO{vEF>;dnjl*>*gB6Aqz3X9z|PQLMB_Q$hoBtlC%PL3Bv3^H>c~@BqhF zXFArBh`b7L*U*(=z=x54^81Q?{(>9~4Bk^T3*h!hFB4edLyHT?!cI5(vx$#rl<s-T zkBiKoG!R4Ig6degA`yJukLo_iSG2iqbGW}*2Wf=wugE(eXEdfz6$Di(ZdSTno0_v3 zUw`2cpFj!98nWJ=r5e800Q9x{&j!MXpw?59id@jYsoXCoeLF-FQ{E+{WRY=O7f6KX zUfPTelT$xpLi216Z2mA7ar4MC7RrI{@^|#F;^Y<t>H}EL5@EhXm^Z)%#xb+u&zB&~ z1`jbSf6u403}&i+E#X{r;h@vr516bN&vp$$bg`z~C#_BvY&YVaOn_+&ieF6dG@`#b z1mG{WB@=>`uJ;w}pn>BSAoSdI7{X2&SoiVv14F<DtnQo?dR71Hr-B|DBc!N(7!C?v za9wUoKvz`1s0zbBR?~clCo;Mc3*W951wn=^7eGt_wbm94z);<tY!v?bDrbPX1u-Tw z9)BL++n;gZjEJtvs}($BG`ERr<b?bcsFbdQy!utV`@sXnDNshm_9rm=bHVB<GpLuj zWyqzB*J&!d(Fy@L+bSQZBf%}uS;L|O-M=WczncxTmH270VBbg``R1$B0O#^mm$_L% zc~A|Y-1RC{{WDJ!Sv0}k+YS8-m;6EYnxPFzdfKxjfK{aUja397+j<jCbY4-B^Yxx{ zj=Fo$jkl;m4o~?2bq&eiJjIu`P0hf6t|NCB$y=$HOXa+4%s}%!<)zu&n0^<A3q|Ar z^ZUF^%M6u+xzEmjTouXagJK74v0~R}=p6bI`XLUe@bh-4Lg)Xt3OrR{UBzU;AcT-E z{dj)sTE^r3Zv`R@p5=p9yk@zIK0crFafaUHE;z327>zgdBgoULRo7n=pvgNbZnbYP z3_MqkrRrzXapE{S!Ku+K2?~CAyG6_fmH60g4o^B6<%h3q0Q(6bsgfC8Thr<UBfSj# zKUf0FA{wpLE>WRdMg<^;BTz2>HBG$(-Jy%Jongaaq$VH}?%S?|)btE{M)SM7n#tH~ zYD9NF6@I;o{gn0B-~5qZGap2+x05~F4b{xtIrr*7+FbKg{Nawx4aqR3b+fb09<_yg zKk{s226araxRHB-&I<xQL69PtU4ZD@E`(~8_E*H}ddK034~_{P=8R_hcZ5+DsQNh* z$$TQr65o8h>QR1jJ4<D2+#52kt)&p+BsMP~GNvrIE&q9l3^n*HJbS9=)r3Rk)POnQ z5-X4(DHPuSDu+~k*Z6MUwfbV~1cpUGt$q*1CXp3C(6zVI_N_2ki9h<e(FG%C2y;Cl zc>M=smI&M1T_L}Sl&%lUMzqe1@Cz1Vbp$^1u?xwQr+WimLi_^&J)_a9%ju{;xjc9c z%RG87?(2)^H^<moE*^zJtJs(Bs<<EUY!j?U>vIC`8Q36mGYdVm%=>}VWLnd7p(5Kt zoB8CfE%phc{hawV&0m0?(9py%=8pJaM!@OhZf&dcpuoa!%t}uo0rkrs5Z(=sU2V4g zr{seEMba9b-{4>-u6k7EvbR2u)}K`;f1e<<=M)tHwqNX7#=Dt0mya8owamLEHd_Hu zaXHefad&mvZL!o36C4?k3~P)8qRYoJ=_{XRo{`r*!Ps2aH1kw_iyyUokpI2%?OY;d zZj{2rbl2?crfO1V3V*rM0#iQ)w1wG_i=BmNFX`)rrOjw-DV@tL*Y9q3juQq`d+)u` zbGtjnQxiB?7Mpx9$228I>bN1heKr@rGv0s!Wl@A%6a<f)0b+$*@o9)oePkMdn1V_! zi;jDD_Xl048m;mDcblYF9Ym!8xj>9Wv)QzV7_wjsf|jFh32B(1FhF$koqPy9H34Gg ztk-gZ^L6JY9hD#5a=-0Yr_imu%!u?TR29Qb5$5H(26m2q_np|Ay9#4AEJW1*+f+g) zuU>Zf08|FpZbOTm)QcCk;+6VD%3!k#2eX>_W?c0h?upKwm8G6-Wvy=SnqgqaGhM!a zTmn0-c~74aKtAGF%(5*%haPsE?$pIao_b26w`ruI63bgRc$GW%KW^I|kIwqt3BYp6 zTmR52j}UhKa6awFg{w1GuP=hx`PmsjHY+zy4SHB57+S8AfdJy$xkLIF5vNx=Wy5w~ z+KyUAB7?xq+zq@nju(ffxV63t!g*_k1xcP_9!Ve1Cu6FVoISPgyaQXe`GH7=O&}Qk z$x)dYynv80aVg!Uj`DxzLA951DDLFEb^HE%oU%cAcx~b@24<NgIDz+zBiSr4Bv2zh zUmfVSGAz=rCytr2Vw7_HL+qy;kvPAbs>VXZ6*sP(&3>&OLhl2ufi8FvvhTX1=1t~* zc?~aiCN(4bZ>XoTRCl+lys%J=#nptv9o`O1^6srn@CkOptEyww;%a5dR-8}ymbW%G z$CM?OrtdDl21SH6Vz&9AcL|jX=*JII7EkjgtOh8YT5)Eq?+U!)57+bk@RrVY7L}bV z=#qu*JJ5*<{JHPu!eS2Ch612x)(hefgw?IMNNK{9+y(UJzvGXGQM5e=BdqNwZF5ny z*q1y#xiF(jg+TBdnVSfidLGT|MzUR+3E~RxL#@(=?+2Pv>z3e_DQAhRcP?xO<_s|i z-!U6<aNQ3?=shxgcqz67aCFz#G^zJMWy$LEHN08PAGnBP%npx1aGw>5U`?~`tUkT9 z9%Jl2KvddKmk0Ie2znnJ+i~U;^eT6AXOWWo`5l$K-GYqQ9AG%r)D|CdWfz=WtR-Q) zYBle-dW@~HBurB=`1%q{<I#MD!C<0ATaJoE7oTB)+R3BM`&y)Acp6%yw4<FQWTcox zL>W<i(#kOI8rFm<i<92T=bH;An+;aDYdof>O)jPzU6b*f)5TQV6L0W8r}bQ1ee~3l z+kW$tnzsNd+Y3gB$tVd8#2})F-1CH0uz6W^%~kOnIEXr9Hwl+2K3LkJ;le&tw=B{$ zrm}axVNcj1|JHo;Mq+|tOUt&!T27BFKHk&(Tgx*AY7CKn!i)N=jneN^J!88o3W5n{ z^QtWc)`ujaJeR$ayXJHW>zEq*CAhkBbkCV#2<FiaQ7I?3-OQM*@9BoNpYvkBwp+CH zIvtHZ(cy56eM}V!Q*&lwr<c@T%^tnRrhUHM^5R7gd$sN1fN!`}HF>UqJM_c-Aft2Z zWZsE*#$ZGj-lWa<<yXRx76fFk&)mYg+d{FNlg2--^;s9M?~^Znu{u{b<Jj0l9DJ=M z_GNjlCk&jIVf`>T>$Mj*V}MY2d0MLp-a4%mPA}JV_{q@gm-3AU`Kd2Khf!EG6nVH+ z*4WLWMPYSM`H0r0Xv(4w9^&>ybAANhy~|vT-t1a2yI*%jaIwLs!zM_Ay%{}(!pGB^ z)kKqP?Jj{w{>DnWa?q#Vc;zI~@t^blh%=bC{6tYs9@Ue4D-+E{Tf^Lb$(dG*TxG`2 z^=^w54iSOUea;WAr;nmWWG)3sJ|LkNE6xZS?p`GFF6TXIacarmYvW~WKt3zS5lJ}N zZH%)y>DESV1ZW@6a8Nl@xgS9+=jJTNsRYyasPL2W%U<*S2>LV1e}~-WHAISQM6maW z8;0yU5mA|U%>ORx7QJ-T?T5lmGoHrPWE{N7l$mlhK3evqF!=04ifJ;TwSiLbT2T91 z*6SyUb$Fb?w<!fRlVEyUka~^`aAysCE(yl%9*$!wx>+s@<#p)Ow4>ZvagTFy5agkI zk<xT~U(-I>N%|p&lCoKZ%c$zyH%})g4|sJ=4x!hB`|wVL>hAf%T{u}+J~emddyV>& zs+jq+VLD-4zRt&+3R_h(&W8xm@l5mX?+CS>RhGEksE=SA;+w3S2oJ-k&G__p&UA)O zztv|ZQ3k@BZ=|YS{t<-u)TPO9fq}>EK2vw5Gi=&7|D-X6k74q8cA=i|=B+!=a2wud zPVBNv)DXYm;w`^#VD+YZAXUwe{=@tU{{1+MSHuw+V-M8qo&B`4NEmI{VQi2%<sSjy ztjdcL5`l*wu(?U#PUqIN=aX9Vams#^9TsK{R}$7^JnD$&zdWwja-vPZ#g%GPjv}-z z4pnw5yEc!AR2~Cm*$@@a-L7Go4I=M@ACIrX<sU2<pM=-M-QHvH8jeljk<;nTj}v+k z^EGyVxEsMF%0*h2k8suh9?|85DHjvl^%T#~!e-=g_^|RnD;SJz-vCrNCqBTe21ERv zpVYzot;{lq-Yd%DWh0B{;;E6nIpduY<PYArC}gq;3?VD|>Wm-n-MxQu#BrwWzD+T% z9}p-vGnQpqAoZPP(^Y1flBgmZs^RTT=_^4HyO&v3o;sEBVsF;r)<Eaa3!AYBrw;|x z^k<O!L?_b6iDxH8Ve?lUO0F0&&YseW^$Cfd{G_QW3~>t3WPs#L!>cT*Y-V($KQh8* zY^R6zhjS&8nf)aMpU=11YuYKwq3TTU=f`t!sPAoYED?xoOy#Z&;CMNxe#7b2-&&Af zig<B<Aq$tN;sewbBCG?(5Hqn-Q>2>O(#e16EbogDy@(3U0N(3YA<QG8rOj-jr=p$L zYaa}_*9IHBl(=W-l<a33E63E`9fxV@bbRDLz|Ux-j&pd!-di{<K-`oaYv6K++*x5c zy`{-zJh$4Xgm63g^---6{XjQ$O7}_a7K@dn#Z+(xQ#r@wW`Z*ci#++MnWod5EE$(T zi;ijYpF!*S*%6V+W6r7{<zdqiqIa$iW~wxOQx$JLEnk@?yf~l3Minkh4fwa=4!e|H zKr%FflHC$g3bOa~lNWl|f-g^<KJC8(4DsJ33aoOf6V$c3dR44$0;Z2#caxz>E*wg2 z4nLkm=s|gnX4svcbTw^EEA5tjP&DS=kf<!XKhrPrg$d<;(vQ?%iTPG8Ou(m-U!=9H z0M!fjERbgK7hh!Pi;8E>PRsDkAercBOreN|F*<tX^L&O-R8=lnvXePq+8D3Ii&ut4 zBzH6&&7Ylkx#Z~L68O2Zl7MxJ`S=F1Ir(7-s{4(HOEKYDIJxEvGLpLZML|5b9uK8G z0}h<?gR_^{<fghbFdlJf52d4)I(!|W5~3uN52iGBTUAnLyAQY@3KL_-G9oijIS1z^ z(oeNLvQH;Os>Rc4wcejhXzShx4SS&L>;G&>*<bPJMnZE#nh0IT7;7QltTPYvK%<=0 z@<{)uNmt3A2a63J({fvS<F3_Q?%?RwvaNAz)8Q&feHgQy0NKf`(fw<7ns&_F$#rz4 zW6Fg&={<pN=WaH<b`Sb#$3v<s%ckdIR^RT5LjH_jZ#)=3&X}4ouS?Ezweb<gJ2BrU z?E`KLNPYS7sTWT5e0d#FjLE-t?8%uyd+l3NPUOFb3_X4kEPdhg{j~7vTJEE|AGlxG z>_3H>4wEuGHVFDufB${HYVvfTG8rqgWsjCWw7m5T4i~{wpWBN=&K5bMKT`cvf;`QM zU(z9YaXdB_*Vj?f1X@~1E|OU}0pdeirCxZ!(KZn|b-e36r90Eh(JaftZ>)s{$Ve5( zv!$VWkr=&cQ)(Co+ePjSE7Gg{KNJ0fWMxsyOm63#u{`qY({2=$RtMizH<MxCH+kCk zI%GT5sy0*8!#M82$#7s!CGn_knUoVhe9zeO@tGGZ9DMaMso3}MBSYDRc5mc{xW|^< z)x-&`#_xY>5PhXx;_%v?X5AZ>T40GQNdCx7dUsIObCNLjp@2ldj*+CrTkp_-K{;L> z)e_ZbF){RW{g{B#dr3Y+;NeYc{5w@`nIEr2UlvHfSdQ<Od+7j)AgsO^J>>qJ#?=4i zLV?BBykGnlX5DECE~_>y>z3dYd(}~wTU}aep?231_e2oo|8;8>TsXU?&ziX_>onua zON(E)Iguxe4em<xXm1>7OfX!deQ%M23lXLm05jQv$p#CL)17SRbYU8iQ~yYnO8%fo zK#<^Kx*XBJVSiFHR*Wsz`h@A04Q3MFvR0sH6%kS&VJE?koF48WpX#Z})+rkpdnRyp zDNDuQ`eNEhgrcwVor)i<f(mnEuiMWW(3`ByO&{3JIFml_v9pg;zE~QfAR^?~vnb#h z_XQgxL3Y9nkPT^gf$4=XW}=hF$&C!5nzfa@RrLzwldM*LTEacl16W0enWmoPqO>p> zqfHL%9k4Jzr!-Kto749Lt&PvHS1NQ{C3~e4GWNc>%zboh<#yc92~bm0^F>@7>ZTuT zS37(%KB^_<8lpVFkVv8D!MEKZd3<FIxuEds=s(sb_PW=#hn~QX%c2Oa5qQLLF=r(E zMb(IIZm~0Cl+=Jk)2mPulFO#~o?bNQ?qep*di0<nB_LOeVzQ%YU8E@M>zel&&(J5; zmu%uRqXugxHxv3@&g4uqO^U))(A}rz8xTB=5XG*Dy~K{yu~>)Q7_??${cwx{hv5xv zVUO{hPmcR@p8YQ^)A$&XCeRPHx9pM;dyEy*WVZD*KQj^7ma>CPEZSD7_!~hL`VY7t z#&yg6JawWGp==UB_oSTU_3KQ*h{;QOL_a;1#rUp%Z|p8-NAPrIp6_@Cc6EuTs3>2% zQXFZa=sR1_nx6{HwbK^u&2rM}a?2y4PoL_E6|+>5ngef<_?8LkyO3X8vrI@h2{v#2 zTv9@<u1++%J>f7~>>$B1dH2CJ5()|*{Pv)>Hle_dT(kDc4ZYV`KK7>WCHDUcs?jbv zPLh)36ZfZHmqU5M+EBhyvTF`&<_Y_m0<MG0DKA%z&klNb*Z37ie)8K1Q_4g2!X;A* z`;JkIGfUmj<(Bym;8d4xnShm*t=km;<4;L-bwcj9JLhUb=65osp`w1C-;9Y}H8i0F zHZN>l5-hLdg{bYXaSE&}Tf*Fy*&XF&gBv-g^<Za3TtzCZ_ux}F*)juh2M$jU-yo2* z0u%isiS_YG7bUN(&15Fd4P@p=9#JPJ+`2Tr{r1oGhxX3|nnmj>57!eIjWwN2ZS03D z$R|ur8>~}<OUJdQCztzZ857KI!Ffa@IhTynP4%m>o4BzyuaVb^GBPTqzHJO#y}6!z zf3#v*byDKw)u;8=3vPMV{m!#c?Bsjywfqz#Gfb?8x8wV2ba88sW-mQcdKi5<&H5VT zp^x>4ox-IZgif%k#Kp#J4e?vn|8}k<bTV8rTO%yK|Lmqf7iFgP(<2;FhlK<3iB3Gr zg2uLY__MAB$tNUV9z+D97hCc@`owu=_X<t<P;>LE{im8%JPT_geMS?mHKq=e*C<$f z1P_o5u5Jro(a|3AK9p3-3svWI#kGKv&FVq9v0$$Fxz<;~gBz%gAQVmC<HStoACLRa zE0w<v;t-*3K&Erme3`o?)z-9M>psL<RdYOaDw>{*%I4{1y6K!Qq}*TRl->1|dwAIw z=17bQsOY{bi9xB)9wp>XH=qLy9g75Yf?7{c^REIAtA9S!vZ6<K?45omoOj7i`l8&< z{h(w0q57^H>Y;QFOw)RWq;&45@iwmx%2H+)v*bof7_L?YFE;w?g&iQ=u3z@SRLmf5 zRZVOvnj3@R;K(UvJy%z{n8`BO8ja!&nOpMxzpe{RSNK!)nww(d#{uVLve&f}>%P1$ zXBjbV+HL&McIWl!d+#Z2eFa(^Mnd5&A;@4<6pEgthI`)Us|A;k{iKHFek9(?;HVha zJdMBsu{{CsDw;TlVU+k6335RbUyfcd-9Z!(t#*secz;J+ZESjV=ZlA2ckgPma1tS= zDih)O29IxPo$BPHv1Ky0Zhgk#1Q+6%J2angG@D*2s`AK=<;)u;0b`Oy1gi`i8=@I( zwv6^@wOA=`Hma#)eMVwJ|8w}Vz}^w@2al@i%E19gM&upL0lp-;g&~Y`l4>e{dgLO3 zm<<8(cv*eLL>9xXBJR%Kb-$wm@sQc~8r9q5E|5@ub3t7BPVM6MP(gzfJTa1Lgh4g+ z0|`Cm%4r@3T7sUB93?fyHrL5{&kBAz&mHl|CT(Uo6l^qn-_IOz8+@8SoqX$V{F}?w z5tDY}m~|}&hBI&2_Zvr~4hl|M8Mb1_Ik)I(ch4m^BX*A@QwUDoJjDr?cHq$x1V#=q z$mu0<*C6R9k18nW$k&Rr65M{iQ4L$+?rB_HI7mH^clP*6;Ky1kF^yojUMy@+m~te` z`VBR`MS^~Og2GDEZ!X#$(gFwVAA~U{Nu0Lb22Psi&)g&TQEwCPFIzbMR4-n5{L=kY z7EI!%ixw)Rpoy=L@&uE7|9;!82v?8Ugc~m3tJj0-&izVd{OCGm3}T9}WZb2DlG`or z&phqZ*OW6WsxDsltkoZ|8g@_ncUtMLsGhjJFqd@kJzv$|iswCXzTQ!Lss_Hmx0mKv z^^5XW<&juh@+2a;Vu3j;;z`NP&SK+b<D3Z*9gEKCy@fK5vm=e&rD@qdJ_2e{h_xRC zn@<48c>%2cm?Zbzt1?((npuO-W<QJxIVw=DTei441UoMr;tUp9dt|PO#>%8k;7k{r zPK6yF3OzTWl`%784W+DajO6Uk8&L~2`qUmZUf%fiy2Gc!!fPIu2<~eC>dkUQUVZ5Z zKJiLSfc;un<Fh*-pG(kl5zu-F9m+I>aMoaMmuiO&8-2C4Bd!+Pq`>IhSyk*!`!a@| z*IGJVu(X#t;xk<^c|k`w8NR#|05x@%D8F#0EfJ$5Xx5QwcGrC$bX4i_`Z>48LetZr zi3ZK)%IThoaNb~oilI8y!`Y>?<mt_$H+{q@6q>{nGeJD;uEL*O-B<4DcZpi$2%HEB zmf~%^jHU14+e8tO+O6Ig(lt7BW&DQy4f~wBqGM;sbXcryc{-Z+KHGS=uKL+gd5l?c z1g68}<vrw=CMRM7YH8|_k4TOaR+k$tKM719h(|CVb4F%Saf|PeE!N6zZ3#9xzfolr z77s=Wlm`tq9p^VARt<<(c0~twy6AjkT$7(ZtK|-6^F{2vLxt{KJj^#1*qd=h+p<8H zMf#WNKQa|#>cWCkYEuy-aV<?DA`+_kJdOvOBY0Eab?V->(OCX4Gmz^2xg2}4zwD*@ zn2U6`>qTcBA)Q^m>7z#vL+soe(jM+)|FCWTY<m9PozFz#_T&7{7yS$N-Upd`224Bx zI@_~aT92N=qm6ybPO?<%FC8GbD|<L6FC}^yH}v0jnzeL14jOCg5clghW)%?*Jtq2h zH48Xin|PuM0XCw7@+$pFyYDOngT=Z$T5IpqZ!OK!arRt{=3G5YyDk6AaNmJ6eoiYY zEawls*ciC2G+tEPTvll&>9Knik8ClaRPYiN9&Xcb3x$jtrjg?N>cKfk*DKvjg{Nzg zP#@9botwsQ=KbW0&$%Rv8DE5CiW4adxnCqM+9#Y7jWA|Tn9s(P%wKQoF7!7h=e@Ia zgU1qQh+()_s#yJ!a=Sq``&7HTJv_D3e75UOD6E17^8#~(@wjNDx%m~}VB~>C=a|;o zgRV>sm!KVr>ho)NM9v9U-%3MuLO|r4C;P}<9~id+>LH3-x9q$fTJeM8jy)XccTle< zHR#^YHa73P?*4HJHAaCjzQ9}+gpcH1&`>IeiDJb+I`0mNPO0`87_ilQy{;WkJ9O{g z^@LyLK@1};FYT!#17gy&a94i~pSg?kcUP>`a5Rr+7C+!z)$vRScMo!Pi~f~EM8TSJ zejHk&_}_Cst$D>4Y;MkMsho4~@DSO{;KM8vU^VTnm-lEuj_j9rop}axnSatAqqx}R z7j*aCopLsB2$8@=^NxzKklQ1|+RDQ`Q$`_h?FKp;RJe9n^PDQ{oc3y3?UBI->XF~4 zDKc~BH-h;?k7#6+$MB_27Z`;MttS0e?!oh5Y)r;|_U&fvA5~Rpu#BDXMzs{K5yzZy z#h-NTCK$4H#FnW0!AdRz_n_;Odv<q91!Yx1#$(^>^j!G7{Mc0Vs7rKaz<RY-Iziyp zwYS}2Y@A<Sj!xz51UXCwo2EDu21HP|cF$!B^AAT03*x_-Q#4O2{a5mi&IDB%3O_e? zE2zr{PW&mEH92dlX5PzuCZ{Cv`jE)-R%YV6bFYWh3LrG|fw?*~)2Cm?4ieF^SrZaB zWO$#To5{>NGowP&{OUF*$Lm$Z#P4ayOt`&U_em*`qCD%!{i>P!7~61y^Q=ST%|nD9 zg<XH--7aUb-GCKekb_X|uz&Yvn#_(^B?{auhKPF&-z?1-3sJW}uItu+`LZDi_Tb|T zO4KAOU;oeq;y9+V#7~OV_RMjpKLb`0-)q6q{&664x44<@!b-My<eKd&sjqV3xR&KU zQDOpL#@NmPbVCXry?YDv;zj&x^ZJvT@(Z7t#{7D|-kNZ0Z6z1|{mn6YYM0$2e^OFP z%G1r51i5F&HBmMvKjXcz9ef_lF8?WaX`js%IG*OjHrqRhyk_>X7ql<Y|8Ka5Wb?Wo zDRzr9vu?CzJiYbM7?C=fN;Huu7NmAO_eEunFjXx`rgxe1*5>4+wQOO|vVIVi-GgXG zjnDP>*g2IRo#$%Te((1<_mfV_Z=VR;-fJHJQgDyH)5DbA)XWSuS+8{ZP|xDkXC@+) z0>qukzu{uoBhZDfIQ#O8-fo|q>g68B;CF_;wJ2z{w$|kbw^q$&=2wk#^igeC*7Z9l zY9OlS2?XUXu(y2U8F53@21Tsd?MHK6Js$Pi6T7`6)+w-(^$TXwY0Rq&dC%-5irhbu z@HoDiNdN^!2|dCrY3QVvB)V8A;1pA#6_rV8N=Hp#{EE+lgA1~?>5Ao72Mq6Ho_j|t z4`<z$nu>8M-iymQo2*KhTX8#HY!7mjs4BtV5zR#=Bt#hQuW!=mdNfqNIl3lnTm96z znqae23?2~ieTwDi<f%h=E6JM;Y*k7L*C84q7oOe?y|@2oO8`t}xa=~W#>TtA!30iQ z)Zy}X-k$<~edahL#x^#e*ZK@PRgrTIZxe^2+x4^L(5tk9?MwvEoVHIgaT@MhgguZz zdv~Tr|5Zh;xU7z`xVi04;o&`U6|KjDwfF28kwoBn8UgG4dx`nVh=>m6lsiryQiB%+ z;x*2JbCrSm$4w!q@DQ(Db6l;QB<9MR=J3V4GYq|}(kXOU1b*mLn*)<ak@boWH&GV9 zY(k{RQV<L8-ON?dLwS7iR`8mu-LiyKTm^4~C5%JAJ=4mXJg30saC_A*rQLjrx+k!= zw75yQL^cm0xOEsMXGm;RTE@#VYq|Q<R_=#c5&duUeJ<da1s*om#@)8$Qd(2+gXvj7 z(oM_6Uzd|t4?5)gC}v2P>&swiF!>X-R9V*qa(isRYxovMGhzoSFV!9y<=h;$5Mbgh zz;NNi_f9!bT=hQ`C~6pGru*77vFY~Qf%f|^3kynp|Ev2I62@H{yF}1*rBKUnE+RvI zYrB&By?{K2YI)^lLH{R>&&R2DUiG`PxNc${uz?vP8U~+QC%MHcYle+T77H=Or?z$e za<M#3R^F`Jcy}TJITytmk4oZp{4lX9vwjc$6zA|N9pqxd>I0WSxt&PvBX{;!Z_<f{ zjto#WW~u347AEM_i`}EryE_pEgtczpZ*Ph4V~M6zq%~`4aQr;YC$sgS^Q-*6tgcC2 z!@9===^=!@62Y8lCs6R$S~v^*oK~PPPMvel-W^w}NaKX7-I-wCR6Od+V>X{SRCn{{ zce)JgDMS%-(wf$l@oG@Yv}3Gj@7skD*jq_;-%EW0m2OeFH=3l8kb4XQ{LisT$%3{E zgD`52(wu>d+X=@rnpumVG4G`^qe~&gq`eXWx_Hw82i9`x>NxqdwjqU`^0XiQUum)$ z&3slZwAtF;*#K$im5^ySEHRh#hR)6h1LYsjAZJZ{1x9E75;xX2v|neuySmX9F|71o z*O$nEvY%DBf@{Hf{o9vg>gnzYuQaZUeLqFh7;IPjHH=-nmrTn#P10%d-v}3NGbXc1 z?rrjh5Oh4v6ktRSL&eu7upi6IDeM>Kr9%to#Dlv!6z^B*G4r#*BJ7q!rDkT{cZ%K- zCV0*BxI<gv#m4#>B2m*eHYW^L!S96}8;m=!qiCnyl@FKN=_bH;(%KP4p3k*NM;j^M zg|iOQ35NzdNWAOfe5_t($pk~>I%DePN7M+MZGCm#++@1>Ts_&y1)QXxB@SFK@(k+r zxgnUxJ`wi*t3$l}o;qlU-y$Y~YI3(|#fc)%$OkK#>GJ?)OIxxOxXRu%!VXfQN9STW zzP&3<V6%WOuNxLnm6CXcDAF&)m(PqmFw-2rRHgRKdrYhBl0bBmg;|G1cGW@D*D4k_ zs_l!NcOVu>R{iT1oZgt%S23fYmoLNgr`qqYL$_Qf_QlxP_Yw;|^Pl%|Z#nl<|7!t& z)c}viK~+zLj7P|QwhrvRJ@SF(5`k<FmJL$~&kOeHHM|NvBrVYZrm=Je1hN^G#@X5x zWgfXk6<n3(l2%?<&D#6gGKg^Dv^?0NbLj02h?S~m$N=Z@fvkone|5$S%?lA1d{NT7 z6mY5uQi_V!rsmlg$K_c0!%++JGS`ltsin4a+MC5Pw~zhWT@q=Zc?%!x>&K>8S2EKC zc}|cZoyvXal5sXiUnbNnoloOTg^M8}LY+INHTh~VNcpCxII8AzU1`mER~sWMsDb}{ zD{jL}UaAgr=>cUFj15cHdC%^vPkeH|DWcBHd?f^<qdV==1Q`2PppMh)70H`2^C>Ui z6y%=rXLB4zJ3ZXI+$Fba$7?Nx#1EzQg2&w&-aqC`4iIrboT)5cI?y;Ac5y$TxMx$z zKQ{TbwmzGeY{z|P645fw=<+lt30A^^X&vJrvVSD2*4#Ndl*ylc9yK;}{&dYJ)k~Q@ zPI+%B!1GJI^3}+qoZ`D}F7779+g{}>nXk4VF(F?a$7QX?ce@etxYSowV!RS1`j4ps zf21;aK~oH?Ki<4T^Ft#-;{hFCm(WvP%rJEV4{I_<58nM0y&1;+s4PL;GwzW}Hg^Xt z-lpQ$w(|wKgWf1NNlki(`0+r`2_l8(43UTzN97{eSRMIE9&R@RWX-+^P!b~Z?iqR3 z(S$(4Z%0}PbY4nMEAp3H_<R`p^ZAX#llGnq`DaArrY{(hp!`q7hnC!-)oE#jZxK&X z;So^=q9+<LMX4|oa-8}Qx8)`gVPY=P&lU!AV|rRVPkW9jI`kbfBk`uMV%hKnis)Rq zo0SJSjGPO{PjkPQDhta#B_^EOdw2+aTgaDk{rKacQp#XqB7&<+VzoC^vCP_X4~LZ6 zS!0QJqCQA2+Cb#i?p*?}9<0~$A^Ep8uXyCody9dREfG%kEHU98TX9ZP__o7~6wTww z!JFp%C=I>@qqB84l^+Y#@-tLjnc5y4U=275V1kVEWG`dt|4V0ZU{E$K$IsnAKoxuP zXH@}jZ$tGPkMZtaHwu!PO4NE|weQc4l>sK{>>XFPQXo2If>_DYtK~G|O=;W`ek9)D z#gy<QAvRzU-vrzwCUzHxFRrzmV8<ky(;($8r>}7D53_k5O)4TAPKdr4KZNCsr1s2N z&}r)XQy2A`6>}D$l5pj~SqC#yl-f!-c`a?oV!8MZEYy!eg?)Buawq~e%9M)2mwdk1 z3X0s5`muOrk16s^kLnDJ8yr_pH%!`3)+vNBL`lD=`4t4XxQ%=mo<A3O*()sk;h4ya zg+%QTi{9v%1XhuIU7*xXEI78yCnwX+BDXyu%?tEQ2`=avU92ywN-M7zsPqE3^8Qcp zN-qu$V{udsSCU~BnVz=gqc+x`;taX1eYnF_+4)`|c_blZy4*iYah#iscHwBQq2@6C zCJoEN6Lc6Mf=Qcsnw-AB)L{EYL<hgP?<d%=CT&PDczK23Q%_?eBDwET8D}|rGQ#Ec zBLStgL=ZJNKx)riWW;Q*Ia*oDhs<={eK}(3Yqh8^A8@BCg;7)qb-tfN;IYxnC?TX1 zy0{J9+#K%$2V3xseQs8St4N;(dip>ip97fgJiEQKZ?C78pC|7BZIDy_Y2kEz)t$P8 z0l{I)bFeGG`C&WK=jVo&ZqmcevzkjfEZzy-mn*G?<e)mf7zCQMwtU4o`zoVD?Z#{u z$z!B=9xC(OERx5g^Lxip$n}{5!RsXfb?_1~M#+D<w{m)$7iy4vJjHtkF<(TcTOVbM z=;{Vdag`rzM&CXBGH_($lH(q!bhr^_?mgbV-8T3b=UI=3p*{lagRl}_qb3VlO-sA= zZhj>OPu5*W(`Oyr>F*7(Fkxs<;+}evJQvT^bwo&h{3Ji|OF!<jp1Nm$ZbdC8<EBiD zeNtM6ZMMM@xUYu<KQsK)V1BS6v+kvouu4%S_2bqPuzHlrx_8VR#FW<ZNopftvw{?j z;FQ2HJ(A9y`IM=^xU%F#GN&v|4PKLO-mx#Kxhryq*`u_DIPs$<&3l%gXAAns+WILP z+Ro+;;Z186_t<sl-~TYOs0h7MjlZ(t_9+w?z0=}8+R?C;^|~~Z-i-2`VMEC`!m6IT zw-)0ocVNWTQ%672N=g1tZ2@Tyh19qaHj5U!ktr@IT_&ZxlYM)*tWEqfHY+YIg54~} z`eEkU;7`2iX^+QAk(G+d_uyhU&?1|~elvq?vgy8$p=^CCYOh{ix8~!??Ol53n_s`3 zZ0*w70gc$?R=Se@tFj-PLPz?k9(lK<+gVKM1=-D!p^CMAP?1(TRmq`%ixigz2vt8~ zI+0dtL@k=^pG$#k_70}sZNh1Bb+tn3ah53jmT~F0D-XHd637#Jb;(%T&(_zOE?hDu zukP`iLT4rzy?3hTwF1Ej6SYIW1l$Pk*a+UP(ymO!IOSJ*BbhqR7kB7@#ovZ1pkfxK z^Zx6j(GhDo^G%-WFZ8YfoM+Du3X2$ZVRr7)x*RS^=$*ND#BrlMQf-?wGjmKeY6d6F zyda*8c+^j)`vOy)iKrqF`XLDC^FevA(^nBq5a$FzDi~Ui0y%poLyn0t9T<>QA3Cb* zPVg8jgi8uEJBMS|^LH?KCorGRKg(*-F#S89dkE?4C$8&QjmAm~RLq3PJz)8FG))iT zmXz!kZF6$p6nTRG+GT!c_L6t2gI}cR_}Z<{_Kb!Msr&mTM<5@y)_9-MzEHu)8i0cs zV>8t+(gH`LDt1Apw~PJdzyY^9&7!e%LN_DlYqkDqKAwkFZaQztsIlyNECHrpd0o?q zE{|T77^U3PXKovtN!~E4p+O4X^&;>cl29FgjAdi)#{Q=!4D}OF^>bMAqpo}pLcYBA zUw?`sgy4wROS^BXf7;f!5=}gA^;<st>R1=B7FQ+()rpn-Tqi+N8+EHpIdLt_QE0Cj z)PCFBsmE4_6rh3d3?}3h%OgU#n}!IUKGM+O`RkHv-&AlRLcN$)LMl$dH1l$2q6wa= zlHcB)=yuzBocQep#KsQHTwUeZ=bK3gLUf(z>L$;igjT?R!yvNx0NNb>emm6thNDZ% zszMd;_W#RLe*KXcD~a$FIyKO;-Zhr5e4oKdR$Vg^J4m-Rf2c-9^is)C(lL(SmEa12 zwd?(CI@6i%%JPHpYSBOKWoCglS&@;{t~OaOoOL(Z$cI$w_>6Z6_gW`kn$(g`&JF*T z=AQh(Gh|9{m%It^Igmym33;BKjpwHST}FuV?NK;>hWp<(K_M3e7#J59WEl|bzwZQG zo5FS_1p-x+sf+Wb-<|h_&aDv0XHTQYTmiJKY_!SiT#I9>)gpU+gPIpcch!2PMPy|O z$ub17i0K);ZloWS?OpU#jooJvdBEc4u#<3NBeGMw+12C9T6{0rE%|YDe2f(n7ojHx zlpX^UCW!(0_3KSG=z{;14B1HISApW%`_ARV6a%^6rb^0-?v>Gn5qf%RAwO4W>wNsE z*naLl5I&rj(!u#s){1BSYi`WCJQI{2NelVdW;5{O#W#uTrw`|i)m)7h=KP)u$2Fcm z-+A0DVnh$-q~s!rs`#g<_VT?59j1$ebZW06@qmxHW$K!H_U9aemo0xc%WEIP0j-{R z<A^w}-Z9+@IX3IQyjdlrNA#a2_gQ)&<U=!8nOY+YbU0l?dB42TM!FD?U0;2E(htLg zDPUPC-OtQ;mGkpUzk-NPxi}BkXEOOW%l9;+EF>ryFfb2@`(EIaT|$nh-)m+y<)hT~ zLF{8xWTY!?)n0>PT9c!2;tdJh1C&@~kT;uS&58wzQ_ICr+|YVuWvt+XW=WW&p$#6r zxIo2*1Y}y@y>3g=1t`qtrT%m&x_48tA)j;%lGnu~EGjzFU{cl$a}yTD->H4@VUlnj z!pxDuZmy*o!@yN!9N{kc?ONqWq?3)kSD~V^k~G9zChmCGkt=YF<}9nbPdLC|Pmlsp z_kXvJtZ#|w3CiVt+*w|~A4jd0rm=YEsmT~Z8oXZ7cj7De-v;9RYM>xw8oXCy&I~;D zKSK_F6~cLb?7L&Jd0pzhikq}de2$l?i-(4t!k;0h=VW_lW%8n@Hz@qQeTh}{opMy_ zflI4u+kP4mgwVzs)6&e=93wGWg6?DP>2phg`}^fb_ae95ZV^NDxeQ^H>?R&3(1_)R z=y9D(h<#*v(ToknezV%I7NA%#q183ZR<k<)o`#@JyOM@xNW$bTu}MLVeYQIO=q-!Q zl$G$#U*Gu-w<|RC`HLRSms&Q3C24l%2Fh1?-_+)O)%)G#6TIxxGe?vzLinOwSjj0f zxAgOSY<O7Sj>iP$t$D8##OuUo26)+}Qbr5q@38Xuo7mjJTYQRyHp|~(TJam3(Kb7R zp$B8rh((CnM^TNAEvG$~F_m5l_|I|?#?_+~2*s*xRZkx-Fs49EYq^A)x-Q;%{JUq~ z;p!#D!50t0Z(mEN$<sxA_^=H>s24tMtmY!5WI#$m#+w}PAMNBPeqX+suz@rbAn;Du z*{=G=*&+=$$J)ib{*!9p(Rno|#kgK^Ycgh!Vru!&`Ec~pTjUTz6a=%WwHnD{KSNB2 z+JMBc;x}Jf4|2G=c;#Os>*Yn!mvcvS;^erkh(~qdtmBgCT-EsGn(Y-~(A!m>DtRV5 zE?IqaPjcQo?o7bK;zA|KN6V#sVR#9iQ&d4RW26Y_kg0vHH)r(mQsskh!^5R966M(N zJpNMK#=gs5Qp~9uRO2r^R9TWX37bc(Z#^pO0m4J<dTu$b$LgU0UW6z$&`i<Y7Q3Ai zBGd*8wY|@OI*|V6HR$ZF7igjPySHPVmft=)mK{*dpZs09#I9~nkRs7MVG&Va;_>Tn zfh+5rT7Q4+nD5ELqWJzSZ(y0!AoNIE${a&9K<TbL=_dM%O)!%Th&#`dyS$P6S8N#Q z^WVP85rIPxT!-D?>Jq*<uuol``!(g@%3zG`2dR7pz5m-bqzc6N%*e6j;HRhK*kFfs z&dk{Ks(E<FpBboh<?8&7O9~M!&-%-$4)d4Dv1tQRir@1SWrImp+Iik{!_xaS*6?Tk z!0-@P`+3<1<6xq@tR+_kFr%*>l6xbMF^+i6J94zUujY**CL9STC-v9_ul%-t$QB69 zv1+S(IZRWg-G5rG>DGT2NC3RDK1Xy;q?vH`<@@T5mu$1w5ml6g=}~aQOAsFDLUT)> z#-jyMZn%Mc6E9hG38P>vAnvsPYCH-b)6S8Nz;m_uwj+5(N3ZIZ-xJ&rCydEa;S0eh zdB1Fi;}_3i)=d5r-8PIAB{R#^*$4ar)Rsvn6Z+?g7Uaz*z>w1;#UX(amAy4f5qwhc zDv1x+C^3{I0loM%<!^8D+sf#371A4#_8#s(UVTwutGq|#oM$0OBWTp4{)GOHbgB>h z^UoVGTS<zTI+g*nCkv*s&DBFr?#5}qt@9>v-&JMiDH{g#xM{xsV30T_9S$#FHpG7t ztjd9)U}8WvL&WQi*RLbFP9_NNXlzA~Td=q+?{F}jxKPDY?vQSVcoBNS;kdv87M`D- zZNMB4%7vy0{@q02*kWPOS69IFT0s%<6uh)M(of!+GUBiLYofarcE}bE&fNwGV{a7v zT-XZTG{L(q^px?_C5S#tD*lz9PY~f46~aOaTVy(lolo{1%7iY;^D<=rvC<9W9Vx|Y z)?wn(TNxies-WNwd<iGIahE2|>M8n3=bnM?#PAX)m4sIjyng-i-_{xUW*;fTY}ISM z`{E*Ovir82UCOTRn-LrYf2ZQ}%a>8N7vC6t&H!d+o?DJ~*S!i^@u&aD`&gK_yR2z3 zdasRVgz(b{bM;(U@(A^3xZS!2ndUHrb<Mu$^{cFNlWuWXzMYWkpvKpGKCQyN7x2A= z_p%Jyi%D+c&?Bc@Vyv8Qe6X<TobZnN_fqkEjGIXN4$fCAe<a(kkNA{no4j6A$z$+0 zVE7sc0~67&#orh0e%-(1&A;do{1EeJD!OAvM?{E$o;Y!FWO>EdKxR-<nk)DI%rdXw zaW(H{X}B)d(EsD>t>dEHqPAfex-kG18Bh_BR=P_;x|B`<X@>3;0RaIer9ry8(*Ps~ zK}urih5-iYc=veD`JQupzW4o)-{9Qb?tAUEu4}F9+V?F#uN@)ht9~OVUs+n8ImtiZ z(VSd4r|e1BRT%lJz-1ibkkfAXsJn^Yh0JVwyLrw{?T8;j?vi5uD;;9uJIl__4=OZ@ zI<j`GLQD@Q^)x|x7X1d9)dGt@fV0f_6?NQVqHQE^cN~e+ta%%}W>XvEHW4-*XFU$L zLxnI#DU8HFMyKS)SMU8BWd76>Q;6lP4|!S-Z{vE__|J&Nz3zh<YMe}koU0aahn3ak zxQcQ3v17L-TOU4{A;Y?Z5ioN_+`HKAw#X6_zPndX>Sqthf58Os;|?7rPl1K%4}ODn zJ*@=Y*H>4HdJa^AZaUHS9A}U~ws3whQ=}ujEUgF$HXM6}x}vJu-Jo&Ckp=?LY6+tq z0t@c1SP1PzVf@n2a8(;4YYVzNJGS$FmEAg_3eQ1RTdjdG$JO$jPD0N{PrH>@?%^5n zjHsw@G$SN2rl!>H{*!(N6+vBYA_$rOZ`J`&#tHLIuh*5{gVr}@KD}&gyhQK=-xixP zJ-(k{4M`ymti4{AI?Vc?DqEN0DU0IFz1mX3Hx&eE!R>JpS=_y+)0<v}akN9Mc9S?v zps!208n<mr!v6n5hRN+!Z9d@N6!G|mm5pkpgI%wEj2fk@pQm|9{(H}wf_xoswwop$ zYqOK)70MFuue9yYNQ95_<OsVh^H~_-*h^r-20t)R_t7e)23b`cFTlaZ0A}oqw6sZs zHRNPeyazZ(=NbK21TT8SW%nvjtz3>W+-Ih&xEX<l2AFma9;pA0!ekt8DTbZO70F{K zsrKJ6kh>1IwQiTLzMw$-_a?`$rxf?@tBK${pqt%_aI2Z-nG3KB33&dWt!&he^Aaa# z=eQ;0<aKvi?{;tu>rP8@Eg#)eMxxi!_|D`XsIMu?tE)e_$C)7&<>TaKMp5#uKPR1q z+3Yu%6&EL03Bj&2^Q!{lTy|0Q#cEbYc~F7PWBN_wse^g(iJ37=?nHa*tXxn+W^d`g zncv{!fmXrK_4^;SYacr$kL0@>62Hd4{)tUaYh87N*c#uREV${dHTdY?PkQzxL^C96 zF=rr<dvEF4*x2o*0OVQxEj}Tq6jJOdbtB^;a)WhYt-KhKPaNUOdul5UHU<X2*@WP= z!CVFuMtxfUWeH88ciM}}39TKWWW4qufp#{=9h};M;_qVo*u)Z9<KT6XoA(C;yO`Q6 zlH<($Cb1BbJCoz~kB?h#5P)rKL=Li!$QwIec8Wi8wGaWe#lG;Qm&6fMLf)^J$D#)7 z&EKsY1#oFVBG;!=DO!?1Zp6gsMHlx8b#k>*_faO845BkZMvH$BBI<Q}U8I>Wk>3yF z%&jKn20OEn`{1K{_;%Jdf=lksl17~P`7WPWcluu;SW&u1Sv-$fT5X)19IOxOTFx3q z^z!~%Lb}<0P@=t1(`IAA(If`Gfes%3rc*nRfa_BD>4?***=G|)1us#zN|`66keX)< zlTp(6;^NGl-0kTJ0%Bsk(m%g9KJQpY=)X^vfi0Rus-Wv41|;wLAVa5oPkOqeeTdTV zT-J+YCnp2n5Ca=YBYVPCtVf%lU<ME$wFL4cYgd#<ThJylUhu4R>b@}XfhQUqUQo)j zlVidNLJn<b0}fif!dU*3wd)8KNZ+iO4RoD!<E@eMY3{TicK$S(k@MepC0<6DauYhh z)ynv~2TtvoUmBSpaM_q$t%;z*0{{*;%3rRGimT0ql}PUzO~KK8NsSBGEum%sy4F?{ z=yJQGff@HRj|VlGhFOZD`FNzp)=B8K)1>q5Vn+HiFC{+lOK^j@W79J2UiQ;4J+}YE z9tLI|RXrVjAYSXjen92QiTbpIXxkx7(X8^^0)%NcB%z~gx83bkSs6h78>f|y(4!e$ z^?Scp6$2uN!~IZ|6=R#pFHM#?Rb#ExR8(Uy>AZg#11?bLE=K&?pO0wuEc!QUjngSR za@1WX9S13Cw(cE4Bn}8P@O!X<``xI<aQ{;~#M=XLN~3P~%BOBTvzjP6s$M6DAF=cB z{Dbvb73Ixx2GpPC#rx&Xh&jB%X+^D?I#oH#*r1u<YNWs1{dm!_s)jZm0*A1u7uHr+ z<<p6r{B?WZ7Zlzg!)nnIA4xiA>pK?--M?51D;u#Y&0|PAMx*Ke{wIG`ISfb|oxgt_ z<5Uhb<(?exJ_cFSf6E6JJ9z<WK>{f+71Es+KJgOlgRvgh7)4iXKy(3}{*H?UKWJrs znCVkhZ&y13z;;+xgM02{ieixdTJB_!k}Y5Yq{U_$P;|Cfr1Y&NA*cMqTRiP$J|eJR zzFEcnlVX%vkAuhM(@%qy7-}?H1*30=Rm{C<ITPpwX=m=MZ(b(^6Lt-x!^!Q{f-*cz zr2475HwV-rsx7D<<39<}pMdx<V$p0M54Q(yqGeOK5P;+;92a|K0<yXw#SNO<eGtS0 z?t5y!t<#e6`VUOK{GMrzuT^lOtERXcw)0v6*cP^O(eqN{eJ>yG*uIdkmv;!A_W`wH zhIRIuutpySA9kdQcL8rv0RXcAWeEL)3GK~65KbL$?_V_BnVmk(<-hw!7~=20Z-1L% z3OyRwAxQ8EX^FTGU{}d6{Go1$hpdV7YuZ#UwnT=g@SMJC&aluuM%uvmB;7ve%Ibj1 zD2<_7k&gYXWs_%WGpqMCr}+{b?3}N&IHk#HOYCVIHx(9Ig0{)|8^_N+PFPcm`R=(> zi_*mN!zxv9I(_Tqx}8E&Qng~^2W&Ce?Y3;v9j6B);x11)*SaF_>Pz3^SSlqYxD#g} z!<!XaJThV`p!#*?0pIonyw>_;o!fp&f;HoNNW~^BbH4#(ENR+ItuH^Er$i6kez{t` zyg92OA2aWBYLy{PD|>NexSP@RHn<?q<BH=x64r+;L49mFrZ)Tv{Uc2UnP*;=H+s?6 z)B|id0?m{bk^|NMU~w3j9s$S3Upxv>DkV{y{xEAtk4`r``8a?;Mbzo;@x)RZas{)e zaXs6`@vgnVFYz|#SX!JnpL=F8Mk))6%$I%731e&Jw8fi<kc|yc=~fdV?zzIKR+8YV zQ3f(g691~bm76_cC>-kH%rC4Mb{u|o0Kt~&CGl&#@ElNhq>z|@<fB`=oss*Cx?Am8 zu{$mCYjI5+;(#y50N9XEF`9ZOxWWowie<5a#!Z{<dR0?3Oc`(Ee3*&f7!&7ldft)B zulv>o%U^X_@qM4|ilW)Sdn*QHCe4pb*#n1Z!d?#Q{NKF>Wt}Y=-OD(1xss)C&@oBT z7R}k_mTERz)uNY1FL<3`s@eYbbglcVj}?xAX}S$D26`>Jr9`$R5Z_xQWS)q3(VIhy zzf6w3Bau29YB$2oiDnb`Hc$CJ3>YkJ+=~~bs%+!AviICzQK7h4F34mCb_d_C1on=4 zl*P6c^)dz#<kaL-+{rPjI;?5v=H<7EkC_9pvh_FJhLtF%4C#CD@{svffvT{#LaAOe z@6#m6NpE>2h+%qsWcusw^W!o#mkVYGYL-A{jNOV)F7PWm2YaUxct3k#ob3OlMj3a4 zjSQB(?aIAzwNi6}0G|8u3ZW&eJ}cJy@_Wk72O^@!zmoS>4?_6%kN9VN{jd9p87!Yk z#uqTv{YX+M?(={We1fs2J@7a0;X+am{AAAvjar&OoD?fu$XV6AxP|&I48`Ds_T4dV zsf%yFPb4ems}MzIK2?*jZlFEAurP~3z8dEL?n%FVdWgb&S@saqOiP0+ZSUEP9UQ}a zqow9C$t5F;v1nCSh&2=9X%5~ta@WBg1AZN(A1<V>8~mp=Wae6D)W@(eE5Ufb6yVLm zRo7Tn`B{a;;NfLXHn}Ux9vmI~RbA0m<lHsGPu|J-5ch@Hf3g(FHswSL`%xe}?OyCj zG-eeyH@w?Aw^c-*WASaC8q6*+t_<!EUrU`?ZJ#65shVT5oqn#+fHU%A(BiJ27)=f- zLFR)6leIH#OK#z50ivDL^r&IQ!%{av=&ckSB_g7Qn~0b%lBq)4;VLuU9pCkIyeiQR z*KPEwi6Dsv3X>r^BmxkG@Tm~5^lpF+>!dEew@^<y(ZuYuHU!r2e*a!oiYpH-2mQjq zv`y*uJyQW~x!UEIYR5<K7#PA5EXR~@$$)lK-uc@$Xm%r&fs2(47WRphc+P0ez_~4% z@5WiI-<-;~gXK@KwDXn-^FX(ilq?xhMPFlc{w=Fwc;-nZY+P@;>D!MF@MTIET}@}Y zv#)Hkf|vMWLpIqr`=4bMjzn>1o(bwgx9B)kAaBeMBAPX^n@Mm*wx)MU;$q{6_q7w8 z3PNa)xX!oN<yR9|3~~|-eX7)3aK`kc$!6TB3!X9S9R6ZxTqu<hoW{fYHylMb657wP z2Z(O=$fq){2bwBxC!AapUhp!!_sY3a+z!l^whNq>o_wJ<f2Q&MX|JYD7Q9XLu4Tex zy~Tk_qxqU?81Z3@bKB+d9nYfz+WWTS_H6bKd-n~J;^kz0)nvM$V)1AIRJy*66Mnnv zlQjbD#&s`~<}dAp79a1@FTtPV2F_o*x_nxjAZCv8tMX`%W4$0+j)7MX-<JaIupdXe zR6i<R^0M{qzHpjBj`dyd6a?n9RdHYLaPc(%3YcQI2o!H4T=l-DQ`H7oV`hxD|Agl5 zDfNUm0#J&~eGkz3escOG8zCQ1k?^!r=Pkvv#8b#fLTOBOuPyfD{+#k3x=*tbeAg;U zkJOpP&a(f$B3;^q+mykToixv7(-Wk8ujNMVbhZ61jowB}oyOpY?_VrGeb%*DDLv1- z?!ArZwK!-P?zXBKLO{KeW-fPn)guqHl>m>*ZVGY=`VR&01R($G4K!6gE^h!-j-${K zwAJ}2lGm3Szw@?3s8V92l|@+D%o<FPvW*+xk@?xps=E_Uo*aE|qZLSIh<yL@e7eQv zp3m`?YDd>6@sIZl9u)uZApGlUQG}q0EfhtV9Q*udj1cb66D17zGsMLFw{4aT>iB`) zv<<Cer>%F`9gJ4i55p4CIb2O=xw_1F$emEjyCi$snLlA&vsGer{g&)$0q>7HpEmi& z-m{B5e^l(dl>DR8Cn1}Jn*4?ZCgNSFFvj*Z!BAq%A&&cL>r*!I3|>3QIITf|xpf;9 z)SZiBs#ZO49M9TH&Tn{076<kIz$(3BuJWjSIvCVPRqftyjP5o~8XqgAqRKOl$D(;{ z-0S>>I=jf>n@#BgW%%w0kFKjamF}1&-di*}7s!PAQFyW#V`lO3n}=N8pCJ>a@m&|L zWc_VtkVh5AdF)Ml(t_S!o8%@N7O=L~4Kir{OK!wrM6WG<JQ7hXpM!g$Kc#s=Go{dm zOxvdPa#GdRoco}ly%D^z-BGgq2r5Z{+ORv1PGF~^rYObF89=ySKx9KvCX7}V+sJn! zdGAziQ)Z5V#y*0?ft`zkxUxb_GSO)+YJ$PW*ntXDSbf`((H@F*KZBISlEl}1ht=N2 zzinQ<;(9_gV3-*7{WiJp%nsi(Fslg%t9))gSfkQf+oP;dTnp>z5|?nBzWcy|9ebjP z)>m)s4ksz(oIL}8h}lDW4JGeKWUs89?}WiW{ctblIZZb6ue!R*TNHYgp+#8`QH$Vs zeRa9RE1_~|si$pql^?UFGwMZG@w-@ls#lwgwT5dqUX4l6%|`A%{K|E@jR$9e%oJ&g z%BwR(WhL9SCbVA8QI)zFA*HQew&}f1e>9de6Q`*s-V1FAVWlL}cbZPOKwJc}cYVbA z@7jW<wx-bs7&iPM4f=uJ>&pFHT)-^yo=*T~v1u64yJ9vdwk;yRmy1g9mOdqW0N;MU z*~cqQ5}r+F(4aMR)*h3*mR06RZ#%BSz<HPH4Nj}Ng~qekO;W}Qy&B2E)AMUVzpn&V z_IxA44MmJ;tMiD=8?;%U_KL!<bFen_I99&qwrLDGkng_+j|M&K(_Hov>zELg9mA~= zc^aY7wq0n=S@lRos3v}Wjlc3Blfl7MLY(L!!L5=ry@>>+2*s|aNX8OJm1?gmH9uU$ zUYg+deXMsVqF+%>Ln#*u9S5NUe^nV1ES%CLShr+8@5ib(zVQ_?%jI-#T=yC84>fWi zva=eFxsmgT-t{Na!NZ3L-=|hJI#-zzXx;*9ipJLelM8kT11tlij?QMZSuxn_&VD}Y z;cBh>A&{UQOC43)dPVDe^O)PrJH>rxg!W7>N(^@Ss%d;YBJR{qB!Y5)_Q7_8i{=%! zW|N5eh`3Usl>SQUgxuVrZ=@)=U}SYd+%G_S<q-*SLP<M<7y$I)V$i_WR3XgqTWr{^ zE@#RN1QWCR+DUvixxr+jTRrTRCg&@LlA={VTX)QQL?vtB%}hd+5##{NN3d)4ol#b{ z*95P!r`p-hc|CL3pJ3m*$Hy<cMM@afCbwx-IwRY0YImis0updRDK1=v{3`Nj)@L|k zOwC(wa!OZIk2flgo^SX==!#<js7i8V(|&ky@$tjC{bJ#sm+tcdR>r6@{9dBVW1&>1 z18&i_I!<_99s9Oc<tN<|2mODqn!o=Fz8+<KhkUAx#kr}nr^(hs5NdPFaudGX2dU!r z83DDvE~$$o18oOVJ#6{$)h_1uT%O{Wc%TToOVyWKBzRo(ImB25@Of90zG8!3%aGB# zk)y`!*KnjyeyI|`20o1b=7mTb2U8>kIjBo`ZQA7CTGDw`I_GtaTBB~3c?*Kn8KI#c z-?g2CthiT-*F8GOWcdXbTUb$?_FZ=`zz&GkJ28SH=huWv8PrXDe}4fb|M7JwQZ9H2 zmMEp+R04u&=D{rK?|q0g@4bgL({{Fl6Z9HeHkOc((DI-ev0Iy$=KY49|MIqMTe-uD zHkIo0=Oj4guua?3HTfB_t<B#2j~~N6Y6l;!f?_nbeeOMJX-;NqAA<K&YR&%Vf7dL5 zX!ZFm;4hO})Jo7iG3bDSc~$2SdS2zJX|%qGeS%cC9gd+fb#gOoJc=>!ic!`ukkek9 zo8Pso_o6wk-+B$AY@6tY7DWpf_&Tc>ZVa`<7O8gBR-QAcA0qI*TxCI>NvP+%0a1c5 zx6DA#plRKPlkiD4V#?+1(&MgSrBj!>J4XRc^iCdQqKAZuq_@|%=gMiZr<BBVc8w)q zr|3p$^Lg|1=WaqLH>z!&aqATtG2a?fc4W*c(g+n|Qs{4h<+^~?AmvTG+jnt_x%<t( zjy#2wjBH8H$sC?>pHEMon)l+VU*i_$%s~fZnfl4#bsf(QpJ!@AylrEdn^~r2PQ}9R zh%M(WBzsoNDXEI_ciAM-E$+QT*r`U_cZ-h{WoJ<u&1Y>FP1oER|J<%O$OEu_$U%$P z;AtbE6FQ1urqRE5j?PQ^0XPYyc_A0x!R~`(Z9Tbo>1PsC+iN`tWU91gU+?Ccak&__ zutr8%dO=s(ge1(zvE9VSex7_)p&j`V_3hBxD@WD1n6s;vbIcXShB>DHB$zAjO^CJo zp^4SZepY=11-^T-xW(R8!kdmQ?%JPkPkz>$1o+%^N;%*mRai(7{~q@Ur4N&x2@b^P zfxr7p!*#i+t@oJ7gM{+U_f2a(EbQ5N=^lv&`oDOQKaYEL_I~}!oHKb@OUqp9cXm<4 zozmZR*VHQn;P-(!y$hMVk)bzN5@X3}d%Nt8%^2Alca<E((4CC`2Gt?qTU68>%1e0< zmMqkGJ^}?i56tSuZrdW>{xYDf_n6~vwB5zt&1bo&OTIuMQs-TjHSOArA#CU8^=VMt zQ>k_noRgD8PrD^0PlsQ2QNKQgN@Z|iB0Q?Pk)Lbj=oPJ7Gdtm9uC>YY7m=91{w8HC zGqhNDW-TFiq$pJ__9EsjHL04VpLZEtsq<<adYED0viZD_U2A0c%L_kzXKjq#KK2+F zOS~u|_c{&<x?+UG21)D(av4p%me<kISD%(>eBbM${TSB6e6kV)cY0ekYBO6F>4R)L z)F31yTAG;QsAS!yGVoR$DpR#yHH@09>M-<M!1A0o<al}_1clMn23g<abEOw6oA&Zu zDs!Cd?pxHlAh_E3?H7>{q0eU?esA1)&)2B-Q}|WjR3bN+!z4Qsp7m&7sn|!t+}pAI z#O4pN&U{}ZqE0prvnD=SI_vf%UN;^hfUQ;Az?eP;7FhKhT6Q9lG#6e?d>5_K?UQRV zq$K34&jVUX-OElh!&;9EZly>0>>M+l(aj!a23-2&bKXmhtV<qiD#Mxy4RN%9S8?pZ zF{dsA+AcpwtVST*UN6l0{zR@Qw=s}BZKu9SyA&pP$kA~0;T|P}u=(ft8zu<H^UFx{ z$zN~MetGW<^m1D*azf!}zv^s;%GdmTC!5}Paluo3LpMM9om{9x;niBK`=?Lph6nVA z3Qef=Id$Kf&z!7;tR}<wdZFf=+@5;vr?tA2s=~ePqV7AKW@b6V9#!ViN?nh@0A6vW zKUMZYx72EUj$cM)CE?G?kqZ)g<4qY_zbEFYF1On9E>BjlvcFrbhL^QwDkl5IpA)So z=3Pjy^e4)0t>C)lk%`ag-6ktpFpis)Zl`YZ=NHYMUR%+0CwCA{yCe#-r`<&bVbG_U zd#BBzZl|vtonrXWdZLh6d1JW4Hz_a|^Ww?8ktF$fU9M$0*E)61e0wjbYwASFREAR2 z=P&67%^^PeLuU(REUS6?HAl!N*v-fAa=weh&)u=~g1kLxZ|L<*4HLMd-~tM#7cHNy zMS_S>%LqmXpHu{b_TaVJ(O}aNyne^;{Q1xnwOBgtBs{qZubENtw*0+d^EYCXb%@Fj z-rmH*X%7_IgpJRbJgt8b38yve{c`JYkQA;eZ4H23)~*Oa;of@%RBJUOd&B1Z^NF9i z2Q=BVn4#w7CGL9dUJHD*DmDtSi=rc=Bg2ba%e%E==MHzKPx78b`x;Aq!=P$?m^rp# zff#^!Tz+$?`ewr`6hU!|A(B=RR_dFUAR=~N9B$f`0hA~I0x96fW?ee1g)coRQ8`7Q zW$K#;$9fMy-j`19Si0fNMD;;XAmHNknQp;&U<k|VP)9nGm^kA-F>Q|rW;r3@S^p{@ ztrYkpYZmAcRs#3eCF+)xWEqyoWi_JH5OG!!s&=jsC#l<*U=Zj0B}8@5R{kpkYFDxl zR1S33ctu+uULCp{{Y6Wz_nR|khyq^aaZ$fT?7j&WB#m{JS}^E^v<QpAD<F3wbYr^? zGQm|bU!FCrpRXbr4-pcI&vm^#wKmBDlyCsMh|Sl;0}FQgc9=oMxmsjagqtmt($J5D zM%ei^durQ<FU^fF1Qe466K8x6)qh@Y+__?X&X=5DQ4tEGovI7PYm|u)li5Vp&o3-U zdDWINW_^F0#aIs=a}cxnJ=Ogmi0AKrNRWN{diS`+9QS^&fnGzyd%PC0Qeh_0Q(uC7 z3IP0U#3h>M|AAG2$;W2DrM<jeobpI1bK?8=N|?sz(C5Gz<n6A6E2aUBgKx|WiL`DI zV&XuU{lo~pPLR>>NBq2Af$`OS+v$nH^2cQWsMHMWD;D<&koi~9)i+?I$E3b8_SZ%0 zbYh)5J-Y?c#vOP-_xAS}j_<2}{#x6oJ$K_+clq6j-el?*V_GoaMJG~+U+(2yIL(uW z737<(D+6LfjOisgr%>-#Za#GvK4IbExx=~oPe(@fXmy1AwB;{0sba2}yo~PXs0-?f zqJ9FqMB*^NY|HNxcJn>0`<4GI(o8^jebJ%vkBFO6n0?#+7)X?cG<7`s9Fp*od$a*X zK3CD4wfJn!hpi#zC8~InmT|k`B+zhecg62YT~m`Iq9pJ8=VMzli@I&*k3nw5YXDyu za^NdOz0JreDBxzG*E+Ch8~rg9Hl=qGX~y?rtra7!V0+S78UGsr_WAM4As|+3`Wp~a zfD6uxU0&TwbkRs~t<!i8#uy@~Nifi^9eq@<FNlvTW#o_ZLZ(ez^v<=fRrze*QOuFG zW<KFG`g#P)O@XiG%dQ^&4=kRahHPJ_l>)%nZ&X-t_WZ2MFVD$bF$<6On9Apy)lZ_{ z3;hGfrM#Y*i`5oQt?4rb&wb=&uG`G1g2r)Z8$u>QPdK6WtTKjj+C6XchO&io9^TJu z&GwOhEL<$U-qj@8F`39Li`2Hw9puK|8jr^M899-^$y#Ik66(<^?V;S|C%=nmxW#4W zHlB#g-xSR85t(p9qUZ^;%usMdz?J$(chV9Bql_sI7vo8Ca#$CHqI`?ul<nS4;@R2) zGVznO95-NwoHIor2vTZI^pT*e*kfM%5$(nW)l7A_6w^_e+fyaD+B1cu8yW;sCGpki zR$ux=S%TW@$g%loMO+IrR|EYg@v%Ggo?f|mC_j*Aad_9NK#0k5qbK+dXZU<)N%W=~ zpk1Oe_1Rab4OnKCegox;uD&d+nT=NOnCO_Rmdl$g1@-l>U%i4@PAVI!0jF20$ckKo zr}mfNAx7F_`k3yo%LlEYl}?dzodf(E&N{oF7n-*!SzxpGhwo#R|5v~Oz)hfmc$ON< z24)-yqc}~U+B06l1mn-4DKN#ZRmU&(@)EtzSZ#I=HFEMWblXS(9Z10rgFXEVUqNu* z1CfP$Q$tf!YJO%z+o`xOUNz|(e~p}Z3G~&D8N*h$UM&Fejlgo*)}F{`t`W0Gn-~G= zgs)kfqPSJx&)+a+NB+z+q|<d8%j;G-zQMFws!Q+WMuc+J6g%TDsMZ0x&vLQEv**`( zA+v;3);=v-Cwfc)?52Sx0sc*d^a`Ho&aI*IYXnXnR7ia}4f(9`T<0exyIJE8S-^FY zlOl(~Nn{Jsa#0ZuU}A<bpE#|$@lzB^vqQN&KDy@2{bF<Ctk67NC^hZ$@X^U!m#y={ zkeAYfUF1^K;IR{&A-P}L>yRen?3E-GgI0t&{Lzs5aVyeiM?j=<b4?wJm-<H_qIDfF zTrj~{he(Rc^iERAOVDj;^ezK~izOU(e#VG2Pxstxr>>b8=anpks%68T-_hI1ovggy z9j?&#w>P%UsMmU7IfniT#O<B_1Yb{2_KsUPqM{N+LSBXk#R<T(G{<RKd(imt#1r+f zaZAE$>B*9L(0lS7J<KoJyVuK)bh>dqkglkm_waqw(Z6RYHWHkqxJF)nBsf%akz8$J z1Ab9pcFNwBd&G=Av4v^xMXqNy819o=f{*e6E#PEQnr$2YlRJZDkiR=w(T6sr6H+;N zv<%^@9&xl0qR}5K<KHXqXmwZgkcvqD$}yDxS&kWSaTQI0b3_Ee`^Ya3pBWg)s+$}1 z<ZL&a5U^=C`y06L@^~6|Y^1KU)h|Cf*$}a5rJ&@7wQ=+Dp~Mf(4c#w7(uLw|EMRY4 z{@@@p44gkXlFYr+Dc{j~S$0L#fc32zkpZf`Ro3!<8nrZL6cN?l9lR%J8v`^PNg}b^ z+JcF9zns%|xnH8B_IK39<bIaV`9c<?B!L9)#~b^Jm|mF8;>1jPMRc21EW!Q=*OL38 z@+dU-6nZ&>?w7c?_+P#{UgX+x?sn0!wkp_N;K(=IP?Bw$3O4S+-fP;FRKvrQZA|t% zO1w3rrV;d*k5#|#VwCj#CCy{Uolz29dHJSIq)lb)i(8aHrT42${P9W4^&4KHi;7@; zUD)RnfKxOk`*VpG@^M*BYn?6oyS$$pAPuoSWMU8Mh<-L}wWrRTfX4SZS&|H1vsXBy zAoHtS1t^^CkPCEni;F+jk&4WAIppDawm-E06TX~C%%;p<7j1J(y7TN{+Lh-z>d}hO ztuU}?Ocd_N-2&Xe54;y2X^{E#IEh5Ya-;MGXd5i&3<M1=6-Y^1^c-mk`e`I(ziu#T zL;8s-@l7|O7ln+RKdRr5C00P04F8?Tq;1@D;hl3Zrv?F@18F%|kd0ERc5!<+jT-M{ zfBs_Co!CaIJqG)qfr64YlY`w<Ycdd3esiphjT3}1#6^)M#|VWv-;|OSvrGYhZULjy zkW6iws7#QzX}=IO68nMdQG_M1lyFD0xh>}?`vwMI<#AiLjVfA4lfj4c@$abujT)1K zf#CrOk0$aiP%X2#%!pe>h^?JPe`9?8T<?vrrrPHz2mj6<wr6`A`jLvwq<1l4Z=*b% zgsbwzl7NQq8Tsj-Fa`tL6uXpwwwtRJiw8H+;G+wVjQea;#uJYT^$9GJSDlxv$xobK zX73-#jlp`dCTV8|(c>kodpjYE^gz=tDM7>hOJHD`D1NO4$R+n~#U?bnZ3>MWcx@zJ z&As_li8%KSry;@I?ngoB{tQaDAe)97NF4(H8Cr3`>#aFPS}Gg6x*TqcC&zyVf))a2 zWBuJ1HG8vl<VTdt7q!<vMhCwTBHpA3$e+8UzkHJ@BB~)Ja0(d>IQ8<reH(CBdq1GO zn!be25&xmm7H^lrf$(^yZJi5Ip1IaEtF}fZ2*O@C`IvzBsiHnRI8V+Kl;SxLp{9CL z_vhEAQ{PI~H4$N3)(C@Pk#CdEMY0=EC-YS{v{uwpu9lcHKe+QDUW_|X+Wd*!Oy7%| z-HgK|l7?tk8*!ky^Iqv^Xd_y2J>9$2rX{0j_-p!lvQ_+6NpH{fl}pOXPjT$=dxQ^v z3m8X#6gz9a4HU1#k&FgZcPL_drj7aXdEtQJ$kurU+7qCS*2#>XukTHGnsf)V-!sDd zBV%B(zU%2p2C^;r73{p8G}*X@L;yhZh3NnQZ4#HZVq$B3Nvtnyp8p~mK1!Pzhuq9b znPToZHOe?8!e8o7sI=)oy?9}&Tsvg3D1qc7Ld(Rzvk&URW0mq=N+1)tHFK|iQRlGD zx@>JBTO_}69g<Y9wU^2jL#)og+&U9qB9w1=E?rs9OmW@-vMNy`LKuHw857xaH`bEs zQCpDMvI&m<1ck{R@Q$w*zgswrtQr2RKv}A3SQ&4n)cm9~I4kV%lQ<GRa}+`r6%|Rg zPsY7Xs9p#-h^7wh{e!4T8p(+Z6M08vJ@oxvITkal_o+7pRw#nj1vQDIWd%+ej})QQ z@`;wl*RL%pi{i5J)O}bpwZt-`Ey=dEfzHAF_@(bJF~PR_#rV|keb!DyJ-Y=q(XNp# z4TsZ(B7vNB`ua*nU0OlglyDHGzDUnn$;`zf2AkK*aP)X?wgj^N&S)r#rek?s>7JtG zZID2o=8V1Xx43KV!lSKpy`rHdD%t_=TPw1oo}5qY2?YHNayk`r&knnF)F*G9fgxC3 zC0w7CeAN~cRF^pZ^nvAdsEp^O^U$r2Pjh(R_5YMyj#s0c675?)m{BBILd0}vjZVU% z7CiDX=1riU3ymH>@!j37kv9F?CGl6|rjf<o*a8=R6gh&^1D)?`gg}o(2VeV@$KXib z!xqHXgVMseS{HnBoMeT9ZJAk2ZX!IY%U;f6$wxZvjgDD!&`OZa_%;qN*`6Hpb2u1i z!kpKous{$RK$6BSWHIzQa${5)KcMy|A+sS5a{|=(-u_lI1f-!gu3Tc9B>z?YfSUsE zs|ee25$QdkluNaKZZ%=zt>*G3L6C#%j=VM{egrvq3z4w8{IJ?FZHe5tqrr@j?<??I zOG}6C$MR(aDIz?f@nZaeXXnn*CWPulQ>bxigCL2a01`0M^uhVDK035=GuzzB-+JDJ zBE6`jA{3{ss(W1LVoFD~;BTcFn14Dy!N5e8T6oNAfpJ}Xa<F>vzxW%_WW|Zc4y5C? za1hWicug}T$KkaYvP}LZiV|lgUs(83)l#PL^c|4VCl+e}J#G|Us~KKKg(h||35hw% z6P~djtJ1x@POT`s+Oo^ocghm*3ABnIi}&Y7526~{f{xp`o-Tc?44zuT&zai#1oJv} zs+?F1&LjbaOuP)APIQ#zE!2q|yIEve!v*<xSKJLw;`PVVU4;c)X?+jS02kIZGeqMz zt*+h_Kkd|i?vj&%|AV=ga@1S&U8Y)C%}XGoh{8by9Cr%H5XU0(R2J(8Q^5-Jx<Or9 z+STLaS$rVu_9w(g#cpUV*O8wAt%#~OJ8w)u&AtaI98#CU`W#(!z#~+->wom&>V4$R zK>xbKDS17DKcznI0quPmrfIvW+t=8=c)V^Y1FJ^ui6rROgRiRvOng@r-VtHtQ~^@G znySJiyjH)${C8V2CU6{R14^NBIhr*OtHjfd_I#tmR%y!u?08{yahluo@!)*+*>$>O zxPC)XRc!2TdtE`zSp#SZpp{g=Tb2IBKxR_Oik7zhG4duZZjYP0=RPa+c;TMcUBr(? zptJN~8~H~DH+G*SGpFFe^};cEpsOCeo^F~m;I#JCClC~OF9!RCR}Y=X6k}3IEA33! zr_aY39wnD3`TV{!UGe1TACwr%${Rx+<G_+Lw6eT#6m6KW1N!1%Md^SFeX<uOD97vm zr;!N*V!$?=HwsEc4O;fHqDyfq`vK83^Gbm!;pwWsc#(gb#+O$!1=albCvv*2yY_$( zD0Kqez;9&aglXL3a46L%qQ@I|%XkalNHx@AvFySHds76$EQT1Jbz?}!(xZXq9?ciW zJqNn3g-<q>JlxDPRA}Y&Cl>#s@!7^hP)d%^JF&Kw_--WN{b#Qd69&*rae~&jQn|P5 zvyz;k1OdOg`7w#PfbiGi$~bE0=U}W#^uolH?D?1Fczp-%1dSCcAm6Jvg)B%*qcYqi zi>rS)c$i%y^So@n=2YlrNaZEj?u5-v;2^vMlzD8iVvKS7;hcGmS5fbUuR;)#l=T9K z;|0MVfnw&ySKx&pDNT;@Kb&nu)a(3F;mCK40%R}1bwmaXMW4E5H$<Cz!Sef2;K;KA zsf<f(CG(rXlAVXy<th_={RKrpmpPWo`W^(>A@;|6=N^Mzd*fPpSi(DBU!GVfMxwJg zNCy-uYt_Q5K)qoOL>@Z39Xb;$&Zm1TU?~2VKLex<_b3ouGfo^1_x~65d5S$iCcBa| zaBW|rQuEB|oB#}{E;`lz33>VXd96-2LXuq++Iw@ZVleQi6=mV(QUk)PiE-!a`S4nF z!<v%NC1Rs#_4s*H%FplM?-7$?DmrHa%MkvnqJ7T}D!TzO_INQqGg^&i+TT0T-`^aq zuben68?KV+4ps{NE#>=H?E7~Sp51XI)~6MSBxa7-<ncC$>z7YW=N|dT`ZX1s^jSWY z`iGUJ%*JR4BO#ETeO!JCZrfFVwzlKi>T=LRiYxG;kxm~Tz07mvMssH6_V>qZv7%!P zoh-QJJay%>buIf1?{MrMu>3X|0AVEuNDwQCFQs~zkQx2&d+inO86rEmbFqJbFlPxm zy^XG_77nuB=;>ZLUg*BT^Ty=YE<pR-UVw9#1UGHVNAbnSP4S}s&YqN&@8LF)Fk>2d zI8Nz@1X(|T?uP?vx0zp{JYgS)!ld&=f8QO*6qI-4#m2xy?&2cs4(k)fj=dFWN({#E zzx*Tk?rETGrn$jA9XkQ?eN1-xUnv^;(N2Mrp!i;yd!<wGKR$T-niU8?4+hOyH>iPo zVX&e7TLvAtGuLO?o3k(Cms(!ow1^pLBeXo(?K{7^i<Y^$=a(%Sb%k4jNQ1*Ze3XC$ zg7V}~WHI4<{bcSYuoEaMYLvdH*xQ8N+3Bxp3lED!hQI$EQnRjTqtZ0nCxSn+J-Dex z4touwtMDUeCuG(!oU`l@cuDE|P!T|9yQ*hIN#xF<D4%l$Jy+f|MtKsUykIX;-X?2_ z;*Kvk$vmTOF`P#Sbi6Q;Kt@zAH%+CrU><;~*Q_H>Lp~^YSSNx}N=l;P-4b6(D0}Qg zom;A61Ds#zwUEHTgt^rd`M8rZO$>(A^K<`^TKOo+<x)6apu9q?b0(rA)h|kU0hSgU z(p$6m%z{m4PZ)q8k<A9}xa-D)y^%V8m9OIj;W?X)o*>GYuMKW+3$KcpONR}UDz{We zT$~<={uO5A@2(A!%98h{Zv^M`k~mDf>=6Zzm2ZXCO@I_FO+N)5q~+GbT#f-^Ok}Hy zOP0xefNNHAfcn2J3}7n^!Xdad@#bC}Z*MH@r6Nj>BFw$VbaeD0CGfE6jHq_L=Yz*2 zTj<0&YP=6*C4e+WbT9sHIc}d1UvIo9R8{h7J@3ZUIq0MO`_A~|{CkWn05@AKOJX{f z<9F;T*BC=vFP7jXE-q*{A0~c%B8W0OSE-XDXW%I`F}e-?lcdsd4njgt=s==4z9VI( zob$;F5OP=?GU2!PmyY7;9%{jCfFm+I4y25c<bF`<pLgv6L1(_gY-6v?AXZ)aHn;n5 zJfv|2nVerbv-%?h7o8~Ou(>N9f`sp*!SG%q%al*FGbI_JadC#9tD{2v*E2m)0SQm^ zYe(iE8xnkbo1Sw<EZ*E(c|R&fq@+3C3Q#0Pl8appG&oxYZ_;CpMK>d$qnTZ;9@VV@ zK+Ilvlnv6D5Y-1Bp3nsTL)3^Y?#iM@rAG^&>Vc|4FC7~E&<(m^)+FJzfp#D}OCa~| zp5e=Aq4E-78u6nh!=FG*n3fbr|5L_SO#o{<z2Tlg78Ol`<%73#@khR$QZ`buzm<*< z>LzFPa-3Wz^5{HFlg3^%4H(1+wi&9<&dRsQ>vFq?$Uzgtl$z=%bheeDfZVARPvw4@ z6EeJqXFfOxFxs~h+<Ro6Fw>g|U|Iq`*?513yUl1r4~FLP36p5`@nhqry_Jc_yd6zw zkKSM}s7t>d<tNjUV#4^^Bt%3+ga<_^zW#ZC&6=}~Z@vpJOlq?Ar#S2FCX9rD+Wr2D z({n)uAOTS)n0go8C!cz1xhTKjtETl8_@=)9a4!6kp)5_uKiJOI0vBZaUU2v~II~B~ z3xOYKhJ4VBn4&iwNL-jiv-?f0fXoP`+1su5SAiOI0upRbyH!~kfH-2dDF^;=dZ710 zFXWC6Ey!JF<Ms(Mz9lwf@FU&{R`#w8AnqwAdcF1w47h*ZDGj{Kv9w$X%uoQ{mb<9V z!rW42H4Rgis>gcV4!-YEO#W4$#6bt*$0rHaBU|_xFpw1mLMUiw)YO=PJM*UEKPr22 z{u)p<^A039{>U4^l%j%fdi0l9y1Q~r_oW@WBlQd#{r3j=Mo0`kSdo^I1&~ZmS4S%m zrRRBgL;&(eBc)cQ5%ILgFnu1THQ(~y)s>fAtxsoP2Z9}tp^RPqK-P8%KCIrf5B;2i z$PN6wlX;8dpR)j_5CW#62IIdid+4~z1}Rrwq}h(>K6UeU{QRpwfa88adtyK+kVn3T zWpAF|wqRbEm=PN_9?<*SaQXHdKJ*Amb9)MGh=#V@U^ud+qF4cFO7_sQzE1g+qG!zA z{w;WN9)nF8<r+hgpcY_2eAqJfP(Zos8Gj5az?U!A+j43u!|+-oN+j%crLul&?#bU# ziF+%|bm-~=LGh^2q^G`nM#~xQ!rq^E_`V&ybb1x|lCS5WfVN(-=6GLc!mh`z6o6{b zGN7ZVXMPwEpPQ>z9VG!U_b)aUm(#l}F23cpXzj}YWI^T$dPk^u7guN7Yd--y;<B>n zn+IbxxKZ*|Moe4Dl<YGBm!nq$1xjC>>Fan-g_8Rkj`MDXi2~Xc1QH#)QFHZ8Oc+N? zMLp}EV9g)E#cF0A;2rx4L6pXmF_Z1QMKU|Z{N;?+!Ev^tAoJu<bkaXKD0#JD<BQZQ z<i0hRD^ABSly2^+e2aR6`{aU=ceu;i@t?43!+9pCZ@uPp=Ts<$`{CZO{<qYGn$k3! zwn<=PEVBNaNwsHCinn{IAbj<N|5xZ`I0f+g&;diyt9Qf`pA<E?;0G6m$D;q>HEcse zpu4U-;s>xuBc|i?%Aqe0@&m|nsW@rgMuPgnjMD`RL1V7(cklotz`%67I`~+ohREOi zom`owx99TN!i$5t2d8i5&pFXPyMJsj3HsFkzdV3^RVD!RFF=sVi8pUHQQoiyZjwf; zvxOqGxqVQ=NYVlyek96uw;A}@P&bmlxZtojU3jQgfIG^8)N!PV%Tq<h@K%;YjV%wJ zN5NeG${3h#SHRh4l%VILY5VaEsqMI8Wo>6i;=2OGiSjpdlioW?PR@chi;exX8#p-N z%ons+_Nd?X{^3XfpmGH_547UdNir*uty!5L%)ODOWq;W`2cklaZvs~dH=Vfa&S;Mu zP`B%vq0I`D*vp3RWTVc_babUQk~q^3MWSr)8vDY28{4L|0ZL<j>9?UxuD68DJ91`w z!sszO>8^tBU-f`StAm`C{6_I_4j}Y@;{bpt6P&SoU*~XvX1wS4(hzUvS;jo62s-2~ z2Wk9(J8RFLEYbt9mr7Awi^82@-46(%wks0gh2Eo`Tnrt*10Dc1Q!NQ&wrSL%V)bF2 znye5ndT-TN`MX*$uX*6|_g*L|YWNnij@y!XPl8_EtGVBG!o3Jh1U$|Ekg1`8cYrTB z{?HBZ_;}{->9<Z^_8bDD*>6*d{(l2d`^rTSOhq^!bT74QqV}|aY&YqB!^#koz{9`V zha};#Zy)Lw3lDp3x&3Y*f*rVnjp<?}{+D4+kX~!oQn#n){u11_|L+4SK+$FgPNpVA zCNzx}IGM=FoBnL(`ri%UPFDd?qd4RG#BSU&1JH$)@A-qr1Q0-hI4%pUm76VYx$`la z{W8Cm*7;P~f?(!n2VJzgEe2l#XPk0{{MgwHD<U*ntH>14X;WB7JUNyL0By5ew>2Gw z2^n{^^twTS)-S=CfGki%5@YvaRJ~%0YcxRFw{pCo_+-^yGgK)Qf9ypV1-}SgfVp?n zK@8cD8D9db{qV5nxJ8mKRz2#+$$N>C9LjhJgO_&Mp5Yamkr9F7?KIfAPk^}Qu>KwS z#IS&hZZ8Dkv2SaMj9sJbDUdn7@lB>A^JP(xoHnje>O@r$*VJj=1LyPSSt)1#Zrlwf zLuQT?e&v!yj(9<s4<<@XoP0NcSJwLOz3a47I{L#&=eEEaQ&Oba4D%y<c6<^oNdM+p z@!ha~Q_$ICn@CDJIpyB*h0+18gEy6JAPf{DURSP#{M#3Z4hXc`p50#6f&su4X(~GT zJt=)mkavvK8*DBMZo%;tvTp{+a(@zwoc|S|Bt;bAQeBn#hIeFXI9||{RRA;d(><Kh zr*HDm_<3dHp4SDneD7)p7-!eyYSdmnix}2cSxm`iO1erZ9qK#eQ5JL_$;bO0Y((g@ z%e1(!zrHRtvPc80n7Zw}o?Lr<a5~EN;|Z>}Y9|36$u#8+V)(N<hjNoP0*m<<U-wo% z-=59>&g2Vo+ODYGTam%_CB#4f#yS*5t@yJqGuzk@d!t^fhvi$}qtS?_!}q&mfiz7O zpvOlH0e}tflVa!n|IMXvCB+q)LCiBb-nM+kJfVJ6zefkWe&&f2sccn&>T8W}9>#88 z8=X+8xU_e=-|}gh{Ic=o>}7?9@PlIUjAV$_!EH80#kre^(zF7%sB|Ng*NU39{EAc6 zKzKwZwOX{LRtAbnMlW?fvr+H_HuLZVz|o>Rc9WvO6v*Nr8gu4d6YbR3U9yPsG^Z_z ztp@55eTo}4@MoGnoW2-1TIIUm&M1GkAIOO{8^>?m@>p}a$Kt~tD^{nW@nE{9Yk@eX z^F2I8J6rLMx;HB-^sbdbTYye2Qlps+O~L`$^{)eDSKR<pjyEOxe~(26$spea{lMPq zVBOHQd-#)8c=g<K0@`4=r@66O=Agc&N4c}Ty+=aiE~dJFk4H;!S_Jz5Ju3ftas<wX z@s9t+R(GRB16)A9!NYO-dV5d2nBd*;fhbkz&Z>I`52NzXy*8R`Pcjy_v^eO%$}ecr zZRQ60J6}$rVD|Ff%-bXY*tc*|TqDm}-nx-tDw^_>q3te3;|LZxDj>K4d@twJ#Vo~M z^kQs)@yk~S{RzcKwPsy*R_-XQN*+G>pA`??fyJ3x_)w=_t&G53`G!~+GjrjZR%^>M zZ3_!dvx+@RuLGJ4X${xziq&6&N&LRmCRM{@LzRSrj{9193sWu_Pz$#fE`E+bz(Jt0 zQMTcA4kuq}@sFDwRJW`>W>1UOfr{^==o_eV$`dJlQ<uqa(p?k25tP@CEuHD#YF1o! zv&m@H9{P0g?d&?9TLk*&5xgZKSO!PxI6hP^QVH`$*G5_6_wJUmzP|fY;}2u6Fo{k3 zM@00QPk571avfV&$1WmQ=0orH7&|r3)B^t;pQ}NpgfJ$b76Iuau;kk6DPrMJ6DQBM zj^zX3zRUsghgdn|6d|HjE!Ga`890h08fBhU<WzT4Q5YQRaYlKeB`2p(@_ec^G%UM4 z`9eJDNbA_ghPN^{J|^P%Bh{P4*`Y6-;+pd5O&_r4HYOOFFZ3=(1!<H~+K(OGm{0UU znXFJ?!U83fz1+N|?r%!jofP*r{P;q4mgwvD>;8V9Q`t~&S?h!K95TgB4p9&NscoAl z`0-KckLs$7|2RkIcg7LVY@d*LAiT51{HCR8m%fB~TCss`WdFt9ajYr6t6(Mh^~=U( zrY$2U7u|6&Z$Zk;KGb90y2H&`?j)+{Z3{|6l&;n4vWa!Rqy&MB17opxdq2+dW0@+z zs(PGNle}e~Q-Ft--5Q{woFx9>;zCK29=jvx(NbG^L!*$WdL9^h1gZ5WbP6TJ_FG$I z1WmdzGiPq^=VDFm)HMxc7jX<Y3WkHpQ`Qnotw2o{CWHp(u68*I{Fw}ejaQ?8l22j} zy2m7@*>v<OcFILZDP9gT%d0-dypbOm$g~RQi(z2sS=(U~gXP8BHhqijZ@tmYocJbO zN3pTb`H=!tIe3^cv_Fz!F2yR{<9#ttO(a9Jq)|IIP=X100-K4lh|{C<!<?mRmq|OF z`XkcPUo*Na7JaL8)kbq{)lOr+s)JW{O3e`B=f^8FFTA?qijCK}O`i&nl#_jWpw6*5 z9%1`OB%@2BCzJj2BYd=%-{hT0G-sLH>rv$)M(p}@p@s;@Bo_KDN9voRbI!VbrcewR z;!^&cpz)rc&nZK(R67f{Z#wtu1VOUzYo=u~AI5a?2Wt#pV;r`TE)7cX^0}GIQxfH0 znrYz@VD23BMlDe|FAV5!B@4gw>8>$Z9k@S$8C`=|Lh~T`ri`#IJqo4jHf)1b&a_<V z*YY!V<znhriEZ42{CRl_O3sc4*%dgxw7y&YcE(H7$6#!?H4vXM8UN1ih_jpXPW$xH z+zNfH8q(%FLuU+vf@&AT{j?$%D<uD*LGve{F%1OkF3=kzD!iVwpAHDc4@P$oSu9y2 z2lxEizSj88oCy$^^~=0Xl#O>q95`S%A6BZZ0L|jMnrr_GOvS2)`~;CqJ0zCwJ+s8` zhO{4xCfVK&M*V>~F#;|Cc3m;JE)Yri`0e^WNn3tTrr-7R!L|BGEa;nLX{z9tPm|I) zCZu6;bv_aXL!l)2?&bcR3FYrVsS#)xE;`CDe+NCQ*;s126m{g+hjOHfd3(5$mI%fp z*1Q@Q{D}r+P3{kv3qJok?UfOW*Fr@2o?<of&^7~Zsp@!jI_AN76At``ID(?t51ei_ z&P^qGP?rWyIw)H&SLuLRmgFyD+M8G(JL!h3aeBj3WqlLmW5{%Uf6D!WHRm0P+{VHx zZ3-hcS8}k~8|#c}&B%rEqD2@$6?WsdD$IAe`R;6s=Ta57*&cu6+OpT$DXs6E4&H%X z_VO}ip5vk%WJYQ@daYMkv#Rh0sP!J3{QW*|cqd2SwvWUQckeIk{LvMmn+<?;2a_8t z>oGlHuk$ucRz8GYYLv>WPR4`+M`Z@RgH7PbV=A*Ysn0Bw`0iQaw^(%1urJ|mLQ^Yj zLb#}|@)&5~gyGAWVvLO?i#CB13S6z10qYY*jO>6Tf~LOrTW32|Wf(XV=fX^LB{4M3 zeVTt|n*iUCb%NXH)^U|)*DLd$I{{;#=;=(K)p7XE#98yv41k`6ZkRmNerSm7(!xFH z=X!Iok(T|W`stClb}<9xlL}kI{OSsR<q^Y#_d8)`_W1QCXuW^y=>#gw|8SXvR`uC4 z?1)tE5WKt?AOf3CfDL`0@=kKwMc((69IbuV;!{YBd|q~uJiu=YIp0~}ZFE=@i9WCR zUve)nT|*FnlN$2cI#XpG8pU@NUuW#cg@|o_Z=Reh<~})H(|q?%bz94TX+jAWk94w` zr+^qdu$Ok{7XcL)9H7;)aqZR6%4L0y49bou=lhs~NZ{-CbQ2He70!}Aq2=-Y`mqm8 zemWPk3Q63&ooiD_zZYCS%?w=yG$euQMh<e1rc>Xu8vxDkdk9OQmUu_*@a!k#+`%SH zv5Dh}OXmxd?r`Sx+6R2EGn{|jQ{K0ju{9Rmc_(wpOz@G<_v}88&$+&NUZ5}jKIkqc z`bf(|Z|=0Nby`0VE#0Dmv#=-2FvKKwDhMaY1DTPU=jw$}esy&UukD5QkJGMea8>#6 z_tH^49}5d_39@sUKQ{6gvz^?dU@^}A*g&Nx-?bMNehTaae})xCKr5A2sw;sR2oIXx zuxOg<#^%$+{Ky5?w>PBZvls<=A0+o<weGCu>xY2jaBpzPHS9YJ5T$6Tir;#!WRt z4Y#9zTt9I-QQ76kv))*(Oy3%z>X0VW^VkbmbKXs<HOgJMYT#~5Mc`L14&27RxS-AM zPrg%Y4xDq~c$=$`dAWp6<+hKxF4VE4ZUO^t+pK#{rfK6GeOLylsJsqa02Ry7I$!I# z+66Du_R|E~){J-WGHQ#AtZ{IHxV>hO?vv`uqK~Ok{35dr$N7Qo**#;jAWQ#C78&A+ zW`EmLUZLh`&M0k{u4ocyV92%q8aUCsj_S=Q&Y<~CP1%{l=FPf-o+*0EjREQW(S*^L zKQFi1D=s?(kgA~tf61p(#aUU%PH9+LrhF3{cfATZZ%y*KSc~YD<<XieC2V@}vRE5z z;w-&@{bh~d@2(-BmW;1^w-sTwLpYmwtN9SBIm3mik3LI?T#qTpw=ictEu>p#426LI z2*AAF=$*J&Qn>B+77X{$F3LQAp|5BcWm`I16tTNZ)!x$FT&AAo_U6s%#b9g8FP*e& z%5@^`ldVUKE?1Y=4SsuM)EKOwJ)%7;OO(`t#rY#vKU-`?ZW4R?vd(=-Ypwr+wY3(^ z@Aqe&TNMkag2b#EO8sp8+M2gZfBq0zWFQofptk&7tF5-s!SBIQJnz`j;m=(MI{f<N z_TqddPvfZ@yVb55&xdO!Yr`i+^gW#R=#$8A-Gwe2PJlyg<sk$seX?ekt>YRLpB>(x z9>x#(rJV%bALT|n+1_9?gai#4KH~byvb|xx9zX46DP>u3<f|3n&xfBs;Y5$!`b(1B z+cZ8qrD5$U`-tc-$uj+ygVS~I>?{i1n;R*LzSSRU0(<@p%RlC;6}0(k%OhUIkx$>F zBWQo0i(|N`Xl7X-tzd3#73KEs>pPGV(l>OU_HIOS)Tt;cvMDBd8s{xM1biG+`rjby zpC1EeDCz~h>8G!7JrQ1&iNmw>*rjx6%40eFnkJDDVip?mfB1UuxF)-1YZxL(6G5aX zARq`xzeS346akScy`$2*^iC)W3IfulgGg^uLl25b@4Y3VmjDSh5D0u1-p_g7bC>h| z!_U~RoxNw)teIJ}FQ21jU0(?3Vx24GWe1XgmV-P8dcBvr0+|uARI`P+d-<0stjTlj z!|oj&{ISynE~Y5rk7n5$eKuIxqf$56^MTap>-H4AJ179BBIR;F4QRDq6W23FBW|Em zJZMh_p--C;t0?f7FfVB;KnK4F?q6Ach*R19gPhs_c|U_jksQJI=TH)0z8NycM2B{| zh`RO)7j5L6{qyak#>GwcgoFfHyV{5(nR7~=Z_aV&``v2|Fg^P%H>n!9-uild3vNyL zUf%-l?4s<;g`aJ$7PxcwN&{arroNKx<Zv5ienGLH=|HA%#Yf5&b7k#eB-|`d28s?z zMqdfdqO;7xc$=b|5kBA72&DyfeYpIuBT!d>*PTHr=Jrvc9kEO6zY2GMY%lcoRLvjQ z*`oSWco>bmDLPphPnW;`(fR?(jK+kbLlKT(nX|QKH=8=0mE+g~x|r3GeZ}Yqz@8dB zZ0P6HCz8Y_N0%B_&KJb}h9q<aq@+svnGU3f?mKo)WK*pJwqsu#<z#lsCwf>n$Z1Rw z$V?ab4XS0|jS3N4TvGt<e$ZN?L;l>(EI&4RlnjWrXemaISA6YWgVFnICo<qCDk}Wa z6AyGbU}tK&j2C=E-QS$Nz<-;RDISGx&vz}QSgSdoj)cdF9@~x<G*i{FWfoa5J2Nl2 z;G<@p44&@pR=T4RuX=i(7wlUN-pf!^X8ZLoGcg{VQ1Fkb80qtf0db^I>-KSu<3+IN z>g{-&m0tDOj@Nk)ZVs|nPj5{yd;e(g^0!&3i=R%$i(bh>P_!6B@mT#?h&i^U-g-Lt zofEabVO|M@xqx@~qt+M(MWvb1C+~rcrNABs;6W)682mG7L^+fKXczP19@vGv@%1+_ zX-(Em*m~n|bnIb!@YL|uurBN*ZzMxoge#qy4wzv=DJ~FwpOt3LdWDZ_*apFXyZnY9 zhQ}Nn8@Mte1~=qvmFyzSNBzudx&4OxK4*;z&xm|$cnK~7?n`J#Pyz>HcZbaT0;n6G zw=X+p4c0TAqL$#(W6NH<K8r*OqmATa$F?X{>m{#l$-NAFu)u;Uy^N8vsy%eK5sD&O z8jPph7uRW<-IZIpwKU~<xOwc1uZJ^n%o1|pjk=Y27kG6mUu1V@XWLSWZb>4?M`n5F zvcTZZhkC8&<&V_fTThIOzMs9L$GEF<H(Jbdgpp}*>ygzTPJaJuuEzBLo~v1~J2_}i z6ykNeUuJ;0Gw(B)TOQ_P?AJ*l7Sn{6{>NV-0w|Gi2S>_1+-R*YS`@CR5PKezK6TFt z<GwQd_O=k`BUQ=1HJ$02FYZJ-DG%r>-iOdsP<_s#RPR-|Mpv;Bx%e8}+X~}Zg8Cmk zYh)48l?;60_E6_`)M6c^?58oM@{Ljb5Bt}ZJCaDb&r1vCctl!WuxM8lJYr_v9k~=s zqo3Zrh<lz#C!@#8p?ftiXmD(_>tcqd!`^wiE`C$5g&kN4`^#aFpo-I}pk;d+N^3s` zdT{V<3Vwy)s<?ERw-xZFum8XCnckMajL+E5`aeZNr=Lbesa7?T@S2~^dZ6O^t#WU# z89!#vb2z{Ay9oRj5CxiVO>O$nTfST!=XstB{pz>uHzL}Z4`zJ)KTBs(9XwX+oQ3N@ zpQR_YH43=9?a1r033SCIbzZ)<x!>}@=ZiO%Fe*xDEj;Vee@nAGImmbIdwpA-X0Ok@ z=n%|o@jk)Pu&tlZs(Cg3h%zEw&+HU=5fF;GdX~ZOODS@IdAPy?Gci#$;^v;tBAwCE z*|zz`Lm+7?o1FRlayZ{KJg+ppm>FA8KR=rIsdI-@)nb+|(Jm`6SS8%;pL0e{xN)-Y zJAON7Yym%>Ys_H~H=B`7hbS#$W1$R@?I*?My1LJ8I`(5m`)*sK@lMX{o$M}X_5XSy z?(gl%X1?s51Z35I651NC<n2C<I|728Z;hEyOPp))(l>rHdtN>u&nFH_{%o8~?e0VA zF59L`P{U2LE$u~1QW0(WePX*Nl5o(s@goIE4kTZNio)Eg``%LPwCs-(h`^eP@|P8g z{(EN3Wy_k?F}i!%UTRKxfEE|VHk37(z*B1%|AD9#k}!J((NS6j0@8-kAO*RFK`AAN zC+53Uc1beotGPalo?d!2wp`TygJq6Q)m)A|PEE;Eb9Ii6`k}Hi#6Z}=bOCb*f#=iE z(T3{$;n0|~NNEe<?RS<J<<2L_!re9W<iPo0cw*Lctp{Jx^fG#qzd6x!Yi4qqpJ`lX zh@C-_l#G+?FZv{)HRW^{?Y+pGdOLwPvsYBO;b7=P)a62$ls_v0{R&SXO!{iX1fKT| z@b(`5H^7kf5i;hTLt7IOAAS^-a!D(BZO_7&s(pPA?u!HW#z_uLvgf&<X0`xMRdG$7 zV(l@iW|^`(Z=&*=^W9Ouo4v=s7BfJ&Llv%Z34J4LV5|y|Z;%1^SxTz1pz~!u1<u** z))>{H^0A4|?`P*tNc8>h+~$b7=_R@YQ}hsk@;jM#G!f2mU3wGzqSVK|%@0UqG+i}W z`_lv1Y3P!HS2eR-&UteKrIPBkn*NhF+`pi(eNJrqMYR_*;)S*!bLYkMy!*4e!EcA2 zpjw{ad|LThe(Uv>!x@?i8i0iHtk;TC`k~0>^Sm^C6KTbRg+_XJR;2)CWl{!vT5HqE zKtO$pn48s6`k+O%&)G`4+xDY?7ssy(O#G{grF{m{U_;U*&vI|b;^7le{`ZHS$xHqA zB*DCu+iDf3L$GN<(TCkdrL07TLFI%SmJqR&rmway<u(|7{Zo6Z)}oH~w<pZCvXbAz z{YYczb#kxaS5V!W{#w~Q+?1@9R`b%3tdOV47Qc}en>g=e)S|G;D6Lu7g~H^rh8zz0 zO|`A^2LvpFm6u0RA`J;zh*MDQVP>kweS_3@@18@5C-WZ7ajh1`mgH$=*^g#%t}Hi} zJQo9*vQduZmI$5cbywBqMU8~m@@1EA<rA(Oelqp!^<6UIGKN$-+&B&7MW~+K^0Dd% z=bpGDTC7%hNv>T>C~r|4%~Qy7DQ@0dyjk^Tm^9@L634VrX8J(+iJaVWk+oTDjP%K` zT>HYecpzeyp#S|tm<MgO*f1h-cHA}0Ym_sWB&1a{JV7%r{`O}V^26FQIk!(sBjXL> z%M&K-)g2v%KP+B`S_#UY(!o@|@ZF8}UD>`zV^N6LeD7>x;)0*oDxz<%?~$1(h`HFK z`LyJ)SsBvDT4D^@6PQj<)G=J%og5%%=sCrmDm_K)ZZy|=G}Rt9A(2PNUvpfiPcn=f zWpJY&f`?@^{43PQt+I}-1*rr?y@;t>w;4yDh5h{bEH`^8%X&p=r?1;3^}M;wNdQGP zz^1_ox`CPJ2;QC*H*I<(sxEke3Dd{ycqRBWn%fSmu<o2B6BNqa;+l`B+y2x?XDT4I z%mb?Bmd!NSpOe1h?Q9@pra30gE~jYvRe9bI^EAbKNoQ|{0o85q+-g=16SL0X5Kudb zp{AyOJ{ULv7Bk)H(EhJ^{g0sq)8AaDp%rkhm7d%<FPe}%8Ep00OD6p+HIIGA*|pTK z`0V4#F&I5o-Xi~Q-d=m%vBrbU{tFS@kQk;_cDlWx%iCesvv0oOH4r$RG+0xWIrE}o zl@MF>?UaqiH+f!j41BW*jPo_n4d(hpRMh799J52ku*Fz!`wBwqJGr*KTH@C&bu%MM zI3~r-vzTjOt(e^$2X@@Y9-JZfq{ex;HQ&Jv@tD{Gax)6XWTqc}qoYf{jmzLL;@Kq< z;B1mvqb!V&eR(QE<pSSUgM2I5z*bxP^U535i6v%jv3%3=vwhP({#x@PD0yDc%v%-M zN?xO%(x6(7%WWJ3wsBH21_ccfRh>qhrXKvo11V**MF@X&9witp8Mo)gXiju@Zo*#} z1<$TNO$}YyoMLi~!g?(pS?!taJ?@#g8A%?)HWu()A&_(3Z0QQat%--+lKKfIRYwqd zpshxTn7QvELa?d%@^#vTtNN)Yzv|~!9wnI0g<wR4@jxQ&(;@>}XNQdYqD5d%r;FJ- z6WDYE^5>$jkL2pdIxO`Xr)OaQuXb!B%#Xq%(>ubPnHC*}(f;b|Y{v#Y#50ZpsT1$| zC&l4>d@Mm|?P06HmvY(sgii*=O@8o8cIJ`zRIfgRq1^KH`}Gk{WW*H7L&I!9g*)zc zaPLGfE--%?cVs=ydV~zdJJFZ&?y_urhA_F>&g|tQce<pNr~VfQl*Qes7Y+RMF>+&b z<W&>Bs?_N^zd@p#hG&UKjoY?7l@)1%?&H`I&gP<z5e|GDBySpaddH&n7IQ55S2AgB zMsq1_vVS-WA2!gw)w3AQe=(UaHF@sXS7L@_)cg6N5%BIe1<|gmB}x1OU!u;=bjs+O zHKRsgd7yWUC8|I8tZd6b1diMX)k{l1sS(&rtPO_A$G2BE`E-0Oq;-DjU`XOF?1aMN zdco>u4rWg$b5Qd|)}4Sn6znK-^J^00EmsGu8y`VMSAPFUcEv?T9JhT8Q(0Hun0)pO z!H-Updv^=S-CDA+>D<TmQTi9t{B_H0n(0{r_?r}xeJ)WQBRLra7$o~^v{<5yb<VQ? zNd^*kf7cIx?*SD2Q|-<@;H`CtzgZISu~`+7#1XL4_-j+<wXTcbMHjsf5)IdB?%nMT zRi&lzPyTquR0u*ReUI%_PpSqkn6aL0cNX3=O1mo6k!mzRldh1BCD_r;ZFbhpZ7FGN zDO2!(epT?QZXo?BN|Ia@ulO9Axy#SV>}wV5k3q^@LQ#1Tq_yBlA4lidn&I)hxMZKX zg=2Rpdr?v6d0uxc2vc3`?XShnipY_jB3yg6K3(9aKO0cnY<7__$86PD(RQ1F63u`Q za)$aOxD)*E;B<)|7c{qS$KHo@l7F&#Jb--QJF<j(XRv3uN1BqBvaEFYe9|@#gc^y3 z&#a>mc-5VlnXd}|$pi?ZgBM69vuE-I++2T%^Q&=qI0*1P$(V#-mOcH(g}SsLPVw;g zc&Q@O3Z&%4I<XkI1}U^x(F%EPs&_GUrr1UY)0+86K69`pS91s*zmI+y-@Qci%{1zG zLJ?d-=`U~C*g5&)MsN=)!QsZ;S9CEqs<EbJ>sDIT)XRaV@zmvpdc(>^fS_2KTNbgM zOEEBN_0Tf3Kyys)uP25k3@&-y)Jr&gCoeCxvANkXCUx^H{Ge=4sRz4PJkfO$%zeO5 z-ZmR9w0A6AHEsx>NrlgJId3EJX{M_0YG{E(@72XA8wn-<{I;hU$g#58qvwa|{`hrX zc$^X1jG7lcj5jLx$jDoqO}Xf5ALK{(N>8q-os9Su3ms29dE?0Kt`6ZX8Go?n_kola zQzR4eN-jH};K|@EuJ7$vKQt&Uxtjg(Jbq8jYs}#T?&E{-)0~+F`S)F9xlA)rc_)vf z+XG-jfyWvfRDX?~K?lT<@vv9BBWi@*s-X76;W5Gv5i#Qgw%PsBr$z#PCgqrq(oqx+ z*%c>cgorES^a%3)?@TfscTP4sL2qb6O7Q0LC%#$8Wj7M~D#|NeC=8EOzPj>(?D`Ey z?q&ZplQ^<HOMBhAQf)SIJ!=bXOz%Y6X%xe#Qf584P#K(z3y|fI64TQhA--nv#=p63 z5~f9xb2oZpFuV{?lJ$?FB~Ek<_Vx=woKNa`;viSdMxj1FzVhq@)l_TQ=QL58YHVK| z%b}E^{ymYyX^UAe4FJ$7k<lhJ^=vvg6JP`2S>N0)h?_H{9zFT%fnG*FJLBwRQe>^| zAW<Q@$;jqrj9EqDl&RG=3RhJUgg0U?$<3<K36jH##&g-3pcG!*RpXnkmeG0#+qam{ zZ&zDkWYI_l1?1+AkF7-=P&Qj@pHvqo)YW!5d8q`n>Z^iV*(3@MsLlRla)l4@K`8p% zm0y2>&fhFX_5?JXq;dOJ<{Mr-XO7CGy@DkE79{LPpCJA*es?upV&)<bppMItMJC1i zuFsd5muewPb(`iYo}kRucHFtw0BJDgdlFLa+qgSMR6(L7M*#BA+i?+et~)!LSf=$e zG(Khc9pTSZg4$*Wnbtqdzv>CQDgQ{}Z=2HAL?|BqOMK#dhXGdeBnro)SazCGrWz0^ zTeqC2y>7_O79_h(OhA-k*<;RTd4PVJOqag5O6r5D_5c8e1)&O>XJtFUGd8;7A7n_H z!#Z0v7H2z{Tv);I@F9;Ymj|#F!K5UgVszg3uJPRTK0RZT^da(=%bE+X{`<CgSIgFO z4L#U1GP-Co(2$EsD=D)sFFR>rZMsJ=_-)0{pO5B-Z1yT4Q**#4W6|=oUb29_Z4RHk zJoeu!i2{-H($WN8qG%}yP5UZ`NpxQ$u+<zudOURj-h*R9ZdQOpt^kWk<XkpeBWcDV zeMT7m7vuhu5~0n5MZOOU0<X(5D!VAle=JJ$S#oE)an2%O86pBQp0$?43vQ&VKN@k` zL*EHCrWf?uWfJZ<G439)Oaaj`k~SM=2ZUZ_&xOXQf}O4tqw8Br9tu7Oy%9b<;jSGF z`+fdF1t0=g=JOX6f5%h+Z&~ppNt=jl768^D_3d#;jqa=Zg4q|sGe*oOWifbgfo?mY zM+_k1v8c9<cB=747~4IepNnHbWfCI?L#J688<$p!-~rLncv5_b;xf1}iUK(o{CJ}d z`S^v^;7f?JBM#MJcK{KgPbdHL>0ZEEb}Y`mrgJfzEk7P1|ND;g+^}JycHzZSAA*Jz zZ461x*R2*LmEy`2z!lm^aP?ilKuFy;D082nVn^z95=P0aE$NDf{4)ED8as>9uMqgZ z$hOq~e0dJU6c5v+c7Eme@k*UdfY5o|c)(`j6ZG6<Vdhcqf(`)oF}d%)LGElrM@9NS z1oeNmsE`hX`;jKD5adM~byz>><5|*rgn3RAD4>S~qxd8@cWbqu;sy7RJ(VXw=3u@B z_nSEF{k%x(Du6q>auwj=o6+8yDvYJaH?2DNntV?j(-dc2eTNJ>dhi0F)X>0WrYuiD zSttWqHa}c5u$N*-mzxcy!7eT4FLo*`MQy`)D_=dJTs2r)Lp7Mml4Mu^ZV^ka#Q|_& zWn~v8`VRZQO-;6gkSR+@n_mJN-}`P<#)MM~Zn&VSh7UStp`>Hv4eeC{!|vbjT5{U% z>J}5hHITNA6QiFr%`e#(y}x`Yf*ClM^IgUb!oRNI_n%eDV!m-i<276Br*}?H=N(Ut zt#O~}BEims)`kW#yM^y%2??B9^ONTu=4AEKJhVoQO&-=wN16=02nv!RIf#fDn>=Tt zy2%#sC8Gc<V<5BL(E)@rlGa+ZpS|u;cd^^`%WZE{Cm?RdEkABVUeyw*kI!NJpR@RH z79kW&?Dp-NHXD?v5D4^uvA4a6d3BxEvIy@iC>84uWeT#MC6#JTiXdir;~M<Hx<*SY zJ?2eOjn&dCsRNiFOYaIJA@Ompti{W0o9`He`Dm6X`F~ifFJ7zuJGio@CVQ{lp&~05 zNCK|{r*rjwpz%}0b|-}%lHS=y2HfWUcP9$Aqg|(@a&y>55#a3QouJ}tpP2mZwX&T1 zBs61{iy|-op8&s~$Q-XH##aie!?j$21o&h#^f$aS6NoDcjVXdDCZ3=_E6{B2^&Gf& z9;_jwnaYN0wE^^mQ?W4bm#yiHPf&U5>3l-|Eo;BDS{WMR2L{nmXZ$2kqpR}1bEDe! zu*zEK__{MqkbS2EF^h&vaK7pfopmWq?BPeRhT|OT)m|^ClN(^B!B|$x*CNOqh&0HU z5b<H*6_b}#UbY6H3rWNJSEgPCKD7PULQDV)fgMWPkpGK?)Pl-FaxGqZD;<}qf|;ma z9@UqnjlFl~J2ow!IG<1mx%Ar(f=sac+jN=6j9&SQ0e$ugD6}Up9YnC1E1QN!#|^_f z^JOSRQY5X00OnSH(IUt<zl1FOZJinz;MpD**X(KtRi-s^o9F&+8^OLjl-a)J?_gM& z+H<c{%E5xf@d>PH&Lsc=EGhWO1Zz12{>;7k3CK%*ofBd_+PjkKY<12SBiYpUdlA(^ zM`FT{MDi_gK&If+8AdL(Iy8ZuPzV%IQW}NsXxRq?-yz5u!1I%d{bD<NlI9Zb^_9u} zu%kVqr~7}05A@C8{9y8Q5ISs?CC0B#N=B6s4!8_kTP@g=>*&&BHQ)rlqBicS&&iDC z%_?6=X9InrIE6pfLges4&$A6|3Z-#A-81k9R5xsPr&h8`9i)y;OWz^vux@@2vb30% z0MaQA7)J@)vAC}R2qhk}X8AA10j9l7x39!R;i2efrk2WSX=WMOpvfg@i6WNv%afH2 zxN%E7yTNeM@9k5?uty#~m{t|315?P!do3{{02a811jHLJ_k^@r(c-H;p(y)1&n6~c zBwL#f9>703RaGN?Kh{n;sI95)tIwUk<2jJlW|9h3y%o=wW}aes{F?U_lkyf{AMfpx zGWFnAv%M|dn2J1B&^hl=zGVWFuh;f1<XAszi3vpuIIXGo645E&2vFXnz9*-RHW9=& z#R^@&?rC=N_F<Eo+u<-AVCDc2NTzMSrDyyNpJO$6!CtClle@T-s+?$MJOO}w{{>U= zK>Q$+vG*u^?qjBGfQj6Mjjfz@lj<g=VEyd_H@k~nuj51Mh)L?!b1=8tZ<=7SXAHfT zzt)f@JzN02*duIIRA3~7np?=`uI~xl*D^0k-D`F~z~uLp3R+Le;|0%91IMDe-3aCb zp&G$gg=avpA>p3h{(l@#b_8f4p9Kg`1u}a0-cJA$g7U7vuULjNsoKHpZC!C4OF~`7 znYJtfrbhEmAE7mA%E{8_p7CdxKUoNHW9B6dkve0d8hv)P<OQOC+z^rJ6u!3~qYloD z<KB>$&oq551w@)JK$=a1AF$;La%T2>DMa@VXr)A32iM&l#&)6b?Qp1IZah&!0`Iwb zkA`l*D`i+_q!~bmO0s0lwTRQ7jsuHQK#4%CfxwY-=FLZ0O9F8rn`|O@Xf2*3he99C zak^nf?A=Hmbj#By(B#qdZ|5jh1PsKNv4QOGrvV&}tS}kD)z6IfV0(OTB;tOI*<HD) zBhws(fQl}_WybHnal9lU=lt2Kj?$KU#KZaG0!@z7nfc+cS<k#=J}YK?g5vv>HiAV% zP4|wOzWhMdk^hitHTQiLYrYBau}Otcz;^*N&{hN1;OZppMx!Ni+?V?$=Wm7qU}d!I zel{^z1{R>0l4I2R12moL_Q(L_0)(`!)}w8j60H|pe&_Y!P?IXpnha%kAODyf>O>iX zwV&Le19|Wd3G%8uFOZ&80EegaGeK;%tn#Jz{9NpcdA0B_d6c$lkbkLNV5_HaFr-4N zlC&;a)Sd8qVe~(2RGMu_KyqP<7)`K2O^<YG+TYUc>~iKKfE#_@_-zw(1YcO?EQ;wj zq}*lQl2@hA7hj)jo%Uan(;(SHvTJtQRXY$7(q{XoZ#xA(*;gliJXgB}vVs1?KMBJJ zz$9>3HJ1N_df<TqxrXljaW*vrXTR&6Aog=9aEH6={>>ofPhVcAbxvyD0N(THy?CA@ z=%m7#%%OJbUe=7Bc%JMEP^s)yg2g8x<Ljtf0rSp|2VU-<)~XY>x&~ZSz^(dG=loT( z_T@Qqw*ezWKL+xBW`7%@%MbsJ^Z)r3Vi`2wp4!!hw!#vlnO?bYRv53Annc{u$`a7i z%0hKn8%_&KZeg?A_$CkHnm7;KY)|^8B`inc-8!5EJjE380p8jyiz+OPJA|5>e~p>J zxL4EBN#skLeaV*rF2J81RW1q#cK)~wFBk%so{5WoU>TYv^Rn^sH~(4zULggFaLW18 z&e@k)X=l+e;ATXm)fVytfixk^Lr^P#ceEt<5_?Cro#f7T@5e;Hu^mi}3b!1&>1GN4 z&YSFZc`Vx`PYJK~yu2*F;5pyhy$e)|ssscEZL#~jCACNN13Z^6W?MElJ$qx9ZA$<X z4%$?OER%1ms)yG7bveN509AzhwGS=?2;8_hf@WHGg;D!EgcLeH15ewF)?U`!WYsA6 zO+1jkqEYsUvFLWL2JABwO$mi~q8s209-Kq$UvkVh_qE2baNytP=OOXyMGjA}xr)Ct zDKyVzfyp<0#WSp}$(WV<9}BqLxDwg--Cts`OodVBx)+87^4@df+V+{|+o%<8JasLA ze0Wy}(R!+9NIt1SpZ?s=DOdxThoeO0XLA6P%!4(mPxO!HpM@2^K$QLXA?Y+68v+Wz zx;bvTZJRyEuTJp(s0h$xG#6kaS-!?XwEtow*&Kvap}Ef$z$LMlg<F7m9IuEJ-?%J} zIFcTWi-k+JMn@2j)wNLzx18J(?mzi3Tk`NcX%cQ0@cKa~5a8rNjz8KD5q{r*1n3cm zLWl}Sj1fdF>e%$l@6ex^xUs=xcDW2-+>VgAxdlg}QyBn|5P4aC#lK~@cmNA|85acf zMM}^{Ww?3%pZm6!wY9CuNC4S@v>`cEe)@1CHrlVCP3k7LyMOY))pkx4>X4|IX|#UH z)rq~cg1A^@-@(|wLudoN9M+pHzIPjzmL0a}6T*QUZ`1;6NCqTQ;7e9mP+$;fM%>&h zy0<~!oD+cE9R}3fe{&%;>m?1*!OLX99;|WWIlsKVSMLFoUJhd6JXI9$MQ}cq*er<S za1y00!`w4^qA;az^wXvq4)JXA4OO`;sv~75unFTCEppJ(0P3E)3jL;QK^~a-(`i;Z z50@>$Oa4bR_wQeiOj_jF{#yUaoa_3v*q|@|BwgaH_~8&`S^ivm9$6(F3c}QPVVn5J zlr(`9x&Y^{(U)x2v;dfYB^pS!A%5`A1R+w=xFd4<XU5OIz5U!5=L}JD4GebZ9Z0Hq zl5dYWel-~%0i;UHkC~Ai!Cp9D*ulTrLMnl8cqft#T3a;O6ee<XT>g&x*+hY~-U0;p zrkan#Iwy6#Iuw#L#AF&nKYo0c5Pi4O$r&mvBfo0J(H*mK@lChEh#fBZ06^4~FB6B+ z(brry+jas{eAio?_HPupURUGSU}R#egVDV&8@*pCy1iUiwSl00;GDv@Ixh1}R;_r} zH(fTH8-&ZvJwzBW5W?65N0y9eX10BgTaKp=)+F3qC0pwnd43gtI*nWHw{SPUxj}Vf z;piw$@Zkz(xqYv{6&Ls9czfc*O~APTRDwzyVBh@%jet014|>4;Xab<OfUlHzZf(>- z(1rAeWj|2nNbuThS*EFBo-agbgL8=iqj3{L<n7PwXn`eCoai<Rzt}sb=k|rlrs=)_ zsy(%#`^-|*G}DJerx2f}X6Q}Rp&wsjAs;-t4q5F|ZDSyduPb>2)j?~mJG<=KPqPI< zmERv@f$HPfnw&Ns69ePcu4A05+o1<kxj<&HdK&nC+%zaBxEe>Dtx2#t*YKLUkM$bA zkL~PHakJ1QYfw-O38nYx)Rht&H-Mpic|G<IHv*zL|ByUTVhy<@B9jUsdKN}0ZoFr@ z_{S4xo6ILgwc87Cb7&0X&wd^`YiZTUxV?;Z=rKP)eGqB&Wu$T#mP0)Z<7{+aI1x?i z{Wv(;l%S=-`ci$JTYgQI*3bC#dHm-%h!SE@Jz}Hn*K>F%*$p6r^%7n*B5SS1YX;}8 zM;LP}*T%w&imLQ+v*{^1IrdUTb5ep&GPh>r%amY4@ta{Dbyk+$%TZ|-xM7v{eQGQe z@8t7^%u<!qL0VgrbJk8=YU*93Cd?)-GCDe8;LdD!sz=&A(Mg=)!xmr9M0}jD(rn#_ z*R_V0vqvUX-rdh}_6GOO=GVx#OVp!1+5TP!2!ayZ*asv>pD|HpvXDH^ydXMT{=x_l z0!M=57e<d0_0?>Lj5F<h8VQPo8>8y_eYn0vJsPZ~Q~J!MVMtJP@r!m-auaeO?r3*J zback0T#ZSj-5sa+f3#9v`rIn_46~BQzjD~pHsSQ1Iy#N}3ow<Nw$a8x@@$q3|6PM7 zBQ-}ylwpKaPUH)n8}>N_0m4dsvvdqu1=PXxRF}z82<m$!JHEGDEiF()$~p4~QkFPP zst{{x8Xw=HS1k*bm3wxmOezb(+nMlekb~n-pYne0S5}et!rm!~(tKiYoEh8lDmCRH z)71Q^rnR~Tf~Cg9T2J(eW||SezT0s}*Mf0(yTi4X$6h3_YsN^q#u)pYyxW87<#*4H zN_!3?XYz8J&lZ<Pnhms)-3-6y_s=eyc}d<2k2~Sfkz*nK2LlHHoSS`!|7$F1+s)_s zvU<5~sx+TVJxrXcQqTRNK*a|;*G}V$+j*tB-2c<9g9^dO%E;Z5G^i!o<$PP>UV9SC zb@0C1`*fOdUH+I2j$I(-8!(F8cC{Z7&>XINH2?NW#m!qX<!O@cr!2{y{RYiOsxH#% zuC67tHVt!Aiey{;e$T$wj%rUix@<mf8<u-*aQ@-*<X}S3+_eI?na3{r2~&+(Y!ktH zN-oPJ4`mA}1&-TEUe7=VR>Vmu3;BYtlQR?!!vP<;5T?>1%-=9ejCFCq?h6@|9r08h zMnojUTs_ds(i-RmF>2>vPnDWh3PQv0&A$xTv8f%ve9qr>HF?crOHZ|U5T{$~&?d~I z+mre+_jhT64z!#iT(CnIj2XIn#R6-jWpNTQE_nW{$)gMyP0{i_T4&XZf|{J0u1L<S z8OQ6NEKLrw-@mW1x3{+vSrM2ZY%dxikE0po3dQyinkyhrxi$sjYVhXs&q?3^rxf_t za232sORUXSMkMrX2q4h;vg+5O_m0_X-WZx;j40YDx?Ty>&&}t*n`4Hwbgi756*$IS z+%e=Ap)pQ|*kbA>0<%9lE=!6F7qQ5d!*(-l7DUr7h;6je)KdWRQ8du&WK>rGwCCzf zHY_8N@K!O6J<dRmj>@tOtdqe>9>Mu}$ou(CZ71)SRnLakPk+vU(?>Ug5=^M}254AC z&cC&hgoTRV7*a5#kOoK+&}+A4VA^q!sCnc2A@$ri4QreRk`jaCc-ezDJzAM1pUtGd zxlljaO0<SJ=wv<USZOV%O^_KY$~B&@dZ#s?AtvU!5NE0RbYf}w$K!3XPu3IZ4S<bf zU{WtQVBU$%r!Z^5l@5q|Ssqy+wWHyFxs+lf!Gu<3fcCF+zc336iyrg~I^|b6`vTXa z7&^Ps4a}ase3{*hhC(c7KC0XAkc^=-T0DBf=yyaQ|AMdnn%VLiZ_R-cGr4ae=}*b| zy26bvJw~I8Q-Q<UEze}q;tCD6nqDX8dld;3THMkR2QyQddlmJ8md@;1MK=}&N)YM& zP=ZF!kK=ME5x$HIO16h38t-6kmgiM*E9|(E$;`uin}ZfC@pe`1m9=K>qz+Uv-<}Oz zd|8}JeEWJq;|%d`8{EvDd+D;bV3U_mIjImx0Td>E3a7n4T+6L<>gyZ3f@bF`s^aDA zFX{=+5brwHElck)J+n?znN3{QUhV$=cH)DpbNG>(j?7ex5#id!qeK@390dD(i5YW9 z`K*@zxeEZ34(u&+^J&~Q#vvo8^T{iM-~~Yw`_Y+(xQcVb!ojv`<Ac?~bA_50Fm<WZ z2>*j_QU0~skb+EaS^kD~MuQsfcXRH&xG)d@oFNAIP%A=#;a{M{nR4CCYI8sO?gJ)K zF7>kSEv%<Oyo1vMex%Vo_8+VzOiEN=oomv7Hk+1+ins=v#OK|%>MAVEUgc}uCTbO+ zymR|YI82U6$ZMl-Nq|3Tuob?gxq~7EAotn1BV58`wCZd$E_PlmFOzwlt%b;R!~JoW zJ>7FzUmPwM#Ch#{vo0cG1V94<6xHz1lIQA-LubCUdZLM)>JA2b=+Sr-I`4M?{QGw_ zkA@U{&1Q@9Mro}1jd}gX>?_A9@SXcQyB^x__zenxfV-UAoW6jzOmTzScfDHg)!E&J z;?63!rW%X}S`dbGE$`e~X&k8`!|rQ&i4{$r>5|?Tj#ZxX91UB=M#_;V5&yzif@Cv@ zg-EXH*@H#ngY7om9O)09)z*1h*3EO{K^;yf6C1`hQUzwB5_P}FMpwm*+3Ze^7rKaC zQ2#f_98f*A0CG%EobQf&?hZ8)v3or-XzU(|&k|Lqi>24z#bFe6=RI+L2=9q3$Qru% z$chNxneM$F(mGiUEd3OyOXgV(m-W>tt3D1K_`?4CfhlrC%1A-2uj+ca9cCK2zosb* zfxM?LH6GL5cDhQUr(FHkJG^Hqaxn1=YstZuSD2~iI1OF*ayTlfJzUEI7Lph3JM(@g zB;*N~3H)?r5|$_mKOb^w-5O99kmR?HV!8{zK&MF_uRpX@ul#2v>azBcK?d|lc~Z^+ zO~vGq)O@D&w`YMW@J(9}$l*ZD&V35bYaZz`8lTze0Hv`@U-SjZoU5upgI~zL`;nml zIHg6-Y;qQOyI+(ESfd-dq{tO*x4QoPlH6F<?!R~L>?YmP_cOZ>P#;g@8=or8o|sC( zUHYzrS~-R!xSy*AFy)3LW?Bno0WPzQ3^<i4+o^+1t@bZ>mzyxIVOCbUZ<EoAMNdD@ z&L;%S!|?bR7a)i>twVEuh=_OuBddj24+h>2aOzGF(8@~VUCVH59QD~oBrL2c`(j_* z7OaOhpB`xkZ0`)O8Q%?$i+MD@J)Ilre>9AwqNHRg$nt2|l6lj$(JXMsdntjuby?Bq zUp&i<^1WtmOYIBzm6~C=9d*43{hSRCZ(X--nhdpl<@~z)yB=PAj+D_8LlV+Qt%1mu zS!nFnkdLJE;XSSFZ_d{}_s(+JjOkl^<*Jx`Q4*h5TnDm9Bg~DI&&w>Wo_(WzzV6ok zbZes6Yt$mPnTR$*KZFrO>f=^Q@O8_Tu{t!Ug7hg7;pXoo&OW!Tb{L^xlrzsCaFL!X zT~K^ZBt)CIdlrDT1&ECpFcv86>K{)3cwqGc1p9OeMKDZ?`c>ErcJ{%8;l?--Qolu2 zz22>c$mKc-=HcEz>`s6!yu5bKw^J_8n4=F?<q<wLPND4Bv|6mZ9ISLfRXxoMt}qoa zf;iDdcCgMjdBpK&NIa{=zQQglqq=HtXKfw^99}dp0Nl~DhT)$%GFk`UvBjD1Oj@Ei zqlSe41Z87rmSl;FZ}J)}u5)S`+f=zdhB%%Xh{yCN%0%y!)}6Ysp{Um<ADWs?Hrd8s zRU=nX>jpUW@6y5PXmA<QhO7Db_+$3!9p!uLqY}ksk?-_cx$Eje?_kKVM|U4MpUq!d z*g5MEJL?mQ)<Ja}?rjFf3xldZ*mXG0TZ(5IPt@Sjf+|sh0`ogYO{P{%d-IQ@^Kc0J zlRvjC=_0+jBn;RzONoo0V2<wkO7rD+7cJYw1sA4AC2zyRo+W3p_3C;|LytBq_t00$ zp&zFlL~eVnlvTNCjTd;j`n>o@L+^KHT*&@gW^u>m3S-5Q&!&RU#*kpAi;mY$H1oaW zPIr&F)$wH-Ky%^S`9R{F=M&|mEJe%d(WBM_3tON{<=g6ikp?c0x0hNm<Pyh~kCaDP zo)l0WpOQr{74J|-wW^n1QMM8s-=R5P>wRrt*UW3JV-|_Lfxa5dKy`EFJbL?%>d6~G zJY=POX!(%BWApxGo!v(LMMBxEg@R_>(&sw_Kp9=K+A1%AAI*PCcYEf1-fQk2Un*zU zR4?cA65aj|3(`+qgDOd5HSRvx20f1!Gpm6KXp(8u>lONwqe$D4dY6y-Wx6NkM^C0( z1Crf0$4sfH7QbqR*KJC37}Q#Y`kx%e?6t?RgCFbp;yz$XBF)SATKqglPiqZpwPuT5 zOAo)NVG9n!k3Npv`pVx5t(oj#2De^#U+nI8o?wV1(TM$6IK?sUJv`>m9|1vdBL7`X z@LHHLYk?J`nWzUgc3cqm<}fO~sYr>rp~%HKN&&vAXxSCgb?w~m7s-XxNESHISUA7( zV8hqn-D(5#g9mla2i%rELV+u~NK4JUn?^Noe>-2FwwWz>AMVMh=TWdemewKe|7A(U z<oem&CRl)m%qr$ZAoF<Zjk68h*F#PhB!5GTiIJlo+!S7^WjfoMd+@Ettkw@cQ5Ur& zJ=0P<iNGzNqB!|(KJ4jK>+4~pfTm}RV06XCxdX5zgRlwfl!?7Qat26*!OACw$$|0x zzPkmcHr{4@oxJ@I$w)~p2bw#4GmHB5=ZnlGZc964XIh^h^fK?QgEJ?ST}7H-NZmhZ z0On+8oj+Oir}nJ&&wh1VJ90f*kEOb06ANfh<Esbhxyo)D^=v~-ITfS7_Qb7#kue%2 zr~MFU7kVM|U<o`gX*yG9%MN6XJxJ#k0U6v`fvG9>iqlbghv0rV#Ua{nX%)O2=W;WB zAUSX}d7>iHe7jcNf0X_XXR!?E*-VQ%c$6VyQam3gJA~Cp#tqMWN1mP&eLP}BF5=oS z6e#AvK=eLP;5<89*$>AHffF5Hp5Fia@e$1I?c3GiYWQoHt6xSpx57*-_gjg5lSvd4 z)G&%wV1D&!UhiTTkS7NFQhVDEw#rrKy6y|NJcp7qnk85C#tB&GACF_&la6Dna;B%F zrR{PnYF|u^*V^WG*1lNIGlJltJ<+#gHp9<a+ffoTq9M=#7`p?E3*%{{hvgGM?L3bw zy3mGSyAdy5lgwbmDZX>DC^Kt0Q*N?+gWG&W#Oyq9M6e>B5SB;LQlqv}*;J87yEC9y z(+q~1j?^j>by|AO2j;$gOMvvruRC*vOV6*wQ<#qK_j$oD=3c1xKCG@%o=CZnw@ft5 zEIM4+-1U0DJyq48mniq-38T;IoR9KBUZ(QkIHW?F&U+BI1f)jrpBrM9R+ha%-`6%R zA@hQ!JN4UF3-)IoZ<wjnI83VqUaV+wadXGPt_+MQdN*n75=MQ=wdf9EKB#S$z}$MJ z-ND(TcE;YtNw3QGFOiL)SRRpHc(kWqy%6o!->VWwgh_h46#avHOLF#g!pHZ|+~*cP z;K(ej6b=b#q8X}}4nfHoa3!GCKbDuFd_GeFbPZE8*IWna$Q+~w;(w4ac?r!oTSgNE zctDrxizVJAtKBdv7-fWzU>9Uwn_{XjLFP;q@#8IlPyXp{-h=aJ(!5^f21bta{&{-p zVr)C!`3FPTs6AZpm2pq7({c;QBjYlN?O?(N31Oi`hl%y(GU+q5j_jhQ;CBwNDii+3 z0|gVOnKUhnsUiHmjWu{LmfVOjwfg)sX9IAPMYsG~mzKI@cFc}6vbp5WT9oIxp|}>k z5OMN8Kcm2`*S*_1IoJLfv;erSpjl_6=Rwsrv<<hq+h?Y?9BN%+b>Oyl-czF|cOVUc zYZO&t0v#@WYB;J}z|0ZQ#QX~AF(f=BZQ(C~CMFbUVm1gcO{ICphNMZm3Q4hWsy;E5 zl<sI)ddlv#hr-E4v@7R_Ogi0=#L+*vGpF6%<Z>GX6By!SebOp!nVp+c^zNOY`;PzR zV`-x#bzX;rFhUyKH(aMbrECE7GB}lrWw4aXVCfWVj4-KVFq{gwXn}Nj$((UhNMTC@ z?FLE(4vV^o$Qjsf-!7M_`4x4CZRQ8s?`SJ|c+J${$dmsREO4sxqrLs$4->NSKO1HL zsNo6+8)TFxJ=@>K+k^X^ClDGmmCQvgkQ;UH^Qn8ytreEZ4$SRUE`83xat#5B7@&u` zLAgYrp>HuNhcejr6iYl^e0=^@Op}p*!^U?g857}SKYm5rs8cKN&0J*k>DA>siJyu( z75yaCzJ&&5k?=}6z6IJ8;=UfIo5F&pZ^kcVt+eBR?HQt$dig90Q^4ve4+nR}w^%fc zE=vRg+oQpl5&@jvz%5}Fv-dcA;ewXBGPA>i^IE^GC8z_Eu=89%y1cUQbl*OJdq1!s zo#*7_#8O@2D2@GR@0NktA9)ROZ~vuj3}|Smz3;y&G^U&%9zM_!BU&+2dU&TZao&dw zkf{J&TbC0+CY4ejS(JQ-<<Oh+-cMF7&X`Z5;p~m~B{5i6A5`Qa|4OU2hC3|x^>#pP zZg>7XSP302DiO`or1hqM_O<%fTK!y&R}=x%Ot88r_Y>e58i)@7*o>_9GfEl7Ch;%n zov%D9-x?soopuK)3`h4uXCP)wvt1uau2agui;!IXy?b%iN#lhn0a@3Z!KWwYN)F>s z6r!0pi6}UfpFWi{s64h7d&6R&CgGNDRN1lLn*8~*&2(KrvaxRmAAb&{E)b&*hYCE{ zBwEPtzv${%;;3&)hGe1hMQb2N!_t4PkX(968#7^JxNxj(S?42<?L4{OmHjbtHA@<? zddd8>xjSHg(wPx^(Um)~w-qP4zLZMk$@`aef+*k*o|U)Mq(!zV!W|NTsIsZK!$Wwq zD)kkC#iXY)01W1}f$7N#sPsxj!k1x;*u0j+A9tqiC%qf(I2#0AHm?u@pq4MJE7ieQ z(i``;lFIhJ@AQC^K01$UGHtn^#Q^`gS*8EG((Xr_2jYy!6+xma=74cr1grwqk(yY2 zPeavhxK^*bhCg@kk&da)E{Q?C%{!I)!$64d_6$c)47`<-BVLJlqs70&PAtLyDJfax z*MQTB5r~%;2{G|dD0(6H*K;eYq**@~;1;64`v`y*&UDAl`?0RR77PVe(#>Acech$U z2O|aYHAw|V31^r`1q?}IpR*c_2;n7`_JMXOnx4qqHjkyo?obGY>jpMmz6od??%xxw z=vqk^pr$rG`#9AY?P+H>G<iY0zdEgEnaMaM9uxPYaxkl=*avA`$@`f<U(QI)FeaY( zxVVi>s;O6OcUP?+>enxxl9;}AS)fR9aoN+XU{ceuW)i=LDLdSrW=|LY8LUnM)O*gB z_BPu5da);Qad8}Sib*QWZm9X2mWxq(z(7SaXGP1&xzb@xQ9tm~5SbB(x>vGqM@NUC z-wvzKdaU(59*NEsNy5K1DgXR<94A|y9k%B(8_7Oq;bM0*7OK306dEk>x-(lCsbc3F zF)F3ziB4>Uh%8FXr+QV{rSH2154YdElw7hu>e?C`<(t(4G)kxC?gg%9kM2i1ah!;P z?^4~`9Gh!1%evWXW+tAPvDG%?oKBsAYwIq4lu=!J_Jn!&&ZqcQ?E!pHEB_FykaplL z*NC^N8DKTZ2A@d(M(c{s`KBsMvXr@ocrBb{nkv73v-Z*IuE8=v`{T094Uw!>CxVTC z&yCvK8LKQi*cz5+UTE>{zdGGuukJB7!?UxXswLu0NF4RI9@pi^&7!vTuDZRa`#1Po z%+hQ1q*YA>z$LXU^Ns=IhVy#A+>`H;8`W$3>>>nhnMa=edg}E?tbk^DwhU{7qR^VS zomucLkl20uR>{O66IYp$g1E<{ha~{_r{mq19CB@Ze1~bOF@yaboz%(*XunSWwZT#4 z=Q!QQbRNEMoJVxX?2?X&KpWfGC3{3^(d!s{fjU#VM?LAD5qs=!7KDKI3B2etpiDGD z%;oP2)`lZlI!+Wdms`HhS4sBcn0>D~j6Ew?cVI6NiS~H)xyGsG%oY7fS&Z<U58-_B z8M>CDgL5jy1bgY=x8QuiesaLe0=NIBAHUp$W`mdM^f>_)X*Xt?$OJ7scJ5AVz0r34 zb3g*n`Hx8Oni>)+-u6@`Yl5oG7G@!D&~l0j?XZW^3yGFC6`%{HXHFp>x5L)B4#2_d zg_KeUOe4?~Wou@zOQru2&MMi}S>W6CdgF)zAyd<bEbK~se!5Dsn@+JmjAOI^;EJ|o zuS*K}`bcE>8z7d-e{b2bh86RRG<|)?Gk$7@ez2JGQ=KA+PUYr4HYE)6g%ZH``bJA- zpRd*XGqZWPsg!s&a9)A3rds*3z9W^>1LfD=pARCVlSCF4^2XC!rE7gk{F^($SH;9V zqC?|JKgDDubfVO#yie!Z^5p*273%380XeT^+#f1Hc>t5xBWBK5*Q-TD+f#9Mp|(!9 zp4J~i5-rjkDH3OF1V6Q4>me8TI^;}{*$gf;7XRhb^Qz2kRN8<?pm{q`y9NT9@=fP? zXU=p}>{WLVX{}!WTT0;l^#G}g?6s`p&+QOD<ERvMLb|H){K1aPi#eWXt-6b#0MXqO zO1$ty7E2d^xaaSb7&aaalQXP@U)ix1C_3nGpac#MkfqEbnMlb0MMDmVDXa*o#@}zx zE@FGXh4Jy6Jt3<;>Oyw&uq#Co%S?O9tBBJ0W0C-!S-YK~et8+HMK9{isss#zn9eHi zG!|tkcY;sc!lgTWDoIQHZF!;{`7WzxM&S!IPIV_)gjA1CX-J+;dyLrEat+nqfOp&_ zCr8?{wE({adgvm6)n+?}zG;92_=%M%Es=Uz?kuqF{it)S0>tM(CS8H1^>IGXsC1SV zjWOy^AZOBgapRx(T<8V5!XOmCpDWR0d!uZ{Vrji*-9>Gc|KveH3GW~bRT)p~X`ci1 zyqjjFRSZgq;4_ABheKt=+3@!AiK1e?yYFF`1t8%B|IxdW4xyWxy+&n^iu^g@lhD<z zP*5xjZ}zFv*9CLtXY@+$B++^rg{x{H!DcH*^p1|sj#17p>;tOrB9I_C;3j*AYAaVO zf8&NMt?KLSy_2Vy-o*rMGnB}7#Z~;hN;}zu93!AVIn-XPqU9r}rx0cT&tMabWvBd- z|9U5HV$+F^iZ6<9fvPl`OdBuYXX@o(gJqQAY!i2IjYvy_NPmOKe8X^(Q-8eIxDBde zROEI>eqRhBpv0V<JdAc;Y(96|i)C!M==Q049TlUd$aqV$O4lpiQ<HJ{=}#)&*L<IX z`r4`9csI4ydFg;`9ev##Q{5aJ-E#Q=GRsR=5NWwWr%=Ep*S1FRq|a)D`40OXdXa>B z#7h$0PC}8idvw%YG6n`!f>LsO;|~}>d4RkmkLqxV2k4@E4;)ba^QZucn>gLAvFrvW ze++TtLx<jpGwpx?)JaMc`JmQ%7Kp@!++x$5El=HR5*105l_>zfsOy)JFePuPs+E$@ zTAhP^NnV&&39oxEuj=Lm6CXrNzWYyL3I*&$Mp7R8_wMHJYH<(+$;S^n+3FrJp>M&j zO6ZC_egGzzwjX^fvtUSuFkg*{Yb|4VBG0X&`4rN;``r#u8by;$`I@lE&tPFMNIJ=S zw``GbjmCu5@~`xL(Fl8I@|z~e++aZ;#S?9mGpI}>)WTf<g*yZ{QV&gBo1DP3nyPv@ zk^FI6WM#IdAB%-?O&DMHcC!Gv#%XuIUQ@L0Id-jVZ+)K(SJ6H`%~oqwuk#LOh~~31 z0Oj`YVJ5NfQ9)bOxuXe}a<f1-S?N{Ln33FQN^ifP%T0;ia;H1hxhwyKD%k)^8>(C7 z>TZFr+&SBK0Ffpju9p&COe+f{HuenU^zk3jNFLxnv4^&nd)fJB_KE>tom%nd#&<~V zU<dHcccvpQ8J3g5fz!0+(Pf?qy_ATQbQ(BW0}>JTFQC5*n*LnGSdA=Xh{G2xRsV{t zJ$c6Lb6y1sr+gJD#sE4oSO8S*mJz9oz?jNZk+qUv4A4Hq@~L>C2+ZHSbe=GwXm#8+ zx$u@PVfxf+1{xPyTdkG3ZLE6Z&quYg0RvAGgAqyp5Vc<(Hv$7<W1~7O8UQAm1h<f> zb8^7e(M+FS+L#Q;(MY~Kp;O^`^3eme3~t`4jT}s=Pg8o2*dMgtJecx`;79e>!)R3e zbc=4lM>}fl8y0;2)7wRR0$L$w@Dm*eW-Srz8=rdrE$7~Rim3Wr4xI0cRm%3s3*7p3 zsbe+nu0JHzbHK!J!}JegVFeWSD<e5;re^%8fJzu35H`n02JsvqnjZ1?d<*euceeY9 zaVL4UKtXaX`2JHo{H)9EF6z`-`32~-Q-+$H+Zbk=vM9>_B}`w+S*=LN3dEq|b>Xwm zv%Z#27Kjg4(lwN|lfdb`j|a4tXDUrh#P^0L8CHt)k{W^eXa$!0DiL9-lt_gAyf$Se zFHVD^HIJp!@s8T1EDOdD7}~aaq3^6B!lWg0?qA!hfT+TN<-w!p%-aE07Dnw7%(XOt zz?H6u;d0BFL6cEP4hoobSKh;Fy6uUAM}z%KF-*p9=BTMVIX1sT%4QA1gh6}J5tiSD zDoc<1{_E7<@qkl{N|Dcm{9DflnBFJEhI6hX{V>;KL`$my9W+Jjngs_yxP~x<3R$Uz z>Ml%-7M`1ZtBys0%0`N7z9>C3o@~m9Vkp$vuS7bGMzwqPXVsh3&!U4OlInN=v@IA5 zU|ZzsIag=f63B($_m=%1rwmk9u-a?=p{&=;z)DA^DK6eo4qXxs-kDF}wClhXFZq%p znud_~?wei1r68bS@XetDP(7~zsFGPg1n(H`C+A6n2uy@Jk4jIdh!Oyl<uX?L_aT{- zqD0=eH7WQY&sUpskmt9DK>vm-sW<A&UDN}9dT9jh+rUTkPVWYkNH0n>ysv$)ta`R$ zpIb;7@D=mvyx+L-04%_pGzgyB(o}nV0-DGXUH=Zz54px;q#FP%1wW-5U}b=v5j4vK z&o|0^x?L061~lG$X#VB70H_z@2kR?;Zf(V|M~O4Q=5>ur!(k7jOJiRj%7|Q0dGEp7 zmq+%+8{IcE)F*l(oh#hA3bOr!7q3=ck~RHP6FcK+r}(yaqkxKO>@@OEg9>h>1;nCA z&Nk#f^eMm3UN-S^xN9@FC0y9S*1JMZe%cp}GsntY@=23mql#@lulcdbyel#n4RU}C zB3WfZ{#P}~?+KmMah=Dbadb#fF3}-kwi)XOfbO5D0hAaBV72TfiWTh%<Q@crz5fO# zV;|bkVPyx0EfPg|b2diFX{8}3;VNFgtYO<8e{Dp_!`WW9nEI>LB@>)Tq%TS)VI^0p z<kV_bJo?hcw3ZC0Rs1H4hhd`~&E`t;qDi!uKGjLk)wwwd0R=;{WSoJ~#`B;JrhmcE zpqw^+U>u7)%1@b1xp3iRI;F|t*TOiUotp<-q?L0BYTc~j<M8#T=yfl<vm7=tz{p+u z9|KY{ZjP7RqG}Yakqkd?ncBb(!kPTjt~-nVY2zAcK%A~EGQm{*e|)_KRFqx!J}jkx zw1G$}A|)U#jX_H&-3B2bAvM5|qM!oOAT1>l1Cm1xjDmDY3Ij7J4Z_gFklz`7o_Br! z_r>3GE!J4~+~@4N_TJaoM`_X=*Bkizm5zxU)a0Zo*FX-lRw_4vJ}4ig243_UI5IAs zy2=`4vqo*zF&*8X2Tj$;X7{ph*uU<O0@8|ebmUagmmU4EmqzLkZDsps2&pU)KFMjx z<xgrIw0IT>T1#`~IOZAH8w>8f%RIM$Bk|OeX{xeDQEqJ^6!Zb%B7pp^J}07A1_9Hs zweZI|dv62}0Yb9g-S^e^G=P-1Zj7vc34H$aoR9XI&az10d48Yn2vqc-r1LV&`@o0} z<7KX2&Fs5!j8+Fp)6btl>#?s*2+4k4-GbyVbYt|Fphw>BdBFYqX-uMDA6Wk!D$d?( z-1RQJ>+hfG?9rlO>fk)2{U!u+WxM$>L_mynH2;HC#?{$~M&|T9V9s<Oc>(B4j@jzj zWAK8`x#d?Gtc4Uys5|}d5C{;oxQT6*s^XW1cG0lsoYc??S!kpDPpG3)8Q}#~Cf83( zcOFehHs^lUFjz@c)9#6{2=@iW6FoEJ@WE5@pU~%LTPsBBzgM^=kphb92ZRIFpB>PH z11`2lm=Ep%5KQ;*ebUD)pYX1if*c+}=XKLU3o08Tsxm|mqam~<(ZNc_00C~$2mK&1 zZ3AIb)vD=1-g)k2xq@3*@3M!T1mYr}&;wRk3)%)Qp25|tv*HTs?=OOU{TcE<eq2u( zP~%1H&4Q12<NlZE94SB#P=ndy87hNG#h{QL<IrsK6k-~B1})GhA*@aSXlba{8{!q8 z`T#M%u@^I=*K>1*>`hbF*MbjH@a@L&WddMb`V9YG^dD6t(gvJbx%l;OJ^-C%)4sJi z&b15{D27H|03ei}{&h$RG>1pU60^6rDL`;6{y}|oVR!wW=7e8dlwRI0FA++_H5y?L z(pEFik4?$E@%XO!XvsbKVIfHwO_=p(_tK)>mOqPD)CVSBkTnM#0VyOJ&{x6$+<z6; z@xNwvf_Tg9!IP#0dq1p2zj#GyW^+qDCx8!O<=YoQAloC{XLh#6=BZ&~i2vr6viD*< zpwXSx(?kyYzhm=7rFe+eN825pEd6NL(~UY0V&8AY3kNc{9`wasBzDI5c~<=QiKc&$ zxxMOS*1Q&oVi6=wRF)4dY+~fQ@e25S!rGmJmV}lBX~!k{a-%`iPEgbCim&(mFy{F= z|4~pSn3}n2KK|+TkF+k+*?G<e&34oO7+jzXfJqRMxZ`#kP!bU5$*HdAe?ubxK%2Pf zn^bkrhQ)%Dsmd3k&x5-k^ewN-V96&k>ODuf?rBM94gDpb-gs6uCcqoh3l5ahc>^%` znBLrqMCY5{p;y=ihNzU4V#<GT?+w8IlzFy;Ap%D*Frv9C$8C2dXuS^V&?0)n79Z?< z@!r1dSAkRET>{oJk073q79YNiZ9X5Z6(O5!%z-QHgMME3BYbzH;xj!_f}4@X?1a4Z zX7~uy?iwDsBby7pL{SR3)R`0bQ9EL11?YQj&rr$D*Oyt2-2ok`Ad81<K*Att6|Mig z@;n=SE`Pg1K!^}Zu{V^_`H>NEpAXD3mW~jgjO33VmO~`QX-%x1M@?xPmK{$rZC~XO zR|B;U#*Glme|EhZoI7>np30a3=PdDN3+IlBCcyRvqmWF|jv$zso>F0I_+lw_YLgyQ z=t@ISG#RqPJ?uk~?fSQZ5zx7*%JrWz{NPa1M|mRC5z(#5y6R`lO)1HqFdfc@yf8Z) z<{!vF_Yni4=++*70Qwidl7oyFo&d6DeiuxIy)ODVh0Pbs-z5fCi=!BqZh((_Jhn^> zIoO}0N!n~S1Bq9GAyRt&Vku3d+M8hJ3+V6lE4FewG^!{E0Idk$5wyz-5ZYXC8aU*; zPc#5dApK9#E=c;^tLvx0+1VN4iSeqb;J8YWsa1Pko+<(k#?n_$c5SbZbLQ2GJsH}y z@-xRCgqDHxq&j}YUo+_+u}a(orD}JmZf6#g&#J&MG2G)u5HM3yaJt4{E&xb409~JX z@RzS9DxrJA+^<U8prTYE@l?A&TpRe46tUr83DWhlFNcWaj=^@$E5*;MbvtQTdw|!A zcc2CHUA*WRo<<)ce&*gzQQnoi^}IXA@<Hr0r__3HkC<`IY?O3Wx))QcHR&(SF_4(S zIv1?fBe5r~^4?g38sPrc(Aur-eS<(;95`umap?lyDB_#XOaw(eV!gDF=a>xw4q#O& z2z1IuMsO=^!_A-Yrt9}N?RprkmH`sZ#F2}IIrHeUGhaf~eXS8&49c5rr!B9li=$n@ z+!d57iA|Ntsw5??PW3!{mNBd=8LrW=>m7E@q6TxX=WSsiYyuoZ0a0;Q&Rn~IVc>JO z&#EI@8bbgr0!U~FJcAvk^1ccj$aT<29szfQ9rJ=gKAbN8?kWJ@`o3Q?X*QXZn`*oG zjo3v3d#>-+5^t<Zhj$*_!*05B;3z>-!3>rN*9?!@b7JGjqqbYPUsC^EDh$_l+8Gwb zS|{33Xj0N^3bp(QV0W}8HERXZlz9zIgm~H@1l|UhaY>Fa9S6LPZXJyU011mH(h>=9 z_<!_Dk>cGIP`E8|9yjfB3fZ&QP3^r=W>Uf1I|^=VLZ|F?HW!+yTnO0OFu-eQIv);_ zG&MgG)~_WoC^TpDcFMdc-T>>zePm=j`EIkXPBmiZeC+6_&aty|CaW+_@1EHdaNEyl zIxfyxUb@6y9RJQx?(IeAa11HhZ_hn(aF9xE3}LA9UzBg5Fakxh?=wk`C5G+3p57IH zgW~9yVF?-ro>~!8BQ2*_LyD=bEl7@8%?TnL@iY549Ke_DWcGvbZwBCO22-eE=P6!? z2*8l$B2KjIGd{#NTw;UU%%xNL!B%n*DqP%f)h|uNT%}4mplXzoa4!Vsy*QJ*{!J1j zd-uG|-ro=bPymJylD07N>^0#CB9xK7g_q_2+6zRAC%VV0tVn<Tlv|%iWz6HwISB*9 zv_7PqGWhzak-R=QIM{00GC+0x$5|<lK`!a`$C2Zlh8F&r``CE9_3esC^LN+Ihu!tw zz9+TU6)iaTW{8+i6n$j&p?)U;lr8>8UVmg5)It7a$p`aZ8S1d)%j~#EDY|9XV{3E0 zW2CK>xg&(uKJ&v3_Dj*!!4nd;hy4hVsj#gw-ytHn$H{HAC}zPW!MybTFS$KA+_N3M z0V^)Nc}RUEx*kAk)ELvzrCW+)7IHfhC3~Y=kJRh66iuZcEIuwyqQ>%;K=s5v#(*|v z{ELlA5wN^a8YYebO!DPU!=i*WNi+<y7p9GlOP8x{)1PuqY&3*HGT-5+RQf-7Xq2Ls z*E>tft!FG9zCM*uJMu?N7k%Swwi0OvJc8+A88+9NgyXV8f|%cz5rfXuu!=AIw4Ie# z7-(*8P41Pj;DYjhygWPnMzOB>iT6VLz5e3(C7xyOBlsP8yi;uJa`j@Cpa?$wv)0ze zI?VOZ1Ji~kF$R&Zn(>o|JgCPkKU=2ePx3s1ox*%D=Lg}^2uCcyaIqs2Yk4{I()qlW z)pXaNlgL&AlW&D+S83Ak-<DGy)^GMgJi`5RWR|7_x^hmnG+(Fgm&9SR#!O}aMi2~F zcHJFK?2P8@aqt$?c$H|}=$kccR@&yx_%?A_CZ@w;MRyM^Z5^zAso&^-jS>jiUU72$ zU2zr+%W5aVCLp^sPXqAW1euD%<WP;ZKB>jMAl$sJsm#RB;#Ql^-^CtTsT*#09K7+b z?}7eV&nPeM5W|uuLes(ciKhNO$eV6+g6v#!pD*b22MtC07y!YSv?jkE$!PXS!6I}? zytJjBx#-;dLu=*Vq2t$?0K`^Ww4d5Znt1`qqa~uGMwcY?fu_Tpy1#$WCX-jf>DG)! zKf&%4@%UD@jLVk(j<WIX-Dipupev~yoe3o|OHQ?|Gi(j_CnKDnSe9m|9S2>=K}oHe zR}~~j`cENnp{;uz(%#s%i|v(!`p)aIGxI~0uYC_^@mfMVU4@;~!6gzm;`OH=?B`BQ zXUd$EGIzzp6gt4c!L*JWJeKco+%S8IKGW>eA@0O)n&A6Bawp-78HjcFpv3ig_Pw?8 zh#1LPLZcPOIuDro&qpz;u~$p`3y+fcrh5{b4Fsk^`kKHh1L*{lzn8M|U^rNJtfdJi z_c`CINQY}1hx=o8<}TSjzw4F9El2;{6IPbo$Za;(1=%m9n+*U15~?Tw5|&oHD)G3o zI^7uBo;&B^UcdWh=+w+uo&PfyL(jRU#NK!!M2fWF(c&CT1do6D_OU15RUH<T$(s;u zI)GNFg{a!P={mpIJu+S+RPP+L195uG#vAG${9sa=+o3#@mjfUV*|loGOBplxm6Qw? zMzK_g`2v2yn08u>KqzfqTRoYEMq#^dZ$p;$;|A*kUqCVyw6Ar8q*R5#CDhGQw(B<= zRu=F7@7dZv3)Krn2A=E&=nC=W?GdiG3^$RGQBZ=FlN8N=D!f<8^Xb=|!xg@tJ7Sw~ zx&6>Ci;B7qfeYdl@%4x9?EzE6P6^S*9Kk(%A3Ja`tmG#+6OWR8GaO;<e4A2tUEz`O zb<Hl*cel`VAJ0>IYY!2N2;Jibex|Z@B{m3G_EJGjPwz!+f4bbB^=6IXqV+M{S>tlo zgcmPfw7nW=?Z}+w6x^zK?qn|0F_O`k{e1KC0=jj}B81WVVWy<k=;X`0Vid=Qj}nF( zk_8CL2B-$;35P73fZnJj2KqRCEdV1{|LP0hY4@cI{Fd5vea|umH)WYzKXVhPjMol- z@V$Ob<1udY>jl=jY4|LlL&h_H+G5H6T@|BpeuS=4WnXg~v&83v`6+jQsF8VTr^SWF z>eH=;_=d}tQ__BVp15l@$(r{;DDw5|;X0q;d3uqx4~5p-<4Ufmw8(jD1wULvh4YAs z6JqL;n&6oy&ZD)r*+&odgfi4S6S}A8k^(w%PNj=ofzEZ$S?}}(#Y9K*28Tol7fqdh ziCzuaCgUFaQ#|;ugf&o-(hO6b2+C~Nkx#$ZV+Y_M_n~E+0d0g&K4gNjg$UWb)%>?9 zhou~9D_)!01a6PT0d~Q)W%W+0W5q&$>^7SROS!H`&}hQ9b=%3LN9V$Rbe}X%Y+D#M zW-v~D=#~Cu@to>Y`USE00L{icw%@c+RMp}#DP%*P$hnQcqQ{yxag$)nWVQEgW5Stb zlr45JC=th&yxsi9!~?#}%u7F=I@Z70rt+24@4T?U4UO2gEjjz?Y$v#4<Rm*^Fsmzv zIsZeg%G+Q$?&vMy&nmh4zB7C%!TLSR)(R1_6Q}}cI-Ii*<QqnQ#Aiwtd2#4*%(Etl zf+@Ey+U&=T;>Df=I879D$^5+`l#8DfaXZ<M^^Tr~^|glL5ODz_&ziz+OIO>JM#2-^ zh{X@meb$!a*L%1f9EwT6acxPUz)lYe^1sg!W6J`fGnX-bt(yH=-p|7kzF8IaLuPkB zoJd;lvQpF3NX*NC>f7#G&pthH7<IsS&DcpfPSYV|B_*|K*rcyfUwonAu9rhfM%J-1 zvA4Mgv#7gQT)k^4IO0HNjWtBIjyd2~hBTc=7R9-Ai}YrUL<>3(2dmgi4B?o@ovGg5 zlzY3q&e^@(;8cf#SHS9FpFhp&#^)^@#9w}WBRV5;-*<YBGlSMwejVS2CAoY?IgPXF zt+IM({q=|@>&{O`)(@>hWGg369k66%3?1R6e4fOmN>x~G-=oG?;tUp!%-EE<PCGR= zL_RtCZm;sd(dLZY&f$h?){oN?wB7x|*k=@`gz$Pm*d#uLf&zQt(OmZSgicChiCxmW zd-9%-3}zP~c6KN^nB_MgOTX<ZckHlQuc+kHaXy<^HHqT1!nvf|T5=6~Ew6Fn9io-e z6q-|;pBr<%XN4Mj67~+wMZV*jp@X51GfvlI>km%a4HxA<Mb~ReL!5+cBiVR^g3d3D zEs06(6-D<;m*$T9FL}65s}@`{wpbrAG?{R2I8X|qWzSI<=yx7#Wkaa6e5`C}YHHHc zabig6{!p@T048^KA|RSkEfJ5WgCiSbY}28djXf#;C+r=i)-)a5Q$HS(bEv(<jisRH z>xYGxQ*C}~9t?~rL4A)%RG@Ejv6AWBy|LI+Xxe?*Nd+Byg;P7SlN*7(B=WTX`GEh! zFMYq*NNXiDR$PLe5Wb>3<vuz*dv$3E+DaqDMBg*#yybWJ_QD0;$I23}?*dkbPI}J{ zSrfdFta~d5Q-EE&VqO6{Y)Ovsokw*gWy4;3NRd%f*scoepbC^WaulSTUlz}NT)@Ri za0W}fNyVu69^vQ(Hl&Rw&3Da>P4YIsPmJ{Uszc`ZP0)>&LJMQL!Bb^*PL20&-Fm(y zJKzM@IF2WpmdIQ4pzBG^5!y8OUN(<h?=?X3T$b_d3}p{kZWG1U<Am`Ck@&ZJgK$<L zqPfGhc(DlQpPQ*7<z?2$Nw=*sloOK>WZW|t9EVV3CMrJo`l1e&d2zygms-rd?L^Yy z@L4r&1-?8g1<VAO{5}7lw2m21#3GJOYEA^Xk_kEvDp_J=#u)64aJ|_wAX|r=&jCfu zPd|z0!tFVQ4(G&LU!G3H#!}#pW(lTV!E4(NI(V#b{9+!g%)gT!IB{|QPh6fAMG=jv z>jLy4LUHd(@A|OqYGtkC2o#u~#1k^&2^y{L?q)^<*nB8^1}B*1<X+DPxbQk7gps<- z{?2%_NjWba%hzH26!oZoXrOWCw$T5V0NR?zl(f|<`|X1u&dT)9VUZ~A41Z&J{4Y~& z!AzRtiys_1OT?G1h5;JNm=SJCJ|MaFCi_~NBY)A>HXe1l%JCdmqp#TTH`te3DVtJD zB&8<HZ_7GXjILcZ-a>g*PJbAE7UouhH}U+{;{rVRY2u*F`(nSYmeSPpEQc8<_+0~h zHZBf@PS7^<x(d=tQEq#D`U$Wqc~Kz3&h;k`aR)f`Wz4~9q3q^-`EI^cc|+Wb7dM#1 zo`!=XcL}hSZ--Nn6WodBJ`MgbPg;p%k?!w70VXGvKqI90jlJ#nK~RtfD-u2DU#_n? z*()R%JFCeo?L_Dz&n#t3^a?J1H0tU3z9HQaa3t4t&jCz}kUA(6Vrl&~SgiQ$E<d3= zqR_hfl4M=<YuSTZqlAD*pvuw<BCfZSk|yRXV4&jX2sFEYNtkR0y&LP5$paRs;gVh5 zqcKG9!tThMeGE*}l7Eb4*Pu|pr)JV*wA?m8Nf6gj>mg?yY?$?z62!jVduK0Qzh?OM z&=XYV2g!_QUX@)v<JRuUBDADeCqxvTYS(vO?V3YHrhgSSZclc^8Ybb_jO+$PI_}x+ z<}Fz*n(`A?5)mj@+6dCIGkZ)DNO!L~`7u=e0xjtCB!K+Bz?ah=)W}oTh1a{@C^WvY z_yJbqtZ<|N#SyV9eUo?DZ_nkXBS!@HL(fI=aqwhaK7Wmer#nPwes6b72Q#t~wj5~` zefiNTGBSF)o5>e)G=%z1c`|b>V~%>RK*qVC?OZiiAc>fUj6_sgQd-)<ilY-^&c^1$ zV4<n0&ldBw*0*U<A3v5cl-sAX$obszu@t>wdA`ch@M9XA?=-J*?NbkM6nOXx+Wj`P zkbe1CmJSj_y2~tw2sL!#tc*y<*mNd`g?dC{yD7N4%G5fQ-fMO97;olo;CeIs_Y&)O zSCY-PJLHz~RiryVp-gU^TZGI>x~{4ost9`&yr7Px$f;!E$d^-ASAHq|!Q<qLIgA98 za69GhhMKzoQf_7}B=z}eFJ0eoFPqOL*>%ueFlBsd>?H#W%e8LQ=I|V<#92FOXZUp4 zBkS;RpVen@Dq?~2_({Y_jtX2WCOutHTYjTp|GIOu>E3<vV{s#>J=p|h#+xi5;mJ#= zr}!Vg1mzlWYlC4nqd7HnUaog-YapN80(W7N!yT;|a|++3>{T7`a|ebuSnYNt1KJ&8 zDcKYu1>w|@lpkvlx^<BZ6f~kRNtY%T3WE)3hKx<Jc2>;^TwKlR{KHF%vgPw7+1jV- zAy4s|T4~ap6F$`a_ah^i1+rDBqSdh4fEaqWSGV^OX<fjcb%I{8*}a~OMh*xyD<^b& zrPob?@^1*K;j+#p9<x&jXINiXMLSbWCKRe2F~MWUwD7@N)%`p<O<7y2outM=ZDI(A zA(#A-Q_9MMqh=>cn5XY@fh{g7C9R|rP4dijzz?HVAdZzzHT`PvjKb=U0i6Rb`Vr!% z=f-Uts|yGOH`u3~yrjfSLu!H0j@QA|3THUdjW-zw^GMK2y;FNCs~;{g`&!0|{!bZ{ zu=_{|*~L)(!3`)byuiVSf&2cHhcmXu7Lq(0I}gTUd7n$duWT_`kv6g>KIRsDvzU3% z^i$4NLa<#}qeLZ<HkNr$BI=<s?b=2C&KonP5gfRQ$gbE3Q*G(o@*io$3q#4ThAzy? z!k!5YoIIJTkV%5Mxzs4x&Hc?7yz6K%><a}QJAZ0M$+9LAHBxLOkLsjO)4u-Z*vk0i z9PvcwaP(d{9+C3WP(p5?kwLp-FqYYR>+9_g_$w9+^WSQ!?)u>EDJW>_<K{nYkGwS+ z4cMt~=FU;Ky7OtUP+!YLEPq<(XTQC=eR8<>ETeJ5Nt^~>LutbB$Iz9vG>hySyI_G( z_&gFanXdo)k(24QR-a9NkiLpM*V8+)eRXo#!7zOLxK1!Z4cO?aYi{Yv4SMIkCm$H| zmus~A@YN}5Ld_N!PuJNeqZMWKo7k29YX6tSvA@Ql$}LCEFQ1OGnNCW7FP$bUT6P`^ z!iJa4DqN))Z@6=+L4eyc(f2W;nrvLx!uQ#ei^LXuU=WOk5LNfFZU9s|-k5M);n2Zt z8^|@73s`2L3+8s@6BFFLoDBEkS~j0$OSc_B;0b|&C*ax&P4AZQQ%Nb)%k2TR2wF0P z83)gu`$PNa3FYdiPjtEx87lVAP^gBx8HZ5OukfPDKo7DQP@N&Uz7;IDC3fatW{)11 zwUeLCR_u-{^YO<L%`hjkiC>b_@5Rb(44xnGWe_Ff(<e_fJt>ypFSn$&p*(v#u`tFI zk`|-XxSTk;0qMvWeZ7j$R8)2sVBOJj@C(L|a<yu#zR|uik7Js}=hzd07a=D*$02W^ zBZV1{41_ydNWx9Ksh1_rksZgwpySyhcH}HrV8gI>4vJNN&tS=eLWQK^BVrlN8pP*1 zLe;W6`Bmf9=^4&nyrR}_Amz<>({ovd)Ar}QK!93D<4FHf#Xt~tvr{H1{RuL^(PL6( zwIoAxL#_S_QqH6Od1XD>tH>G0X>BfYuf2hxX|uo77>Q`fH~9@Md$Hz174>$G4pWf? z#kIQq<r&x&dPSr$2kdL5^lI9@1(CV%B7sg!fa)jVu9}%ipWlBEBx`n>Zq?KA_FutE z0a=KieSWBPWCdx8bXOz_7Ama}<N8@F;|`c%cm9)wl-{WZF0p<oP6vLMfymlc2y(Ou zX!vhUo(2^Aw1MW5`xnYSmk4rmAKQmjEIl1}nri4K7R4_C@&2_?%DkmB$IE0V*ck=7 zA4$YaKW3W8{NjvcCKh6@JefJmx^v#)O{a(zm=@(g^z(7C<GyfcAY8#hKh*7Kh$r&F zx#N95<+VPJqUUV0^^iDxR99XRh4lQvMA9;u{7IS1I?1H{g%X27*oqH+ceQ0EfAUh8 z$QwT&?iT6h2E<RWMeJ^lQ;|}n^#^MOu3E=xCuqjeQ@Hc$nx1Mfy`v{A_hq|T*XP~F zIYt`b@jz1FLu^M~yNHDNz!G|xj7<}=QCFUPwW1iW9RIzQitj6cAOx4OCwjo(w_~Nv z6Np64xA=VADEK_<Mt@Y5aF71qSpc4gfi%9@yVB-?W20n2{oD^6CELh-Bjdt9+JE3? zuXanK@il$BeEs)o=y<^7_xgkV4pFP%49f>v|2_Nj_qPWzoF%6s@4JcJ<Ac+Ok-n?4 z8cuQqUoAR(=Z|9DL^AN?EBBd_HE<z+Mm@6=f3hqoy~;`#Fnj;91F+~TioRX1o3N5V zeeqngA=?|LyB2<rtNZV$Hc3W2^t^NaVUM$zk6(&_+JXV=X8JSxSYru0a*ilXj%+gz z*3GIa1h1*qu#J5TY01u==LVXhz1-)5?h7jV7P%vc$h{Jam%2y)<~)_I_VHyE(D*_G zbvrjNgx>F2df3C*ye#~CH&V&^9pJ-2^1J4#qGeUYJuE;Cklh==6bV_2dhiJ%Y`;sq zl*;ikQG9=aZ1;}&hfwJf_VbQDgC1+G?vtj7GN27;V!Q5Lg23ZXet0RccQhE}+<92} zk7*oU0}eN%r1+T=)#&6L<GX?5ICYB1FtU}R@3#i`(f5KfKfv}!=NII}J+oQvO4%lB zUnVBMaoR|R`WtZVt31HEVMqam1tbKyKtlKuFe2wwWPAdDns+)u+CFZ#_wZ!1o5yO_ zs%wx)&?TU)b$nIsqy0>I5}g&_sbijWZFK_%T+L~#7xCSxn7WM#!P6&U$;Bj?nB@5~ zDkk!sa&S?4KtrumZ$uzO>&*RQA5K6Ave#U^pH!?YPr%1#K8R;jUR`+D(<oQo{f`$> zE%B|P-(lmj>)w;HwQ?kD&WL`0E<?3%tmGdt>??tbsvFJJdXDcW0boZIq-AZth)0;J z=!rWn_v8%J!f|CARP9eG?_4GxCG8i&UIWlm&1YF+)Kx@MpcO)h#cy-}5l4d{5XVT# z1GZ(`wh-CCw*MaS4VD1b7Q{eb-Qdd!!f-@X*@sq3?;r2eF;LS-MRxM9fy!Tt8lF{F z6Zi48jVt+)8eMs=+M$MEcTVC2O#|c2<Y%=FMX_#|Cez^2+KH1P+Y6m4Q^!V^RcO$U zc+@-_<|fhk0k?ydE}Drcnc?II|4O|s5@-_zm1|Gi7^R7%#;FDp!PUnMx*QA#x4@O| zmS)Ou?dO4Tl-}9nGjFgO9?BrT&(R>5-u$L{w@|xVbz}po9X9dgpKq{=gIykG<NP|d za(<2qWnfZ3TJr8GX+z%k`(8?5GkgtzJbEppFaE6#y_2Z8vD#4!hm4d}YHI&_(m}?$ zlg<c7{YT)VxAY>h6(JL8zm1Mfm>83xI{ASe;2FXz``!f47c$GeRS|uOnKG!g_;{DA zbD7vsX=q>rDoI)R#AiQ(qIGK@EzB7C?q83q>9Yh3u(IX1#|>t7pG1{8M-Zg7lMFQ1 zvhLAK2O%Qt7rgfYdc4mf;Pn%Z<8%0Gx(jBRNh@pS@;qG?%|G4t+`)w>u~UEE)|SYj zRmOc%hV$~+?<lx*i^AgYHEHVDZzFBE3_PJ>ah&a#8WJV?cJMEhQZW6Dl=w%&g9+4L zx;o5k_z<5j0D`Hn&!14In4qZoBIjaLs%agSn;OIBo^8uMT6t0ipY=Nu0=n#Fpuwia zq|3*Gaf1H3@ajlbq^>OcY1Zt1u<ps@T0)~O)6n++N?flfj|5{UuqQ*Xz$@tkH?i*( z8vY3xtLKS`(P&q$Hy>H4Ms@Cd(gPEqj}r;k<-SX0AuDSWf@QS}Yq%?E-w=oZxg+?$ z2I6n50`OM}3Jo@@)72GD%G8v4%IWAUK`rX<0o9eXh|h93LxjyL-+Gf=lZp5#(no&0 z=Ux4T^q64=CQ^AT>#oD$!Ow>iQ&5dBYX8AKLt6yglUe1aJZu0^cWo<tX4Qu9x2snH zY(Tq<ziAL4tq()L<NWWC1OWG+#hr~teo}`4Y&OX7#ODP_UKZIf-1n2hzMp+{hqR2s zsE#Iakd0I6`K|I9E2oo=JMwP+Shv=HeAXM&z(5G7-N+vQ{y<KVlzLQ@BR8?8d}87- zNplga#dd1xRoJjGogxP$C|u;+*D=2wBN-|Qp?A@OpF0Wp*oCEQ;MEk>C;?VbJ9u<M z;<m(D5|Plq2pv#D7%bF!u@l)(%?GwwBz?RIiK4;<L<8X~oP#zOHNoOwYx*Bvl7w5J zZ}NvDaUoK_qsM*X=2ms}2CKIk$U3X>u;q{AeP5NkgO2y`NDWdw<X%IEV@^K(2}#qz zdbI9i$ydp9DP%;X>*rM+#&u6M3=~R=3KY$58G!IAS4h~S_tgO7o`ZX}vqc6%+IQXD z|F%&<ml<?!r_z>;8w^Ix*>uKi1ayjJx8l-sL_y*XW^hXoIfSBs0cMBeBh`rE2U(!5 z5DP6^ZodlTsN)XMPFPPu^0AJVuyN`}9AX@O^UD(kE3ok~YmEl!gG9E)eP5HZ-?jxz zPv>J!0Ul9D4FQ(d$_QXilo#5XNrbQ&+7xuF+i^LG!%b1t7CsN3oIlns$j=rk!lHOU zwE^gCG8^uZ$(xns1N?%(@Awl~uBiNS3~1}{q7NaC2Tq46_wAjb*gX&>=qryp&{w7W zB|ncdtJ@6@Kfj%Sb{iTO+wm7!w33Y}831o?NpIY=dG}E3E%1**^6*|UOj@%6y?(Ca z9dSE4gPR4UDsL98(^I3ba_dfQtu8P#yzQKQab`tNiHWq{f&<|M1(w=alx=59@(8E) ziGGJ>yta?<jLk8a5-T@CouvI$0pFud5k`kH(o}^@_B-yKK^~8!D%#Tucy!eX;3MXA znnyBey~fDa?9;#QK2?xI#}Ihk5o!V3#kJP2oVBeuWzHMRD<V1fHJC0;7%jedH?m;V z`#H`{1ouk|zkgP)gVo#!XC72>{s3ri_I<g5*iXMqvw_fqneT3NGr$bdoWq`y8lcQ% zGpc1rWJ{yow~L*>x03VaBysL-V3iBiJ*iyB3kqZvuaOh+CJUK8oYy{It+~AM({llj zi2Pu7z1#3LB5SezT>)#ZjjC~?wV5@G@M4<#W#xo)47PxLfqW+}u(I<y>rO%x`GDss zr`?;+69X<2JyW^6q5sHaKt5*7w#e$vh`Vu%zA|!@lc9e4=!(l8gQ1ct7-j})E0fE% zjADBW*R5`Q(pUX$ziflngC0uH%T+&eo1+Sa+5OIz@|hNB@-Nfs*$LqcoTlOoq9PWQ z57^Vq45Q3PPZ5=zX?w*ZG`y1CJhn!Y=%~8^EzIoU5*W(AYhM!DJm&a9*W{+ea|5mD z$y_X>mErap3D7rx7y6B7l>TQ{oiN3@sq(Dcd$cV5dF-s_TFDYl9L$o=u`gaUo2gyC z{3Tbj(5ANQM|SJX<js*rz7C6fh}z0r%#d8pz3fiw*k?sbVF9scxV5c?3?8Az`?!>Q zgN|PuvX%5=h&})|Lyu8UUu$ZD>;v1o(l;8ZzjV#!=DK@(6xZBg!q!^rbfB=i_bs1- zk8IN(5t%(hEI<7^%&(rOXnXd`S<5*d{<fq&T8o&tfiKFUGTI0l9#e4@p{ado@{8KN zAnbdOau5GS@yL`@?GfzBq)w*S5)N9-Ch~A$IagjS-b}YBP0tx|5CYi!4XKeU3n$Mk zKZV7OODfV7heDIEHQ}F0N*m~nut3O@C$GR2Sfw;#xL<Bz2|g=HDl^40PBCz9t%S&{ zz3%yj2p|0<8HYD_l&opQ&y;&+Q?beqTYH;^j5+tfGgNC_?^RvdTgq%wv7QuY+MudH zK^_2i`4^*hAgxV+!RByIY!;&xnka_HGm7g{3ziKx-|qKnIVL2v9QEdM&9#+tfmHgO zc-*dB%Tc)yd+Ls^yj&$OR0Ku7Q=w?m1gIVmpYHP?<{nC|Cz4(W`c+{tGS^0HB4_^G zpf@V8*-dKwDaG%6+xp|$5!6v_dt}m*Tdl9aZrjm-j)#{BES?+7NQ5Qy?77*sq7)uU zw0)wVsu&*02;hK4SfFl)L_~Wm!QW9zI1d{&yc1R%WWFXWtOkZbG^YhZf_Jy9wnt*O z{PVOk;*}b&CBjgiZ+7*S8w;W8R#q=k<s4*xjeEhHzotpbNdQRwpFsToenJbl=(?Yo zn5t8Eu}Y_wbJUERqZNu(n2MY=9yWM?+lm_R3@gleq*E=R)+oP<^BsNXGR_-8O}c** zIksZMy3_NjAZBiX)J#_3l3PpI4ECLD=NM&<<?y}xPCjZP9eNd93nP8nDz8D6Bu`9& zj>qZux>vxuTU#O$zHx@M#o1YQynxFOnluU>-5mTh+ii-Asc@f@($@<r^fBYbHtxMK zx^~{UR75#J;K)4P&!@<g$l3I|AGU#{mK#1~Uul`SK9g;AIL>sx^j1Yz(q6f&)S*7q zLaoSaDT<ow;b-CFP2@z-J|)0RS7;??=h-Z3V4dbdIk|03djT=#YI)`f&*HzeT~Izi z_>8EHBI%&f)N8FXpAR;cQAHe+hQtXRYRkg?pe!J!#Xr|~xM)TaBdFSDiwm3C>G93* z0WdknwO1vEK0&IiqyXvq0P&*dLOizi`)3GQy|BD8sAr?K{pnW^-8*FZ^B<em9A$D( z!_Oscq&!7c=z#<Ox#oEeZu8VNZc*U@_C=(mq-}<nuJ|Lsk)x{Fuz?e!?HjNj4(I2k zWjvWU7zJDAJ~k?Cw1_MfMn+6=tEKQ4w?|v1QlPzVGtS}NuKmpt&JYg;cP=7v)ZZdp z^>BlkTxFa4hb#*#S3gQMS;8h-^LM6BF?PN=eJZX0yCS$`K%`?NN{@3sZP@0)+W|`a z_A`p{HHWwEkTZj+KX~C%y%VhKTiFaCRjbq2>1qAXO7*}>EgGz<^z!ekol4Y?s<D_D zTi>Wp%JO+Yd*Q~QT8UO#a@mtZMrqBhlZJ>dLqDC6d+d)xI&b4>W0z&N+uoy;=l!}5 zOSi7Gi+a}YuP;%SUj|s^Uu60JDm3}dJLI0S^Docnp=FqbuTzFB)GObw?mfTI@FJIA zr@0fxoUBiuBaMtGfKiogw=`$O(OIDz2|LX-U6;3vA~RR3!Jkue@XyzMG`VfbWi>oS z277xz$5U})t?SmA+9D)32^tq!Yid9I(MBQP)R~PVKi|M^BC|wGSFSq4&nGoi)?1xc z--&-`-Qf(El#~)~#iH?H*#725uH~s3=GFA|Z_NFbo#)oq;(BLb5cw+ow5hEowUQ2f zxw^JZCQO^d8FXi~_Fv9pf{^M=@$pA@fP?g1;s`^O$Syd+A@$>hV>z+}cDbOVHPPG| zqaeU(?&EZ%SJc9Pn%JNJ0hM$5&Y=C{t~JFy-ViPJO9{7`e=oFTLOBMT=4yxA6r%{J z3{&0BwX+wpE(-~qBYS1*gC5k6kY`%8DF3N)&&^s!@Dwduv_Hv8znXLXVUbzD#L(MO zpMwrI$&S(TIoF&*QV0ne6Ck6MEMdpddjNUvE9#JLXU?~VUyE!{gVV-kFbc#zJMu+a z*JSmqwp?O<vzwa#*XkT)kOckEbW`Wa?}hTIt`<%c2Qa_7PyFQ<(N`;P3Hsp<keChY z$6waI7<3+zd%+Za(mZ2ipOzu~06<au4wW2*pRSA9TxDthsDrZ5oX^W{c6CAcrJOrD zw;Hl@VXf;YGyrdftSb=q_5S+io5{kMzhV1)G^8^omw)C*fNb`F|Gs~%*i)Az*_}3B z*PnNa%-vdh5HaaahYmNuIyD#r_=gJhqaSj%w6hB{yH6OpKjAzmS>VES<JAtwYIXA> zs<B$$`=zJuY+Y$|n7;sJegpl=>@@#V-uCVP-W~8yg7lJ5l3dq|aM~_lOh@tevRl|- z1b=k|IGA&d#1%T1%noJqTd$0EVN;i111F?HJnR{K#RKWJ$3%8msdx*_Vsq@}nN;t1 zpLhkP6tIW>ykQyhehY(w8?RXsIlqde@4eQ5OVmDD&+2XAb!aKFGt4~Q4OfV1*A<<c zwSe0My$B6eD<4L%gw58j02A!R1jL9~U!F-osdNrICedCrl|1AN3JR*lRWB+PpC76- z-C9QnOh%bO4<>5ZQttl6%YdREV>R5B+53G*ZcT`ST&0@)jkUbii-!+}Xhe$cJ3##a zy5b&qd|IKR9C6ElZdHWH0Ztz?wsZ+v2&$8@AZq>==NL5Hs19vga@A{LkD;Rf;X5}d z4L|u=7_iH%t*x3s_>_>y;BK{wvih=#IH1=mYfRKuHb0_>q9~E)&+AQ%H?#;aT<Siu zd+qNrZpd}R2}O*C;+7MMNJ49_9rXts!h#q0Ce2GM1k6|B8PntX`skz}E6?j!J5X6~ zZBKh;T%V=Kj?SG=+{&kdjOBGmRT;wIjsv&2Izu7?7Dm22EtI%1T*7Bn7wIX`w)Hs@ zM+<&M?#duBk@X4zcxXFD<IrLq7t@&NYq9FxKF8HdB1^j}i`+Ot_^{Kzp&02llWS|{ zy;U{T8TXx91fMe(qQa)1n->0YeAoc7Zy>LgZX|B%yg_)zV#K5dE=*=Q4O-fevt4i5 z*gB+evy)q6)tP;ap!{PSM5WsotV^!$z$3#S``+DedL^9yH4&rDch%-RdnX%zx#hmB z!PE2JXZc;W;g<ea1Wd)gt=$zjaex2yvZ<uN&{|iq+yr|I=6r9saoxQT8uq0!IpM-N z4ZTqjEmkkdgBqh&QP#(aRbI1bzf<8m^E!!J-cT?Cto}&Yrh2f**u2UaBcPcg5qAhi znY*||i8&9L?pmTW1PcvST4cRSnp@Hnh60KP4hw$$!p>?$vZZZREo(0A1U`TUPoG<5 zJDN6n{Z^2hlika#Bc8u-2~4*v7Xv`3BQD}>;ZVVmqU`luHrDXoLV5ilW2j#3<GnKH z!uns5uu)IBDU}ldVh>9qj2j9J4{qu>wk>;&M)rEHjGSWkt<La03R0VBCByG^9rXVB zg`qw4U&r4(kvK<`e#(n&(mU|ahgHm6kk(vw4rY{cQDUU?mnh2mOX*Nm_pL^G3q;uX z{mgtsy3#k>>6-YYCZP@dm$@*X$2%xYVohG5x_x877-r*UfIt7|(-!5<jGkPTN3oBV zT~ZLqlS<C&ee9NWw7g_Q&L|}~*;hwYv4tZpp>TiyL*YVHill=T#_`uX(D6E7FqLG# zJF~rP(lM8z)xXxoJJ48`sJqs6nsI6wHEQ^Dt*f3G-6*)PY(MxB{9As*uk-c=`miFx z$5vHW*Ed?_Uqv?xgrG9@jwmoNy-KQr^-`~8H4keYRi7HI!u7js-d@#@t1JxVkd7M; zb8TV_<9@+ihr5ptY`oUuA=4W|=Di!MKLgkjQBE}$vqDCfkM?n=Z9=alRQ#g7`PEg2 z=5J-VolM2ZGLM-6kK(F~(Uuoe>%eO-qh6ZhSIda{uVy79l3#4<8T<W+YHntae;1}Q z?X{=`W#cE`305?jD!gL7nzF51$}-N8nen!Quz%j)xnnHm`ae=!!tCo3Lj?JsR{p}0 z5OcAzbEX^DJ2PaQ_JS;oTND_;vf?iemhf|~)ah1XzjFpVF=q~34Y+=@7P7=+=_{^M zwO`p(T;sAPqNb`^;cRR9Omgzz2ehPJU#>WAL9`)y<Z68);^N+RTqHWG*u1!J<4qy{ zD=702N`J@v@HKsJ@4}RXn)l3$op0PYE#=^GFj21i!%QM8_>1+;sXABQOJ)2E74$n2 z&oOH%RxtV#y=|3ZN#tIQipn+iF`Kk=>=7>zLx#jZd(YOcF-4!dvQYX}YwLw33kT8M zTbbO_AjNy+biLOo^+!B*&5)=yJ-ttRYprZi*g3(dycS!UXAhUMFg1JB42%$TsaNsR z%E|grv|pj@K{Kc8>LmSwByy{%wO0J}6%mnJD;K4ehn>I2ES0wZwW7UB9i+X4xf0RD zH^#j8`L)8#fNsh!fQ^_8@+)PHDuYpV+<B(Ua*g^Y_Cf9h$K`Smqpw8CE}m8^8UBvW z`8Uy7eqIb*Hg`Uv^*aR4g5k}KHE;F!MP_^x*+kqdDo161KMjyNFn)7f3#h!h@PNYr zk<JSP76PWjM_HDpRdr%T;aY7|>>%RWGvK>hgo#N=W(o?O<EOYExeXTiyemwf<(n)f z#&XrfZ33w8y~1+LblcwoTdg1zB0#;t@Oxo|WC$yJJv1S;>gxA_^}74QJhvL`ybAA_ zJYTN6dT}d6<|#_ltmtDPoYJ>2vv-JYo{yvFd7u!vQ5{w6p!`ww;NY|u1@y><qS|Zm zzKQ$@$Z}$GLL1IdL{wmz>aDU!VTXea-ERW^A>e##9PyQ&JOFt2eu<Og!jSVP78%c5 zSy>(GT?O8*oAVS4e%+J43ji7##QU%RAYB-)%%*u_37L{}oqd{mU_`w*5<6<CodDud z()Pm0`YtmTwW0p#Yl_o+%#DDzum1vrz3wZL<pw<Q&C_++g>RgietkPBt(4NWXvD!% zKrVZ645EK?lNsXAoA^>$qg6ya;%LMr8HKXw`}*eMqO9mDEJR+RAoLdGUYr%Fx&@M4 zo%^l%<k?i3@lw584F`rns03FObIfqgNbW%dhtJN@7Nf9*v3h8r<k!|$w&xF^J%HH4 zJR%r3Ir+d2{Q;f;j>_lV^<5$(<Z;S!JJlL;;#X>tEm6<%&1$ml#0zk?xAVI0v<bIf zySEXbohmkz{(*Q&p*!tTJfD74T%6u$tz#aGv@cNnx@XzDwK&|{G$;u2D~yHlmfuEy z7#)8Cjfiw#@qub?!n*3vTP@r5sZsOw^>632>{g!2>SouC(@nJH&)0E3n%>au(X~#X zri#~6o~(PELm4;{XW!!cb49RKS7;3CU#Pf)udsqZa#@JKUVeaBXH!G?qz;r4OZLP^ zv0J*RyV-Kigv?!mbt~p&eQvDhyxABq8`pA@_$wEIxs>ZCJ&AbS>Fl~V$h0u*5S8Hb zbo>dE+@n`_eFBp2?mnp1K$IvPDVo6TXGIjCEdWqjeJ7t&s3<svOUytBX{Lxp1qPnj z6ST9lD_g`VSZ@X&Rppib&FOMXS`uRi5z5ku`7`eK11{cvtu4zoWe~Zj+#)-9^l|u} z^qpasg2&xon?zQSxAMfwBSIdY6M+UW6Rm0~pO97P1ddwy#QsM%;)9YGvG~#WGV-%Y ziXG;$S73+nT3e>uCGnGAox_p?WJ;8}Nz%t~_tZ+}#(xOAV6hDAUvq2fHwr?1No55T zWd{bbq?R@o0wFyEyh(8quoR8#ki<@K<%ZQ<F@kG=oKa;9ke<xMqOFegs(|)1M><%K z!j9BwEruj?e%r=BtF!)AgUBMDv}3XlT<hZMo0rWc9zW<9N(3~Pv6$r&d$yI(?V~s> z9(kLDxI9E&(g&=|rCef^HpX!#T>M@y9%0aZ;JB|)Mduc6TbQg#y3X}}c0!A7H`+?C zDDiP4Qd2>_&r%_bGEl>3EZ0}#J&lX0sTsc=%(*%)z4E+^PveW8>PDT7pt+B6q#1M^ z@(CLv-fps@whkMKw~#Uc7V?J4%wuzcOw`A>J&D-qKe94#l?<<NQir35Z8Sox+A`xd zVxkiG=z~6Ib)33zBx<^SB`rFSM&R2__xeVxK`Z$eNXNz9`fU0Kw3VbaVBB=GZtWbL z(!V4Ol72X_tj_aFk%&x$Z!kIzbyXE~$Y;ebC~#2RaMK~a&v1qF$}K(b#}_OH%0L-E z+#AV0GNXAqYJLQ?B=&dLXKzRmqoq_;j|po31UjT#kgCQfS>x=KO#w&^ROVfr3COAI zJ>7Gg^YW6X&&#WI<I|*Y5bArk^Xuw9Zhu6=4+Hk;r2wsE!kjl$@iW;iPA+StXw2|_ zGVus~wMXWQt^ngJQVmFtPn=*h*jvC>!qga4oIO6Y0wvHO+hrocLisAsi^HqxI-Rl& zakhC9OidYBH%Q{G#KQAtR~=Tc7k9<^t`9Ct<F00$L-oxGx40}1hr9odO!#v;M9vN) zP%eZ$Cmd3l`km`$;fF9vuX51*S)d1{;<=IJOW+tXv768FWwJ?qV)KsSgu;&D`0W;* zpW?SWW}l=iav^%i&kNPLC>mJah~sRmK4YSy7q4Y3hXj<BXM3xB-yN6mtZr)`e~CW- zagF@!OGT4lrx<ijV$RSK2h+DoSC-3@zaCPIALSW&UW-S{@w-jO>PUkwPJHo_7Puq3 zL{hTiuapun=EdOs-3PDqXx{X>Jpr+pYdD#Mao~P^72?~?hsL)vm~X#lzUeaL2}x{f zF`MCAWqnNLS4{kaLP<=vu5LLqHGmTE5a@YLl|-K3;zA~0bN!J+dc}ORH+H6ok_#|F zbbRIEqD0Oabyi{*{wA3dL0ODXE?Ts+op5G1ma{x%#u(6rCh>*-%=cZ^c=*Sr*EtoD zG72Vfghuyq&<UJ$JWF}U=($IUGir6trm3>-5vW#w!tEQ#A$v_?&CYSL{{D|azJSrw zBbns9jEtgg@IX8f_)E)S@-%T`sPfVYFA&q*g;w962t#$FV_f>#PGI6(zAPW`5Y7Zu z^MgLJIqwmV3KFGIoZVSI8RDsS`{Z9985nqq6oj3}ImtK_xj(a8K;eVxx=s)f_WI`R zX;!E5yIOx0v(5ljtpttm5sAZhw~;9J627_PMuhySS}9Uc3{t)B|BTg=Cb!TXbeUff ztc%gIB|}Co8bWZ{EQB{vTsX%uY3@@ZXZtr|0Qfi2rz;|h(xvum=ubEUQ7lh!<(d-w z-g8XLIObGrZw*4|59dxj5*V67<M97QkpVLDRekTObH`>Cbz#?xI+%_1?5yV!?Uh!h zAZ%AU2CxBCU6qqjd-uV73iZSjYo+}j2ns+-+WNmpNnpkD*ZMAJy#cHt5#mW0XF;vs zRi>DSRNm>M8>VE95bm^RP)ka1@7EFFhHV@<{PGGRt!EWCI_6rMe^m&uM_y4<bpx*$ z;txA-*0Su$qJelPg@e=Y8z7KEIb3!BuG<%Mj^WOh3MR+it??T>1zJ*y0nP(yL&PLp zc+*=Y`;?b|0^mQC6Hltllr;Z|frKKX{8hjUXcaW_Pw9-J#-GcU{j0*jDPEX74@W|5 zda)p=)@wbHf~R=3B)?<Y?@2z|ixdC6?8gffv4I!pp=62aO;b%|-FsL0GIq&|NHd<~ zzhOF#$tp#2&Pm`{U_Jq%CrN7&*s5luy?xBmRAdc;9Y`7p0nI{uPv!a@4GJ<!U|g zckCGRdw++NI6S-HJzU@f`g+lG)bcBB?RF~vrJBabw&=LiPFRhbzik#v2Ye*!NRYvQ z6<YuQzXc{zK$ci~3Ms?n7MMs)<xw|`P_yN_dZ;=~H?ML<fV1h(ia`%q1oV(KS`gpg zc0^JCy$ud@v0mrB<{fd)6X{Y%kg!!gC-`-7&Iz`ix57SwM`<i`+YNw`6BI+>nU)=X z^>Zgie-*IkYMlxZv~i*NTak@pvXc1R^DhyZy`sSw`wN@uH|d?=TP_{=q7ys!4w9qN z7ymr=C*iU6Xf8i7V(^3PhWy_|4Kyh3mEypv`gTntO2wepkohp&Fvxl8sD*A`hCzGA z!IJVfPufch=;7S8{Nqny{_%~zdK~=>sX&XrZPY!s(#&VNKfEj|m2}aWv_TYr&=X#% z;_d(0#v6b|@^WKi7r|8ac}a+#`tP~it)Sh^Z!|=!7a1-*cvcs0%AmEFj<H|CYEp2I zqa&XKwiOd-Ql>xKj5h%c!;W~q2QoF8r^#ELj*o@}4`xL{%JkVud=9>dpD4XcT{BJ| zQdgI%q0y7PxA)3l?&0Q1+nXRf5H_)*0c{{d<m_B`x#H9@O89SFs5g0UpsHtZ0vL3} z^^n^T$Y_$gwCD+^%|i<Zs^FgAXjkXYnjbs=C6o}J#WO?9dRc!GwbS^Gq+ZR73oahh z58KY{eJscpAIv*9j!py%21`i#&D%@^(FC0BmO5_!$e))jVfe_xV)w5A+;!femQfij ziRVrz6hMRWtaAQ1*vS~+3^mT@K8y&2XINT0JyB>xrXDvA?2p4SJY5m~F-9B*(X?Z| zH?&;!K|^`CZ%%nt=J3@oHR&mW3KA%+?EL0fz(&el@^P#ByDT_#ZV}HA-!7j$EY1&A zEV&50VFK`m4@i-}m1gH<#o6C52*|mYuxR|E>;EBHf`LSQ;j<w_iiRroYTuS@W{3A4 zA;g6x6zc91?$iX=z7nJTJ*3>yscuV5i(UF_pB2QLGvwu@*3^FKO#8)W?)NNTO|QCY zLlfY%NpRBIre}T&V<(%yd#o=g?tL8ycVKR8`w_Ao*4d`^|MxDxckSOFaUwxJnKKb5 zylhtM9w#L;Fwo6cAtka~AzezGJFEeE!>#OYPzB1%U?4fbxHIat5H`~K3Ae1X|Az^4 z0QMUZ!~41Yl?(Y`A9<;p_^Kz~hP9Ys?0cL6=W5MIZ07l&xJS221~#C<CH@J3uYY|> zjwmi2x$3*K;~3>tQ?k#UCqt?o%efcASMX`0B>S&&Y^|#QiBQgf*S#EJ_%+z^QQJw{ zN8tLezdqH1r%xiwgkU3Lv?V`1PwR^I|N32n!A{@!Q-iq%;z>%$+c}gn61DNcLZ4Hz z!qA-N;;~%u-}|W;O{qst*-Pbb+kIrt%kyP<id9`I18C+f-Tdo?d?&1_9vMILGL}hS z8!%x8Zr2!6youA%h`N$zI+G)A;mIsFJkrXZi0Q#58adp$Cm!tMcNb94BF#VDl1L1M zTp}9%gWvvQ`Kty&Hb3HlEUD!-z3bW*@%FQ0JK0G@t6?hEw*3G{ntuPXbvt`zMIDwC zfIsPESjpiO*(F<PynQvp1IkVS4OjpSw+|fJnEoycVD8?OaiuS;PBs#(g#NxnuisNL ztq&~#%h`gFJ53p_xm=@VvWL?3uBJ@px#mGj2RqX~Nf+xfk$dHYEG2=ErPNyBodkf+ zr-ZZqJ*x7YBi?Gt^616BH6~g`f-@YwP`57>Ac&2Un8Bd--npLa3yxF|ExykfK7O^4 zM=QYlRQwk<8>p)9=9hDyM*oW?a`xM|nH;;RlV#5~BtWsUE1vuEWwWsg`wyKg@;+uX zY_c&9_+Lqc62biXjQe`>J8E!xD;=Tw+R^QH;sv==f5}3D14Y`BJ}0?m>=rOGSd#cM z0aCYI0EdJN|EgI8;3B9HJxOMaE*Q|Rjf15<9swP3>$MucGQq=lEUIr~y&gNQfvj*) zeC#{=!Uu$NO=s>sqpvJ`um%@ZHW_e3{oe>4sW-gUeYR_qG~{qy*{&n3lI^H7+?^`1 zwzY$W7KnnbG;yV@ERoRVSO2yge7C~`jy7&G`D0nPr}>NPwZL_B-`QQETt)w<xVd<A zWUi>6YAAVC#G4i_g=~sAQC`=n#i<Aj#wedK>n2(0S+|NPb_LXjJTUZvVtwUx<$AfW zB*db#5*U4?9^w|?Nu?X-(%d{lL9QFGdy$zu?ggRKq>BS|6*z$Vv9#Q6?8?|h&;zuC z{jT3IBdS8Fm^qh*orTXmMHiL&3O|ndC~5TQQ4FE6=1+`1gYmh!yR~eG{pMI|^db<> zEB<$02JqHRAd)#)ZJj8&r1^!v#_#Iu1p{cW^Epz5I9K`B213<?(cXL}u0i-mwJh{W ze)Gkf&XB|o<xhKG#}GLHIpvwB%hcaJpN3lcU5f%0nezGOgUgc#->big_%zcci7aa* ztqzBpEa7GpUR@ln_g=Dyu@PzBA(X*!7(XSwD4(w#7mTa+A>P{yrA}n^BoTfMsrZHp z`%%67y1Ee@d)e!tY_0}cLKcjx+ryx#yCR_3{a615z+W7({&P-XggsQx6KSd3_FMv( zZ^xiQ<PDqN=h@`6!>OI)$1Wx5widk6qg^|7lrBWk(l>)QzZ{-E&u%86cu|JxnLp3W z|JUAoMm4o|?ZOfPQ3UJ?h+qSxDo7`kjWj`eks1*Jsgd5BxJ5*Yv`9y!R{==`62JyX zC{jWT1e8vI&=Mda$ywQZKhOKV-xzy;<NP~koQGc-VX;{2p7WmVy5_udCgGtL5tW5V zF7_ZtMw8<J>g@sWV#{fPMW&r_AG(HN7gTiQakXc5#$6MW`VV+NPfpb3K+cp+!-Vvx zs6+cJ*-cyd=ciLH2jW&O+FSH9b@m-dx66&+RebFf>MHnjm6$UPpk1do`Yzx5TPPl| zpnEN9l`krMG%dI`Mmm~X^g^_ruNuasqBY*-25`3$j*Mqqz^7&8CjeH?X=Pqcag9-b zWYi%ITs;_vV6Y<NT+U5VdL=<PG^{5>#9V|y-njL2QkPLI-Ves<kGBw_j{hA?0^N^G zg?n1-c&xfM{agsWE+GMsMxY!)_|#ece+ZI*P7CI4ZWKz1$2TJI_5yAFeo2X$Oi0Y4 z%l^uaMet&f^J2%rDh##y(JgmA@n!GYcl@uU?*KKX9@_9!&6^#7A{4#zj|WYwu6UJO z%?=*0BXG*?7px~ms+D#yCP3k`!7wQ`RmgDpZMSEbWSgvUN~)<JVV%ee?=n=SyP<uQ zX6!1R{e!&@-bp#HN~fgwxC(QCZ~=EM{@$_zH7fCf=jVXnniz>;SFW8Wfg9$dZmkA8 zz?$FA&*NDU^5#R(PJM;^j8%rhYch(jWsiJE@Tp7$8PSL|fF+dEw=nbR>L9e;PH`<^ zG(R0*+cI$j;%PfRtECW1vQ6|$pYh^?4&^4?0TwZIHkqU5xb8osp-l9%Yyj_CozOFb zSYfg6bijG}kF>mMYKdLXoxK&sO@yXsary=)DZMuuu~lBJBbRrDvLG)r_&<9%et=w2 z<8~ZkU-xh!jB}LKa#t$}X_FylcY}*Q%Pqb;yE|0u5QCokq@9;?T1cXI^S$Guy{@65 z9On9rXZLSF%gW!IK%;A*T}yz$Xzt}$OF810xMumP2@Y;lwgZaZ7pA)Gr+7OfU{)^h z@jtl%Y(c00cenwyOaxoQtiQ+m0nICT#{AsUOY~jkhX(#|>s77&r8z}PfP-cIkzrMp zCi{{OFJS<@OHykEm?jI^Vi2W02CQ|S+bw+Z>eb?aY91dv-@9V3DeH%I%w5kc^V5f1 z`npAH+bVA@&_CR1Q(Uh+brIpoL;$Lx=&0x~TVna)k=W#ger0-d4{g0PjF69NMZ(Ro zSh(xkqy~ps2pQwilIKuQZ+9?u>e<31iWqV$gp~QgDZ;Ft@9a0*V|EYk#wg_r9iV0i z*YnRaAo@>>Ecxey>AUCi0mOcbf!P21!@r>WD6*1~|61m$qe0uWZR&3R%izp!ogQ^J zi8Pb=YW;-_e57Z;V2$1xiAAiWYD$K9)>6;{#3u0Wf5X_JJ}o{r%F@njTHK0ZRanaS zv58-qmbSsUwjVD*^+@}c0IErM?0Hgd)zIuQ-D;C1>nTj75L0Gm1Q@`|P8%F%Yf+o{ zDtN;_E&(iFN$)xUdf=5PE&GG-v|YkKc|ff@RUgCU*qETS81yRjElxg>a2~!nL!F^; z-C0pth*)GlN6XvZ&1qXa055Jw^=teO2>jnz_)KuYT;7q-qZd;n&D%`uK&UgL$qQjL z3T?3saRgbr^g}C4uH|+PZS2<7Yhq$%ozj>c^cuD?tzR{_Xg1TdB+{vc#ZOrpq4q&M z4`|;oD6tHam_hk%B1}-$XG<I8BYzh9txBntf)Cnn2G9NcX|V66K|EyH_U1|B2CMgV z4aI*__?h77J}0;DO8&KVmPi0<JwBz>*=jeI{>K({IJ<^<_2(Y+n097~E<6SFUYpe~ z5CJT;MQ@R0(&*;g-l9%zmipDI<U~mXOD(}ql8+1he-Pt{5%%+v09E%6C4h7mgd5i! z`}^n$NJU>72#DM?J15hGT|R^$WQre2navqIR&Ol#0U0(mbFS2mvi9c2;!p~MTUQ{= z44`JeSKt-HC1%!wL`24@dyZUPyT0eUOlKiOR)699BDpQo0^Z(>eDRCT2JK3gm!$rN z+W2R<oy3l`Bq+M_TTR&$EK3pHN}Z!)2=->F8f%xPcMp9j>;J>59|f#>h-*G)P#dLB zk8z+7H~oPADC3qk!Wv#h*KC7(1U5$a@A89i>vxSg|0baS6Ks9e4loMmGI^$QMR@;z zoS=ZwMF0wpw;u=aLe>848^o2740|doy3SGPnn*>}*QzWb?WDY9-01N>*d-=Hn78rY z*P|KP>5KM1V~F`x|Fzo-TM-+C{gmW9H$&gR>z_}F{TV~_Oojg$Lu3FvMNXh~<V63D zaH*@43f~6qW58SHBS-YMWl_ZML_F41u$B0<>OS|?cbCE@cb=L58ZuPAV%K8(GY!(@ zqZub+qXl@jxsBJ32ElGLLR@Oe%58HmvJg~hzA^#5f;k7A#|kh}Qa*g}D-Dxr3%Yxk zMi*8x2e|Y9V7zByLH`Qw{G54DC!!l-GwxQ&e7XTfBy_8v+<LfX&tOlO)-7^MrfM#d z6dC*g?|+MrFt(MQqv)^IOynslzQikMt(A1)N-8d2FjeKvx(NZ_ubMnkoz>LSpSP*q z!^$oDFvp<A>RpzY)t*1;N|P4??^k{8+O-Ai=l^WrKO6%<p~}fKQ(u>N40%7T2O3tT z=g*Sli?cm#ZCaz1O^C<JA2Xx)U<xjQUGCbJ3W9ZsYIVR;i-mXrN_HO1rTzD)(;t-_ z&S=ESPO5~H`=b1?1duF!TO@sN-gER3P%!ufP}Q#{yhY=mXTV6WF~y7w<n@;m3-DtA z7;`O&&-M{^4(MGzFawHi`S$k>*#A*oWuh(Jc3<O+iN~f^f%b10BP;U*n*nJfP7<j2 zQfg0%|7~@R@eX$r+BdpAo&3@RSX8Ey3~ONJb-c%rs!Bk13T3pkRO2<>|8b+XoiF3( z5f8L<yG~7LYMQb;cfmKj|F0}J@O<~>s3?9m;65?&T{r&T=L3&R6E;#1{w;(@BL@** zB?uHTbkYlSjy5vu`ZNP$6=t0R2f3~IBW)w3pWjSs6x_SY#DFM*fm`<-e&O*?@ghSW zz?%{nwTj%)-!1-@eEVOIH+LC8ez*kc|MA8D{GUiuKum%5=dJ%{ocw>^E6K6IWBhGb z>HiS(h5@6|F4*qzKa^Ddb!)XtKxu6I(3QXAkNh`PZC7Gp117=yzcv5YAOEW|^<OXl z?@#|(Twsy@?^@g-`g+u%L$_b(-cdJW`+q=-?XNsBPZBL2HMc7Q(hY{wy(k}aAE3x- zwB|Rc8RRI>2Z)N^fx#+)0mkc7ir?p9nAhQv{Ap)J>B*3cs$^-G*~ywti;a=&BRZK< zuS2$XW$+A!2fPY|;^Y~F0PIcC#XdU*S54T6Z}pj41Pd?#cruux<~r2eG~9;F!vVb< z)OznB*?lsW|EpVLvt4m>E!lobqh@v3Uc^kemN4Xmj)cvNjxhL)SYp}J6`aZL8_!JY zR9MrKTR6BYIb^8ay*R8%cnCRps!f`fk)s-U8F6LqveAQRMsr9PUrdozgO*8Yz`eL6 z!(=|C-L8shdfK-(vA`C4|5~{F&~N0ObwMCp9i&v-v{_{wG@Fb-5A+6yhNf!t&UzTN z<@w<!j0vg9$->h;<XaF*W&iNoz-bW<p5at$nM!;(7r%la<JeYiX_vE0zA_Mwf}0>K zPy#Oo7A?1vDtM3QE=DAM?$PRvakwW;?EXhHfF?fVSqhN4mIqJ`Ws7}4a?q72?Y%|e z$M1w!<Z*Aelu`7iT-^4tV|2OMhMTH-etrr~wC2j<YVYaFkUoIHnJw#?j_HtItiZT$ zo1S$#Df~VP0Tv3e2|ackod{qwL0I3y(h0|w_TR&CA244;K`duC;EQ(*8#_&jXNJ?M zC*A{>1d{UH`o&{vQu8_@c}FVD?Vdh;I``w}J968t(%wC-;awr1OE$R$u)34sUE;-{ z-YnU)IB45r`W3KJ4B02Ld#9GcBJa*iccjEcg0Jmzw1Bmn#T_O}A!s}l3B~phWqz<J zhHZ|A4mO)hhc@-M9T?b$&C^%0`&P!$s9NV%DBZ+w;MepVe-ap$FCrYT7R_uHwbxYI zse9+n$7NbvobJ}}p5^?aCR%^nGj1hsk5rjdWHqD(zgBALU#p@_;sz#gHJUb8Cb*f4 zqPeE;4XHk<OK%GAim7+qmc^DV<2xGJuZxNG+?GUqZF!#f8mL3eSv*r_K6Y(mQaY)d zF9v#s$buR#1byXFJ}6opZ<!Xu=2`sFa~4_wkkcFueQk}S-$x^k!yG#e<ON%7E$Jus za9?59Z{9S5>FVjFE_jBth!NhrUEh_X?dI5G2_nFuq)&S4Yh4~aT598^lXuxuGWyk! zs8bdvx-`_NY+H7-3UxrON<y!qePb+AMe_Xi-lsIO!+a=xw;mnpk0sgpVEJ}is1dZq zcf07apMm4pV$j0qR8Ug5Qf)e;acWFkYm6|kI?r`U`HIGR_??H2hA#aNd6|;_5Imx> z)A5IynHvjoO<}-vt<LVpXJzQb%FNm5r^o(OjM?&#V=LVeY-7yGHKkC)M(ywb6tyGr zn)2j9izepA<BF3SLHOJx&of9Mkcnf!IcHMtBBEBr;WM56*W~5zYj|K=u}j{~m?dhM zJ&!C>Kg16&cKLE<FoR=jAGGfYdjREu^l&XrYcEzxDkD6mE@KnOSv*X{g<c-)VYclE zvL=oAHC_U5%q=2c{ghM2-E3%n7)D-Ur$1#y+T4bUNte*_Ipr$~W_;=48qVBcE2|U2 zZcG^WRiJu<i8UsmWFo78`O*P+;FRQ<=Gn8JtDmYuwN)y%dnbxOJ=+WV2>Q+WvCY(a zCv*Uq{FH30GbG5d6JE8R?n0No+`o$m(V=cN>}nD}n5xU$s7a_Y5w2<{E$+voMbbri zu8KS&v9<+o=om*j-aoNX6xG}|9A1)9RCLV>9+q&czKf~+{$*?6tm|@ZapU0f@^T-i zq-cr5K5l-gR*>*2!cl+z^7e7ocR&hd)^8|N|CD^u<el(jNay2m)FL!@aV1}gl`Czr zQ?+8(c(?Uf$D+^-czY<YSi^#A8{j<d`;Uu^qeAnGcs)(Q93c=4hPIEKyr9Wo00v;r z3^F!6`R6xD)yV5BodRwOuCMkQR(2bG=DNJgZ4eoLP4zLYqh`2i3fEmaukDd+%;PJ- z6iDxI!!n9DkmZt(SgiOKrf(`(013ExLK%OVZR8M&95HfKf)>2kOJCuCR_1{PXXHoi zQcgo&<50~j6PW2l8GxS%yY(`e{IsEbAbyGzqepZ?C&*2g(gi<0KK7mM%>8z3-f2`d znB}>XHgi3oTz~4{%x4uq|9%4c$M#?P_pn=qO&-ukh80TUky&ko<-;S-hmd!yz*%`@ z!gs+0ULAyl<yfQumGt%d*1%k5qFB|{s3>5R4D`rxi<3s6Hu22r*kUutdgTKwe+Mi) zF@EK>;v)8jNvXj-W2fQsnLz&KBUU&HMYiT25HKz~Waq1Fft^!a3LKP*)+I|+rA?zp z1^N%VZ?<^FX!)^#N`Xwpl4JEr!AmOC-`&(fxQaD^iTXBH%NXnmZ3;gFvCjIGy5P-3 zEZ)yLtGaYVM&^v+G=BXIQDE_7+0VsR%ED>Bk0vN>rNEX?%ecDqT;S}k?-*1IzBj2f zEN|8_F+CybQ`l^HO-M-vrNj}&BoQlU`Go~VUl&#Es(u<6h}%x~im6am1qOMActmc0 zizT;OE|yGueHtaiQquxQAZ30A+ZB^<eVb{y)O8Eo9)%}&W!JhSF1(F+QmBIO$uLJR z=m3pPWEwB^$LV?>^H-*~WIVPy32ik57k~ah)QVtfSSLrPed$W<Wzz&>lRO!%;3sl3 z)e&n4KtX?51T%aEc!(#7+a_Pa!(CrJEqwmW0v(g2JWpEU3^_tmZ|7k0k1VI?i>H=G zI4Dl^KO5~pa~vkGNHJ=?DwHs|ec(Z9)uu+r8_YHl#<Q~hpuPRALdZQ;S+5Uemqy+8 z=SR;1h2Nk~kyZSPo=)e<sNp5y%N<;D<{J}JQGu4TdTBTKQE!1ml%+Z@@Xfm#tBQHs z4kyXD=!a`xxq9^#zx!HB_K_r?9%sJj-`E-IglH`N(Qan6@`t%gT{Aw9c;BC0OydBl zz5UAqZkmCAXDxYZB01wZJsw&JcDu_(oQhxZdl$hRzD5j;C-;5zHtsKqUx>V1;bA`w zRb1~>1Qi<tE$*(!m7E4WrcOzU58l5z#Htbpu5iiDlH5rjo$fU*<vG`6`~^+CS&Jfb z^u31a-EUsvozi;@8_>H)%=q5=h~Q7&P|dp)f~QJUMo5EBYC%y4tVr|Pv3Wh`Wt^hO z`_k42=HS@-CxkhpVUVEThQn^V8Gl)<blB+yD380_v;0F=h)ES|xR-ApyE*m2qoMqG zKdyED1@V+fRbsuB4B6oaX=cfde5lj@keiC9KmR4wlcGxSNATWMCa6p&z8>Pd+{VWr zc3Xo69XvA>korPRon_c1m7HF8>{=jRMyD?i>|%`>PMRJD8=D*Up7WH}zTz!b2C`{r z>$@l-ifFInN!*VKgkV~-rYc3g)Qy&BU7C@&dOw^RRXI<z%=1>7p#o@)wATIQBKqO? z;fpi{kT)D&dGh{9wN>)sG^<Up{mHJRC?2LqRDM;w<kjJ_D=0E<!Dm<1f>st;R#w9C zkyhfM&^=y)G~TTs*Xh_!?q75=drICcBA+ZKZ@u%6jZla<RHAh#OWOTq_=nURL#=5? zq2a=C+yv0;0F$6u><X*;ue_pR9VRYZHBP86(6TX#SISRn7N85vl>8MJO+G5R0FwAi zAB=@o;}-A1o;(tmdH%=mE5LabogBZt6iBX&LWH{z%1LE}n~b)Rnx!AsW<oqN-Bsg- zS~HYQ%CaIpt`w5dq$(jLs>K5;wg;4?Jd*v;jBo)6VyL?LV$<nimfuGowM3j_qLU|h z`r(LI+S@Okiq5*fFKyL_?Azv&eu)w;s4o+8xA^3qPb%o_`k1=fy?X1^pOetw;zIDR zP}%c{ZUelaxuLhrPUSJ5<ISFr@-%)-@P0W4j4(8UOjf?Vj5)C&BER5fjKaXZtScHI z*&BKK`I`x*1D_B$0ZC=LWNrzFWjr)a>0F-TzWDNB6DlvGAa%fI(%XBL<q6Pw(6pIB zS^c7PUb7ub(tLI7$%nO|1av{JBd?XVfGS9px{-Ow?SPu3k`7e1nkO;dFGl*Npj{_D zD05$q7KS{j<d61S4MCwp%(Q@B2C}wU#gV<PBbN}cUL4+x+OA3cp(*axRdc|MjLefW zUBOgWt2TID@T;x)f>B*j1z{qOS6m+17Qt6=4xYSu+URO>PYwXjcS*P(pN(vzX7*H7 zd7eqx+haCX9qeiy1O2KTtxEm*PAYOH9rbF$;+<HTi$P=AvP)|w@twUT{SiOYQn4ky zpVpH(9kn}>(6*u$Vc%c9@=@<xM0M$yvFT4nhlxlW3sce`9ten#u6CK3RInhI6^!lJ z3_o<H0w#mp`|106YlaI0V=ftDOdmfG0p=6pNVzCRDE)q=^LmA&wHF$~o3S)tz1Tyw z%Db39zA1p%0+J0LpfUjKsO(c%yipK>E>l4G+6*V7D|U&WVzi5<qgrxaPCPF#Q?IsI ztI4?SSYu)tPv-j2i;o<DNICOoSP`>KQHy5n4gg2e59)0LW;q(9M9QKro|f!7$j=z7 zm^~Z)@U+nvP8%_%VAfE%T8bu@J8f+>IE2%ylQjaWFIup$WHAJ^2S@nW4Cj1<^t>sG zFS8G*K;(MXO=-Kmm{WSLyyREAAT(3`yja}v_-4h5C2G0n9I>*O;}$y+wSHkwT2zk* z^!v#ti_-cmN#-Z4#J_00Lf;CHU87O9@J(COFkE+|g4=CY;(p<CRWFQ+@A{L*7#<F% z&8L#Y<V82OZ8~Z{8kGmwH&0WhGKUH1CFMc;r16()+gA643ZMJAsJ9P+)+ZfjFLB@C zdey4E+vPRV3^P4Fd_H!2A*^C(GV|CMQVf?&=PuCnJ%%^&jcVJOj>J1E13`Z2<%8|h z0As{ghWx_1KGI-<YvKJvih2*3!^TgNIabW#r0|C*Ij~Sg>L#3YhUd+(yQnCoe1~tF zIgeXT{O*|~lrQJ$`Ri=-XSR>qc@l|>cd!a);NUzUcjd2TJ7d<KyZd2HDZ22W4>v;l z4DYl^QmVCiwWt36mVbKXfb&#&j1&O(0&z!V+vgm}>!V{Kh_bg@!v~Xz=oSL<8smH) z0P)mKQbEW&XVyr{EpXI6JnoMS`hG0<(PZ&HH|BkBe^R6w*S$>eAt?Lsyo-*nO|75h z7xygL#5>G)bskU_oI;ief6lycVO{XJXVtV5T5eYUl#wo8qK-y-e3yWDe!{P+?ifL~ zxY~9(hg^?(P=egLEU=No6<QUpoQZr&KkHGC1dN736}#|b*5$>aglyj)K95lPqAW40 zI)O?i0ofa>KrZ{ks;k~e?TWTddO|2M+iE*!a2x1AQU{-%)YI1=e0NpeJi}9i`u>`- zvi?$d7RU46hi8L`#X?R$+G!<(ai&q?YdJ{&#Wev6*m0x_F};_x(^dj|!y!kTp=vno zzf|?vk?l8Z$9linLTcSJUNhZoX(nv*j7+WC>S(l^f&i(!$%g~E>ef&|_myP3f{%Hp z8~8^t0rqQ~!`mg5v#E(ur7SP;3IkICizAl;@kaB?=7tf8x>n3R%r9q^LK|kA@1m>0 zHKgx(HCpcG@8A{lueI~jft0@A{+TE9iJQ!9LEExw1&2TtmZTE@c%me&ExSQ2FM=df zYTZgZIP5xAk-0kAXvvC`n!M5P@kO@hV;0toWpvVNi+7{7IWW-pi@WoqM>=%g^#QP> zd6FpxEqvp~xKpiJ;KXm-K!;1gIzJHKJAI|nQ_L$z75P4&`%&L(zLMrz??5>_r$mUj z!XI&vsT-H03y;b#1>quTwA3<4MDvh_jElRDdV2$?Uj=OOd@{Jfm0&6}dI0U<sv9nR z&TOd>vj~^(yN(&!dp&w|w$naXe4itz(jgbaWd{O*=3;~6=cWx&9wBVlu+EhRgI<R` ztlyE6v&k=_VwpX@e7L0IqhHfX;w-f`?}rkv3d=|a>N#F3KxTCEhpK5!29~;ROk!I1 zj|Nr#+?ECUcrA%zv-I@*2pYz`Q8An`M}xlA>_vYsJ=)!M2UtJcM$Xch2h=^u5qn>| zKmc@|n)3$L+ter&YSp=RpaKL+Xho3b4Wq&Sxbc2*1nH4vHWpsG@_p^X+~s6glw6n# zVXOl=F?)Xm69OdkV*C5<Kxc1h={wV*!8%}|K@+g2e9xPl>@t7Q6SLd>CU$+usitK! z@8YLln%iy3ivDihD?qX4=R3M<tscu8C4Uc5x4pTKAGb+6<@{|o>}pmYC@MFjjNs`E zv*S6@7@8lp^Ibo9W%E{ZY*n@O*^BbNf(G^xo)7aNeiI}h11UW9o&%DTmUhjv=A&Sz z1DqQe<8u-?P!R3b<%Bi4+>HF-F>q(t_H&}?(XoXKvb>k3;82n!qjP>yuQhP)UHw85 zah$7D7W7T9U_F-@DVF^H{momHx9Q{@GBDAj8SM7LN5-tl(^xg-<x3G!H(^KYuM1+* zz<n(GHX8*XYMd>LvcW6Uj(##CWh&d-<MocCmrzqh#)q3iyTl8h65WD<#9Q;;>CaEq zblK!Nt!V3^rt>H+=~zib<NP<evIJtv2bEV};y8-;{7yC}!d3jqRWye}@h`I1?=|1j zG$8#P@N}wgW0-o9ITO@hlHL^2a1a@~3koz%mwR$R4{qtf`nC0>Ny*5Rzd5SwclzXw z6eFHH944pYQuOZJ(QSIJ!*=>|V2b;dGrGIWQg$*p)&vvhtzcCGO|rp&qOiE?ON!{L z#}bs=i2HLn4ZDi&)zt93A*+5`tzNuEV99w{NcD7syG5TY*7s(V=(o?QZ&*@(816uP z1}A2ry!|I%h$KIYC~WK9pP22>rXl62y*pAt2~qCR*LF@*N7HJ-G-Oj=i-?dVUyg>r zE45SW;}mQr<6E-r?9n#)9V2Lbr$(`U=1}q7`ImzQ5uVb^2D^K$%NdD<Sj1~!CL5z> zwJLE@Q@}`Vmm^OmJm)B!rFX`@&AIiWZ;!ENhRsO!i)=ZuTXJl`H0`_Q_?HpJuJwB6 zZYPvig{#Y$pu7TMPG1C@%2xJEfYaLmI|H6Z|HR?GG^^&`<CSgoBKbAe2Hz1dV2U&n z#UA&f+J)nZR7yVuW>aIo_8T|l>z9)9W$BewIFq|QPS_LLCNw<%@pzD=%~n;KN^x4I zX9fCO%85M%7Qt7c`Vy^A=(}q0v&X$2n?T6Kak|2$B*FuBb`;(p67hOx6-D1Jsa;zv z4xIkPjfUa(cg!YvlQ9z2R}PZ{q_I&&u<}}B!}Nd+PVcbyHRcFTrZqyfy)1g?u>X7D z46flDQit@gx4m{A3{21OR6|#1?(`1Tgv(i>oKY$==vb`hVcHXW@d27m>lv9DaL8A+ zf$I)3Q={$$J((@n-W|)$y-8`>EJQE6T7L{`@@qmsv{X0+o(Qm{3>tnIee;1d7O?q3 z&HE1lBfyZ*gW#e3^N6-gd(PUEPp&7YMHHg)Zm!h@`+}SQEl`v7aV-3~Yf`T}{~GEn zWkN*)vS05<km)*}1@8<3sQvl?e3L17Q5}$9%$O)l#f8L*3BMy*>l^+$bApt>Gd41> zbwFXKXe+t30x>|`dU5r4R%9EUcH}gh+>z~r)7NLHl@LBjcZ(i_^pBp{fF^3+y7PDc z(D%0EQc@vv1;eW!h4oaiQbBhLjF>n+gXgP*3ee};c4@JL?{)F7uJ{LxH^WH%E2JaH z7C$c`Px^4roFPPTgca#;;nt8rae3i<CMTdhK&pX-d8mFNtUSMZT)HD$IfgYUB`(!v zuBTs@nX{-JW#=VF8FA+uXH8r3re0iL)J;{L0lO@i`t*&vWX&$;8&ZO~xAyLH%Q<9y zPsQi|nv6PFb8UNV{N>1-;xy0kfSETn1%>qKA3NVm^YyX=cHhh(dONRzypN7~y7|rL zjNn960n%Z2S;)lPYm;T9uQb4<qHu)AL?rHP7wPVz;Y@^h$rg)%b#lkWexl)U6arT^ zxv>@2uoaV0ISorK?Mb_bn>~ul0GU^soyyHEh`A=Syy&^%=-5No?qQ;-3$R9CBc3Mu zq>kiWh+sC`<d<NG)QNNGQnnn{(VLt--u?3esD}9uZ8%*5mW9@6Th7l_#Q3t!oz@uy zhkCk?k%}NNuh_E6?4@ZNvRszRXi+4@?MI90B98lT#SnT%26WvDNTYOV%f4%`nf)x5 z<KyXK#RlZYrQ@C)Us=}Nn*%Tx2dG+*`^|S1{g+cKv|ZM7=1>r5huq^2k-C0h1rHra zQ@ufgPJ`+@W+XnuiHo@MV`m=TrdutVowYbltBY1gb!=DIT0Ob}99W?6JW7<w4({?A zAz2nN60kaX9X8quOt|W29X$w5SfS+ag3uG(!=D7f>-=eMS)9NLQ~YR)s@I&kA;pP{ zArJAww`agkgKPuW-TX@+n$VJb30=M4W)@Gpm!p1Ix2@#cgU#$7LHaKQCV2&hOh?m2 zxxmVwd$!=C4yuxNEns2xbK(uLhxt8ic3Kv8&$_cNGzdjN);%&+h)1{Su~X9#LP=bq z^<4q1S%$Fi^~q%mg_W+WJ;%p@23j<hfP}`+oQys!@!-f!H%%^;+xjK6{nAg*Y2DhK zcuC9QDnUpjN}~efk)|jUWF*;CAHdN-HW)gG$gcL<nZx+IcRR-H?g~-!zYp^^D97<^ zj9lr?x3TC*3>jPHfEDZbKAt;mSPCb);woZ1CJu&3tm=fH@*oN3lo3OH>rmSZrdr?6 zy$_c*-)o}8O+0_UHh@(Bo^cZ1#%;#gdGg8S<f4c|d&4o(TuT6;2$iwhY;&h{CcqTo zweS9RAqGO!$?0v0flvw$^XQx3rpV%3sDy2{wEMu0zfRKb|6Tj!kCW!?D7733-Kyop zL~w6eMS;|90-;a-o_)AyJOZIrTHsMW+pi4Pm)Ic9?Jdn37ULSlO*?(Tai=y&Nv}x# zV*M7atY@9?MGodXto`Zn+eM`lpk~lhud@aDGP!lZ-^}H*)YOdZnv0qO1o$I%js}Me z?lA6|Jt8UFFj%6WElxecsmIq({K~p<>}U{w=;}bd7twa;#yto~(Q+zBqrFjW7GHDD zE=9SAUx#OBkg6lIO#9pt7@6Im&|JC;Ko0tOyjfG{+*HfU<OD2{H#H1Y_U{Zl*maWO zMdMJR4RGDv>yfVC#7^&wVD#PWgEdCNF5YQxY){q>(L+_bWj-ubl`|yo@SeJ_S-YNF zq}iY)_&%KWyCn;tDPFD^vu1x!D67v>%7TN5H!#;@(tytz?S!ewim0u*|G}l7YwKrc ze%Do8V9h$XhOTLq-j#vA3i@_d$6EE4>)MSPQG!PMv1`@&7mC3oo_es>8q`@d#*yvg z3C0C?Lw)SpDt&w~pA?w4j$T{K3m*n#sS=8dC|!29Ncte6d?on?0PqhzyUKRvr2N*4 zFHQqUm!4H4@Y{w7zqn3Y*R5v`Ci72UZf!zTQ!9BV(?ly3O6T*v$>sH%81ca^!~Mf^ z<Pu>f!buH^-kLS$T6pGS!E+SK>GyH>u(_qULg`=~wu?GU95wfd&g%R=U6&UEcRJ1m z&gG`N9v)K+HE<c2*CPcg-Yxy1*&b>{Umx6<Xm(zH8!zFW?9cuz%yUs0^!u^B-SZgk zV#^Vz*Hd%#dGg^g2i7n%VMt$gIC$br;3rK>G-7(~sEDHfB(3h8b4LQFtPOn5YTMrK zt-7UKSGwOqRbK(7NHlAyTksmgl&8Mqe~p%?cB{DG7?L|V@;0<@#mg%=W-_p!&-q)y zP0@>!)9+Gm(;fE?HCfo}v@4ZuY6pe?BDybRGPxMO%DwhQ+kmaR+nYJ(D6sH=+mw$f zDL5sX{2}5Yu)O3?n#<4ykyu~0GgtonirKEE(&uUSqCCifIVGUKRetTLZ?0@VJ9|mD zYiWAoZHK;Am^Sm>mq4JCvX#1^7=OJ0{rvGw>)ojzD5>U9y=(n|_l8;pq|GMswalgP zaBMFiKH-0lhv~sWDf7Lx+^eCVnGbeKDsZ+O*gW7dv)%I$56UO8;c8{1<fGBQ*vzVZ z^7J=It13$cF+Hz(1?Av+Yo7U)NDSH~le%D8Wh=@U(3Xx7^QQIjir&k+`AN#={#zzO z46+!5K*EQaw;))gx%G$Up>w@gL3Kx$@>=*N2-CmKHuSfqx${hUSQvMWG6?lj4WC+w z7X*A4C3`ccaQef9@AdQUb3N{c6T8oj2FaB{v@daw4Ivv3_AQyc{2!o4s7Qp@L|avJ zMC@`P_tEIX*Khg{>L|1gHkAZXtCm~@feg7@*z)HV(#CFVhDf6Cx0uyp<RP02$Z*54 zPcVmLe5%gxZ9{a=O3PP2oL5}sJI|V+%<`99&OAeBpWI*=J29`&rx9<A$=T{oPcBCP z_QzKSq4kW-QJ>y>i}~|0#^&(Go+gFJ<a_xRW9{lDEY8SmW!z@ivNfST;`4LD<|}us zHV*DI9Isz*3e_&ntM|b)8xcmW<P~|fp|r(pO!=oBOZzMr5PK6TRKHgKZabFtwp35k zvdmTqRrYEW>Sgcz)Gz5cxA<wn^?Y;K>$t;gXM~OLTY64ke;m1|MplAqEy>_oNs#bH zuvxibQl!2_MM&%F1d(f-8%-?1*P!mQlG^$o4KN8SZd}zDxji#g<H^1}Syx?N;XP!t z-Dk};B)BDTLQ`!Q>or~&7mNndSAo&#Aorz1m=1sT-uf8_=gLHG1tT}JwlOg|`}toX zZ?hh^!9Fu1i99>jJ4)s*UseKrYIY#F2dC{Y>M$r*gNR;Dy?m@%aulaq*0Sd}V^WUv zy$m2OdQ&|Abc>S2A9+w$5BPN7vd~)ft%J#Lv?1>P#{4pyN631I)XBkx^;g^DoF6%Z zENjf{OM)uv9)~!uh;iS190Yd*oVRpz5%F~D$R(E_XUrb5FeFt3R#*KhOzka@l226g z{zFnlU>ZKqJh4qb@2b(o=%T3x$s(|E4gKvALaG)=tyJnEKdD1NN2U}|w{yvQ!pyYK zh`SV|JLA_`nxWGwO-=qT1Ke2-sR1BFh`M8LV+A@N&#_zZi2i;kn>H_McT(}f$?G%W zE9IqKgTD{ypT2#lR{e8<->+K36S?5ZI03ulQ=RN*%OZ(qr2sE{I(eeb7dGBP%Z3KT zN?5oIEtfsKcMmCmvw^np@8MW{1>@Em_ZUGQ;1NOF#rZ&p;c0pI$9$T<mD4GZ_pve6 zXCL~Ayt3$CPetvDR>Rts`J{WbGSUj7LDC8_PkVT5BW9;XxetQLw#!(0oe}X)6H|FU zgnH54?N2}M+^2Xzk1U&hZ(e48)#qH7F7qI>-`VKkhJ0D7CYZRl;Vl&~nfAf92_j*2 z^Ba=>B}wHZ70hura*sMLwLLD>yL_{a4!;OvB1pO9N%X7A;l!NQeL6mRiYBoYvHxk) zib6MeqRT+Kc%gF>c?I~S!Rg~7F|%xU7>;K^GjzD!T)`OpJxQ%uZE$`3{6t<1m&*P1 zkJag~c%;976&S1?rHAzOlmaPb{~0?}tpUoJW~!`xC^{18^IEWEioVU1TQ2Q5aY6da zK7>vNgz2ahOqb*@p6{j)N>Dxq670*(cRQ*Y?)pFP_klu8II7x^0q;IEt>qoC(3P~) zq7bc4-`J(+=28vQ<lwDWn}ytsvcQhWG*O%90}s{JE=t~4i+RkWKlA~}7|J8<Dsw1D zkC=b_Ilu3-Gobzb2tUmnI3}gEim6FYqE#)Ahf;Q<FmPJisiS9K{hQN8$!jy!4N+Pg z(`{9rZ^lEp(|r#`gP66BuSqt#n@e98vueJ(zA`A}<Jx?2v>CRLwL72HJHFkT=wrIw zAqZ(@GN)<XK{1tMPd$DD?rA^Et8-jBbaGlS@9GJy8CaXL{<*%~KcZqQ{{q9d%dcB) zJow~pH))ZH%Wn2?uTk@nnovyMUGNIwVAAUJox^?fy-u(4kY$;2-~GIg$Aai3JKvq# zze`4Vmo2%8!GiTF@TWom*OsO>NRHEW?~nE=olLn3c%Q;}5;JwDkR%t=4a9v8j1A_8 zxnw#2%>NocNFAix;zB3{lW46teA#G$)65-tzA;s&Uu@Fek2l#xi+x9rJbeS~!nkw5 z2!q1N1KY6XsJ_DBfbP@Itns*>A%TfSh=*SPxs^uN1eahvyOorR@$Nz17a^xjl@gov z-DgWYHDNg%*{kOtz5yc}^{0Hj22C~YZHAaOrk+1EzzdV*3;z03%4h6Qs$mjwU1_W( zx}`mD;Utp~s2PS_zfr4u7&B@&El6PND0oQ?MN;Qul6v)_d_@mUrxa!8HnsV0=Bx7s znUt@XTgCj6jU+o>W+G^A=e?FTP)!f_A2bdQZ)aJ3AX+Wl{R;2Fk*(tYfe|+3WRX@c zF3ZhqUKtPBT@~x~@_3v$&#P}fmw<~0Vmu}P$KnWtyX(tf0+nliJ(T>i?>140+OwQz zq4>*cXsIsMX{@XCz$z$FO&z4D=Dp9}-@Vz%=T7ztNmW0Ren!akX6W|wZ_Yp7kq!@` z2d!=^Hc+ahT;BZBewFn=iyB*v)@*MX3|{PhCd7ZQI%xR4uDgXk8|AP7r0%b{{N?Z6 z*(Wv_PHd?j+=|u*CrnK1qh1TKozW0*rQWez^ENlQr4!5!(qzOFIP=hsgiB&T72#nG zamcVO*`Dioh9v}RGB=TZyFw_0u1VKA*zDx*6_~TFM4StjmOLTs0PrOB#<+6Oz2ZNr z-9wv-F@}0vN5p?-*>~e@aI)yC68>7#mgeI`kXMMQ=@6Idsth^~uktFEk2JmTX2cs7 z_{DEIzOom;6S=BVwA|^L8Io#7*E3{fMDZC_!ag6N1c|{NGAnQ~g*Y7;vbNuWJ->Bf zA9J*`c%o@xK4FkV+GyyFH~Y-a?8CNn>OE;8e5@aKPR?!TYn2?C$|ToYiY}zjupkUK zEDYu6k~MacSI4(e+{mqOFi7SoEppXmII>3tkzePrHr$`HemzHg9|lRRFLj64%Rg5$ zi<U#J-CiX`z^A7Qw)}MGcMjD{RLg{Re7urBo~zV$OY>sj<gIeTalR*mOV8m}M{1Q1 zj0~Gf>=$q*r0wG00lG507LGoPTM?!eVJ|F|IcNJRJ>ydf$b>aNe93y*bI_^Zf8XU4 zfJ6E*)3^Jnw_jYr61?E#*6r5V`ZXwooMz&@G5a%?K8U;rwLh4m<f`<rSMdWStMbBn z4*5DEe{|MhvEDeWyfZAn4hZJZ;9a8OykVpdwpuQZ^Y%b=HhHQ-^wQbD6OTj2ky-*e zfat##H41el%(6ZE!wQ>++LGkHSf_AB`!T$zU1O)Y!m>SZX$8Y3x40$IrevLdJsJ4a zA-g=CiA6+;Q;=(hhVrzJX2;bDngPfb1oGqR_3U)uBp)4M*m^GOXLO2qGR^6%#cXaM z{h=4h1s$nA|5ECpF2deuf9chbB9C5M*`T)9zI1Dge|ppSlIppIV8o@vkJb;0xveTK zTa2D7585PdIQx|f<;K;ZRV43!5Tl*}sz+C5+Pp6mx7$j~5KF>ZWW`PR)NE=3PN-5> z*<DBKHD+3gwBpV+%4d~4UoT>nRV?SSsA7vPe$;ASu_fo3nk|UN8*98WOkMLoTJ7Q5 z(-mEaJv^q?-23j6g59k-IOo*b+gF|1{H+i_!cduR%s9*p`eqYei66OrHJkcLEmDx9 zXIXz|hY3PcR@N@~2wIjq_?)rbA4$^_F{{ayX(4fy-n(?8G}l^D=EYa%;ph~{PQ%x? z3{@PtoRn+AHWeC>AsunbM=bsdm9z8!hu)u6(p%ehLk_X*0dM}El^Me(f9B7$%v<N4 z@pZGm_UhEM*xR;CwgJ%$XWHzRROxeUZhnnThan@cB!l*rM*r=q&BN49d_{<&!@4Nc zhY`#?1%jC)*e9$^r65Jq^^|xK^tcPPZ}n&^DSfoQ@42tFYvO0W8~z**fW4!*?Vme( zDMRBsQ%Ct%_NDrRMr3%rKjG)7Eb6k&beP<xXGt{MLF6g<`MK00En@t=RLg36A&3_R z+dmRU<*Zy1M?~}~IO+4^LJ5b*e^HsbaGzDNNzY#Lv8AaZs?1c{p04g#Ob<lutWQlV z3a4K=p{B-gB|r&bPh7pgh*4HzN1ekZshwh35)#}j{Vkhj%ADfYZ%-J4i2@_~ygSOb z))1jRhvpEt5XmP{0zECCX*3!r-GFd4*KYjNM2WvT2?Z>GOY3}0x&Nu<0^rUAJmvq~ z^*<}{pB4De3jAjU{<8xAS%Lqo!2ba&5KTY48Ia7&<`3CC1pMe~8r-S*?ZMOk1)DX} AasU7T literal 0 HcmV?d00001 diff --git a/playgrounds/basic/src/routes/images/svelte-logo.svg b/playgrounds/basic/src/routes/images/svelte-logo.svg new file mode 100644 index 000000000000..d8b477bee13e --- /dev/null +++ b/playgrounds/basic/src/routes/images/svelte-logo.svg @@ -0,0 +1 @@ +<svg enable-background="new 0 0 98.1 118" viewBox="0 0 98.1 118" xmlns="http://www.w3.org/2000/svg"><path d="m91.8 15.6c-10.9-15.7-32.6-20.3-48.2-10.4l-27.5 17.6c-7.5 4.7-12.7 12.4-14.2 21.1-1.3 7.3-.2 14.8 3.3 21.3-2.4 3.6-4 7.6-4.7 11.8-1.6 8.9.5 18.1 5.7 25.4 11 15.7 32.6 20.3 48.2 10.4l27.5-17.5c7.5-4.7 12.7-12.4 14.2-21.1 1.3-7.3.2-14.8-3.3-21.3 2.4-3.6 4-7.6 4.7-11.8 1.7-9-.4-18.2-5.7-25.5" fill="#ff3e00"/><path d="m40.9 103.9c-8.9 2.3-18.2-1.2-23.4-8.7-3.2-4.4-4.4-9.9-3.5-15.3.2-.9.4-1.7.6-2.6l.5-1.6 1.4 1c3.3 2.4 6.9 4.2 10.8 5.4l1 .3-.1 1c-.1 1.4.3 2.9 1.1 4.1 1.6 2.3 4.4 3.4 7.1 2.7.6-.2 1.2-.4 1.7-.7l27.4-17.5c1.4-.9 2.3-2.2 2.6-3.8s-.1-3.3-1-4.6c-1.6-2.3-4.4-3.3-7.1-2.6-.6.2-1.2.4-1.7.7l-10.5 6.7c-1.7 1.1-3.6 1.9-5.6 2.4-8.9 2.3-18.2-1.2-23.4-8.7-3.1-4.4-4.4-9.9-3.4-15.3.9-5.2 4.1-9.9 8.6-12.7l27.5-17.5c1.7-1.1 3.6-1.9 5.6-2.5 8.9-2.3 18.2 1.2 23.4 8.7 3.2 4.4 4.4 9.9 3.5 15.3-.2.9-.4 1.7-.7 2.6l-.5 1.6-1.4-1c-3.3-2.4-6.9-4.2-10.8-5.4l-1-.3.1-1c.1-1.4-.3-2.9-1.1-4.1-1.6-2.3-4.4-3.3-7.1-2.6-.6.2-1.2.4-1.7.7l-27.4 17.5c-1.4.9-2.3 2.2-2.6 3.8s.1 3.3 1 4.6c1.6 2.3 4.4 3.3 7.1 2.6.6-.2 1.2-.4 1.7-.7l10.5-6.7c1.7-1.1 3.6-1.9 5.6-2.5 8.9-2.3 18.2 1.2 23.4 8.7 3.2 4.4 4.4 9.9 3.5 15.3-.9 5.2-4.1 9.9-8.6 12.7l-27.5 17.5c-1.7 1.1-3.6 1.9-5.6 2.5" fill="#fff"/></svg> \ No newline at end of file diff --git a/playgrounds/basic/vite.config.js b/playgrounds/basic/vite.config.js index 23ac5e8dcd7b..e9e130ab87a3 100644 --- a/playgrounds/basic/vite.config.js +++ b/playgrounds/basic/vite.config.js @@ -1,7 +1,8 @@ +import { enhancedImages } from '@sveltejs/enhanced-img'; import { sveltekit } from '@sveltejs/kit/vite'; export default { - plugins: [sveltekit()], + plugins: [enhancedImages(), sveltekit()], server: { fs: { allow: ['../../packages/kit'] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index b932daa819d1..99c30e915614 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -302,6 +302,9 @@ importers: magic-string: specifier: ^0.30.5 version: 0.30.14 + sharp: + specifier: ^0.33.5 + version: 0.33.5 svelte-parse-markup: specifier: ^0.1.5 version: 0.1.5(svelte@5.2.9) @@ -1094,6 +1097,9 @@ importers: '@sveltejs/amp': specifier: workspace:* version: link:../../packages/amp + '@sveltejs/enhanced-img': + specifier: workspace:* + version: link:../../packages/enhanced-img '@sveltejs/kit': specifier: workspace:* version: link:../../packages/kit @@ -1568,116 +1574,108 @@ packages: '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} - '@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'} + '@img/sharp-darwin-arm64@0.33.5': + resolution: {integrity: sha512-UT4p+iz/2H4twwAoLCqfA9UH5pI6DggwKEGuaPy7nCVQ8ZsiY5PIcrRvD1DzuY3qYL07NtIQcWnBSY/heikIFQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [darwin] - '@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'} + '@img/sharp-darwin-x64@0.33.5': + resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] - '@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'} + '@img/sharp-libvips-darwin-arm64@1.0.4': + resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] - '@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'} + '@img/sharp-libvips-darwin-x64@1.0.4': + resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] - '@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'} + '@img/sharp-libvips-linux-arm64@1.0.4': + resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - '@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'} + '@img/sharp-libvips-linux-arm@1.0.5': + resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - '@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'} + '@img/sharp-libvips-linux-s390x@1.0.4': + resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - '@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'} + '@img/sharp-libvips-linux-x64@1.0.4': + resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - '@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'} + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': + resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - '@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'} + '@img/sharp-libvips-linuxmusl-x64@1.0.4': + resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - '@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'} + '@img/sharp-linux-arm64@0.33.5': + resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@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'} + '@img/sharp-linux-arm@0.33.5': + resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - '@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'} + '@img/sharp-linux-s390x@0.33.5': + resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - '@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'} + '@img/sharp-linux-x64@0.33.5': + resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@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'} + '@img/sharp-linuxmusl-arm64@0.33.5': + resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - '@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'} + '@img/sharp-linuxmusl-x64@0.33.5': + resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - '@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'} + '@img/sharp-wasm32@0.33.5': + resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] - '@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'} + '@img/sharp-win32-ia32@0.33.5': + resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] - '@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'} + '@img/sharp-win32-x64@0.33.5': + resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] @@ -2213,7 +2211,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} @@ -3258,9 +3256,9 @@ packages: set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} - 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} + sharp@0.33.5: + resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} shebang-command@1.2.0: resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} @@ -4096,79 +4094,79 @@ snapshots: '@iarna/toml@2.2.5': {} - '@img/sharp-darwin-arm64@0.33.3': + '@img/sharp-darwin-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-arm64': 1.0.2 + '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true - '@img/sharp-darwin-x64@0.33.3': + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-darwin-x64': 1.0.2 + '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true - '@img/sharp-libvips-darwin-arm64@1.0.2': + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true - '@img/sharp-libvips-darwin-x64@1.0.2': + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm64@1.0.2': + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true - '@img/sharp-libvips-linux-arm@1.0.2': + '@img/sharp-libvips-linux-arm@1.0.5': optional: true - '@img/sharp-libvips-linux-s390x@1.0.2': + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true - '@img/sharp-libvips-linux-x64@1.0.2': + '@img/sharp-libvips-linux-x64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-arm64@1.0.2': + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true - '@img/sharp-libvips-linuxmusl-x64@1.0.2': + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true - '@img/sharp-linux-arm64@0.33.3': + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm64': 1.0.2 + '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true - '@img/sharp-linux-arm@0.33.3': + '@img/sharp-linux-arm@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-arm': 1.0.2 + '@img/sharp-libvips-linux-arm': 1.0.5 optional: true - '@img/sharp-linux-s390x@0.33.3': + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-s390x': 1.0.2 + '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true - '@img/sharp-linux-x64@0.33.3': + '@img/sharp-linux-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linux-x64': 1.0.2 + '@img/sharp-libvips-linux-x64': 1.0.4 optional: true - '@img/sharp-linuxmusl-arm64@0.33.3': + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-arm64': 1.0.2 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true - '@img/sharp-linuxmusl-x64@0.33.3': + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: - '@img/sharp-libvips-linuxmusl-x64': 1.0.2 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true - '@img/sharp-wasm32@0.33.3': + '@img/sharp-wasm32@0.33.5': dependencies: '@emnapi/runtime': 1.2.0 optional: true - '@img/sharp-win32-ia32@0.33.3': + '@img/sharp-win32-ia32@0.33.5': optional: true - '@img/sharp-win32-x64@0.33.3': + '@img/sharp-win32-x64@0.33.5': optional: true '@jridgewell/gen-mapping@0.3.5': @@ -5223,7 +5221,7 @@ snapshots: imagetools-core@7.0.0: dependencies: - sharp: 0.33.3 + sharp: 0.33.5 import-fresh@3.3.0: dependencies: @@ -5754,31 +5752,31 @@ snapshots: set-cookie-parser@2.6.0: {} - sharp@0.33.3: + sharp@0.33.5: dependencies: color: 4.2.3 detect-libc: 2.0.3 semver: 7.6.3 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 + '@img/sharp-darwin-arm64': 0.33.5 + '@img/sharp-darwin-x64': 0.33.5 + '@img/sharp-libvips-darwin-arm64': 1.0.4 + '@img/sharp-libvips-darwin-x64': 1.0.4 + '@img/sharp-libvips-linux-arm': 1.0.5 + '@img/sharp-libvips-linux-arm64': 1.0.4 + '@img/sharp-libvips-linux-s390x': 1.0.4 + '@img/sharp-libvips-linux-x64': 1.0.4 + '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 + '@img/sharp-libvips-linuxmusl-x64': 1.0.4 + '@img/sharp-linux-arm': 0.33.5 + '@img/sharp-linux-arm64': 0.33.5 + '@img/sharp-linux-s390x': 0.33.5 + '@img/sharp-linux-x64': 0.33.5 + '@img/sharp-linuxmusl-arm64': 0.33.5 + '@img/sharp-linuxmusl-x64': 0.33.5 + '@img/sharp-wasm32': 0.33.5 + '@img/sharp-win32-ia32': 0.33.5 + '@img/sharp-win32-x64': 0.33.5 shebang-command@1.2.0: dependencies: From c89805e4a4af14859d44f625bd83344e3d1a08b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:23:24 -0800 Subject: [PATCH 0793/1135] Version Packages (#13091) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/few-lamps-work.md | 5 ----- .changeset/fifty-cars-lie.md | 5 ----- .changeset/tricky-squids-provide.md | 5 ----- .changeset/wild-flies-run.md | 5 ----- packages/adapter-vercel/CHANGELOG.md | 9 +++++++++ packages/adapter-vercel/package.json | 2 +- packages/enhanced-img/CHANGELOG.md | 9 +++++++++ packages/enhanced-img/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 11 files changed, 28 insertions(+), 24 deletions(-) delete mode 100644 .changeset/few-lamps-work.md delete mode 100644 .changeset/fifty-cars-lie.md delete mode 100644 .changeset/tricky-squids-provide.md delete mode 100644 .changeset/wild-flies-run.md diff --git a/.changeset/few-lamps-work.md b/.changeset/few-lamps-work.md deleted file mode 100644 index e3f0846f5a37..000000000000 --- a/.changeset/few-lamps-work.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-vercel': patch ---- - -chore: upgrade @vercel/nft to 0.27.7 diff --git a/.changeset/fifty-cars-lie.md b/.changeset/fifty-cars-lie.md deleted file mode 100644 index cac282e057be..000000000000 --- a/.changeset/fifty-cars-lie.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly match route groups preceding optional parameters diff --git a/.changeset/tricky-squids-provide.md b/.changeset/tricky-squids-provide.md deleted file mode 100644 index d15da40874d9..000000000000 --- a/.changeset/tricky-squids-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': patch ---- - -feat: set intrinsic width and height for SVGs diff --git a/.changeset/wild-flies-run.md b/.changeset/wild-flies-run.md deleted file mode 100644 index 3f1f70ec0170..000000000000 --- a/.changeset/wild-flies-run.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': patch ---- - -perf: directly inline values since Svelte no longer inlines variables into template diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index 57bebeed2707..e0d089ca75ae 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-vercel +## 5.5.1 +### Patch Changes + + +- chore: upgrade @vercel/nft to 0.27.7 ([#13082](https://github.com/sveltejs/kit/pull/13082)) + +- Updated dependencies [[`78404dfe1eb346723eefc183278b85f25485b419`](https://github.com/sveltejs/kit/commit/78404dfe1eb346723eefc183278b85f25485b419)]: + - @sveltejs/kit@2.9.1 + ## 5.5.0 ### Minor Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 69e6f19a3b0c..eb9ef7c49e4d 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.5.0", + "version": "5.5.1", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index 31218412f370..18190901dc49 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/enhanced-img +## 0.4.2 +### Patch Changes + + +- feat: set intrinsic width and height for SVGs ([#13126](https://github.com/sveltejs/kit/pull/13126)) + + +- perf: directly inline values since Svelte no longer inlines variables into template ([#13035](https://github.com/sveltejs/kit/pull/13035)) + ## 0.4.1 ### Patch Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 41157706762f..e18904422195 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.4.1", + "version": "0.4.2", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 4ec70d7dc666..af83e3cf0217 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.9.1 +### Patch Changes + + +- fix: correctly match route groups preceding optional parameters ([#13099](https://github.com/sveltejs/kit/pull/13099)) + ## 2.9.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index bbff055c4720..7ec03c214a65 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.9.0", + "version": "2.9.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index dc207ff654d2..fe52e1b8e0ae 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.9.0'; +export const VERSION = '2.9.1'; From b80cd4c4ab7d3e0536adb75b38de24b3dcd206c6 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 9 Dec 2024 11:57:29 -0800 Subject: [PATCH 0794/1135] fix: properly handle multiple SVGs (#13127) --- .changeset/gentle-queens-bathe.md | 5 +++++ packages/enhanced-img/src/preprocessor.js | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/gentle-queens-bathe.md diff --git a/.changeset/gentle-queens-bathe.md b/.changeset/gentle-queens-bathe.md new file mode 100644 index 000000000000..f6382919d848 --- /dev/null +++ b/.changeset/gentle-queens-bathe.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': patch +--- + +fix: properly handle multiple SVGs diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js index de800b653734..7069b334b955 100644 --- a/packages/enhanced-img/src/preprocessor.js +++ b/packages/enhanced-img/src/preprocessor.js @@ -108,8 +108,10 @@ export function image(opts) { } s.update(node.start, node.end, img_to_picture(content, node, image)); } else { - const name = '__IMPORTED_ASSET_' + imports.size + '__'; const metadata = await sharp(resolved_id).metadata(); + // this must come after the await so that we don't hand off processing between getting + // the imports.size and incrementing the imports.size + const name = '__IMPORTED_ASSET_' + imports.size + '__'; const new_markup = `<img ${serialize_img_attributes(content, node.attributes, { src: `{${name}}`, width: metadata.width || 0, From 77651513ddcafa53df5280bad76beb8005e89824 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 9 Dec 2024 12:00:50 -0800 Subject: [PATCH 0795/1135] Version Packages (#13128) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/gentle-queens-bathe.md | 5 ----- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/gentle-queens-bathe.md diff --git a/.changeset/gentle-queens-bathe.md b/.changeset/gentle-queens-bathe.md deleted file mode 100644 index f6382919d848..000000000000 --- a/.changeset/gentle-queens-bathe.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': patch ---- - -fix: properly handle multiple SVGs diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index 18190901dc49..d64734eb67fa 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.4.3 +### Patch Changes + + +- fix: properly handle multiple SVGs ([#13127](https://github.com/sveltejs/kit/pull/13127)) + ## 0.4.2 ### Patch Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index e18904422195..4c58f54db65b 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.4.2", + "version": "0.4.3", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", From a0bee5b0c27a3a67730112ad0ceaea014340e2b5 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 9 Dec 2024 15:40:44 -0800 Subject: [PATCH 0796/1135] chore: upgrade @vercel/nft to 0.27.9 (#13129) --- .changeset/moody-pumas-sin.md | 5 + packages/adapter-vercel/package.json | 2 +- pnpm-lock.yaml | 412 ++++++++++++++------------- 3 files changed, 215 insertions(+), 204 deletions(-) create mode 100644 .changeset/moody-pumas-sin.md diff --git a/.changeset/moody-pumas-sin.md b/.changeset/moody-pumas-sin.md new file mode 100644 index 000000000000..298b265fb876 --- /dev/null +++ b/.changeset/moody-pumas-sin.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +chore: upgrade `@vercel/nft` to 0.27.9 diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index eb9ef7c49e4d..60073f01e2c5 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -39,7 +39,7 @@ "test": "vitest run" }, "dependencies": { - "@vercel/nft": "^0.27.7", + "@vercel/nft": "^0.27.9", "esbuild": "^0.24.0" }, "devDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 99c30e915614..1c962b64175a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -263,8 +263,8 @@ importers: packages/adapter-vercel: dependencies: '@vercel/nft': - specifier: ^0.27.7 - version: 0.27.7(rollup@4.27.4) + specifier: ^0.27.9 + version: 0.27.9(rollup@4.27.4) esbuild: specifier: ^0.24.0 version: 0.24.0 @@ -1679,6 +1679,14 @@ packages: cpu: [x64] os: [win32] + '@isaacs/cliui@8.0.2': + resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} + engines: {node: '>=12'} + + '@isaacs/fs-minipass@4.0.1': + resolution: {integrity: sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==} + engines: {node: '>=18.0.0'} + '@jridgewell/gen-mapping@0.3.5': resolution: {integrity: sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==} engines: {node: '>=6.0.0'} @@ -1709,8 +1717,9 @@ packages: '@manypkg/get-packages@1.1.3': resolution: {integrity: sha512-fo+QhuU3qE/2TQMQmbVMqaQ6EWbMhi4ABWP+O4AM1NqPBuy0OrApV5LO6BrrgnhtAHS2NH6RrVk9OL181tTi8A==} - '@mapbox/node-pre-gyp@1.0.11': - resolution: {integrity: sha512-Yhlar6v9WQgUp/He7BdgzOz8lqMQ8sU+jkCq7Wx8Myc5YFJLbEe7lgui/V7G1qB1DJykHSGwreceSaD60Y0PUQ==} + '@mapbox/node-pre-gyp@2.0.0-rc.0': + resolution: {integrity: sha512-nhSMNprz3WmeRvd8iUs5JqkKr0Ncx46JtPxM3AhXes84XpSJfmIwKeWXRpsr53S7kqPkQfPhzrMFUxSNb23qSA==} + engines: {node: '>=18'} hasBin: true '@netlify/functions@2.6.0': @@ -1737,6 +1746,10 @@ packages: resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} engines: {node: '>= 8'} + '@pkgjs/parseargs@0.11.0': + resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} + engines: {node: '>=14'} + '@playwright/test@1.44.1': resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==} engines: {node: '>=16'} @@ -2000,8 +2013,8 @@ packages: resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vercel/nft@0.27.7': - resolution: {integrity: sha512-FG6H5YkP4bdw9Ll1qhmbxuE8KwW2E/g8fJpM183fWQLeVDGqzeywMIeJ9h2txdWZ03psgWMn6QymTxaDLmdwUg==} + '@vercel/nft@0.27.9': + resolution: {integrity: sha512-pTs7OchHQmSYJPR0puVQCWw/NqzuvAtnAhBurz21lq4Y4KqWoMpYKqmikkETG5r1bHNCM/hQMZ5JiRr9mhOkyg==} engines: {node: '>=16'} hasBin: true @@ -2034,8 +2047,9 @@ packages: '@vitest/utils@2.1.6': resolution: {integrity: sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==} - abbrev@1.1.1: - resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + abbrev@2.0.0: + resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} + engines: {node: ^14.17.0 || ^16.13.0 || >=18.0.0} acorn-import-attributes@1.9.5: resolution: {integrity: sha512-n02Vykv5uA3eHGM/Z2dQrcD56kL8TyDb2p1+0P83PClMnC/nc+anbQRhIOWnSq4Ke/KvDPrY3C9hDtC/A3eHnQ==} @@ -2061,9 +2075,9 @@ packages: engines: {node: '>=0.4.0'} hasBin: true - agent-base@6.0.2: - resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} - engines: {node: '>= 6.0.0'} + agent-base@7.1.3: + resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} + engines: {node: '>= 14'} ajv@6.12.6: resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} @@ -2076,22 +2090,22 @@ packages: resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} engines: {node: '>=8'} + ansi-regex@6.1.0: + resolution: {integrity: sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==} + engines: {node: '>=12'} + ansi-styles@4.3.0: resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} engines: {node: '>=8'} + ansi-styles@6.2.1: + resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} + engines: {node: '>=12'} + anymatch@3.1.3: resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} engines: {node: '>= 8'} - aproba@2.0.0: - resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} - - are-we-there-yet@2.0.0: - resolution: {integrity: sha512-Ci/qENmwHnsYo9xKIcUJN5LeDKdJ6R1Z1j9V/J5wyq8nh/mYPEpIKJbBZXtZjG04HiK7zV/p6Vs9952MrMeUIw==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2181,9 +2195,9 @@ packages: resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} engines: {node: '>= 14.16.0'} - chownr@2.0.0: - resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} - engines: {node: '>=10'} + chownr@3.0.0: + resolution: {integrity: sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==} + engines: {node: '>=18'} ci-info@3.9.0: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} @@ -2199,10 +2213,6 @@ packages: color-string@1.9.1: resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} - color-support@1.1.3: - resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} - hasBin: true - color@4.2.3: resolution: {integrity: sha512-1rXeuUUiGGrykh+CeBdu5Ie7OJwinCgQY0bc7GCRxy5xVHy+moaqkpL/jqQq0MtQOeYcrqEz4abc5f0KtU7W4A==} engines: {node: '>=12.5.0'} @@ -2221,9 +2231,6 @@ packages: resolution: {integrity: sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==} engines: {node: '>=4'} - console-control-strings@1.1.0: - resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} - cookie@0.5.0: resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} engines: {node: '>= 0.6'} @@ -2284,9 +2291,6 @@ packages: defu@6.1.4: resolution: {integrity: sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==} - delegates@1.0.0: - resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} - dequal@2.0.3: resolution: {integrity: sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==} engines: {node: '>=6'} @@ -2331,9 +2335,15 @@ packages: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: resolution: {directory: packages/kit/test/apps/dev-only/_test_dependencies/cjs-only, type: directory} + eastasianwidth@0.2.0: + resolution: {integrity: sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==} + emoji-regex@8.0.0: resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + emoji-regex@9.2.2: + resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} + enhanced-resolve@5.17.1: resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} engines: {node: '>=10.13.0'} @@ -2523,6 +2533,10 @@ packages: flatted@3.3.1: resolution: {integrity: sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==} + foreground-child@3.3.0: + resolution: {integrity: sha512-Ld2g8rrAyMYFXBhEqMz8ZAHBi4J4uS1i/CxGMDnjyFWddMXLVcDp051DZfu+t7+ab7Wv6SMqpWmyFIj5UbfFvg==} + engines: {node: '>=14'} + fs-extra@7.0.1: resolution: {integrity: sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==} engines: {node: '>=6 <7 || >=8'} @@ -2531,10 +2545,6 @@ packages: resolution: {integrity: sha512-yhlQgA6mnOJUKOsRUFsgJdQCvkKhcz8tlZG5HBQfReYZy46OwLcY+Zia0mtdHsOo9y/hP+CxMN0TU9QxoOtG4g==} engines: {node: '>=6 <7 || >=8'} - fs-minipass@2.1.0: - resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} - engines: {node: '>= 8'} - fs.realpath@1.0.0: resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} @@ -2551,11 +2561,6 @@ packages: function-bind@1.1.2: resolution: {integrity: sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==} - gauge@3.0.2: - resolution: {integrity: sha512-+5J6MS/5XksCuXq++uFRsnUd7Ovu1XenbeuIuNRJxYWjgQbPuFhT14lAvsWfqfAmnwluf1OwMjz39HjfLPci0Q==} - engines: {node: '>=10'} - deprecated: This package is no longer supported. - get-port@5.1.1: resolution: {integrity: sha512-g/Q1aTSDOxFpchXC4i8ZWvxA1lnPqx/JHqcpIw0/LX9T8x/GBbi6YnlN5nhaKIFkT8oFsscUKgDJYxfwfS6QsQ==} engines: {node: '>=8'} @@ -2577,6 +2582,10 @@ packages: glob-to-regexp@0.4.1: resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + glob@10.4.5: + resolution: {integrity: sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==} + hasBin: true + glob@7.2.3: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported @@ -2614,16 +2623,13 @@ packages: resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} engines: {node: '>=8'} - has-unicode@2.0.1: - resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} - hasown@2.0.2: resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==} engines: {node: '>= 0.4'} - https-proxy-agent@5.0.1: - resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} - engines: {node: '>= 6'} + https-proxy-agent@7.0.6: + resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} + engines: {node: '>= 14'} human-id@1.0.2: resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} @@ -2712,6 +2718,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + jackspeak@3.4.3: + resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} + js-yaml@3.14.1: resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} hasBin: true @@ -2835,6 +2844,9 @@ packages: lower-case@2.0.2: resolution: {integrity: sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==} + lru-cache@10.4.3: + resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} + lru-cache@4.1.5: resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} @@ -2844,10 +2856,6 @@ packages: magic-string@0.30.14: resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} - make-dir@3.1.0: - resolution: {integrity: sha512-g3FeP20LNwhALb/6Cz6Dd4F2ngze0jz7tbzrD2wAV+o9FeNHe4rL+yK2md0J/fiSf1sa1ADhXqi5+oVwOM/eGw==} - engines: {node: '>=8'} - merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} engines: {node: '>= 8'} @@ -2881,20 +2889,16 @@ packages: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} - minipass@3.3.6: - resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} - engines: {node: '>=8'} + minipass@7.1.2: + resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} + engines: {node: '>=16 || 14 >=14.17'} - minipass@5.0.0: - resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} - engines: {node: '>=8'} + minizlib@3.0.1: + resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + engines: {node: '>= 18'} - minizlib@2.1.2: - resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} - engines: {node: '>= 8'} - - mkdirp@1.0.4: - resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + mkdirp@3.0.1: + resolution: {integrity: sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==} engines: {node: '>=10'} hasBin: true @@ -2944,9 +2948,9 @@ packages: resolution: {integrity: sha512-u6fs2AEUljNho3EYTJNBfImO5QTo/J/1Etd+NVdCj7qWKUSN/bSLkZwhDv7I+w/MSC6qJ4cknepkAYykDdK8og==} hasBin: true - nopt@5.0.0: - resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} - engines: {node: '>=6'} + nopt@8.0.0: + resolution: {integrity: sha512-1L/fTJ4UmV/lUxT2Uf006pfZKTvAgCF+chz+0OgBHO8u2Z67pE7AaAUUj7CJy0lXqHmymUvGFt6NE9R3HER0yw==} + engines: {node: ^18.17.0 || >=20.5.0} hasBin: true normalize-path@3.0.0: @@ -2966,14 +2970,6 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true - npmlog@5.0.1: - resolution: {integrity: sha512-AqZtDUWOMKs1G/8lwylVjrdYgqA4d9nu8hc+0gzRxlDb1I10+FHBGMXs6aiQHFdCUUlqH99MUMuLfzWDNDtfxw==} - deprecated: This package is no longer supported. - - object-assign@4.1.1: - resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} - engines: {node: '>=0.10.0'} - once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3016,6 +3012,9 @@ packages: resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} engines: {node: '>=6'} + package-json-from-dist@1.0.1: + resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} + package-manager-detector@0.2.0: resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} @@ -3041,6 +3040,10 @@ packages: path-parse@1.0.7: resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + path-scurry@1.11.1: + resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} + engines: {node: '>=16 || 14 >=14.18'} + path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} @@ -3158,10 +3161,6 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readable-stream@3.6.2: - resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} - engines: {node: '>= 6'} - readdirp@3.6.0: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} @@ -3200,9 +3199,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@3.0.2: - resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} - deprecated: Rimraf versions prior to v4 are no longer supported + rimraf@5.0.10: + resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true rollup-plugin-inject@3.0.2: @@ -3227,9 +3225,6 @@ packages: resolution: {integrity: sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==} engines: {node: '>=6'} - safe-buffer@5.2.1: - resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} - safer-buffer@2.1.2: resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} @@ -3241,18 +3236,11 @@ packages: resolution: {integrity: sha512-QNI2ChmuioGC1/xjyYwyZYADILWyW6AmS1UH6gDj/SFUUUS4MBAWs/7mxnkRPc/F4iHezDP+O8t0dO8WHiEOdg==} engines: {node: '>=6'} - semver@6.3.1: - resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} - hasBin: true - semver@7.6.3: resolution: {integrity: sha512-oVekP1cKtI+CTDvHWYFUcMtsK/00wmAEfyqKfNdARm8u1wNVhSgaX7A8d4UuIlUI5e84iEwOhs7ZPYRmzU9U6A==} engines: {node: '>=10'} hasBin: true - set-blocking@2.0.0: - resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} - set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} @@ -3282,6 +3270,10 @@ packages: signal-exit@3.0.7: resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + signal-exit@4.1.0: + resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} + engines: {node: '>=14'} + simple-swizzle@0.2.2: resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} @@ -3333,13 +3325,18 @@ packages: resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} engines: {node: '>=8'} - string_decoder@1.3.0: - resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + string-width@5.1.2: + resolution: {integrity: sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==} + engines: {node: '>=12'} strip-ansi@6.0.1: resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} engines: {node: '>=8'} + strip-ansi@7.1.0: + resolution: {integrity: sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==} + engines: {node: '>=12'} + strip-bom@3.0.0: resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} engines: {node: '>=4'} @@ -3433,9 +3430,9 @@ packages: resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} engines: {node: '>=6'} - tar@6.2.1: - resolution: {integrity: sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==} - engines: {node: '>=10'} + tar@7.4.3: + resolution: {integrity: sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==} + engines: {node: '>=18'} term-size@2.2.1: resolution: {integrity: sha512-wK0Ri4fOGjv/XPy8SBHZChl8CM7uMc5VML7SqiQ0zG7+J5Vr+RMQDoHa2CNT6KHUnTGIXH34UDMkPzAUyapBZg==} @@ -3648,9 +3645,6 @@ packages: engines: {node: '>=8'} hasBin: true - wide-align@1.1.5: - resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} - workerd@1.20240701.0: resolution: {integrity: sha512-qSgNVqauqzNCij9MaJLF2c2ko3AnFioVSIxMSryGbRK+LvtGr9BKBt6JOxCb24DoJASoJDx3pe3DJHBVydUiBg==} engines: {node: '>=16'} @@ -3670,6 +3664,14 @@ packages: '@cloudflare/workers-types': optional: true + wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + + wrap-ansi@8.1.0: + resolution: {integrity: sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==} + engines: {node: '>=12'} + wrappy@1.0.2: resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} @@ -3691,8 +3693,9 @@ packages: yallist@2.1.2: resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@4.0.0: - resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + yallist@5.0.0: + resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} + engines: {node: '>=18'} yaml@1.10.2: resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} @@ -4169,6 +4172,19 @@ snapshots: '@img/sharp-win32-x64@0.33.5': optional: true + '@isaacs/cliui@8.0.2': + dependencies: + string-width: 5.1.2 + string-width-cjs: string-width@4.2.3 + strip-ansi: 7.1.0 + strip-ansi-cjs: strip-ansi@6.0.1 + wrap-ansi: 8.1.0 + wrap-ansi-cjs: wrap-ansi@7.0.0 + + '@isaacs/fs-minipass@4.0.1': + dependencies: + minipass: 7.1.2 + '@jridgewell/gen-mapping@0.3.5': dependencies: '@jridgewell/set-array': 1.2.1 @@ -4212,17 +4228,15 @@ snapshots: globby: 11.1.0 read-yaml-file: 1.1.0 - '@mapbox/node-pre-gyp@1.0.11': + '@mapbox/node-pre-gyp@2.0.0-rc.0': dependencies: + consola: 3.2.3 detect-libc: 2.0.3 - https-proxy-agent: 5.0.1 - make-dir: 3.1.0 + https-proxy-agent: 7.0.6 node-fetch: 2.7.0 - nopt: 5.0.0 - npmlog: 5.0.1 - rimraf: 3.0.2 + nopt: 8.0.0 semver: 7.6.3 - tar: 6.2.1 + tar: 7.4.3 transitivePeerDependencies: - encoding - supports-color @@ -4250,6 +4264,9 @@ snapshots: '@nodelib/fs.scandir': 2.1.5 fastq: 1.17.1 + '@pkgjs/parseargs@0.11.0': + optional: true + '@playwright/test@1.44.1': dependencies: playwright: 1.44.1 @@ -4512,9 +4529,9 @@ snapshots: '@typescript-eslint/types': 8.4.0 eslint-visitor-keys: 3.4.3 - '@vercel/nft@0.27.7(rollup@4.27.4)': + '@vercel/nft@0.27.9(rollup@4.27.4)': dependencies: - '@mapbox/node-pre-gyp': 1.0.11 + '@mapbox/node-pre-gyp': 2.0.0-rc.0 '@rollup/pluginutils': 5.1.3(rollup@4.27.4) acorn: 8.14.0 acorn-import-attributes: 1.9.5(acorn@8.14.0) @@ -4523,8 +4540,8 @@ snapshots: estree-walker: 2.0.2 glob: 7.2.3 graceful-fs: 4.2.11 - micromatch: 4.0.8 node-gyp-build: 4.8.0 + picomatch: 4.0.2 resolve-from: 5.0.0 transitivePeerDependencies: - encoding @@ -4571,7 +4588,7 @@ snapshots: loupe: 3.1.2 tinyrainbow: 1.2.0 - abbrev@1.1.1: {} + abbrev@2.0.0: {} acorn-import-attributes@1.9.5(acorn@8.14.0): dependencies: @@ -4589,11 +4606,7 @@ snapshots: acorn@8.14.0: {} - agent-base@6.0.2: - dependencies: - debug: 4.3.7 - transitivePeerDependencies: - - supports-color + agent-base@7.1.3: {} ajv@6.12.6: dependencies: @@ -4606,22 +4619,19 @@ snapshots: ansi-regex@5.0.1: {} + ansi-regex@6.1.0: {} + ansi-styles@4.3.0: dependencies: color-convert: 2.0.1 + ansi-styles@6.2.1: {} + anymatch@3.1.3: dependencies: normalize-path: 3.0.0 picomatch: 2.3.1 - aproba@2.0.0: {} - - are-we-there-yet@2.0.0: - dependencies: - delegates: 1.0.0 - readable-stream: 3.6.2 - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -4713,7 +4723,7 @@ snapshots: dependencies: readdirp: 4.0.1 - chownr@2.0.0: {} + chownr@3.0.0: {} ci-info@3.9.0: {} @@ -4728,8 +4738,6 @@ snapshots: color-name: 1.1.4 simple-swizzle: 0.2.2 - color-support@1.1.3: {} - color@4.2.3: dependencies: color-convert: 2.0.1 @@ -4743,8 +4751,6 @@ snapshots: console-clear@1.1.1: {} - console-control-strings@1.1.0: {} - cookie@0.5.0: {} cookie@0.6.0: {} @@ -4787,8 +4793,6 @@ snapshots: defu@6.1.4: {} - delegates@1.0.0: {} - dequal@2.0.3: {} detect-indent@6.1.0: {} @@ -4825,8 +4829,12 @@ snapshots: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: {} + eastasianwidth@0.2.0: {} + emoji-regex@8.0.0: {} + emoji-regex@9.2.2: {} + enhanced-resolve@5.17.1: dependencies: graceful-fs: 4.2.11 @@ -5095,6 +5103,11 @@ snapshots: flatted@3.3.1: {} + foreground-child@3.3.0: + dependencies: + cross-spawn: 7.0.3 + signal-exit: 4.1.0 + fs-extra@7.0.1: dependencies: graceful-fs: 4.2.11 @@ -5107,10 +5120,6 @@ snapshots: jsonfile: 4.0.0 universalify: 0.1.2 - fs-minipass@2.1.0: - dependencies: - minipass: 3.3.6 - fs.realpath@1.0.0: {} fsevents@2.3.2: @@ -5121,18 +5130,6 @@ snapshots: function-bind@1.1.2: {} - gauge@3.0.2: - dependencies: - aproba: 2.0.0 - color-support: 1.1.3 - console-control-strings: 1.1.0 - has-unicode: 2.0.1 - object-assign: 4.1.1 - signal-exit: 3.0.7 - string-width: 4.2.3 - strip-ansi: 6.0.1 - wide-align: 1.1.5 - get-port@5.1.1: {} get-source@2.0.12: @@ -5154,6 +5151,15 @@ snapshots: glob-to-regexp@0.4.1: {} + glob@10.4.5: + dependencies: + foreground-child: 3.3.0 + jackspeak: 3.4.3 + minimatch: 9.0.5 + minipass: 7.1.2 + package-json-from-dist: 1.0.1 + path-scurry: 1.11.1 + glob@7.2.3: dependencies: fs.realpath: 1.0.0 @@ -5194,15 +5200,13 @@ snapshots: has-flag@4.0.0: {} - has-unicode@2.0.1: {} - hasown@2.0.2: dependencies: function-bind: 1.1.2 - https-proxy-agent@5.0.1: + https-proxy-agent@7.0.6: dependencies: - agent-base: 6.0.2 + agent-base: 7.1.3 debug: 4.3.7 transitivePeerDependencies: - supports-color @@ -5279,6 +5283,12 @@ snapshots: isexe@2.0.0: {} + jackspeak@3.4.3: + dependencies: + '@isaacs/cliui': 8.0.2 + optionalDependencies: + '@pkgjs/parseargs': 0.11.0 + js-yaml@3.14.1: dependencies: argparse: 1.0.10 @@ -5377,6 +5387,8 @@ snapshots: dependencies: tslib: 2.6.2 + lru-cache@10.4.3: {} + lru-cache@4.1.5: dependencies: pseudomap: 1.0.2 @@ -5390,10 +5402,6 @@ snapshots: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - make-dir@3.1.0: - dependencies: - semver: 6.3.1 - merge2@1.4.1: {} micromatch@4.0.8: @@ -5436,18 +5444,14 @@ snapshots: dependencies: brace-expansion: 2.0.1 - minipass@3.3.6: - dependencies: - yallist: 4.0.0 - - minipass@5.0.0: {} + minipass@7.1.2: {} - minizlib@2.1.2: + minizlib@3.0.1: dependencies: - minipass: 3.3.6 - yallist: 4.0.0 + minipass: 7.1.2 + rimraf: 5.0.10 - mkdirp@1.0.4: {} + mkdirp@3.0.1: {} mri@1.2.0: {} @@ -5476,9 +5480,9 @@ snapshots: node-gyp-build@4.8.0: {} - nopt@5.0.0: + nopt@8.0.0: dependencies: - abbrev: 1.1.1 + abbrev: 2.0.0 normalize-path@3.0.0: {} @@ -5495,15 +5499,6 @@ snapshots: npm-bundled: 2.0.1 npm-normalize-package-bin: 2.0.0 - npmlog@5.0.1: - dependencies: - are-we-there-yet: 2.0.0 - console-control-strings: 1.1.0 - gauge: 3.0.2 - set-blocking: 2.0.0 - - object-assign@4.1.1: {} - once@1.4.0: dependencies: wrappy: 1.0.2 @@ -5545,6 +5540,8 @@ snapshots: p-try@2.2.0: {} + package-json-from-dist@1.0.1: {} + package-manager-detector@0.2.0: {} parent-module@1.0.1: @@ -5564,6 +5561,11 @@ snapshots: path-parse@1.0.7: {} + path-scurry@1.11.1: + dependencies: + lru-cache: 10.4.3 + minipass: 7.1.2 + path-to-regexp@6.2.2: {} path-type@4.0.0: {} @@ -5651,12 +5653,6 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readable-stream@3.6.2: - dependencies: - inherits: 2.0.4 - string_decoder: 1.3.0 - util-deprecate: 1.0.2 - readdirp@3.6.0: dependencies: picomatch: 2.3.1 @@ -5683,9 +5679,9 @@ snapshots: reusify@1.0.4: {} - rimraf@3.0.2: + rimraf@5.0.10: dependencies: - glob: 7.2.3 + glob: 10.4.5 rollup-plugin-inject@3.0.2: dependencies: @@ -5733,8 +5729,6 @@ snapshots: dependencies: mri: 1.2.0 - safe-buffer@5.2.1: {} - safer-buffer@2.1.2: {} selfsigned@2.4.1: @@ -5744,12 +5738,8 @@ snapshots: semiver@1.1.0: {} - semver@6.3.1: {} - semver@7.6.3: {} - set-blocking@2.0.0: {} - set-cookie-parser@2.6.0: {} sharp@0.33.5: @@ -5794,6 +5784,8 @@ snapshots: signal-exit@3.0.7: {} + signal-exit@4.1.0: {} + simple-swizzle@0.2.2: dependencies: is-arrayish: 0.3.2 @@ -5847,14 +5839,20 @@ snapshots: is-fullwidth-code-point: 3.0.0 strip-ansi: 6.0.1 - string_decoder@1.3.0: + string-width@5.1.2: dependencies: - safe-buffer: 5.2.1 + eastasianwidth: 0.2.0 + emoji-regex: 9.2.2 + strip-ansi: 7.1.0 strip-ansi@6.0.1: dependencies: ansi-regex: 5.0.1 + strip-ansi@7.1.0: + dependencies: + ansi-regex: 6.1.0 + strip-bom@3.0.0: {} strip-indent@3.0.0: @@ -5930,14 +5928,14 @@ snapshots: tapable@2.2.1: {} - tar@6.2.1: + tar@7.4.3: dependencies: - chownr: 2.0.0 - fs-minipass: 2.1.0 - minipass: 5.0.0 - minizlib: 2.1.2 - mkdirp: 1.0.4 - yallist: 4.0.0 + '@isaacs/fs-minipass': 4.0.1 + chownr: 3.0.0 + minipass: 7.1.2 + minizlib: 3.0.1 + mkdirp: 3.0.1 + yallist: 5.0.0 term-size@2.2.1: {} @@ -6133,10 +6131,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - wide-align@1.1.5: - dependencies: - string-width: 4.2.3 - workerd@1.20240701.0: optionalDependencies: '@cloudflare/workerd-darwin-64': 1.20240701.0 @@ -6176,6 +6170,18 @@ snapshots: - supports-color - utf-8-validate + wrap-ansi@7.0.0: + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + wrap-ansi@8.1.0: + dependencies: + ansi-styles: 6.2.1 + string-width: 5.1.2 + strip-ansi: 7.1.0 + wrappy@1.0.2: {} ws@8.18.0: {} @@ -6184,7 +6190,7 @@ snapshots: yallist@2.1.2: {} - yallist@4.0.0: {} + yallist@5.0.0: {} yaml@1.10.2: {} From 01d2720a0c1a913b8961d07ca2cfae5ea06be2ab Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 9 Dec 2024 16:06:10 -0800 Subject: [PATCH 0797/1135] chore: upgrade to svelte-check 4.1.1 (#13131) --- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- packages/kit/test/apps/no-ssr/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- packages/kit/test/apps/writes/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../apps/private-dynamic-env/package.json | 2 +- .../package.json | 2 +- .../apps/private-static-env/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-folder/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-module/package.json | 2 +- .../package.json | 2 +- .../service-worker-private-env/package.json | 2 +- .../apps/syntax-error/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 2 +- .../test/prerendering/options/package.json | 2 +- .../test/prerendering/paths-base/package.json | 2 +- playgrounds/basic/package.json | 2 +- pnpm-lock.yaml | 148 +++++++++--------- 27 files changed, 100 insertions(+), 100 deletions(-) diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index 7a6f03eebcb9..7774f14aba80 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -18,7 +18,7 @@ "cross-env": "^7.0.3", "dropcss": "^1.0.16", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index fda8f31a4ee2..0ae5b0924880 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -18,7 +18,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index d2bef02977a2..4dccabf51749 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -24,7 +24,7 @@ "e2e-test-dep-page-universal": "file:./_test_dependencies/cjs-only", "e2e-test-dep-server": "file:./_test_dependencies/cjs-only", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index 680dfe2235f6..4559fd1341a0 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -16,7 +16,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index 4cc3a5c14f15..7f4348976632 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -16,7 +16,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index 623d6cd62285..6b7c7de21657 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -17,7 +17,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 96d2a80b24fa..85c63b12321f 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -16,7 +16,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index fb7f7f684c78..e5bf4b02eed4 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -16,7 +16,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index 0dbfaafe1eb4..cf4d9913e0d7 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index 0dbfaafe1eb4..cf4d9913e0d7 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index 8797667db0c7..834924d345eb 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index 1fa4ba71aa7c..b2effd8466cc 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index 9195222826b2..6cc97fed6bf7 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index eb04f276dffa..c98b0c2e266a 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index fd63031f7d86..40edab1e2516 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index 92bbc16f021b..36c162f4cb18 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index e599b0fd8b7d..80c89040bbd3 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index 977fb6d29bca..a3ce9cb0317b 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index 2229d146edaa..d3f317627930 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index d70025311be1..d420359daf0f 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index c58e53b08db5..06f895237d94 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index 819dcb848a2b..194ea56a99fe 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -11,7 +11,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1" }, diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index 6ef2d6bda23f..0b14e85ec19c 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -14,7 +14,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1", "vitest": "^2.1.6" diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index 0adfad3a14c2..e9f9b5be82e4 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1", "vitest": "^2.1.6" diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index 960a2b2dd33e..7a09ce50a317 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1", "vitest": "^2.1.6" diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index a24de2d8ba70..9840e3683d05 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -30,7 +30,7 @@ "prettier-plugin-svelte": "^3.2.6", "publint": "^0.2.0", "svelte": "^5.2.9", - "svelte-check": "^4.0.1", + "svelte-check": "^4.1.1", "typescript": "^5.5.0", "vite": "^6.0.1" }, diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1c962b64175a..873ed72ba864 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -434,8 +434,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -458,8 +458,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -512,8 +512,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -536,8 +536,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -560,8 +560,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -584,8 +584,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -611,8 +611,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -635,8 +635,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -665,8 +665,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -689,8 +689,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -713,8 +713,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -734,8 +734,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -755,8 +755,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -779,8 +779,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -800,8 +800,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -821,8 +821,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -842,8 +842,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -863,8 +863,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -884,8 +884,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -905,8 +905,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -926,8 +926,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -947,8 +947,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -968,8 +968,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -992,8 +992,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -1016,8 +1016,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -1032,7 +1032,7 @@ importers: dependencies: chokidar: specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.1 kleur: specifier: ^4.1.5 version: 4.1.5 @@ -1122,8 +1122,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 svelte-check: - specifier: ^4.0.1 - version: 4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.5.0 version: 5.6.3 @@ -2191,8 +2191,8 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} - chokidar@4.0.0: - resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} + chokidar@4.0.1: + resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} chownr@3.0.0: @@ -2499,8 +2499,8 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.4.0: - resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} + fdir@6.4.2: + resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2599,8 +2599,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.12.0: - resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + globals@15.13.0: + resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -3165,8 +3165,8 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.0.1: - resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} + readdirp@4.0.2: + resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} engines: {node: '>= 14.16.0'} regenerator-runtime@0.14.1: @@ -3357,8 +3357,8 @@ packages: resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} engines: {node: '>= 0.4'} - svelte-check@4.0.1: - resolution: {integrity: sha512-AuWnCZdREoOzMhoptHPUUPYUxLNdXSkoZnPnlv19SZJJimRzLmjjZLKsOiRB4AnhgX+56/WSEdvkWXI/q2BSsA==} + svelte-check@4.1.1: + resolution: {integrity: sha512-NfaX+6Qtc8W/CyVGS/F7/XdiSSyXz+WGYA9ZWV3z8tso14V2vzjfXviKaTFEzB7g8TqfgO2FOzP6XT4ApSTUTw==} engines: {node: '>= 18.0.0'} hasBin: true peerDependencies: @@ -4278,7 +4278,7 @@ snapshots: '@rollup/pluginutils': 5.1.3(rollup@4.27.4) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.0(picomatch@4.0.2) + fdir: 6.4.2(picomatch@4.0.2) is-reference: 1.2.1 magic-string: 0.30.14 picomatch: 4.0.2 @@ -4378,7 +4378,7 @@ snapshots: eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.9.0(eslint@9.6.0) eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.2.9) - globals: 15.12.0 + globals: 15.13.0 typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) @@ -4719,9 +4719,9 @@ snapshots: optionalDependencies: fsevents: 2.3.3 - chokidar@4.0.0: + chokidar@4.0.1: dependencies: - readdirp: 4.0.1 + readdirp: 4.0.2 chownr@3.0.0: {} @@ -4924,7 +4924,7 @@ snapshots: eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) get-tsconfig: 4.8.1 - globals: 15.12.0 + globals: 15.13.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 @@ -5072,7 +5072,7 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.4.0(picomatch@4.0.2): + fdir@6.4.2(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -5179,7 +5179,7 @@ snapshots: globals@14.0.0: {} - globals@15.12.0: {} + globals@15.13.0: {} globalyzer@0.1.0: {} @@ -5657,7 +5657,7 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.0.1: {} + readdirp@4.0.2: {} regenerator-runtime@0.14.1: {} @@ -5867,11 +5867,11 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.0.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3): + svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 - chokidar: 3.6.0 - fdir: 6.4.0(picomatch@4.0.2) + chokidar: 4.0.1 + fdir: 6.4.2(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 svelte: 5.2.9 From 7168778f1df156ab6d06f96ebb6aca8c488e8154 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Tue, 10 Dec 2024 18:05:57 +0800 Subject: [PATCH 0798/1135] docs: reword beforeNavigate description so that it includes navigations to the same URL (#13133) closes #12863 --- packages/kit/src/runtime/client/client.js | 2 +- packages/kit/types/index.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index bec38c9122fa..f36f14cb8e35 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1668,7 +1668,7 @@ export function afterNavigate(callback) { } /** - * A navigation interceptor that triggers before we navigate to a new URL, whether by clicking a link, calling `goto(...)`, or using the browser back/forward controls. + * A navigation interceptor that triggers before we navigate to a URL, whether by clicking a link, calling `goto(...)`, or using the browser back/forward controls. * * Calling `cancel()` will prevent the navigation from completing. If `navigation.type === 'leave'` — meaning the user is navigating away from the app (or closing the tab) — calling `cancel` will trigger the native browser unload confirmation dialog. In this case, the navigation may or may not be cancelled depending on the user's response. * diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 63fdcb004bf3..77300bd9c243 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2051,7 +2051,7 @@ declare module '$app/navigation' { * */ export function afterNavigate(callback: (navigation: import("@sveltejs/kit").AfterNavigate) => void): void; /** - * A navigation interceptor that triggers before we navigate to a new URL, whether by clicking a link, calling `goto(...)`, or using the browser back/forward controls. + * A navigation interceptor that triggers before we navigate to a URL, whether by clicking a link, calling `goto(...)`, or using the browser back/forward controls. * * Calling `cancel()` will prevent the navigation from completing. If `navigation.type === 'leave'` — meaning the user is navigating away from the app (or closing the tab) — calling `cancel` will trigger the native browser unload confirmation dialog. In this case, the navigation may or may not be cancelled depending on the user's response. * From 85b57168189fa16fe966434ec50cc19425cab275 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Tue, 10 Dec 2024 22:21:12 +0800 Subject: [PATCH 0799/1135] fix: prevent hooks exported from `hooks.js` from overwriting hooks from `hooks.server.js` (#13104) * specifically write to each property * changeset * Update .changeset/mean-bottles-wash.md --- .changeset/mean-bottles-wash.md | 5 +++++ packages/kit/src/core/sync/write_server.js | 14 ++++++++++++-- 2 files changed, 17 insertions(+), 2 deletions(-) create mode 100644 .changeset/mean-bottles-wash.md diff --git a/.changeset/mean-bottles-wash.md b/.changeset/mean-bottles-wash.md new file mode 100644 index 000000000000..839cfa2a8a54 --- /dev/null +++ b/.changeset/mean-bottles-wash.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: prevent hooks exported from `hooks.js` from overwriting hooks from `hooks.server.js` diff --git a/packages/kit/src/core/sync/write_server.js b/packages/kit/src/core/sync/write_server.js index eb50bfd4735b..f4568743728e 100644 --- a/packages/kit/src/core/sync/write_server.js +++ b/packages/kit/src/core/sync/write_server.js @@ -64,9 +64,19 @@ export const options = { }; export async function get_hooks() { + let handle; + let handleFetch; + let handleError; + ${server_hooks ? `({ handle, handleFetch, handleError } = await import(${s(server_hooks)}));` : ''} + + let reroute; + ${universal_hooks ? `({ reroute } = await import(${s(universal_hooks)}));` : ''} + return { - ${server_hooks ? `...(await import(${s(server_hooks)})),` : ''} - ${universal_hooks ? `...(await import(${s(universal_hooks)})),` : ''} + handle, + handleFetch, + handleError, + reroute, }; } From 9fc5ff3339e543b956f7ce5eb31267fa73ee332a Mon Sep 17 00:00:00 2001 From: Paolo Ricciuti <ricciutipaolo@gmail.com> Date: Tue, 10 Dec 2024 15:22:29 +0100 Subject: [PATCH 0800/1135] feat: server and client `init` hook (#13103) * feat: server and client `init` hook * fix: provide client_hooks fallback even if universal hooks are present * chore: add tests * chore: cache server instance in `vite dev` * chore: remove only (duh) * chore: revert single server in dev * chore: revert weird did_it_run thing * chore: add additional inited check to prevent multiple init in case of race conditions * fix: remove `init` from client hooks * docs: write some documentation, use proper exported types * chore: regenerate types * simplify * chore: docs suggestions from review Co-authored-by: Rich Harris <hello@rich-harris.dev> * try this * chore: fix lint * chore: fix types * save a couple bytes * Apply suggestions from code review --------- Co-authored-by: Rich Harris <rich.harris@vercel.com> Co-authored-by: Rich Harris <hello@rich-harris.dev> Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/eight-poems-learn.md | 5 ++++ documentation/docs/30-advanced/20-hooks.md | 19 +++++++++++++++ .../src/core/sync/write_client_manifest.js | 1 + packages/kit/src/exports/public.d.ts | 10 ++++++++ packages/kit/src/runtime/client/client.js | 3 +++ packages/kit/src/runtime/server/index.js | 13 +++++++++-- packages/kit/src/types/internal.d.ts | 6 ++++- .../kit/test/apps/basics/src/hooks.client.js | 4 ++++ .../kit/test/apps/basics/src/hooks.server.js | 9 ++++++-- .../src/routes/init-hooks/+page.server.ts | 11 +++++++++ .../basics/src/routes/init-hooks/+page.svelte | 7 ++++++ .../routes/init-hooks/navigate/+page.svelte | 1 + .../kit/test/apps/basics/test/client.test.js | 23 +++++++++++++++++++ .../kit/test/apps/basics/test/server.test.js | 9 ++++++++ packages/kit/types/index.d.ts | 10 ++++++++ 15 files changed, 126 insertions(+), 5 deletions(-) create mode 100644 .changeset/eight-poems-learn.md create mode 100644 packages/kit/test/apps/basics/src/routes/init-hooks/+page.server.ts create mode 100644 packages/kit/test/apps/basics/src/routes/init-hooks/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/init-hooks/navigate/+page.svelte diff --git a/.changeset/eight-poems-learn.md b/.changeset/eight-poems-learn.md new file mode 100644 index 000000000000..62d9e4224d54 --- /dev/null +++ b/.changeset/eight-poems-learn.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: server and client `init` hook diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index 6decc1cbf463..9663d724fc18 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -237,6 +237,25 @@ During development, if an error occurs because of a syntax error in your Svelte > [!NOTE] Make sure that `handleError` _never_ throws an error +### init + +This function runs once, when the server is created or the app starts in the browser, and is a useful place to do asynchronous work such as initializing a database connection. + +> [!NOTE] If your environment supports top-level await, the `init` function is really no different from writing your initialisation logic at the top level of the module, but some environments — most notably, Safari — don't. + +```js +/// file: src/hooks.server.js +import * as db from '$lib/server/database'; + +/** @type {import('@sveltejs/kit').ServerInit} */ +export async function init() { + await db.connect(); +} +``` + +> [!NOTE] +> In the browser, asynchronous work in `init` will delay hydration, so be mindful of what you put in there. + ## Universal hooks The following can be added to `src/hooks.js`. Universal hooks run on both server and client (not to be confused with shared hooks, which are environment-specific). diff --git a/packages/kit/src/core/sync/write_client_manifest.js b/packages/kit/src/core/sync/write_client_manifest.js index 1b97ed02e4c1..fe6127de934c 100644 --- a/packages/kit/src/core/sync/write_client_manifest.js +++ b/packages/kit/src/core/sync/write_client_manifest.js @@ -151,6 +151,7 @@ export function write_client_manifest(kit, manifest_data, output, metadata) { handleError: ${ client_hooks_file ? 'client_hooks.handleError || ' : '' }(({ error }) => { console.error(error) }), + ${client_hooks_file ? 'init: client_hooks.init,' : ''} reroute: ${universal_hooks_file ? 'universal_hooks.reroute || ' : ''}(() => {}) }; diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 84a3f041c322..be184575530f 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -724,6 +724,16 @@ export type HandleFetch = (input: { fetch: typeof fetch; }) => MaybePromise<Response>; +/** + * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked before the server responds to its first request + */ +export type ServerInit = () => MaybePromise<void>; + +/** + * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked once the app starts in the browser + */ +export type ClientInit = () => MaybePromise<void>; + /** * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index f36f14cb8e35..17469be00511 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -266,6 +266,9 @@ export async function start(_app, _target, hydrate) { } app = _app; + + await _app.hooks.init?.(); + routes = parse(_app); container = __SVELTEKIT_EMBEDDED__ ? _target : document.documentElement; target = _target; diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 36cbd04be16f..5aa10ac560f5 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -15,6 +15,9 @@ const prerender_env_handler = { } }; +/** @type {Promise<any>} */ +let init_promise; + export class Server { /** @type {import('types').SSROptions} */ #options; @@ -63,7 +66,9 @@ export class Server { set_read_implementation(read); } - if (!this.#options.hooks) { + // During DEV and for some adapters this function might be called in quick succession, + // so we need to make sure we're not invoking this logic (most notably the init hook) multiple times + await (init_promise ??= (async () => { try { const module = await get_hooks(); @@ -73,6 +78,10 @@ export class Server { handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request)), reroute: module.reroute || (() => {}) }; + + if (module.init) { + await module.init(); + } } catch (error) { if (DEV) { this.#options.hooks = { @@ -87,7 +96,7 @@ export class Server { throw error; } } - } + })()); } /** diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index c9dbb51ce007..cd7b1518b86a 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -17,7 +17,9 @@ import { RequestEvent, SSRManifest, Emulator, - Adapter + Adapter, + ServerInit, + ClientInit } from '@sveltejs/kit'; import { HttpMethod, @@ -109,11 +111,13 @@ export interface ServerHooks { handle: Handle; handleError: HandleServerError; reroute: Reroute; + init?: ServerInit; } export interface ClientHooks { handleError: HandleClientError; reroute: Reroute; + init?: ClientInit; } export interface Env { diff --git a/packages/kit/test/apps/basics/src/hooks.client.js b/packages/kit/test/apps/basics/src/hooks.client.js index 8e18bf084c06..3749d91b5aa3 100644 --- a/packages/kit/test/apps/basics/src/hooks.client.js +++ b/packages/kit/test/apps/basics/src/hooks.client.js @@ -8,3 +8,7 @@ export function handleError({ error, event, status, message }) { ? undefined : { message: `${/** @type {Error} */ (error).message} (${status} ${message})` }; } + +export function init() { + console.log('init hooks.client.js'); +} diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index b7cbbd9004eb..e485d038d995 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -1,7 +1,8 @@ -import fs from 'node:fs'; -import { sequence } from '@sveltejs/kit/hooks'; import { error, isHttpError, redirect } from '@sveltejs/kit'; +import { sequence } from '@sveltejs/kit/hooks'; +import fs from 'node:fs'; import { COOKIE_NAME } from './routes/cookies/shared'; +import { _set_from_init } from './routes/init-hooks/+page.server'; /** * Transform an error into a POJO, by copying its `name`, `message` @@ -154,3 +155,7 @@ export async function handleFetch({ request, fetch }) { return fetch(request); } + +export function init() { + _set_from_init(); +} diff --git a/packages/kit/test/apps/basics/src/routes/init-hooks/+page.server.ts b/packages/kit/test/apps/basics/src/routes/init-hooks/+page.server.ts new file mode 100644 index 000000000000..bccb323eaa3b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/init-hooks/+page.server.ts @@ -0,0 +1,11 @@ +let did_init_run = 0; + +export function _set_from_init() { + did_init_run++; +} + +export function load() { + return { + did_init_run + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/init-hooks/+page.svelte b/packages/kit/test/apps/basics/src/routes/init-hooks/+page.svelte new file mode 100644 index 000000000000..f421cfb32e9f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/init-hooks/+page.svelte @@ -0,0 +1,7 @@ +<script> + const { data } = $props(); +</script> + +<p>{data.did_init_run}</p> + +<a href="/init-hooks/navigate">navigate</a> diff --git a/packages/kit/test/apps/basics/src/routes/init-hooks/navigate/+page.svelte b/packages/kit/test/apps/basics/src/routes/init-hooks/navigate/+page.svelte new file mode 100644 index 000000000000..3cb4eaa0ec04 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/init-hooks/navigate/+page.svelte @@ -0,0 +1 @@ +navigated diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 56b2c96bc744..2286a6e6a234 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1186,6 +1186,29 @@ test.describe('reroute', () => { }); }); +test.describe('init', () => { + test('init client hook is called once when the application start on the client', async ({ + page + }) => { + /** + * @type string[] + */ + const logs = []; + page.addListener('console', (message) => { + if (message.type() === 'log') { + logs.push(message.text()); + } + }); + const log_event = page.waitForEvent('console'); + await page.goto('/init-hooks'); + await log_event; + expect(logs).toStrictEqual(['init hooks.client.js']); + await page.getByRole('link').first().click(); + await page.waitForLoadState('load'); + expect(logs).toStrictEqual(['init hooks.client.js']); + }); +}); + test.describe('INP', () => { test('does not block next paint', async ({ page }) => { // Thanks to https://publishing-project.rivendellweb.net/measuring-performance-tasks-with-playwright/#interaction-to-next-paint-inp diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index ff77c55f0204..3c57fc9904c2 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -648,3 +648,12 @@ test.describe('reroute', () => { expect(response?.status()).toBe(500); }); }); + +test.describe('init', () => { + test('init server hook is called once before the load function', async ({ page }) => { + await page.goto('/init-hooks'); + await expect(page.locator('p')).toHaveText('1'); + await page.reload(); + await expect(page.locator('p')).toHaveText('1'); + }); +}); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 77300bd9c243..85868fab0ac8 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -706,6 +706,16 @@ declare module '@sveltejs/kit' { fetch: typeof fetch; }) => MaybePromise<Response>; + /** + * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked before the server responds to its first request + */ + export type ServerInit = () => MaybePromise<void>; + + /** + * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked once the app starts in the browser + */ + export type ClientInit = () => MaybePromise<void>; + /** * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 From 50ec8e91916c2e2f01646809847933e40a96d6d7 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 09:24:23 -0500 Subject: [PATCH 0801/1135] Version Packages (#13130) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/eight-poems-learn.md | 5 ----- .changeset/mean-bottles-wash.md | 5 ----- .changeset/moody-pumas-sin.md | 5 ----- packages/adapter-vercel/CHANGELOG.md | 9 +++++++++ packages/adapter-vercel/package.json | 2 +- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 8 files changed, 24 insertions(+), 18 deletions(-) delete mode 100644 .changeset/eight-poems-learn.md delete mode 100644 .changeset/mean-bottles-wash.md delete mode 100644 .changeset/moody-pumas-sin.md diff --git a/.changeset/eight-poems-learn.md b/.changeset/eight-poems-learn.md deleted file mode 100644 index 62d9e4224d54..000000000000 --- a/.changeset/eight-poems-learn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: server and client `init` hook diff --git a/.changeset/mean-bottles-wash.md b/.changeset/mean-bottles-wash.md deleted file mode 100644 index 839cfa2a8a54..000000000000 --- a/.changeset/mean-bottles-wash.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: prevent hooks exported from `hooks.js` from overwriting hooks from `hooks.server.js` diff --git a/.changeset/moody-pumas-sin.md b/.changeset/moody-pumas-sin.md deleted file mode 100644 index 298b265fb876..000000000000 --- a/.changeset/moody-pumas-sin.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-vercel': patch ---- - -chore: upgrade `@vercel/nft` to 0.27.9 diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index e0d089ca75ae..4ac8af405f4b 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-vercel +## 5.5.2 +### Patch Changes + + +- chore: upgrade `@vercel/nft` to 0.27.9 ([#13129](https://github.com/sveltejs/kit/pull/13129)) + +- Updated dependencies [[`9fc5ff3339e543b956f7ce5eb31267fa73ee332a`](https://github.com/sveltejs/kit/commit/9fc5ff3339e543b956f7ce5eb31267fa73ee332a), [`85b57168189fa16fe966434ec50cc19425cab275`](https://github.com/sveltejs/kit/commit/85b57168189fa16fe966434ec50cc19425cab275)]: + - @sveltejs/kit@2.10.0 + ## 5.5.1 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 60073f01e2c5..8cd633ce9d5b 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.5.1", + "version": "5.5.2", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index af83e3cf0217..f1d6b1c504db 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.10.0 +### Minor Changes + + +- feat: server and client `init` hook ([#13103](https://github.com/sveltejs/kit/pull/13103)) + + +### Patch Changes + + +- fix: prevent hooks exported from `hooks.js` from overwriting hooks from `hooks.server.js` ([#13104](https://github.com/sveltejs/kit/pull/13104)) + ## 2.9.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 7ec03c214a65..7bbe36a8e5ff 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.9.1", + "version": "2.10.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index fe52e1b8e0ae..b7bea1e09166 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.9.1'; +export const VERSION = '2.10.0'; From 4ff86e14848e02c450626e0e0663839c7675e321 Mon Sep 17 00:00:00 2001 From: Paolo Ricciuti <ricciutipaolo@gmail.com> Date: Tue, 10 Dec 2024 15:53:37 +0100 Subject: [PATCH 0802/1135] fix: export `init` hook from `get_hooks` (#13136) * fix: export `init` hook from `get_hooks` * Create sour-pigs-talk.md * fix: create `init` variable --- .changeset/sour-pigs-talk.md | 5 +++++ packages/kit/src/core/sync/write_server.js | 4 +++- 2 files changed, 8 insertions(+), 1 deletion(-) create mode 100644 .changeset/sour-pigs-talk.md diff --git a/.changeset/sour-pigs-talk.md b/.changeset/sour-pigs-talk.md new file mode 100644 index 000000000000..5498ed229873 --- /dev/null +++ b/.changeset/sour-pigs-talk.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: export `init` hook from `get_hooks` diff --git a/packages/kit/src/core/sync/write_server.js b/packages/kit/src/core/sync/write_server.js index f4568743728e..5dabea1f1c44 100644 --- a/packages/kit/src/core/sync/write_server.js +++ b/packages/kit/src/core/sync/write_server.js @@ -67,7 +67,8 @@ export async function get_hooks() { let handle; let handleFetch; let handleError; - ${server_hooks ? `({ handle, handleFetch, handleError } = await import(${s(server_hooks)}));` : ''} + let init; + ${server_hooks ? `({ handle, handleFetch, handleError, init } = await import(${s(server_hooks)}));` : ''} let reroute; ${universal_hooks ? `({ reroute } = await import(${s(universal_hooks)}));` : ''} @@ -77,6 +78,7 @@ export async function get_hooks() { handleFetch, handleError, reroute, + init, }; } From 07e346a94c531372d7fe19cee9686f1af669a219 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 10 Dec 2024 09:56:05 -0500 Subject: [PATCH 0803/1135] Version Packages (#13137) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/sour-pigs-talk.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/sour-pigs-talk.md diff --git a/.changeset/sour-pigs-talk.md b/.changeset/sour-pigs-talk.md deleted file mode 100644 index 5498ed229873..000000000000 --- a/.changeset/sour-pigs-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/kit": patch ---- - -fix: export `init` hook from `get_hooks` diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index f1d6b1c504db..a706f155a689 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.10.1 +### Patch Changes + + +- fix: export `init` hook from `get_hooks` ([#13136](https://github.com/sveltejs/kit/pull/13136)) + ## 2.10.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 7bbe36a8e5ff..2c71d907b287 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.10.0", + "version": "2.10.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index b7bea1e09166..846bd400f21a 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.10.0'; +export const VERSION = '2.10.1'; From 33600ee3a7aaf5d93b808b525c773b3b8580bd51 Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Tue, 10 Dec 2024 10:38:49 -0500 Subject: [PATCH 0804/1135] docs: note when `init` hook was added (#13138) * docs: note when `init` hook was added * add `@since` tags * on second thoughts, just use the tags --- packages/kit/src/exports/public.d.ts | 2 ++ packages/kit/types/index.d.ts | 2 ++ 2 files changed, 4 insertions(+) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index be184575530f..70c1d8bf7e3e 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -726,11 +726,13 @@ export type HandleFetch = (input: { /** * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked before the server responds to its first request + * @since 2.10.0 */ export type ServerInit = () => MaybePromise<void>; /** * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked once the app starts in the browser + * @since 2.10.0 */ export type ClientInit = () => MaybePromise<void>; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 85868fab0ac8..bfb7468dc955 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -708,11 +708,13 @@ declare module '@sveltejs/kit' { /** * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked before the server responds to its first request + * @since 2.10.0 */ export type ServerInit = () => MaybePromise<void>; /** * The [`init`](https://svelte.dev/docs/kit/hooks#Shared-hooks-init) will be invoked once the app starts in the browser + * @since 2.10.0 */ export type ClientInit = () => MaybePromise<void>; From 11a9f66922199ee5925cc71c0efc513376753754 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Wed, 11 Dec 2024 21:57:31 +0800 Subject: [PATCH 0805/1135] fix: correctly resolve hooks entry file when directory exists (#13144) fixes #13100 This PR adds a check to see if an index file exists in the related directory before resolving to that path. Directories without an index file should correctly fallback to the non-directory path. --- .changeset/brown-bats-mate.md | 5 +++++ packages/kit/src/utils/filesystem.js | 5 +++-- packages/kit/src/utils/filesystem.spec.js | 7 +++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 .changeset/brown-bats-mate.md diff --git a/.changeset/brown-bats-mate.md b/.changeset/brown-bats-mate.md new file mode 100644 index 000000000000..3b0c4b70dabe --- /dev/null +++ b/.changeset/brown-bats-mate.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly resolve hooks file when a similarly named directory exists diff --git a/packages/kit/src/utils/filesystem.js b/packages/kit/src/utils/filesystem.js index ff83568e0358..58bcce22c7e3 100644 --- a/packages/kit/src/utils/filesystem.js +++ b/packages/kit/src/utils/filesystem.js @@ -169,8 +169,9 @@ export function from_fs(str) { export function resolve_entry(entry) { if (fs.existsSync(entry)) { const stats = fs.statSync(entry); - if (stats.isDirectory()) { - return resolve_entry(path.join(entry, 'index')); + const index = path.join(entry, 'index'); + if (stats.isDirectory() && fs.existsSync(index)) { + return resolve_entry(index); } return entry; diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index 443268314d50..e9ccf8d832a9 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -105,3 +105,10 @@ test('ignores hooks.server folder when resolving hooks', () => { expect(resolve_entry(source_dir + '/hooks')).null; }); + +test('ignores hooks folder that has no index file when resolving hooks', () => { + write('hooks/not-index.js', ''); + write('hooks.js', ''); + + expect(resolve_entry(source_dir + '/hooks')).toBe(source_dir + '/hooks'); +}); From 874989461236cc9b053f8d721cf7e0a8f26984cd Mon Sep 17 00:00:00 2001 From: Hyunbin Seo <47051820+hyunbinseo@users.noreply.github.com> Date: Thu, 12 Dec 2024 13:00:10 +0900 Subject: [PATCH 0806/1135] chore: update node-adapter listening address (#13146) --- .changeset/angry-pumas-develop.md | 5 +++++ packages/adapter-node/src/index.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/angry-pumas-develop.md diff --git a/.changeset/angry-pumas-develop.md b/.changeset/angry-pumas-develop.md new file mode 100644 index 000000000000..028dfac732e3 --- /dev/null +++ b/.changeset/angry-pumas-develop.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-node': patch +--- + +chore: append http on listening address diff --git a/packages/adapter-node/src/index.js b/packages/adapter-node/src/index.js index 1000b46f3a11..ef1ab701a2a3 100644 --- a/packages/adapter-node/src/index.js +++ b/packages/adapter-node/src/index.js @@ -39,7 +39,7 @@ if (socket_activation) { }); } else { server.listen({ path, host, port }, () => { - console.log(`Listening on ${path ? path : host + ':' + port}`); + console.log(`Listening on ${path || `http://${host}:${port}`}`); }); } From 99babf9341f1b0cfc68566de4759047c11cd4178 Mon Sep 17 00:00:00 2001 From: linnil1 <linnil1.886@gmail.com> Date: Thu, 12 Dec 2024 12:56:40 +0800 Subject: [PATCH 0807/1135] Support wrangler.json configuration file in adapter-cloudflare-workers (#13148) * feat: support wrangler.json * feat: Find the wrangler.json if the default config not found * Update packages/adapter-cloudflare-workers/index.js --------- Co-authored-by: Tee Ming <chewteeming01@gmail.com> --- .../70-adapter-cloudflare-workers.md | 4 ++-- packages/adapter-cloudflare-workers/index.js | 16 +++++++++++++--- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index bd53dd4d8e7d..e9ab68b4f085 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -34,7 +34,7 @@ export default { ### config -Path to your custom `wrangler.toml` config file. +Path to your custom `wrangler.toml` or `wrangler.json` config file. ### platformProxy @@ -42,7 +42,7 @@ Preferences for the emulated `platform.env` local bindings. See the [getPlatform ## Basic Configuration -This adapter expects to find a [wrangler.toml](https://developers.cloudflare.com/workers/platform/sites/configuration) file in the project root. It should look something like this: +This adapter expects to find a [wrangler.toml/wrangler.json](https://developers.cloudflare.com/workers/platform/sites/configuration) file in the project root. It should look something like this: ```toml /// file: wrangler.toml diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index 8a4f9252d1ac..02f8c7caff86 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -185,14 +185,24 @@ export default function ({ config = 'wrangler.toml', platformProxy = {} } = {}) * @returns {WranglerConfig} */ function validate_config(builder, config_file) { + if (!existsSync(config_file) && config_file === 'wrangler.toml' && existsSync('wrangler.json')) { + builder.log.minor('Default wrangler.toml does not exist. Using wrangler.json.'); + config_file = 'wrangler.json'; + } if (existsSync(config_file)) { /** @type {WranglerConfig} */ let wrangler_config; try { - wrangler_config = /** @type {WranglerConfig} */ ( - toml.parse(readFileSync(config_file, 'utf-8')) - ); + if (config_file.endsWith('.json')) { + wrangler_config = /** @type {WranglerConfig} */ ( + JSON.parse(readFileSync(config_file, 'utf-8')) + ); + } else { + wrangler_config = /** @type {WranglerConfig} */ ( + toml.parse(readFileSync(config_file, 'utf-8')) + ); + } } catch (err) { err.message = `Error parsing ${config_file}: ${err.message}`; throw err; From 911cd12a1be4510c1f368097f87aa467711bccfc Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Thu, 12 Dec 2024 13:19:09 +0800 Subject: [PATCH 0808/1135] chore: forgot to add changeset (#13151) --- .changeset/flat-onions-speak.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/flat-onions-speak.md diff --git a/.changeset/flat-onions-speak.md b/.changeset/flat-onions-speak.md new file mode 100644 index 000000000000..b31cdc7045d4 --- /dev/null +++ b/.changeset/flat-onions-speak.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare-workers': minor +--- + +feat: support `wrangler.json` config file From f121323901aad9ee09d97cc1c3ffdd47880b2359 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Thu, 12 Dec 2024 22:16:12 +0800 Subject: [PATCH 0809/1135] docs: add links to read function (#13154) closes #11871 --- documentation/docs/25-build-and-deploy/80-adapter-netlify.md | 2 +- documentation/docs/25-build-and-deploy/90-adapter-vercel.md | 2 +- documentation/docs/30-advanced/50-server-only-modules.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/80-adapter-netlify.md b/documentation/docs/25-build-and-deploy/80-adapter-netlify.md index 575a706ff1eb..ccba74650895 100644 --- a/documentation/docs/25-build-and-deploy/80-adapter-netlify.md +++ b/documentation/docs/25-build-and-deploy/80-adapter-netlify.md @@ -113,6 +113,6 @@ Additionally, you can add your own Netlify functions by creating a directory for You can't use `fs` in edge deployments. -You _can_ use it in serverless deployments, but it won't work as expected, since files are not copied from your project into your deployment. Instead, use the `read` function from `$app/server` to access your files. `read` does not work inside edge deployments (this may change in future). +You _can_ use it in serverless deployments, but it won't work as expected, since files are not copied from your project into your deployment. Instead, use the [`read`]($app-server#read) function from `$app/server` to access your files. `read` does not work inside edge deployments (this may change in future). Alternatively, you can [prerender](page-options#prerender) the routes in question. diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index f8150c0fd7cd..a021f7295f74 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -173,6 +173,6 @@ Projects created before a certain date may default to using an older Node versio You can't use `fs` in edge functions. -You _can_ use it in serverless functions, but it won't work as expected, since files are not copied from your project into your deployment. Instead, use the `read` function from `$app/server` to access your files. `read` does not work inside routes deployed as edge functions (this may change in future). +You _can_ use it in serverless functions, but it won't work as expected, since files are not copied from your project into your deployment. Instead, use the [`read`]($app-server#read) function from `$app/server` to access your files. `read` does not work inside routes deployed as edge functions (this may change in future). Alternatively, you can [prerender](page-options#prerender) the routes in question. diff --git a/documentation/docs/30-advanced/50-server-only-modules.md b/documentation/docs/30-advanced/50-server-only-modules.md index 54a49a2a308b..34299d1ddaf9 100644 --- a/documentation/docs/30-advanced/50-server-only-modules.md +++ b/documentation/docs/30-advanced/50-server-only-modules.md @@ -10,7 +10,7 @@ The [`$env/static/private`]($env-static-private) and [`$env/dynamic/private`]($e ## Server-only utilities -The [`$app/server`]($app-server) module, which contains a `read` function for reading assets from the filesystem, can likewise only be imported by code that runs on the server. +The [`$app/server`]($app-server) module, which contains a [`read`]($app-server#read) function for reading assets from the filesystem, can likewise only be imported by code that runs on the server. ## Your modules From 47890e05623d448e9a2d8c84eec4b80f1f066ffe Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Thu, 12 Dec 2024 22:19:58 +0800 Subject: [PATCH 0810/1135] docs: explain that +layout files do not affect +server.js (#13152) closes #12401 --- documentation/docs/20-core-concepts/10-routing.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index b54074cdd75a..c33229f851e9 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -53,7 +53,7 @@ Pages can receive data from `load` functions via the `data` prop. > [!LEGACY] > In Svelte 4, you'd use `export let data` instead -> [!NOTE] Note that SvelteKit uses `<a>` elements to navigate between routes, rather than a framework-specific `<Link>` component. +> [!NOTE] SvelteKit uses `<a>` elements to navigate between routes, rather than a framework-specific `<Link>` component. ### +page.js @@ -302,6 +302,8 @@ If an error is thrown (either `error(...)` or an unexpected error), the response > [!NOTE] When creating an `OPTIONS` handler, note that Vite will inject `Access-Control-Allow-Origin` and `Access-Control-Allow-Methods` headers — these will not be present in production unless you add them. +> [!NOTE] `+layout` files have no effect on `+server.js` files. If you want to run some logic before each request, add it to the server [`handle`](hooks#Server-hooks-handle) hook. + ### Receiving data By exporting `POST`/`PUT`/`PATCH`/`DELETE`/`OPTIONS`/`HEAD` handlers, `+server.js` files can be used to create a complete API: From 3d9e03a8a55a539b02c76d44df4874e4642bbd17 Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Thu, 12 Dec 2024 09:47:13 -0500 Subject: [PATCH 0811/1135] feat: allow serialization/deserialization of custom data types (alternative API) (#13149) * feat: allow serialization/deserialization of custom data types * feat: allow serialization/deserialization of custom data types * feat: allow serialization/deserialization of custom data types * feat: allow serialization/deserialization of custom data types * feat: allow serialization/deserialization of custom data types * add test * fix bugs * lint * improve test name * lint * alternative approach * tweak * added more tests and moved to basics * lint * fix typo * fix test * address feedback * comment * make it work * Update packages/kit/src/core/sync/write_client_manifest.js Co-authored-by: Rich Harris <richard.a.harris@gmail.com> * use universal transport hook * fix * Update packages/kit/src/core/sync/write_client_manifest.js * tweaks * add types, rename to encode/decode * docs * regenerate * changeset --------- Co-authored-by: Dominic Gannaway <dg@domgan.com> Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> Co-authored-by: Dominic Gannaway <trueadm@users.noreply.github.com> --- .changeset/fast-dragons-own.md | 5 +++ documentation/docs/30-advanced/20-hooks.md | 17 +++++++++ .../src/core/sync/write_client_manifest.js | 8 +++- packages/kit/src/core/sync/write_server.js | 6 ++- packages/kit/src/exports/public.d.ts | 37 +++++++++++++++++++ packages/kit/src/runtime/app/forms.js | 6 ++- packages/kit/src/runtime/client/client.js | 3 +- packages/kit/src/runtime/client/types.d.ts | 6 ++- packages/kit/src/runtime/server/data/index.js | 3 ++ packages/kit/src/runtime/server/index.js | 6 ++- .../kit/src/runtime/server/page/actions.js | 37 +++++++++++++++---- .../kit/src/runtime/server/page/render.js | 32 +++++++++++----- packages/kit/src/types/internal.d.ts | 5 ++- packages/kit/test/apps/basics/src/hooks.js | 9 +++++ .../kit/test/apps/basics/src/lib/index.js | 9 +++++ .../serialization-basic/+page.server.js | 5 +++ .../routes/serialization-basic/+page.svelte | 8 ++++ .../serialization-basic/child/+page.server.js | 5 +++ .../serialization-basic/child/+page.svelte | 7 ++++ .../routes/serialization-form/+page.server.js | 8 ++++ .../routes/serialization-form/+page.svelte | 9 +++++ .../serialization-form2/+page.server.js | 8 ++++ .../routes/serialization-form2/+page.svelte | 15 ++++++++ packages/kit/test/apps/basics/test/test.js | 28 ++++++++++++++ packages/kit/types/index.d.ts | 37 +++++++++++++++++++ 25 files changed, 292 insertions(+), 27 deletions(-) create mode 100644 .changeset/fast-dragons-own.md create mode 100644 packages/kit/test/apps/basics/src/lib/index.js create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-basic/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-basic/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-form/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-form2/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte diff --git a/.changeset/fast-dragons-own.md b/.changeset/fast-dragons-own.md new file mode 100644 index 000000000000..b9c82e9f8151 --- /dev/null +++ b/.changeset/fast-dragons-own.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: transport custom types across the server/client boundary diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index 9663d724fc18..bcdf21fbf9e8 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -290,6 +290,23 @@ The `lang` parameter will be correctly derived from the returned pathname. Using `reroute` will _not_ change the contents of the browser's address bar, or the value of `event.url`. +### transport + +This is a collection of _transporters_, which allow you to pass custom types — returned from `load` and form actions — across the server/client boundary. Each transporter contains an `encode` function, which encodes values on the server (or returns `false` for anything that isn't an instance of the type) and a corresponding `decode` function: + +```js +/// file: src/hooks.js +import { Vector } from '$lib/math'; + +/** @type {import('@sveltejs/kit').Transport} */ +export const transport = { + Vector: { + encode: (value) => value instanceof Vector && [value.x, value.y], + decode: ([x, y]) => new Vector(x, y) + } +}; +``` + ## Further reading diff --git a/packages/kit/src/core/sync/write_client_manifest.js b/packages/kit/src/core/sync/write_client_manifest.js index fe6127de934c..d7161fbab102 100644 --- a/packages/kit/src/core/sync/write_client_manifest.js +++ b/packages/kit/src/core/sync/write_client_manifest.js @@ -152,10 +152,14 @@ export function write_client_manifest(kit, manifest_data, output, metadata) { client_hooks_file ? 'client_hooks.handleError || ' : '' }(({ error }) => { console.error(error) }), ${client_hooks_file ? 'init: client_hooks.init,' : ''} - - reroute: ${universal_hooks_file ? 'universal_hooks.reroute || ' : ''}(() => {}) + reroute: ${universal_hooks_file ? 'universal_hooks.reroute || ' : ''}(() => {}), + transport: ${universal_hooks_file ? 'universal_hooks.transport || ' : ''}{} }; + export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode])); + + export const decode = (type, value) => decoders[type](value); + export { default as root } from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}'; ` ); diff --git a/packages/kit/src/core/sync/write_server.js b/packages/kit/src/core/sync/write_server.js index 5dabea1f1c44..90074cfd8501 100644 --- a/packages/kit/src/core/sync/write_server.js +++ b/packages/kit/src/core/sync/write_server.js @@ -71,14 +71,16 @@ export async function get_hooks() { ${server_hooks ? `({ handle, handleFetch, handleError, init } = await import(${s(server_hooks)}));` : ''} let reroute; - ${universal_hooks ? `({ reroute } = await import(${s(universal_hooks)}));` : ''} + let transport; + ${universal_hooks ? `({ reroute, transport } = await import(${s(universal_hooks)}));` : ''} return { handle, handleFetch, handleError, - reroute, init, + reroute, + transport }; } diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 70c1d8bf7e3e..c4ade48e09a2 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -742,6 +742,43 @@ export type ClientInit = () => MaybePromise<void>; */ export type Reroute = (event: { url: URL }) => void | string; +/** + * The [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook allows you to transport custom types across the server/client boundary. + * + * Each transporter has a pair of `encode` and `decode` functions. On the server, `encode` determines whether a value is an instance of the custom type and, if so, returns a non-falsy encoding of the value which can be an object or an array (or `false` otherwise). + * + * In the browser, `decode` turns the encoding back into an instance of the custom type. + * + * ```ts + * import type { Transport } from '@sveltejs/kit'; + * + * declare class MyCustomType { + * data: any + * } + * + * // hooks.js + * export const transport: Transport = { + * MyCustomType: { + * encode: (value) => value instanceof MyCustomType && [value.data], + * decode: ([data]) => new MyCustomType(data) + * } + * }; + * ``` + * @since 2.11.0 + */ +export type Transport = Record<string, Transporter>; + +/** + * A member of the [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook. + */ +export interface Transporter< + T = any, + U = Exclude<any, false | 0 | '' | null | undefined | typeof NaN> +> { + encode: (value: T) => false | U; + decode: (data: U) => T; +} + /** * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `Load` directly. diff --git a/packages/kit/src/runtime/app/forms.js b/packages/kit/src/runtime/app/forms.js index bdb4f0fa8321..0c353ea3663d 100644 --- a/packages/kit/src/runtime/app/forms.js +++ b/packages/kit/src/runtime/app/forms.js @@ -1,7 +1,7 @@ import * as devalue from 'devalue'; import { DEV } from 'esm-env'; import { invalidateAll } from './navigation.js'; -import { applyAction } from '../client/client.js'; +import { app, applyAction } from '../client/client.js'; export { applyAction }; @@ -29,9 +29,11 @@ export { applyAction }; */ export function deserialize(result) { const parsed = JSON.parse(result); + if (parsed.data) { - parsed.data = devalue.parse(parsed.data); + parsed.data = devalue.parse(parsed.data, app.decoders); } + return parsed; } diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 17469be00511..0c514f91e3bb 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -174,7 +174,7 @@ let container; /** @type {HTMLElement} */ let target; /** @type {import('./types.js').SvelteKitApp} */ -let app; +export let app; /** @type {Array<((url: URL) => boolean)>} */ const invalidated = []; @@ -2493,6 +2493,7 @@ async function load_data(url, invalid) { */ function deserialize(data) { return devalue.unflatten(data, { + ...app.decoders, Promise: (id) => { return new Promise((fulfil, reject) => { deferreds.set(id, { fulfil, reject }); diff --git a/packages/kit/src/runtime/client/types.d.ts b/packages/kit/src/runtime/client/types.d.ts index 50a78a049f1c..78b740e78393 100644 --- a/packages/kit/src/runtime/client/types.d.ts +++ b/packages/kit/src/runtime/client/types.d.ts @@ -26,6 +26,10 @@ export interface SvelteKitApp { hooks: ClientHooks; + decode: (type: string, value: any) => any; + + decoders: Record<string, (data: any) => any>; + root: typeof SvelteComponent; } @@ -54,7 +58,7 @@ export type NavigationFinished = { state: NavigationState; props: { constructors: Array<typeof SvelteComponent>; - components?: Array<SvelteComponent>; + components?: SvelteComponent[]; page: Page; form?: Record<string, any> | null; [key: `data_${number}`]: Record<string, any>; diff --git a/packages/kit/src/runtime/server/data/index.js b/packages/kit/src/runtime/server/data/index.js index b278ee31873b..6377fd7a0ef1 100644 --- a/packages/kit/src/runtime/server/data/index.js +++ b/packages/kit/src/runtime/server/data/index.js @@ -197,6 +197,9 @@ export function get_data_json(event, options, nodes) { const { iterator, push, done } = create_async_iterator(); const reducers = { + ...Object.fromEntries( + Object.entries(options.hooks.transport).map(([key, value]) => [key, value.encode]) + ), /** @param {any} thing */ Promise: (thing) => { if (typeof thing?.then === 'function') { diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 5aa10ac560f5..a2740a8e6aa4 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -76,7 +76,8 @@ export class Server { handle: module.handle || (({ event, resolve }) => resolve(event)), handleError: module.handleError || (({ error }) => console.error(error)), handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request)), - reroute: module.reroute || (() => {}) + reroute: module.reroute || (() => {}), + transport: module.transport || {} }; if (module.init) { @@ -90,7 +91,8 @@ export class Server { }, handleError: ({ error }) => console.error(error), handleFetch: ({ request, fetch }) => fetch(request), - reroute: () => {} + reroute: () => {}, + transport: {} }; } else { throw error; diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index 97e01e34d770..ed37c3e18a70 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -61,14 +61,22 @@ export async function handle_action_json_request(event, options, server) { // @ts-expect-error we assign a string to what is supposed to be an object. That's ok // because we don't use the object outside, and this way we have better code navigation // through knowing where the related interface is used. - data: stringify_action_response(data.data, /** @type {string} */ (event.route.id)) + data: stringify_action_response( + data.data, + /** @type {string} */ (event.route.id), + options.hooks.transport + ) }); } else { return action_json({ type: 'success', status: data ? 200 : 204, // @ts-expect-error see comment above - data: stringify_action_response(data, /** @type {string} */ (event.route.id)) + data: stringify_action_response( + data, + /** @type {string} */ (event.route.id), + options.hooks.transport + ) }); } } catch (e) { @@ -254,18 +262,33 @@ function validate_action_return(data) { * Try to `devalue.uneval` the data object, and if it fails, return a proper Error with context * @param {any} data * @param {string} route_id + * @param {import('types').ServerHooks['transport']} transport */ -export function uneval_action_response(data, route_id) { - return try_deserialize(data, devalue.uneval, route_id); +export function uneval_action_response(data, route_id, transport) { + const replacer = (/** @type {any} */ thing) => { + for (const key in transport) { + const encoded = transport[key].encode(thing); + if (encoded) { + return `app.decode('${key}', ${devalue.uneval(encoded, replacer)})`; + } + } + }; + + return try_serialize(data, (value) => devalue.uneval(value, replacer), route_id); } /** * Try to `devalue.stringify` the data object, and if it fails, return a proper Error with context * @param {any} data * @param {string} route_id + * @param {import('types').ServerHooks['transport']} transport */ -function stringify_action_response(data, route_id) { - return try_deserialize(data, devalue.stringify, route_id); +function stringify_action_response(data, route_id, transport) { + const encoders = Object.fromEntries( + Object.entries(transport).map(([key, value]) => [key, value.encode]) + ); + + return try_serialize(data, (value) => devalue.stringify(value, encoders), route_id); } /** @@ -273,7 +296,7 @@ function stringify_action_response(data, route_id) { * @param {(data: any) => string} fn * @param {string} route_id */ -function try_deserialize(data, fn, route_id) { +function try_serialize(data, fn, route_id) { try { return fn(data); } catch (e) { diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 6197d5ba63c6..b61935a581de 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -321,12 +321,20 @@ export async function render_response({ deferred.set(id, { fulfil, reject }); })`); + // When resolving, the id might not yet be available due to the data + // be evaluated upon init of kit, so we use a timeout to retry properties.push(`resolve: ({ id, data, error }) => { - const { fulfil, reject } = deferred.get(id); - deferred.delete(id); - - if (error) reject(error); - else fulfil(data); + const try_to_resolve = () => { + if (!deferred.has(id)) { + setTimeout(try_to_resolve, 0); + return; + } + const { fulfil, reject } = deferred.get(id); + deferred.delete(id); + if (error) reject(error); + else fulfil(data); + } + try_to_resolve(); }`); } @@ -342,12 +350,11 @@ export async function render_response({ if (page_config.ssr) { const serialized = { form: 'null', error: 'null' }; - blocks.push(`const data = ${data};`); - if (form_value) { serialized.form = uneval_action_response( form_value, - /** @type {string} */ (event.route.id) + /** @type {string} */ (event.route.id), + options.hooks.transport ); } @@ -357,7 +364,7 @@ export async function render_response({ const hydrate = [ `node_ids: [${branch.map(({ node }) => node.index).join(', ')}]`, - 'data', + `data: ${data}`, `form: ${serialized.form}`, `error: ${serialized.error}` ]; @@ -573,6 +580,13 @@ function get_data(event, options, nodes, csp, global) { ); return `${global}.defer(${id})`; + } else { + for (const key in options.hooks.transport) { + const encoded = options.hooks.transport[key].encode(thing); + if (encoded) { + return `app.decode('${key}', ${devalue.uneval(encoded, replacer)})`; + } + } } } diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index cd7b1518b86a..0c6679aab159 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -19,7 +19,8 @@ import { Emulator, Adapter, ServerInit, - ClientInit + ClientInit, + Transporter } from '@sveltejs/kit'; import { HttpMethod, @@ -111,12 +112,14 @@ export interface ServerHooks { handle: Handle; handleError: HandleServerError; reroute: Reroute; + transport: Record<string, Transporter>; init?: ServerInit; } export interface ClientHooks { handleError: HandleClientError; reroute: Reroute; + transport: Record<string, Transporter>; init?: ClientInit; } diff --git a/packages/kit/test/apps/basics/src/hooks.js b/packages/kit/test/apps/basics/src/hooks.js index 302ab5ec823c..deb1576401b0 100644 --- a/packages/kit/test/apps/basics/src/hooks.js +++ b/packages/kit/test/apps/basics/src/hooks.js @@ -1,4 +1,5 @@ import { browser } from '$app/environment'; +import { Foo } from './lib'; const mapping = { '/reroute/basic/a': '/reroute/basic/b', @@ -29,3 +30,11 @@ export const reroute = ({ url }) => { return mapping[url.pathname]; } }; + +/** @type {import("@sveltejs/kit").Transport} */ +export const transport = { + Foo: { + encode: (value) => value instanceof Foo && [value.message], + decode: ([message]) => new Foo(message) + } +}; diff --git a/packages/kit/test/apps/basics/src/lib/index.js b/packages/kit/test/apps/basics/src/lib/index.js new file mode 100644 index 000000000000..f9917fd877e2 --- /dev/null +++ b/packages/kit/test/apps/basics/src/lib/index.js @@ -0,0 +1,9 @@ +export class Foo { + constructor(message) { + this.message = message; + } + + bar() { + return this.message + '!'; + } +} diff --git a/packages/kit/test/apps/basics/src/routes/serialization-basic/+page.server.js b/packages/kit/test/apps/basics/src/routes/serialization-basic/+page.server.js new file mode 100644 index 000000000000..b9b663d17944 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-basic/+page.server.js @@ -0,0 +1,5 @@ +import { Foo } from '../../lib'; + +export function load() { + return { foo: new Foo('It works') }; +} diff --git a/packages/kit/test/apps/basics/src/routes/serialization-basic/+page.svelte b/packages/kit/test/apps/basics/src/routes/serialization-basic/+page.svelte new file mode 100644 index 000000000000..f14aca6fe2fd --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-basic/+page.svelte @@ -0,0 +1,8 @@ +<script lang="ts"> + import type { PageData } from './$types'; + + let { data }: { data: PageData } = $props(); +</script> + +<h1>{data.foo.bar()}</h1> +<a href="/serialization-basic/child">child page</a> diff --git a/packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.server.js b/packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.server.js new file mode 100644 index 000000000000..8ee85cd45184 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.server.js @@ -0,0 +1,5 @@ +import { Foo } from '../../../lib'; + +export function load() { + return { foo: new Foo('Client-side navigation also works') }; +} diff --git a/packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.svelte b/packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.svelte new file mode 100644 index 000000000000..ea812933bc2c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-basic/child/+page.svelte @@ -0,0 +1,7 @@ +<script lang="ts"> + import type { PageData } from './$types'; + + let { data }: { data: PageData } = $props(); +</script> + +<h1>{data.foo.bar()}</h1> diff --git a/packages/kit/test/apps/basics/src/routes/serialization-form/+page.server.js b/packages/kit/test/apps/basics/src/routes/serialization-form/+page.server.js new file mode 100644 index 000000000000..ec780d99e22b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-form/+page.server.js @@ -0,0 +1,8 @@ +import { Foo } from '../../lib'; + +/** @satisfies {import('./$types').Actions} */ +export const actions = { + default: async () => { + return { foo: new Foo('It works') }; + } +}; diff --git a/packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte b/packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte new file mode 100644 index 000000000000..4797a1b1a4cb --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte @@ -0,0 +1,9 @@ +<script lang="ts"> + let { form } = $props(); +</script> + +<form method="POST"> + <button type="submit">submit</button> +</form> + +<h1>{form?.foo?.bar()}</h1> diff --git a/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.server.js b/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.server.js new file mode 100644 index 000000000000..ec780d99e22b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.server.js @@ -0,0 +1,8 @@ +import { Foo } from '../../lib'; + +/** @satisfies {import('./$types').Actions} */ +export const actions = { + default: async () => { + return { foo: new Foo('It works') }; + } +}; diff --git a/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte b/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte new file mode 100644 index 000000000000..4549aab48155 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte @@ -0,0 +1,15 @@ +<script lang="ts"> + import { enhance } from '$app/forms'; + + let { form } = $props(); +</script> + +<form method="POST" use:enhance> + <button type="submit">submit</button> +</form> + +{#if form} + <h1>{form?.foo?.bar()}</h1> +{/if} + +<a href="/serialization-basic">To basic form</a> diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index fb21412290d6..8a58d393836c 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1379,3 +1379,31 @@ test.describe.serial('Cookies API', () => { expect(await span.innerText()).toContain('undefined'); }); }); + +test.describe('Serialization', () => { + test('A custom data type can be serialized/deserialized', async ({ page, clicknav }) => { + await page.goto('/serialization-basic'); + expect(await page.textContent('h1')).toBe('It works!'); + + await clicknav('[href="/serialization-basic/child"]'); + expect(await page.textContent('h1')).toBe('Client-side navigation also works!'); + }); + + test('A custom data type can be serialized/deserialized on POST', async ({ page }) => { + await page.goto('/serialization-form'); + await page.click('button'); + expect(await page.textContent('h1')).toBe('It works!'); + + // Test navigating to the basic page works as intended + await page.locator('a').first(); + expect(await page.textContent('h1')).toBe('It works!'); + }); + + test('A custom data type can be serialized/deserialized on POST with use:enhance', async ({ + page + }) => { + await page.goto('/serialization-form2'); + await page.click('button'); + expect(await page.textContent('h1')).toBe('It works!'); + }); +}); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index bfb7468dc955..b8e12835d79a 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -724,6 +724,43 @@ declare module '@sveltejs/kit' { */ export type Reroute = (event: { url: URL }) => void | string; + /** + * The [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook allows you to transport custom types across the server/client boundary. + * + * Each transporter has a pair of `encode` and `decode` functions. On the server, `encode` determines whether a value is an instance of the custom type and, if so, returns a non-falsy encoding of the value which can be an object or an array (or `false` otherwise). + * + * In the browser, `decode` turns the encoding back into an instance of the custom type. + * + * ```ts + * import type { Transport } from '@sveltejs/kit'; + * + * declare class MyCustomType { + * data: any + * } + * + * // hooks.js + * export const transport: Transport = { + * MyCustomType: { + * encode: (value) => value instanceof MyCustomType && [value.data], + * decode: ([data]) => new MyCustomType(data) + * } + * }; + * ``` + * @since 2.11.0 + */ + export type Transport = Record<string, Transporter>; + + /** + * A member of the [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook. + */ + export interface Transporter< + T = any, + U = Exclude<any, false | 0 | '' | null | undefined | typeof NaN> + > { + encode: (value: T) => false | U; + decode: (data: U) => T; + } + /** * The generic form of `PageLoad` and `LayoutLoad`. You should import those from `./$types` (see [generated types](https://svelte.dev/docs/kit/types#Generated-types)) * rather than using `Load` directly. From 5d6a8c33d3dbe169f39a07de1c9f1ba7a406adb1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 09:54:02 -0500 Subject: [PATCH 0812/1135] Version Packages (#13147) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/angry-pumas-develop.md | 5 ----- .changeset/brown-bats-mate.md | 5 ----- .changeset/fast-dragons-own.md | 5 ----- .changeset/flat-onions-speak.md | 5 ----- packages/adapter-cloudflare-workers/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare-workers/package.json | 2 +- packages/adapter-node/CHANGELOG.md | 9 +++++++++ packages/adapter-node/package.json | 2 +- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 11 files changed, 37 insertions(+), 24 deletions(-) delete mode 100644 .changeset/angry-pumas-develop.md delete mode 100644 .changeset/brown-bats-mate.md delete mode 100644 .changeset/fast-dragons-own.md delete mode 100644 .changeset/flat-onions-speak.md diff --git a/.changeset/angry-pumas-develop.md b/.changeset/angry-pumas-develop.md deleted file mode 100644 index 028dfac732e3..000000000000 --- a/.changeset/angry-pumas-develop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-node': patch ---- - -chore: append http on listening address diff --git a/.changeset/brown-bats-mate.md b/.changeset/brown-bats-mate.md deleted file mode 100644 index 3b0c4b70dabe..000000000000 --- a/.changeset/brown-bats-mate.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly resolve hooks file when a similarly named directory exists diff --git a/.changeset/fast-dragons-own.md b/.changeset/fast-dragons-own.md deleted file mode 100644 index b9c82e9f8151..000000000000 --- a/.changeset/fast-dragons-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: transport custom types across the server/client boundary diff --git a/.changeset/flat-onions-speak.md b/.changeset/flat-onions-speak.md deleted file mode 100644 index b31cdc7045d4..000000000000 --- a/.changeset/flat-onions-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare-workers': minor ---- - -feat: support `wrangler.json` config file diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md index a91453abbb70..e38e02df6eae 100644 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ b/packages/adapter-cloudflare-workers/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare-workers +## 2.7.0 +### Minor Changes + + +- feat: support `wrangler.json` config file ([#13151](https://github.com/sveltejs/kit/pull/13151)) + + +### Patch Changes + +- Updated dependencies [[`11a9f66922199ee5925cc71c0efc513376753754`](https://github.com/sveltejs/kit/commit/11a9f66922199ee5925cc71c0efc513376753754), [`3d9e03a8a55a539b02c76d44df4874e4642bbd17`](https://github.com/sveltejs/kit/commit/3d9e03a8a55a539b02c76d44df4874e4642bbd17)]: + - @sveltejs/kit@2.11.0 + ## 2.6.0 ### Minor Changes diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 7db97724aa11..49104f8155f8 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare-workers", - "version": "2.6.0", + "version": "2.7.0", "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", "keywords": [ "adapter", diff --git a/packages/adapter-node/CHANGELOG.md b/packages/adapter-node/CHANGELOG.md index 443a618cc757..3f8ccd1d9c45 100644 --- a/packages/adapter-node/CHANGELOG.md +++ b/packages/adapter-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-node +## 5.2.10 +### Patch Changes + + +- chore: append http on listening address ([#13146](https://github.com/sveltejs/kit/pull/13146)) + +- Updated dependencies [[`11a9f66922199ee5925cc71c0efc513376753754`](https://github.com/sveltejs/kit/commit/11a9f66922199ee5925cc71c0efc513376753754), [`3d9e03a8a55a539b02c76d44df4874e4642bbd17`](https://github.com/sveltejs/kit/commit/3d9e03a8a55a539b02c76d44df4874e4642bbd17)]: + - @sveltejs/kit@2.11.0 + ## 5.2.9 ### Patch Changes diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index a5410682c9bd..97e1a5eb118b 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-node", - "version": "5.2.9", + "version": "5.2.10", "description": "Adapter for SvelteKit apps that generates a standalone Node server", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index a706f155a689..f3280fa2ab75 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.11.0 +### Minor Changes + + +- feat: transport custom types across the server/client boundary ([#13149](https://github.com/sveltejs/kit/pull/13149)) + + +### Patch Changes + + +- fix: correctly resolve hooks file when a similarly named directory exists ([#13144](https://github.com/sveltejs/kit/pull/13144)) + ## 2.10.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 2c71d907b287..6a65972c1397 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.10.1", + "version": "2.11.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 846bd400f21a..d51f2dd8ff58 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.10.1'; +export const VERSION = '2.11.0'; From a1fea7e3f4f1bd589b8b29c56c3e4cc95cba8ead Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Fri, 13 Dec 2024 00:20:13 +0800 Subject: [PATCH 0813/1135] fix: adhere to Vite `build.minify` setting when building service worker (#13143) closes #11790 This PR passes the user's Vite build.minify config value to the Vite build for the service worker. --- .changeset/rotten-cheetahs-complain.md | 5 +++++ .../kit/src/exports/vite/build/build_service_worker.js | 3 ++- packages/kit/src/exports/vite/index.js | 8 +++++++- 3 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 .changeset/rotten-cheetahs-complain.md diff --git a/.changeset/rotten-cheetahs-complain.md b/.changeset/rotten-cheetahs-complain.md new file mode 100644 index 000000000000..1650a70be1a4 --- /dev/null +++ b/.changeset/rotten-cheetahs-complain.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: adhere to Vite `build.minify` setting when building the service worker diff --git a/packages/kit/src/exports/vite/build/build_service_worker.js b/packages/kit/src/exports/vite/build/build_service_worker.js index a7c11188d02a..3b7c1cfe38f9 100644 --- a/packages/kit/src/exports/vite/build/build_service_worker.js +++ b/packages/kit/src/exports/vite/build/build_service_worker.js @@ -105,7 +105,8 @@ export async function build_service_worker( } }, outDir: `${out}/client`, - emptyOutDir: false + emptyOutDir: false, + minify: vite_config.build.minify }, configFile: false, define: vite_config.define, diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index e6521e979560..2c76a71f0026 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -886,7 +886,13 @@ async function kit({ svelte_config }) { await build_service_worker( out, kit, - vite_config, + { + ...vite_config, + build: { + ...vite_config.build, + minify: initial_config.build?.minify ?? 'esbuild' + } + }, manifest_data, service_worker_entry_file, prerendered, From 8073d7c7dcc391d406c658729221a18ac6f18102 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:25:10 -0800 Subject: [PATCH 0814/1135] fix: handle duplicate SVG images --- .changeset/swift-zebras-relax.md | 5 +++++ packages/enhanced-img/src/preprocessor.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/swift-zebras-relax.md diff --git a/.changeset/swift-zebras-relax.md b/.changeset/swift-zebras-relax.md new file mode 100644 index 000000000000..a7a4328aac54 --- /dev/null +++ b/.changeset/swift-zebras-relax.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': patch +--- + +fix: handle duplicate SVG images diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js index 7069b334b955..eef343b2dda0 100644 --- a/packages/enhanced-img/src/preprocessor.js +++ b/packages/enhanced-img/src/preprocessor.js @@ -111,7 +111,7 @@ export function image(opts) { const metadata = await sharp(resolved_id).metadata(); // this must come after the await so that we don't hand off processing between getting // the imports.size and incrementing the imports.size - const name = '__IMPORTED_ASSET_' + imports.size + '__'; + const name = imports.get(original_url) || '__IMPORTED_ASSET_' + imports.size + '__'; const new_markup = `<img ${serialize_img_attributes(content, node.attributes, { src: `{${name}}`, width: metadata.width || 0, From 2129e0b9f799764400030270692b0c0a2dbbbdb5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 12 Dec 2024 14:33:55 -0800 Subject: [PATCH 0815/1135] Version Packages (#13155) Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com> --- .changeset/rotten-cheetahs-complain.md | 5 ----- .changeset/swift-zebras-relax.md | 5 ----- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 7 files changed, 15 insertions(+), 13 deletions(-) delete mode 100644 .changeset/rotten-cheetahs-complain.md delete mode 100644 .changeset/swift-zebras-relax.md diff --git a/.changeset/rotten-cheetahs-complain.md b/.changeset/rotten-cheetahs-complain.md deleted file mode 100644 index 1650a70be1a4..000000000000 --- a/.changeset/rotten-cheetahs-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: adhere to Vite `build.minify` setting when building the service worker diff --git a/.changeset/swift-zebras-relax.md b/.changeset/swift-zebras-relax.md deleted file mode 100644 index a7a4328aac54..000000000000 --- a/.changeset/swift-zebras-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': patch ---- - -fix: handle duplicate SVG images diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index d64734eb67fa..103fb8489359 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.4.4 +### Patch Changes + + +- fix: handle duplicate SVG images ([`8073d7c7dcc391d406c658729221a18ac6f18102`](https://github.com/sveltejs/kit/commit/8073d7c7dcc391d406c658729221a18ac6f18102)) + ## 0.4.3 ### Patch Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 4c58f54db65b..dd08ac13fcff 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.4.3", + "version": "0.4.4", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index f3280fa2ab75..7196414831db 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.11.1 +### Patch Changes + + +- fix: adhere to Vite `build.minify` setting when building the service worker ([#13143](https://github.com/sveltejs/kit/pull/13143)) + ## 2.11.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 6a65972c1397..bf38dc1b9ef6 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.11.0", + "version": "2.11.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index d51f2dd8ff58..3e9669175a23 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.11.0'; +export const VERSION = '2.11.1'; From 96138435fca92632582a529045793acfaf0e70a3 Mon Sep 17 00:00:00 2001 From: henrykrinkle01 <162001892+henrykrinkle01@users.noreply.github.com> Date: Sun, 15 Dec 2024 14:14:57 +0700 Subject: [PATCH 0816/1135] fix: replace $state with $derived (#13161) --- documentation/docs/20-core-concepts/50-state-management.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/20-core-concepts/50-state-management.md b/documentation/docs/20-core-concepts/50-state-management.md index be74d59535ef..3e3c5b810305 100644 --- a/documentation/docs/20-core-concepts/50-state-management.md +++ b/documentation/docs/20-core-concepts/50-state-management.md @@ -153,7 +153,7 @@ Instead, we need to make the value [_reactive_](/tutorial/svelte/state): /** @type {{ data: import('./$types').PageData }} */ let { data } = $props(); -+++ let wordCount = $state(data.content.split(' ').length); ++++ let wordCount = $derived(data.content.split(' ').length); let estimatedReadingTime = $derived(wordCount / 250);+++ </script> ``` From 88ab1093243ee77e2a0455e81ec3e22a877a5dcb Mon Sep 17 00:00:00 2001 From: Harry Allen <66224939+HarryAllen1@users.noreply.github.com> Date: Sun, 15 Dec 2024 23:21:04 -0800 Subject: [PATCH 0817/1135] docs: avoid legacy Svelte syntax (#13166) * avoid invalid svelte syntax * type submit event correctly --------- Co-authored-by: Harry Allen <66224939+MajesticString@users.noreply.github.com> --- documentation/docs/20-core-concepts/30-form-actions.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index 74d08c9fdc15..26b74d90fae2 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -430,8 +430,9 @@ We can also implement progressive enhancement ourselves, without `use:enhance`, /** @type {{ form: import('./$types').ActionData }} */ let { form } = $props(); - /** @param {{ currentTarget: EventTarget & HTMLFormElement}} event */ + /** @param {SubmitEvent & { currentTarget: EventTarget & HTMLFormElement}} event */ async function handleSubmit(event) { + event.preventDefault(); const data = new FormData(event.currentTarget); const response = await fetch(event.currentTarget.action, { @@ -451,7 +452,7 @@ We can also implement progressive enhancement ourselves, without `use:enhance`, } </script> -<form method="POST" onsubmit|preventDefault={handleSubmit}> +<form method="POST" onsubmit={handleSubmit}> <!-- content --> </form> ``` From 04642837605610219ab0a807e45d6cda08508c19 Mon Sep 17 00:00:00 2001 From: Tee Ming <chewteeming01@gmail.com> Date: Mon, 16 Dec 2024 21:25:19 +0800 Subject: [PATCH 0818/1135] chore: specify the route ID in the error message during development when making a form action request to a route without form actions (#13167) closes #11876 --- .changeset/ninety-taxis-bathe.md | 5 +++++ packages/kit/src/runtime/server/page/actions.js | 6 ++++-- packages/kit/test/apps/basics/test/server.test.js | 4 +++- 3 files changed, 12 insertions(+), 3 deletions(-) create mode 100644 .changeset/ninety-taxis-bathe.md diff --git a/.changeset/ninety-taxis-bathe.md b/.changeset/ninety-taxis-bathe.md new file mode 100644 index 000000000000..1136fa17f096 --- /dev/null +++ b/.changeset/ninety-taxis-bathe.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +chore: specify the route ID in the error message during development when making a form action request to a route without form actions diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index ed37c3e18a70..6fd2cea38f40 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -1,4 +1,5 @@ import * as devalue from 'devalue'; +import { DEV } from 'esm-env'; import { json } from '../../../exports/index.js'; import { get_status, normalize_error } from '../../../utils/error.js'; import { is_form_content_type, negotiate } from '../../../utils/http.js'; @@ -27,8 +28,9 @@ export async function handle_action_json_request(event, options, server) { const no_actions_error = new SvelteKitError( 405, 'Method Not Allowed', - 'POST method not allowed. No actions exist for this page' + `POST method not allowed. No form actions exist for ${DEV ? `the page at ${event.route.id}` : 'this page'}` ); + return action_json( { type: 'error', @@ -153,7 +155,7 @@ export async function handle_action_request(event, server) { error: new SvelteKitError( 405, 'Method Not Allowed', - 'POST method not allowed. No actions exist for this page' + `POST method not allowed. No form actions exist for ${DEV ? `the page at ${event.route.id}` : 'this page'}` ) }; } diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 3c57fc9904c2..28fdc180b3c1 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -373,7 +373,9 @@ test.describe('Errors', () => { expect(await res_json.json()).toEqual({ type: 'error', error: { - message: 'POST method not allowed. No actions exist for this page (405 Method Not Allowed)' + message: process.env.DEV + ? 'POST method not allowed. No form actions exist for the page at /errors/missing-actions (405 Method Not Allowed)' + : 'POST method not allowed. No form actions exist for this page (405 Method Not Allowed)' } }); }); From f2393eb5a09e36c6afa9f528a840bdc0011c3540 Mon Sep 17 00:00:00 2001 From: Rich Harris <richard.a.harris@gmail.com> Date: Mon, 16 Dec 2024 10:00:46 -0500 Subject: [PATCH 0819/1135] feat: add `$app/state` module (#13140) * WIP * most existing stuff working * working * paperwork * get $app/state working * prettier * stopgap * this seems to work * update most of the test files * fix * oops * navigating * whitespace is important for our test assertion * fix * adjust new tests/folder names, keep around old $app/stores-specific tests until SvelteKit 3 * adjust test * updated * docs * better dev time errors * another test * adjust documentation * nomenclature * lint * adjust test name * oops * changeset * deprecate $app/stores * fix hash link + typo * Update documentation/docs/60-appendix/40-migrating.md Co-authored-by: Tee Ming <chewteeming01@gmail.com> * fix/tweak * typos * document deprecation, link between state/stores * Apply suggestions from code review * regenerate * tweak wording * small tweaks --------- Co-authored-by: Simon Holthausen <simon.holthausen@vercel.com> Co-authored-by: Tee Ming <chewteeming01@gmail.com> --- .changeset/modern-news-repeat.md | 5 + .../10-getting-started/40-web-standards.md | 2 +- .../docs/20-core-concepts/10-routing.md | 7 +- .../docs/20-core-concepts/20-load.md | 18 ++- .../docs/20-core-concepts/30-form-actions.md | 8 +- .../20-core-concepts/50-state-management.md | 37 ++--- documentation/docs/30-advanced/25-errors.md | 9 +- .../docs/30-advanced/67-shallow-routing.md | 19 +-- .../docs/30-advanced/70-packaging.md | 2 +- .../docs/40-best-practices/20-seo.md | 2 +- .../30-migrating-to-sveltekit-2.md | 18 +++ .../docs/60-appendix/40-migrating.md | 4 +- .../docs/98-reference/20-$app-state.md | 10 ++ .../docs/98-reference/20-$app-stores.md | 2 + .../test/apps/spa/src/routes/+error.svelte | 4 +- packages/kit/scripts/generate-dts.js | 1 + packages/kit/src/exports/public.d.ts | 6 +- packages/kit/src/runtime/app/forms.js | 2 +- packages/kit/src/runtime/app/state/client.js | 84 ++++++++++++ .../kit/src/runtime/app/state/package.json | 9 ++ packages/kit/src/runtime/app/state/server.js | 60 ++++++++ packages/kit/src/runtime/app/stores.js | 7 + packages/kit/src/runtime/client/client.js | 65 +++++---- .../kit/src/runtime/client/state.svelte.js | 57 ++++++++ packages/kit/src/runtime/client/utils.js | 5 + .../runtime/components/svelte-5/error.svelte | 6 +- packages/kit/src/runtime/server/page/index.js | 2 +- .../kit/src/runtime/server/page/render.js | 15 +- packages/kit/src/types/ambient.d.ts | 4 +- packages/kit/src/types/internal.d.ts | 5 +- packages/kit/src/utils/url.js | 2 +- packages/kit/src/utils/url.spec.js | 2 +- .../apps/amp/src/routes/origin/+page.svelte | 4 +- .../test/apps/basics/src/routes/+error.svelte | 8 +- .../src/routes/actions/enhance/+page.svelte | 6 +- .../adjacent-error-boundary/+error.svelte | 4 +- .../routes/encoded/@[username]/+page.svelte | 4 +- .../src/routes/encoded/[slug]/+page.svelte | 4 +- .../encoded/escape-sequences/+layout.svelte | 4 +- .../\350\213\227\346\235\241/+page.svelte" | 8 +- .../errors/nested-error-page/+error.svelte | 6 +- .../routes/errors/page-endpoint/+error.svelte | 6 +- .../basics/src/routes/keepfocus/+page.svelte | 4 +- .../load/invalidation/multiple/+layout.svelte | 4 +- .../src/routes/load/mutated-url/+page.svelte | 10 +- .../parent/server/[x]/[y]/[z]/+page.svelte | 6 +- .../parent/shared/[x]/[y]/[z]/+page.svelte | 6 +- .../routes/load/url-query-param/+page.svelte | 6 +- .../window-fetch/outside-load/+page.svelte | 4 +- .../nested-layout/foo/bar/+error.svelte | 6 +- .../basics/src/routes/origin/+page.svelte | 4 +- .../src/routes/prerendering/+error.svelte | 4 +- .../routes/prerendering/log-url/+page.svelte | 4 +- .../basics/src/routes/query/echo/+page.svelte | 8 +- .../basics/src/routes/routing/+page.svelte | 4 +- .../src/routes/routing/[slug]/+page.svelte | 4 +- .../src/routes/routing/form-get/+page.svelte | 6 +- .../{pagestore => pagestate}/+page.svelte | 6 +- .../routing/matched/[fallback]/+page.svelte | 4 +- .../matched/[letter=lowercase]/+page.svelte | 4 +- .../matched/[letter=uppercase]/+page.svelte | 4 +- .../matched/[number=numeric]/+page.svelte | 4 +- .../preloading/hash-route/+page.svelte | 6 +- .../routing/rest/[...rest]/+page.svelte | 8 +- .../routing/rest/[...rest]/deep/+page.svelte | 8 +- .../[dynamic]-bar/[...rest]/+page.svelte | 4 +- .../non-greedy/foo/[...rest]/+page.svelte | 4 +- .../routes/routing/route-id/[x]/+page.svelte | 8 +- .../src/routes/routing/slashes/+page.svelte | 4 +- .../routing/split-params/[a]-[b]/+page.svelte | 6 +- .../trailing-slash-server/+layout.svelte | 6 +- .../routing/trailing-slash/+layout.svelte | 4 +- .../src/routes/scroll/push-state/+page.svelte | 4 +- .../routes/shadowed/error-post/+page.svelte | 11 +- .../shallow-routing/push-state/+page.svelte | 6 +- .../shallow-routing/push-state/a/+page.svelte | 4 +- .../shallow-routing/push-state/b/+page.svelte | 4 +- .../replace-state/+page.svelte | 4 +- .../replace-state/a/+page.svelte | 4 +- .../replace-state/b/+page.svelte | 4 +- .../routes/state/client-access/+page.svelte | 13 ++ .../src/routes/state/data/+error.svelte | 6 + .../basics/src/routes/state/data/+layout.js | 6 + .../src/routes/state/data/+layout.svelte | 14 ++ .../src/routes/state/data/[item]/+page.js | 17 +++ .../src/routes/state/data/[item]/+page.svelte | 0 .../basics/src/routes/state/data/foo/+page.js | 18 +++ .../src/routes/state/data/foo/+page.svelte | 6 + .../state/data/state-update/+layout.svelte | 21 +++ .../state/data/state-update/a/+page.svelte | 1 + .../state/data/state-update/b/+page.svelte | 1 + .../data/state-update/same-keys/+layout.js | 5 + .../data/state-update/same-keys/+page.svelte | 0 .../same-keys/same-deep/nested/+page.js | 5 + .../same-keys/same-deep/nested/+page.svelte | 0 .../data/state-update/same-keys/same/+page.js | 5 + .../state-update/same-keys/same/+page.svelte | 0 .../routes/state/navigating/+layout.svelte | 22 +++ .../src/routes/state/navigating/a/+page.js | 4 + .../routes/state/navigating/a/+page.svelte | 1 + .../src/routes/state/navigating/b/+page.js | 4 + .../routes/state/navigating/b/+page.svelte | 1 + .../src/routes/state/navigating/c/+page.js | 5 + .../routes/state/navigating/c/+page.svelte | 1 + .../basics/src/routes/xss/[path]/+page.svelte | 4 +- .../basics/src/routes/xss/query/+page.svelte | 8 +- .../kit/test/apps/basics/test/client.test.js | 42 +++++- .../basics/test/cross-platform/client.test.js | 10 +- packages/kit/test/apps/basics/test/test.js | 129 +++++++++++++++++- .../apps/dev-only/src/routes/+error.svelte | 4 +- .../source/pages/base/[slug]/+page.svelte | 4 +- .../options/source/pages/csp/+page.svelte | 4 +- .../custom-extensions/[slug]/+page.svelte.md | 4 +- .../pages/resolve-route/[foo]/+page.svelte | 4 +- .../options/source/pages/slash/+page.svelte | 4 +- .../source/pages/slash/child/+page.svelte | 4 +- .../src/routes/encoding/[path]/+page.svelte | 4 +- .../basics/src/routes/origin/+page.svelte | 8 +- .../src/routes/prerender-origin/+page.svelte | 4 +- .../src/routes/dynamic/[slug]/+page.svelte | 4 +- packages/kit/types/index.d.ts | 78 +++++++++-- .../basic/src/routes/app-state/+page.svelte | 5 + 122 files changed, 943 insertions(+), 271 deletions(-) create mode 100644 .changeset/modern-news-repeat.md create mode 100644 documentation/docs/98-reference/20-$app-state.md create mode 100644 packages/kit/src/runtime/app/state/client.js create mode 100644 packages/kit/src/runtime/app/state/package.json create mode 100644 packages/kit/src/runtime/app/state/server.js create mode 100644 packages/kit/src/runtime/client/state.svelte.js rename packages/kit/test/apps/basics/src/routes/routing/hashes/{pagestore => pagestate}/+page.svelte (69%) create mode 100644 packages/kit/test/apps/basics/src/routes/state/client-access/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/+error.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/[item]/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/[item]/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/foo/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/foo/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/a/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/b/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/same-keys/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/same-keys/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/same-keys/same-deep/nested/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/same-keys/same-deep/nested/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/same-keys/same/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/data/state-update/same-keys/same/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/navigating/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/navigating/a/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/navigating/a/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/navigating/b/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/navigating/b/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/state/navigating/c/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/state/navigating/c/+page.svelte create mode 100644 playgrounds/basic/src/routes/app-state/+page.svelte diff --git a/.changeset/modern-news-repeat.md b/.changeset/modern-news-repeat.md new file mode 100644 index 000000000000..406afc81b895 --- /dev/null +++ b/.changeset/modern-news-repeat.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add `$app/state` module diff --git a/documentation/docs/10-getting-started/40-web-standards.md b/documentation/docs/10-getting-started/40-web-standards.md index f31f4617fdb1..1e6afdf4af1a 100644 --- a/documentation/docs/10-getting-started/40-web-standards.md +++ b/documentation/docs/10-getting-started/40-web-standards.md @@ -78,7 +78,7 @@ Most of the time, your endpoints will return complete data, as in the `userAgent ## URL APIs -URLs are represented by the [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL) interface, which includes useful properties like `origin` and `pathname` (and, in the browser, `hash`). This interface shows up in various places — `event.url` in [hooks](hooks) and [server routes](routing#server), [`$page.url`]($app-stores) in [pages](routing#page), `from` and `to` in [`beforeNavigate` and `afterNavigate`]($app-navigation) and so on. +URLs are represented by the [`URL`](https://developer.mozilla.org/en-US/docs/Web/API/URL) interface, which includes useful properties like `origin` and `pathname` (and, in the browser, `hash`). This interface shows up in various places — `event.url` in [hooks](hooks) and [server routes](routing#server), [`page.url`]($app-state) in [pages](routing#page), `from` and `to` in [`beforeNavigate` and `afterNavigate`]($app-navigation) and so on. ### URLSearchParams diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index c33229f851e9..836b93221aab 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -132,12 +132,15 @@ If an error occurs during `load`, SvelteKit will render a default error page. Yo ```svelte <!--- file: src/routes/blog/[slug]/+error.svelte ---> <script> - import { page } from '$app/stores'; + import { page } from '$app/state'; </script> -<h1>{$page.status}: {$page.error.message}</h1> +<h1>{page.status}: {page.error.message}</h1> ``` +> [!LEGACY] +> `$app/state` was added in SvelteKit 2.12. If you're using an earlier version or are using Svelte 4, use `$app/stores` instead. + SvelteKit will 'walk up the tree' looking for the closest error boundary — if the file above didn't exist it would try `src/routes/blog/+error.svelte` and then `src/routes/+error.svelte` before rendering the default error page. If _that_ fails (or if the error was thrown from the `load` function of the root `+layout`, which sits 'above' the root `+error`), SvelteKit will bail out and render a static fallback error page, which you can customise by creating a `src/error.html` file. If the error occurs inside a `load` function in `+layout(.server).js`, the closest error boundary in the tree is an `+error.svelte` file _above_ that layout (not next to it). diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index bba63fd2be93..269d9078dd14 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -116,14 +116,14 @@ Data returned from layout `load` functions is available to child `+layout.svelte ```svelte /// file: src/routes/blog/[slug]/+page.svelte <script> - +++import { page } from '$app/stores';+++ + +++import { page } from '$app/state';+++ /** @type {{ data: import('./$types').PageData }} */ let { data } = $props(); +++ // we can access `data.posts` because it's returned from // the parent layout `load` function - let index = $derived(data.posts.findIndex(post => post.slug === $page.params.slug)); + let index = $derived(data.posts.findIndex(post => post.slug === page.params.slug)); let next = $derived(data.posts[index + 1]);+++ </script> @@ -137,24 +137,28 @@ Data returned from layout `load` functions is available to child `+layout.svelte > [!NOTE] If multiple `load` functions return data with the same key, the last one 'wins' — the result of a layout `load` returning `{ a: 1, b: 2 }` and a page `load` returning `{ b: 3, c: 4 }` would be `{ a: 1, b: 3, c: 4 }`. -## $page.data +## page.data The `+page.svelte` component, and each `+layout.svelte` component above it, has access to its own data plus all the data from its parents. -In some cases, we might need the opposite — a parent layout might need to access page data or data from a child layout. For example, the root layout might want to access a `title` property returned from a `load` function in `+page.js` or `+page.server.js`. This can be done with `$page.data`: +In some cases, we might need the opposite — a parent layout might need to access page data or data from a child layout. For example, the root layout might want to access a `title` property returned from a `load` function in `+page.js` or `+page.server.js`. This can be done with `page.data`: ```svelte <!--- file: src/routes/+layout.svelte ---> <script> - import { page } from '$app/stores'; + import { page } from '$app/state'; </script> <svelte:head> - <title>{$page.data.title} + {page.data.title} ``` -Type information for `$page.data` is provided by `App.PageData`. +Type information for `page.data` is provided by `App.PageData`. + +> [!LEGACY] +> `$app/state` was added in SvelteKit 2.12. If you're using an earlier version or are using Svelte 4, use `$app/stores` instead. +> It provides a `page` store with the same interface that you can subscribe to, e.g. `$page.data.title`. ## Universal vs server diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index 26b74d90fae2..1ef5d576f58e 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -102,7 +102,7 @@ As well as the `action` attribute, we can use the `formaction` attribute on a bu ## Anatomy of an action -Each action receives a `RequestEvent` object, allowing you to read the data with `request.formData()`. After processing the request (for example, logging the user in by setting a cookie), the action can respond with data that will be available through the `form` property on the corresponding page and through `$page.form` app-wide until the next update. +Each action receives a `RequestEvent` object, allowing you to read the data with `request.formData()`. After processing the request (for example, logging the user in by setting a cookie), the action can respond with data that will be available through the `form` property on the corresponding page and through `page.form` app-wide until the next update. ```js /// file: src/routes/login/+page.server.js @@ -156,7 +156,7 @@ export const actions = { ### Validation errors -If the request couldn't be processed because of invalid data, you can return validation errors — along with the previously submitted form values — back to the user so that they can try again. The `fail` function lets you return an HTTP status code (typically 400 or 422, in the case of validation errors) along with the data. The status code is available through `$page.status` and the data through `form`: +If the request couldn't be processed because of invalid data, you can return validation errors — along with the previously submitted form values — back to the user so that they can try again. The `fail` function lets you return an HTTP status code (typically 400 or 422, in the case of validation errors) along with the data. The status code is available through `page.status` and the data through `form`: ```js /// file: src/routes/login/+page.server.js @@ -352,7 +352,7 @@ The easiest way to progressively enhance a form is to add the `use:enhance` acti Without an argument, `use:enhance` will emulate the browser-native behaviour, just without the full-page reloads. It will: -- update the `form` property, `$page.form` and `$page.status` on a successful or invalid response, but only if the action is on the same page you're submitting from. For example, if your form looks like ``, `form` and `$page` will _not_ be updated. This is because in the native form submission case you would be redirected to the page the action is on. If you want to have them updated either way, use [`applyAction`](#Progressive-enhancement-Customising-use:enhance) +- update the `form` property, `page.form` and `page.status` on a successful or invalid response, but only if the action is on the same page you're submitting from. For example, if your form looks like ``, the `form` prop and the `page.form` state will _not_ be updated. This is because in the native form submission case you would be redirected to the page the action is on. If you want to have them updated either way, use [`applyAction`](#Progressive-enhancement-Customising-use:enhance) - reset the `` element - invalidate all data using `invalidateAll` on a successful response - call `goto` on a redirect response @@ -411,7 +411,7 @@ If you return a callback, you may need to reproduce part of the default `use:enh The behaviour of `applyAction(result)` depends on `result.type`: -- `success`, `failure` — sets `$page.status` to `result.status` and updates `form` and `$page.form` to `result.data` (regardless of where you are submitting from, in contrast to `update` from `enhance`) +- `success`, `failure` — sets `page.status` to `result.status` and updates `form` and `page.form` to `result.data` (regardless of where you are submitting from, in contrast to `update` from `enhance`) - `redirect` — calls `goto(result.location, { invalidateAll: true })` - `error` — renders the nearest `+error` boundary with `result.error` diff --git a/documentation/docs/20-core-concepts/50-state-management.md b/documentation/docs/20-core-concepts/50-state-management.md index 3e3c5b810305..1cd541686f84 100644 --- a/documentation/docs/20-core-concepts/50-state-management.md +++ b/documentation/docs/20-core-concepts/50-state-management.md @@ -40,7 +40,7 @@ Instead, you should _authenticate_ the user using [`cookies`](load#Cookies) and ## No side-effects in load -For the same reason, your `load` functions should be _pure_ — no side-effects (except maybe the occasional `console.log(...)`). For example, you might be tempted to write to a store inside a `load` function so that you can use the store value in your components: +For the same reason, your `load` functions should be _pure_ — no side-effects (except maybe the occasional `console.log(...)`). For example, you might be tempted to write to a store or global state inside a `load` function so that you can use the value in your components: ```js /// file: +page.js @@ -76,31 +76,25 @@ export async function load({ fetch }) { } ``` -...and pass it around to the components that need it, or use [`$page.data`](load#$page.data). +...and pass it around to the components that need it, or use [`page.data`](load#page.data). If you're not using SSR, then there's no risk of accidentally exposing one user's data to another. But you should still avoid side-effects in your `load` functions — your application will be much easier to reason about without them. -## Using stores with context +## Using state and stores with context -You might wonder how we're able to use `$page.data` and other [app stores]($app-stores) if we can't use our own stores. The answer is that app stores on the server use Svelte's [context API](/tutorial/svelte/context-api) — the store is attached to the component tree with `setContext`, and when you subscribe you retrieve it with `getContext`. We can do the same thing with our own stores: +You might wonder how we're able to use `page.data` and other [app state]($app-state) (or [app stores]($app-stores)) if we can't use global state. The answer is that app state and app stores on the server use Svelte's [context API](/tutorial/svelte/context-api) — the state (or store) is attached to the component tree with `setContext`, and when you subscribe you retrieve it with `getContext`. We can do the same thing with our own state: ```svelte ``` @@ -113,10 +107,15 @@ You might wonder how we're able to use `$page.data` and other [app stores]($app- const user = getContext('user'); -

Welcome {$user.name}

+

Welcome {user().name}

``` -Updating the value of a context-based store in deeper-level pages or components while the page is being rendered via SSR will not affect the value in the parent component because it has already been rendered by the time the store value is updated. In contrast, on the client (when CSR is enabled, which is the default) the value will be propagated and components, pages, and layouts higher in the hierarchy will react to the new value. Therefore, to avoid values 'flashing' during state updates during hydration, it is generally recommended to pass state down into components rather than up. +> [!NOTE] We're passing a function into `setContext` to keep reactivity across boundaries. Read more about it [here](https://svelte.dev/docs/svelte/$state#Passing-state-into-functions) + +> [!LEGACY] +> You also use stores from `svelte/store` for this, but when using Svelte 5 it is recommended to make use of universal reactivity instead. + +Updating the value of context-based state in deeper-level pages or components while the page is being rendered via SSR will not affect the value in the parent component because it has already been rendered by the time the state value is updated. In contrast, on the client (when CSR is enabled, which is the default) the value will be propagated and components, pages, and layouts higher in the hierarchy will react to the new value. Therefore, to avoid values 'flashing' during state updates during hydration, it is generally recommended to pass state down into components rather than up. If you're not using SSR (and can guarantee that you won't need to use SSR in future) then you can safely keep state in a shared module, without using the context API. @@ -163,14 +162,18 @@ Instead, we need to make the value [_reactive_](/tutorial/svelte/state): Reusing components like this means that things like sidebar scroll state are preserved, and you can easily animate between changing values. In the case that you do need to completely destroy and remount a component on navigation, you can use this pattern: ```svelte -{#key $page.url.pathname} + + +{#key page.url.pathname} {/key} ``` ## Storing state in the URL -If you have state that should survive a reload and/or affect SSR, such as filters or sorting rules on a table, URL search parameters (like `?sort=price&order=ascending`) are a good place to put them. You can put them in `
` or `` attributes, or set them programmatically via `goto('?key=value')`. They can be accessed inside `load` functions via the `url` parameter, and inside components via `$page.url.searchParams`. +If you have state that should survive a reload and/or affect SSR, such as filters or sorting rules on a table, URL search parameters (like `?sort=price&order=ascending`) are a good place to put them. You can put them in `` or `` attributes, or set them programmatically via `goto('?key=value')`. They can be accessed inside `load` functions via the `url` parameter, and inside components via `page.url.searchParams`. ## Storing ephemeral state in snapshots diff --git a/documentation/docs/30-advanced/25-errors.md b/documentation/docs/30-advanced/25-errors.md index 5fd17455add9..df05e5310232 100644 --- a/documentation/docs/30-advanced/25-errors.md +++ b/documentation/docs/30-advanced/25-errors.md @@ -40,17 +40,20 @@ export async function load({ params }) { } ``` -This throws an exception that SvelteKit catches, causing it to set the response status code to 404 and render an [`+error.svelte`](routing#error) component, where `$page.error` is the object provided as the second argument to `error(...)`. +This throws an exception that SvelteKit catches, causing it to set the response status code to 404 and render an [`+error.svelte`](routing#error) component, where `page.error` is the object provided as the second argument to `error(...)`. ```svelte -

{$page.error.message}

+

{page.error.message}

``` +> [!LEGACY] +> `$app/state` was added in SvelteKit 2.12. If you're using an earlier version or are using Svelte 4, use `$app/stores` instead. + You can add extra properties to the error object if needed... ```js diff --git a/documentation/docs/30-advanced/67-shallow-routing.md b/documentation/docs/30-advanced/67-shallow-routing.md index af7d38959946..b69cee744fb1 100644 --- a/documentation/docs/30-advanced/67-shallow-routing.md +++ b/documentation/docs/30-advanced/67-shallow-routing.md @@ -12,7 +12,7 @@ SvelteKit makes this possible with the [`pushState`]($app-navigation#pushState) -{#if $page.state.showModal} +{#if page.state.showModal} history.back()} /> {/if} ``` -The modal can be dismissed by navigating back (unsetting `$page.state.showModal`) or by interacting with it in a way that causes the `close` callback to run, which will navigate back programmatically. +The modal can be dismissed by navigating back (unsetting `page.state.showModal`) or by interacting with it in a way that causes the `close` callback to run, which will navigate back programmatically. ## API The first argument to `pushState` is the URL, relative to the current URL. To stay on the current URL, use `''`. -The second argument is the new page state, which can be accessed via the [page store]($app-stores#page) as `$page.state`. You can make page state type-safe by declaring an [`App.PageState`](types#PageState) interface (usually in `src/app.d.ts`). +The second argument is the new page state, which can be accessed via the [page object]($app-state#page) as `page.state`. You can make page state type-safe by declaring an [`App.PageState`](types#PageState) interface (usually in `src/app.d.ts`). To set page state without creating a new history entry, use `replaceState` instead of `pushState`. +> [!LEGACY] +> `page.state` from `$app/state` was added in SvelteKit 2.12. If you're using an earlier version or are using Svelte 4, use `$page.state` from `$app/stores` instead. + ## Loading data for a route When shallow routing, you may want to render another `+page.svelte` inside the current page. For example, clicking on a photo thumbnail could pop up the detail view without navigating to the photo page. @@ -47,7 +50,7 @@ For this to work, you need to load the data that the `+page.svelte` expects. A c + +---{$page.data}--- ++++{page.data}+++ +``` + +Use `npx sv migrate app-state` to auto-migrate most of your `$app/stores` usages inside `.svelte` components. diff --git a/documentation/docs/60-appendix/40-migrating.md b/documentation/docs/60-appendix/40-migrating.md index 18c13db6b5ea..2fbafe307a53 100644 --- a/documentation/docs/60-appendix/40-migrating.md +++ b/documentation/docs/60-appendix/40-migrating.md @@ -115,7 +115,7 @@ const { preloading, page, session } = stores(); The `page` store still exists; `preloading` has been replaced with a `navigating` store that contains `from` and `to` properties. `page` now has `url` and `params` properties, but no `path` or `query`. -You access them differently in SvelteKit. `stores` is now `getStores`, but in most cases it is unnecessary since you can import `navigating`, and `page` directly from [`$app/stores`]($app-stores). +You access them differently in SvelteKit. `stores` is now `getStores`, but in most cases it is unnecessary since you can import `navigating`, and `page` directly from [`$app/stores`]($app-stores). If you're on Svelte 5 and SvelteKit 2.12 or higher, consider using [`$app/state`]($app-state) instead. ### Routing @@ -123,7 +123,7 @@ Regex routes are no longer supported. Instead, use [advanced route matching](adv ### Segments -Previously, layout components received a `segment` prop indicating the child segment. This has been removed; you should use the more flexible `$page.url.pathname` value to derive the segment you're interested in. +Previously, layout components received a `segment` prop indicating the child segment. This has been removed; you should use the more flexible `$page.url.pathname` (or `page.url.pathname`) value to derive the segment you're interested in. ### URLs diff --git a/documentation/docs/98-reference/20-$app-state.md b/documentation/docs/98-reference/20-$app-state.md new file mode 100644 index 000000000000..f61475fd9e15 --- /dev/null +++ b/documentation/docs/98-reference/20-$app-state.md @@ -0,0 +1,10 @@ +--- +title: $app/state +--- + +SvelteKit makes three readonly state objects available via the `$app/state` module — `page`, `navigating` and `updated`. + +> [!NOTE] +> This module was added in 2.12. If you're using an earlier version of SvelteKit, use [`$app/stores`]($app-stores) instead. + +> MODULE: $app/state diff --git a/documentation/docs/98-reference/20-$app-stores.md b/documentation/docs/98-reference/20-$app-stores.md index 0e5604f5d7ef..ff7cf8999e82 100644 --- a/documentation/docs/98-reference/20-$app-stores.md +++ b/documentation/docs/98-reference/20-$app-stores.md @@ -2,4 +2,6 @@ title: $app/stores --- +This module contains store-based equivalents of the exports from [`$app/state`]($app-state). If you're using SvelteKit 2.12 or later, use that module instead. + > MODULE: $app/stores diff --git a/packages/adapter-static/test/apps/spa/src/routes/+error.svelte b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte index 9b0abbfdda47..fe313e063894 100644 --- a/packages/adapter-static/test/apps/spa/src/routes/+error.svelte +++ b/packages/adapter-static/test/apps/spa/src/routes/+error.svelte @@ -1,5 +1,5 @@ -

{$page.status}

+

{page.status}

diff --git a/packages/kit/scripts/generate-dts.js b/packages/kit/scripts/generate-dts.js index 8d21d7881d7f..c10dad802433 100644 --- a/packages/kit/scripts/generate-dts.js +++ b/packages/kit/scripts/generate-dts.js @@ -14,6 +14,7 @@ await createBundle({ '$app/navigation': 'src/runtime/app/navigation.js', '$app/paths': 'src/runtime/app/paths/types.d.ts', '$app/server': 'src/runtime/app/server/index.js', + '$app/state': 'src/runtime/app/state/client.js', '$app/stores': 'src/runtime/app/stores.js' }, include: ['src'] diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index c4ade48e09a2..4dd2d48cb5a6 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -638,17 +638,17 @@ export interface KitConfig { * /// file: +layout.svelte * * ``` * - * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of the [`updated`](https://svelte.dev/docs/kit/$app-stores#updated) store to `true` when it detects one. + * If you set `pollInterval` to a non-zero value, SvelteKit will poll for new versions in the background and set the value of [`updated.current`](https://svelte.dev/docs/kit/$app-state#updated) `true` when it detects one. */ version?: { /** diff --git a/packages/kit/src/runtime/app/forms.js b/packages/kit/src/runtime/app/forms.js index 0c353ea3663d..ffa402489548 100644 --- a/packages/kit/src/runtime/app/forms.js +++ b/packages/kit/src/runtime/app/forms.js @@ -59,7 +59,7 @@ function clone(element) { * * If this function or its return value isn't set, it * - falls back to updating the `form` prop with the returned data if the action is on the same page as the form - * - updates `$page.status` + * - updates `page.status` * - resets the `` element and invalidates all data in case of successful submission with no redirect response * - redirects in case of a redirect response * - redirects to the nearest error page in case of an unexpected error diff --git a/packages/kit/src/runtime/app/state/client.js b/packages/kit/src/runtime/app/state/client.js new file mode 100644 index 000000000000..47d806879a3f --- /dev/null +++ b/packages/kit/src/runtime/app/state/client.js @@ -0,0 +1,84 @@ +import { + page as _page, + navigating as _navigating, + updated as _updated +} from '../../client/state.svelte.js'; +import { stores } from '../../client/client.js'; + +/** + * A reactive object with information about the current page, serving several use cases: + * - retrieving the combined `data` of all pages/layouts anywhere in your component tree (also see [loading data](https://svelte.dev/docs/kit/load)) + * - retrieving the current value of the `form` prop anywhere in your component tree (also see [form actions](https://svelte.dev/docs/kit/form-actions)) + * - retrieving the page state that was set through `goto`, `pushState` or `replaceState` (also see [goto](https://svelte.dev/docs/kit/$app-navigation#goto) and [shallow routing](https://svelte.dev/docs/kit/shallow-routing)) + * - retrieving metadata such as the URL you're on, the current route and its parameters, and whether or not there was an error + * + * ```svelte + * + * + * + *

Currently at {page.url.pathname}

+ * + * {#if page.error} + * Problem detected + * {:else} + * All systems operational + * {/if} + * ``` + * + * On the server, values can only be read during rendering (in other words _not_ in e.g. `load` functions). In the browser, the values can be read at any time. + * + * @type {import('@sveltejs/kit').Page} + */ +export const page = { + get data() { + return _page.data; + }, + get error() { + return _page.error; + }, + get form() { + return _page.form; + }, + get params() { + return _page.params; + }, + get route() { + return _page.route; + }, + get state() { + return _page.state; + }, + get status() { + return _page.status; + }, + get url() { + return _page.url; + } +}; + +/** + * An object with a reactive `current` property. + * When navigation starts, `current` is a `Navigation` object with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties. + * When navigation finishes, `current` reverts to `null`. + * + * On the server, this value can only be read during rendering. In the browser, it can be read at any time. + * @type {{ get current(): import('@sveltejs/kit').Navigation | null; }} + */ +export const navigating = { + get current() { + return _navigating.current; + } +}; + +/** + * A reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. + * @type {{ get current(): boolean; check(): Promise; }} + */ +export const updated = { + get current() { + return _updated.current; + }, + check: stores.updated.check +}; diff --git a/packages/kit/src/runtime/app/state/package.json b/packages/kit/src/runtime/app/state/package.json new file mode 100644 index 000000000000..02450fde3884 --- /dev/null +++ b/packages/kit/src/runtime/app/state/package.json @@ -0,0 +1,9 @@ +{ + "type": "module", + "exports": { + ".": { + "browser": "./client.js", + "default": "./server.js" + } + } +} diff --git a/packages/kit/src/runtime/app/state/server.js b/packages/kit/src/runtime/app/state/server.js new file mode 100644 index 000000000000..770a85a739f8 --- /dev/null +++ b/packages/kit/src/runtime/app/state/server.js @@ -0,0 +1,60 @@ +import { getContext } from 'svelte'; + +function context() { + return getContext('__request__'); +} + +/** @param {string} name */ +function context_dev(name) { + try { + return context(); + } catch { + throw new Error( + `Can only read '${name}' on the server during rendering (not in e.g. \`load\` functions), as it is bound to the current request via component context. This prevents state from leaking between users.` + + 'For more information, see https://svelte.dev/docs/kit/state-management#avoid-shared-state-on-the-server' + ); + } +} + +// TODO we're using DEV in some places and __SVELTEKIT_DEV__ in others - why? Can we consolidate? +export const page = { + get data() { + return (__SVELTEKIT_DEV__ ? context_dev('page.data') : context()).page.data; + }, + get error() { + return (__SVELTEKIT_DEV__ ? context_dev('page.error') : context()).page.error; + }, + get form() { + return (__SVELTEKIT_DEV__ ? context_dev('page.form') : context()).page.form; + }, + get params() { + return (__SVELTEKIT_DEV__ ? context_dev('page.params') : context()).page.params; + }, + get route() { + return (__SVELTEKIT_DEV__ ? context_dev('page.route') : context()).page.route; + }, + get state() { + return (__SVELTEKIT_DEV__ ? context_dev('page.state') : context()).page.state; + }, + get status() { + return (__SVELTEKIT_DEV__ ? context_dev('page.status') : context()).page.status; + }, + get url() { + return (__SVELTEKIT_DEV__ ? context_dev('page.url') : context()).page.url; + } +}; + +export const navigating = { + get current() { + return (__SVELTEKIT_DEV__ ? context_dev('navigating.current') : context()).navigating; + } +}; + +export const updated = { + get current() { + return false; + }, + check: () => { + throw new Error('Can only call updated.check() in the browser'); + } +}; diff --git a/packages/kit/src/runtime/app/stores.js b/packages/kit/src/runtime/app/stores.js index da4b02db836e..3c4bac7e1d7b 100644 --- a/packages/kit/src/runtime/app/stores.js +++ b/packages/kit/src/runtime/app/stores.js @@ -5,6 +5,8 @@ import { stores as browser_stores } from '../client/client.js'; /** * A function that returns all of the contextual stores. On the server, this must be called during component initialization. * Only use this if you need to defer store subscription until after the component has mounted, for some reason. + * + * @deprecated Use `$app/state` instead (requires Svelte 5, [see docs for more info](https://svelte.dev/docs/kit/migrating-to-sveltekit-2#SvelteKit-2.12:-$app-stores-deprecated)) */ export const getStores = () => { const stores = BROWSER ? browser_stores : getContext('__svelte__'); @@ -28,6 +30,7 @@ export const getStores = () => { * * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. * + * @deprecated Use `page` from `$app/state` instead (requires Svelte 5, [see docs for more info](https://svelte.dev/docs/kit/migrating-to-sveltekit-2#SvelteKit-2.12:-$app-stores-deprecated)) * @type {import('svelte/store').Readable} */ export const page = { @@ -43,6 +46,8 @@ export const page = { * When navigating finishes, its value reverts to `null`. * * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. + * + * @deprecated Use `navigating` from `$app/state` instead (requires Svelte 5, [see docs for more info](https://svelte.dev/docs/kit/migrating-to-sveltekit-2#SvelteKit-2.12:-$app-stores-deprecated)) * @type {import('svelte/store').Readable} */ export const navigating = { @@ -56,6 +61,8 @@ export const navigating = { * A readable store whose initial value is `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update the store value to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. * * On the server, this store can only be subscribed to during component initialization. In the browser, it can be subscribed to at any time. + * + * @deprecated Use `updated` from `$app/state` instead (requires Svelte 5, [see docs for more info](https://svelte.dev/docs/kit/migrating-to-sveltekit-2#SvelteKit-2.12:-$app-stores-deprecated)) * @type {import('svelte/store').Readable & { check(): Promise }} */ export const updated = { diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 0c514f91e3bb..d03baae091b0 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -45,6 +45,7 @@ import { HttpError, Redirect, SvelteKitError } from '../control.js'; import { INVALIDATED_PARAM, TRAILING_SLASH_PARAM, validate_depends } from '../shared.js'; import { get_message, get_status } from '../../utils/error.js'; import { writable } from 'svelte/store'; +import { page, update, navigating } from './state.svelte.js'; const ICON_REL_ATTRIBUTES = new Set(['icon', 'shortcut icon', 'apple-touch-icon']); @@ -212,7 +213,7 @@ let hydrated = false; let started = false; let autoscroll = true; let updating = false; -let navigating = false; +let is_navigating = false; let hash_navigating = false; /** True as soon as there happened one client-side navigation (excluding the SvelteKit-initialized initial one when in SPA mode) */ let has_navigated = false; @@ -228,9 +229,6 @@ let current_history_index; /** @type {number} */ let current_navigation_index; -/** @type {import('@sveltejs/kit').Page} */ -let page; - /** @type {{}} */ let token; @@ -341,11 +339,12 @@ async function _invalidate() { } if (navigation_result.props.page) { - page = navigation_result.props.page; + Object.assign(page, navigation_result.props.page); } current = navigation_result.state; reset_invalidation(); root.$set(navigation_result.props); + update(navigation_result.props.page); } function reset_invalidation() { @@ -447,7 +446,7 @@ function initialize(result, target, hydrate) { const style = document.querySelector('style[data-sveltekit]'); if (style) style.remove(); - page = /** @type {import('@sveltejs/kit').Page} */ (result.props.page); + Object.assign(page, /** @type {import('@sveltejs/kit').Page} */ (result.props.page)); root = new app.root({ target, @@ -1240,7 +1239,7 @@ function _before_navigate({ url, type, intent, delta }) { } }; - if (!navigating) { + if (!is_navigating) { // Don't run the event during redirects before_navigate_callbacks.forEach((fn) => fn(cancellable)); } @@ -1294,10 +1293,10 @@ async function navigate({ accept(); - navigating = true; + is_navigating = true; if (started) { - stores.navigating.set(nav.navigation); + stores.navigating.set((navigating.current = nav.navigation)); } token = nav_token; @@ -1423,6 +1422,7 @@ async function navigate({ } root.$set(navigation_result.props); + update(navigation_result.props.page); has_navigated = true; } else { initialize(navigation_result, target, false); @@ -1464,10 +1464,10 @@ async function navigate({ autoscroll = true; if (navigation_result.props.page) { - page = navigation_result.props.page; + Object.assign(page, navigation_result.props.page); } - navigating = false; + is_navigating = false; if (type === 'popstate') { restore_snapshot(current_navigation_index); @@ -1479,7 +1479,7 @@ async function navigate({ fn(/** @type {import('@sveltejs/kit').AfterNavigate} */ (nav.navigation)) ); - stores.navigating.set(null); + stores.navigating.set((navigating.current = null)); updating = false; } @@ -1722,7 +1722,9 @@ export function disableScrollHandling() { } /** + * Allows you to navigate programmatically to a given route, with options such as keeping the current element focused. * Returns a Promise that resolves when SvelteKit navigates (or fails to navigate, in which case the promise rejects) to the specified `url`. + * * For external URLs, use `window.location = url` instead of calling `goto(url)`. * * @param {string | URL} url Where to navigate to. Note that if you've set [`config.kit.paths.base`](https://svelte.dev/docs/kit/configuration#paths) and the URL is root-relative, you need to prepend the base path if you want to navigate within the app. @@ -1731,7 +1733,7 @@ export function disableScrollHandling() { * @param {boolean} [opts.noScroll] If `true`, the browser will maintain its scroll position rather than scrolling to the top of the page after navigation * @param {boolean} [opts.keepFocus] If `true`, the currently focused element will retain focus after navigation. Otherwise, focus will be reset to the body * @param {boolean} [opts.invalidateAll] If `true`, all `load` functions of the page will be rerun. See https://svelte.dev/docs/kit/load#rerunning-load-functions for more info on invalidation. - * @param {App.PageState} [opts.state] An optional object that will be available on the `$page.state` store + * @param {App.PageState} [opts.state] An optional object that will be available as `page.state` * @returns {Promise} */ export function goto(url, opts = {}) { @@ -1869,7 +1871,7 @@ export function preloadCode(pathname) { } /** - * Programmatically create a new history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). + * Programmatically create a new history entry with the given `page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). * * @param {string | URL} url * @param {App.PageState} state @@ -1906,14 +1908,14 @@ export function pushState(url, state) { history.pushState(opts, '', resolve_url(url)); has_navigated = true; - page = { ...page, state }; + page.state = state; root.$set({ page }); clear_onward_history(current_history_index, current_navigation_index); } /** - * Programmatically replace the current history entry with the given `$page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). + * Programmatically replace the current history entry with the given `page.state`. To use the current URL, you can pass `''` as the first argument. Used for [shallow routing](https://svelte.dev/docs/kit/shallow-routing). * * @param {string | URL} url * @param {App.PageState} state @@ -1947,12 +1949,12 @@ export function replaceState(url, state) { history.replaceState(opts, '', resolve_url(url)); - page = { ...page, state }; + page.state = state; root.$set({ page }); } /** - * This action updates the `form` property of the current page with the given data and updates `$page.status`. + * This action updates the `form` property of the current page with the given data and updates `page.status`. * In case of an error, it redirects to the nearest error page. * @template {Record | undefined} Success * @template {Record | undefined} Failure @@ -1984,18 +1986,22 @@ export async function applyAction(result) { current = navigation_result.state; root.$set(navigation_result.props); + update(navigation_result.props.page); tick().then(reset_focus); } } else if (result.type === 'redirect') { _goto(result.location, { invalidateAll: true }, 0); } else { + page.form = result.data; + page.status = result.status; + /** @type {Record} */ root.$set({ // this brings Svelte's view of the world in line with SvelteKit's // after use:enhance reset the form.... form: null, - page: { ...page, form: result.data, status: result.status } + page }); // ...so that setting the `form` prop takes effect and isn't ignored @@ -2020,7 +2026,7 @@ function _start_router() { persist_state(); - if (!navigating) { + if (!is_navigating) { const nav = create_navigation(current, undefined, null, 'leave'); // If we're navigating, beforeNavigate was already called. If we end up in here during navigation, @@ -2105,7 +2111,7 @@ function _start_router() { if (_before_navigate({ url, type: 'link' })) { // set `navigating` to `true` to prevent `beforeNavigate` callbacks // being called when the page unloads - navigating = true; + is_navigating = true; } else { event.preventDefault(); } @@ -2253,7 +2259,7 @@ function _start_router() { if (scroll) scrollTo(scroll.x, scroll.y); if (state !== page.state) { - page = { ...page, state }; + page.state = state; root.$set({ page }); } @@ -2323,7 +2329,7 @@ function _start_router() { // the navigation away from it was successful. // Info about bfcache here: https://web.dev/bfcache if (event.persisted) { - stores.navigating.set(null); + stores.navigating.set((navigating.current = null)); } }); @@ -2331,8 +2337,17 @@ function _start_router() { * @param {URL} url */ function update_url(url) { - current.url = url; - stores.page.set({ ...page, url }); + current.url = page.url = url; + stores.page.set({ + data: page.data, + error: page.error, + form: page.form, + params: page.params, + route: page.route, + state: page.state, + status: page.status, + url + }); stores.page.notify(); } } diff --git a/packages/kit/src/runtime/client/state.svelte.js b/packages/kit/src/runtime/client/state.svelte.js new file mode 100644 index 000000000000..5e1978869ca3 --- /dev/null +++ b/packages/kit/src/runtime/client/state.svelte.js @@ -0,0 +1,57 @@ +import { onMount } from 'svelte'; +import { updated_listener } from './utils.js'; + +/** @type {import('@sveltejs/kit').Page} */ +export let page; + +/** @type {{ current: import('@sveltejs/kit').Navigation | null }} */ +export let navigating; + +/** @type {{ current: boolean }} */ +export let updated; + +// this is a bootleg way to tell if we're in old svelte or new svelte +const is_legacy = + onMount.toString().includes('$$') || /function \w+\(\) \{\}/.test(onMount.toString()); + +if (is_legacy) { + page = { + data: {}, + form: null, + error: null, + params: {}, + route: { id: null }, + state: {}, + status: -1, + url: new URL('https://example.com') + }; + navigating = { current: null }; + updated = { current: false }; +} else { + page = new (class Page { + data = $state.raw({}); + form = $state.raw(null); + error = $state.raw(null); + params = $state.raw({}); + route = $state.raw({ id: null }); + state = $state.raw({}); + status = $state.raw(-1); + url = $state.raw(new URL('https://example.com')); + })(); + + navigating = new (class Navigating { + current = $state.raw(null); + })(); + + updated = new (class Updated { + current = $state.raw(false); + })(); + updated_listener.v = () => (updated.current = true); +} + +/** + * @param {import('@sveltejs/kit').Page} new_page + */ +export function update(new_page) { + Object.assign(page, new_page); +} diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 16a1b3426a9e..51152d11b59c 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -234,6 +234,10 @@ export function notifiable_store(value) { return { notify, set, subscribe }; } +export const updated_listener = { + v: () => {} +}; + export function create_updated_store() { const { set, subscribe } = writable(false); @@ -273,6 +277,7 @@ export function create_updated_store() { if (updated) { set(true); + updated_listener.v(); clearTimeout(timeout); } diff --git a/packages/kit/src/runtime/components/svelte-5/error.svelte b/packages/kit/src/runtime/components/svelte-5/error.svelte index b82ddfaed4b4..fa83c7dcd7d4 100644 --- a/packages/kit/src/runtime/components/svelte-5/error.svelte +++ b/packages/kit/src/runtime/components/svelte-5/error.svelte @@ -1,6 +1,6 @@ -

{$page.status}

-

{$page.error?.message}

+

{page.status}

+

{page.error?.message}

diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 82c43a7ce78a..a41aa93b2894 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -110,7 +110,7 @@ export async function render_page(event, page, options, manifest, state, resolve } else if (action_result.data) { /// case: lost data console.warn( - "The form action returned a value, but it isn't available in `$page.form`, because SSR is off. To handle the returned value in CSR, enhance your form with `use:enhance`. See https://svelte.dev/docs/kit/form-actions#progressive-enhancement-use-enhance" + "The form action returned a value, but it isn't available in `page.form`, because SSR is off. To handle the returned value in CSR, enhance your form with `use:enhance`. See https://svelte.dev/docs/kit/form-actions#progressive-enhancement-use-enhance" ); } } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index b61935a581de..a3e9cddd8866 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -149,6 +149,17 @@ export async function render_response({ // portable as possible, but reset afterwards if (paths.relative) paths.override({ base, assets }); + const render_opts = { + context: new Map([ + [ + '__request__', + { + page: props.page + } + ] + ]) + }; + if (__SVELTEKIT_DEV__) { const fetch = globalThis.fetch; let warned = false; @@ -168,14 +179,14 @@ export async function render_response({ }; try { - rendered = options.root.render(props); + rendered = options.root.render(props, render_opts); } finally { globalThis.fetch = fetch; paths.reset(); } } else { try { - rendered = options.root.render(props); + rendered = options.root.render(props, render_opts); } finally { paths.reset(); } diff --git a/packages/kit/src/types/ambient.d.ts b/packages/kit/src/types/ambient.d.ts index 496fc537cf4d..5ab0c5b80c20 100644 --- a/packages/kit/src/types/ambient.d.ts +++ b/packages/kit/src/types/ambient.d.ts @@ -34,14 +34,14 @@ declare namespace App { export interface Locals {} /** - * Defines the common shape of the [$page.data store](https://svelte.dev/docs/kit/$app-stores#page) - that is, the data that is shared between all pages. + * Defines the common shape of the [page.data state](https://svelte.dev/docs/kit/$app-state#page) and [$page.data store](https://svelte.dev/docs/kit/$app-stores#page) - that is, the data that is shared between all pages. * The `Load` and `ServerLoad` functions in `./$types` will be narrowed accordingly. * Use optional properties for data that is only present on specific pages. Do not add an index signature (`[key: string]: any`). */ export interface PageData {} /** - * The shape of the `$page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/$app-navigation#pushState) and [`replaceState`](https://svelte.dev/docs/kit/$app-navigation#replaceState) functions from `$app/navigation`. + * The shape of the `page.state` object, which can be manipulated using the [`pushState`](https://svelte.dev/docs/kit/$app-navigation#pushState) and [`replaceState`](https://svelte.dev/docs/kit/$app-navigation#replaceState) functions from `$app/navigation`. */ export interface PageState {} diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 0c6679aab159..d838add28a54 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -306,7 +306,10 @@ export interface ServerMetadata { export interface SSRComponent { default: { - render(props: Record): { + render( + props: Record, + opts: { context: Map } + ): { html: string; head: string; css: { diff --git a/packages/kit/src/utils/url.js b/packages/kit/src/utils/url.js index 5036fa045082..96b2710cc194 100644 --- a/packages/kit/src/utils/url.js +++ b/packages/kit/src/utils/url.js @@ -168,7 +168,7 @@ function disable_hash(url) { Object.defineProperty(url, 'hash', { get() { throw new Error( - 'Cannot access event.url.hash. Consider using `$page.url.hash` inside a component instead' + 'Cannot access event.url.hash. Consider using `page.url.hash` inside a component instead' ); } }); diff --git a/packages/kit/src/utils/url.spec.js b/packages/kit/src/utils/url.spec.js index 181ffed4fd9e..e526c3ab90f2 100644 --- a/packages/kit/src/utils/url.spec.js +++ b/packages/kit/src/utils/url.spec.js @@ -125,7 +125,7 @@ describe('make_trackable', (test) => { assert.throws( () => url.hash, - /Cannot access event.url.hash. Consider using `\$page.url.hash` inside a component instead/ + /Cannot access event.url.hash. Consider using `page.url.hash` inside a component instead/ ); }); diff --git a/packages/kit/test/apps/amp/src/routes/origin/+page.svelte b/packages/kit/test/apps/amp/src/routes/origin/+page.svelte index 21aca43ddc99..ad574575c080 100644 --- a/packages/kit/test/apps/amp/src/routes/origin/+page.svelte +++ b/packages/kit/test/apps/amp/src/routes/origin/+page.svelte @@ -1,10 +1,10 @@

{data.origin}

-

{$page.url.origin}

+

{page.url.origin}

{data.data.origin}

diff --git a/packages/kit/test/apps/basics/src/routes/+error.svelte b/packages/kit/test/apps/basics/src/routes/+error.svelte index 476d730cd604..61ad908c0b25 100644 --- a/packages/kit/test/apps/basics/src/routes/+error.svelte +++ b/packages/kit/test/apps/basics/src/routes/+error.svelte @@ -1,14 +1,14 @@ - Custom error page: {$page.error.message} + Custom error page: {page.error.message} -

{$page.status}

+

{page.status}

-

This is your custom error page saying: "{$page.error.message}"

+

This is your custom error page saying: "{page.error.message}"

diff --git a/packages/kit/test/apps/options-2/src/routes/deeply/nested/page/+page.svelte b/packages/kit/test/apps/options-2/src/routes/deeply/nested/page/+page.svelte index d6232afc0cc9..ee77d1c9d5b5 100644 --- a/packages/kit/test/apps/options-2/src/routes/deeply/nested/page/+page.svelte +++ b/packages/kit/test/apps/options-2/src/routes/deeply/nested/page/+page.svelte @@ -6,3 +6,9 @@

base: {base}

assets: {assets}

+ + diff --git a/packages/kit/test/apps/options-2/src/routes/hello/+page.svelte b/packages/kit/test/apps/options-2/src/routes/hello/+page.svelte index a994afef288b..8f60c2df52bc 100644 --- a/packages/kit/test/apps/options-2/src/routes/hello/+page.svelte +++ b/packages/kit/test/apps/options-2/src/routes/hello/+page.svelte @@ -1 +1,7 @@

Prerendered

+ + diff --git a/packages/kit/test/apps/options-2/svelte.config.js b/packages/kit/test/apps/options-2/svelte.config.js index ca9cb32020f8..dd4414575a39 100644 --- a/packages/kit/test/apps/options-2/svelte.config.js +++ b/packages/kit/test/apps/options-2/svelte.config.js @@ -10,6 +10,9 @@ const config = { }, env: { dir: '../../env' + }, + output: { + bundleStrategy: 'single' } } }; diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index 1633e55d28b4..5cfc8c8fed69 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -78,7 +78,7 @@ test.describe('Service worker', () => { }); expect(self.base).toBe('/basepath'); - expect(self.build[0]).toMatch(/\/basepath\/_app\/immutable\/entry\/start\.[\w-]+\.js/); + expect(self.build[0]).toMatch(/\/basepath\/_app\/immutable\/bundle\.[\w-]+\.js/); expect(self.image_src).toMatch(/\/basepath\/_app\/immutable\/assets\/image\.[\w-]+\.jpg/); }); @@ -87,3 +87,22 @@ test.describe('Service worker', () => { expect(await page.content()).not.toMatch(/navigator\.serviceWorker/); }); }); + +test.describe("bundleStrategy: 'single'", () => { + test.skip(({ javaScriptEnabled }) => !javaScriptEnabled || !!process.env.DEV); + test('loads a single js file and a single css file', async ({ page }) => { + /** @type {string[]} */ + const requests = []; + page.on('request', (r) => requests.push(new URL(r.url()).pathname)); + + await page.goto('/basepath'); + + await Promise.all([ + page.waitForTimeout(100), // wait for preloading to start + page.waitForLoadState('networkidle') // wait for preloading to finish + ]); + + expect(requests.filter((req) => req.endsWith('.js')).length).toBe(1); + expect(requests.filter((req) => req.endsWith('.css')).length).toBe(1); + }); +}); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index eb3b4329a7a0..d14306f4167e 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -480,6 +480,15 @@ declare module '@sveltejs/kit' { * @since 1.8.4 */ preloadStrategy?: 'modulepreload' | 'preload-js' | 'preload-mjs'; + /** + * If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios. + * If `'single'`, creates just one .js bundle and one .css file containing code for the entire app. + * + * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks)inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions). + * @default 'split' + * @since 2.13.0 + */ + bundleStrategy?: 'split' | 'single'; }; paths?: { /** @@ -1641,7 +1650,7 @@ declare module '@sveltejs/kit' { service_worker: string | null; client: { start: string; - app: string; + app?: string; imports: string[]; stylesheets: string[]; fonts: string[]; From 6531e366f8f082ac4b3c7e40144122393e745f18 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 19 Dec 2024 09:56:14 -0500 Subject: [PATCH 0829/1135] Version Packages (#13199) Co-authored-by: github-actions[bot] --- .changeset/beige-carpets-wave.md | 5 ----- .changeset/proud-taxis-admire.md | 5 ----- packages/adapter-cloudflare/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 7 files changed, 21 insertions(+), 13 deletions(-) delete mode 100644 .changeset/beige-carpets-wave.md delete mode 100644 .changeset/proud-taxis-admire.md diff --git a/.changeset/beige-carpets-wave.md b/.changeset/beige-carpets-wave.md deleted file mode 100644 index 605fcea37217..000000000000 --- a/.changeset/beige-carpets-wave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: add `bundleStrategy: 'split' | 'single'` option diff --git a/.changeset/proud-taxis-admire.md b/.changeset/proud-taxis-admire.md deleted file mode 100644 index fb53e0f4ee44..000000000000 --- a/.changeset/proud-taxis-admire.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': minor ---- - -feat: generate `.assetsignore` file for use with Cloudflare Workers Static Assets diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index a845c8a85189..fa31ffb99cc3 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare +## 4.9.0 +### Minor Changes + + +- feat: generate `.assetsignore` file for use with Cloudflare Workers Static Assets ([#13109](https://github.com/sveltejs/kit/pull/13109)) + + +### Patch Changes + +- Updated dependencies [[`20f2720aa3455f38fa2630a33d52f7532da27fce`](https://github.com/sveltejs/kit/commit/20f2720aa3455f38fa2630a33d52f7532da27fce)]: + - @sveltejs/kit@2.13.0 + ## 4.8.0 ### Minor Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 4d49b21f4841..d3c908e82cd2 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "4.8.0", + "version": "4.9.0", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index bbf6c56e9e1c..516da08616d4 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.13.0 +### Minor Changes + + +- feat: add `bundleStrategy: 'split' | 'single'` option ([#13173](https://github.com/sveltejs/kit/pull/13173)) + ## 2.12.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index de5c5d0a4a71..55294f1a555b 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.12.2", + "version": "2.13.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index f2977468480f..f54baec4cf81 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.12.2'; +export const VERSION = '2.13.0'; From b9b7d80b376ab856c1af9ffc8cabc36fc8308d15 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 20:01:46 -0800 Subject: [PATCH 0830/1135] chore(deps): update pnpm to v9.15.1 (#13204) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 704805dd4ecd..0bdacdeca06f 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.15.0", + "packageManager": "pnpm@9.15.1", "engines": { "pnpm": "^9.0.0" } From 921fb86ba000f621c790be5693b58553be80fa3f Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 20 Dec 2024 20:02:51 -0800 Subject: [PATCH 0831/1135] chore(deps): update dependency @netlify/functions to v3 (#13201) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- packages/adapter-netlify/package.json | 2 +- pnpm-lock.yaml | 22 +++++++++++----------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 8e769336d90d..363023025338 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -46,7 +46,7 @@ "set-cookie-parser": "^2.6.0" }, "devDependencies": { - "@netlify/functions": "^2.4.1", + "@netlify/functions": "^3.0.0", "@rollup/plugin-commonjs": "^28.0.1", "@rollup/plugin-json": "^6.1.0", "@rollup/plugin-node-resolve": "^16.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 33537d5c7ad1..a1344a454e7d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -121,8 +121,8 @@ importers: version: 2.6.0 devDependencies: '@netlify/functions': - specifier: ^2.4.1 - version: 2.6.0 + specifier: ^3.0.0 + version: 3.0.0 '@rollup/plugin-commonjs': specifier: ^28.0.1 version: 28.0.1(rollup@4.27.4) @@ -1722,17 +1722,17 @@ packages: engines: {node: '>=18'} hasBin: true - '@netlify/functions@2.6.0': - resolution: {integrity: sha512-vU20tij0fb4nRGACqb+5SQvKd50JYyTyEhQetCMHdakcJFzjLDivvRR16u1G2Oy4A7xNAtGJF1uz8reeOtTVcQ==} - engines: {node: '>=14.0.0'} + '@netlify/functions@3.0.0': + resolution: {integrity: sha512-XXf9mNw4+fkxUzukDpJtzc32bl1+YlXZwEhc5ZgMcTbJPLpgRLDs5WWSPJ4eY/Mv1ZFvtxmMwmfgoQYVt68Qog==} + engines: {node: '>=18.0.0'} '@netlify/node-cookies@0.1.0': resolution: {integrity: sha512-OAs1xG+FfLX0LoRASpqzVntVV/RpYkgpI0VrUnw2u0Q1qiZUzcPffxRK8HF3gc4GjuhG5ahOEMJ9bswBiZPq0g==} engines: {node: ^14.16.0 || >=16.0.0} - '@netlify/serverless-functions-api@1.14.0': - resolution: {integrity: sha512-HUNETLNvNiC2J+SB/YuRwJA9+agPrc0azSoWVk8H85GC+YE114hcS5JW+dstpKwVerp2xILE3vNWN7IMXP5Q5Q==} - engines: {node: ^14.18.0 || >=16.0.0} + '@netlify/serverless-functions-api@1.30.1': + resolution: {integrity: sha512-JkbaWFeydQdeDHz1mAy4rw+E3bl9YtbCgkntfTxq+IlNX/aIMv2/b1kZnQZcil4/sPoZGL831Dq6E374qRpU1A==} + engines: {node: '>=18.0.0'} '@nodelib/fs.scandir@2.1.5': resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} @@ -4241,13 +4241,13 @@ snapshots: - encoding - supports-color - '@netlify/functions@2.6.0': + '@netlify/functions@3.0.0': dependencies: - '@netlify/serverless-functions-api': 1.14.0 + '@netlify/serverless-functions-api': 1.30.1 '@netlify/node-cookies@0.1.0': {} - '@netlify/serverless-functions-api@1.14.0': + '@netlify/serverless-functions-api@1.30.1': dependencies: '@netlify/node-cookies': 0.1.0 urlpattern-polyfill: 8.0.2 From 7afa1676636d770ab148608f0a1b8663cc48a478 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 21 Dec 2024 11:36:40 -0500 Subject: [PATCH 0832/1135] chore: prepare hash based routing (#13210) * pass URL to _preload_code and get_url_path * add get_route_id * get_route_id is a misnomer --- packages/kit/src/runtime/client/client.js | 42 +++++++++++++++-------- 1 file changed, 27 insertions(+), 15 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index e28f1ce0547d..462b267ea0ba 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -424,9 +424,9 @@ async function _preload_data(intent) { return load_cache.promise; } -/** @param {string} pathname */ -async function _preload_code(pathname) { - const route = routes.find((route) => route.exec(get_url_path(pathname))); +/** @param {URL} url */ +async function _preload_code(url) { + const route = routes.find((route) => route.exec(get_url_path(url))); if (route) { await Promise.all([...route.layouts, route.leaf].map((load) => load?.[1]())); @@ -875,7 +875,7 @@ async function load_route({ id, invalidating, url, params, route, preload }) { /** @type {import('types').ServerNodesResponse | import('types').ServerRedirectNode | null} */ let server_data = null; - const url_changed = current.url ? id !== current.url.pathname + current.url.search : false; + const url_changed = current.url ? id !== get_page_key(current.url) : false; const route_changed = current.route ? route.id !== current.route.id : false; const search_params_changed = diff_search_params(current.url, url); @@ -1175,7 +1175,12 @@ function get_navigation_intent(url, invalidating) { // reroute could alter the given URL, so we pass a copy let rerouted; try { - rerouted = app.hooks.reroute({ url: new URL(url) }) ?? url.pathname; + rerouted = app.hooks.reroute({ url: new URL(url) }) ?? url; + + if (typeof rerouted === 'string') { + url.pathname = rerouted; + rerouted = url; + } } catch (e) { if (DEV) { // in development, print the error... @@ -1195,7 +1200,7 @@ function get_navigation_intent(url, invalidating) { const params = route.exec(path); if (params) { - const id = url.pathname + url.search; + const id = get_page_key(url); /** @type {import('./types.js').NavigationIntent} */ const intent = { id, @@ -1209,9 +1214,14 @@ function get_navigation_intent(url, invalidating) { } } -/** @param {string} pathname */ -function get_url_path(pathname) { - return decode_pathname(pathname.slice(base.length) || '/'); +/** @param {URL} url */ +function get_url_path(url) { + return decode_pathname(url.pathname.slice(base.length) || '/'); +} + +/** @param {URL} url */ +function get_page_key(url) { + return url.pathname + url.search; } /** @@ -1547,7 +1557,7 @@ function setup_preload() { (entries) => { for (const entry of entries) { if (entry.isIntersecting) { - _preload_code(/** @type {HTMLAnchorElement} */ (entry.target).href); + _preload_code(new URL(/** @type {HTMLAnchorElement} */ (entry.target).href)); observer.unobserve(entry.target); } } @@ -1569,7 +1579,7 @@ function setup_preload() { const options = get_router_options(a); // we don't want to preload data for a page we're already on - const same_url = url && current.url.pathname + current.url.search === url.pathname + url.search; + const same_url = url && get_page_key(current.url) === get_page_key(url); if (!options.reload && !same_url) { if (priority <= options.preload_data) { @@ -1591,7 +1601,7 @@ function setup_preload() { } } } else if (priority <= options.preload_code) { - _preload_code(/** @type {URL} */ (url).pathname); + _preload_code(/** @type {URL} */ (url)); } } } @@ -1611,7 +1621,7 @@ function setup_preload() { } if (options.preload_code === PRELOAD_PRIORITIES.eager) { - _preload_code(/** @type {URL} */ (url).pathname); + _preload_code(/** @type {URL} */ (url)); } } } @@ -1855,6 +1865,8 @@ export function preloadCode(pathname) { throw new Error('Cannot call preloadCode(...) on the server'); } + const url = new URL(pathname, current.url); + if (DEV) { if (!pathname.startsWith(base)) { throw new Error( @@ -1862,12 +1874,12 @@ export function preloadCode(pathname) { ); } - if (!routes.find((route) => route.exec(get_url_path(pathname)))) { + if (!routes.find((route) => route.exec(get_url_path(url)))) { throw new Error(`'${pathname}' did not match any routes`); } } - return _preload_code(pathname); + return _preload_code(url); } /** From fe8c37c7b98af8866516c0e7dd89b2b9c2959a9e Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Sat, 21 Dec 2024 18:21:49 +0100 Subject: [PATCH 0833/1135] feat: hash based routing (#13191) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * hash based routing * tests * fix test * fml this took me 40 minutes to figure out * for push/replaceState, too * more robust tests * please? * change approach: make hash visible in page.url etc, require user to pass in hash links * lint, fix test * Apply suggestions from code review * hashchange handling * rename 'history' to 'pathname', update docs * update internal jsdoc * disable SSR and server-only files * disallow page options at build time * oops * allow access to event.url.hash in hash mode * prerender shell * add failing reroute test * fix * make hash trackable * skip test for now * don't normalise * lint * i don't understand this code — even with the prior normalization it's unclear what it would do. no tests fail without it so for now i'm just gonna remove to shut typescript up * get_route_id -> get_page_key * detect hash changes via URL bar --------- Co-authored-by: Rich Harris --- .changeset/thirty-wasps-itch.md | 5 + packages/kit/src/core/config/index.spec.js | 3 + packages/kit/src/core/config/options.js | 4 + packages/kit/src/core/postbuild/analyse.js | 22 +++- packages/kit/src/core/postbuild/prerender.js | 21 +++- .../core/sync/create_manifest_data/index.js | 6 + .../src/core/sync/write_client_manifest.js | 2 + packages/kit/src/core/sync/write_server.js | 1 + packages/kit/src/exports/public.d.ts | 10 ++ packages/kit/src/exports/vite/index.js | 2 + packages/kit/src/runtime/client/client.js | 107 ++++++++++++++---- packages/kit/src/runtime/client/types.d.ts | 5 + packages/kit/src/runtime/client/utils.js | 18 ++- packages/kit/src/runtime/server/respond.js | 6 +- packages/kit/src/types/internal.d.ts | 1 + packages/kit/src/utils/url.js | 25 ++-- packages/kit/src/utils/url.spec.js | 15 +++ .../test/apps/hash-based-routing/package.json | 24 ++++ .../hash-based-routing/playwright.config.js | 1 + .../test/apps/hash-based-routing/src/app.html | 12 ++ .../test/apps/hash-based-routing/src/hooks.js | 11 ++ .../hash-based-routing/src/routes/+layout.js | 7 ++ .../src/routes/+layout.svelte | 21 ++++ .../src/routes/+page.svelte | 1 + .../src/routes/a/+page.svelte | 2 + .../src/routes/b/+page.svelte | 1 + .../src/routes/b/[slug]/+page.svelte | 16 +++ .../src/routes/rerouted/+page.svelte | 1 + .../hash-based-routing/static/favicon.png | Bin 0 -> 1571 bytes .../apps/hash-based-routing/svelte.config.js | 8 ++ .../test/apps/hash-based-routing/test/test.js | 84 ++++++++++++++ .../apps/hash-based-routing/tsconfig.json | 10 ++ .../apps/hash-based-routing/vite.config.js | 21 ++++ packages/kit/types/index.d.ts | 10 ++ pnpm-lock.yaml | 24 ++++ 35 files changed, 461 insertions(+), 46 deletions(-) create mode 100644 .changeset/thirty-wasps-itch.md create mode 100644 packages/kit/test/apps/hash-based-routing/package.json create mode 100644 packages/kit/test/apps/hash-based-routing/playwright.config.js create mode 100644 packages/kit/test/apps/hash-based-routing/src/app.html create mode 100644 packages/kit/test/apps/hash-based-routing/src/hooks.js create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/+layout.js create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/+page.svelte create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/a/+page.svelte create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/b/+page.svelte create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/b/[slug]/+page.svelte create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/rerouted/+page.svelte create mode 100644 packages/kit/test/apps/hash-based-routing/static/favicon.png create mode 100644 packages/kit/test/apps/hash-based-routing/svelte.config.js create mode 100644 packages/kit/test/apps/hash-based-routing/test/test.js create mode 100644 packages/kit/test/apps/hash-based-routing/tsconfig.json create mode 100644 packages/kit/test/apps/hash-based-routing/vite.config.js diff --git a/.changeset/thirty-wasps-itch.md b/.changeset/thirty-wasps-itch.md new file mode 100644 index 000000000000..2c2c0a9f8836 --- /dev/null +++ b/.changeset/thirty-wasps-itch.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add hash-based routing option diff --git a/packages/kit/src/core/config/index.spec.js b/packages/kit/src/core/config/index.spec.js index ed07bc12770d..d6f0df13ebbc 100644 --- a/packages/kit/src/core/config/index.spec.js +++ b/packages/kit/src/core/config/index.spec.js @@ -94,6 +94,9 @@ const get_defaults = (prefix = '') => ({ moduleExtensions: ['.js', '.ts'], output: { preloadStrategy: 'modulepreload', bundleStrategy: 'split' }, outDir: join(prefix, '.svelte-kit'), + router: { + type: 'pathname' + }, serviceWorker: { register: true }, diff --git a/packages/kit/src/core/config/options.js b/packages/kit/src/core/config/options.js index 5f12c5f99d6d..5091aff533f0 100644 --- a/packages/kit/src/core/config/options.js +++ b/packages/kit/src/core/config/options.js @@ -260,6 +260,10 @@ const options = object( }) }), + router: object({ + type: list(['pathname', 'hash']) + }), + serviceWorker: object({ register: boolean(true), files: fun((filename) => !/\.DS_Store/.test(filename)) diff --git a/packages/kit/src/core/postbuild/analyse.js b/packages/kit/src/core/postbuild/analyse.js index 1cc928680e9a..d45e6a506713 100644 --- a/packages/kit/src/core/postbuild/analyse.js +++ b/packages/kit/src/core/postbuild/analyse.js @@ -22,6 +22,7 @@ export default forked(import.meta.url, analyse); /** * @param {{ + * hash: boolean; * manifest_path: string; * manifest_data: import('types').ManifestData; * server_manifest: import('vite').Manifest; @@ -29,7 +30,14 @@ export default forked(import.meta.url, analyse); * env: Record * }} opts */ -async function analyse({ manifest_path, manifest_data, server_manifest, tracked_features, env }) { +async function analyse({ + hash, + manifest_path, + manifest_data, + server_manifest, + tracked_features, + env +}) { /** @type {import('@sveltejs/kit').SSRManifest} */ const manifest = (await import(pathToFileURL(manifest_path).href)).manifest; @@ -67,6 +75,18 @@ async function analyse({ manifest_path, manifest_data, server_manifest, tracked_ // analyse nodes for (const node of nodes) { + if (hash && node.universal) { + const options = Object.keys(node.universal).filter((o) => o !== 'load'); + if (options.length > 0) { + throw new Error( + `Page options are ignored when \`router.type === 'hash'\` (${node.universal_id} has ${options + .filter((o) => o !== 'load') + .map((o) => `'${o}'`) + .join(', ')})` + ); + } + } + metadata.nodes[node.index] = { has_server_load: node.server?.load !== undefined || node.server?.trailingSlash !== undefined }; diff --git a/packages/kit/src/core/postbuild/prerender.js b/packages/kit/src/core/postbuild/prerender.js index 107448c338ff..d2c1954c04df 100644 --- a/packages/kit/src/core/postbuild/prerender.js +++ b/packages/kit/src/core/postbuild/prerender.js @@ -13,6 +13,7 @@ import { crawl } from './crawl.js'; import { forked } from '../../utils/fork.js'; import * as devalue from 'devalue'; import { createReadableStream } from '@sveltejs/kit/node'; +import generate_fallback from './fallback.js'; export default forked(import.meta.url, prerender); @@ -24,6 +25,7 @@ const SPECIAL_HASHLINKS = new Set(['', 'top']); /** * @param {{ + * hash: boolean; * out: string; * manifest_path: string; * metadata: import('types').ServerMetadata; @@ -31,7 +33,7 @@ const SPECIAL_HASHLINKS = new Set(['', 'top']); * env: Record * }} opts */ -async function prerender({ out, manifest_path, metadata, verbose, env }) { +async function prerender({ hash, out, manifest_path, metadata, verbose, env }) { /** @type {import('@sveltejs/kit').SSRManifest} */ const manifest = (await import(pathToFileURL(manifest_path).href)).manifest; @@ -98,6 +100,23 @@ async function prerender({ out, manifest_path, metadata, verbose, env }) { /** @type {import('types').ValidatedKitConfig} */ const config = (await load_config()).kit; + if (hash) { + const fallback = await generate_fallback({ + manifest_path, + env + }); + + const file = output_filename('/', true); + const dest = `${config.outDir}/output/prerendered/pages/${file}`; + + mkdirp(dirname(dest)); + writeFileSync(dest, fallback); + + prerendered.pages.set('/', { file }); + + return { prerendered, prerender_map }; + } + const emulator = await config.adapter?.emulate?.(); /** @type {import('types').Logger} */ diff --git a/packages/kit/src/core/sync/create_manifest_data/index.js b/packages/kit/src/core/sync/create_manifest_data/index.js index 588ba3d9c936..037f8dc8f6ba 100644 --- a/packages/kit/src/core/sync/create_manifest_data/index.js +++ b/packages/kit/src/core/sync/create_manifest_data/index.js @@ -271,6 +271,12 @@ function create_routes_and_nodes(cwd, config, fallback) { config.kit.moduleExtensions ); + if (config.kit.router.type === 'hash' && item.kind === 'server') { + throw new Error( + `Cannot use server-only files in an app with \`router.type === 'hash': ${project_relative}` + ); + } + /** * @param {string} type * @param {string} existing_file diff --git a/packages/kit/src/core/sync/write_client_manifest.js b/packages/kit/src/core/sync/write_client_manifest.js index d7161fbab102..00a161b57b7d 100644 --- a/packages/kit/src/core/sync/write_client_manifest.js +++ b/packages/kit/src/core/sync/write_client_manifest.js @@ -158,6 +158,8 @@ export function write_client_manifest(kit, manifest_data, output, metadata) { export const decoders = Object.fromEntries(Object.entries(hooks.transport).map(([k, v]) => [k, v.decode])); + export const hash = ${JSON.stringify(kit.router.type === 'hash')}; + export const decode = (type, value) => decoders[type](value); export { default as root } from '../root.${isSvelte5Plus() ? 'js' : 'svelte'}'; diff --git a/packages/kit/src/core/sync/write_server.js b/packages/kit/src/core/sync/write_server.js index 90074cfd8501..4de916176e85 100644 --- a/packages/kit/src/core/sync/write_server.js +++ b/packages/kit/src/core/sync/write_server.js @@ -42,6 +42,7 @@ export const options = { embedded: ${config.kit.embedded}, env_public_prefix: '${config.kit.env.publicPrefix}', env_private_prefix: '${config.kit.env.privatePrefix}', + hash_routing: ${s(config.kit.router.type === 'hash')}, hooks: null, // added lazily, via \`get_hooks\` preload_strategy: ${s(config.kit.output.preloadStrategy)}, root, diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 41c440fcdcb1..df05467459d0 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -617,6 +617,16 @@ export interface KitConfig { */ origin?: string; }; + router?: { + /** + * What type of client-side router to use. + * - `'pathname'` is the default and means the current URL pathname determines the route + * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. + * + * @default "pathname" + */ + type?: 'pathname' | 'hash'; + }; serviceWorker?: { /** * Whether to automatically register the service worker, if it exists. diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index ad519c900ca3..d28f3d26cfb7 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -793,6 +793,7 @@ async function kit({ svelte_config }) { ); const metadata = await analyse({ + hash: kit.router.type === 'hash', manifest_path, manifest_data, server_manifest, @@ -897,6 +898,7 @@ async function kit({ svelte_config }) { // ...and prerender const { prerendered, prerender_map } = await prerender({ + hash: kit.router.type === 'hash', out, manifest_path, metadata, diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 462b267ea0ba..955f54c2a74b 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -610,6 +610,19 @@ async function load_node({ loader, parent, url, params, route, server_data_node if (DEV) { validate_page_exports(node.universal); + + if (node.universal && app.hash) { + const options = Object.keys(node.universal).filter((o) => o !== 'load'); + + if (options.length > 0) { + throw new Error( + `Page options are ignored when \`router.type === 'hash'\` (${route.id} has ${options + .filter((o) => o !== 'load') + .map((o) => `'${o}'`) + .join(', ')})` + ); + } + } } if (node.universal?.load) { @@ -653,7 +666,8 @@ async function load_node({ loader, parent, url, params, route, server_data_node if (is_tracking) { uses.search_params.add(param); } - } + }, + app.hash ), async fetch(resource, init) { /** @type {URL | string} */ @@ -810,7 +824,6 @@ function create_data_node(node, previous) { } /** - * * @param {URL | null} old_url * @param {URL} new_url */ @@ -1169,8 +1182,8 @@ async function load_root_error_page({ status, error, url, route }) { * @param {boolean} invalidating */ function get_navigation_intent(url, invalidating) { - if (!url) return undefined; - if (is_external_url(url, base)) return; + if (!url) return; + if (is_external_url(url, base, app.hash)) return; // reroute could alter the given URL, so we pass a copy let rerouted; @@ -1178,7 +1191,12 @@ function get_navigation_intent(url, invalidating) { rerouted = app.hooks.reroute({ url: new URL(url) }) ?? url; if (typeof rerouted === 'string') { - url.pathname = rerouted; + if (app.hash) { + url.hash = rerouted; + } else { + url.pathname = rerouted; + } + rerouted = url; } } catch (e) { @@ -1216,12 +1234,16 @@ function get_navigation_intent(url, invalidating) { /** @param {URL} url */ function get_url_path(url) { - return decode_pathname(url.pathname.slice(base.length) || '/'); + return ( + decode_pathname( + app.hash ? url.hash.replace(/^#/, '').replace(/[?#].+/, '') : url.pathname.slice(base.length) + ) || '/' + ); } /** @param {URL} url */ function get_page_key(url) { - return url.pathname + url.search; + return (app.hash ? url.hash.replace(/^#/, '') : url.pathname) + url.search; } /** @@ -1313,19 +1335,42 @@ async function navigate({ let navigation_result = intent && (await load_route(intent)); if (!navigation_result) { - if (is_external_url(url, base)) { - return await native_navigation(url); - } - navigation_result = await server_fallback( - url, - { id: null }, - await handle_error(new SvelteKitError(404, 'Not Found', `Not found: ${url.pathname}`), { + if (is_external_url(url, base, app.hash)) { + if (DEV && app.hash) { + // Special case for hash mode during DEV: If someone accidentally forgets to use a hash for the link, + // they would end up here in an endless loop. Fall back to error page in that case + navigation_result = await server_fallback( + url, + { id: null }, + await handle_error( + new SvelteKitError( + 404, + 'Not Found', + `Not found: ${url.pathname} (did you forget the hash?)` + ), + { + url, + params: {}, + route: { id: null } + } + ), + 404 + ); + } else { + return await native_navigation(url); + } + } else { + navigation_result = await server_fallback( url, - params: {}, - route: { id: null } - }), - 404 - ); + { id: null }, + await handle_error(new SvelteKitError(404, 'Not Found', `Not found: ${url.pathname}`), { + url, + params: {}, + route: { id: null } + }), + 404 + ); + } } // if this is an internal navigation intent, use the normalized @@ -1447,7 +1492,11 @@ async function navigate({ const scroll = popped ? popped.scroll : noscroll ? scroll_state() : null; if (autoscroll) { - const deep_linked = url.hash && document.getElementById(decodeURIComponent(url.hash.slice(1))); + const deep_linked = + url.hash && + document.getElementById( + decodeURIComponent(app.hash ? (url.hash.split('#')[2] ?? '') : url.hash.slice(1)) + ); if (scroll) { scrollTo(scroll.x, scroll.y); } else if (deep_linked) { @@ -1573,7 +1622,7 @@ function setup_preload() { const a = find_anchor(element, container); if (!a) return; - const { url, external, download } = get_link_info(a, base); + const { url, external, download } = get_link_info(a, base, app.hash); if (external || download) return; const options = get_router_options(a); @@ -1610,7 +1659,7 @@ function setup_preload() { observer.disconnect(); for (const a of container.querySelectorAll('a')) { - const { url, external, download } = get_link_info(a, base); + const { url, external, download } = get_link_info(a, base, app.hash); if (external || download) continue; const options = get_router_options(a); @@ -2085,7 +2134,7 @@ function _start_router() { const a = find_anchor(/** @type {Element} */ (event.composedPath()[0]), container); if (!a) return; - const { url, external, target, download } = get_link_info(a, base); + const { url, external, target, download } = get_link_info(a, base, app.hash); if (!url) return; // bail out before `beforeNavigate` if link opens in a different tab @@ -2115,7 +2164,7 @@ function _start_router() { if (download) return; - const [nonhash, hash] = url.href.split('#'); + const [nonhash, hash] = (app.hash ? url.hash.replace(/^#/, '') : url.href).split('#'); const same_pathname = nonhash === strip_hash(location); // Ignore the following but fire beforeNavigate @@ -2210,11 +2259,12 @@ function _start_router() { if (method !== 'get') return; + // It is impossible to use form actions with hash router, so we just ignore handling them here const url = new URL( (submitter?.hasAttribute('formaction') && submitter?.formAction) || form.action ); - if (is_external_url(url, base)) return; + if (is_external_url(url, base, false)) return; const event_form = /** @type {HTMLFormElement} */ (event.target); @@ -2323,6 +2373,13 @@ function _start_router() { '', location.href ); + } else if (app.hash) { + // If the user edits the hash via the browser URL bar, it + // (surprisingly!) mutates `current.url`, allowing us to + // detect it and trigger a navigation + if (current.url.hash === location.hash) { + navigate({ type: 'goto', url: current.url }); + } } }); diff --git a/packages/kit/src/runtime/client/types.d.ts b/packages/kit/src/runtime/client/types.d.ts index 117828218c75..5d0766f44cc7 100644 --- a/packages/kit/src/runtime/client/types.d.ts +++ b/packages/kit/src/runtime/client/types.d.ts @@ -38,6 +38,11 @@ export interface SvelteKitApp { decoders: Record any>; + /** + * Whether or not we're using hash-based routing + */ + hash: boolean; + root: typeof SvelteComponent; } diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 51152d11b59c..83ff844ad95a 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -122,8 +122,9 @@ export function find_anchor(element, target) { /** * @param {HTMLAnchorElement | SVGAElement} a * @param {string} base + * @param {boolean} uses_hash_router */ -export function get_link_info(a, base) { +export function get_link_info(a, base, uses_hash_router) { /** @type {URL | undefined} */ let url; @@ -136,7 +137,7 @@ export function get_link_info(a, base) { const external = !url || !!target || - is_external_url(url, base) || + is_external_url(url, base, uses_hash_router) || (a.getAttribute('rel') || '').split(/\s+/).includes('external'); const download = url?.origin === origin && a.hasAttribute('download'); @@ -296,9 +297,18 @@ export function create_updated_store() { } /** + * Is external if + * - origin different + * - path doesn't start with base + * - uses hash router and pathname is more than base * @param {URL} url * @param {string} base + * @param {boolean} has_pathname_in_hash */ -export function is_external_url(url, base) { - return url.origin !== origin || !url.pathname.startsWith(base); +export function is_external_url(url, base, has_pathname_in_hash) { + return ( + url.origin !== origin || + !url.pathname.startsWith(base) || + (has_pathname_in_hash && url.pathname !== (base || '/')) + ); } diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index f81f52ef2557..e260a08b00f1 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -81,6 +81,10 @@ export async function respond(request, options, manifest, state) { } } + if (options.hash_routing && url.pathname !== base + '/' && url.pathname !== '/[fallback]') { + return text('Not found', { status: 404 }); + } + // reroute could alter the given URL, so we pass a copy let rerouted_path; try { @@ -416,7 +420,7 @@ export async function respond(request, options, manifest, state) { }; } - if (state.prerendering?.fallback) { + if (options.hash_routing || state.prerendering?.fallback) { return await render_response({ event, options, diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index b20b155b050f..7aa6e2863443 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -370,6 +370,7 @@ export interface SSROptions { embedded: boolean; env_public_prefix: string; env_private_prefix: string; + hash_routing: boolean; hooks: ServerHooks; preload_strategy: ValidatedConfig['kit']['output']['preloadStrategy']; root: SSRComponent['default']; diff --git a/packages/kit/src/utils/url.js b/packages/kit/src/utils/url.js index 96b2710cc194..0d0af684f6a2 100644 --- a/packages/kit/src/utils/url.js +++ b/packages/kit/src/utils/url.js @@ -85,24 +85,13 @@ export function strip_hash({ href }) { return href.split('#')[0]; } -/** - * URL properties that could change during the lifetime of the page, - * which excludes things like `origin` - */ -const tracked_url_properties = /** @type {const} */ ([ - 'href', - 'pathname', - 'search', - 'toString', - 'toJSON' -]); - /** * @param {URL} url * @param {() => void} callback * @param {(search_param: string) => void} search_params_callback + * @param {boolean} [allow_hash] */ -export function make_trackable(url, callback, search_params_callback) { +export function make_trackable(url, callback, search_params_callback, allow_hash = false) { const tracked = new URL(url); Object.defineProperty(tracked, 'searchParams', { @@ -127,10 +116,18 @@ export function make_trackable(url, callback, search_params_callback) { configurable: true }); + /** + * URL properties that could change during the lifetime of the page, + * which excludes things like `origin` + */ + const tracked_url_properties = ['href', 'pathname', 'search', 'toString', 'toJSON']; + if (allow_hash) tracked_url_properties.push('hash'); + for (const property of tracked_url_properties) { Object.defineProperty(tracked, property, { get() { callback(); + // @ts-expect-error return url[property]; }, @@ -151,7 +148,7 @@ export function make_trackable(url, callback, search_params_callback) { }; } - if (DEV || !BROWSER) { + if ((DEV || !BROWSER) && !allow_hash) { disable_hash(tracked); } diff --git a/packages/kit/src/utils/url.spec.js b/packages/kit/src/utils/url.spec.js index e526c3ab90f2..55865c413468 100644 --- a/packages/kit/src/utils/url.spec.js +++ b/packages/kit/src/utils/url.spec.js @@ -129,6 +129,21 @@ describe('make_trackable', (test) => { ); }); + test('does not throw an error when its hash property is accessed if it is allowed', () => { + let tracked = false; + const url = make_trackable( + new URL('https://svelte.dev/docs/kit'), + () => { + tracked = true; + }, + () => {}, + true + ); + + url.hash; + assert.ok(tracked); + }); + test('track each search param separately if accessed directly', () => { let tracked = false; const tracked_search_params = new Set(); diff --git a/packages/kit/test/apps/hash-based-routing/package.json b/packages/kit/test/apps/hash-based-routing/package.json new file mode 100644 index 000000000000..31eb52c57468 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/package.json @@ -0,0 +1,24 @@ +{ + "name": "test-hash-based-routing", + "private": true, + "version": "0.0.1", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && tsc && svelte-check", + "test": "pnpm test:dev && pnpm test:build", + "test:dev": "cross-env DEV=true playwright test", + "test:build": "playwright test" + }, + "devDependencies": { + "@sveltejs/kit": "workspace:^", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "cross-env": "^7.0.3", + "svelte": "^5.2.9", + "svelte-check": "^4.1.1", + "typescript": "^5.5.4", + "vite": "^6.0.1" + }, + "type": "module" +} diff --git a/packages/kit/test/apps/hash-based-routing/playwright.config.js b/packages/kit/test/apps/hash-based-routing/playwright.config.js new file mode 100644 index 000000000000..33d36b651014 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/playwright.config.js @@ -0,0 +1 @@ +export { config as default } from '../../utils.js'; diff --git a/packages/kit/test/apps/hash-based-routing/src/app.html b/packages/kit/test/apps/hash-based-routing/src/app.html new file mode 100644 index 000000000000..79d946ed86a3 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/kit/test/apps/hash-based-routing/src/hooks.js b/packages/kit/test/apps/hash-based-routing/src/hooks.js new file mode 100644 index 000000000000..24b8a22c6d26 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/hooks.js @@ -0,0 +1,11 @@ +export function reroute({ url }) { + if (url.hash === '#/reroute-a') { + // works with leading hash... + return '#/rerouted'; + } + + if (url.hash === '#/reroute-b') { + // ...and without + return '/rerouted'; + } +} diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/+layout.js b/packages/kit/test/apps/hash-based-routing/src/routes/+layout.js new file mode 100644 index 000000000000..2b6766631e95 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/+layout.js @@ -0,0 +1,7 @@ +export function load({ params, route, url }) { + return { + params, + route, + url: new URL(url) + }; +} diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte new file mode 100644 index 000000000000..5ac801199106 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte @@ -0,0 +1,21 @@ + + +
/ +/#/a +/#/a#b +/#/b/123 +/#/b/456 +/#/reroute-a +/#/reroute-b + + + + +{@render children()} diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/+page.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/+page.svelte new file mode 100644 index 000000000000..0a88878c34c2 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/+page.svelte @@ -0,0 +1 @@ +

home

diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/a/+page.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/a/+page.svelte new file mode 100644 index 000000000000..8ae7fac317db --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/a/+page.svelte @@ -0,0 +1,2 @@ +

a

+
a#b
diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/b/+page.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/b/+page.svelte new file mode 100644 index 000000000000..db2e4f2757c0 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/b/+page.svelte @@ -0,0 +1 @@ +

b

diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/b/[slug]/+page.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/b/[slug]/+page.svelte new file mode 100644 index 000000000000..236f39885620 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/b/[slug]/+page.svelte @@ -0,0 +1,16 @@ + + +

+ {JSON.stringify(data.params)} + {data.route.id} + {data.url.pathname + data.url.search + data.url.hash} +

+ +

+ {JSON.stringify(page.params)} + {page.route.id} + {page.url.pathname + page.url.search + page.url.hash} +

diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/rerouted/+page.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/rerouted/+page.svelte new file mode 100644 index 000000000000..0ee3066bba03 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/rerouted/+page.svelte @@ -0,0 +1 @@ +

rerouted

diff --git a/packages/kit/test/apps/hash-based-routing/static/favicon.png b/packages/kit/test/apps/hash-based-routing/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH !javaScriptEnabled); + +test.describe.configure({ mode: 'parallel' }); + +test.describe('hash based navigation', () => { + test('server rendering is disabled', async ({ request }) => { + const response = await request.get('/'); + const text = await response.text(); + + expect(text).not.toContain(' { + await page.goto('/'); + await expect(page.locator('p')).toHaveText('home'); + + await page.locator('a[href="/#/a"]').click(); + await expect(page.locator('p')).toHaveText('a'); + let url = new URL(page.url()); + expect(url.pathname).toBe('/'); + expect(url.hash).toBe('#/a'); + + await page.locator('button[data-goto]').click(); + await expect(page.locator('p')).toHaveText('b'); + url = new URL(page.url()); + expect(url.pathname).toBe('/'); + expect(url.hash).toBe('#/b'); + + await page.locator('a[href="/#/a#b"]').click(); + await expect(page.locator('p')).toHaveText('a'); + url = new URL(page.url()); + expect(url.pathname).toBe('/'); + expect(url.hash).toBe('#/a#b'); + + await page.locator('button[data-push]').click(); + await expect(page.locator('p')).toHaveText('a'); + url = new URL(page.url()); + expect(url.pathname).toBe('/'); + expect(url.hash).toBe('#/b'); + + await page.locator('button[data-replace]').click(); + await expect(page.locator('p')).toHaveText('a'); + url = new URL(page.url()); + expect(url.pathname).toBe('/'); + expect(url.hash).toBe('#/a#b'); + }); + + test('navigates to correct page on load', async ({ page }) => { + await page.goto('/#/a'); + await expect(page.locator('p')).toHaveText('a'); + }); + + test('route id and params are correct', async ({ page }) => { + await page.goto('/#/b/123'); + await expect(page.locator('p[data-data]')).toHaveText('{"slug":"123"} /b/[slug] /#/b/123'); + await expect(page.locator('p[data-page]')).toHaveText('{"slug":"123"} /b/[slug] /#/b/123'); + + await page.goto('/'); + await page.locator('a[href="/#/b/456"]').click(); + await expect(page.locator('p[data-data]')).toHaveText('{"slug":"456"} /b/[slug] /#/b/456'); + await expect(page.locator('p[data-page]')).toHaveText('{"slug":"456"} /b/[slug] /#/b/456'); + }); + + test('reroute works', async ({ page }) => { + await page.goto('/'); + + await page.locator('a[href="/#/reroute-a"]').click(); + await expect(page.locator('p')).toHaveText('rerouted'); + let url = new URL(page.url()); + expect(url.hash).toBe('#/rerouted'); + + await page.goto('/'); + + await page.locator('a[href="/#/reroute-b"]').click(); + await expect(page.locator('p')).toHaveText('rerouted'); + url = new URL(page.url()); + expect(url.hash).toBe('#/rerouted'); + }); +}); diff --git a/packages/kit/test/apps/hash-based-routing/tsconfig.json b/packages/kit/test/apps/hash-based-routing/tsconfig.json new file mode 100644 index 000000000000..1d665886266b --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/tsconfig.json @@ -0,0 +1,10 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "noEmit": true, + "resolveJsonModule": true + }, + "extends": "./.svelte-kit/tsconfig.json" +} diff --git a/packages/kit/test/apps/hash-based-routing/vite.config.js b/packages/kit/test/apps/hash-based-routing/vite.config.js new file mode 100644 index 000000000000..9640847b2704 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/vite.config.js @@ -0,0 +1,21 @@ +import * as path from 'node:path'; +import { sveltekit } from '@sveltejs/kit/vite'; + +/** @type {import('vite').UserConfig} */ +const config = { + build: { + minify: false + }, + clearScreen: false, + plugins: [sveltekit()], + server: { + fs: { + allow: [path.resolve('../../../src')] + } + }, + optimizeDeps: { + exclude: ['svelte'] + } +}; + +export default config; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index d14306f4167e..a5e77e194f06 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -599,6 +599,16 @@ declare module '@sveltejs/kit' { */ origin?: string; }; + router?: { + /** + * What type of client-side router to use. + * - `'pathname'` is the default and means the current URL pathname determines the route + * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. + * + * @default "pathname" + */ + type?: 'pathname' | 'hash'; + }; serviceWorker?: { /** * Whether to automatically register the service worker, if it exists. diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a1344a454e7d..e1af7a424d7a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -545,6 +545,30 @@ importers: specifier: ^6.0.1 version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + packages/kit/test/apps/hash-based-routing: + devDependencies: + '@sveltejs/kit': + specifier: workspace:^ + version: link:../../.. + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + svelte: + specifier: ^5.2.9 + version: 5.2.9 + svelte-check: + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + typescript: + specifier: ^5.5.4 + version: 5.6.3 + vite: + specifier: ^6.0.1 + version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + packages/kit/test/apps/no-ssr: devDependencies: '@sveltejs/kit': From ed4d53e2d9e81d47fa084cc304a7a94e431b1cdd Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 21 Dec 2024 12:22:59 -0500 Subject: [PATCH 0834/1135] fix: create new URL when calling `goto(...)`, to handle case where URL is mutated (#13196) * fix: create new URL when calling `goto(...)`, to handle case where URL is mutated * add test * format --------- Co-authored-by: Chew Tee Ming --- .changeset/smooth-weeks-rhyme.md | 5 +++++ packages/kit/src/runtime/client/client.js | 2 +- .../basics/src/routes/state/url/+page.svelte | 16 ++++++++++++++++ .../kit/test/apps/basics/test/client.test.js | 7 +++++++ 4 files changed, 29 insertions(+), 1 deletion(-) create mode 100644 .changeset/smooth-weeks-rhyme.md create mode 100644 packages/kit/test/apps/basics/src/routes/state/url/+page.svelte diff --git a/.changeset/smooth-weeks-rhyme.md b/.changeset/smooth-weeks-rhyme.md new file mode 100644 index 000000000000..edb0855071f0 --- /dev/null +++ b/.changeset/smooth-weeks-rhyme.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: create new URL when calling `goto(...)`, to handle case where URL is mutated diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 955f54c2a74b..1b3c11161036 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1800,7 +1800,7 @@ export function goto(url, opts = {}) { throw new Error('Cannot call goto(...) on the server'); } - url = resolve_url(url); + url = new URL(resolve_url(url)); if (url.origin !== origin) { return Promise.reject( diff --git a/packages/kit/test/apps/basics/src/routes/state/url/+page.svelte b/packages/kit/test/apps/basics/src/routes/state/url/+page.svelte new file mode 100644 index 000000000000..c8d9d6ec90b5 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/state/url/+page.svelte @@ -0,0 +1,16 @@ + + + + +

{`${q}`}

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 0239225668ee..d527a0e77870 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -421,6 +421,13 @@ test.describe('$app/state', () => { await app.goto('/state/data/state-update/same-keys'); await expect(page.locator('p')).toHaveText('page.data was updated 1 time(s)'); }); + + test('page.url does update when used with goto', async ({ page }) => { + await page.goto('/state/url'); + await expect(page.locator('p')).toHaveText('undefined'); + await page.locator('button').click(); + await expect(page.locator('p')).toHaveText('test'); + }); }); test.describe('Invalidation', () => { From 141b0f913592e799d01a15cc7696f235aa1c2e4d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 21 Dec 2024 12:24:46 -0500 Subject: [PATCH 0835/1135] Version Packages (#13212) Co-authored-by: github-actions[bot] --- .changeset/smooth-weeks-rhyme.md | 5 ----- .changeset/thirty-wasps-itch.md | 5 ----- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 .changeset/smooth-weeks-rhyme.md delete mode 100644 .changeset/thirty-wasps-itch.md diff --git a/.changeset/smooth-weeks-rhyme.md b/.changeset/smooth-weeks-rhyme.md deleted file mode 100644 index edb0855071f0..000000000000 --- a/.changeset/smooth-weeks-rhyme.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: create new URL when calling `goto(...)`, to handle case where URL is mutated diff --git a/.changeset/thirty-wasps-itch.md b/.changeset/thirty-wasps-itch.md deleted file mode 100644 index 2c2c0a9f8836..000000000000 --- a/.changeset/thirty-wasps-itch.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: add hash-based routing option diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 516da08616d4..acd466b5a6fd 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.14.0 +### Minor Changes + + +- feat: add hash-based routing option ([#13191](https://github.com/sveltejs/kit/pull/13191)) + + +### Patch Changes + + +- fix: create new URL when calling `goto(...)`, to handle case where URL is mutated ([#13196](https://github.com/sveltejs/kit/pull/13196)) + ## 2.13.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 55294f1a555b..18b14104d4b4 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.13.0", + "version": "2.14.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index f54baec4cf81..624205f0b501 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.13.0'; +export const VERSION = '2.14.0'; From fdae48fda4e31d2aacdb9e6654c768a444726b47 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 21 Dec 2024 12:43:45 -0500 Subject: [PATCH 0836/1135] fix: allow dynamic routes with missing fallback in hash mode (#13213) --- .changeset/four-llamas-join.md | 5 +++++ packages/adapter-static/index.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/four-llamas-join.md diff --git a/.changeset/four-llamas-join.md b/.changeset/four-llamas-join.md new file mode 100644 index 000000000000..d888cd182ec0 --- /dev/null +++ b/.changeset/four-llamas-join.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-static': patch +--- + +fix: allow dynamic routes with missing fallback in hash mode diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js index c5e0d68efa42..da57bae89fef 100644 --- a/packages/adapter-static/index.js +++ b/packages/adapter-static/index.js @@ -7,7 +7,7 @@ export default function (options) { name: '@sveltejs/adapter-static', async adapt(builder) { - if (!options?.fallback) { + if (!options?.fallback && builder.config.kit.router.type !== 'hash') { const dynamic_routes = builder.routes.filter((route) => route.prerender !== true); if (dynamic_routes.length > 0 && options?.strict !== false) { const prefix = path.relative('.', builder.config.kit.files.routes); From b7ff0b25bda2e193898d7d281a4a27d28910a2a6 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 21 Dec 2024 13:00:18 -0500 Subject: [PATCH 0837/1135] add since tag (#13215) --- packages/kit/src/exports/public.d.ts | 1 + packages/kit/types/index.d.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index df05467459d0..e9601bf4adc4 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -624,6 +624,7 @@ export interface KitConfig { * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. * * @default "pathname" + * @since 2.14.0 */ type?: 'pathname' | 'hash'; }; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index a5e77e194f06..aa1b04ac9a7f 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -606,6 +606,7 @@ declare module '@sveltejs/kit' { * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. * * @default "pathname" + * @since 2.14.0 */ type?: 'pathname' | 'hash'; }; From f103084514012591b645eef74bf17556630c860e Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 21 Dec 2024 13:00:41 -0500 Subject: [PATCH 0838/1135] Version Packages (#13214) Co-authored-by: github-actions[bot] --- .changeset/four-llamas-join.md | 5 ----- packages/adapter-static/CHANGELOG.md | 6 ++++++ packages/adapter-static/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/four-llamas-join.md diff --git a/.changeset/four-llamas-join.md b/.changeset/four-llamas-join.md deleted file mode 100644 index d888cd182ec0..000000000000 --- a/.changeset/four-llamas-join.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-static': patch ---- - -fix: allow dynamic routes with missing fallback in hash mode diff --git a/packages/adapter-static/CHANGELOG.md b/packages/adapter-static/CHANGELOG.md index 2b100095d0a7..aafe126d3dd6 100644 --- a/packages/adapter-static/CHANGELOG.md +++ b/packages/adapter-static/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-static +## 3.0.7 +### Patch Changes + + +- fix: allow dynamic routes with missing fallback in hash mode ([#13213](https://github.com/sveltejs/kit/pull/13213)) + ## 3.0.6 ### Patch Changes diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 23f53f0746d1..c827b89833d4 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-static", - "version": "3.0.6", + "version": "3.0.7", "description": "Adapter for SvelteKit apps that prerenders your entire site as a collection of static files", "keywords": [ "adapter", From fe98a218294a1e9b458b51bcb6ad95aafe32552d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sat, 21 Dec 2024 13:31:59 -0500 Subject: [PATCH 0839/1135] fix: use optional chaining when checking router type (#13218) * fix: use optional chaining when checking router type * no need for changeset, nothing was released yet * Revert "no need for changeset, nothing was released yet" This reverts commit cff720b0f4333a3e44e76529e5dc4d03e919334a. --- .changeset/strange-wolves-draw.md | 5 +++++ packages/adapter-static/index.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/strange-wolves-draw.md diff --git a/.changeset/strange-wolves-draw.md b/.changeset/strange-wolves-draw.md new file mode 100644 index 000000000000..3f6407b4b7bb --- /dev/null +++ b/.changeset/strange-wolves-draw.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-static': patch +--- + +fix: use optional chaining when checking router type diff --git a/packages/adapter-static/index.js b/packages/adapter-static/index.js index da57bae89fef..cfeb7fba1628 100644 --- a/packages/adapter-static/index.js +++ b/packages/adapter-static/index.js @@ -7,7 +7,7 @@ export default function (options) { name: '@sveltejs/adapter-static', async adapt(builder) { - if (!options?.fallback && builder.config.kit.router.type !== 'hash') { + if (!options?.fallback && builder.config.kit.router?.type !== 'hash') { const dynamic_routes = builder.routes.filter((route) => route.prerender !== true); if (dynamic_routes.length > 0 && options?.strict !== false) { const prefix = path.relative('.', builder.config.kit.files.routes); From e95d44622e05015d06e5b8db3273c82492e29a75 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 21 Dec 2024 13:33:09 -0500 Subject: [PATCH 0840/1135] Version Packages (#13219) Co-authored-by: github-actions[bot] --- .changeset/strange-wolves-draw.md | 5 ----- packages/adapter-static/CHANGELOG.md | 6 ++++++ packages/adapter-static/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/strange-wolves-draw.md diff --git a/.changeset/strange-wolves-draw.md b/.changeset/strange-wolves-draw.md deleted file mode 100644 index 3f6407b4b7bb..000000000000 --- a/.changeset/strange-wolves-draw.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-static': patch ---- - -fix: use optional chaining when checking router type diff --git a/packages/adapter-static/CHANGELOG.md b/packages/adapter-static/CHANGELOG.md index aafe126d3dd6..1aa68f9c87b6 100644 --- a/packages/adapter-static/CHANGELOG.md +++ b/packages/adapter-static/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-static +## 3.0.8 +### Patch Changes + + +- fix: use optional chaining when checking router type ([#13218](https://github.com/sveltejs/kit/pull/13218)) + ## 3.0.7 ### Patch Changes diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index c827b89833d4..8c212cbb07f4 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-static", - "version": "3.0.7", + "version": "3.0.8", "description": "Adapter for SvelteKit apps that prerenders your entire site as a collection of static files", "keywords": [ "adapter", From 5d02a95c77473eb3750dcc44b713a4c6015702b0 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Sun, 22 Dec 2024 13:50:22 +0100 Subject: [PATCH 0841/1135] fix: do not mutate URL during reroute logic (#13222) fixes #13220 --- .changeset/rude-plants-rest.md | 5 +++++ packages/kit/src/exports/public.d.ts | 1 + packages/kit/src/runtime/client/client.js | 8 +++++--- .../apps/basics/src/routes/reroute/basic/b/+page.svelte | 6 +++++- packages/kit/test/apps/basics/test/client.test.js | 4 +++- packages/kit/test/apps/basics/test/server.test.js | 4 +++- packages/kit/test/apps/hash-based-routing/test/test.js | 4 ++-- packages/kit/types/index.d.ts | 1 + 8 files changed, 25 insertions(+), 8 deletions(-) create mode 100644 .changeset/rude-plants-rest.md diff --git a/.changeset/rude-plants-rest.md b/.changeset/rude-plants-rest.md new file mode 100644 index 000000000000..1cb48536c135 --- /dev/null +++ b/.changeset/rude-plants-rest.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: do not mutate URL during reroute logic diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index e9601bf4adc4..6bce6ce2aa50 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -622,6 +622,7 @@ export interface KitConfig { * What type of client-side router to use. * - `'pathname'` is the default and means the current URL pathname determines the route * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. + * It comes with some caveats: you can't use server-side rendering (or indeed any server logic), and you have to make sure that the links in your app all start with /#/, or they won't work. Beyond that, everything works exactly like a normal SvelteKit app. * * @default "pathname" * @since 2.14.0 diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 1b3c11161036..9f3451a68d51 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1191,13 +1191,15 @@ function get_navigation_intent(url, invalidating) { rerouted = app.hooks.reroute({ url: new URL(url) }) ?? url; if (typeof rerouted === 'string') { + const tmp = new URL(url); // do not mutate the incoming URL + if (app.hash) { - url.hash = rerouted; + tmp.hash = rerouted; } else { - url.pathname = rerouted; + tmp.pathname = rerouted; } - rerouted = url; + rerouted = tmp; } } catch (e) { if (DEV) { diff --git a/packages/kit/test/apps/basics/src/routes/reroute/basic/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/basic/b/+page.svelte index 540f76eae7b6..e405729c9633 100644 --- a/packages/kit/test/apps/basics/src/routes/reroute/basic/b/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/reroute/basic/b/+page.svelte @@ -1 +1,5 @@ -

Successfully rewritten

+ + +

Successfully rewritten, URL should still show a: {page.url.pathname}

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index d527a0e77870..313d2d5cb75d 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1184,7 +1184,9 @@ test.describe('reroute', () => { test('Apply reroute during client side navigation', async ({ page }) => { await page.goto('/reroute/basic'); await page.click("a[href='/reroute/basic/a']"); - expect(await page.textContent('h1')).toContain('Successfully rewritten'); + expect(await page.textContent('h1')).toContain( + 'Successfully rewritten, URL should still show a: /reroute/basic/a' + ); }); test('Apply reroute after client-only redirects', async ({ page }) => { diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 28fdc180b3c1..266373d5069d 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -642,7 +642,9 @@ test.describe('Miscellaneous', () => { test.describe('reroute', () => { test('Apply reroute when directly accessing a page', async ({ page }) => { await page.goto('/reroute/basic/a'); - expect(await page.textContent('h1')).toContain('Successfully rewritten'); + expect(await page.textContent('h1')).toContain( + 'Successfully rewritten, URL should still show a: /reroute/basic/a' + ); }); test('Returns a 500 response if reroute throws an error on the server', async ({ page }) => { diff --git a/packages/kit/test/apps/hash-based-routing/test/test.js b/packages/kit/test/apps/hash-based-routing/test/test.js index 52540e4a8f91..ae379c55f601 100644 --- a/packages/kit/test/apps/hash-based-routing/test/test.js +++ b/packages/kit/test/apps/hash-based-routing/test/test.js @@ -72,13 +72,13 @@ test.describe('hash based navigation', () => { await page.locator('a[href="/#/reroute-a"]').click(); await expect(page.locator('p')).toHaveText('rerouted'); let url = new URL(page.url()); - expect(url.hash).toBe('#/rerouted'); + expect(url.hash).toBe('#/reroute-a'); await page.goto('/'); await page.locator('a[href="/#/reroute-b"]').click(); await expect(page.locator('p')).toHaveText('rerouted'); url = new URL(page.url()); - expect(url.hash).toBe('#/rerouted'); + expect(url.hash).toBe('#/reroute-b'); }); }); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index aa1b04ac9a7f..bd268a10ff31 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -604,6 +604,7 @@ declare module '@sveltejs/kit' { * What type of client-side router to use. * - `'pathname'` is the default and means the current URL pathname determines the route * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. + * It comes with some caveats: you can't use server-side rendering (or indeed any server logic), and you have to make sure that the links in your app all start with /#/, or they won't work. Beyond that, everything works exactly like a normal SvelteKit app. * * @default "pathname" * @since 2.14.0 From a58a82e7224e7dd5dfd9410dd65422e3035a42c2 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Dec 2024 13:51:45 +0100 Subject: [PATCH 0842/1135] Version Packages (#13223) Co-authored-by: github-actions[bot] --- .changeset/rude-plants-rest.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/rude-plants-rest.md diff --git a/.changeset/rude-plants-rest.md b/.changeset/rude-plants-rest.md deleted file mode 100644 index 1cb48536c135..000000000000 --- a/.changeset/rude-plants-rest.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: do not mutate URL during reroute logic diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index acd466b5a6fd..7b69a0e1b985 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.14.1 +### Patch Changes + + +- fix: do not mutate URL during reroute logic ([#13222](https://github.com/sveltejs/kit/pull/13222)) + ## 2.14.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 18b14104d4b4..12c91f69ef41 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.14.0", + "version": "2.14.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 624205f0b501..73fa754ce76a 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.14.0'; +export const VERSION = '2.14.1'; From 9a6f4619e38c133535434823da1a5ab74bc28a8f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 22 Dec 2024 12:28:39 -0500 Subject: [PATCH 0843/1135] feat: add `bundleStrategy: 'inline' (#13193) * feat: add `codeSplitJs` option * fix: only use `manualChunks` when `!codeSplitJS` * Create beige-carpets-wave.md * chore: regenerate types * chore: add option to `options` app for tests * chore: move tests from `options` to `options-2` and add test for bundle * chore: rename chunk, add css test * chore: rename option to `codeSplit` * chore: apply suggestions from code review * this looks unintentional, reverting * tweak docs * DRY out * get rid of Promise.all when codeSplit: false * types * rename to bundleStrategy * more detail * pretty sure this is unused * tweak * small tweaks * inline strategy * omit modulepreloads when inlining script * regenerate * fix * changeset * regenerate * fix * jsdoc * allow trailing /index.html when serving from filesystem * treat current directory as base when using hash-based routing * make self-contained apps possible * lint * oops --------- Co-authored-by: paoloricciuti Co-authored-by: Simon Holthausen --- .changeset/strange-geese-train.md | 5 ++ packages/kit/src/core/config/options.js | 2 +- packages/kit/src/exports/public.d.ts | 7 ++- packages/kit/src/exports/vite/index.js | 30 +++++++-- packages/kit/src/runtime/client/bundle.js | 2 +- packages/kit/src/runtime/client/utils.js | 27 +++++--- .../kit/src/runtime/server/page/render.js | 61 ++++++++++++------- packages/kit/src/types/internal.d.ts | 4 ++ packages/kit/types/index.d.ts | 11 +++- 9 files changed, 106 insertions(+), 43 deletions(-) create mode 100644 .changeset/strange-geese-train.md diff --git a/.changeset/strange-geese-train.md b/.changeset/strange-geese-train.md new file mode 100644 index 000000000000..0db288421ee2 --- /dev/null +++ b/.changeset/strange-geese-train.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add `bundleStrategy: 'inline'` option diff --git a/packages/kit/src/core/config/options.js b/packages/kit/src/core/config/options.js index 5091aff533f0..472779ac0ded 100644 --- a/packages/kit/src/core/config/options.js +++ b/packages/kit/src/core/config/options.js @@ -143,7 +143,7 @@ const options = object( output: object({ preloadStrategy: list(['modulepreload', 'preload-js', 'preload-mjs']), - bundleStrategy: list(['split', 'single']) + bundleStrategy: list(['split', 'single', 'inline']) }), paths: object({ diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 6bce6ce2aa50..b4a837768420 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -499,14 +499,15 @@ export interface KitConfig { */ preloadStrategy?: 'modulepreload' | 'preload-js' | 'preload-mjs'; /** - * If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios. - * If `'single'`, creates just one .js bundle and one .css file containing code for the entire app. + * - If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios. + * - If `'single'`, creates just one .js bundle and one .css file containing code for the entire app. + * - If `'inline'`, inlines all JavaScript and CSS of the entire app into the HTML. The result is usable without a server (i.e. you can just open the file in your browser). * * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks)inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions). * @default 'split' * @since 2.13.0 */ - bundleStrategy?: 'split' | 'single'; + bundleStrategy?: 'split' | 'single' | 'inline'; }; paths?: { /** diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index d28f3d26cfb7..21bc3d49575f 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -631,26 +631,30 @@ async function kit({ svelte_config }) { const client_base = kit.paths.relative !== false || kit.paths.assets ? './' : kit.paths.base || '/'; + const inline = !ssr && svelte_config.kit.output.bundleStrategy === 'inline'; + const split = ssr || svelte_config.kit.output.bundleStrategy === 'split'; + new_config = { base: ssr ? assets_base(kit) : client_base, build: { copyPublicDir: !ssr, - cssCodeSplit: true, + cssCodeSplit: svelte_config.kit.output.bundleStrategy !== 'inline', cssMinify: initial_config.build?.minify == null ? true : !!initial_config.build.minify, // don't use the default name to avoid collisions with 'static/manifest.json' manifest: '.vite/manifest.json', // TODO: remove this after bumping peer dep to vite 5 outDir: `${out}/${ssr ? 'server' : 'client'}`, rollupOptions: { - input, + input: inline ? input['bundle'] : input, output: { - format: 'esm', + format: inline ? 'iife' : 'esm', + name: `__sveltekit_${version_hash}.app`, entryFileNames: ssr ? '[name].js' : `${prefix}/[name].[hash].${ext}`, chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[name].[hash].${ext}`, assetFileNames: `${prefix}/assets/[name].[hash][extname]`, hoistTransitiveImports: false, sourcemapIgnoreList, - manualChunks: - svelte_config.kit.output.bundleStrategy === 'single' ? () => 'bundle' : undefined + manualChunks: split ? undefined : () => 'bundle', + inlineDynamicImports: false }, preserveEntrySignatures: 'strict' }, @@ -868,6 +872,22 @@ async function kit({ svelte_config }) { (chunk) => chunk.type === 'chunk' && chunk.modules[env_dynamic_public] ) }; + + if (svelte_config.kit.output.bundleStrategy === 'inline') { + const style = /** @type {import('rollup').OutputAsset} */ ( + output.find( + (chunk) => + chunk.type === 'asset' && + chunk.names.length === 1 && + chunk.names[0] === 'style.css' + ) + ); + + build_data.client.inline = { + script: read(`${out}/client/${start.file}`), + style: /** @type {string | undefined} */ (style?.source) + }; + } } const css = output.filter( diff --git a/packages/kit/src/runtime/client/bundle.js b/packages/kit/src/runtime/client/bundle.js index 9ef13c0f2bd2..ae77db0ca4ec 100644 --- a/packages/kit/src/runtime/client/bundle.js +++ b/packages/kit/src/runtime/client/bundle.js @@ -1,4 +1,4 @@ -/* if `bundleStrategy === 'single'`, this file is used as the entry point */ +/* if `bundleStrategy` is 'single' or 'inline', this file is used as the entry point */ import * as kit from './entry.js'; diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 83ff844ad95a..2a0c35f344e9 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -303,12 +303,25 @@ export function create_updated_store() { * - uses hash router and pathname is more than base * @param {URL} url * @param {string} base - * @param {boolean} has_pathname_in_hash + * @param {boolean} hash_routing */ -export function is_external_url(url, base, has_pathname_in_hash) { - return ( - url.origin !== origin || - !url.pathname.startsWith(base) || - (has_pathname_in_hash && url.pathname !== (base || '/')) - ); +export function is_external_url(url, base, hash_routing) { + if (url.origin !== origin || !url.pathname.startsWith(base)) { + return true; + } + + if (hash_routing) { + if (url.pathname === base + '/') { + return false; + } + + // be lenient if serving from filesystem + if (url.protocol === 'file:' && url.pathname.replace(/\/[^/]+\.html?$/, '') === base) { + return false; + } + + return true; + } + + return false; } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 004a5ca59a2c..550d266fc964 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -95,16 +95,21 @@ export async function render_response({ let base_expression = s(paths.base); // if appropriate, use relative paths for greater portability - if (paths.relative && !state.prerendering?.fallback) { - const segments = event.url.pathname.slice(paths.base.length).split('/').slice(2); + if (paths.relative) { + if (!state.prerendering?.fallback) { + const segments = event.url.pathname.slice(paths.base.length).split('/').slice(2); - base = segments.map(() => '..').join('/') || '.'; + base = segments.map(() => '..').join('/') || '.'; - // resolve e.g. '../..' against current location, then remove trailing slash - base_expression = `new URL(${s(base)}, location).pathname.slice(0, -1)`; + // resolve e.g. '../..' against current location, then remove trailing slash + base_expression = `new URL(${s(base)}, location).pathname.slice(0, -1)`; - if (!paths.assets || (paths.assets[0] === '/' && paths.assets !== SVELTE_KIT_ASSETS)) { - assets = base; + if (!paths.assets || (paths.assets[0] === '/' && paths.assets !== SVELTE_KIT_ASSETS)) { + assets = base; + } + } else if (options.hash_routing) { + // we have to assume that we're in the right place + base_expression = "new URL('.', location).pathname.slice(0, -1)"; } } @@ -197,7 +202,7 @@ export async function render_response({ for (const url of node.stylesheets) stylesheets.add(url); for (const url of node.fonts) fonts.add(url); - if (node.inline_styles) { + if (node.inline_styles && !client.inline) { Object.entries(await node.inline_styles()).forEach(([k, v]) => inline_styles.set(k, v)); } } @@ -223,6 +228,10 @@ export async function render_response({ return `${assets}/${path}`; }; + if (client.inline?.style) { + head += `\n\t`; + } + if (inline_styles.size > 0) { const content = Array.from(inline_styles.values()).join('\n'); @@ -293,17 +302,19 @@ export async function render_response({ modulepreloads.add(`${options.app_dir}/env.js`); } - const included_modulepreloads = Array.from(modulepreloads, (dep) => prefixed(dep)).filter( - (path) => resolve_opts.preload({ type: 'js', path }) - ); - - for (const path of included_modulepreloads) { - // see the kit.output.preloadStrategy option for details on why we have multiple options here - link_header_preloads.add(`<${encodeURI(path)}>; rel="modulepreload"; nopush`); - if (options.preload_strategy !== 'modulepreload') { - head += `\n\t\t`; - } else if (state.prerendering) { - head += `\n\t\t`; + if (!client.inline) { + const included_modulepreloads = Array.from(modulepreloads, (dep) => prefixed(dep)).filter( + (path) => resolve_opts.preload({ type: 'js', path }) + ); + + for (const path of included_modulepreloads) { + // see the kit.output.preloadStrategy option for details on why we have multiple options here + link_header_preloads.add(`<${encodeURI(path)}>; rel="modulepreload"; nopush`); + if (options.preload_strategy !== 'modulepreload') { + head += `\n\t\t`; + } else if (state.prerendering) { + head += `\n\t\t`; + } } } @@ -392,15 +403,19 @@ export async function render_response({ args.push(`{\n${indent}\t${hydrate.join(`,\n${indent}\t`)}\n${indent}}`); } - // `client.app` is a proxy for `bundleStrategy !== 'single'` - const boot = client.app - ? `Promise.all([ + // `client.app` is a proxy for `bundleStrategy === 'split'` + const boot = client.inline + ? `${client.inline.script} + + __sveltekit_${options.version_hash}.app.start(${args.join(', ')});` + : client.app + ? `Promise.all([ import(${s(prefixed(client.start))}), import(${s(prefixed(client.app))}) ]).then(([kit, app]) => { kit.start(app, ${args.join(', ')}); });` - : `import(${s(prefixed(client.start))}).then((app) => { + : `import(${s(prefixed(client.start))}).then((app) => { app.start(${args.join(', ')}) });`; diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 7aa6e2863443..ba4355a8db3f 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -74,6 +74,10 @@ export interface BuildData { stylesheets: string[]; fonts: string[]; uses_env_dynamic_public: boolean; + inline?: { + script: string; + style: string | undefined; + }; } | null; server_manifest: import('vite').Manifest; } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index bd268a10ff31..248dd814b10c 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -481,14 +481,15 @@ declare module '@sveltejs/kit' { */ preloadStrategy?: 'modulepreload' | 'preload-js' | 'preload-mjs'; /** - * If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios. - * If `'single'`, creates just one .js bundle and one .css file containing code for the entire app. + * - If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios. + * - If `'single'`, creates just one .js bundle and one .css file containing code for the entire app. + * - If `'inline'`, inlines all JavaScript and CSS of the entire app into the HTML. The result is usable without a server (i.e. you can just open the file in your browser). * * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks)inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions). * @default 'split' * @since 2.13.0 */ - bundleStrategy?: 'split' | 'single'; + bundleStrategy?: 'split' | 'single' | 'inline'; }; paths?: { /** @@ -1667,6 +1668,10 @@ declare module '@sveltejs/kit' { stylesheets: string[]; fonts: string[]; uses_env_dynamic_public: boolean; + inline?: { + script: string; + style: string | undefined; + }; } | null; server_manifest: import('vite').Manifest; } From 64c8e04accce4e9874448d76f2ea5111474fd37d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 22 Dec 2024 12:32:01 -0500 Subject: [PATCH 0844/1135] Version Packages (#13225) Co-authored-by: github-actions[bot] --- .changeset/strange-geese-train.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/strange-geese-train.md diff --git a/.changeset/strange-geese-train.md b/.changeset/strange-geese-train.md deleted file mode 100644 index 0db288421ee2..000000000000 --- a/.changeset/strange-geese-train.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: add `bundleStrategy: 'inline'` option diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 7b69a0e1b985..5134dc86d8cf 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.15.0 +### Minor Changes + + +- feat: add `bundleStrategy: 'inline'` option ([#13193](https://github.com/sveltejs/kit/pull/13193)) + ## 2.14.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 12c91f69ef41..2dfbd48ac1f3 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.14.1", + "version": "2.15.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 73fa754ce76a..9ab140be9205 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.14.1'; +export const VERSION = '2.15.0'; From 12ce7eb19fb57907e3db29ef981a8c7a0afc4b6f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 24 Dec 2024 00:53:42 -0500 Subject: [PATCH 0845/1135] fix: add CSP hashes/nonces to inline styles when using (#13232) --- .changeset/angry-geckos-dream.md | 5 +++++ packages/kit/src/runtime/server/page/csp.js | 4 ---- packages/kit/src/runtime/server/page/render.js | 15 +++++++-------- 3 files changed, 12 insertions(+), 12 deletions(-) create mode 100644 .changeset/angry-geckos-dream.md diff --git a/.changeset/angry-geckos-dream.md b/.changeset/angry-geckos-dream.md new file mode 100644 index 000000000000..a111db1ff8b9 --- /dev/null +++ b/.changeset/angry-geckos-dream.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: add CSP hashes/nonces to inline styles when using `bundleStrategy: 'inline'` diff --git a/packages/kit/src/runtime/server/page/csp.js b/packages/kit/src/runtime/server/page/csp.js index 7596385ba8a5..1376235b45de 100644 --- a/packages/kit/src/runtime/server/page/csp.js +++ b/packages/kit/src/runtime/server/page/csp.js @@ -186,10 +186,6 @@ class BaseProvider { this.#style_src.push(source); } - if (this.#style_src_needs_csp) { - this.#style_src.push(source); - } - if (this.#style_src_attr_needs_csp) { this.#style_src_attr.push(source); } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 550d266fc964..d8fbe32a7ed8 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -228,19 +228,18 @@ export async function render_response({ return `${assets}/${path}`; }; - if (client.inline?.style) { - head += `\n\t`; - } - - if (inline_styles.size > 0) { - const content = Array.from(inline_styles.values()).join('\n'); + // inline styles can come from `bundleStrategy: 'inline'` or `inlineStyleThreshold` + const style = client.inline + ? client.inline?.style + : Array.from(inline_styles.values()).join('\n'); + if (style) { const attributes = __SVELTEKIT_DEV__ ? [' data-sveltekit'] : []; if (csp.style_needs_nonce) attributes.push(` nonce="${csp.nonce}"`); - csp.add_style(content); + csp.add_style(style); - head += `\n\t${content}`; + head += `\n\t${style}`; } for (const dep of stylesheets) { From 619c00e0798d1fe2434e36cf4b0a800ade8112d6 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 24 Dec 2024 09:19:52 -0500 Subject: [PATCH 0846/1135] chore: make some links root-relative (#13237) --- documentation/docs/10-getting-started/10-introduction.md | 2 +- documentation/docs/20-core-concepts/50-state-management.md | 2 +- documentation/docs/60-appendix/50-additional-resources.md | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/docs/10-getting-started/10-introduction.md b/documentation/docs/10-getting-started/10-introduction.md index d1a5ca169533..a7f2dc3c9700 100644 --- a/documentation/docs/10-getting-started/10-introduction.md +++ b/documentation/docs/10-getting-started/10-introduction.md @@ -6,7 +6,7 @@ title: Introduction > [!NOTE] If you're new to Svelte or SvelteKit we recommend checking out the [interactive tutorial](/tutorial/kit). > -> If you get stuck, reach out for help in the [Discord chatroom](https://svelte.dev/chat). +> If you get stuck, reach out for help in the [Discord chatroom](/chat). ## What is SvelteKit? diff --git a/documentation/docs/20-core-concepts/50-state-management.md b/documentation/docs/20-core-concepts/50-state-management.md index 1cd541686f84..9c0ab1b1764a 100644 --- a/documentation/docs/20-core-concepts/50-state-management.md +++ b/documentation/docs/20-core-concepts/50-state-management.md @@ -110,7 +110,7 @@ You might wonder how we're able to use `page.data` and other [app state]($app-st

Welcome {user().name}

``` -> [!NOTE] We're passing a function into `setContext` to keep reactivity across boundaries. Read more about it [here](https://svelte.dev/docs/svelte/$state#Passing-state-into-functions) +> [!NOTE] We're passing a function into `setContext` to keep reactivity across boundaries. Read more about it [here](/docs/svelte/$state#Passing-state-into-functions) > [!LEGACY] > You also use stores from `svelte/store` for this, but when using Svelte 5 it is recommended to make use of universal reactivity instead. diff --git a/documentation/docs/60-appendix/50-additional-resources.md b/documentation/docs/60-appendix/50-additional-resources.md index f59f0faadf59..edc816f38c4f 100644 --- a/documentation/docs/60-appendix/50-additional-resources.md +++ b/documentation/docs/60-appendix/50-additional-resources.md @@ -20,4 +20,4 @@ SvelteKit users have also published plenty of examples on GitHub, under the [#sv ## Support -You can ask for help on [Discord](https://svelte.dev/chat) and [StackOverflow](https://stackoverflow.com/questions/tagged/sveltekit). Please first search for information related to your issue in the FAQ, Google or another search engine, issue tracker, and Discord chat history in order to be respectful of others' time. There are many more people asking questions than answering them, so this will help in allowing the community to grow in a scalable fashion. +You can ask for help on [Discord](/chat) and [StackOverflow](https://stackoverflow.com/questions/tagged/sveltekit). Please first search for information related to your issue in the FAQ, Google or another search engine, issue tracker, and Discord chat history in order to be respectful of others' time. There are many more people asking questions than answering them, so this will help in allowing the community to grow in a scalable fashion. From c0ca0736d969a9f563396f68d7ea64ca3dbf2d43 Mon Sep 17 00:00:00 2001 From: Baptiste Fontaine Date: Thu, 26 Dec 2024 08:22:06 +0100 Subject: [PATCH 0847/1135] docs: don't advise to use loading="eager" on images because it's already the default (#13228) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Don't advise to use loading="eager" on images because it's already the default Adding this attribute doesn’t change anything. https://developer.mozilla.org/en-US/docs/Web/API/HTMLImageElement/loading#value * Update documentation/docs/40-best-practices/07-images.md Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- documentation/docs/40-best-practices/07-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/40-best-practices/07-images.md b/documentation/docs/40-best-practices/07-images.md index 5c7040b32be9..8bf255243565 100644 --- a/documentation/docs/40-best-practices/07-images.md +++ b/documentation/docs/40-best-practices/07-images.md @@ -158,7 +158,7 @@ CDNs can generally be used without any need for a library. However, there are a - Consider serving all images via CDN regardless of the image optimization types you use. CDNs reduce latency by distributing copies of static assets globally. - Your original images should have a good quality/resolution and should have 2x the width it will be displayed at to serve HiDPI devices. Image processing can size images down to save bandwidth when serving smaller screens, but it would be a waste of bandwidth to invent pixels to size images up. - For images which are much larger than the width of a mobile device (roughly 400px), such as a hero image taking the width of the page design, specify `sizes` so that smaller images can be served on smaller devices. -- For important images, such as the [largest contentful paint (LCP)](https://web.dev/articles/lcp) image, set `fetchpriority="high" loading="eager"` to prioritize loading as early as possible. +- For important images, such as the [largest contentful paint (LCP)](https://web.dev/articles/lcp) image, set `fetchpriority="high"` and avoid `loading="lazy"` to prioritize loading as early as possible. - Give the image a container or styling so that it is constrained and does not jump around while the page is loading affecting your [cumulative layout shift (CLS)](https://web.dev/articles/cls). `width` and `height` help the browser to reserve space while the image is still loading, so `@sveltejs/enhanced-img` will add a `width` and `height` for you. - Always provide a good `alt` text. The Svelte compiler will warn you if you don't do this. - Do not use `em` or `rem` in `sizes` and change the default size of these measures. When used in `sizes` or `@media` queries, `em` and `rem` are both defined to mean the user's default `font-size`. For a `sizes` declaration like `sizes="(min-width: 768px) min(100vw, 108rem), 64rem"`, the actual `em` or `rem` that controls how the image is laid out on the page can be different if changed by CSS. For example, do not do something like `html { font-size: 62.5%; }` as the slot reserved by the browser preloader will now end up being larger than the actual slot of the CSS object model once it has been created. From 528af75f846f971ef64e4d109ac5e22fca046b90 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 26 Dec 2024 18:56:22 -0700 Subject: [PATCH 0848/1135] fix: silence dev/prod warning during sync (#13244) --- .changeset/clever-phones-reply.md | 5 +++++ packages/kit/src/utils/routing.js | 3 ++- 2 files changed, 7 insertions(+), 1 deletion(-) create mode 100644 .changeset/clever-phones-reply.md diff --git a/.changeset/clever-phones-reply.md b/.changeset/clever-phones-reply.md new file mode 100644 index 000000000000..156658340954 --- /dev/null +++ b/.changeset/clever-phones-reply.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: silence dev/prod warning during sync diff --git a/packages/kit/src/utils/routing.js b/packages/kit/src/utils/routing.js index 7d988317a058..19eef5b265c3 100644 --- a/packages/kit/src/utils/routing.js +++ b/packages/kit/src/utils/routing.js @@ -1,4 +1,5 @@ -import { BROWSER } from 'esm-env'; +// @ts-ignore - need to publish types for sub-package imports +import BROWSER from 'esm-env/browser'; const param_pattern = /^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/; From c2b0d89e774b1f27b680db0a686d6c79a64735dc Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 27 Dec 2024 10:20:13 +0800 Subject: [PATCH 0849/1135] feat: remove esbuild step (#13132) --- .changeset/famous-rules-lick.md | 5 + packages/adapter-cloudflare/index.js | 89 +--------- packages/adapter-cloudflare/package.json | 4 +- pnpm-lock.yaml | 217 ++++++++++++++++++++--- 4 files changed, 209 insertions(+), 106 deletions(-) create mode 100644 .changeset/famous-rules-lick.md diff --git a/.changeset/famous-rules-lick.md b/.changeset/famous-rules-lick.md new file mode 100644 index 000000000000..e18201585945 --- /dev/null +++ b/.changeset/famous-rules-lick.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': major +--- + +feat: remove esbuild step diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 677661dfefbb..32f0e098509b 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -1,24 +1,8 @@ import { existsSync, writeFileSync } from 'node:fs'; import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; -import * as esbuild from 'esbuild'; import { getPlatformProxy } from 'wrangler'; -// list from https://developers.cloudflare.com/workers/runtime-apis/nodejs/ -const compatible_node_modules = [ - 'assert', - 'async_hooks', - 'buffer', - 'crypto', - 'diagnostics_channel', - 'events', - 'path', - 'process', - 'stream', - 'string_decoder', - 'util' -]; - /** @type {import('./index.js').default} */ export default function (options = {}) { return { @@ -52,7 +36,7 @@ export default function (options = {}) { const written_files = builder.writeClient(dest_dir); builder.writePrerendered(dest_dir); - const relativePath = path.posix.relative(tmp, builder.getServerDirectory()); + const relativePath = path.posix.relative(dest, builder.getServerDirectory()); writeFileSync( `${tmp}/manifest.js`, @@ -74,77 +58,14 @@ export default function (options = {}) { }); } - builder.copy(`${files}/worker.js`, `${tmp}/_worker.js`, { + writeFileSync(`${dest}/.assetsignore`, generate_assetsignore(), { flag: 'a' }); + + builder.copy(`${files}/worker.js`, `${dest}/_worker.js`, { replace: { SERVER: `${relativePath}/index.js`, - MANIFEST: './manifest.js' + MANIFEST: `${path.posix.relative(dest, tmp)}/manifest.js` } }); - - const external = ['cloudflare:*', ...compatible_node_modules.map((id) => `node:${id}`)]; - - try { - const result = await esbuild.build({ - platform: 'browser', - // https://github.com/cloudflare/workers-sdk/blob/a12b2786ce745f24475174bcec994ad691e65b0f/packages/wrangler/src/deployment-bundle/bundle.ts#L35-L36 - conditions: ['workerd', 'worker', 'browser'], - sourcemap: 'linked', - target: 'es2022', - entryPoints: [`${tmp}/_worker.js`], - outfile: `${dest}/_worker.js`, - allowOverwrite: true, - format: 'esm', - bundle: true, - loader: { - '.wasm': 'copy', - '.woff': 'copy', - '.woff2': 'copy', - '.ttf': 'copy', - '.eot': 'copy', - '.otf': 'copy' - }, - external, - alias: Object.fromEntries(compatible_node_modules.map((id) => [id, `node:${id}`])), - logLevel: 'silent' - }); - - if (result.warnings.length > 0) { - const formatted = await esbuild.formatMessages(result.warnings, { - kind: 'warning', - color: true - }); - - console.error(formatted.join('\n')); - } - } catch (error) { - for (const e of error.errors) { - for (const node of e.notes) { - const match = - /The package "(.+)" wasn't found on the file system but is built into node/.exec( - node.text - ); - - if (match) { - node.text = `Cannot use "${match[1]}" when deploying to Cloudflare.`; - } - } - } - - const formatted = await esbuild.formatMessages(error.errors, { - kind: 'error', - color: true - }); - - console.error(formatted.join('\n')); - - throw new Error( - `Bundling with esbuild failed with ${error.errors.length} ${ - error.errors.length === 1 ? 'error' : 'errors' - }` - ); - } - - writeFileSync(`${dest}/.assetsignore`, generate_assetsignore(), { flag: 'a' }); }, async emulate() { const proxy = await getPlatformProxy(options.platformProxy); diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index d3c908e82cd2..3ca5c83e31bd 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -40,7 +40,7 @@ "prepublishOnly": "pnpm build" }, "dependencies": { - "@cloudflare/workers-types": "^4.20231121.0", + "@cloudflare/workers-types": "^4.20241106.0", "esbuild": "^0.24.0", "worktop": "0.8.0-next.18" }, @@ -52,6 +52,6 @@ }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", - "wrangler": "^3.28.4" + "wrangler": "^3.87.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e1af7a424d7a..e16f6936122f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -55,8 +55,8 @@ importers: packages/adapter-cloudflare: dependencies: '@cloudflare/workers-types': - specifier: ^4.20231121.0 - version: 4.20240405.0 + specifier: ^4.20241106.0 + version: 4.20241205.0 esbuild: specifier: ^0.24.0 version: 0.24.0 @@ -64,8 +64,8 @@ importers: specifier: 0.8.0-next.18 version: 0.8.0-next.18 wrangler: - specifier: ^3.28.4 - version: 3.63.1(@cloudflare/workers-types@4.20240405.0) + specifier: ^3.87.0 + version: 3.94.0(@cloudflare/workers-types@4.20241205.0) devDependencies: '@sveltejs/kit': specifier: workspace:^ @@ -1056,7 +1056,7 @@ importers: dependencies: chokidar: specifier: ^4.0.0 - version: 4.0.1 + version: 4.0.0 kleur: specifier: ^4.1.5 version: 4.1.5 @@ -1237,33 +1237,70 @@ packages: cpu: [x64] os: [darwin] + '@cloudflare/workerd-darwin-64@1.20241205.0': + resolution: {integrity: sha512-TArEZkSZkHJyEwnlWWkSpCI99cF6lJ14OVeEoI9Um/+cD9CKZLM9vCmsLeKglKheJ0KcdCnkA+DbeD15t3VaWg==} + engines: {node: '>=16'} + cpu: [x64] + os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20240701.0': resolution: {integrity: sha512-w80ZVAgfH4UwTz7fXZtk7KmS2FzlXniuQm4ku4+cIgRTilBAuKqjpOjwUCbx5g13Gqcm9NuiHce+IDGtobRTIQ==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] + '@cloudflare/workerd-darwin-arm64@1.20241205.0': + resolution: {integrity: sha512-u5eqKa9QRdA8MugfgCoD+ADDjY6EpKbv3hSYJETmmUh17l7WXjWBzv4pUvOKIX67C0UzMUy4jZYwC53MymhX3w==} + engines: {node: '>=16'} + cpu: [arm64] + os: [darwin] + '@cloudflare/workerd-linux-64@1.20240701.0': resolution: {integrity: sha512-UWLr/Anxwwe/25nGv451MNd2jhREmPt/ws17DJJqTLAx6JxwGWA15MeitAIzl0dbxRFAJa+0+R8ag2WR3F/D6g==} engines: {node: '>=16'} cpu: [x64] os: [linux] + '@cloudflare/workerd-linux-64@1.20241205.0': + resolution: {integrity: sha512-OYA7S5zpumMamWEW+IhhBU6YojIEocyE5X/YFPiTOCrDE3dsfr9t6oqNE7hxGm1VAAu+Irtl+a/5LwmBOU681w==} + engines: {node: '>=16'} + cpu: [x64] + os: [linux] + '@cloudflare/workerd-linux-arm64@1.20240701.0': resolution: {integrity: sha512-3kCnF9kYgov1ggpuWbgpXt4stPOIYtVmPCa7MO2xhhA0TWP6JDUHRUOsnmIgKrvDjXuXqlK16cdg3v+EWsaPJg==} engines: {node: '>=16'} cpu: [arm64] os: [linux] + '@cloudflare/workerd-linux-arm64@1.20241205.0': + resolution: {integrity: sha512-qAzecONjFJGIAVJZKExQ5dlbic0f3d4A+GdKa+H6SoUJtPaWiE3K6WuePo4JOT7W3/Zfh25McmX+MmpMUUcM5Q==} + engines: {node: '>=16'} + cpu: [arm64] + os: [linux] + '@cloudflare/workerd-windows-64@1.20240701.0': resolution: {integrity: sha512-6IPGITRAeS67j3BH1rN4iwYWDt47SqJG7KlZJ5bB4UaNAia4mvMBSy/p2p4vA89bbXoDRjMtEvRu7Robu6O7hQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] + '@cloudflare/workerd-windows-64@1.20241205.0': + resolution: {integrity: sha512-BEab+HiUgCdl6GXAT7EI2yaRtDPiRJlB94XLvRvXi1ZcmQqsrq6awGo6apctFo4WUL29V7c09LxmN4HQ3X2Tvg==} + engines: {node: '>=16'} + cpu: [x64] + os: [win32] + + '@cloudflare/workers-shared@0.11.0': + resolution: {integrity: sha512-A+lQ8xp7992qSeMmuQ0ssL6CPmm+ZmAv6Ddikan0n1jjpMAic+97l7xtVIsswSn9iLMFPYQ9uNN/8Fl0AgARIQ==} + engines: {node: '>=16.7.0'} + '@cloudflare/workers-types@4.20240405.0': resolution: {integrity: sha512-sEVOhyOgXUwfLkgHqbLZa/sfkSYrh7/zLmI6EZNibPaVPvAnAcItbNNl3SAlLyLKuwf8m4wAIAgu9meKWCvXjg==} + '@cloudflare/workers-types@4.20241205.0': + resolution: {integrity: sha512-pj1VKRHT/ScQbHOIMFODZaNAlJHQHdBSZXNIdr9ebJzwBff9Qz8VdqhbhggV7f+aUEh8WSbrsPIo4a+WtgjUvw==} + '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} @@ -2215,6 +2252,10 @@ packages: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} + chokidar@4.0.0: + resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} + engines: {node: '>= 14.16.0'} + chokidar@4.0.1: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} @@ -2245,7 +2286,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} @@ -2289,6 +2330,9 @@ packages: date-fns@3.6.0: resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} + date-fns@4.1.0: + resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} + debug@4.3.7: resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} engines: {node: '>=6.0'} @@ -2523,8 +2567,8 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.4.2: - resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==} + fdir@6.4.0: + resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2623,8 +2667,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.13.0: - resolution: {integrity: sha512-49TewVEz0UxZjr1WYYsWpPrhyC/B/pA8Bq0fUmet2n+eR7yn0IvNzNaoBwnK6mdkzcN+se7Ez9zUgULTz2QH4g==} + globals@15.12.0: + resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -2742,6 +2786,9 @@ packages: isexe@2.0.0: resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + itty-time@1.0.6: + resolution: {integrity: sha512-+P8IZaLLBtFv8hCkIjcymZOp4UJ+xW6bSlQsXGqrkmJh7vSiMFSlNne0mCYagEE0N7HDNR5jJBRxwN0oYv61Rw==} + jackspeak@3.4.3: resolution: {integrity: sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==} @@ -2902,6 +2949,11 @@ packages: engines: {node: '>=16.13'} hasBin: true + miniflare@3.20241205.0: + resolution: {integrity: sha512-Z0cTtIf6ZrcAJ3SrOI9EUM3s4dkGhNeU6Ubl8sroYhsPVD+rtz3m5+p6McHFWCkcMff1o60X5XEKVTmkz0gbpA==} + engines: {node: '>=16.13'} + hasBin: true + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2994,6 +3046,9 @@ packages: engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} hasBin: true + ohash@1.1.4: + resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + once@1.4.0: resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} @@ -3071,6 +3126,9 @@ packages: path-to-regexp@6.2.2: resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} + path-to-regexp@6.3.0: + resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} + path-type@4.0.0: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} @@ -3189,8 +3247,8 @@ packages: resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} engines: {node: '>=8.10.0'} - readdirp@4.0.2: - resolution: {integrity: sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==} + readdirp@4.0.1: + resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} engines: {node: '>= 14.16.0'} regenerator-runtime@0.14.1: @@ -3539,6 +3597,9 @@ packages: ufo@1.5.3: resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} + ufo@1.5.4: + resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} @@ -3549,6 +3610,9 @@ packages: unenv-nightly@1.10.0-1717606461.a117952: resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} + unenv-nightly@2.0.0-20241204-140205-a5d5190: + resolution: {integrity: sha512-jpmAytLeiiW01pl5bhVn9wYJ4vtiLdhGe10oXlJBuQEX8mxjxO8BlEXGHU4vr4yEikjFP1wsomTHt/CLU8kUwg==} + universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} engines: {node: '>= 4.0.0'} @@ -3674,6 +3738,11 @@ packages: engines: {node: '>=16'} hasBin: true + workerd@1.20241205.0: + resolution: {integrity: sha512-vso/2n0c5SdBDWiD+Sx5gM7unA6SiZXRVUHDqH1euoP/9mFVHZF8icoYsNLB87b/TX8zNgpae+I5N/xFpd9v0g==} + engines: {node: '>=16'} + hasBin: true + worktop@0.8.0-next.18: resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} engines: {node: '>=12'} @@ -3688,6 +3757,16 @@ packages: '@cloudflare/workers-types': optional: true + wrangler@3.94.0: + resolution: {integrity: sha512-4yw8FKp6SI6WQkALnRlWYjehmgliaaMroLLnymWS9qHndjqrZIPZ16trrhl1HvAEDov/rIg0jZ4nxo5n6K0a/Q==} + engines: {node: '>=16.17.0'} + hasBin: true + peerDependencies: + '@cloudflare/workers-types': ^4.20241205.0 + peerDependenciesMeta: + '@cloudflare/workers-types': + optional: true + wrap-ansi@7.0.0: resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} engines: {node: '>=10'} @@ -3909,20 +3988,42 @@ snapshots: '@cloudflare/workerd-darwin-64@1.20240701.0': optional: true + '@cloudflare/workerd-darwin-64@1.20241205.0': + optional: true + '@cloudflare/workerd-darwin-arm64@1.20240701.0': optional: true + '@cloudflare/workerd-darwin-arm64@1.20241205.0': + optional: true + '@cloudflare/workerd-linux-64@1.20240701.0': optional: true + '@cloudflare/workerd-linux-64@1.20241205.0': + optional: true + '@cloudflare/workerd-linux-arm64@1.20240701.0': optional: true + '@cloudflare/workerd-linux-arm64@1.20241205.0': + optional: true + '@cloudflare/workerd-windows-64@1.20240701.0': optional: true + '@cloudflare/workerd-windows-64@1.20241205.0': + optional: true + + '@cloudflare/workers-shared@0.11.0': + dependencies: + mime: 3.0.0 + zod: 3.22.4 + '@cloudflare/workers-types@4.20240405.0': {} + '@cloudflare/workers-types@4.20241205.0': {} + '@cspotcode/source-map-support@0.8.1': dependencies: '@jridgewell/trace-mapping': 0.3.9 @@ -4302,7 +4403,7 @@ snapshots: '@rollup/pluginutils': 5.1.3(rollup@4.27.4) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.0(picomatch@4.0.2) is-reference: 1.2.1 magic-string: 0.30.14 picomatch: 4.0.2 @@ -4402,7 +4503,7 @@ snapshots: eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.9.0(eslint@9.6.0) eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.2.9) - globals: 15.13.0 + globals: 15.12.0 typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) @@ -4743,9 +4844,13 @@ snapshots: optionalDependencies: fsevents: 2.3.3 + chokidar@4.0.0: + dependencies: + readdirp: 4.0.1 + chokidar@4.0.1: dependencies: - readdirp: 4.0.2 + readdirp: 4.0.1 chownr@3.0.0: {} @@ -4803,6 +4908,8 @@ snapshots: date-fns@3.6.0: {} + date-fns@4.1.0: {} + debug@4.3.7: dependencies: ms: 2.1.3 @@ -4948,7 +5055,7 @@ snapshots: eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) get-tsconfig: 4.8.1 - globals: 15.13.0 + globals: 15.12.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 @@ -5096,7 +5203,7 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.4.2(picomatch@4.0.2): + fdir@6.4.0(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -5203,7 +5310,7 @@ snapshots: globals@14.0.0: {} - globals@15.13.0: {} + globals@15.12.0: {} globalyzer@0.1.0: {} @@ -5307,6 +5414,8 @@ snapshots: isexe@2.0.0: {} + itty-time@1.0.6: {} + jackspeak@3.4.3: dependencies: '@isaacs/cliui': 8.0.2 @@ -5456,6 +5565,25 @@ snapshots: - supports-color - utf-8-validate + miniflare@3.20241205.0: + dependencies: + '@cspotcode/source-map-support': 0.8.1 + acorn: 8.14.0 + acorn-walk: 8.3.2 + capnp-ts: 0.7.0 + exit-hook: 2.2.1 + glob-to-regexp: 0.4.1 + stoppable: 1.1.0 + undici: 5.28.4 + workerd: 1.20241205.0 + ws: 8.18.0 + youch: 3.3.3 + zod: 3.22.4 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -5523,6 +5651,8 @@ snapshots: npm-bundled: 2.0.1 npm-normalize-package-bin: 2.0.0 + ohash@1.1.4: {} + once@1.4.0: dependencies: wrappy: 1.0.2 @@ -5592,6 +5722,8 @@ snapshots: path-to-regexp@6.2.2: {} + path-to-regexp@6.3.0: {} + path-type@4.0.0: {} pathe@1.1.2: {} @@ -5681,7 +5813,7 @@ snapshots: dependencies: picomatch: 2.3.1 - readdirp@4.0.2: {} + readdirp@4.0.1: {} regenerator-runtime@0.14.1: {} @@ -5895,7 +6027,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.1 - fdir: 6.4.2(picomatch@4.0.2) + fdir: 6.4.0(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 svelte: 5.2.9 @@ -6023,6 +6155,8 @@ snapshots: ufo@1.5.3: {} + ufo@1.5.4: {} + undici-types@5.26.5: {} undici@5.28.4: @@ -6038,6 +6172,13 @@ snapshots: pathe: 1.1.2 ufo: 1.5.3 + unenv-nightly@2.0.0-20241204-140205-a5d5190: + dependencies: + defu: 6.1.4 + ohash: 1.1.4 + pathe: 1.1.2 + ufo: 1.5.4 + universalify@0.1.2: {} uri-js@4.4.1: @@ -6163,6 +6304,14 @@ snapshots: '@cloudflare/workerd-linux-arm64': 1.20240701.0 '@cloudflare/workerd-windows-64': 1.20240701.0 + workerd@1.20241205.0: + optionalDependencies: + '@cloudflare/workerd-darwin-64': 1.20241205.0 + '@cloudflare/workerd-darwin-arm64': 1.20241205.0 + '@cloudflare/workerd-linux-64': 1.20241205.0 + '@cloudflare/workerd-linux-arm64': 1.20241205.0 + '@cloudflare/workerd-windows-64': 1.20241205.0 + worktop@0.8.0-next.18: dependencies: mrmime: 2.0.0 @@ -6194,6 +6343,34 @@ snapshots: - supports-color - utf-8-validate + wrangler@3.94.0(@cloudflare/workers-types@4.20241205.0): + dependencies: + '@cloudflare/kv-asset-handler': 0.3.4 + '@cloudflare/workers-shared': 0.11.0 + '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) + '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) + blake3-wasm: 2.1.5 + chokidar: 4.0.1 + date-fns: 4.1.0 + esbuild: 0.17.19 + itty-time: 1.0.6 + miniflare: 3.20241205.0 + nanoid: 3.3.7 + path-to-regexp: 6.3.0 + resolve: 1.22.8 + selfsigned: 2.4.1 + source-map: 0.6.1 + unenv: unenv-nightly@2.0.0-20241204-140205-a5d5190 + workerd: 1.20241205.0 + xxhash-wasm: 1.0.2 + optionalDependencies: + '@cloudflare/workers-types': 4.20241205.0 + fsevents: 2.3.3 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + wrap-ansi@7.0.0: dependencies: ansi-styles: 4.3.0 From 82cac1672b93180340092f1e81b1e37255aec665 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 26 Dec 2024 18:50:11 -0800 Subject: [PATCH 0850/1135] chore: upgrade cross-spawn to address dependabot warning (#13245) --- pnpm-lock.yaml | 260 ++++--------------------------------------------- 1 file changed, 19 insertions(+), 241 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e16f6936122f..5fa4201957cb 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -84,7 +84,7 @@ importers: dependencies: '@cloudflare/workers-types': specifier: ^4.20231121.0 - version: 4.20240405.0 + version: 4.20241205.0 '@iarna/toml': specifier: ^2.2.5 version: 2.2.5 @@ -93,7 +93,7 @@ importers: version: 0.24.0 wrangler: specifier: ^3.28.4 - version: 3.63.1(@cloudflare/workers-types@4.20240405.0) + version: 3.94.0(@cloudflare/workers-types@4.20241205.0) devDependencies: '@cloudflare/kv-asset-handler': specifier: ^0.3.0 @@ -1056,7 +1056,7 @@ importers: dependencies: chokidar: specifier: ^4.0.0 - version: 4.0.0 + version: 4.0.1 kleur: specifier: ^4.1.5 version: 4.1.5 @@ -1231,60 +1231,30 @@ packages: resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} - '@cloudflare/workerd-darwin-64@1.20240701.0': - resolution: {integrity: sha512-XAZa4ZP+qyTn6JQQACCPH09hGZXP2lTnWKkmg5mPwT8EyRzCKLkczAf98vPP5bq7JZD/zORdFWRY0dOTap8zTQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [darwin] - '@cloudflare/workerd-darwin-64@1.20241205.0': resolution: {integrity: sha512-TArEZkSZkHJyEwnlWWkSpCI99cF6lJ14OVeEoI9Um/+cD9CKZLM9vCmsLeKglKheJ0KcdCnkA+DbeD15t3VaWg==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20240701.0': - resolution: {integrity: sha512-w80ZVAgfH4UwTz7fXZtk7KmS2FzlXniuQm4ku4+cIgRTilBAuKqjpOjwUCbx5g13Gqcm9NuiHce+IDGtobRTIQ==} - engines: {node: '>=16'} - cpu: [arm64] - os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20241205.0': resolution: {integrity: sha512-u5eqKa9QRdA8MugfgCoD+ADDjY6EpKbv3hSYJETmmUh17l7WXjWBzv4pUvOKIX67C0UzMUy4jZYwC53MymhX3w==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20240701.0': - resolution: {integrity: sha512-UWLr/Anxwwe/25nGv451MNd2jhREmPt/ws17DJJqTLAx6JxwGWA15MeitAIzl0dbxRFAJa+0+R8ag2WR3F/D6g==} - engines: {node: '>=16'} - cpu: [x64] - os: [linux] - '@cloudflare/workerd-linux-64@1.20241205.0': resolution: {integrity: sha512-OYA7S5zpumMamWEW+IhhBU6YojIEocyE5X/YFPiTOCrDE3dsfr9t6oqNE7hxGm1VAAu+Irtl+a/5LwmBOU681w==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20240701.0': - resolution: {integrity: sha512-3kCnF9kYgov1ggpuWbgpXt4stPOIYtVmPCa7MO2xhhA0TWP6JDUHRUOsnmIgKrvDjXuXqlK16cdg3v+EWsaPJg==} - engines: {node: '>=16'} - cpu: [arm64] - os: [linux] - '@cloudflare/workerd-linux-arm64@1.20241205.0': resolution: {integrity: sha512-qAzecONjFJGIAVJZKExQ5dlbic0f3d4A+GdKa+H6SoUJtPaWiE3K6WuePo4JOT7W3/Zfh25McmX+MmpMUUcM5Q==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20240701.0': - resolution: {integrity: sha512-6IPGITRAeS67j3BH1rN4iwYWDt47SqJG7KlZJ5bB4UaNAia4mvMBSy/p2p4vA89bbXoDRjMtEvRu7Robu6O7hQ==} - engines: {node: '>=16'} - cpu: [x64] - os: [win32] - '@cloudflare/workerd-windows-64@1.20241205.0': resolution: {integrity: sha512-BEab+HiUgCdl6GXAT7EI2yaRtDPiRJlB94XLvRvXi1ZcmQqsrq6awGo6apctFo4WUL29V7c09LxmN4HQ3X2Tvg==} engines: {node: '>=16'} @@ -1295,9 +1265,6 @@ packages: resolution: {integrity: sha512-A+lQ8xp7992qSeMmuQ0ssL6CPmm+ZmAv6Ddikan0n1jjpMAic+97l7xtVIsswSn9iLMFPYQ9uNN/8Fl0AgARIQ==} engines: {node: '>=16.7.0'} - '@cloudflare/workers-types@4.20240405.0': - resolution: {integrity: sha512-sEVOhyOgXUwfLkgHqbLZa/sfkSYrh7/zLmI6EZNibPaVPvAnAcItbNNl3SAlLyLKuwf8m4wAIAgu9meKWCvXjg==} - '@cloudflare/workers-types@4.20241205.0': resolution: {integrity: sha512-pj1VKRHT/ScQbHOIMFODZaNAlJHQHdBSZXNIdr9ebJzwBff9Qz8VdqhbhggV7f+aUEh8WSbrsPIo4a+WtgjUvw==} @@ -2163,10 +2130,6 @@ packages: resolution: {integrity: sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==} engines: {node: '>=12'} - anymatch@3.1.3: - resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} - engines: {node: '>= 8'} - argparse@1.0.10: resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} @@ -2202,10 +2165,6 @@ packages: resolution: {integrity: sha512-pbnl5XzGBdrFU/wT4jqmJVPn2B6UHPBOhzMQkY/SPUPB6QtUXtmBHBIwCbXJol93mOpGMnQyP/+BB19q04xj7g==} engines: {node: '>=4'} - binary-extensions@2.3.0: - resolution: {integrity: sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==} - engines: {node: '>=8'} - bindings@1.5.0: resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} @@ -2248,14 +2207,6 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - chokidar@3.6.0: - resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} - engines: {node: '>= 8.10.0'} - - chokidar@4.0.0: - resolution: {integrity: sha512-mxIojEAQcuEvT/lyXq+jf/3cO/KoA6z4CeNDGGevTybECPOMFCnQy3OPahluUkbqgPNGw5Bi78UC7Po6Lhy+NA==} - engines: {node: '>= 14.16.0'} - chokidar@4.0.1: resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} engines: {node: '>= 14.16.0'} @@ -2286,7 +2237,7 @@ packages: resolution: {integrity: sha512-W9pAhw0ja1Edb5GVdIF1mjZw/ASI0AlShXM83UUGe2DVr5TdAPEA1OA8m/g8zWp9x6On7gqufY+FatDbC3MDQg==} concat-map@0.0.1: - resolution: {integrity: sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=} + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} @@ -2312,8 +2263,8 @@ packages: cross-spawn@5.1.0: resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.3: - resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + cross-spawn@7.0.6: + resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} cssesc@3.0.0: @@ -2327,9 +2278,6 @@ packages: dataloader@1.4.0: resolution: {integrity: sha512-68s5jYdlvasItOJnCuI2Q9s4q98g0pCyL3HrcKJu8KNugUl8ahgmZYg38ysLTgQjjXX3H8CJLkAvWrclWfcalw==} - date-fns@3.6.0: - resolution: {integrity: sha512-fRHTG8g/Gif+kSh50gaGEdToemgfj74aRX3swtiouboip5JDLAyDE9F11nHMIcvOaXeOC6D7SpNhi7uFyB7Uww==} - date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} @@ -2412,8 +2360,8 @@ packages: emoji-regex@9.2.2: resolution: {integrity: sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==} - enhanced-resolve@5.17.1: - resolution: {integrity: sha512-LMHl3dXhTcfv8gM4kEzIUeTQ+7fpdA0l2tUf34BddXPkz2A5xJ5L/Pchd5BL6rdccM9QGvu0sWZzK1Z1t4wwyg==} + enhanced-resolve@5.18.0: + resolution: {integrity: sha512-0/r0MySGYG8YqlayBZ6MuCfECmHFdJ5qyPh8s8wa5Hnm6SaFLSK1VYCbj+NKp090Nm1caZhD+QTnmxO7esYGyQ==} engines: {node: '>=10.13.0'} enquirer@2.4.1: @@ -2667,8 +2615,8 @@ packages: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} - globals@15.12.0: - resolution: {integrity: sha512-1+gLErljJFhbOVyaetcwJiJ4+eLe45S2E7P5UiZ9xGfeq3ATQf5DOv9G7MH3gGbKQLkzmNh2DxfZwLdw+j6oTQ==} + globals@15.14.0: + resolution: {integrity: sha512-OkToC372DtlQeje9/zHIo5CT8lRP/FUgEOKBEhU4e0abL7J7CD24fD9ohiLN5hagG/kWCYj4K5oaxxtj2Z0Dig==} engines: {node: '>=18'} globalyzer@0.1.0: @@ -2739,10 +2687,6 @@ packages: is-arrayish@0.3.2: resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} - is-binary-path@2.1.0: - resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} - engines: {node: '>=8'} - is-core-module@2.13.1: resolution: {integrity: sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==} @@ -2944,11 +2888,6 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - miniflare@3.20240701.0: - resolution: {integrity: sha512-m9+I+7JNyqDGftCMKp9cK9pCZkK72hAL2mM9IWwhct+ZmucLBA8Uu6+rHQqA5iod86cpwOkrB2PrPA3wx9YNgw==} - engines: {node: '>=16.13'} - hasBin: true - miniflare@3.20241205.0: resolution: {integrity: sha512-Z0cTtIf6ZrcAJ3SrOI9EUM3s4dkGhNeU6Ubl8sroYhsPVD+rtz3m5+p6McHFWCkcMff1o60X5XEKVTmkz0gbpA==} engines: {node: '>=16.13'} @@ -3004,9 +2943,6 @@ packages: no-case@3.0.4: resolution: {integrity: sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==} - node-fetch-native@1.6.4: - resolution: {integrity: sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==} - node-fetch@2.7.0: resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} engines: {node: 4.x || >=6.0.0} @@ -3029,10 +2965,6 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - normalize-path@3.0.0: - resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} - engines: {node: '>=0.10.0'} - npm-bundled@2.0.1: resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} @@ -3123,9 +3055,6 @@ packages: resolution: {integrity: sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==} engines: {node: '>=16 || 14 >=14.18'} - path-to-regexp@6.2.2: - resolution: {integrity: sha512-GQX3SSMokngb36+whdpRXE+3f9V8UzyAorlYvOGx87ufGHehNTn5lCxrKtLyZ4Yl/wEKnNnr98ZzOwwDZV5ogw==} - path-to-regexp@6.3.0: resolution: {integrity: sha512-Yhpw4T9C6hPpgPeA28us07OJeqZ5EzQTkbfwuhsUg0c237RomFoETJgmp2sa3F/41gfLE6G5cqcYwznmeEeOlQ==} @@ -3243,10 +3172,6 @@ packages: resolution: {integrity: sha512-VIMnQi/Z4HT2Fxuwg5KrY174U1VdUIASQVWXXyqtNRtxSr9IYkn1rsI6Tb6HsrHCmB7gVpNwX6JxPTHcH6IoTA==} engines: {node: '>=6'} - readdirp@3.6.0: - resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} - engines: {node: '>=8.10.0'} - readdirp@4.0.1: resolution: {integrity: sha512-GkMg9uOTpIWWKbSsgwb5fA4EavTR+SG/PMPoAY8hkhHfEEY0/vqljY+XHqtDf2cr2IJtoNRDbrrEpZUiZCkYRw==} engines: {node: '>= 14.16.0'} @@ -3269,10 +3194,6 @@ packages: resolve-pkg-maps@1.0.0: resolution: {integrity: sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==} - resolve.exports@2.0.2: - resolution: {integrity: sha512-X2UW6Nw3n/aMgDVy+0rSqgHlv39WZAlZrXCdnbyEiKm17DSqHX4MmQMaST3FbeWR5FTuRcUwYAziZajji0Y7mg==} - engines: {node: '>=10'} - resolve@1.22.8: resolution: {integrity: sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==} hasBin: true @@ -3594,9 +3515,6 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.5.3: - resolution: {integrity: sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==} - ufo@1.5.4: resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} @@ -3607,9 +3525,6 @@ packages: resolution: {integrity: sha512-72RFADWFqKmUb2hmmvNODKL3p9hcB6Gt2DOQMis1SEBaV6a4MH8soBvzg+95CYhCKPFedut2JY9bMfrDl9D23g==} engines: {node: '>=14.0'} - unenv-nightly@1.10.0-1717606461.a117952: - resolution: {integrity: sha512-u3TfBX02WzbHTpaEfWEKwDijDSFAHcgXkayUZ+MVDrjhLFvgAJzFGTSTmwlEhwWi2exyRQey23ah9wELMM6etg==} - unenv-nightly@2.0.0-20241204-140205-a5d5190: resolution: {integrity: sha512-jpmAytLeiiW01pl5bhVn9wYJ4vtiLdhGe10oXlJBuQEX8mxjxO8BlEXGHU4vr4yEikjFP1wsomTHt/CLU8kUwg==} @@ -3733,11 +3648,6 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20240701.0: - resolution: {integrity: sha512-qSgNVqauqzNCij9MaJLF2c2ko3AnFioVSIxMSryGbRK+LvtGr9BKBt6JOxCb24DoJASoJDx3pe3DJHBVydUiBg==} - engines: {node: '>=16'} - hasBin: true - workerd@1.20241205.0: resolution: {integrity: sha512-vso/2n0c5SdBDWiD+Sx5gM7unA6SiZXRVUHDqH1euoP/9mFVHZF8icoYsNLB87b/TX8zNgpae+I5N/xFpd9v0g==} engines: {node: '>=16'} @@ -3747,16 +3657,6 @@ packages: resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} engines: {node: '>=12'} - wrangler@3.63.1: - resolution: {integrity: sha512-fxMPNEyDc9pZNtQOuYqRikzv6lL5eP4S1zv7L/kw24uu1cCEmJ39j8bfJGzrAEqKDNsiFXVjEka0RjlpgEVWPg==} - engines: {node: '>=16.17.0'} - hasBin: true - peerDependencies: - '@cloudflare/workers-types': ^4.20240620.0 - peerDependenciesMeta: - '@cloudflare/workers-types': - optional: true - wrangler@3.94.0: resolution: {integrity: sha512-4yw8FKp6SI6WQkALnRlWYjehmgliaaMroLLnymWS9qHndjqrZIPZ16trrhl1HvAEDov/rIg0jZ4nxo5n6K0a/Q==} engines: {node: '>=16.17.0'} @@ -3985,33 +3885,18 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/workerd-darwin-64@1.20240701.0': - optional: true - '@cloudflare/workerd-darwin-64@1.20241205.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20240701.0': - optional: true - '@cloudflare/workerd-darwin-arm64@1.20241205.0': optional: true - '@cloudflare/workerd-linux-64@1.20240701.0': - optional: true - '@cloudflare/workerd-linux-64@1.20241205.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20240701.0': - optional: true - '@cloudflare/workerd-linux-arm64@1.20241205.0': optional: true - '@cloudflare/workerd-windows-64@1.20240701.0': - optional: true - '@cloudflare/workerd-windows-64@1.20241205.0': optional: true @@ -4020,8 +3905,6 @@ snapshots: mime: 3.0.0 zod: 3.22.4 - '@cloudflare/workers-types@4.20240405.0': {} - '@cloudflare/workers-types@4.20241205.0': {} '@cspotcode/source-map-support@0.8.1': @@ -4503,7 +4386,7 @@ snapshots: eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.9.0(eslint@9.6.0) eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.2.9) - globals: 15.12.0 + globals: 15.14.0 typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) @@ -4752,11 +4635,6 @@ snapshots: ansi-styles@6.2.1: {} - anymatch@3.1.3: - dependencies: - normalize-path: 3.0.0 - picomatch: 2.3.1 - argparse@1.0.10: dependencies: sprintf-js: 1.0.3 @@ -4783,8 +4661,6 @@ snapshots: dependencies: is-windows: 1.0.2 - binary-extensions@2.3.0: {} - bindings@1.5.0: dependencies: file-uri-to-path: 1.0.0 @@ -4832,22 +4708,6 @@ snapshots: check-error@2.1.1: {} - chokidar@3.6.0: - dependencies: - anymatch: 3.1.3 - braces: 3.0.3 - glob-parent: 5.1.2 - is-binary-path: 2.1.0 - is-glob: 4.0.3 - normalize-path: 3.0.0 - readdirp: 3.6.0 - optionalDependencies: - fsevents: 2.3.3 - - chokidar@4.0.0: - dependencies: - readdirp: 4.0.1 - chokidar@4.0.1: dependencies: readdirp: 4.0.1 @@ -4886,7 +4746,7 @@ snapshots: cross-env@7.0.3: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 cross-spawn@5.1.0: dependencies: @@ -4894,7 +4754,7 @@ snapshots: shebang-command: 1.2.0 which: 1.3.1 - cross-spawn@7.0.3: + cross-spawn@7.0.6: dependencies: path-key: 3.1.1 shebang-command: 2.0.0 @@ -4906,8 +4766,6 @@ snapshots: dataloader@1.4.0: {} - date-fns@3.6.0: {} - date-fns@4.1.0: {} debug@4.3.7: @@ -4966,7 +4824,7 @@ snapshots: emoji-regex@9.2.2: {} - enhanced-resolve@5.17.1: + enhanced-resolve@5.18.0: dependencies: graceful-fs: 4.2.11 tapable: 2.2.1 @@ -5051,11 +4909,11 @@ snapshots: eslint-plugin-n@17.9.0(eslint@9.6.0): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) - enhanced-resolve: 5.17.1 + enhanced-resolve: 5.18.0 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) get-tsconfig: 4.8.1 - globals: 15.12.0 + globals: 15.14.0 ignore: 5.3.2 minimatch: 9.0.5 semver: 7.6.3 @@ -5105,7 +4963,7 @@ snapshots: '@nodelib/fs.walk': 1.2.8 ajv: 6.12.6 chalk: 4.1.2 - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 debug: 4.3.7 escape-string-regexp: 4.0.0 eslint-scope: 8.0.1 @@ -5236,7 +5094,7 @@ snapshots: foreground-child@3.3.0: dependencies: - cross-spawn: 7.0.3 + cross-spawn: 7.0.6 signal-exit: 4.1.0 fs-extra@7.0.1: @@ -5310,7 +5168,7 @@ snapshots: globals@14.0.0: {} - globals@15.12.0: {} + globals@15.14.0: {} globalyzer@0.1.0: {} @@ -5376,10 +5234,6 @@ snapshots: is-arrayish@0.3.2: {} - is-binary-path@2.1.0: - dependencies: - binary-extensions: 2.3.0 - is-core-module@2.13.1: dependencies: hasown: 2.0.2 @@ -5546,25 +5400,6 @@ snapshots: min-indent@1.0.1: {} - miniflare@3.20240701.0: - dependencies: - '@cspotcode/source-map-support': 0.8.1 - acorn: 8.14.0 - acorn-walk: 8.3.2 - capnp-ts: 0.7.0 - exit-hook: 2.2.1 - glob-to-regexp: 0.4.1 - stoppable: 1.1.0 - undici: 5.28.4 - workerd: 1.20240701.0 - ws: 8.18.0 - youch: 3.3.3 - zod: 3.22.4 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - miniflare@3.20241205.0: dependencies: '@cspotcode/source-map-support': 0.8.1 @@ -5622,8 +5457,6 @@ snapshots: lower-case: 2.0.2 tslib: 2.6.2 - node-fetch-native@1.6.4: {} - node-fetch@2.7.0: dependencies: whatwg-url: 5.0.0 @@ -5636,8 +5469,6 @@ snapshots: dependencies: abbrev: 2.0.0 - normalize-path@3.0.0: {} - npm-bundled@2.0.1: dependencies: npm-normalize-package-bin: 2.0.0 @@ -5720,8 +5551,6 @@ snapshots: lru-cache: 10.4.3 minipass: 7.1.2 - path-to-regexp@6.2.2: {} - path-to-regexp@6.3.0: {} path-type@4.0.0: {} @@ -5809,10 +5638,6 @@ snapshots: pify: 4.0.1 strip-bom: 3.0.0 - readdirp@3.6.0: - dependencies: - picomatch: 2.3.1 - readdirp@4.0.1: {} regenerator-runtime@0.14.1: {} @@ -5825,8 +5650,6 @@ snapshots: resolve-pkg-maps@1.0.0: {} - resolve.exports@2.0.2: {} - resolve@1.22.8: dependencies: is-core-module: 2.13.1 @@ -6153,8 +5976,6 @@ snapshots: typescript@5.6.3: {} - ufo@1.5.3: {} - ufo@1.5.4: {} undici-types@5.26.5: {} @@ -6163,15 +5984,6 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - unenv-nightly@1.10.0-1717606461.a117952: - dependencies: - consola: 3.2.3 - defu: 6.1.4 - mime: 3.0.0 - node-fetch-native: 1.6.4 - pathe: 1.1.2 - ufo: 1.5.3 - unenv-nightly@2.0.0-20241204-140205-a5d5190: dependencies: defu: 6.1.4 @@ -6296,14 +6108,6 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20240701.0: - optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20240701.0 - '@cloudflare/workerd-darwin-arm64': 1.20240701.0 - '@cloudflare/workerd-linux-64': 1.20240701.0 - '@cloudflare/workerd-linux-arm64': 1.20240701.0 - '@cloudflare/workerd-windows-64': 1.20240701.0 - workerd@1.20241205.0: optionalDependencies: '@cloudflare/workerd-darwin-64': 1.20241205.0 @@ -6317,32 +6121,6 @@ snapshots: mrmime: 2.0.0 regexparam: 3.0.0 - wrangler@3.63.1(@cloudflare/workers-types@4.20240405.0): - dependencies: - '@cloudflare/kv-asset-handler': 0.3.4 - '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) - '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) - blake3-wasm: 2.1.5 - chokidar: 3.6.0 - date-fns: 3.6.0 - esbuild: 0.17.19 - miniflare: 3.20240701.0 - nanoid: 3.3.7 - path-to-regexp: 6.2.2 - resolve: 1.22.8 - resolve.exports: 2.0.2 - selfsigned: 2.4.1 - source-map: 0.6.1 - unenv: unenv-nightly@1.10.0-1717606461.a117952 - xxhash-wasm: 1.0.2 - optionalDependencies: - '@cloudflare/workers-types': 4.20240405.0 - fsevents: 2.3.3 - transitivePeerDependencies: - - bufferutil - - supports-color - - utf-8-validate - wrangler@3.94.0(@cloudflare/workers-types@4.20241205.0): dependencies: '@cloudflare/kv-asset-handler': 0.3.4 From 2d3f551c7381a7ccbdabc4e03ba9a1509c2a8b69 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Dec 2024 18:50:33 -0800 Subject: [PATCH 0851/1135] Version Packages (#13235) Co-authored-by: github-actions[bot] --- .changeset/angry-geckos-dream.md | 5 ----- .changeset/clever-phones-reply.md | 5 ----- .changeset/famous-rules-lick.md | 5 ----- packages/adapter-cloudflare/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/kit/CHANGELOG.md | 9 +++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 8 files changed, 24 insertions(+), 18 deletions(-) delete mode 100644 .changeset/angry-geckos-dream.md delete mode 100644 .changeset/clever-phones-reply.md delete mode 100644 .changeset/famous-rules-lick.md diff --git a/.changeset/angry-geckos-dream.md b/.changeset/angry-geckos-dream.md deleted file mode 100644 index a111db1ff8b9..000000000000 --- a/.changeset/angry-geckos-dream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: add CSP hashes/nonces to inline styles when using `bundleStrategy: 'inline'` diff --git a/.changeset/clever-phones-reply.md b/.changeset/clever-phones-reply.md deleted file mode 100644 index 156658340954..000000000000 --- a/.changeset/clever-phones-reply.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: silence dev/prod warning during sync diff --git a/.changeset/famous-rules-lick.md b/.changeset/famous-rules-lick.md deleted file mode 100644 index e18201585945..000000000000 --- a/.changeset/famous-rules-lick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': major ---- - -feat: remove esbuild step diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index fa31ffb99cc3..bb851cf07ded 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare +## 5.0.0 +### Major Changes + + +- feat: remove esbuild step ([#13132](https://github.com/sveltejs/kit/pull/13132)) + + +### Patch Changes + +- Updated dependencies [[`12ce7eb19fb57907e3db29ef981a8c7a0afc4b6f`](https://github.com/sveltejs/kit/commit/12ce7eb19fb57907e3db29ef981a8c7a0afc4b6f), [`528af75f846f971ef64e4d109ac5e22fca046b90`](https://github.com/sveltejs/kit/commit/528af75f846f971ef64e4d109ac5e22fca046b90)]: + - @sveltejs/kit@2.15.1 + ## 4.9.0 ### Minor Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 3ca5c83e31bd..62d0b3f0a5e5 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "4.9.0", + "version": "5.0.0", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 5134dc86d8cf..9a525b5261a8 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/kit +## 2.15.1 +### Patch Changes + + +- fix: add CSP hashes/nonces to inline styles when using `bundleStrategy: 'inline'` ([#13232](https://github.com/sveltejs/kit/pull/13232)) + + +- fix: silence dev/prod warning during sync ([#13244](https://github.com/sveltejs/kit/pull/13244)) + ## 2.15.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 2dfbd48ac1f3..810914ce621f 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.15.0", + "version": "2.15.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 9ab140be9205..cf2652ccca54 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.15.0'; +export const VERSION = '2.15.1'; From 9a4a41170ab3e17f947eb4a67944958b22da4236 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 26 Dec 2024 18:51:01 -0800 Subject: [PATCH 0852/1135] Version Packages (#13247) Co-authored-by: github-actions[bot] From 5d133f462fdda0ebab04105c3fbc639f02557511 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 2 Jan 2025 09:55:15 -0800 Subject: [PATCH 0853/1135] chore(deps): update pnpm to v9.15.2 (#13251) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 0bdacdeca06f..4787711800e1 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.15.1", + "packageManager": "pnpm@9.15.2", "engines": { "pnpm": "^9.0.0" } From b1493ba633b12f576f2e60e949719cbc96de504e Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 2 Jan 2025 10:09:58 -0800 Subject: [PATCH 0854/1135] chore: remove cross-spawn 5 to fix dependabot warning (#13265) --- package.json | 2 +- pnpm-lock.yaml | 140 +++++++++++++++---------------------------------- 2 files changed, 43 insertions(+), 99 deletions(-) diff --git a/package.json b/package.json index 4787711800e1..f39bd3a7bf21 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ "sync-all": "node scripts/sync-all.js" }, "devDependencies": { - "@changesets/cli": "^2.27.8", + "@changesets/cli": "^2.27.11", "@sveltejs/eslint-config": "^8.1.0", "@svitejs/changesets-changelog-github-compact": "^1.1.0", "eslint": "^9.6.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 5fa4201957cb..44da27bc1ed6 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -9,8 +9,8 @@ importers: .: devDependencies: '@changesets/cli': - specifier: ^2.27.8 - version: 2.27.8 + specifier: ^2.27.11 + version: 2.27.11 '@sveltejs/eslint-config': specifier: ^8.1.0 version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) @@ -1169,21 +1169,21 @@ packages: resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} engines: {node: '>=6.9.0'} - '@changesets/apply-release-plan@7.0.5': - resolution: {integrity: sha512-1cWCk+ZshEkSVEZrm2fSj1Gz8sYvxgUL4Q78+1ZZqeqfuevPTPk033/yUZ3df8BKMohkqqHfzj0HOOrG0KtXTw==} + '@changesets/apply-release-plan@7.0.7': + resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} - '@changesets/assemble-release-plan@6.0.4': - resolution: {integrity: sha512-nqICnvmrwWj4w2x0fOhVj2QEGdlUuwVAwESrUo5HLzWMI1rE5SWfsr9ln+rDqWB6RQ2ZyaMZHUcU7/IRaUJS+Q==} + '@changesets/assemble-release-plan@6.0.5': + resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} '@changesets/changelog-git@0.2.0': resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} - '@changesets/cli@2.27.8': - resolution: {integrity: sha512-gZNyh+LdSsI82wBSHLQ3QN5J30P4uHKJ4fXgoGwQxfXwYFTJzDdvIJasZn8rYQtmKhyQuiBj4SSnLuKlxKWq4w==} + '@changesets/cli@2.27.11': + resolution: {integrity: sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg==} hasBin: true - '@changesets/config@3.0.3': - resolution: {integrity: sha512-vqgQZMyIcuIpw9nqFIpTSNyc/wgm/Lu1zKN5vECy74u95Qx/Wa9g27HdgO4NkVAaq+BGA8wUc/qvbvVNs93n6A==} + '@changesets/config@3.0.5': + resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} @@ -1194,14 +1194,14 @@ packages: '@changesets/get-github-info@0.5.2': resolution: {integrity: sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==} - '@changesets/get-release-plan@4.0.4': - resolution: {integrity: sha512-SicG/S67JmPTrdcc9Vpu0wSQt7IiuN0dc8iR5VScnnTVPfIaLvKmEGRvIaF0kcn8u5ZqLbormZNTO77bCEvyWw==} + '@changesets/get-release-plan@4.0.6': + resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.1': - resolution: {integrity: sha512-pdgHcYBLCPcLd82aRcuO0kxCDbw/yISlOtkmwmE8Odo1L6hSiZrBOsRl84eYG7DRCab/iHnOkWqExqc4wxk2LQ==} + '@changesets/git@3.0.2': + resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} @@ -1212,8 +1212,8 @@ packages: '@changesets/pre@2.0.1': resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} - '@changesets/read@0.6.1': - resolution: {integrity: sha512-jYMbyXQk3nwP25nRzQQGa1nKLY0KfoOV7VLgwucI0bUO8t8ZLCr6LZmgjXsiKuRDc+5A6doKPr9w2d+FEJ55zQ==} + '@changesets/read@0.6.2': + resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} '@changesets/should-skip-package@0.1.1': resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} @@ -2260,9 +2260,6 @@ packages: engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} hasBin: true - cross-spawn@5.1.0: - resolution: {integrity: sha512-pTgQJ5KC0d2hcY8eyL1IzlBPYjTkyH72XRZPnLyKus2mBfNjQs3klqbJU2VILqZryAZUt9JOb3h/mWMy23/f5A==} - cross-spawn@7.0.6: resolution: {integrity: sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==} engines: {node: '>= 8'} @@ -2862,9 +2859,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - lru-cache@4.1.5: - resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} - magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} @@ -3153,9 +3147,6 @@ packages: printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - pseudomap@1.0.2: - resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} - publint@0.2.7: resolution: {integrity: sha512-tLU4ee3110BxWfAmCZggJmCUnYWgPTr0QLnx08sqpLYa8JHRiOudd+CgzdpfU5x5eOaW2WMkpmOrFshRFYK7Mw==} engines: {node: '>=16'} @@ -3251,18 +3242,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} - shebang-command@1.2.0: - resolution: {integrity: sha512-EV3L1+UQWGor21OmnvojK36mhg+TyIKDh3iFBKBohr5xeXIhNBcx8oWdgkTEEQ+BEFFYdLRuqMfd5L84N1V5Vg==} - engines: {node: '>=0.10.0'} - shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} - shebang-regex@1.0.0: - resolution: {integrity: sha512-wpoSFAxys6b2a2wHZ1XpDSgD7N9iVjg29Ph9uV/uaP9Ex/KXlkTZTeddxDPSYQpgvzKLGJke2UU0AzoGCjNIvQ==} - engines: {node: '>=0.10.0'} - shebang-regex@3.0.0: resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} engines: {node: '>=8'} @@ -3270,9 +3253,6 @@ packages: siginfo@2.0.0: resolution: {integrity: sha512-ybx0WO1/8bSBLEWXZvEd7gMW3Sn3JFlW3TvX1nREbDLRNQNaeNN8WK0meBwPdAaOI7TtRRRJn/Es1zhrrCHu7g==} - signal-exit@3.0.7: - resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} - signal-exit@4.1.0: resolution: {integrity: sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==} engines: {node: '>=14'} @@ -3305,8 +3285,8 @@ packages: resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} deprecated: Please use @jridgewell/sourcemap-codec instead - spawndamnit@2.0.0: - resolution: {integrity: sha512-j4JKEcncSjFlqIwU5L/rp2N5SIPsdxaRsIv678+TZxZ0SRDJTm8JrxJMjE/XuiEZNEir3S8l0Fa3Ke339WI4qA==} + spawndamnit@3.0.1: + resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} @@ -3634,10 +3614,6 @@ packages: whatwg-url@5.0.0: resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} - which@1.3.1: - resolution: {integrity: sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==} - hasBin: true - which@2.0.2: resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} engines: {node: '>= 8'} @@ -3693,9 +3669,6 @@ packages: xxhash-wasm@1.0.2: resolution: {integrity: sha512-ibF0Or+FivM9lNrg+HGJfVX8WJqgo+kCLDc4vx6xMeTce7Aj+DLttKbxxRR/gNLSAelRc1omAPlJ77N/Jem07A==} - yallist@2.1.2: - resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} - yallist@5.0.0: resolution: {integrity: sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==} engines: {node: '>=18'} @@ -3730,11 +3703,11 @@ snapshots: dependencies: regenerator-runtime: 0.14.1 - '@changesets/apply-release-plan@7.0.5': + '@changesets/apply-release-plan@7.0.7': dependencies: - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.5 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.1 + '@changesets/git': 3.0.2 '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 @@ -3746,7 +3719,7 @@ snapshots: resolve-from: 5.0.0 semver: 7.6.3 - '@changesets/assemble-release-plan@6.0.4': + '@changesets/assemble-release-plan@6.0.5': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 @@ -3759,40 +3732,38 @@ snapshots: dependencies: '@changesets/types': 6.0.0 - '@changesets/cli@2.27.8': + '@changesets/cli@2.27.11': dependencies: - '@changesets/apply-release-plan': 7.0.5 - '@changesets/assemble-release-plan': 6.0.4 + '@changesets/apply-release-plan': 7.0.7 + '@changesets/assemble-release-plan': 6.0.5 '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.3 + '@changesets/config': 3.0.5 '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.4 - '@changesets/git': 3.0.1 + '@changesets/get-release-plan': 4.0.6 + '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@changesets/read': 0.6.2 '@changesets/should-skip-package': 0.1.1 '@changesets/types': 6.0.0 '@changesets/write': 0.3.2 '@manypkg/get-packages': 1.1.3 - '@types/semver': 7.5.8 ansi-colors: 4.1.3 ci-info: 3.9.0 enquirer: 2.4.1 external-editor: 3.1.0 fs-extra: 7.0.1 mri: 1.2.0 - outdent: 0.5.0 p-limit: 2.3.0 package-manager-detector: 0.2.0 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.3 - spawndamnit: 2.0.0 + spawndamnit: 3.0.1 term-size: 2.2.1 - '@changesets/config@3.0.3': + '@changesets/config@3.0.5': dependencies: '@changesets/errors': 0.2.0 '@changesets/get-dependents-graph': 2.1.2 @@ -3820,24 +3791,24 @@ snapshots: transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.4': + '@changesets/get-release-plan@4.0.6': dependencies: - '@changesets/assemble-release-plan': 6.0.4 - '@changesets/config': 3.0.3 + '@changesets/assemble-release-plan': 6.0.5 + '@changesets/config': 3.0.5 '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.1 + '@changesets/read': 0.6.2 '@changesets/types': 6.0.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.1': + '@changesets/git@3.0.2': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 is-subdir: 1.2.0 micromatch: 4.0.8 - spawndamnit: 2.0.0 + spawndamnit: 3.0.1 '@changesets/logger@0.1.1': dependencies: @@ -3855,9 +3826,9 @@ snapshots: '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.1': + '@changesets/read@0.6.2': dependencies: - '@changesets/git': 3.0.1 + '@changesets/git': 3.0.2 '@changesets/logger': 0.1.1 '@changesets/parse': 0.4.0 '@changesets/types': 6.0.0 @@ -4748,12 +4719,6 @@ snapshots: dependencies: cross-spawn: 7.0.6 - cross-spawn@5.1.0: - dependencies: - lru-cache: 4.1.5 - shebang-command: 1.2.0 - which: 1.3.1 - cross-spawn@7.0.6: dependencies: path-key: 3.1.1 @@ -5376,11 +5341,6 @@ snapshots: lru-cache@10.4.3: {} - lru-cache@4.1.5: - dependencies: - pseudomap: 1.0.2 - yallist: 2.1.2 - magic-string@0.25.9: dependencies: sourcemap-codec: 1.4.8 @@ -5619,8 +5579,6 @@ snapshots: printable-characters@1.0.42: {} - pseudomap@1.0.2: {} - publint@0.2.7: dependencies: npm-packlist: 5.1.3 @@ -5747,22 +5705,14 @@ snapshots: '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 - shebang-command@1.2.0: - dependencies: - shebang-regex: 1.0.0 - shebang-command@2.0.0: dependencies: shebang-regex: 3.0.0 - shebang-regex@1.0.0: {} - shebang-regex@3.0.0: {} siginfo@2.0.0: {} - signal-exit@3.0.7: {} - signal-exit@4.1.0: {} simple-swizzle@0.2.2: @@ -5794,10 +5744,10 @@ snapshots: sourcemap-codec@1.4.8: {} - spawndamnit@2.0.0: + spawndamnit@3.0.1: dependencies: - cross-spawn: 5.1.0 - signal-exit: 3.0.7 + cross-spawn: 7.0.6 + signal-exit: 4.1.0 sprintf-js@1.0.3: {} @@ -6095,10 +6045,6 @@ snapshots: tr46: 0.0.3 webidl-conversions: 3.0.1 - which@1.3.1: - dependencies: - isexe: 2.0.0 - which@2.0.2: dependencies: isexe: 2.0.0 @@ -6167,8 +6113,6 @@ snapshots: xxhash-wasm@1.0.2: {} - yallist@2.1.2: {} - yallist@5.0.0: {} yaml@1.10.2: {} From 9fbfb22e442236e1a8ffa27a71fbef84166646e6 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 2 Jan 2025 10:23:33 -0800 Subject: [PATCH 0855/1135] chore: upgrade nanoid to fix dependabot warning (#13266) --- pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44da27bc1ed6..f8e8849ed5cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2926,8 +2926,8 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - nanoid@3.3.7: - resolution: {integrity: sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==} + nanoid@3.3.8: + resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -5408,7 +5408,7 @@ snapshots: mustache@4.2.0: {} - nanoid@3.3.7: {} + nanoid@3.3.8: {} natural-compare@1.4.0: {} @@ -5562,7 +5562,7 @@ snapshots: postcss@8.4.49: dependencies: - nanoid: 3.3.7 + nanoid: 3.3.8 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -6079,7 +6079,7 @@ snapshots: esbuild: 0.17.19 itty-time: 1.0.6 miniflare: 3.20241205.0 - nanoid: 3.3.7 + nanoid: 3.3.8 path-to-regexp: 6.3.0 resolve: 1.22.8 selfsigned: 2.4.1 From dc8ec1e44582969d5db4e0d223cf5429be374bdb Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 6 Jan 2025 18:33:29 +0800 Subject: [PATCH 0856/1135] fix: correctly notify page store subscribers (#13205) fixes #13200 This PR ensures page store subscribers are correctly notified by creating a new object whenever we update the page store. I'm not sure why but when the same page object is used, it doesn't notify subscribers. There was also another bug where a popstate event would cause subscribers to get notified twice because we were calling root.$set({ page }) in addition to stores.page.notify() when updating the URL. --- .changeset/dirty-bees-act.md | 5 ++ packages/kit/src/runtime/client/client.js | 60 ++++++++++++------- .../src/routes/store/subscribe/+layout.svelte | 47 +++++++++++++++ .../src/routes/store/subscribe/+page.svelte | 0 .../kit/test/apps/basics/test/client.test.js | 54 +++++++++++++++++ 5 files changed, 146 insertions(+), 20 deletions(-) create mode 100644 .changeset/dirty-bees-act.md create mode 100644 packages/kit/test/apps/basics/src/routes/store/subscribe/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/store/subscribe/+page.svelte diff --git a/.changeset/dirty-bees-act.md b/.changeset/dirty-bees-act.md new file mode 100644 index 000000000000..94a55f6070de --- /dev/null +++ b/.changeset/dirty-bees-act.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly notify page store subscribers diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 9f3451a68d51..369ffa9e25aa 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -520,7 +520,7 @@ function get_navigation_result_from_branch({ url, params, branch, status, error, props: { // @ts-ignore Somehow it's getting SvelteComponent and SvelteComponentDev mixed up constructors: compact(branch).map((branch_node) => branch_node.node.component), - page + page: clone_page(page) } }; @@ -861,7 +861,10 @@ function preload_error({ error, url, route, params }) { params, branch: [] }, - props: { page, constructors: [] } + props: { + page: clone_page(page), + constructors: [] + } }; } @@ -1972,7 +1975,10 @@ export function pushState(url, state) { has_navigated = true; page.state = state; - root.$set({ page }); + root.$set({ + // we need to assign a new page object so that subscribers are correctly notified + page: clone_page(page) + }); clear_onward_history(current_history_index, current_navigation_index); } @@ -2013,7 +2019,9 @@ export function replaceState(url, state) { history.replaceState(opts, '', resolve_url(url)); page.state = state; - root.$set({ page }); + root.$set({ + page: clone_page(page) + }); } /** @@ -2064,7 +2072,7 @@ export async function applyAction(result) { // this brings Svelte's view of the world in line with SvelteKit's // after use:enhance reset the form.... form: null, - page + page: clone_page(page) }); // ...so that setting the `form` prop takes effect and isn't ignored @@ -2317,16 +2325,15 @@ function _start_router() { // This happens with hash links and `pushState`/`replaceState`. The // exception is if we haven't navigated yet, since we could have // got here after a modal navigation then a reload + if (state !== page.state) { + page.state = state; + } + update_url(url); scroll_positions[current_history_index] = scroll_state(); if (scroll) scrollTo(scroll.x, scroll.y); - if (state !== page.state) { - page.state = state; - root.$set({ page }); - } - current_history_index = history_index; return; } @@ -2409,16 +2416,7 @@ function _start_router() { */ function update_url(url) { current.url = page.url = url; - stores.page.set({ - data: page.data, - error: page.error, - form: page.form, - params: page.params, - route: page.route, - state: page.state, - status: page.status, - url - }); + stores.page.set(clone_page(page)); stores.page.notify(); } } @@ -2759,6 +2757,28 @@ function create_navigation(current, intent, url, type) { }; } +/** + * TODO: remove this in 3.0 when the page store is also removed + * + * We need to assign a new page object so that subscribers are correctly notified. + * However, spreading `{ ...page }` returns an empty object so we manually + * assign to each property instead. + * + * @param {import('@sveltejs/kit').Page} page + */ +function clone_page(page) { + return { + data: page.data, + error: page.error, + form: page.form, + params: page.params, + route: page.route, + state: page.state, + status: page.status, + url: page.url + }; +} + if (DEV) { // Nasty hack to silence harmless warnings the user can do nothing about const console_warn = console.warn; diff --git a/packages/kit/test/apps/basics/src/routes/store/subscribe/+layout.svelte b/packages/kit/test/apps/basics/src/routes/store/subscribe/+layout.svelte new file mode 100644 index 000000000000..4712a7b94581 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/store/subscribe/+layout.svelte @@ -0,0 +1,47 @@ + + +

{count}

+ + + + + + + + + + + +{@render children()} diff --git a/packages/kit/test/apps/basics/src/routes/store/subscribe/+page.svelte b/packages/kit/test/apps/basics/src/routes/store/subscribe/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 313d2d5cb75d..6bdad95dc0fa 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -394,6 +394,60 @@ test.describe('$app/stores', () => { await app.goto('/store/data/store-update/same-keys'); await expect(page.locator('p')).toHaveText('$page.data was updated 1 time(s)'); }); + + test('page subscribers are notified when invalidate is called', async ({ page }) => { + await page.goto('/store/subscribe'); + await expect(page.locator('p')).toHaveText('1'); + await page.locator('button', { hasText: 'invalidate' }).click(); + await expect(page.locator('p')).toHaveText('2'); + await page.locator('button', { hasText: 'invalidate' }).click(); + await expect(page.locator('p')).toHaveText('3'); + }); + + test('page subscribers are notified when replaceState is called', async ({ page }) => { + await page.goto('/store/subscribe'); + await expect(page.locator('p')).toHaveText('1'); + await page.locator('button', { hasText: 'replaceState' }).click(); + await expect(page.locator('p')).toHaveText('2'); + await page.locator('button', { hasText: 'replaceState' }).click(); + await expect(page.locator('p')).toHaveText('3'); + }); + + test('page subscribers are notified when pushState is called', async ({ page }) => { + await page.goto('/store/subscribe'); + await expect(page.locator('p')).toHaveText('1'); + await page.locator('button', { hasText: 'pushState' }).click(); + await expect(page.locator('p')).toHaveText('2'); + await page.locator('button', { hasText: 'pushState' }).click(); + await expect(page.locator('p')).toHaveText('3'); + }); + + test('page subscribers are notified when goto is called', async ({ page }) => { + await page.goto('/store/subscribe'); + await expect(page.locator('p')).toHaveText('1'); + await page.locator('button', { hasText: 'goto' }).click(); + await expect(page.locator('p')).toHaveText('2'); + await page.locator('button', { hasText: 'goto' }).click(); + await expect(page.locator('p')).toHaveText('3'); + }); + + test('page subscribers are notified when applyAction is called', async ({ page }) => { + await page.goto('/store/subscribe'); + await expect(page.locator('p')).toHaveText('1'); + await page.locator('button', { hasText: 'applyAction' }).click(); + await expect(page.locator('p')).toHaveText('2'); + await page.locator('button', { hasText: 'applyAction' }).click(); + await expect(page.locator('p')).toHaveText('3'); + }); + + test('page subscribers are notified only once after popstate', async ({ page }) => { + await page.goto('/store/subscribe'); + await expect(page.locator('p')).toHaveText('1'); + await page.locator('button', { hasText: 'pushState' }).click(); + await expect(page.locator('p')).toHaveText('2'); + await page.goBack(); + await expect(page.locator('p')).toHaveText('3'); + }); }); test.describe('$app/state', () => { From e468be74e8a6e189863afc1668172a0a8758a410 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 6 Jan 2025 18:37:07 +0800 Subject: [PATCH 0857/1135] docs: note that universal page and layout files still run on the server when `ssr = false` (#13258) closes #11310 --- documentation/docs/20-core-concepts/40-page-options.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/documentation/docs/20-core-concepts/40-page-options.md b/documentation/docs/20-core-concepts/40-page-options.md index 030ccc593412..204f9850a98e 100644 --- a/documentation/docs/20-core-concepts/40-page-options.md +++ b/documentation/docs/20-core-concepts/40-page-options.md @@ -6,7 +6,7 @@ By default, SvelteKit will render (or [prerender](glossary#Prerendering)) any co You can control each of these on a page-by-page basis by exporting options from [`+page.js`](routing#page-page.js) or [`+page.server.js`](routing#page-page.server.js), or for groups of pages using a shared [`+layout.js`](routing#layout-layout.js) or [`+layout.server.js`](routing#layout-layout.server.js). To define an option for the whole app, export it from the root layout. Child layouts and pages override values set in parent layouts, so — for example — you can enable prerendering for your entire app then disable it for pages that need to be dynamically rendered. -You can mix and match these options in different areas of your app. For example you could prerender your marketing page for maximum speed, server-render your dynamic pages for SEO and accessibility and turn your admin section into an SPA by rendering it on the client only. This makes SvelteKit very versatile. +You can mix and match these options in different areas of your app. For example, you could prerender your marketing page for maximum speed, server-render your dynamic pages for SEO and accessibility and turn your admin section into an SPA by rendering it on the client only. This makes SvelteKit very versatile. ## prerender @@ -127,6 +127,8 @@ export const ssr = false; If you add `export const ssr = false` to your root `+layout.js`, your entire app will only be rendered on the client — which essentially means you turn your app into an SPA. +> [!NOTE] Even with `ssr` set to `false`, code that relies on browser APIs should be imported in your `+page.svelte` or `+layout.svelte` file instead. This is because page options can be overriden and need to be evaluated by importing your `+page.js` or `+layout.js` file on the server (if you have a runtime) or at build time (in case of prerendering). + ## csr Ordinarily, SvelteKit [hydrates](glossary#Hydration) your server-rendered HTML into an interactive client-side-rendered (CSR) page. Some pages don't require JavaScript at all — many blog posts and 'about' pages fall into this category. In these cases you can disable CSR: From 059bff89053656c33d0d0c540924330805a3bca6 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 6 Jan 2025 18:37:52 +0800 Subject: [PATCH 0858/1135] docs: reword afterNavigate description so that it includes navigations to the same URL (#13242) similar to #13133 --- packages/kit/src/runtime/client/client.js | 2 +- packages/kit/types/index.d.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 369ffa9e25aa..d0d4038e7ea9 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1724,7 +1724,7 @@ function add_navigation_callback(callbacks, callback) { } /** - * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a new URL. + * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a URL. * * `afterNavigate` must be called during a component initialization. It remains active as long as the component is mounted. * @param {(navigation: import('@sveltejs/kit').AfterNavigate) => void} callback diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 248dd814b10c..fd8ac6439762 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2123,7 +2123,7 @@ declare module '$app/forms' { declare module '$app/navigation' { /** - * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a new URL. + * A lifecycle function that runs the supplied `callback` when the current component mounts, and also whenever we navigate to a URL. * * `afterNavigate` must be called during a component initialization. It remains active as long as the component is mounted. * */ From 1d864f84d0d6ce2e36c7685be25275aa270c1318 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 6 Jan 2025 18:38:53 +0800 Subject: [PATCH 0859/1135] docs: emphasise $app/state objects are read-only (#13236) closes #13229 --- documentation/docs/98-reference/20-$app-state.md | 2 +- packages/kit/src/runtime/app/state/index.js | 6 +++--- packages/kit/types/index.d.ts | 6 +++--- 3 files changed, 7 insertions(+), 7 deletions(-) diff --git a/documentation/docs/98-reference/20-$app-state.md b/documentation/docs/98-reference/20-$app-state.md index f61475fd9e15..9362eacad82f 100644 --- a/documentation/docs/98-reference/20-$app-state.md +++ b/documentation/docs/98-reference/20-$app-state.md @@ -2,7 +2,7 @@ title: $app/state --- -SvelteKit makes three readonly state objects available via the `$app/state` module — `page`, `navigating` and `updated`. +SvelteKit makes three read-only state objects available via the `$app/state` module — `page`, `navigating` and `updated`. > [!NOTE] > This module was added in 2.12. If you're using an earlier version of SvelteKit, use [`$app/stores`]($app-stores) instead. diff --git a/packages/kit/src/runtime/app/state/index.js b/packages/kit/src/runtime/app/state/index.js index 7ca4968f538f..b9622267fb31 100644 --- a/packages/kit/src/runtime/app/state/index.js +++ b/packages/kit/src/runtime/app/state/index.js @@ -11,7 +11,7 @@ import { import { BROWSER } from 'esm-env'; /** - * A reactive object with information about the current page, serving several use cases: + * A read-only reactive object with information about the current page, serving several use cases: * - retrieving the combined `data` of all pages/layouts anywhere in your component tree (also see [loading data](https://svelte.dev/docs/kit/load)) * - retrieving the current value of the `form` prop anywhere in your component tree (also see [form actions](https://svelte.dev/docs/kit/form-actions)) * - retrieving the page state that was set through `goto`, `pushState` or `replaceState` (also see [goto](https://svelte.dev/docs/kit/$app-navigation#goto) and [shallow routing](https://svelte.dev/docs/kit/shallow-routing)) @@ -39,7 +39,7 @@ import { BROWSER } from 'esm-env'; export const page = BROWSER ? client_page : server_page; /** - * An object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties. + * A read-only object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties. * Values are `null` when no navigation is occurring, or during server rendering. * @type {import('@sveltejs/kit').Navigation | { from: null, to: null, type: null, willUnload: null, delta: null, complete: null }} */ @@ -47,7 +47,7 @@ export const page = BROWSER ? client_page : server_page; export const navigating = BROWSER ? client_navigating : server_navigating; /** - * A reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. + * A read-only reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. * @type {{ get current(): boolean; check(): Promise; }} */ export const updated = BROWSER ? client_updated : server_updated; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index fd8ac6439762..5c7db29c3301 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2293,7 +2293,7 @@ declare module '$app/server' { declare module '$app/state' { /** - * A reactive object with information about the current page, serving several use cases: + * A read-only reactive object with information about the current page, serving several use cases: * - retrieving the combined `data` of all pages/layouts anywhere in your component tree (also see [loading data](https://svelte.dev/docs/kit/load)) * - retrieving the current value of the `form` prop anywhere in your component tree (also see [form actions](https://svelte.dev/docs/kit/form-actions)) * - retrieving the page state that was set through `goto`, `pushState` or `replaceState` (also see [goto](https://svelte.dev/docs/kit/$app-navigation#goto) and [shallow routing](https://svelte.dev/docs/kit/shallow-routing)) @@ -2319,7 +2319,7 @@ declare module '$app/state' { * */ export const page: import("@sveltejs/kit").Page; /** - * An object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties. + * A read-only object representing an in-progress navigation, with `from`, `to`, `type` and (if `type === 'popstate'`) `delta` properties. * Values are `null` when no navigation is occurring, or during server rendering. * */ export const navigating: import("@sveltejs/kit").Navigation | { @@ -2331,7 +2331,7 @@ declare module '$app/state' { complete: null; }; /** - * A reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. + * A read-only reactive value that's initially `false`. If [`version.pollInterval`](https://svelte.dev/docs/kit/configuration#version) is a non-zero value, SvelteKit will poll for new versions of the app and update `current` to `true` when it detects one. `updated.check()` will force an immediate check, regardless of polling. * */ export const updated: { get current(): boolean; From 48d2aaeeb5fa13439b544b1c64fc49c4c93b727a Mon Sep 17 00:00:00 2001 From: Elia <100457417+Elia872@users.noreply.github.com> Date: Mon, 6 Jan 2025 11:41:58 +0100 Subject: [PATCH 0860/1135] fix: correctly remove navigation callbacks when returning function in onNavigate (#13241) Do that by switching to a Set and keeping a stable reference across call sites. fixes #13240 --- .changeset/sixty-rabbits-smell.md | 5 +++ packages/kit/src/runtime/client/client.js | 39 +++++++++++-------- .../+layout.svelte | 10 +++++ .../a/+page.svelte | 20 ++++++++++ .../b/+page.svelte | 7 ++++ .../basics/test/cross-platform/client.test.js | 8 ++++ 6 files changed, 72 insertions(+), 17 deletions(-) create mode 100644 .changeset/sixty-rabbits-smell.md create mode 100644 packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/+layout.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/a/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/b/+page.svelte diff --git a/.changeset/sixty-rabbits-smell.md b/.changeset/sixty-rabbits-smell.md new file mode 100644 index 000000000000..c7f66919c926 --- /dev/null +++ b/.changeset/sixty-rabbits-smell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly remove navigation callbacks when returning function in onNavigate diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index d0d4038e7ea9..365d7fea3db5 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -191,14 +191,18 @@ const components = []; /** @type {{id: string, token: {}, promise: Promise} | null} */ let load_cache = null; -/** @type {Array<(navigation: import('@sveltejs/kit').BeforeNavigate) => void>} */ -const before_navigate_callbacks = []; +/** + * Note on before_navigate_callbacks, on_navigate_callbacks and after_navigate_callbacks: + * do not re-assign as some closures keep references to these Sets + */ +/** @type {Set<(navigation: import('@sveltejs/kit').BeforeNavigate) => void>} */ +const before_navigate_callbacks = new Set(); -/** @type {Array<(navigation: import('@sveltejs/kit').OnNavigate) => import('types').MaybePromise<(() => void) | void>>} */ -const on_navigate_callbacks = []; +/** @type {Set<(navigation: import('@sveltejs/kit').OnNavigate) => import('types').MaybePromise<(() => void) | void>>} */ +const on_navigate_callbacks = new Set(); -/** @type {Array<(navigation: import('@sveltejs/kit').AfterNavigate) => void>} */ -let after_navigate_callbacks = []; +/** @type {Set<(navigation: import('@sveltejs/kit').AfterNavigate) => void>} */ +const after_navigate_callbacks = new Set(); /** @type {import('./types.js').NavigationState} */ let current = { @@ -1463,7 +1467,7 @@ async function navigate({ const after_navigate = ( await Promise.all( - on_navigate_callbacks.map((fn) => + Array.from(on_navigate_callbacks, (fn) => fn(/** @type {import('@sveltejs/kit').OnNavigate} */ (nav.navigation)) ) ) @@ -1471,14 +1475,16 @@ async function navigate({ if (after_navigate.length > 0) { function cleanup() { - after_navigate_callbacks = after_navigate_callbacks.filter( - // @ts-ignore - (fn) => !after_navigate.includes(fn) - ); + after_navigate.forEach((fn) => { + after_navigate_callbacks.delete(fn); + }); } after_navigate.push(cleanup); - after_navigate_callbacks.push(...after_navigate); + + after_navigate.forEach((fn) => { + after_navigate_callbacks.add(fn); + }); } root.$set(navigation_result.props); @@ -1680,7 +1686,7 @@ function setup_preload() { } } - after_navigate_callbacks.push(after_navigate); + after_navigate_callbacks.add(after_navigate); after_navigate(); } @@ -1709,16 +1715,15 @@ function handle_error(error, event) { /** * @template {Function} T - * @param {T[]} callbacks + * @param {Set} callbacks * @param {T} callback */ function add_navigation_callback(callbacks, callback) { onMount(() => { - callbacks.push(callback); + callbacks.add(callback); return () => { - const i = callbacks.indexOf(callback); - callbacks.splice(i, 1); + callbacks.delete(callback); }; }); } diff --git a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/+layout.svelte b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/+layout.svelte new file mode 100644 index 000000000000..948f89135625 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/+layout.svelte @@ -0,0 +1,10 @@ + + +{@render children()} diff --git a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/a/+page.svelte new file mode 100644 index 000000000000..ddc82eb1ccfd --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/a/+page.svelte @@ -0,0 +1,20 @@ + + +

/A

+/a +/b diff --git a/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/b/+page.svelte new file mode 100644 index 000000000000..c7a682b6a763 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/navigation-lifecycle/after-navigate-properly-removed/b/+page.svelte @@ -0,0 +1,7 @@ +

/B

+
+ was called: + false +
+/a +/b diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index c6b7f98cce45..482932514553 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -256,6 +256,14 @@ test.describe('Navigation lifecycle functions', () => { '/navigation-lifecycle/on-navigate/a -> /navigation-lifecycle/on-navigate/b (link) true' ); }); + + test('afterNavigate properly removed', async ({ page, clicknav }) => { + await page.goto('/navigation-lifecycle/after-navigate-properly-removed/b'); + await clicknav('[href="/navigation-lifecycle/after-navigate-properly-removed/a"]'); + await clicknav('[href="/navigation-lifecycle/after-navigate-properly-removed/b"]'); + + expect(await page.textContent('.nav-lifecycle-after-nav-removed-test-target')).toBe('false'); + }); }); test.describe('Scrolling', () => { From 80a9e835f1b00332160894aa1ab7cb0aa6bd356d Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 6 Jan 2025 18:42:52 +0800 Subject: [PATCH 0861/1135] fix: prerender data when there's no server load but `trailingSlash` option is set from the server (#13262) fixes #13255 trailingSlash is evaluated on the client by making a server call, so we need to prerender it --- .changeset/gold-tips-cover.md | 5 +++++ packages/kit/src/runtime/server/page/index.js | 5 ++++- .../routes/trailing-slash-server/+page.svelte | 5 +++++ .../prerender/+page.server.js | 2 ++ .../prerender/+page.svelte | 5 +++++ packages/kit/test/apps/options-2/test/test.js | 17 +++++++++++++++++ 6 files changed, 38 insertions(+), 1 deletion(-) create mode 100644 .changeset/gold-tips-cover.md create mode 100644 packages/kit/test/apps/options-2/src/routes/trailing-slash-server/+page.svelte create mode 100644 packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.server.js create mode 100644 packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.svelte diff --git a/.changeset/gold-tips-cover.md b/.changeset/gold-tips-cover.md new file mode 100644 index 000000000000..a9c0a96e02ab --- /dev/null +++ b/.changeset/gold-tips-cover.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: prerender data when there is no server load but the `trailingSlash` option is set from the server diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index a41aa93b2894..83f30cb29d71 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -70,7 +70,10 @@ export async function render_page(event, page, options, manifest, state, resolve } } - const should_prerender_data = nodes.some((node) => node?.server?.load); + const should_prerender_data = nodes.some( + // prerender in case of trailingSlash because the client retrieves that value from the server + (node) => node?.server?.load || node?.server?.trailingSlash !== undefined + ); const data_pathname = add_data_suffix(event.url.pathname); // it's crucial that we do this before returning the non-SSR response, otherwise diff --git a/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/+page.svelte b/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/+page.svelte new file mode 100644 index 000000000000..71d69f88341a --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/+page.svelte @@ -0,0 +1,5 @@ + + +{base}/trailing-slash-server/prerender diff --git a/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.server.js b/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.server.js new file mode 100644 index 000000000000..69e0d18ba8ad --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.server.js @@ -0,0 +1,2 @@ +export const trailingSlash = 'always'; +export const prerender = true; diff --git a/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.svelte b/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.svelte new file mode 100644 index 000000000000..79966403d499 --- /dev/null +++ b/packages/kit/test/apps/options-2/src/routes/trailing-slash-server/prerender/+page.svelte @@ -0,0 +1,5 @@ + + +

{page.url.pathname}

diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index 5cfc8c8fed69..1c5c0ffd525a 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -55,6 +55,23 @@ test.describe('paths', () => { }); }); +test.describe('trailing slash', () => { + if (!process.env.DEV) { + test('trailing slash server prerendered without server load', async ({ + page, + clicknav, + javaScriptEnabled + }) => { + if (!javaScriptEnabled) return; + + await page.goto('/basepath/trailing-slash-server'); + + await clicknav('a[href="/basepath/trailing-slash-server/prerender"]'); + expect(await page.textContent('h2')).toBe('/basepath/trailing-slash-server/prerender/'); + }); + } +}); + test.describe('Service worker', () => { if (process.env.DEV) return; From 3c3109267f4f7339fdc055acc756966bf4f3b05a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 11:58:13 +0100 Subject: [PATCH 0862/1135] Version Packages (#13277) Co-authored-by: github-actions[bot] --- .changeset/dirty-bees-act.md | 5 ----- .changeset/gold-tips-cover.md | 5 ----- .changeset/sixty-rabbits-smell.md | 5 ----- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 6 files changed, 14 insertions(+), 17 deletions(-) delete mode 100644 .changeset/dirty-bees-act.md delete mode 100644 .changeset/gold-tips-cover.md delete mode 100644 .changeset/sixty-rabbits-smell.md diff --git a/.changeset/dirty-bees-act.md b/.changeset/dirty-bees-act.md deleted file mode 100644 index 94a55f6070de..000000000000 --- a/.changeset/dirty-bees-act.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly notify page store subscribers diff --git a/.changeset/gold-tips-cover.md b/.changeset/gold-tips-cover.md deleted file mode 100644 index a9c0a96e02ab..000000000000 --- a/.changeset/gold-tips-cover.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: prerender data when there is no server load but the `trailingSlash` option is set from the server diff --git a/.changeset/sixty-rabbits-smell.md b/.changeset/sixty-rabbits-smell.md deleted file mode 100644 index c7f66919c926..000000000000 --- a/.changeset/sixty-rabbits-smell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly remove navigation callbacks when returning function in onNavigate diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 9a525b5261a8..53c79686b782 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.15.2 +### Patch Changes + + +- fix: correctly notify page store subscribers ([#13205](https://github.com/sveltejs/kit/pull/13205)) + + +- fix: prerender data when there is no server load but the `trailingSlash` option is set from the server ([#13262](https://github.com/sveltejs/kit/pull/13262)) + + +- fix: correctly remove navigation callbacks when returning function in onNavigate ([#13241](https://github.com/sveltejs/kit/pull/13241)) + ## 2.15.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 810914ce621f..dd82ec5008a3 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.15.1", + "version": "2.15.2", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index cf2652ccca54..f36c63051579 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.15.1'; +export const VERSION = '2.15.2'; From 419ebfa3dd60727b711244bb634915e284fe74ed Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 7 Jan 2025 14:31:30 -0800 Subject: [PATCH 0863/1135] chore(deps): update all non-major dependencies (#13264) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- packages/adapter-vercel/package.json | 2 +- playgrounds/basic/package.json | 2 +- pnpm-lock.yaml | 93 ++++++++-------------------- 4 files changed, 28 insertions(+), 71 deletions(-) diff --git a/package.json b/package.json index f39bd3a7bf21..f57822edea28 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.15.2", + "packageManager": "pnpm@9.15.3", "engines": { "pnpm": "^9.0.0" } diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 8cd633ce9d5b..4e43e02401a6 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -39,7 +39,7 @@ "test": "vitest run" }, "dependencies": { - "@vercel/nft": "^0.27.9", + "@vercel/nft": "^0.29.0", "esbuild": "^0.24.0" }, "devDependencies": { diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index 9840e3683d05..216d786a439a 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -28,7 +28,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.2.6", - "publint": "^0.2.0", + "publint": "^0.3.0", "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f8e8849ed5cf..2b6922fc3883 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -263,8 +263,8 @@ importers: packages/adapter-vercel: dependencies: '@vercel/nft': - specifier: ^0.27.9 - version: 0.27.9(rollup@4.27.4) + specifier: ^0.29.0 + version: 0.29.0(rollup@4.27.4) esbuild: specifier: ^0.24.0 version: 0.24.0 @@ -1140,8 +1140,8 @@ importers: specifier: ^3.2.6 version: 3.2.7(prettier@3.3.3)(svelte@5.2.9) publint: - specifier: ^0.2.0 - version: 0.2.7 + specifier: ^0.3.0 + version: 0.3.0 svelte: specifier: ^5.2.9 version: 5.2.9 @@ -1786,6 +1786,10 @@ packages: '@polka/url@1.0.0-next.28': resolution: {integrity: sha512-8LduaNlMZGwdZ6qWrKlfa+2M4gahzFkprZiAt2TF8uS0qQgBizKXpXURqvTJ4WtmupWxaLqjRb2UCTe72mu+Aw==} + '@publint/pack@0.1.0': + resolution: {integrity: sha512-NvV5jPAQIMCoHvaJ0ZhfouBJ2woFYYf+o6B7dCHGh/tLKSPVoxhjffi35xPuMHgOv65aTOKUzML5XwQF9EkDAA==} + engines: {node: '>=18'} + '@rollup/plugin-commonjs@28.0.1': resolution: {integrity: sha512-+tNWdlWKbpB3WgBN7ijjYkq9X5uhjmcvyjEght4NmH5fAU++zfQzAJ6wumLS+dNcvwEZhKx2Z+skY8m7v0wGSA==} engines: {node: '>=16.0.0 || 14 >= 14.17'} @@ -2041,9 +2045,9 @@ packages: resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@vercel/nft@0.27.9': - resolution: {integrity: sha512-pTs7OchHQmSYJPR0puVQCWw/NqzuvAtnAhBurz21lq4Y4KqWoMpYKqmikkETG5r1bHNCM/hQMZ5JiRr9mhOkyg==} - engines: {node: '>=16'} + '@vercel/nft@0.29.0': + resolution: {integrity: sha512-LAkWyznNySxZ57ibqEGKnWFPqiRxyLvewFyB9iCHFfMsZlVyiu8MNFbjrGk3eV0vuyim5HzBloqlvSrG4BpZ7g==} + engines: {node: '>=18'} hasBin: true '@vitest/expect@2.1.6': @@ -2603,11 +2607,6 @@ packages: resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} deprecated: Glob versions prior to v9 are no longer supported - glob@8.1.0: - resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} - engines: {node: '>=12'} - deprecated: Glob versions prior to v9 are no longer supported - globals@14.0.0: resolution: {integrity: sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==} engines: {node: '>=18'} @@ -2651,10 +2650,6 @@ packages: resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} engines: {node: '>=0.10.0'} - ignore-walk@5.0.1: - resolution: {integrity: sha512-yemi4pMf51WKT7khInJqAvsIGzoqYXblnsz0ql8tM+yi1EKYTY1evX4NAbJrLL/Aanr2HyZeluqU+Oi7MGHokw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - ignore@5.3.2: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} @@ -2890,10 +2885,6 @@ packages: minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} - minimatch@5.1.6: - resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} - engines: {node: '>=10'} - minimatch@9.0.5: resolution: {integrity: sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==} engines: {node: '>=16 || 14 >=14.17'} @@ -2959,19 +2950,6 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - npm-bundled@2.0.1: - resolution: {integrity: sha512-gZLxXdjEzE/+mOstGDqR6b0EkhJ+kM6fxM6vUuckuctuVPh80Q6pw/rSZj9s4Gex9GxWtIicO1pc8DB9KZWudw==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - npm-normalize-package-bin@2.0.0: - resolution: {integrity: sha512-awzfKUO7v0FscrSpRoogyNm0sajikhBWpU0QMrW09AMi9n1PoKU6WaIqUzuJSQnpciZZmJ/jMZ2Egfmb/9LiWQ==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - - npm-packlist@5.1.3: - resolution: {integrity: sha512-263/0NGrn32YFYi4J533qzrQ/krmmrWwhKkzwTuM4f/07ug51odoaNjUexxO4vxlzURHcmYMH1QjvHjsNDKLVg==} - engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} - hasBin: true - ohash@1.1.4: resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} @@ -3023,6 +3001,9 @@ packages: package-manager-detector@0.2.0: resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} + package-manager-detector@0.2.8: + resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} + parent-module@1.0.1: resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} engines: {node: '>=6'} @@ -3147,9 +3128,9 @@ packages: printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} - publint@0.2.7: - resolution: {integrity: sha512-tLU4ee3110BxWfAmCZggJmCUnYWgPTr0QLnx08sqpLYa8JHRiOudd+CgzdpfU5x5eOaW2WMkpmOrFshRFYK7Mw==} - engines: {node: '>=16'} + publint@0.3.0: + resolution: {integrity: sha512-B7efom03c86OGqN1Jp2mDduiamb5apEuolvlbUeHaa14geCzJKz35oPIiKoXPMvM3tGABEZ1oLfY6xJNvOh69g==} + engines: {node: '>=18'} hasBin: true punycode@2.3.1: @@ -4252,6 +4233,8 @@ snapshots: '@polka/url@1.0.0-next.28': {} + '@publint/pack@0.1.0': {} + '@rollup/plugin-commonjs@28.0.1(rollup@4.27.4)': dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.27.4) @@ -4508,7 +4491,7 @@ snapshots: '@typescript-eslint/types': 8.4.0 eslint-visitor-keys: 3.4.3 - '@vercel/nft@0.27.9(rollup@4.27.4)': + '@vercel/nft@0.29.0(rollup@4.27.4)': dependencies: '@mapbox/node-pre-gyp': 2.0.0-rc.0 '@rollup/pluginutils': 5.1.3(rollup@4.27.4) @@ -5123,14 +5106,6 @@ snapshots: once: 1.4.0 path-is-absolute: 1.0.1 - glob@8.1.0: - dependencies: - fs.realpath: 1.0.0 - inflight: 1.0.6 - inherits: 2.0.4 - minimatch: 5.1.6 - once: 1.4.0 - globals@14.0.0: {} globals@15.14.0: {} @@ -5171,10 +5146,6 @@ snapshots: dependencies: safer-buffer: 2.1.2 - ignore-walk@5.0.1: - dependencies: - minimatch: 5.1.6 - ignore@5.3.2: {} imagetools-core@7.0.0: @@ -5383,10 +5354,6 @@ snapshots: dependencies: brace-expansion: 1.1.11 - minimatch@5.1.6: - dependencies: - brace-expansion: 2.0.1 - minimatch@9.0.5: dependencies: brace-expansion: 2.0.1 @@ -5429,19 +5396,6 @@ snapshots: dependencies: abbrev: 2.0.0 - npm-bundled@2.0.1: - dependencies: - npm-normalize-package-bin: 2.0.0 - - npm-normalize-package-bin@2.0.0: {} - - npm-packlist@5.1.3: - dependencies: - glob: 8.1.0 - ignore-walk: 5.0.1 - npm-bundled: 2.0.1 - npm-normalize-package-bin: 2.0.0 - ohash@1.1.4: {} once@1.4.0: @@ -5489,6 +5443,8 @@ snapshots: package-manager-detector@0.2.0: {} + package-manager-detector@0.2.8: {} + parent-module@1.0.1: dependencies: callsites: 3.1.0 @@ -5579,9 +5535,10 @@ snapshots: printable-characters@1.0.42: {} - publint@0.2.7: + publint@0.3.0: dependencies: - npm-packlist: 5.1.3 + '@publint/pack': 0.1.0 + package-manager-detector: 0.2.8 picocolors: 1.1.1 sade: 1.8.1 From 450ec48a00cff46a76a00aec0c06785397caa262 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 7 Jan 2025 23:33:50 +0100 Subject: [PATCH 0864/1135] docs: fix code snippet (#13283) --- documentation/docs/30-advanced/25-errors.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/documentation/docs/30-advanced/25-errors.md b/documentation/docs/30-advanced/25-errors.md index df05e5310232..17d7eabc8268 100644 --- a/documentation/docs/30-advanced/25-errors.md +++ b/documentation/docs/30-advanced/25-errors.md @@ -57,8 +57,7 @@ This throws an exception that SvelteKit catches, causing it to set the response You can add extra properties to the error object if needed... ```js -import { error } from '@sveltejs/kit'; - +// @filename: ambient.d.ts declare global { namespace App { interface Error { @@ -67,7 +66,10 @@ declare global { } } } +export {} +// @filename: index.js +import { error } from '@sveltejs/kit'; // ---cut--- error(404, { message: 'Not found', From d09bc033123903f359c1ad6fd3a6d8d7fc19298a Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Wed, 8 Jan 2025 17:26:14 +0800 Subject: [PATCH 0865/1135] fix: make param matcher generated type import with a .js extension (#13286) fixes #13280 Similar to #5907 we need to import the param matchers file ending with .js so that when the moduleResolution is set to something strict such as NodeNext (the default for libraries) the type inference isn't lost when it can't resolve the param matcher file due to the lack of a file extension. --- .changeset/slimy-cows-listen.md | 5 +++++ packages/kit/src/core/sync/write_types/index.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/slimy-cows-listen.md diff --git a/.changeset/slimy-cows-listen.md b/.changeset/slimy-cows-listen.md new file mode 100644 index 000000000000..adfca8dadc90 --- /dev/null +++ b/.changeset/slimy-cows-listen.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: make param matchers generated type import end with `.js` diff --git a/packages/kit/src/core/sync/write_types/index.js b/packages/kit/src/core/sync/write_types/index.js index 42728feaf187..e57b00183e6f 100644 --- a/packages/kit/src/core/sync/write_types/index.js +++ b/packages/kit/src/core/sync/write_types/index.js @@ -585,7 +585,7 @@ function replace_ext_with_js(file_path) { function generate_params_type(params, outdir, config) { /** @param {string} matcher */ const path_to_matcher = (matcher) => - posixify(path.relative(outdir, path.join(config.kit.files.params, matcher))); + posixify(path.relative(outdir, path.join(config.kit.files.params, matcher + '.js'))); return `{ ${params .map( From f3f08582d41b08c3fd1daf742e5703d9cdca7823 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 8 Jan 2025 18:04:52 -0800 Subject: [PATCH 0866/1135] fix: upgrade `esm-env` to remove warning when `NODE_ENV` is not set (#13291) --- .changeset/khaki-melons-add.md | 5 +++++ packages/kit/package.json | 2 +- packages/kit/src/utils/routing.js | 3 +-- pnpm-lock.yaml | 9 +++++++-- 4 files changed, 14 insertions(+), 5 deletions(-) create mode 100644 .changeset/khaki-melons-add.md diff --git a/.changeset/khaki-melons-add.md b/.changeset/khaki-melons-add.md new file mode 100644 index 000000000000..f989e6377739 --- /dev/null +++ b/.changeset/khaki-melons-add.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: upgrade esm-env to remove warning when NODE_ENV is not set diff --git a/packages/kit/package.json b/packages/kit/package.json index dd82ec5008a3..b38a3b013083 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -21,7 +21,7 @@ "@types/cookie": "^0.6.0", "cookie": "^0.6.0", "devalue": "^5.1.0", - "esm-env": "^1.2.1", + "esm-env": "^1.2.2", "import-meta-resolve": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", diff --git a/packages/kit/src/utils/routing.js b/packages/kit/src/utils/routing.js index 19eef5b265c3..7d988317a058 100644 --- a/packages/kit/src/utils/routing.js +++ b/packages/kit/src/utils/routing.js @@ -1,5 +1,4 @@ -// @ts-ignore - need to publish types for sub-package imports -import BROWSER from 'esm-env/browser'; +import { BROWSER } from 'esm-env'; const param_pattern = /^(\[)?(\.\.\.)?(\w+)(?:=(\w+))?(\])?$/; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2b6922fc3883..ee44a84c946c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -349,8 +349,8 @@ importers: specifier: ^5.1.0 version: 5.1.0 esm-env: - specifier: ^1.2.1 - version: 1.2.1 + specifier: ^1.2.2 + version: 1.2.2 import-meta-resolve: specifier: ^4.1.0 version: 4.1.0 @@ -2444,6 +2444,9 @@ packages: esm-env@1.2.1: resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} + esm-env@1.2.2: + resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} + espree@10.3.0: resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4940,6 +4943,8 @@ snapshots: esm-env@1.2.1: {} + esm-env@1.2.2: {} + espree@10.3.0: dependencies: acorn: 8.14.0 From 58eb46ab999306eb9b7ade1d750cb9d3330289a8 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 10 Jan 2025 04:08:02 +0800 Subject: [PATCH 0867/1135] docs: clarify how to inline assets (#13294) * add docs * format * indentation --- packages/kit/src/exports/public.d.ts | 32 +++++++++++++++++++++++++++- packages/kit/types/index.d.ts | 32 +++++++++++++++++++++++++++- 2 files changed, 62 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index b4a837768420..2ee7e9bfe1de 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -499,11 +499,41 @@ export interface KitConfig { */ preloadStrategy?: 'modulepreload' | 'preload-js' | 'preload-mjs'; /** + * The bundle strategy option affects how your app's JavaScript and CSS files are loaded. * - If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios. * - If `'single'`, creates just one .js bundle and one .css file containing code for the entire app. * - If `'inline'`, inlines all JavaScript and CSS of the entire app into the HTML. The result is usable without a server (i.e. you can just open the file in your browser). * - * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks)inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions). + * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks) inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions). + * + * If you want to inline your assets, you'll need to set Vite's [`build.assetsInlineLimit`](https://vite.dev/config/build-options.html#build-assetsinlinelimit) option to an appropriate size then import your assets through Vite. + * + * ```js + * /// file: vite.config.js + * import { sveltekit } from '@sveltejs/kit/vite'; + * import { defineConfig } from 'vite'; + * + * export default defineConfig({ + * plugins: [sveltekit()], + * build: { + * // inline all imported assets + * assetsInlineLimit: Infinity + * } + * }); + * ``` + * + * ```svelte + * /// file: src/routes/+layout.svelte + * + * + * + * + * + * + * ``` * @default 'split' * @since 2.13.0 */ diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 5c7db29c3301..bfb8346c86db 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -481,11 +481,41 @@ declare module '@sveltejs/kit' { */ preloadStrategy?: 'modulepreload' | 'preload-js' | 'preload-mjs'; /** + * The bundle strategy option affects how your app's JavaScript and CSS files are loaded. * - If `'split'`, splits the app up into multiple .js/.css files so that they are loaded lazily as the user navigates around the app. This is the default, and is recommended for most scenarios. * - If `'single'`, creates just one .js bundle and one .css file containing code for the entire app. * - If `'inline'`, inlines all JavaScript and CSS of the entire app into the HTML. The result is usable without a server (i.e. you can just open the file in your browser). * - * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks)inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions). + * When using `'split'`, you can also adjust the bundling behaviour by setting [`output.experimentalMinChunkSize`](https://rollupjs.org/configuration-options/#output-experimentalminchunksize) and [`output.manualChunks`](https://rollupjs.org/configuration-options/#output-manualchunks) inside your Vite config's [`build.rollupOptions`](https://vite.dev/config/build-options.html#build-rollupoptions). + * + * If you want to inline your assets, you'll need to set Vite's [`build.assetsInlineLimit`](https://vite.dev/config/build-options.html#build-assetsinlinelimit) option to an appropriate size then import your assets through Vite. + * + * ```js + * /// file: vite.config.js + * import { sveltekit } from '@sveltejs/kit/vite'; + * import { defineConfig } from 'vite'; + * + * export default defineConfig({ + * plugins: [sveltekit()], + * build: { + * // inline all imported assets + * assetsInlineLimit: Infinity + * } + * }); + * ``` + * + * ```svelte + * /// file: src/routes/+layout.svelte + * + * + * + * + * + * + * ``` * @default 'split' * @since 2.13.0 */ From 5b667e48b1a5a81d9235ddc903f6e2ced4f49787 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 10 Jan 2025 10:03:07 +0800 Subject: [PATCH 0868/1135] docs: mention the `building` variable to execute non-prerenderable code in server handle (#13153) * Update 20-hooks.md * Update documentation/docs/30-advanced/20-hooks.md --------- Co-authored-by: Elliott Johnson --- documentation/docs/30-advanced/20-hooks.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index bcdf21fbf9e8..a0f7a36c79c3 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -39,6 +39,8 @@ export async function handle({ event, resolve }) { If unimplemented, defaults to `({ event, resolve }) => resolve(event)`. +During prerendering, SvelteKit crawls your pages for links and renders each route it finds. Rendering the route invokes the `handle` function (and all other route dependencies, like `load`). If you need to exclude some code from running during this phase, check that the app is not [`building`]($app-environment#building) beforehand. + ### locals To add custom data to the request, which is passed to handlers in `+server.js` and server `load` functions, populate the `event.locals` object, as shown below. From d4bcfccb4503b12fe76140dbb6cfddc81f9419fc Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 13 Jan 2025 20:31:20 +0800 Subject: [PATCH 0869/1135] fix: handle redirect thrown from root layout load when client-side navigating to a non-existent page (#12005) fixes #11099 We end up in that code path when encountering a 404 route, because we first try to fall back to the server, and load the root error page else, at which point the layout load is run. --- .changeset/silver-schools-battle.md | 5 ++ packages/kit/src/runtime/client/client.js | 57 +++++++++++-------- .../test/apps/no-ssr/src/routes/+layout.js | 8 +++ .../test/apps/no-ssr/src/routes/+page.svelte | 1 + packages/kit/test/apps/no-ssr/test/test.js | 9 ++- 5 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 .changeset/silver-schools-battle.md diff --git a/.changeset/silver-schools-battle.md b/.changeset/silver-schools-battle.md new file mode 100644 index 000000000000..ffded2060e17 --- /dev/null +++ b/.changeset/silver-schools-battle.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: handle `Redirect` thrown from root layout load function when client-side navigating to a non-existent page diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 365d7fea3db5..25cd2c89b528 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1153,32 +1153,41 @@ async function load_root_error_page({ status, error, url, route }) { } } - const root_layout = await load_node({ - loader: default_layout_loader, - url, - params, - route, - parent: () => Promise.resolve({}), - server_data_node: create_data_node(server_data_node) - }); + try { + const root_layout = await load_node({ + loader: default_layout_loader, + url, + params, + route, + parent: () => Promise.resolve({}), + server_data_node: create_data_node(server_data_node) + }); - /** @type {import('./types.js').BranchNode} */ - const root_error = { - node: await default_error_loader(), - loader: default_error_loader, - universal: null, - server: null, - data: null - }; + /** @type {import('./types.js').BranchNode} */ + const root_error = { + node: await default_error_loader(), + loader: default_error_loader, + universal: null, + server: null, + data: null + }; - return get_navigation_result_from_branch({ - url, - params, - branch: [root_layout, root_error], - status, - error, - route: null - }); + return get_navigation_result_from_branch({ + url, + params, + branch: [root_layout, root_error], + status, + error, + route: null + }); + } catch (error) { + if (error instanceof Redirect) { + return _goto(new URL(error.location, location.href), {}, 0); + } + + // TODO: this falls back to the server when a server exists, but what about SPA mode? + throw error; + } } /** diff --git a/packages/kit/test/apps/no-ssr/src/routes/+layout.js b/packages/kit/test/apps/no-ssr/src/routes/+layout.js index a3d15781a772..ed365f16e69d 100644 --- a/packages/kit/test/apps/no-ssr/src/routes/+layout.js +++ b/packages/kit/test/apps/no-ssr/src/routes/+layout.js @@ -1 +1,9 @@ +import { redirect } from '@sveltejs/kit'; + export const ssr = false; + +export const load = ({ url }) => { + if (url.pathname === '/redirect') { + redirect(302, '/'); + } +}; diff --git a/packages/kit/test/apps/no-ssr/src/routes/+page.svelte b/packages/kit/test/apps/no-ssr/src/routes/+page.svelte index e69de29bb2d1..415b7b290db0 100644 --- a/packages/kit/test/apps/no-ssr/src/routes/+page.svelte +++ b/packages/kit/test/apps/no-ssr/src/routes/+page.svelte @@ -0,0 +1 @@ +

home

diff --git a/packages/kit/test/apps/no-ssr/test/test.js b/packages/kit/test/apps/no-ssr/test/test.js index 78ab10b2ff32..f4a61d76bf3f 100644 --- a/packages/kit/test/apps/no-ssr/test/test.js +++ b/packages/kit/test/apps/no-ssr/test/test.js @@ -8,8 +8,13 @@ test.skip(({ javaScriptEnabled }) => !javaScriptEnabled); test.describe.configure({ mode: 'parallel' }); test('navigating to a non-existent route renders the default error page', async ({ page }) => { - test.setTimeout(3000); await page.goto('/non-existent-route'); - await page.waitForLoadState('networkidle'); expect(await page.textContent('h1')).toBe('404'); }); + +test('navigating to a non-existent route redirects if redirect in the root layout', async ({ + page +}) => { + await page.goto('/redirect'); + expect(await page.textContent('h1')).toBe('home'); +}); From 043cdac4c1d1c88b8da659529b8ab59c0c4e4cab Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 13 Jan 2025 21:36:04 +0800 Subject: [PATCH 0870/1135] fix: prevent vitest from hanging (#12830) fixes #12305 closes #12306 This is an alternative to #12306 . Instead of creating the emulator every time the Vite dev and preview middlewares are invoked, we await Cloudflare's platform proxy only when the adapter emulated platform is accessed, rather than much earlier when adapter.adapt is invoked. --- .changeset/six-goats-ring.md | 5 +++ packages/adapter-cloudflare-workers/index.js | 44 +++++++++++--------- packages/adapter-cloudflare/index.js | 44 +++++++++++--------- 3 files changed, 55 insertions(+), 38 deletions(-) create mode 100644 .changeset/six-goats-ring.md diff --git a/.changeset/six-goats-ring.md b/.changeset/six-goats-ring.md new file mode 100644 index 000000000000..b18993387de4 --- /dev/null +++ b/.changeset/six-goats-ring.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: prevent vitest from hanging diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index 02f8c7caff86..be1d98245cbd 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -149,29 +149,35 @@ export default function ({ config = 'wrangler.toml', platformProxy = {} } = {}) builder.writePrerendered(bucket_dir); }, - async emulate() { - const proxy = await getPlatformProxy(platformProxy); - const platform = /** @type {App.Platform} */ ({ - env: proxy.env, - context: proxy.ctx, - caches: proxy.caches, - cf: proxy.cf - }); + emulate() { + // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. + // If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens + const getting_platform = (async () => { + const proxy = await getPlatformProxy(platformProxy); + const platform = /** @type {App.Platform} */ ({ + env: proxy.env, + context: proxy.ctx, + caches: proxy.caches, + cf: proxy.cf + }); - /** @type {Record} */ - const env = {}; - const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); + /** @type {Record} */ + const env = {}; + const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); - for (const key in proxy.env) { - Object.defineProperty(env, key, { - get: () => { - throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); - } - }); - } + for (const key in proxy.env) { + Object.defineProperty(env, key, { + get: () => { + throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); + } + }); + } + return { platform, prerender_platform }; + })(); return { - platform: ({ prerender }) => { + platform: async ({ prerender }) => { + const { platform, prerender_platform } = await getting_platform; return prerender ? prerender_platform : platform; } }; diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 32f0e098509b..fa47122abe29 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -67,29 +67,35 @@ export default function (options = {}) { } }); }, - async emulate() { - const proxy = await getPlatformProxy(options.platformProxy); - const platform = /** @type {App.Platform} */ ({ - env: proxy.env, - context: proxy.ctx, - caches: proxy.caches, - cf: proxy.cf - }); + emulate() { + // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. + // If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens + const getting_platform = (async () => { + const proxy = await getPlatformProxy(options.platformProxy); + const platform = /** @type {App.Platform} */ ({ + env: proxy.env, + context: proxy.ctx, + caches: proxy.caches, + cf: proxy.cf + }); - /** @type {Record} */ - const env = {}; - const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); + /** @type {Record} */ + const env = {}; + const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); - for (const key in proxy.env) { - Object.defineProperty(env, key, { - get: () => { - throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); - } - }); - } + for (const key in proxy.env) { + Object.defineProperty(env, key, { + get: () => { + throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); + } + }); + } + return { platform, prerender_platform }; + })(); return { - platform: ({ prerender }) => { + platform: async ({ prerender }) => { + const { platform, prerender_platform } = await getting_platform; return prerender ? prerender_platform : platform; } }; From c2ffdcfd73a4159267b4b01878ce71ca3c456a2d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 13 Jan 2025 10:37:16 -0500 Subject: [PATCH 0871/1135] docs: add note about installing workers types (#11731) Co-authored-by: Chew Tee Ming --- .../docs/25-build-and-deploy/60-adapter-cloudflare.md | 4 ++-- .../docs/25-build-and-deploy/70-adapter-cloudflare-workers.md | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index 9a4b2b7e717a..635377932c13 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -82,11 +82,11 @@ export async function POST({ request, platform }) { > [!NOTE] SvelteKit's built-in `$env` module should be preferred for environment variables. -To include type declarations for your bindings, reference them in your `src/app.d.ts`: +To make these types available to your app, install `@cloudflare/workers-types` and reference them in your `src/app.d.ts`: ```ts /// file: src/app.d.ts -import { KVNamespace, DurableObjectNamespace } from '@cloudflare/workers-types'; ++++import { KVNamespace, DurableObjectNamespace } from '@cloudflare/workers-types';+++ declare global { namespace App { diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index e9ab68b4f085..ad820327463a 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -103,11 +103,11 @@ export async function POST({ request, platform }) { > [!NOTE] SvelteKit's built-in `$env` module should be preferred for environment variables. -To include type declarations for your bindings, reference them in your `src/app.d.ts`: +To make these types available to your app, install `@cloudflare/workers-types` and reference them in your `src/app.d.ts`: ```ts /// file: src/app.d.ts -import { KVNamespace, DurableObjectNamespace } from '@cloudflare/workers-types'; ++++import { KVNamespace, DurableObjectNamespace } from '@cloudflare/workers-types';+++ declare global { namespace App { From e201fa9380a00e072a80a2dcab56de3d77e5b67c Mon Sep 17 00:00:00 2001 From: Mustafa Taleb Date: Mon, 13 Jan 2025 12:26:22 -0700 Subject: [PATCH 0872/1135] fix: remove ":$" from virtual module ids to allow dev server to work with proxies (#12157) Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/eleven-colts-relax.md | 5 ++ .../vite/build/build_service_worker.js | 10 ++-- .../src/exports/vite/graph_analysis/index.js | 24 +-------- .../exports/vite/graph_analysis/index.spec.js | 14 ++++-- packages/kit/src/exports/vite/index.js | 18 +++++-- packages/kit/src/exports/vite/module_ids.js | 10 ++-- packages/kit/src/exports/vite/utils.js | 50 +++++++++++++++++++ 7 files changed, 92 insertions(+), 39 deletions(-) create mode 100644 .changeset/eleven-colts-relax.md diff --git a/.changeset/eleven-colts-relax.md b/.changeset/eleven-colts-relax.md new file mode 100644 index 000000000000..8a73924d8651 --- /dev/null +++ b/.changeset/eleven-colts-relax.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: remove ":$" from virtual module ids to allow dev server to work with proxies diff --git a/packages/kit/src/exports/vite/build/build_service_worker.js b/packages/kit/src/exports/vite/build/build_service_worker.js index 3b7c1cfe38f9..17eff31066dc 100644 --- a/packages/kit/src/exports/vite/build/build_service_worker.js +++ b/packages/kit/src/exports/vite/build/build_service_worker.js @@ -2,7 +2,7 @@ import fs from 'node:fs'; import * as vite from 'vite'; import { dedent } from '../../../core/sync/utils.js'; import { s } from '../../../utils/misc.js'; -import { get_config_aliases, strip_virtual_prefix, get_env } from '../utils.js'; +import { get_config_aliases, strip_virtual_prefix, get_env, normalize_id } from '../utils.js'; import { create_static_module } from '../../../core/env.js'; import { env_static_public, service_worker } from '../module_ids.js'; @@ -68,7 +68,8 @@ export async function build_service_worker( name: 'service-worker-build-virtual-modules', resolveId(id) { if (id.startsWith('$env/') || id.startsWith('$app/') || id === '$service-worker') { - return `\0virtual:${id}`; + // ids with :$ don't work with reverse proxies like nginx + return `\0virtual:${id.substring(1)}`; } }, @@ -83,7 +84,10 @@ export async function build_service_worker( return create_static_module('$env/static/public', env.public); } - const stripped = strip_virtual_prefix(id); + const normalized_cwd = vite.normalizePath(process.cwd()); + const normalized_lib = vite.normalizePath(kit.files.lib); + const relative = normalize_id(id, normalized_lib, normalized_cwd); + const stripped = strip_virtual_prefix(relative); throw new Error( `Cannot import ${stripped} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.` ); diff --git a/packages/kit/src/exports/vite/graph_analysis/index.js b/packages/kit/src/exports/vite/graph_analysis/index.js index a58cc7a72a2a..ecf7ee146769 100644 --- a/packages/kit/src/exports/vite/graph_analysis/index.js +++ b/packages/kit/src/exports/vite/graph_analysis/index.js @@ -1,6 +1,6 @@ import path from 'node:path'; import { posixify } from '../../../utils/filesystem.js'; -import { strip_virtual_prefix } from '../utils.js'; +import { normalize_id, strip_virtual_prefix } from '../utils.js'; import { app_server, env_dynamic_private, env_static_private } from '../module_ids.js'; const ILLEGAL_IMPORTS = new Set([env_dynamic_private, env_static_private, app_server]); @@ -85,25 +85,3 @@ export function module_guard(context, { cwd, lib }) { } }; } - -/** - * Removes cwd/lib path from the start of the id - * @param {string} id - * @param {string} lib - * @param {string} cwd - */ -export function normalize_id(id, lib, cwd) { - if (id.startsWith(lib)) { - id = id.replace(lib, '$lib'); - } - - if (id.startsWith(cwd)) { - id = path.relative(cwd, id); - } - - if (id === app_server) { - return '$app/server'; - } - - return posixify(id); -} diff --git a/packages/kit/src/exports/vite/graph_analysis/index.spec.js b/packages/kit/src/exports/vite/graph_analysis/index.spec.js index d149111f36af..35ecd31feb7b 100644 --- a/packages/kit/src/exports/vite/graph_analysis/index.spec.js +++ b/packages/kit/src/exports/vite/graph_analysis/index.spec.js @@ -1,5 +1,6 @@ import { assert, test } from 'vitest'; import { module_guard } from './index.js'; +import * as module_ids from '../module_ids.js'; /** * @@ -44,7 +45,7 @@ test('throws an error when importing $env/static/private', () => { importedIds: ['~/src/routes/+page.svelte'] }, '~/src/routes/+page.svelte': { - importedIds: ['\0virtual:$env/static/private'] + importedIds: ['\0virtual:env/static/private'] } }, `Cannot import $env/static/private into client-side code: @@ -60,7 +61,7 @@ test('throws an error when dynamically importing $env/static/private', () => { importedIds: ['~/src/routes/+page.svelte'] }, '~/src/routes/+page.svelte': { - dynamicallyImportedIds: ['\0virtual:$env/static/private'] + dynamicallyImportedIds: ['\0virtual:env/static/private'] } }, `Cannot import $env/static/private into client-side code: @@ -76,7 +77,7 @@ test('throws an error when importing $env/dynamic/private', () => { importedIds: ['~/src/routes/+page.svelte'] }, '~/src/routes/+page.svelte': { - importedIds: ['\0virtual:$env/dynamic/private'] + importedIds: ['\0virtual:env/dynamic/private'] } }, `Cannot import $env/dynamic/private into client-side code: @@ -92,7 +93,7 @@ test('throws an error when dynamically importing $env/dynamic/private', () => { importedIds: ['~/src/routes/+page.svelte'] }, '~/src/routes/+page.svelte': { - dynamicallyImportedIds: ['\0virtual:$env/dynamic/private'] + dynamicallyImportedIds: ['\0virtual:env/dynamic/private'] } }, `Cannot import $env/dynamic/private into client-side code: @@ -101,6 +102,11 @@ test('throws an error when dynamically importing $env/dynamic/private', () => { ); }); +// nginx does not process URLs containing the sequence `:$` +test('":$" is not in virtual module ids', () => { + assert.notInclude(Object.values(module_ids).join(''), ':$'); +}); + test('throws an error when importing a .server.js module', () => { check( { diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 21bc3d49575f..093a851fb1df 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -15,9 +15,9 @@ import { build_server_nodes } from './build/build_server.js'; import { build_service_worker } from './build/build_service_worker.js'; import { assets_base, find_deps } from './build/utils.js'; import { dev } from './dev/index.js'; -import { is_illegal, module_guard, normalize_id } from './graph_analysis/index.js'; +import { is_illegal, module_guard } from './graph_analysis/index.js'; import { preview } from './preview/index.js'; -import { get_config_aliases, get_env, strip_virtual_prefix } from './utils.js'; +import { get_config_aliases, get_env, normalize_id, strip_virtual_prefix } from './utils.js'; import { write_client_manifest } from '../../core/sync/write_client_manifest.js'; import prerender from '../../core/postbuild/prerender.js'; import analyse from '../../core/postbuild/analyse.js'; @@ -376,8 +376,14 @@ async function kit({ svelte_config }) { parsed_importer.name === parsed_service_worker.name; if (importer_is_service_worker && id !== '$service-worker' && id !== '$env/static/public') { + const normalized_cwd = vite.normalizePath(cwd); + const normalized_lib = vite.normalizePath(kit.files.lib); throw new Error( - `Cannot import ${id} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.` + `Cannot import ${normalize_id( + id, + normalized_lib, + normalized_cwd + )} into service-worker code. Only the modules $service-worker and $env/static/public are available in service workers.` ); } @@ -385,7 +391,11 @@ async function kit({ svelte_config }) { } // treat $env/static/[public|private] as virtual - if (id.startsWith('$env/') || id.startsWith('__sveltekit/') || id === '$service-worker') { + if (id.startsWith('$env/') || id === '$service-worker') { + // ids with :$ don't work with reverse proxies like nginx + return `\0virtual:${id.substring(1)}`; + } + if (id.startsWith('__sveltekit/')) { return `\0virtual:${id}`; } }, diff --git a/packages/kit/src/exports/vite/module_ids.js b/packages/kit/src/exports/vite/module_ids.js index 3be16f68a71f..91b5caeddb4f 100644 --- a/packages/kit/src/exports/vite/module_ids.js +++ b/packages/kit/src/exports/vite/module_ids.js @@ -1,11 +1,11 @@ import { fileURLToPath } from 'node:url'; -export const env_static_private = '\0virtual:$env/static/private'; -export const env_static_public = '\0virtual:$env/static/public'; -export const env_dynamic_private = '\0virtual:$env/dynamic/private'; -export const env_dynamic_public = '\0virtual:$env/dynamic/public'; +export const env_static_private = '\0virtual:env/static/private'; +export const env_static_public = '\0virtual:env/static/public'; +export const env_dynamic_private = '\0virtual:env/dynamic/private'; +export const env_dynamic_public = '\0virtual:env/dynamic/public'; -export const service_worker = '\0virtual:$service-worker'; +export const service_worker = '\0virtual:service-worker'; export const sveltekit_environment = '\0virtual:__sveltekit/environment'; export const sveltekit_paths = '\0virtual:__sveltekit/paths'; diff --git a/packages/kit/src/exports/vite/utils.js b/packages/kit/src/exports/vite/utils.js index a4ff95178803..02916e4d85c5 100644 --- a/packages/kit/src/exports/vite/utils.js +++ b/packages/kit/src/exports/vite/utils.js @@ -4,6 +4,14 @@ import { posixify } from '../../utils/filesystem.js'; import { negotiate } from '../../utils/http.js'; import { filter_private_env, filter_public_env } from '../../utils/env.js'; import { escape_html } from '../../utils/escape.js'; +import { + app_server, + env_dynamic_private, + env_dynamic_public, + env_static_private, + env_static_public, + service_worker +} from './module_ids.js'; /** * Transforms kit.alias to a valid vite.resolve.alias array. @@ -105,4 +113,46 @@ export function not_found(req, res, base) { } } +/** + * Removes cwd/lib path from the start of the id + * @param {string} id + * @param {string} lib + * @param {string} cwd + */ +export function normalize_id(id, lib, cwd) { + if (id.startsWith(lib)) { + id = id.replace(lib, '$lib'); + } + + if (id.startsWith(cwd)) { + id = path.relative(cwd, id); + } + + if (id === app_server) { + return '$app/server'; + } + + if (id === env_static_private) { + return '$env/static/private'; + } + + if (id === env_static_public) { + return '$env/static/public'; + } + + if (id === env_dynamic_private) { + return '$env/dynamic/private'; + } + + if (id === env_dynamic_public) { + return '$env/dynamic/public'; + } + + if (id === service_worker) { + return '$service-worker'; + } + + return posixify(id); +} + export const strip_virtual_prefix = /** @param {string} id */ (id) => id.replace('\0virtual:', ''); From 1bedcc1cfc1f2d85946c1423f60faa8a2a56148b Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Tue, 14 Jan 2025 04:50:42 +0900 Subject: [PATCH 0873/1135] fix: fix a `popState` race-condition (#12925) When loading a non-SSR page and pressing the browser's back button while the page is still loading, it's possible for `current.url` to still be the default value of `null`, which then causes the `popState` function to throw. We therefore guard against that. Fixes #12924 --- .changeset/angry-months-speak.md | 5 +++++ packages/kit/src/runtime/client/client.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/angry-months-speak.md diff --git a/.changeset/angry-months-speak.md b/.changeset/angry-months-speak.md new file mode 100644 index 000000000000..961945dc4152 --- /dev/null +++ b/.changeset/angry-months-speak.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: fix race-condition when not using SSR when pressing back before initial load diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 25cd2c89b528..f06e45d2d6e4 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -2330,7 +2330,7 @@ function _start_router() { const state = event.state[STATES_KEY] ?? {}; const url = new URL(event.state[PAGE_URL_KEY] ?? location.href); const navigation_index = event.state[NAVIGATION_INDEX]; - const is_hash_change = strip_hash(location) === strip_hash(current.url); + const is_hash_change = current.url ? strip_hash(location) === strip_hash(current.url) : false; const shallow = navigation_index === current_navigation_index && (has_navigated || is_hash_change); From 226db42d08d3be3dfbb25750c5cc55f81bd6d722 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 16:10:25 -0800 Subject: [PATCH 0874/1135] chore(deps): update pnpm to v9.15.4 (#13306) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f57822edea28..398c40d37a1e 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@9.15.3", + "packageManager": "pnpm@9.15.4", "engines": { "pnpm": "^9.0.0" } From c8164ad17d4472d5b3eb0d0eef5fd34dd0ae60a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bj=C3=B8rn=20Madsen?= Date: Tue, 14 Jan 2025 17:51:37 +0100 Subject: [PATCH 0875/1135] docs: fix link to cloudflare docs (#13311) --- documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index 635377932c13..b4daaa2fbf53 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -120,7 +120,7 @@ However, they will have no effect on responses dynamically rendered by SvelteKit ### Further reading -You may wish to refer to [Cloudflare's documentation for deploying a SvelteKit site](https://developers.cloudflare.com/pages/framework-guides/deploy-a-svelte-site). +You may wish to refer to [Cloudflare's documentation for deploying a SvelteKit site](https://developers.cloudflare.com/pages/framework-guides/deploy-a-svelte-kit-site). ### Accessing the file system From d512606c0afe3a52f793a9a808ad2190da88115e Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Wed, 15 Jan 2025 15:15:48 +0800 Subject: [PATCH 0876/1135] feat: update Vercel, Cloudflare, and Netlify adapter major versions (#13142) * update adapter versions * changeset * add test * update cf adapter version to 5 --- .changeset/selfish-lamps-joke.md | 5 +++++ packages/adapter-auto/adapters.js | 6 +++--- packages/adapter-auto/package.json | 6 ++++-- packages/adapter-auto/test/adapters.spec.js | 16 ++++++++++++++++ pnpm-lock.yaml | 3 +++ 5 files changed, 31 insertions(+), 5 deletions(-) create mode 100644 .changeset/selfish-lamps-joke.md create mode 100644 packages/adapter-auto/test/adapters.spec.js diff --git a/.changeset/selfish-lamps-joke.md b/.changeset/selfish-lamps-joke.md new file mode 100644 index 000000000000..b2003ab2f1b7 --- /dev/null +++ b/.changeset/selfish-lamps-joke.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-auto': major +--- + +feat: update Vercel, Cloudflare Pages, and Netlify adapter major versions diff --git a/packages/adapter-auto/adapters.js b/packages/adapter-auto/adapters.js index edf9e3436e20..6bb2bb943e8b 100644 --- a/packages/adapter-auto/adapters.js +++ b/packages/adapter-auto/adapters.js @@ -7,19 +7,19 @@ export const adapters = [ name: 'Vercel', test: () => !!process.env.VERCEL, module: '@sveltejs/adapter-vercel', - version: '4' + version: '5' }, { name: 'Cloudflare Pages', test: () => !!process.env.CF_PAGES, module: '@sveltejs/adapter-cloudflare', - version: '3' + version: '5' }, { name: 'Netlify', test: () => !!process.env.NETLIFY, module: '@sveltejs/adapter-netlify', - version: '3' + version: '4' }, { name: 'Azure Static Web Apps', diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index ef4fbc3ba707..e58aa5697640 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -36,13 +36,15 @@ "scripts": { "lint": "prettier --check .", "format": "pnpm lint --write", - "check": "tsc" + "check": "tsc", + "test": "vitest run" }, "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", - "typescript": "^5.3.3" + "typescript": "^5.3.3", + "vitest": "^2.1.6" }, "dependencies": { "import-meta-resolve": "^4.1.0" diff --git a/packages/adapter-auto/test/adapters.spec.js b/packages/adapter-auto/test/adapters.spec.js new file mode 100644 index 000000000000..abb873fa6a78 --- /dev/null +++ b/packages/adapter-auto/test/adapters.spec.js @@ -0,0 +1,16 @@ +import { assert, test } from 'vitest'; +import { adapters } from 'adapters.js'; +import { existsSync, readFileSync } from 'node:fs'; + +test('adapter versions are up to date', () => { + for (const adapter of adapters) { + const dir = adapter.module.replace('@sveltejs/', ''); + const package_json = `../${dir}/package.json`; + if (!existsSync(package_json)) { + continue; + } + const adapter_version = JSON.parse(readFileSync(package_json, 'utf-8')).version; + const [major] = adapter_version.split('.'); + assert.equal(adapter.version, major, `${adapter.name} adapter is outdated`); + } +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index ee44a84c946c..59b71725e173 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -51,6 +51,9 @@ importers: typescript: specifier: ^5.3.3 version: 5.6.3 + vitest: + specifier: ^2.1.6 + version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-cloudflare: dependencies: From df0f483f302e9decd0aef6a710860ea086622253 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 15 Jan 2025 13:26:46 +0100 Subject: [PATCH 0877/1135] Version Packages (#13288) Co-authored-by: github-actions[bot] --- .changeset/angry-months-speak.md | 5 ----- .changeset/eleven-colts-relax.md | 5 ----- .changeset/khaki-melons-add.md | 5 ----- .changeset/selfish-lamps-joke.md | 5 ----- .changeset/silver-schools-battle.md | 5 ----- .changeset/six-goats-ring.md | 5 ----- .changeset/slimy-cows-listen.md | 5 ----- packages/adapter-auto/CHANGELOG.md | 12 ++++++++++++ packages/adapter-auto/package.json | 2 +- packages/adapter-cloudflare/CHANGELOG.md | 9 +++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/kit/CHANGELOG.md | 18 ++++++++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 14 files changed, 43 insertions(+), 39 deletions(-) delete mode 100644 .changeset/angry-months-speak.md delete mode 100644 .changeset/eleven-colts-relax.md delete mode 100644 .changeset/khaki-melons-add.md delete mode 100644 .changeset/selfish-lamps-joke.md delete mode 100644 .changeset/silver-schools-battle.md delete mode 100644 .changeset/six-goats-ring.md delete mode 100644 .changeset/slimy-cows-listen.md diff --git a/.changeset/angry-months-speak.md b/.changeset/angry-months-speak.md deleted file mode 100644 index 961945dc4152..000000000000 --- a/.changeset/angry-months-speak.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: fix race-condition when not using SSR when pressing back before initial load diff --git a/.changeset/eleven-colts-relax.md b/.changeset/eleven-colts-relax.md deleted file mode 100644 index 8a73924d8651..000000000000 --- a/.changeset/eleven-colts-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: remove ":$" from virtual module ids to allow dev server to work with proxies diff --git a/.changeset/khaki-melons-add.md b/.changeset/khaki-melons-add.md deleted file mode 100644 index f989e6377739..000000000000 --- a/.changeset/khaki-melons-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: upgrade esm-env to remove warning when NODE_ENV is not set diff --git a/.changeset/selfish-lamps-joke.md b/.changeset/selfish-lamps-joke.md deleted file mode 100644 index b2003ab2f1b7..000000000000 --- a/.changeset/selfish-lamps-joke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-auto': major ---- - -feat: update Vercel, Cloudflare Pages, and Netlify adapter major versions diff --git a/.changeset/silver-schools-battle.md b/.changeset/silver-schools-battle.md deleted file mode 100644 index ffded2060e17..000000000000 --- a/.changeset/silver-schools-battle.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/kit": patch ---- - -fix: handle `Redirect` thrown from root layout load function when client-side navigating to a non-existent page diff --git a/.changeset/six-goats-ring.md b/.changeset/six-goats-ring.md deleted file mode 100644 index b18993387de4..000000000000 --- a/.changeset/six-goats-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -fix: prevent vitest from hanging diff --git a/.changeset/slimy-cows-listen.md b/.changeset/slimy-cows-listen.md deleted file mode 100644 index adfca8dadc90..000000000000 --- a/.changeset/slimy-cows-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: make param matchers generated type import end with `.js` diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index 409a5e47e8f3..13a7e071642e 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-auto +## 4.0.0 +### Major Changes + + +- feat: update Vercel, Cloudflare Pages, and Netlify adapter major versions ([#13142](https://github.com/sveltejs/kit/pull/13142)) + + +### Patch Changes + +- Updated dependencies [[`1bedcc1cfc1f2d85946c1423f60faa8a2a56148b`](https://github.com/sveltejs/kit/commit/1bedcc1cfc1f2d85946c1423f60faa8a2a56148b), [`e201fa9380a00e072a80a2dcab56de3d77e5b67c`](https://github.com/sveltejs/kit/commit/e201fa9380a00e072a80a2dcab56de3d77e5b67c), [`f3f08582d41b08c3fd1daf742e5703d9cdca7823`](https://github.com/sveltejs/kit/commit/f3f08582d41b08c3fd1daf742e5703d9cdca7823), [`d4bcfccb4503b12fe76140dbb6cfddc81f9419fc`](https://github.com/sveltejs/kit/commit/d4bcfccb4503b12fe76140dbb6cfddc81f9419fc), [`d09bc033123903f359c1ad6fd3a6d8d7fc19298a`](https://github.com/sveltejs/kit/commit/d09bc033123903f359c1ad6fd3a6d8d7fc19298a)]: + - @sveltejs/kit@2.15.3 + ## 3.3.1 ### Patch Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index e58aa5697640..7535be368372 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-auto", - "version": "3.3.1", + "version": "4.0.0", "description": "Automatically chooses the SvelteKit adapter for your current environment, if possible.", "keywords": [ "adapter", diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index bb851cf07ded..2a4f3fdfc59b 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-cloudflare +## 5.0.1 +### Patch Changes + + +- fix: prevent vitest from hanging ([#12830](https://github.com/sveltejs/kit/pull/12830)) + +- Updated dependencies [[`1bedcc1cfc1f2d85946c1423f60faa8a2a56148b`](https://github.com/sveltejs/kit/commit/1bedcc1cfc1f2d85946c1423f60faa8a2a56148b), [`e201fa9380a00e072a80a2dcab56de3d77e5b67c`](https://github.com/sveltejs/kit/commit/e201fa9380a00e072a80a2dcab56de3d77e5b67c), [`f3f08582d41b08c3fd1daf742e5703d9cdca7823`](https://github.com/sveltejs/kit/commit/f3f08582d41b08c3fd1daf742e5703d9cdca7823), [`d4bcfccb4503b12fe76140dbb6cfddc81f9419fc`](https://github.com/sveltejs/kit/commit/d4bcfccb4503b12fe76140dbb6cfddc81f9419fc), [`d09bc033123903f359c1ad6fd3a6d8d7fc19298a`](https://github.com/sveltejs/kit/commit/d09bc033123903f359c1ad6fd3a6d8d7fc19298a)]: + - @sveltejs/kit@2.15.3 + ## 5.0.0 ### Major Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 62d0b3f0a5e5..b72471c9f4f3 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "5.0.0", + "version": "5.0.1", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 53c79686b782..181b5b389e8b 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,23 @@ # @sveltejs/kit +## 2.15.3 +### Patch Changes + + +- fix: fix race-condition when not using SSR when pressing back before initial load ([#12925](https://github.com/sveltejs/kit/pull/12925)) + + +- fix: remove ":$" from virtual module ids to allow dev server to work with proxies ([#12157](https://github.com/sveltejs/kit/pull/12157)) + + +- fix: upgrade esm-env to remove warning when NODE_ENV is not set ([#13291](https://github.com/sveltejs/kit/pull/13291)) + + +- fix: handle `Redirect` thrown from root layout load function when client-side navigating to a non-existent page ([#12005](https://github.com/sveltejs/kit/pull/12005)) + + +- fix: make param matchers generated type import end with `.js` ([#13286](https://github.com/sveltejs/kit/pull/13286)) + ## 2.15.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index b38a3b013083..38c3bac6b552 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.15.2", + "version": "2.15.3", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index f36c63051579..b187e0432143 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.15.2'; +export const VERSION = '2.15.3'; From 699f4405c752261cf46c1ad32e4dbadceaffc75b Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Wed, 15 Jan 2025 14:15:40 +0100 Subject: [PATCH 0878/1135] fix: fall back to importing dynamic dependencies relative to SvelteKit package (#12532) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Simplifies code a bit around usage locations in our own code, and solves some issues people may have with their setups closes #11578 --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> Co-authored-by: 오병진 <64676070+sunrabbit123@users.noreply.github.com> --- .changeset/tricky-books-study.md | 5 +++++ packages/kit/src/core/sync/utils.js | 11 ++--------- packages/kit/src/utils/import.js | 6 +++--- 3 files changed, 10 insertions(+), 12 deletions(-) create mode 100644 .changeset/tricky-books-study.md diff --git a/.changeset/tricky-books-study.md b/.changeset/tricky-books-study.md new file mode 100644 index 000000000000..93069e3eea0b --- /dev/null +++ b/.changeset/tricky-books-study.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: fall back to importing dynamic dependencies relative to SvelteKit package diff --git a/packages/kit/src/core/sync/utils.js b/packages/kit/src/core/sync/utils.js index cf35fadb4940..304e9180a77b 100644 --- a/packages/kit/src/core/sync/utils.js +++ b/packages/kit/src/core/sync/utils.js @@ -3,15 +3,8 @@ import path from 'node:path'; import { mkdirp } from '../../utils/filesystem.js'; import { resolve_peer_dependency } from '../../utils/import.js'; -/** @type {string} */ -let VERSION; - -try { - ({ VERSION } = await resolve_peer_dependency('svelte/compiler')); -} catch { - // we can end up here from e.g. unit tests. this is the simplest fix - ({ VERSION } = await import('svelte/compiler')); -} +/** @type {{ VERSION: string }} */ +const { VERSION } = await resolve_peer_dependency('svelte/compiler'); /** @type {Map} */ const previous_contents = new Map(); diff --git a/packages/kit/src/utils/import.js b/packages/kit/src/utils/import.js index 78ed5482972d..1c55a14c9b2f 100644 --- a/packages/kit/src/utils/import.js +++ b/packages/kit/src/utils/import.js @@ -4,14 +4,14 @@ import { pathToFileURL } from 'node:url'; /** * Resolve a dependency relative to the current working directory, - * rather than relative to this package + * rather than relative to this package (but falls back to trying that, if necessary) * @param {string} dependency */ -export function resolve_peer_dependency(dependency) { +export async function resolve_peer_dependency(dependency) { try { // @ts-expect-error the types are wrong const resolved = imr.resolve(dependency, pathToFileURL(process.cwd() + '/dummy.js')); - return import(resolved); + return await import(resolved).catch(() => import(dependency)); } catch { throw new Error( `Could not resolve peer dependency "${dependency}" relative to your project — please install it and try again.` From 7c2c10429b1a780b1353e8e82c7b2c7ab6be5bec Mon Sep 17 00:00:00 2001 From: Joel Kuzmarski Date: Wed, 15 Jan 2025 08:37:47 -0600 Subject: [PATCH 0879/1135] docs: Add some helpful notes for Incremental Static Regeneration (#12030) --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .../25-build-and-deploy/90-adapter-vercel.md | 44 ++++++++++++++----- 1 file changed, 33 insertions(+), 11 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index a021f7295f74..e74da5200b2d 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -91,6 +91,8 @@ export default { Vercel supports [Incremental Static Regeneration](https://vercel.com/docs/incremental-static-regeneration) (ISR), which provides the performance and cost advantages of prerendered content with the flexibility of dynamically rendered content. +> Use ISR only on routes where every visitor should see the same content (much like when you prerender). If there's anything user-specific happening (like session cookies), they should happen on the client via JavaScript only to not leak sensitive information across visits + To add ISR to a route, include the `isr` property in your `config` object: ```js @@ -99,24 +101,44 @@ import { BYPASS_TOKEN } from '$env/static/private'; export const config = { isr: { - // Expiration time (in seconds) before the cached asset will be re-generated by invoking the Serverless Function. - // Setting the value to `false` means it will never expire. expiration: 60, - - // Random token that can be provided in the URL to bypass the cached version of the asset, by requesting the asset - // with a __prerender_bypass= cookie. - // - // Making a `GET` or `HEAD` request with `x-prerender-revalidate: ` will force the asset to be re-validated. bypassToken: BYPASS_TOKEN, - - // List of valid query parameters. Other parameters (such as utm tracking codes) will be ignored, - // ensuring that they do not result in content being regenerated unnecessarily allowQuery: ['search'] } }; ``` -The `expiration` property is required; all others are optional. +> Using ISR on a route with `export const prerender = true` will have no effect, since the route is prerendered at build time + +The `expiration` property is required; all others are optional. The properties are discussed in more detail below. + +### expiration + +The expiration time (in seconds) before the cached asset will be re-generated by invoking the Serverless Function. Setting the value to `false` means it will never expire. In that case, you likely want to define a bypass token to re-generate on demand. + +### bypassToken + +A random token that can be provided in the URL to bypass the cached version of the asset, by requesting the asset with a `__prerender_bypass=` cookie. + +Making a `GET` or `HEAD` request with `x-prerender-revalidate: ` will force the asset to be re-validated. + +Note that the `BYPASS_TOKEN` string must be at least 32 characters long. You could generate one using the JavaScript console like so: + +```console +btoa(Math.random().toString()).substring(0,32); +``` + +Set this string as an environment variable on Vercel by logging in and going to your project then Settings > Environment Variables. For "Key" put `BYPASS_TOKEN` and for "value" use the string generated above, then hit "Save". + +To get this key known about for local development, you can use the [Vercel CLI](https://vercel.com/docs/cli/env) by running the `vercel env pull` command locally like so: + +```console +$ vercel env pull .env.development.local +``` + +### allowQuery + +A list of valid query parameters that contribute to the cache key. Other parameters (such as utm tracking codes) will be ignored, ensuring that they do not result in content being re-generated unnecessarily. By default, query parameters are ignored. > Pages that are [prerendered](page-options#prerender) will ignore ISR configuration. From fb04de2bff5aa8db91f7167bdfb5349838a11465 Mon Sep 17 00:00:00 2001 From: Russell Carpenella Date: Wed, 15 Jan 2025 10:14:18 -0500 Subject: [PATCH 0880/1135] docs: add options for enhance update (#13022) closes #13020 --------- Co-authored-by: Chew Tee Ming --- packages/kit/src/runtime/app/forms.js | 3 +++ packages/kit/types/index.d.ts | 3 +++ 2 files changed, 6 insertions(+) diff --git a/packages/kit/src/runtime/app/forms.js b/packages/kit/src/runtime/app/forms.js index ffa402489548..4ed8f64c7e2e 100644 --- a/packages/kit/src/runtime/app/forms.js +++ b/packages/kit/src/runtime/app/forms.js @@ -65,6 +65,9 @@ function clone(element) { * - redirects to the nearest error page in case of an unexpected error * * If you provide a custom function with a callback and want to use the default behavior, invoke `update` in your callback. + * It accepts an options object + * - `reset: false` if you don't want the `` values to be reset after a successful submission + * - `invalidateAll: false` if you don't want the action to call `invalidateAll` after submission * @template {Record | undefined} Success * @template {Record | undefined} Failure * @param {HTMLFormElement} form_element The form element diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index bfb8346c86db..52aeebc361e4 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2136,6 +2136,9 @@ declare module '$app/forms' { * - redirects to the nearest error page in case of an unexpected error * * If you provide a custom function with a callback and want to use the default behavior, invoke `update` in your callback. + * It accepts an options object + * - `reset: false` if you don't want the `` values to be reset after a successful submission + * - `invalidateAll: false` if you don't want the action to call `invalidateAll` after submission * @param form_element The form element * @param submit Submit callback */ From b60707ca8e755be95c86490122aa1b792b9bd6be Mon Sep 17 00:00:00 2001 From: Matei Trandafir Date: Wed, 15 Jan 2025 17:39:56 +0200 Subject: [PATCH 0881/1135] feat: provide PageProps, LayoutProps types (#13308) Closes #12726 --------- Co-authored-by: Tee Ming --- .changeset/ten-onions-talk.md | 5 +++ .../docs/20-core-concepts/10-routing.md | 34 +++++++++++++++---- .../docs/20-core-concepts/20-load.md | 29 ++++++++++++---- .../docs/20-core-concepts/30-form-actions.md | 17 +++++++--- .../20-core-concepts/50-state-management.md | 6 ++-- .../25-build-and-deploy/90-adapter-vercel.md | 2 +- documentation/docs/98-reference/54-types.md | 31 +++++++++++++++++ .../kit/src/core/sync/write_types/index.js | 10 ++++++ 8 files changed, 112 insertions(+), 22 deletions(-) create mode 100644 .changeset/ten-onions-talk.md diff --git a/.changeset/ten-onions-talk.md b/.changeset/ten-onions-talk.md new file mode 100644 index 000000000000..7351c4ac6086 --- /dev/null +++ b/.changeset/ten-onions-talk.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: provide `PageProps` and `LayoutProps` types diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 836b93221aab..3ebe9c9035ec 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -42,7 +42,7 @@ Pages can receive data from `load` functions via the `data` prop. ```svelte @@ -51,7 +51,9 @@ Pages can receive data from `load` functions via the `data` prop. ``` > [!LEGACY] -> In Svelte 4, you'd use `export let data` instead +> `PageProps` was added in 2.16.0. In earlier versions, you had to type the `data` property manually with `PageData` instead, see [$types](#\$types). +> +> In Svelte 4, you'd use `export let data` instead. > [!NOTE] SvelteKit uses `` elements to navigate between routes, rather than a framework-specific `` component. @@ -212,7 +214,7 @@ We can create a layout that only applies to pages below `/settings` (while inher ```svelte @@ -227,6 +229,9 @@ We can create a layout that only applies to pages below `/settings` (while inher {@render children()} ``` +> [!LEGACY] +> `LayoutProps` was added in 2.16.0. In earlier versions, you had to [type the properties manually instead](#\$types). + You can see how `data` is populated by looking at the `+layout.js` example in the next section just below. By default, each layout inherits the layout above it. Sometimes that isn't what you want - in this case, [advanced layouts](advanced-routing#Advanced-layouts) can help you. @@ -255,7 +260,7 @@ Data returned from a layout's `load` function is also available to all its child ```svelte ``` +> [!NOTE] +> The `PageProps` and `LayoutProps` types, added in 2.16.0, are a shortcut for typing the `data` prop as `PageData` or `LayoutData`, as well as other props, such as `form` for pages, or `children` for layouts. In earlier versions, you had to type these properties manually. For example, for a page: +> +> ```js +> /// file: +page.svelte +> /** @type {{ data: import('./$types').PageData, form: import('./$types').ActionData }} */ +> let { data, form } = $props(); +> ``` +> +> Or, for a layout: +> +> ```js +> /// file: +layout.svelte +> /** @type {{ data: import('./$types').LayoutData, children: Snippet }} */ +> let { data, children } = $props(); +> ``` + In turn, annotating the `load` function with `PageLoad`, `PageServerLoad`, `LayoutLoad` or `LayoutServerLoad` (for `+page.js`, `+page.server.js`, `+layout.js` and `+layout.server.js` respectively) ensures that `params` and the return value are correctly typed. If you're using VS Code or any IDE that supports the language server protocol and TypeScript plugins then you can omit these types _entirely_! Svelte's IDE tooling will insert the correct types for you, so you'll get type checking without writing them yourself. It also works with our command line tool `svelte-check`. diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 269d9078dd14..933d38563875 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -24,7 +24,7 @@ export function load({ params }) { ```svelte @@ -33,7 +33,14 @@ export function load({ params }) { ``` > [!LEGACY] -> In Svelte 4, you'd use `export let data` instead +> Before version 2.16.0, the props of a page and layout had to be typed individually: +> ```js +> /// file: +page.svelte +> /** @type {{ data: import('./$types').PageData }} */ +> let { data } = $props(); +> ``` +> +> In Svelte 4, you'd use `export let data` instead. Thanks to the generated `$types` module, we get full type safety. @@ -88,7 +95,7 @@ export async function load() { ```svelte @@ -111,6 +118,14 @@ export async function load() { ``` +> [!LEGACY] +> `LayoutProps` was added in 2.16.0. In earlier versions, properties had to be typed individually: +> ```js +> /// file: +layout.svelte +> /** @type {{ data: import('./$types').LayoutData, children: Snippet }} */ +> let { data, children } = $props(); +> ``` + Data returned from layout `load` functions is available to child `+layout.svelte` components and the `+page.svelte` component as well as the layout that it 'belongs' to. ```svelte @@ -118,7 +133,7 @@ Data returned from layout `load` functions is available to child `+layout.svelte @@ -511,7 +526,7 @@ This is useful for creating skeleton loading states, for example: ```svelte @@ -652,7 +667,7 @@ export async function load({ fetch, depends }) { @@ -152,7 +152,14 @@ export const actions = { ``` > [!LEGACY] -> In Svelte 4, you'd use `export let data` and `export let form` instead to declare properties +> `PageProps` was added in 2.16.0. In earlier versions, you had to type the `data` and `form` properties individually: +> ```js +> /// file: +page.svelte +> /** @type {{ data: import('./$types').PageData, form: import('./$types').ActionData }} */ +> let { data, form } = $props(); +> ``` +> +> In Svelte 4, you'd use `export let data` and `export let form` instead to declare properties. ### Validation errors @@ -339,7 +346,7 @@ The easiest way to progressively enhance a form is to add the `use:enhance` acti @@ -390,7 +397,7 @@ If you return a callback, you may need to reproduce part of the default `use:enh @@ -427,7 +434,7 @@ We can also implement progressive enhancement ourselves, without `use:enhance`, import { invalidateAll, goto } from '$app/navigation'; import { applyAction, deserialize } from '$app/forms'; - /** @type {{ form: import('./$types').ActionData }} */ + /** @type {import('./$types').PageProps} */ let { form } = $props(); /** @param {SubmitEvent & { currentTarget: EventTarget & HTMLFormElement}} event */ diff --git a/documentation/docs/20-core-concepts/50-state-management.md b/documentation/docs/20-core-concepts/50-state-management.md index 9c0ab1b1764a..0d56c8cc66e1 100644 --- a/documentation/docs/20-core-concepts/50-state-management.md +++ b/documentation/docs/20-core-concepts/50-state-management.md @@ -89,7 +89,7 @@ You might wonder how we're able to use `page.data` and other [app state]($app-st diff --git a/documentation/docs/98-reference/54-types.md b/documentation/docs/98-reference/54-types.md index 2b24ed69034c..eb76c2fa7ea3 100644 --- a/documentation/docs/98-reference/54-types.md +++ b/documentation/docs/98-reference/54-types.md @@ -84,6 +84,37 @@ export async function load({ params, fetch }) { } ``` +The return types of the load functions are then available through the `$types` module as `PageData` and `LayoutData` respectively, while the union of the return values of all `Actions` is available as `ActionData`. Starting with version 2.16.0, two additional helper types are provided. `PageProps` defines `data: PageData`, as well as `form: ActionData`, when there are actions defined. `LayoutProps` defines `data: LayoutData`, as well as `children: Snippet`: + +```svelte + + +``` + +> [!LEGACY] +> Before 2.16.0: +> ```svelte +> +> +> ``` +> +> Using Svelte 4: +> ```svelte +> +> +> ``` + > [!NOTE] For this to work, your own `tsconfig.json` or `jsconfig.json` should extend from the generated `.svelte-kit/tsconfig.json` (where `.svelte-kit` is your [`outDir`](configuration#outDir)): > > `{ "extends": "./.svelte-kit/tsconfig.json" }` diff --git a/packages/kit/src/core/sync/write_types/index.js b/packages/kit/src/core/sync/write_types/index.js index e57b00183e6f..308d566606f8 100644 --- a/packages/kit/src/core/sync/write_types/index.js +++ b/packages/kit/src/core/sync/write_types/index.js @@ -270,6 +270,12 @@ function update_types(config, routes, route, to_delete = new Set()) { 'export type Actions | void = Record | void> = Kit.Actions' ); } + + if (route.leaf.server) { + exports.push('export type PageProps = { data: PageData; form: ActionData }'); + } else { + exports.push('export type PageProps = { data: PageData }'); + } } if (route.layout) { @@ -333,6 +339,10 @@ function update_types(config, routes, route, to_delete = new Set()) { if (proxies.server?.modified) to_delete.delete(proxies.server.file_name); if (proxies.universal?.modified) to_delete.delete(proxies.universal.file_name); + + exports.push( + 'export type LayoutProps = { data: LayoutData; children: import("svelte").Snippet }' + ); } if (route.endpoint) { From e2a4538c48295cde06f64fb8c7f0b333fbf95496 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Thu, 16 Jan 2025 00:45:35 +0900 Subject: [PATCH 0882/1135] fix: use arrow function types over bound functions (#12955) Using class method function types causes SvelteKit users to get TypeScript ESLint errors if they're using the [@typescript-eslint/unbound-method][1] rule (included by default in the `recommended-type-checked` config). [1]: https://typescript-eslint.io/rules/unbound-method/ The following types in `public.d.ts` are still using non-arrow functions, since - These functions are for user inputs, which might rely on these functions being bound, and so it might be a breaking change to change these types: - [`Emulator['platform']`][1] - functions in `KitConfig` - Class methods that rely on `this`: - [`Server`][2] [1]: https://github.com/sveltejs/kit/blob/b25f2d052bbf22e832ac57cbf9e12c48ac922f96/packages/kit/src/exports/public.d.ts#L272-L276 [2]: https://github.com/sveltejs/kit/blob/b25f2d052bbf22e832ac57cbf9e12c48ac922f96/packages/kit/src/exports/public.d.ts#L1174-L1178 fixes #12622 --- .changeset/wet-dancers-kneel.md | 5 ++ packages/kit/src/exports/public.d.ts | 86 +++++++++++------------ packages/kit/src/runtime/server/cookie.js | 4 +- packages/kit/types/index.d.ts | 86 +++++++++++------------ 4 files changed, 93 insertions(+), 88 deletions(-) create mode 100644 .changeset/wet-dancers-kneel.md diff --git a/.changeset/wet-dancers-kneel.md b/.changeset/wet-dancers-kneel.md new file mode 100644 index 000000000000..2c3a34603489 --- /dev/null +++ b/.changeset/wet-dancers-kneel.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: use arrow function types over bound funcs diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 2ee7e9bfe1de..ea205907189a 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -34,7 +34,7 @@ export interface Adapter { * This function is called after SvelteKit has built your app. * @param builder An object provided by SvelteKit that contains methods for adapting the app */ - adapt(builder: Builder): MaybePromise; + adapt: (builder: Builder) => MaybePromise; /** * Checks called during dev and build to determine whether specific features will work in production with this adapter */ @@ -49,7 +49,7 @@ export interface Adapter { * Creates an `Emulator`, which allows the adapter to influence the environment * during dev, build and prerendering */ - emulate?(): MaybePromise; + emulate?: () => MaybePromise; } export type LoadProperties | void> = input extends void @@ -94,9 +94,9 @@ export interface Builder { /** Print messages to the console. `log.info` and `log.minor` are silent unless Vite's `logLevel` is `info`. */ log: Logger; /** Remove `dir` and all its contents. */ - rimraf(dir: string): void; + rimraf: (dir: string) => void; /** Create `dir` and any required parent directories. */ - mkdirp(dir: string): void; + mkdirp: (dir: string) => void; /** The fully resolved `svelte.config.js`. */ config: ValidatedConfig; @@ -111,59 +111,59 @@ export interface Builder { * @param fn A function that groups a set of routes into an entry point * @deprecated Use `builder.routes` instead */ - createEntries(fn: (route: RouteDefinition) => AdapterEntry): Promise; + createEntries: (fn: (route: RouteDefinition) => AdapterEntry) => Promise; /** * Find all the assets imported by server files belonging to `routes` */ - findServerAssets(routes: RouteDefinition[]): string[]; + findServerAssets: (routes: RouteDefinition[]) => string[]; /** * Generate a fallback page for a static webserver to use when no route is matched. Useful for single-page apps. */ - generateFallback(dest: string): Promise; + generateFallback: (dest: string) => Promise; /** * Generate a module exposing build-time environment variables as `$env/dynamic/public`. */ - generateEnvModule(): void; + generateEnvModule: () => void; /** * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/@sveltejs-kit#Server) with. * @param opts a relative path to the base directory of the app and optionally in which format (esm or cjs) the manifest should be generated */ - generateManifest(opts: { relativePath: string; routes?: RouteDefinition[] }): string; + generateManifest: (opts: { relativePath: string; routes?: RouteDefinition[] }) => string; /** * Resolve a path to the `name` directory inside `outDir`, e.g. `/path/to/.svelte-kit/my-adapter`. * @param name path to the file, relative to the build directory */ - getBuildDirectory(name: string): string; + getBuildDirectory: (name: string) => string; /** Get the fully resolved path to the directory containing client-side assets, including the contents of your `static` directory. */ - getClientDirectory(): string; + getClientDirectory: () => string; /** Get the fully resolved path to the directory containing server-side code. */ - getServerDirectory(): string; + getServerDirectory: () => string; /** Get the application path including any configured `base` path, e.g. `my-base-path/_app`. */ - getAppPath(): string; + getAppPath: () => string; /** * Write client assets to `dest`. * @param dest the destination folder * @returns an array of files written to `dest` */ - writeClient(dest: string): string[]; + writeClient: (dest: string) => string[]; /** * Write prerendered files to `dest`. * @param dest the destination folder * @returns an array of files written to `dest` */ - writePrerendered(dest: string): string[]; + writePrerendered: (dest: string) => string[]; /** * Write server-side code to `dest`. * @param dest the destination folder * @returns an array of files written to `dest` */ - writeServer(dest: string): string[]; + writeServer: (dest: string) => string[]; /** * Copy a file or directory. * @param from the source file or directory @@ -172,20 +172,20 @@ export interface Builder { * @param opts.replace a map of strings to replace * @returns an array of files that were copied */ - copy( + copy: ( from: string, to: string, opts?: { filter?(basename: string): boolean; replace?: Record; } - ): string[]; + ) => string[]; /** * Compress files in `directory` with gzip and brotli, where appropriate. Generates `.gz` and `.br` files alongside the originals. * @param {string} directory The directory containing the files to be compressed */ - compress(directory: string): Promise; + compress: (directory: string) => Promise; } export interface Config { @@ -215,13 +215,13 @@ export interface Cookies { * @param name the name of the cookie * @param opts the options, passed directly to `cookie.parse`. See documentation [here](https://github.com/jshttp/cookie#cookieparsestr-options) */ - get(name: string, opts?: import('cookie').CookieParseOptions): string | undefined; + get: (name: string, opts?: import('cookie').CookieParseOptions) => string | undefined; /** * Gets all cookies that were previously set with `cookies.set`, or from the request headers. * @param opts the options, passed directly to `cookie.parse`. See documentation [here](https://github.com/jshttp/cookie#cookieparsestr-options) */ - getAll(opts?: import('cookie').CookieParseOptions): Array<{ name: string; value: string }>; + getAll: (opts?: import('cookie').CookieParseOptions) => Array<{ name: string; value: string }>; /** * Sets a cookie. This will add a `set-cookie` header to the response, but also make the cookie available via `cookies.get` or `cookies.getAll` during the current request. @@ -233,11 +233,11 @@ export interface Cookies { * @param value the cookie value * @param opts the options, passed directly to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ - set( + set: ( name: string, value: string, opts: import('cookie').CookieSerializeOptions & { path: string } - ): void; + ) => void; /** * Deletes a cookie by setting its value to an empty string and setting the expiry date in the past. @@ -246,7 +246,7 @@ export interface Cookies { * @param name the name of the cookie * @param opts the options, passed directly to `cookie.serialize`. The `path` must match the path of the cookie you want to delete. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ - delete(name: string, opts: import('cookie').CookieSerializeOptions & { path: string }): void; + delete: (name: string, opts: import('cookie').CookieSerializeOptions & { path: string }) => void; /** * Serialize a cookie name-value pair into a `Set-Cookie` header string, but don't apply it to the response. @@ -259,11 +259,11 @@ export interface Cookies { * @param value the cookie value * @param opts the options, passed directly to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ - serialize( + serialize: ( name: string, value: string, opts: import('cookie').CookieSerializeOptions & { path: string } - ): string; + ) => string; } /** @@ -738,7 +738,7 @@ export interface KitConfig { */ export type Handle = (input: { event: RequestEvent; - resolve(event: RequestEvent, opts?: ResolveOptions): MaybePromise; + resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise; }) => MaybePromise; /** @@ -893,14 +893,14 @@ export interface LoadEvent< * * `setHeaders` has no effect when a `load` function runs in the browser. */ - setHeaders(headers: Record): void; + setHeaders: (headers: Record) => void; /** * `await parent()` returns data from parent `+layout.js` `load` functions. * Implicitly, a missing `+layout.js` is treated as a `({ data }) => data` function, meaning that it will return and forward data from parent `+layout.server.js` files. * * Be careful not to introduce accidental waterfalls when using `await parent()`. If for example you only want to merge parent data into the returned output, call it _after_ fetching your other data. */ - parent(): Promise; + parent: () => Promise; /** * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * @@ -938,7 +938,7 @@ export interface LoadEvent< * * ``` */ - depends(...deps: Array<`${string}:${string}`>): void; + depends: (...deps: Array<`${string}:${string}`>) => void; /** * Use this function to opt out of dependency tracking for everything that is synchronously called within the callback. Example: * @@ -952,7 +952,7 @@ export interface LoadEvent< * } * ``` */ - untrack(fn: () => T): T; + untrack: (fn: () => T) => T; } export interface NavigationEvent< @@ -1047,7 +1047,7 @@ export interface BeforeNavigate extends Navigation { /** * Call this to prevent the navigation from starting. */ - cancel(): void; + cancel: () => void; } /** @@ -1161,7 +1161,7 @@ export interface RequestEvent< /** * The client's IP address, set by the adapter. */ - getClientAddress(): string; + getClientAddress: () => string; /** * Contains custom data that was added to the request within the [`server handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). */ @@ -1209,7 +1209,7 @@ export interface RequestEvent< * * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/@sveltejs-kit#Cookies) API instead. */ - setHeaders(headers: Record): void; + setHeaders: (headers: Record) => void; /** * The requested URL. */ @@ -1242,20 +1242,20 @@ export interface ResolveOptions { * but they will always be split at sensible boundaries such as `%sveltekit.head%` or layout/page components. * @param input the html chunk and the info if this is the last chunk */ - transformPageChunk?(input: { html: string; done: boolean }): MaybePromise; + transformPageChunk?: (input: { html: string; done: boolean }) => MaybePromise; /** * Determines which headers should be included in serialized responses when a `load` function loads a resource with `fetch`. * By default, none will be included. * @param name header name * @param value header value */ - filterSerializedResponseHeaders?(name: string, value: string): boolean; + filterSerializedResponseHeaders?: (name: string, value: string) => boolean; /** * Determines what should be added to the `` tag to preload it. * By default, `js` and `css` files will be preloaded. * @param input the type of the file and its path */ - preload?(input: { type: 'font' | 'css' | 'js' | 'asset'; path: string }): boolean; + preload?: (input: { type: 'font' | 'css' | 'js' | 'asset'; path: string }) => boolean; } export interface RouteDefinition { @@ -1297,7 +1297,7 @@ export interface SSRManifest { client: NonNullable; nodes: SSRNodeLoader[]; routes: SSRRoute[]; - matchers(): Promise>; + matchers: () => Promise>; /** A `[file]: size` map of all assets imported by server code */ server_assets: Record; }; @@ -1324,7 +1324,7 @@ export interface ServerLoadEvent< * * Be careful not to introduce accidental waterfalls when using `await parent()`. If for example you only want to merge parent data into the returned output, call it _after_ fetching your other data. */ - parent(): Promise; + parent: () => Promise; /** * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * @@ -1362,7 +1362,7 @@ export interface ServerLoadEvent< * * ``` */ - depends(...deps: string[]): void; + depends: (...deps: string[]) => void; /** * Use this function to opt out of dependency tracking for everything that is synchronously called within the callback. Example: * @@ -1376,7 +1376,7 @@ export interface ServerLoadEvent< * } * ``` */ - untrack(fn: () => T): T; + untrack: (fn: () => T) => T; } /** @@ -1447,7 +1447,7 @@ export type SubmitFunction< formElement: HTMLFormElement; controller: AbortController; submitter: HTMLElement | null; - cancel(): void; + cancel: () => void; }) => MaybePromise< | void | ((opts: { @@ -1460,7 +1460,7 @@ export type SubmitFunction< * @param options Set `reset: false` if you don't want the `` values to be reset after a successful submission. * @param invalidateAll Set `invalidateAll: false` if you don't want the action to call `invalidateAll` after submission. */ - update(options?: { reset?: boolean; invalidateAll?: boolean }): Promise; + update: (options?: { reset?: boolean; invalidateAll?: boolean }) => Promise; }) => void) >; diff --git a/packages/kit/src/runtime/server/cookie.js b/packages/kit/src/runtime/server/cookie.js index f4442872fbeb..0dc74f5a613b 100644 --- a/packages/kit/src/runtime/server/cookie.js +++ b/packages/kit/src/runtime/server/cookie.js @@ -55,7 +55,7 @@ export function get_cookies(request, url, trailing_slash) { /** * @param {string} name - * @param {import('cookie').CookieParseOptions} opts + * @param {import('cookie').CookieParseOptions} [opts] */ get(name, opts) { const c = new_cookies[name]; @@ -91,7 +91,7 @@ export function get_cookies(request, url, trailing_slash) { }, /** - * @param {import('cookie').CookieParseOptions} opts + * @param {import('cookie').CookieParseOptions} [opts] */ getAll(opts) { const cookies = parse(header, { decode: opts?.decode }); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 52aeebc361e4..977f1f2e879c 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -16,7 +16,7 @@ declare module '@sveltejs/kit' { * This function is called after SvelteKit has built your app. * @param builder An object provided by SvelteKit that contains methods for adapting the app */ - adapt(builder: Builder): MaybePromise; + adapt: (builder: Builder) => MaybePromise; /** * Checks called during dev and build to determine whether specific features will work in production with this adapter */ @@ -31,7 +31,7 @@ declare module '@sveltejs/kit' { * Creates an `Emulator`, which allows the adapter to influence the environment * during dev, build and prerendering */ - emulate?(): MaybePromise; + emulate?: () => MaybePromise; } export type LoadProperties | void> = input extends void @@ -76,9 +76,9 @@ declare module '@sveltejs/kit' { /** Print messages to the console. `log.info` and `log.minor` are silent unless Vite's `logLevel` is `info`. */ log: Logger; /** Remove `dir` and all its contents. */ - rimraf(dir: string): void; + rimraf: (dir: string) => void; /** Create `dir` and any required parent directories. */ - mkdirp(dir: string): void; + mkdirp: (dir: string) => void; /** The fully resolved `svelte.config.js`. */ config: ValidatedConfig; @@ -93,59 +93,59 @@ declare module '@sveltejs/kit' { * @param fn A function that groups a set of routes into an entry point * @deprecated Use `builder.routes` instead */ - createEntries(fn: (route: RouteDefinition) => AdapterEntry): Promise; + createEntries: (fn: (route: RouteDefinition) => AdapterEntry) => Promise; /** * Find all the assets imported by server files belonging to `routes` */ - findServerAssets(routes: RouteDefinition[]): string[]; + findServerAssets: (routes: RouteDefinition[]) => string[]; /** * Generate a fallback page for a static webserver to use when no route is matched. Useful for single-page apps. */ - generateFallback(dest: string): Promise; + generateFallback: (dest: string) => Promise; /** * Generate a module exposing build-time environment variables as `$env/dynamic/public`. */ - generateEnvModule(): void; + generateEnvModule: () => void; /** * Generate a server-side manifest to initialise the SvelteKit [server](https://svelte.dev/docs/kit/@sveltejs-kit#Server) with. * @param opts a relative path to the base directory of the app and optionally in which format (esm or cjs) the manifest should be generated */ - generateManifest(opts: { relativePath: string; routes?: RouteDefinition[] }): string; + generateManifest: (opts: { relativePath: string; routes?: RouteDefinition[] }) => string; /** * Resolve a path to the `name` directory inside `outDir`, e.g. `/path/to/.svelte-kit/my-adapter`. * @param name path to the file, relative to the build directory */ - getBuildDirectory(name: string): string; + getBuildDirectory: (name: string) => string; /** Get the fully resolved path to the directory containing client-side assets, including the contents of your `static` directory. */ - getClientDirectory(): string; + getClientDirectory: () => string; /** Get the fully resolved path to the directory containing server-side code. */ - getServerDirectory(): string; + getServerDirectory: () => string; /** Get the application path including any configured `base` path, e.g. `my-base-path/_app`. */ - getAppPath(): string; + getAppPath: () => string; /** * Write client assets to `dest`. * @param dest the destination folder * @returns an array of files written to `dest` */ - writeClient(dest: string): string[]; + writeClient: (dest: string) => string[]; /** * Write prerendered files to `dest`. * @param dest the destination folder * @returns an array of files written to `dest` */ - writePrerendered(dest: string): string[]; + writePrerendered: (dest: string) => string[]; /** * Write server-side code to `dest`. * @param dest the destination folder * @returns an array of files written to `dest` */ - writeServer(dest: string): string[]; + writeServer: (dest: string) => string[]; /** * Copy a file or directory. * @param from the source file or directory @@ -154,20 +154,20 @@ declare module '@sveltejs/kit' { * @param opts.replace a map of strings to replace * @returns an array of files that were copied */ - copy( + copy: ( from: string, to: string, opts?: { filter?(basename: string): boolean; replace?: Record; } - ): string[]; + ) => string[]; /** * Compress files in `directory` with gzip and brotli, where appropriate. Generates `.gz` and `.br` files alongside the originals. * @param directory The directory containing the files to be compressed */ - compress(directory: string): Promise; + compress: (directory: string) => Promise; } export interface Config { @@ -197,13 +197,13 @@ declare module '@sveltejs/kit' { * @param name the name of the cookie * @param opts the options, passed directly to `cookie.parse`. See documentation [here](https://github.com/jshttp/cookie#cookieparsestr-options) */ - get(name: string, opts?: import('cookie').CookieParseOptions): string | undefined; + get: (name: string, opts?: import('cookie').CookieParseOptions) => string | undefined; /** * Gets all cookies that were previously set with `cookies.set`, or from the request headers. * @param opts the options, passed directly to `cookie.parse`. See documentation [here](https://github.com/jshttp/cookie#cookieparsestr-options) */ - getAll(opts?: import('cookie').CookieParseOptions): Array<{ name: string; value: string }>; + getAll: (opts?: import('cookie').CookieParseOptions) => Array<{ name: string; value: string }>; /** * Sets a cookie. This will add a `set-cookie` header to the response, but also make the cookie available via `cookies.get` or `cookies.getAll` during the current request. @@ -215,11 +215,11 @@ declare module '@sveltejs/kit' { * @param value the cookie value * @param opts the options, passed directly to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ - set( + set: ( name: string, value: string, opts: import('cookie').CookieSerializeOptions & { path: string } - ): void; + ) => void; /** * Deletes a cookie by setting its value to an empty string and setting the expiry date in the past. @@ -228,7 +228,7 @@ declare module '@sveltejs/kit' { * @param name the name of the cookie * @param opts the options, passed directly to `cookie.serialize`. The `path` must match the path of the cookie you want to delete. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ - delete(name: string, opts: import('cookie').CookieSerializeOptions & { path: string }): void; + delete: (name: string, opts: import('cookie').CookieSerializeOptions & { path: string }) => void; /** * Serialize a cookie name-value pair into a `Set-Cookie` header string, but don't apply it to the response. @@ -241,11 +241,11 @@ declare module '@sveltejs/kit' { * @param value the cookie value * @param opts the options, passed directly to `cookie.serialize`. See documentation [here](https://github.com/jshttp/cookie#cookieserializename-value-options) */ - serialize( + serialize: ( name: string, value: string, opts: import('cookie').CookieSerializeOptions & { path: string } - ): string; + ) => string; } /** @@ -720,7 +720,7 @@ declare module '@sveltejs/kit' { */ export type Handle = (input: { event: RequestEvent; - resolve(event: RequestEvent, opts?: ResolveOptions): MaybePromise; + resolve: (event: RequestEvent, opts?: ResolveOptions) => MaybePromise; }) => MaybePromise; /** @@ -875,14 +875,14 @@ declare module '@sveltejs/kit' { * * `setHeaders` has no effect when a `load` function runs in the browser. */ - setHeaders(headers: Record): void; + setHeaders: (headers: Record) => void; /** * `await parent()` returns data from parent `+layout.js` `load` functions. * Implicitly, a missing `+layout.js` is treated as a `({ data }) => data` function, meaning that it will return and forward data from parent `+layout.server.js` files. * * Be careful not to introduce accidental waterfalls when using `await parent()`. If for example you only want to merge parent data into the returned output, call it _after_ fetching your other data. */ - parent(): Promise; + parent: () => Promise; /** * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * @@ -920,7 +920,7 @@ declare module '@sveltejs/kit' { * * ``` */ - depends(...deps: Array<`${string}:${string}`>): void; + depends: (...deps: Array<`${string}:${string}`>) => void; /** * Use this function to opt out of dependency tracking for everything that is synchronously called within the callback. Example: * @@ -934,7 +934,7 @@ declare module '@sveltejs/kit' { * } * ``` */ - untrack(fn: () => T): T; + untrack: (fn: () => T) => T; } export interface NavigationEvent< @@ -1029,7 +1029,7 @@ declare module '@sveltejs/kit' { /** * Call this to prevent the navigation from starting. */ - cancel(): void; + cancel: () => void; } /** @@ -1143,7 +1143,7 @@ declare module '@sveltejs/kit' { /** * The client's IP address, set by the adapter. */ - getClientAddress(): string; + getClientAddress: () => string; /** * Contains custom data that was added to the request within the [`server handle hook`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle). */ @@ -1191,7 +1191,7 @@ declare module '@sveltejs/kit' { * * You cannot add a `set-cookie` header with `setHeaders` — use the [`cookies`](https://svelte.dev/docs/kit/@sveltejs-kit#Cookies) API instead. */ - setHeaders(headers: Record): void; + setHeaders: (headers: Record) => void; /** * The requested URL. */ @@ -1224,20 +1224,20 @@ declare module '@sveltejs/kit' { * but they will always be split at sensible boundaries such as `%sveltekit.head%` or layout/page components. * @param input the html chunk and the info if this is the last chunk */ - transformPageChunk?(input: { html: string; done: boolean }): MaybePromise; + transformPageChunk?: (input: { html: string; done: boolean }) => MaybePromise; /** * Determines which headers should be included in serialized responses when a `load` function loads a resource with `fetch`. * By default, none will be included. * @param name header name * @param value header value */ - filterSerializedResponseHeaders?(name: string, value: string): boolean; + filterSerializedResponseHeaders?: (name: string, value: string) => boolean; /** * Determines what should be added to the `` tag to preload it. * By default, `js` and `css` files will be preloaded. * @param input the type of the file and its path */ - preload?(input: { type: 'font' | 'css' | 'js' | 'asset'; path: string }): boolean; + preload?: (input: { type: 'font' | 'css' | 'js' | 'asset'; path: string }) => boolean; } export interface RouteDefinition { @@ -1279,7 +1279,7 @@ declare module '@sveltejs/kit' { client: NonNullable; nodes: SSRNodeLoader[]; routes: SSRRoute[]; - matchers(): Promise>; + matchers: () => Promise>; /** A `[file]: size` map of all assets imported by server code */ server_assets: Record; }; @@ -1306,7 +1306,7 @@ declare module '@sveltejs/kit' { * * Be careful not to introduce accidental waterfalls when using `await parent()`. If for example you only want to merge parent data into the returned output, call it _after_ fetching your other data. */ - parent(): Promise; + parent: () => Promise; /** * This function declares that the `load` function has a _dependency_ on one or more URLs or custom identifiers, which can subsequently be used with [`invalidate()`](https://svelte.dev/docs/kit/$app-navigation#invalidate) to cause `load` to rerun. * @@ -1344,7 +1344,7 @@ declare module '@sveltejs/kit' { * * ``` */ - depends(...deps: string[]): void; + depends: (...deps: string[]) => void; /** * Use this function to opt out of dependency tracking for everything that is synchronously called within the callback. Example: * @@ -1358,7 +1358,7 @@ declare module '@sveltejs/kit' { * } * ``` */ - untrack(fn: () => T): T; + untrack: (fn: () => T) => T; } /** @@ -1429,7 +1429,7 @@ declare module '@sveltejs/kit' { formElement: HTMLFormElement; controller: AbortController; submitter: HTMLElement | null; - cancel(): void; + cancel: () => void; }) => MaybePromise< | void | ((opts: { @@ -1442,7 +1442,7 @@ declare module '@sveltejs/kit' { * @param options Set `reset: false` if you don't want the `` values to be reset after a successful submission. * @param invalidateAll Set `invalidateAll: false` if you don't want the action to call `invalidateAll` after submission. */ - update(options?: { reset?: boolean; invalidateAll?: boolean }): Promise; + update: (options?: { reset?: boolean; invalidateAll?: boolean }) => Promise; }) => void) >; From 9dc5c0e3e01a3c07010e9996688169be68e1dde8 Mon Sep 17 00:00:00 2001 From: Torsten Dittmann Date: Wed, 15 Jan 2025 17:04:03 +0100 Subject: [PATCH 0883/1135] fix: service worker base path in dev mode (#12577) Fixes #12039 --- .changeset/nice-geese-serve.md | 5 +++++ packages/kit/src/exports/vite/dev/index.js | 2 +- packages/kit/test/apps/options-2/test/test.js | 15 ++++++++++++++- 3 files changed, 20 insertions(+), 2 deletions(-) create mode 100644 .changeset/nice-geese-serve.md diff --git a/.changeset/nice-geese-serve.md b/.changeset/nice-geese-serve.md new file mode 100644 index 000000000000..406180bebe27 --- /dev/null +++ b/.changeset/nice-geese-serve.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: service worker base path in dev mode diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 3935daf28565..bca3f84160cb 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -462,7 +462,7 @@ export async function dev(vite, vite_config, svelte_config) { res.writeHead(200, { 'content-type': 'application/javascript' }); - res.end(`import '${to_fs(resolved)}';`); + res.end(`import '${svelte_config.kit.paths.base}${to_fs(resolved)}';`); } else { res.writeHead(404); res.end('not found'); diff --git a/packages/kit/test/apps/options-2/test/test.js b/packages/kit/test/apps/options-2/test/test.js index 1c5c0ffd525a..ba5f10003284 100644 --- a/packages/kit/test/apps/options-2/test/test.js +++ b/packages/kit/test/apps/options-2/test/test.js @@ -1,4 +1,6 @@ +import path from 'node:path'; import process from 'node:process'; +import { fileURLToPath } from 'node:url'; import { expect } from '@playwright/test'; import { test } from '../../../utils.js'; @@ -73,7 +75,18 @@ test.describe('trailing slash', () => { }); test.describe('Service worker', () => { - if (process.env.DEV) return; + if (process.env.DEV) { + test('import proxy /basepath/service-worker.js', async ({ request }) => { + const __dirname = path.dirname(fileURLToPath(import.meta.url)); + const response = await request.get('/basepath/service-worker.js'); + const content = await response.text(); + expect(content).toEqual( + `import '${path.join('/basepath', '/@fs', __dirname, '../src/service-worker.js')}';` + ); + }); + + return; + } test('build /basepath/service-worker.js', async ({ baseURL, request }) => { const response = await request.get('/basepath/service-worker.js'); From 1c77e283896058084c1cb5752d9ec207987a585e Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 16 Jan 2025 00:46:17 +0800 Subject: [PATCH 0884/1135] fix: correctly detect internal links when hash router is used (#13296) fixes #13287 This PR fixes the client-side external link evaluation so that when using the hash router, accessing /index.html is considered an internal link. This prevents the page from reloading infinitely because the router incorrectly considered /index.html an external link. There's also a slight doc change. Instead of suggesting all links start with /#/, suggesting links start with # allows the router to preserve the /index.html pathname. For example, links to /about should be #/about instead of /#/about so that it navigates to /index.html#/about. --- .changeset/green-flowers-heal.md | 5 +++++ packages/kit/src/exports/public.d.ts | 2 +- packages/kit/src/runtime/client/utils.js | 2 +- packages/kit/types/index.d.ts | 2 +- 4 files changed, 8 insertions(+), 3 deletions(-) create mode 100644 .changeset/green-flowers-heal.md diff --git a/.changeset/green-flowers-heal.md b/.changeset/green-flowers-heal.md new file mode 100644 index 000000000000..a348a094e1d2 --- /dev/null +++ b/.changeset/green-flowers-heal.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: prevent infinite reload when using the hash router and previewing `/index.html` diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index ea205907189a..81d0de63f0ac 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -653,7 +653,7 @@ export interface KitConfig { * What type of client-side router to use. * - `'pathname'` is the default and means the current URL pathname determines the route * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. - * It comes with some caveats: you can't use server-side rendering (or indeed any server logic), and you have to make sure that the links in your app all start with /#/, or they won't work. Beyond that, everything works exactly like a normal SvelteKit app. + * It comes with some caveats: you can't use server-side rendering (or indeed any server logic), and you have to make sure that the links in your app all start with #/, or they won't work. Beyond that, everything works exactly like a normal SvelteKit app. * * @default "pathname" * @since 2.14.0 diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 2a0c35f344e9..28a06d862489 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -311,7 +311,7 @@ export function is_external_url(url, base, hash_routing) { } if (hash_routing) { - if (url.pathname === base + '/') { + if (url.pathname === base + '/' || url.pathname === base + '/index.html') { return false; } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 977f1f2e879c..b80a53f668db 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -635,7 +635,7 @@ declare module '@sveltejs/kit' { * What type of client-side router to use. * - `'pathname'` is the default and means the current URL pathname determines the route * - `'hash'` means the route is determined by `location.hash`. In this case, SSR and prerendering are disabled. This is only recommended if `pathname` is not an option, for example because you don't control the webserver where your app is deployed. - * It comes with some caveats: you can't use server-side rendering (or indeed any server logic), and you have to make sure that the links in your app all start with /#/, or they won't work. Beyond that, everything works exactly like a normal SvelteKit app. + * It comes with some caveats: you can't use server-side rendering (or indeed any server logic), and you have to make sure that the links in your app all start with #/, or they won't work. Beyond that, everything works exactly like a normal SvelteKit app. * * @default "pathname" * @since 2.14.0 From 9fcd1e7574197fa6e7ac000a030378d877cb8837 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gautier=20Ben=20A=C3=AFm?= <48261497+GauBen@users.noreply.github.com> Date: Wed, 15 Jan 2025 18:00:38 +0100 Subject: [PATCH 0885/1135] docs: add most common status codes to redirect() doc (#13301) --- .changeset/quick-crabs-camp.md | 5 +++++ packages/kit/src/exports/index.js | 8 ++++++++ packages/kit/types/index.d.ts | 8 ++++++++ 3 files changed, 21 insertions(+) create mode 100644 .changeset/quick-crabs-camp.md diff --git a/.changeset/quick-crabs-camp.md b/.changeset/quick-crabs-camp.md new file mode 100644 index 000000000000..b5f2404df29d --- /dev/null +++ b/.changeset/quick-crabs-camp.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +chore: add most common status codes to `redirect()` JS documentation diff --git a/packages/kit/src/exports/index.js b/packages/kit/src/exports/index.js index 5454a2e15e31..3b69f24de40e 100644 --- a/packages/kit/src/exports/index.js +++ b/packages/kit/src/exports/index.js @@ -84,6 +84,14 @@ export function isHttpError(e, status) { /** * Redirect a request. When called during request handling, SvelteKit will return a redirect response. * Make sure you're not catching the thrown redirect, which would prevent SvelteKit from handling it. + * + * Most common status codes: + * * `303 See Other`: redirect as a GET request (often used after a form POST request) + * * `307 Temporary Redirect`: redirect will keep the request method + * * `308 Permanent Redirect`: redirect will keep the request method, SEO will be transferred to the new page + * + * [See all redirect status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages) + * * @param {300 | 301 | 302 | 303 | 304 | 305 | 306 | 307 | 308 | ({} & number)} status The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages). Must be in the range 300-308. * @param {string | URL} location The location to redirect to. * @throws {Redirect} This error instructs SvelteKit to redirect to the specified location. diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index b80a53f668db..88e9c3e8936e 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1901,6 +1901,14 @@ declare module '@sveltejs/kit' { /** * Redirect a request. When called during request handling, SvelteKit will return a redirect response. * Make sure you're not catching the thrown redirect, which would prevent SvelteKit from handling it. + * + * Most common status codes: + * * `303 See Other`: redirect as a GET request (often used after a form POST request) + * * `307 Temporary Redirect`: redirect will keep the request method + * * `308 Permanent Redirect`: redirect will keep the request method, SEO will be transferred to the new page + * + * [See all redirect status codes](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages) + * * @param status The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages). Must be in the range 300-308. * @param location The location to redirect to. * @throws {Redirect} This error instructs SvelteKit to redirect to the specified location. From 00e1a7621de554054d068e4525a9e505d1c2e588 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 16 Jan 2025 01:01:25 +0800 Subject: [PATCH 0886/1135] chore: error during development when using `use:enhance` with `+server` (#13197) Related to the hard-to-debug error talked about in #10855 --- .changeset/nine-parrots-smoke.md | 5 +++++ packages/kit/src/runtime/server/endpoint.js | 5 +++++ 2 files changed, 10 insertions(+) create mode 100644 .changeset/nine-parrots-smoke.md diff --git a/.changeset/nine-parrots-smoke.md b/.changeset/nine-parrots-smoke.md new file mode 100644 index 000000000000..db364d3136f4 --- /dev/null +++ b/.changeset/nine-parrots-smoke.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +chore: error during development when using `use:enhance` with `+server` diff --git a/packages/kit/src/runtime/server/endpoint.js b/packages/kit/src/runtime/server/endpoint.js index 55bcd87807b9..3d1dcd48fc26 100644 --- a/packages/kit/src/runtime/server/endpoint.js +++ b/packages/kit/src/runtime/server/endpoint.js @@ -1,3 +1,4 @@ +import { DEV } from 'esm-env'; import { ENDPOINT_METHODS, PAGE_METHODS } from '../../constants.js'; import { negotiate } from '../../utils/http.js'; import { Redirect } from '../control.js'; @@ -10,6 +11,10 @@ import { method_not_allowed } from './utils.js'; * @returns {Promise} */ export async function render_endpoint(event, mod, state) { + if (DEV && event.request.headers.get('x-sveltekit-action') === 'true') { + throw new Error('use:enhance should only be used with SvelteKit form actions'); + } + const method = /** @type {import('types').HttpMethod} */ (event.request.method); let handler = mod[method] || mod.fallback; From f451f6c4a3dbbc73dc86667c6ff89ab2f46ca9d2 Mon Sep 17 00:00:00 2001 From: Lukas Stracke Date: Wed, 15 Jan 2025 18:11:59 +0100 Subject: [PATCH 0887/1135] fix: use `window.fetch` for server load fetch requests (#13315) This PR ensures that this server-load data request is also patchable by basically using the same mechanism introduced in #10009 --- .changeset/funny-moles-scream.md | 5 +++++ packages/kit/src/runtime/client/client.js | 12 ++++-------- packages/kit/src/runtime/client/fetcher.js | 4 ++-- .../patching-server-load-ii/+page.server.js | 3 +++ .../patching-server-load-ii/+page.svelte | 10 ++++++++++ .../patching-server-load/+page.server.js | 3 +++ .../patching-server-load/+page.svelte | 18 ++++++++++++++++++ .../kit/test/apps/basics/test/client.test.js | 17 +++++++++++++++++ 8 files changed, 62 insertions(+), 10 deletions(-) create mode 100644 .changeset/funny-moles-scream.md create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.svelte diff --git a/.changeset/funny-moles-scream.md b/.changeset/funny-moles-scream.md new file mode 100644 index 000000000000..0a24a721dde5 --- /dev/null +++ b/.changeset/funny-moles-scream.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: use current `window.fetch` for server load fetch requests diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index f06e45d2d6e4..c91bb818355b 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -8,13 +8,7 @@ import { make_trackable, normalize_path } from '../../utils/url.js'; -import { - initial_fetch, - lock_fetch, - native_fetch, - subsequent_fetch, - unlock_fetch -} from './fetcher.js'; +import { dev_fetch, initial_fetch, lock_fetch, subsequent_fetch, unlock_fetch } from './fetcher.js'; import { parse } from './parse.js'; import * as storage from './session-storage.js'; import { @@ -2548,7 +2542,9 @@ async function load_data(url, invalid) { } data_url.searchParams.append(INVALIDATED_PARAM, invalid.map((i) => (i ? '1' : '0')).join('')); - const res = await native_fetch(data_url.href); + // use window.fetch directly to allow using a 3rd party-patched fetch implementation + const fetcher = DEV ? dev_fetch : window.fetch; + const res = await fetcher(data_url.href, {}); if (!res.ok) { // error message is a JSON-stringified string which devalue can't handle at the top level diff --git a/packages/kit/src/runtime/client/fetcher.js b/packages/kit/src/runtime/client/fetcher.js index 6cb8ef1b7724..c19c9fc2d837 100644 --- a/packages/kit/src/runtime/client/fetcher.js +++ b/packages/kit/src/runtime/client/fetcher.js @@ -5,7 +5,7 @@ import { b64_decode } from '../utils.js'; let loading = 0; /** @type {typeof fetch} */ -export const native_fetch = BROWSER ? window.fetch : /** @type {any} */ (() => {}); +const native_fetch = BROWSER ? window.fetch : /** @type {any} */ (() => {}); export function lock_fetch() { loading += 1; @@ -137,7 +137,7 @@ export function subsequent_fetch(resource, resolved, opts) { * @param {RequestInfo | URL} resource * @param {RequestInit & Record | undefined} opts */ -function dev_fetch(resource, opts) { +export function dev_fetch(resource, opts) { const patched_opts = { ...opts }; // This assigns the __sveltekit_fetch__ flag and makes it non-enumerable Object.defineProperty(patched_opts, '__sveltekit_fetch__', { diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.server.js b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.server.js new file mode 100644 index 000000000000..2c62de9478c9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.server.js @@ -0,0 +1,3 @@ +export async function load() { + return { msg: 'server load data' }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.svelte new file mode 100644 index 000000000000..5bd930e96a4f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.svelte @@ -0,0 +1,10 @@ + + +

+ This page makes a fetch request to the server to get the data from the server load function when + users navigate to it. +

+ +

{data.msg}

diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.server.js b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.server.js new file mode 100644 index 000000000000..2c62de9478c9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.server.js @@ -0,0 +1,3 @@ +export async function load() { + return { msg: 'server load data' }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.svelte new file mode 100644 index 000000000000..69c974f193a8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.svelte @@ -0,0 +1,18 @@ + + +

+ The sole purpose of this page is to apply a `window.fetch` patch before navigating to the next + page. Click the link below to navigate to the next page with a server load function. +

+ +
Go To Page with Server Load diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 6bdad95dc0fa..769de7704cb2 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -252,6 +252,23 @@ test.describe('Load', () => { expect(logs).toContain('Called a patched window.fetch'); }); + test('permits 3rd party patching of server load fetch requests', async ({ page }) => { + const logs = []; + page.on('console', (msg) => { + if (msg.type() === 'log') { + logs.push(msg.text()); + } + }); + + await page.goto('/load/window-fetch/patching-server-load'); + + await page.getByText('Go To Page with Server Load').click(); + + expect(await page.textContent('h1')).toBe('server load data'); + + expect(logs).toContain('Called a patched window.fetch for server load request'); + }); + test('does not repeat fetch on hydration when using Request object', async ({ page }) => { const requests = []; page.on('request', (request) => { From a91ba1f326b6e244503de9a010771d942b461dad Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 16 Jan 2025 16:52:47 +0800 Subject: [PATCH 0888/1135] fix: decode URL before navigating when hash router is enabled (#13321) fixes #13318 This PR decodes the URL when the hash router is enabled and the user enters the URL through the browser address bar (during app initialisation and the hashchange event). We need to do this because Safari seems to encode any extra hashes in the URL (only when accessed through the file protocol?). So, entering /#/#about in the address bar becomes /#/%23about which the client router incorrectly thinks is a route instead of just an ID. --- .changeset/wild-coins-live.md | 5 +++++ packages/kit/src/runtime/client/client.js | 4 ++-- packages/kit/test/apps/hash-based-routing/test/test.js | 8 ++++++++ 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 .changeset/wild-coins-live.md diff --git a/.changeset/wild-coins-live.md b/.changeset/wild-coins-live.md new file mode 100644 index 000000000000..b6b989ba8425 --- /dev/null +++ b/.changeset/wild-coins-live.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly navigate when hash router is enabled and the browser encodes extra hashes diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index c91bb818355b..56c3855aa436 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -306,7 +306,7 @@ export async function start(_app, _target, hydrate) { if (hydrate) { await _hydrate(target, hydrate); } else { - goto(location.href, { replaceState: true }); + goto(app.hash ? decodeURIComponent(location.href) : location.href, { replaceState: true }); } _start_router(); @@ -2395,7 +2395,7 @@ function _start_router() { // (surprisingly!) mutates `current.url`, allowing us to // detect it and trigger a navigation if (current.url.hash === location.hash) { - navigate({ type: 'goto', url: current.url }); + navigate({ type: 'goto', url: new URL(decodeURIComponent(current.url.href)) }); } } }); diff --git a/packages/kit/test/apps/hash-based-routing/test/test.js b/packages/kit/test/apps/hash-based-routing/test/test.js index ae379c55f601..6743639fec2c 100644 --- a/packages/kit/test/apps/hash-based-routing/test/test.js +++ b/packages/kit/test/apps/hash-based-routing/test/test.js @@ -55,6 +55,14 @@ test.describe('hash based navigation', () => { await expect(page.locator('p')).toHaveText('a'); }); + test('navigation works with URL encoded characters', async ({ page }) => { + await page.goto('/#/%23test'); + await expect(page.locator('p')).toHaveText('home'); + // hashchange event + await page.goto('/#/a%23test'); + await expect(page.locator('p')).toHaveText('a'); + }); + test('route id and params are correct', async ({ page }) => { await page.goto('/#/b/123'); await expect(page.locator('p[data-data]')).toHaveText('{"slug":"123"} /b/[slug] /#/b/123'); From 04958cca5905aaeeff367c9e4a5ce6e90fc64779 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Orkisz?= <40291807+xxmichas@users.noreply.github.com> Date: Thu, 16 Jan 2025 10:22:20 +0100 Subject: [PATCH 0889/1135] feat: Add ability to invalidate a custom identifier on goto() (#13256) closes #10659 --------- Co-authored-by: Tee Ming Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/nasty-spoons-kick.md | 5 ++ packages/kit/src/runtime/client/client.js | 18 ++++- .../load/invalidation/depends-goto/+layout.js | 7 ++ .../load/invalidation/depends-goto/+page.js | 8 ++ .../invalidation/depends-goto/+page.server.js | 7 ++ .../invalidation/depends-goto/+page.svelte | 49 ++++++++++++ .../kit/test/apps/basics/test/client.test.js | 77 +++++++++++++++++++ packages/kit/types/index.d.ts | 1 + 8 files changed, 169 insertions(+), 3 deletions(-) create mode 100644 .changeset/nasty-spoons-kick.md create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.svelte diff --git a/.changeset/nasty-spoons-kick.md b/.changeset/nasty-spoons-kick.md new file mode 100644 index 000000000000..1ffb0b4afeff --- /dev/null +++ b/.changeset/nasty-spoons-kick.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add ability to invalidate a custom identifier on `goto()` diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 56c3855aa436..5b241f0bd8b3 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -374,7 +374,7 @@ function persist_state() { /** * @param {string | URL} url - * @param {{ replaceState?: boolean; noScroll?: boolean; keepFocus?: boolean; invalidateAll?: boolean; state?: Record }} options + * @param {{ replaceState?: boolean; noScroll?: boolean; keepFocus?: boolean; invalidateAll?: boolean; invalidate?: Array boolean)>; state?: Record }} options * @param {number} redirect_count * @param {{}} [nav_token] */ @@ -392,6 +392,10 @@ async function _goto(url, options, redirect_count, nav_token) { if (options.invalidateAll) { force_invalidation = true; } + + if (options.invalidate) { + options.invalidate.forEach(push_invalidated); + } } }); } @@ -1805,6 +1809,7 @@ export function disableScrollHandling() { * @param {boolean} [opts.noScroll] If `true`, the browser will maintain its scroll position rather than scrolling to the top of the page after navigation * @param {boolean} [opts.keepFocus] If `true`, the currently focused element will retain focus after navigation. Otherwise, focus will be reset to the body * @param {boolean} [opts.invalidateAll] If `true`, all `load` functions of the page will be rerun. See https://svelte.dev/docs/kit/load#rerunning-load-functions for more info on invalidation. + * @param {Array boolean)>} [opts.invalidate] Causes any load functions to re-run if they depend on one of the urls * @param {App.PageState} [opts.state] An optional object that will be available as `page.state` * @returns {Promise} */ @@ -1851,14 +1856,21 @@ export function invalidate(resource) { throw new Error('Cannot call invalidate(...) on the server'); } + push_invalidated(resource); + + return _invalidate(); +} + +/** + * @param {string | URL | ((url: URL) => boolean)} resource The invalidated URL + */ +function push_invalidated(resource) { if (typeof resource === 'function') { invalidated.push(resource); } else { const { href } = new URL(resource, location.href); invalidated.push((url) => url.href === href); } - - return _invalidate(); } /** diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+layout.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+layout.js new file mode 100644 index 000000000000..40882f29110a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+layout.js @@ -0,0 +1,7 @@ +/** @type {import('./$types').LayoutLoad} */ +export function load({ depends }) { + depends('invalidate-depends-goto:layout'); + return { + layout: new Date().getTime() + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.js new file mode 100644 index 000000000000..3a5403c430cc --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.js @@ -0,0 +1,8 @@ +/** @type {import('./$types').PageLoad} */ +export function load({ data, depends }) { + depends('invalidate-depends-goto:shared'); + return { + shared: new Date().getTime(), + ...data + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.server.js b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.server.js new file mode 100644 index 000000000000..ee29abbe4b9c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.server.js @@ -0,0 +1,7 @@ +/** @type {import('./$types').PageServerLoad} */ +export function load({ depends }) { + depends('invalidate-depends-goto:server'); + return { + server: new Date().getTime() + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.svelte new file mode 100644 index 000000000000..6c799100c283 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.svelte @@ -0,0 +1,49 @@ + + +

{data.layout}

+ + +

{data.server}

+ + +

{data.shared}

+ + +

neither

+ diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 769de7704cb2..8c1bbc5e4b61 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -673,6 +673,83 @@ test.describe('Invalidation', () => { expect(await page.textContent('p.shared')).toBe(next_shared); }); + test('+page(.server).js is re-run when server dep is invalidated following goto', async ({ + page + }) => { + await page.goto('/load/invalidation/depends-goto'); + const layout = await page.textContent('p.layout'); + const server = await page.textContent('p.server'); + const shared = await page.textContent('p.shared'); + expect(layout).toBeDefined(); + expect(server).toBeDefined(); + expect(shared).toBeDefined(); + + await page.click('button.server'); + await page.evaluate(() => window.promise); + const next_layout = await page.textContent('p.layout'); + const next_server = await page.textContent('p.server'); + const next_shared = await page.textContent('p.shared'); + expect(layout).toBe(next_layout); + expect(server).not.toBe(next_server); + expect(shared).not.toBe(next_shared); + + await page.click('button.neither'); + await page.evaluate(() => window.promise); + expect(await page.textContent('p.layout')).toBe(next_layout); + expect(await page.textContent('p.server')).toBe(next_server); + expect(await page.textContent('p.shared')).toBe(next_shared); + }); + + test('+page.js is re-run when shared dep is invalidated following goto', async ({ page }) => { + await page.goto('/load/invalidation/depends-goto'); + const layout = await page.textContent('p.layout'); + const server = await page.textContent('p.server'); + const shared = await page.textContent('p.shared'); + expect(layout).toBeDefined(); + expect(server).toBeDefined(); + expect(shared).toBeDefined(); + + await page.click('button.shared'); + await page.evaluate(() => window.promise); + const next_layout = await page.textContent('p.layout'); + const next_server = await page.textContent('p.server'); + const next_shared = await page.textContent('p.shared'); + expect(layout).toBe(next_layout); + expect(server).toBe(next_server); + expect(shared).not.toBe(next_shared); + + await page.click('button.neither'); + await page.evaluate(() => window.promise); + expect(await page.textContent('p.layout')).toBe(next_layout); + expect(await page.textContent('p.server')).toBe(next_server); + expect(await page.textContent('p.shared')).toBe(next_shared); + }); + + test('Specified dependencies are re-run following goto', async ({ page }) => { + await page.goto('/load/invalidation/depends-goto'); + const layout = await page.textContent('p.layout'); + const server = await page.textContent('p.server'); + const shared = await page.textContent('p.shared'); + expect(layout).toBeDefined(); + expect(server).toBeDefined(); + expect(shared).toBeDefined(); + + await page.click('button.specified'); + await page.evaluate(() => window.promise); + const next_layout = await page.textContent('p.layout'); + const next_server = await page.textContent('p.server'); + const next_shared = await page.textContent('p.shared'); + expect(layout).not.toBe(next_layout); + expect(server).toBe(next_server); + expect(shared).not.toBe(next_shared); + + await page.click('button.neither'); + await page.evaluate(() => window.promise); + expect(await page.textContent('p.layout')).toBe(next_layout); + expect(await page.textContent('p.server')).toBe(next_server); + expect(await page.textContent('p.shared')).toBe(next_shared); + }); + test('Parameter use is tracked even for routes that do not use the parameters', async ({ page, clicknav diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 88e9c3e8936e..e56cee9c8c31 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2210,6 +2210,7 @@ declare module '$app/navigation' { noScroll?: boolean | undefined; keepFocus?: boolean | undefined; invalidateAll?: boolean | undefined; + invalidate?: (string | URL | ((url: URL) => boolean))[] | undefined; state?: App.PageState | undefined; } | undefined): Promise; /** From d440c68acac67ed64eea4b9bda267e229303db7b Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 16 Jan 2025 01:31:56 -0800 Subject: [PATCH 0890/1135] perf: shorten file names (#13003) entry file names and asset names are untouched. chunk file names are often misleading because they may contain more (or less) than what the filename suggests. --- .changeset/blue-foxes-clean.md | 5 +++++ packages/kit/src/exports/vite/index.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/blue-foxes-clean.md diff --git a/.changeset/blue-foxes-clean.md b/.changeset/blue-foxes-clean.md new file mode 100644 index 000000000000..74957d959df8 --- /dev/null +++ b/.changeset/blue-foxes-clean.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +perf: shorten chunk file names diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 093a851fb1df..ddbe74618e81 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -659,7 +659,7 @@ async function kit({ svelte_config }) { format: inline ? 'iife' : 'esm', name: `__sveltekit_${version_hash}.app`, entryFileNames: ssr ? '[name].js' : `${prefix}/[name].[hash].${ext}`, - chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[name].[hash].${ext}`, + chunkFileNames: ssr ? 'chunks/[name].js' : `${prefix}/chunks/[hash].${ext}`, assetFileNames: `${prefix}/assets/[name].[hash][extname]`, hoistTransitiveImports: false, sourcemapIgnoreList, @@ -676,7 +676,7 @@ async function kit({ svelte_config }) { rollupOptions: { output: { entryFileNames: `${prefix}/workers/[name]-[hash].js`, - chunkFileNames: `${prefix}/workers/chunks/[name]-[hash].js`, + chunkFileNames: `${prefix}/workers/chunks/[hash].js`, assetFileNames: `${prefix}/workers/assets/[name]-[hash][extname]`, hoistTransitiveImports: false } From 34a03ff16af29e917abebb649b31eadfc40a98a0 Mon Sep 17 00:00:00 2001 From: Kirill Sedunov Date: Thu, 16 Jan 2025 12:48:52 +0300 Subject: [PATCH 0891/1135] fix: use resolve_symlinks for node.universal and node.server (#12740) fixes #8100 --- .changeset/great-badgers-sing.md | 5 +++++ packages/kit/src/exports/vite/build/build_server.js | 10 ++++++++-- 2 files changed, 13 insertions(+), 2 deletions(-) create mode 100644 .changeset/great-badgers-sing.md diff --git a/.changeset/great-badgers-sing.md b/.changeset/great-badgers-sing.md new file mode 100644 index 000000000000..3dc41e189cbc --- /dev/null +++ b/.changeset/great-badgers-sing.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: resolve symlinks when handling routes diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index f951d896ec97..3e4adaf560bb 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -59,13 +59,19 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli } if (node.universal) { - imports.push(`import * as universal from '../${server_manifest[node.universal].file}';`); + imports.push( + `import * as universal from '../${ + resolve_symlinks(server_manifest, node.universal).chunk.file + }';` + ); exports.push('export { universal };'); exports.push(`export const universal_id = ${s(node.universal)};`); } if (node.server) { - imports.push(`import * as server from '../${server_manifest[node.server].file}';`); + imports.push( + `import * as server from '../${resolve_symlinks(server_manifest, node.server).chunk.file}';` + ); exports.push('export { server };'); exports.push(`export const server_id = ${s(node.server)};`); } From 0142dd8e12fc2cc36a137368f0edea90b0e62964 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 16 Jan 2025 11:48:45 -0800 Subject: [PATCH 0892/1135] chore: add missing `await` (#13327) --- packages/kit/src/runtime/server/page/load_data.spec.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kit/src/runtime/server/page/load_data.spec.js b/packages/kit/src/runtime/server/page/load_data.spec.js index bed961fbb872..da5cc0b17203 100644 --- a/packages/kit/src/runtime/server/page/load_data.spec.js +++ b/packages/kit/src/runtime/server/page/load_data.spec.js @@ -47,10 +47,10 @@ test('succeeds when acao header present on cors', async () => { assert.equal(text, 'foo'); }); -test('errors when no acao header present on cors', () => { +test('errors when no acao header present on cors', async () => { const fetch = create_fetch({}); - expect(async () => { + await expect(async () => { const response = await fetch('https://domain-b.com'); await response.text(); }).rejects.toThrowError( From 777c8ef11f17d2ab48aee0f2347c051663da5826 Mon Sep 17 00:00:00 2001 From: Revan Date: Fri, 17 Jan 2025 20:02:10 +1100 Subject: [PATCH 0893/1135] fix: tighten up preloadCode (#12217) support absolute URLs with `data-sveltekit-preload-code="viewport"` and reroutes for preloadCode in general --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> Co-authored-by: Chew Tee Ming Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/fluffy-coats-laugh.md | 5 ++ packages/kit/src/runtime/client/client.js | 53 ++++++++++++++----- packages/kit/test/ambient.d.ts | 2 +- .../data-sveltekit/preload-code/+page.svelte | 11 ++++ .../preload-code/target/eager/+page.js | 5 ++ .../preload-code/target/eager/+page.svelte | 5 ++ .../preload-code/target/hover/+page.js | 5 ++ .../preload-code/target/hover/+page.svelte | 5 ++ .../preload-code/target/tap/+page.js | 5 ++ .../preload-code/target/tap/+page.svelte | 5 ++ .../preload-code/target/viewport/+page.js | 5 ++ .../preload-code/target/viewport/+page.svelte | 5 ++ .../kit/test/apps/basics/test/client.test.js | 30 +++++++++++ .../basics/test/cross-platform/client.test.js | 35 +++++++++++- packages/kit/test/utils.d.ts | 2 +- packages/kit/test/utils.js | 4 +- 16 files changed, 163 insertions(+), 19 deletions(-) create mode 100644 .changeset/fluffy-coats-laugh.md create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.svelte diff --git a/.changeset/fluffy-coats-laugh.md b/.changeset/fluffy-coats-laugh.md new file mode 100644 index 000000000000..a03d7e50cc99 --- /dev/null +++ b/.changeset/fluffy-coats-laugh.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/kit": patch +--- + +fix: support absolute URLs and reroutes with `data-sveltekit-preload-code="viewport"` diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 5b241f0bd8b3..190a00a13aac 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -426,9 +426,15 @@ async function _preload_data(intent) { return load_cache.promise; } -/** @param {URL} url */ +/** + * @param {URL} url + * @returns {Promise} + */ async function _preload_code(url) { - const route = routes.find((route) => route.exec(get_url_path(url))); + const rerouted = get_rerouted_url(url); + if (!rerouted) return; + + const route = routes.find((route) => route.exec(get_url_path(rerouted))); if (route) { await Promise.all([...route.layouts, route.leaf].map((load) => load?.[1]())); @@ -1189,16 +1195,11 @@ async function load_root_error_page({ status, error, url, route }) { } /** - * Resolve the full info (which route, params, etc.) for a client-side navigation from the URL, - * taking the reroute hook into account. If this isn't a client-side-navigation (or the URL is undefined), - * returns undefined. - * @param {URL | undefined} url - * @param {boolean} invalidating + * Resolve the relative rerouted URL for a client-side navigation + * @param {URL} url + * @returns {URL | undefined} */ -function get_navigation_intent(url, invalidating) { - if (!url) return; - if (is_external_url(url, base, app.hash)) return; - +function get_rerouted_url(url) { // reroute could alter the given URL, so we pass a copy let rerouted; try { @@ -1225,9 +1226,26 @@ function get_navigation_intent(url, invalidating) { } // fall back to native navigation - return undefined; + return; } + return rerouted; +} + +/** + * Resolve the full info (which route, params, etc.) for a client-side navigation from the URL, + * taking the reroute hook into account. If this isn't a client-side-navigation (or the URL is undefined), + * returns undefined. + * @param {URL | undefined} url + * @param {boolean} invalidating + */ +function get_navigation_intent(url, invalidating) { + if (!url) return; + if (is_external_url(url, base, app.hash)) return; + + const rerouted = get_rerouted_url(url); + if (!rerouted) return; + const path = get_url_path(rerouted); for (const route of routes) { @@ -1942,13 +1960,20 @@ export function preloadCode(pathname) { const url = new URL(pathname, current.url); if (DEV) { + if (!pathname.startsWith('/')) { + throw new Error( + 'argument passed to preloadCode must be a pathname (i.e. "/about" rather than "http://example.com/about"' + ); + } + if (!pathname.startsWith(base)) { throw new Error( - `pathnames passed to preloadCode must start with \`paths.base\` (i.e. "${base}${pathname}" rather than "${pathname}")` + `pathname passed to preloadCode must start with \`paths.base\` (i.e. "${base}${pathname}" rather than "${pathname}")` ); } - if (!routes.find((route) => route.exec(get_url_path(url)))) { + const rerouted = get_rerouted_url(url); + if (!rerouted || !routes.find((route) => route.exec(get_url_path(rerouted)))) { throw new Error(`'${pathname}' did not match any routes`); } } diff --git a/packages/kit/test/ambient.d.ts b/packages/kit/test/ambient.d.ts index 998e04686eaa..16241a80cb0b 100644 --- a/packages/kit/test/ambient.d.ts +++ b/packages/kit/test/ambient.d.ts @@ -16,7 +16,7 @@ declare global { const preloadData: (url: string) => Promise; const beforeNavigate: (fn: (url: URL) => void | boolean) => void; const afterNavigate: (fn: () => void) => void; - const preloadCode: (...urls: string[]) => Promise; + const preloadCode: (pathname: string) => Promise; } export {}; diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/+page.svelte new file mode 100644 index 000000000000..dbe1987a91d8 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/+page.svelte @@ -0,0 +1,11 @@ +
+ +viewport +hover +tap diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.js b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.js new file mode 100644 index 000000000000..6bd637896106 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.js @@ -0,0 +1,5 @@ +export function load() { + return { + name: 'eager' + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.svelte new file mode 100644 index 000000000000..4edc3a505993 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.svelte @@ -0,0 +1,5 @@ + + +

{data.name}

diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.js b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.js new file mode 100644 index 000000000000..02cbf8160e56 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.js @@ -0,0 +1,5 @@ +export function load() { + return { + name: 'hover' + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.svelte new file mode 100644 index 000000000000..4edc3a505993 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.svelte @@ -0,0 +1,5 @@ + + +

{data.name}

diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.js b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.js new file mode 100644 index 000000000000..82c7ce3f01ee --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.js @@ -0,0 +1,5 @@ +export function load() { + return { + name: 'tap' + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.svelte new file mode 100644 index 000000000000..4edc3a505993 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.svelte @@ -0,0 +1,5 @@ + + +

{data.name}

diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.js b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.js new file mode 100644 index 000000000000..02cbf8160e56 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.js @@ -0,0 +1,5 @@ +export function load() { + return { + name: 'hover' + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.svelte new file mode 100644 index 000000000000..4edc3a505993 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.svelte @@ -0,0 +1,5 @@ + + +

{data.name}

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 8c1bbc5e4b61..c8f15f518348 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -824,6 +824,36 @@ test.describe('Invalidation', () => { }); test.describe('data-sveltekit attributes', () => { + test('data-sveltekit-preload-code', async ({ page }) => { + /** @type {string[]} */ + const requests = []; + page.on('request', (r) => { + requests.push(r.url()); + }); + + // eager + await page.goto('/data-sveltekit/preload-code'); + expect(requests.length).toBeGreaterThanOrEqual(1); + + // viewport + requests.length = 0; + page.locator('#viewport').scrollIntoViewIfNeeded(); + await Promise.all([page.waitForTimeout(100), page.waitForLoadState('networkidle')]); + expect(requests.length).toBeGreaterThanOrEqual(1); + + // hover + requests.length = 0; + await page.locator('#hover').dispatchEvent('mousemove'); + await Promise.all([page.waitForTimeout(100), page.waitForLoadState('networkidle')]); + expect(requests.length).toBeGreaterThanOrEqual(1); + + // tap + requests.length = 0; + await page.locator('#tap').dispatchEvent('touchstart'); + await Promise.all([page.waitForTimeout(100), page.waitForLoadState('networkidle')]); + expect(requests.length).toBeGreaterThanOrEqual(1); + }); + test('data-sveltekit-preload-data', async ({ page }) => { /** @type {string[]} */ const requests = []; diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 482932514553..5ac76c9b724c 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -601,7 +601,40 @@ test.describe.serial('Errors', () => { }); test.describe('Prefetching', () => { - test('prefetches programmatically', async ({ baseURL, page, app }) => { + test('prefetches code programmatically', async ({ page, app }) => { + await page.goto('/routing/a'); + + /** @type {string[]} */ + const requests = []; + page.on('request', (r) => { + requests.push(r.url()); + }); + + await app.preloadCode('/routing/b'); + + // svelte request made is environment dependent + if (process.env.DEV) { + expect(requests.filter((req) => req.endsWith('routing/b/+page.js')).length).toBe(1); + expect(requests.filter((req) => req.endsWith('routing/b/+page.svelte')).length).toBe(1); + } else { + expect(requests.filter((req) => /\/_app\/immutable\/nodes\/.*?.js$/.test(req)).length).toBe( + 1 + ); + } + + if (process.env.DEV) { + try { + await app.preloadCode('https://example.com'); + throw new Error('Error was not thrown'); + } catch (/** @type {any} */ e) { + expect(e.message).toMatch( + 'argument passed to preloadCode must be a pathname (i.e. "/about" rather than "http://example.com/about"' + ); + } + } + }); + + test('prefetches data programmatically', async ({ baseURL, page, app }) => { await page.goto('/routing/a'); /** @type {string[]} */ diff --git a/packages/kit/test/utils.d.ts b/packages/kit/test/utils.d.ts index 7992ee76c493..487065218ef3 100644 --- a/packages/kit/test/utils.d.ts +++ b/packages/kit/test/utils.d.ts @@ -18,7 +18,7 @@ export const test: TestType< invalidate(url: string): Promise; beforeNavigate(url: URL): void | boolean; afterNavigate(url: URL): void; - preloadCode(...urls: string[]): Promise; + preloadCode(pathname: string): Promise; preloadData(url: string): Promise; }; clicknav(selector: string, options?: Parameters[0]): Promise; diff --git a/packages/kit/test/utils.js b/packages/kit/test/utils.js index cf03a52ab718..9716c7ec0f1b 100644 --- a/packages/kit/test/utils.js +++ b/packages/kit/test/utils.js @@ -40,10 +40,10 @@ export const test = base.extend({ afterNavigate: () => page.evaluate(() => afterNavigate(() => {})), /** - * @param {string[]} urls + * @param {string} pathname * @returns {Promise} */ - preloadCode: (...urls) => page.evaluate((urls) => preloadCode(...urls), urls), + preloadCode: (pathname) => page.evaluate((pathname) => preloadCode(pathname), pathname), /** * @param {string} url From 388d4412df77083f5396bac35cd49c5ec1132943 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 17 Jan 2025 17:05:36 +0800 Subject: [PATCH 0894/1135] fix: catch error when resolving peer dep (#13334) fixes #13331 --- packages/kit/src/utils/import.js | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/utils/import.js b/packages/kit/src/utils/import.js index 1c55a14c9b2f..4a8e92971f16 100644 --- a/packages/kit/src/utils/import.js +++ b/packages/kit/src/utils/import.js @@ -11,10 +11,15 @@ export async function resolve_peer_dependency(dependency) { try { // @ts-expect-error the types are wrong const resolved = imr.resolve(dependency, pathToFileURL(process.cwd() + '/dummy.js')); - return await import(resolved).catch(() => import(dependency)); + return await import(resolved); } catch { - throw new Error( - `Could not resolve peer dependency "${dependency}" relative to your project — please install it and try again.` - ); + try { + // both imr.resolve and await import above can throw, which is why we can't just do import(resolved).catch(...) above + return await import(dependency); + } catch { + throw new Error( + `Could not resolve peer dependency "${dependency}" relative to your project — please install it and try again.` + ); + } } } From c43fd92091a31675a376f0ef5e22dd3b502afef6 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 17 Jan 2025 17:40:37 +0800 Subject: [PATCH 0895/1135] fix: only decode URL hash instead of entire URL (#13332) followup to #13321 / #13316 This PR ensures only the hash of the URL is decoded so that any encoded hash character in the query parameters remains encoded. --- packages/kit/src/runtime/client/client.js | 17 +++++++++++++++-- .../test/apps/hash-based-routing/test/test.js | 4 ++-- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 190a00a13aac..573a9d2d381b 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -306,7 +306,9 @@ export async function start(_app, _target, hydrate) { if (hydrate) { await _hydrate(target, hydrate); } else { - goto(app.hash ? decodeURIComponent(location.href) : location.href, { replaceState: true }); + goto(app.hash ? decode_hash(new URL(location.href)) : location.href, { + replaceState: true + }); } _start_router(); @@ -2432,7 +2434,7 @@ function _start_router() { // (surprisingly!) mutates `current.url`, allowing us to // detect it and trigger a navigation if (current.url.hash === location.hash) { - navigate({ type: 'goto', url: new URL(decodeURIComponent(current.url.href)) }); + navigate({ type: 'goto', url: decode_hash(current.url) }); } } }); @@ -2826,6 +2828,17 @@ function clone_page(page) { }; } +/** + * @param {URL} url + * @returns {URL} + */ +function decode_hash(url) { + const new_url = new URL(url); + // Safari, for some reason, does change # to %23, when entered through the address bar + new_url.hash = decodeURIComponent(url.hash); + return new_url; +} + if (DEV) { // Nasty hack to silence harmless warnings the user can do nothing about const console_warn = console.warn; diff --git a/packages/kit/test/apps/hash-based-routing/test/test.js b/packages/kit/test/apps/hash-based-routing/test/test.js index 6743639fec2c..23666ed5e562 100644 --- a/packages/kit/test/apps/hash-based-routing/test/test.js +++ b/packages/kit/test/apps/hash-based-routing/test/test.js @@ -56,10 +56,10 @@ test.describe('hash based navigation', () => { }); test('navigation works with URL encoded characters', async ({ page }) => { - await page.goto('/#/%23test'); + await page.goto('/?query=%23abc#/%23test'); await expect(page.locator('p')).toHaveText('home'); // hashchange event - await page.goto('/#/a%23test'); + await page.goto('/?query=%23abc#/a%23test'); await expect(page.locator('p')).toHaveText('a'); }); From e541a4057a00f5ab6740fb51b7f88f17776da50a Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Fri, 17 Jan 2025 01:48:11 -0800 Subject: [PATCH 0896/1135] feat: remove the postinstall script in favor of template prepare script (#13304) since pnpm 10 they don't run at all, and previously they didn't run after the first install either for pnpm users --- .changeset/shaggy-tools-pump.md | 14 +++++ packages/kit/package.json | 7 +-- packages/kit/postinstall.js | 55 ------------------- packages/kit/test/apps/amp/package.json | 1 + packages/kit/test/apps/basics/package.json | 1 + packages/kit/test/apps/dev-only/package.json | 1 + packages/kit/test/apps/embed/package.json | 1 + .../test/apps/hash-based-routing/package.json | 1 + packages/kit/test/apps/no-ssr/package.json | 1 + packages/kit/test/apps/options-2/package.json | 1 + packages/kit/test/apps/options/package.json | 1 + packages/kit/test/apps/writes/package.json | 1 + .../package.json | 1 + .../package.json | 1 + .../package.json | 1 + .../package.json | 1 + .../apps/private-dynamic-env/package.json | 1 + .../package.json | 1 + .../apps/private-static-env/package.json | 1 + .../package.json | 1 + .../apps/server-only-folder/package.json | 1 + .../package.json | 1 + .../apps/server-only-module/package.json | 1 + .../package.json | 1 + .../service-worker-private-env/package.json | 1 + .../apps/syntax-error/package.json | 3 +- playgrounds/basic/package.json | 1 + pnpm-lock.yaml | 3 - 28 files changed, 41 insertions(+), 64 deletions(-) create mode 100644 .changeset/shaggy-tools-pump.md delete mode 100644 packages/kit/postinstall.js diff --git a/.changeset/shaggy-tools-pump.md b/.changeset/shaggy-tools-pump.md new file mode 100644 index 000000000000..93c9b2338f2d --- /dev/null +++ b/.changeset/shaggy-tools-pump.md @@ -0,0 +1,14 @@ +--- +'@sveltejs/kit': minor +--- + +feat: remove the `postinstall` script to support pnpm 10 + +NOTE: users should add `"prepare": "svelte-kit sync`" to their `package.json` in order to avoid the following warning upon first running Vite: +``` +▲ [WARNING] Cannot find base config file "./.svelte-kit/tsconfig.json" [tsconfig.json] + + tsconfig.json:2:12: + 2 │ "extends": "./.svelte-kit/tsconfig.json", + ╵ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``` diff --git a/packages/kit/package.json b/packages/kit/package.json index 38c3bac6b552..d7339b433916 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -28,8 +28,7 @@ "mrmime": "^2.0.0", "sade": "^1.8.1", "set-cookie-parser": "^2.6.0", - "sirv": "^3.0.0", - "tiny-glob": "^0.2.9" + "sirv": "^3.0.0" }, "devDependencies": { "@playwright/test": "^1.44.1", @@ -59,8 +58,7 @@ "!src/core/**/fixtures", "!src/core/**/test", "types", - "svelte-kit.js", - "postinstall.js" + "svelte-kit.js" ], "scripts": { "lint": "prettier --config ../../.prettierrc --check .", @@ -72,7 +70,6 @@ "test:cross-platform:dev": "pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test:cross-platform:dev", "test:cross-platform:build": "pnpm test:unit && pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test:cross-platform:build", "test:unit": "vitest --config kit.vitest.config.js run", - "postinstall": "node postinstall.js", "prepublishOnly": "pnpm generate:types", "generate:version": "node scripts/generate-version.js", "generate:types": "node scripts/generate-dts.js" diff --git a/packages/kit/postinstall.js b/packages/kit/postinstall.js deleted file mode 100644 index ac79151ebc44..000000000000 --- a/packages/kit/postinstall.js +++ /dev/null @@ -1,55 +0,0 @@ -import { load_config } from './src/core/config/index.js'; -import glob from 'tiny-glob/sync.js'; -import fs from 'node:fs'; -import process from 'node:process'; - -try { - const cwd = process.env.INIT_CWD ?? process.cwd(); - process.chdir(cwd); - - if (fs.existsSync('package.json')) { - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - - const workspaces = []; - - if (pkg.workspaces) { - // Find all npm and Yarn workspace glob patterns - // https://classic.yarnpkg.com/blog/2018/02/15/nohoist/ - // https://docs.npmjs.com/cli/v9/configuring-npm/package-json#workspaces - const patterns = Array.isArray(pkg.workspaces) ? pkg.workspaces : pkg.workspaces.packages; - - for (const pattern of patterns) { - workspaces.push( - ...glob(pattern, { cwd, absolute: true }).filter((path) => - fs.statSync(path).isDirectory() - ) - ); - } - } else { - workspaces.push(cwd); - } - - for (const cwd of workspaces) { - process.chdir(cwd); - - if (!fs.existsSync('package.json')) continue; - if (!fs.existsSync('svelte.config.js')) continue; - - const pkg = JSON.parse(fs.readFileSync('package.json', 'utf8')); - if (!pkg.dependencies?.['@sveltejs/kit'] && !pkg.devDependencies?.['@sveltejs/kit']) continue; - - // defer import until after the chdir so that peer dependency resolves correctly - const sync = await import('./src/core/sync/sync.js'); - - try { - const config = await load_config(); - sync.all(config, 'development'); - } catch (error) { - console.error('Error while trying to sync SvelteKit config'); - console.error(error); - } - } - } -} catch (error) { - console.error(error); -} diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index 7774f14aba80..25ebbbebc084 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "pnpm test:dev && pnpm test:build", "test:dev": "cross-env DEV=true playwright test", diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index 0ae5b0924880..2627746ce7fd 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "node test/setup.js && pnpm test:dev && pnpm test:build", "test:dev": "node -e \"fs.rmSync('test/errors.json', { force: true })\" && cross-env DEV=true playwright test", diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index 4dccabf51749..02f5605fc3f0 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "cross-env DEV=true playwright test" }, diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index 4559fd1341a0..ce95b4974ee9 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "pnpm test:dev && pnpm test:build", "test:dev": "cross-env DEV=true playwright test", diff --git a/packages/kit/test/apps/hash-based-routing/package.json b/packages/kit/test/apps/hash-based-routing/package.json index 31eb52c57468..e3f1186e3069 100644 --- a/packages/kit/test/apps/hash-based-routing/package.json +++ b/packages/kit/test/apps/hash-based-routing/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "pnpm test:dev && pnpm test:build", "test:dev": "cross-env DEV=true playwright test", diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index 7f4348976632..f894c1cc0116 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "pnpm test:dev && pnpm test:build", "test:dev": "cross-env DEV=true playwright test", diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index 6b7c7de21657..ffb334b0d7c3 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "pnpm test:dev && pnpm test:build", "test:dev": "cross-env DEV=true playwright test", diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 85c63b12321f..c2df38711db6 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -6,6 +6,7 @@ "dev": "vite dev -c vite.custom.config.js", "build": "vite build -c vite.custom.config.js --mode custom", "preview": "vite preview -c vite.custom.config.js", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "pnpm test:dev && pnpm test:build", "test:dev": "cross-env DEV=true playwright test", diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index e5bf4b02eed4..93bf67a7556f 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "test": "pnpm test:dev && pnpm test:build", "test:dev": "cross-env DEV=true playwright test", diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index cf4d9913e0d7..57b7a858d66c 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check" }, "devDependencies": { diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index cf4d9913e0d7..57b7a858d66c 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check" }, "devDependencies": { diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index 834924d345eb..476e7566e259 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check" }, "devDependencies": { diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index b2effd8466cc..baf4b7995a73 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index 6cc97fed6bf7..f1fb38292390 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index c98b0c2e266a..e6cbe7084777 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index 40edab1e2516..7217befce459 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index 36c162f4cb18..123d621cc558 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index 80c89040bbd3..a1ffc94d9d47 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index a3ce9cb0317b..d41ec5f19afd 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index d3f317627930..51ce8aebd0d0 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index d420359daf0f..aaf360d34974 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index 06f895237d94..466853ba6c0b 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -6,6 +6,7 @@ "dev": "vite dev", "build": "vite build", "preview": "vite preview", + "prepare": "svelte-kit sync", "check": "svelte-kit sync && tsc && svelte-check", "check:watch": "svelte-check --watch" }, diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index 194ea56a99fe..e2afad26e8e3 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -5,7 +5,8 @@ "scripts": { "dev": "vite dev", "build": "vite build", - "preview": "vite preview" + "preview": "vite preview", + "prepare": "svelte-kit sync" }, "devDependencies": { "@sveltejs/kit": "workspace:^", diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index 216d786a439a..777ff2d38116 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -7,6 +7,7 @@ "build": "vite build && npm run package", "preview": "vite preview", "package": "svelte-kit sync && svelte-package && publint", + "prepare": "svelte-kit sync", "prepublishOnly": "npm run package", "check": "svelte-kit sync && svelte-check", "check:watch": "svelte-kit sync && svelte-check --watch", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 59b71725e173..3988c1e69f71 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -375,9 +375,6 @@ importers: sirv: specifier: ^3.0.0 version: 3.0.0 - tiny-glob: - specifier: ^0.2.9 - version: 0.2.9 devDependencies: '@playwright/test': specifier: ^1.44.1 From 37f72fbb075b481de8263f62c77125333735f382 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 17 Jan 2025 18:27:32 +0800 Subject: [PATCH 0897/1135] fix: inline server stylesheets instead of client stylesheets (#13068) fixes #6720 This PR changes the inlined stylesheet from client to server so that the paths for imported assets in the CSS such as fonts are correct when the document first loads. In comparison, the client stylesheet links are relative by default, so they always link to the wrong place --- .changeset/sixty-days-think.md | 5 +++ .../src/exports/vite/build/build_server.js | 42 ++++++++++++++++--- packages/kit/test/apps/options/package.json | 1 + .../source/pages/inline-assets/+page.svelte | 11 +++++ packages/kit/test/apps/options/test/test.js | 16 +++++++ pnpm-lock.yaml | 8 ++++ 6 files changed, 77 insertions(+), 6 deletions(-) create mode 100644 .changeset/sixty-days-think.md create mode 100644 packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte diff --git a/.changeset/sixty-days-think.md b/.changeset/sixty-days-think.md new file mode 100644 index 000000000000..043f244a7962 --- /dev/null +++ b/.changeset/sixty-days-think.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly link to assets inlined by the `inlineStyleThreshold` option diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index 3e4adaf560bb..47a9484eb40f 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -3,6 +3,7 @@ import { mkdirp } from '../../../utils/filesystem.js'; import { find_deps, resolve_symlinks } from './utils.js'; import { s } from '../../../utils/misc.js'; import { normalizePath } from 'vite'; +import { basename } from 'node:path'; /** * @param {string} out @@ -17,18 +18,47 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli mkdirp(`${out}/server/nodes`); mkdirp(`${out}/server/stylesheets`); + /** @type {Map} */ const stylesheet_lookup = new Map(); if (css) { - css.forEach((asset) => { - if (asset.source.length < kit.inlineStyleThreshold) { - const index = stylesheet_lookup.size; - const file = `${out}/server/stylesheets/${index}.js`; + /** @type {Set} */ + const client_stylesheets = new Set(); + for (const key in client_manifest) { + const file = client_manifest[key]; + if (file.css?.[0]) { + client_stylesheets.add(file.css[0]); + } + } + + /** @type {Map} */ + const server_stylesheets = new Map(); - fs.writeFileSync(file, `// ${asset.fileName}\nexport default ${s(asset.source)};`); - stylesheet_lookup.set(asset.fileName, index); + const component_stylesheet_map = new Map(Object.values(server_manifest).map((file) => [file.src, file.css?.[0]])); + + manifest_data.nodes.forEach((node, i) => { + const server_stylesheet = component_stylesheet_map.get(node.component); + if (node.component && server_stylesheet) { + server_stylesheets.set(i, server_stylesheet); } }); + + // ignore dynamically imported stylesheets since we can't inline those + css.filter(asset => client_stylesheets.has(asset.fileName)) + .forEach((asset) => { + if (asset.source.length < kit.inlineStyleThreshold) { + const [index] = basename(asset.fileName).split('.'); + const server_stylesheet = server_stylesheets.get(+index); + const file = `${out}/server/stylesheets/${index}.js`; + + // we need to inline the server stylesheet instead of the client one + // so that asset paths are correct on document load + const source = fs.readFileSync(`${out}/server/${server_stylesheet}`, 'utf-8'); + + fs.writeFileSync(file, `// ${server_stylesheet}\nexport default ${s(source)};`); + stylesheet_lookup.set(asset.fileName, index); + } + }); } manifest_data.nodes.forEach((node, i) => { diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index c2df38711db6..6a2f5883f48f 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -13,6 +13,7 @@ "test:build": "playwright test" }, "devDependencies": { + "@fontsource/libre-barcode-128-text": "^5.1.0", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", diff --git a/packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte b/packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte new file mode 100644 index 000000000000..8a017caa2622 --- /dev/null +++ b/packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte @@ -0,0 +1,11 @@ + + +

Hello world!

+ + diff --git a/packages/kit/test/apps/options/test/test.js b/packages/kit/test/apps/options/test/test.js index 921c0ef913c1..3ce6b482e092 100644 --- a/packages/kit/test/apps/options/test/test.js +++ b/packages/kit/test/apps/options/test/test.js @@ -303,6 +303,22 @@ if (!process.env.DEV) { expect(await page.content()).not.toMatch('navigator.serviceWorker'); }); }); + + test.describe('inlineStyleThreshold', () => { + test('loads asset', async ({ page }) => { + let fontLoaded = false; + + page.on('response', (response) => { + if (response.url().endsWith('.woff2') || response.url().endsWith('.woff')) { + fontLoaded = response.ok(); + } + }); + + await page.goto('/path-base/inline-assets'); + + expect(fontLoaded).toBeTruthy(); + }); + }); } test.describe('Vite options', () => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 3988c1e69f71..aee018de1039 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -595,6 +595,9 @@ importers: packages/kit/test/apps/options: devDependencies: + '@fontsource/libre-barcode-128-text': + specifier: ^5.1.0 + version: 5.1.0 '@sveltejs/kit': specifier: workspace:^ version: link:../../.. @@ -1591,6 +1594,9 @@ packages: resolution: {integrity: sha512-vBZP4NlzfOlerQTnba4aqZoMhE/a9HY7HRqoOPaETQcSQuWEIyZMHGfVu6w9wGtGK5fED5qRs2DteVCjOH60sA==} engines: {node: '>=14'} + '@fontsource/libre-barcode-128-text@5.1.0': + resolution: {integrity: sha512-MC7foQFRT0NDcsqBWQua2T3gs/fh/uTowTxfoPqGQWjqroiMxRZhQh7jerjnpcI+Xi3yR5bwCo6W2uwCza1FRw==} + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -4054,6 +4060,8 @@ snapshots: '@fastify/busboy@2.1.1': {} + '@fontsource/libre-barcode-128-text@5.1.0': {} + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.0': {} From 6774ebc34330b12ae8c0cae08e98b577d819fffb Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 17 Jan 2025 18:37:17 +0800 Subject: [PATCH 0898/1135] fix: strip internal data before passing URL to `reroute` (#13092) Decoding the pathname etc is irrelevant for stripping the internal data that shows us whether or not this is a data request, so move that logic before the reroute hook. fixes #11625 --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/curvy-trains-dress.md | 5 +++ packages/kit/src/runtime/server/respond.js | 31 +++++++++---------- packages/kit/test/apps/basics/src/hooks.js | 3 +- .../routes/reroute/invalidate/+page.server.js | 5 +++ .../routes/reroute/invalidate/+page.svelte | 11 +++++++ .../kit/test/apps/basics/test/client.test.js | 6 ++++ 6 files changed, 44 insertions(+), 17 deletions(-) create mode 100644 .changeset/curvy-trains-dress.md create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.svelte diff --git a/.changeset/curvy-trains-dress.md b/.changeset/curvy-trains-dress.md new file mode 100644 index 000000000000..2d29ff1b47b2 --- /dev/null +++ b/.changeset/curvy-trains-dress.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: strip internal data before passing URL to `reroute` diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index e260a08b00f1..ab51505a897c 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -85,6 +85,21 @@ export async function respond(request, options, manifest, state) { return text('Not found', { status: 404 }); } + const is_data_request = has_data_suffix(url.pathname); + /** @type {boolean[] | undefined} */ + let invalidated_data_nodes; + if (is_data_request) { + url.pathname = + strip_data_suffix(url.pathname) + + (url.searchParams.get(TRAILING_SLASH_PARAM) === '1' ? '/' : '') || '/'; + url.searchParams.delete(TRAILING_SLASH_PARAM); + invalidated_data_nodes = url.searchParams + .get(INVALIDATED_PARAM) + ?.split('') + .map((node) => node === '1'); + url.searchParams.delete(INVALIDATED_PARAM); + } + // reroute could alter the given URL, so we pass a copy let rerouted_path; try { @@ -126,22 +141,6 @@ export async function respond(request, options, manifest, state) { return text('Not found', { status: 404, headers }); } - const is_data_request = has_data_suffix(decoded); - /** @type {boolean[] | undefined} */ - let invalidated_data_nodes; - if (is_data_request) { - decoded = strip_data_suffix(decoded) || '/'; - url.pathname = - strip_data_suffix(url.pathname) + - (url.searchParams.get(TRAILING_SLASH_PARAM) === '1' ? '/' : '') || '/'; - url.searchParams.delete(TRAILING_SLASH_PARAM); - invalidated_data_nodes = url.searchParams - .get(INVALIDATED_PARAM) - ?.split('') - .map((node) => node === '1'); - url.searchParams.delete(INVALIDATED_PARAM); - } - if (!state.prerendering?.fallback) { // TODO this could theoretically break — should probably be inside a try-catch const matchers = await manifest._.matchers(); diff --git a/packages/kit/test/apps/basics/src/hooks.js b/packages/kit/test/apps/basics/src/hooks.js index deb1576401b0..3897bb949252 100644 --- a/packages/kit/test/apps/basics/src/hooks.js +++ b/packages/kit/test/apps/basics/src/hooks.js @@ -4,7 +4,8 @@ import { Foo } from './lib'; const mapping = { '/reroute/basic/a': '/reroute/basic/b', '/reroute/client-only-redirect/a': '/reroute/client-only-redirect/b', - '/reroute/preload-data/a': '/reroute/preload-data/b' + '/reroute/preload-data/a': '/reroute/preload-data/b', + '/reroute/invalidate/a': '/reroute/invalidate' }; /** @type {import("@sveltejs/kit").Reroute} */ diff --git a/packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.server.js b/packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.server.js new file mode 100644 index 000000000000..e410319baae7 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.server.js @@ -0,0 +1,5 @@ +export function load({ isDataRequest }) { + return { + request: isDataRequest + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.svelte new file mode 100644 index 000000000000..4f4589198f8d --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.svelte @@ -0,0 +1,11 @@ + + + + +{#if data.request} +

data request: {data.request}

+{/if} diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index c8f15f518348..65ead7cb3e1e 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1399,6 +1399,12 @@ test.describe('reroute', () => { expect(await page.textContent('h1')).toContain('Full Navigation'); }); + + test('reroute works with invalidate', async ({ page }) => { + await page.goto('/reroute/invalidate/a'); + await page.click('button'); + await expect(page.locator('p')).toHaveText('data request: true'); + }); }); test.describe('init', () => { From 9bea757a6e779ae6b46976a95a6ad433a32dce2a Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 17 Jan 2025 18:41:12 +0800 Subject: [PATCH 0899/1135] fix: correctly include ambient types from vercel/node adapter (#12088) closes #12433 --- .changeset/shaggy-walls-wave.md | 6 ++++ .../{placeholders.d.ts => internal.d.ts} | 0 .../adapter-cloudflare-workers/tsconfig.json | 2 +- .../{placeholders.d.ts => internal.d.ts} | 0 packages/adapter-cloudflare/tsconfig.json | 2 +- packages/adapter-netlify/index.d.ts | 1 - .../{ambient.d.ts => internal.d.ts} | 0 packages/adapter-netlify/tsconfig.json | 2 +- packages/adapter-node/ambient.d.ts | 36 ++++++------------- packages/adapter-node/internal.d.ts | 19 ++++++++++ packages/adapter-node/package.json | 3 +- packages/adapter-node/tsconfig.json | 2 +- packages/adapter-vercel/package.json | 3 +- 13 files changed, 43 insertions(+), 33 deletions(-) create mode 100644 .changeset/shaggy-walls-wave.md rename packages/adapter-cloudflare-workers/{placeholders.d.ts => internal.d.ts} (100%) rename packages/adapter-cloudflare/{placeholders.d.ts => internal.d.ts} (100%) rename packages/adapter-netlify/{ambient.d.ts => internal.d.ts} (100%) create mode 100644 packages/adapter-node/internal.d.ts diff --git a/.changeset/shaggy-walls-wave.md b/.changeset/shaggy-walls-wave.md new file mode 100644 index 000000000000..fa29a15129d3 --- /dev/null +++ b/.changeset/shaggy-walls-wave.md @@ -0,0 +1,6 @@ +--- +"@sveltejs/adapter-vercel": patch +"@sveltejs/adapter-node": patch +--- + +fix: include ambient type declarations diff --git a/packages/adapter-cloudflare-workers/placeholders.d.ts b/packages/adapter-cloudflare-workers/internal.d.ts similarity index 100% rename from packages/adapter-cloudflare-workers/placeholders.d.ts rename to packages/adapter-cloudflare-workers/internal.d.ts diff --git a/packages/adapter-cloudflare-workers/tsconfig.json b/packages/adapter-cloudflare-workers/tsconfig.json index 1cb740d0614c..e4cdc5abd1b7 100644 --- a/packages/adapter-cloudflare-workers/tsconfig.json +++ b/packages/adapter-cloudflare-workers/tsconfig.json @@ -13,5 +13,5 @@ "@sveltejs/kit": ["../kit/types/index"] } }, - "include": ["**/*.js", "placeholders.d.ts"] + "include": ["**/*.js", "internal.d.ts"] } diff --git a/packages/adapter-cloudflare/placeholders.d.ts b/packages/adapter-cloudflare/internal.d.ts similarity index 100% rename from packages/adapter-cloudflare/placeholders.d.ts rename to packages/adapter-cloudflare/internal.d.ts diff --git a/packages/adapter-cloudflare/tsconfig.json b/packages/adapter-cloudflare/tsconfig.json index 7ebf502ced9e..b258035a3555 100644 --- a/packages/adapter-cloudflare/tsconfig.json +++ b/packages/adapter-cloudflare/tsconfig.json @@ -12,5 +12,5 @@ "@sveltejs/kit": ["../kit/types/index"] } }, - "include": ["index.js", "placeholders.d.ts", "src/worker.js"] + "include": ["index.js", "internal.d.ts", "src/worker.js"] } diff --git a/packages/adapter-netlify/index.d.ts b/packages/adapter-netlify/index.d.ts index aef282740b2f..6bdc8db882dc 100644 --- a/packages/adapter-netlify/index.d.ts +++ b/packages/adapter-netlify/index.d.ts @@ -1,4 +1,3 @@ import { Adapter } from '@sveltejs/kit'; -import './ambient.js'; export default function plugin(opts?: { split?: boolean; edge?: boolean }): Adapter; diff --git a/packages/adapter-netlify/ambient.d.ts b/packages/adapter-netlify/internal.d.ts similarity index 100% rename from packages/adapter-netlify/ambient.d.ts rename to packages/adapter-netlify/internal.d.ts diff --git a/packages/adapter-netlify/tsconfig.json b/packages/adapter-netlify/tsconfig.json index 1eeee8b0847d..cdc2d9ec2a62 100644 --- a/packages/adapter-netlify/tsconfig.json +++ b/packages/adapter-netlify/tsconfig.json @@ -15,5 +15,5 @@ "@sveltejs/kit": ["../kit/types/index"] } }, - "include": ["*.js", "src/**/*.js", "ambient.d.ts"] + "include": ["*.js", "src/**/*.js", "internal.d.ts"] } diff --git a/packages/adapter-node/ambient.d.ts b/packages/adapter-node/ambient.d.ts index acdc19bb2587..7fbdd5adb583 100644 --- a/packages/adapter-node/ambient.d.ts +++ b/packages/adapter-node/ambient.d.ts @@ -1,28 +1,12 @@ -declare module 'ENV' { - export function env(key: string, fallback?: any): string; -} - -declare module 'HANDLER' { - export const handler: import('polka').Middleware; -} - -declare module 'MANIFEST' { - import { SSRManifest } from '@sveltejs/kit'; - - export const base: string; - export const manifest: SSRManifest; - export const prerendered: Set; -} - -declare module 'SERVER' { - export { Server } from '@sveltejs/kit'; -} - -declare namespace App { - export interface Platform { - /** - * The original Node request object (https://nodejs.org/api/http.html#class-httpincomingmessage) - */ - req: import('http').IncomingMessage; +import http from 'node:http'; + +declare global { + namespace App { + export interface Platform { + /** + * The original Node request object (https://nodejs.org/api/http.html#class-httpincomingmessage) + */ + req: http.IncomingMessage; + } } } diff --git a/packages/adapter-node/internal.d.ts b/packages/adapter-node/internal.d.ts new file mode 100644 index 000000000000..fed0584d1851 --- /dev/null +++ b/packages/adapter-node/internal.d.ts @@ -0,0 +1,19 @@ +declare module 'ENV' { + export function env(key: string, fallback?: any): string; +} + +declare module 'HANDLER' { + export const handler: import('polka').Middleware; +} + +declare module 'MANIFEST' { + import { SSRManifest } from '@sveltejs/kit'; + + export const base: string; + export const manifest: SSRManifest; + export const prerendered: Set; +} + +declare module 'SERVER' { + export { Server } from '@sveltejs/kit'; +} diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 3d66d62c86a0..6f9fe38f5c2c 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -29,7 +29,8 @@ "files": [ "files", "index.js", - "index.d.ts" + "index.d.ts", + "ambient.d.ts" ], "scripts": { "dev": "node -e \"fs.rmSync('files', { force: true, recursive: true })\" && rollup -cw", diff --git a/packages/adapter-node/tsconfig.json b/packages/adapter-node/tsconfig.json index 17a612157ece..790cb0a51563 100644 --- a/packages/adapter-node/tsconfig.json +++ b/packages/adapter-node/tsconfig.json @@ -13,5 +13,5 @@ "@sveltejs/kit": ["../kit/types/index"] } }, - "include": ["index.js", "src/**/*.js", "ambient.d.ts"] + "include": ["index.js", "src/**/*.js", "internal.d.ts"] } diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 4e43e02401a6..43394dd6d10e 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -30,7 +30,8 @@ "files", "index.js", "utils.js", - "index.d.ts" + "index.d.ts", + "ambient.d.ts" ], "scripts": { "lint": "prettier --check .", From 537cd1bd58912a921bea78b16a577594cd4d65e9 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 17 Jan 2025 11:48:20 +0100 Subject: [PATCH 0900/1135] Version Packages (#13316) Co-authored-by: github-actions[bot] --- .changeset/blue-foxes-clean.md | 5 --- .changeset/curvy-trains-dress.md | 5 --- .changeset/fluffy-coats-laugh.md | 5 --- .changeset/funny-moles-scream.md | 5 --- .changeset/great-badgers-sing.md | 5 --- .changeset/green-flowers-heal.md | 5 --- .changeset/nasty-spoons-kick.md | 5 --- .changeset/nice-geese-serve.md | 5 --- .changeset/nine-parrots-smoke.md | 5 --- .changeset/quick-crabs-camp.md | 5 --- .changeset/shaggy-tools-pump.md | 14 ------- .changeset/shaggy-walls-wave.md | 6 --- .changeset/sixty-days-think.md | 5 --- .changeset/ten-onions-talk.md | 5 --- .changeset/tricky-books-study.md | 5 --- .changeset/wet-dancers-kneel.md | 5 --- .changeset/wild-coins-live.md | 5 --- packages/adapter-node/CHANGELOG.md | 9 ++++ packages/adapter-node/package.json | 2 +- packages/adapter-vercel/CHANGELOG.md | 9 ++++ packages/adapter-vercel/package.json | 2 +- packages/kit/CHANGELOG.md | 62 ++++++++++++++++++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 24 files changed, 84 insertions(+), 99 deletions(-) delete mode 100644 .changeset/blue-foxes-clean.md delete mode 100644 .changeset/curvy-trains-dress.md delete mode 100644 .changeset/fluffy-coats-laugh.md delete mode 100644 .changeset/funny-moles-scream.md delete mode 100644 .changeset/great-badgers-sing.md delete mode 100644 .changeset/green-flowers-heal.md delete mode 100644 .changeset/nasty-spoons-kick.md delete mode 100644 .changeset/nice-geese-serve.md delete mode 100644 .changeset/nine-parrots-smoke.md delete mode 100644 .changeset/quick-crabs-camp.md delete mode 100644 .changeset/shaggy-tools-pump.md delete mode 100644 .changeset/shaggy-walls-wave.md delete mode 100644 .changeset/sixty-days-think.md delete mode 100644 .changeset/ten-onions-talk.md delete mode 100644 .changeset/tricky-books-study.md delete mode 100644 .changeset/wet-dancers-kneel.md delete mode 100644 .changeset/wild-coins-live.md diff --git a/.changeset/blue-foxes-clean.md b/.changeset/blue-foxes-clean.md deleted file mode 100644 index 74957d959df8..000000000000 --- a/.changeset/blue-foxes-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -perf: shorten chunk file names diff --git a/.changeset/curvy-trains-dress.md b/.changeset/curvy-trains-dress.md deleted file mode 100644 index 2d29ff1b47b2..000000000000 --- a/.changeset/curvy-trains-dress.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: strip internal data before passing URL to `reroute` diff --git a/.changeset/fluffy-coats-laugh.md b/.changeset/fluffy-coats-laugh.md deleted file mode 100644 index a03d7e50cc99..000000000000 --- a/.changeset/fluffy-coats-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/kit": patch ---- - -fix: support absolute URLs and reroutes with `data-sveltekit-preload-code="viewport"` diff --git a/.changeset/funny-moles-scream.md b/.changeset/funny-moles-scream.md deleted file mode 100644 index 0a24a721dde5..000000000000 --- a/.changeset/funny-moles-scream.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: use current `window.fetch` for server load fetch requests diff --git a/.changeset/great-badgers-sing.md b/.changeset/great-badgers-sing.md deleted file mode 100644 index 3dc41e189cbc..000000000000 --- a/.changeset/great-badgers-sing.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: resolve symlinks when handling routes diff --git a/.changeset/green-flowers-heal.md b/.changeset/green-flowers-heal.md deleted file mode 100644 index a348a094e1d2..000000000000 --- a/.changeset/green-flowers-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: prevent infinite reload when using the hash router and previewing `/index.html` diff --git a/.changeset/nasty-spoons-kick.md b/.changeset/nasty-spoons-kick.md deleted file mode 100644 index 1ffb0b4afeff..000000000000 --- a/.changeset/nasty-spoons-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: add ability to invalidate a custom identifier on `goto()` diff --git a/.changeset/nice-geese-serve.md b/.changeset/nice-geese-serve.md deleted file mode 100644 index 406180bebe27..000000000000 --- a/.changeset/nice-geese-serve.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: service worker base path in dev mode diff --git a/.changeset/nine-parrots-smoke.md b/.changeset/nine-parrots-smoke.md deleted file mode 100644 index db364d3136f4..000000000000 --- a/.changeset/nine-parrots-smoke.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -chore: error during development when using `use:enhance` with `+server` diff --git a/.changeset/quick-crabs-camp.md b/.changeset/quick-crabs-camp.md deleted file mode 100644 index b5f2404df29d..000000000000 --- a/.changeset/quick-crabs-camp.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/kit": patch ---- - -chore: add most common status codes to `redirect()` JS documentation diff --git a/.changeset/shaggy-tools-pump.md b/.changeset/shaggy-tools-pump.md deleted file mode 100644 index 93c9b2338f2d..000000000000 --- a/.changeset/shaggy-tools-pump.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: remove the `postinstall` script to support pnpm 10 - -NOTE: users should add `"prepare": "svelte-kit sync`" to their `package.json` in order to avoid the following warning upon first running Vite: -``` -▲ [WARNING] Cannot find base config file "./.svelte-kit/tsconfig.json" [tsconfig.json] - - tsconfig.json:2:12: - 2 │ "extends": "./.svelte-kit/tsconfig.json", - ╵ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``` diff --git a/.changeset/shaggy-walls-wave.md b/.changeset/shaggy-walls-wave.md deleted file mode 100644 index fa29a15129d3..000000000000 --- a/.changeset/shaggy-walls-wave.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -"@sveltejs/adapter-vercel": patch -"@sveltejs/adapter-node": patch ---- - -fix: include ambient type declarations diff --git a/.changeset/sixty-days-think.md b/.changeset/sixty-days-think.md deleted file mode 100644 index 043f244a7962..000000000000 --- a/.changeset/sixty-days-think.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly link to assets inlined by the `inlineStyleThreshold` option diff --git a/.changeset/ten-onions-talk.md b/.changeset/ten-onions-talk.md deleted file mode 100644 index 7351c4ac6086..000000000000 --- a/.changeset/ten-onions-talk.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: provide `PageProps` and `LayoutProps` types diff --git a/.changeset/tricky-books-study.md b/.changeset/tricky-books-study.md deleted file mode 100644 index 93069e3eea0b..000000000000 --- a/.changeset/tricky-books-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/kit": patch ---- - -fix: fall back to importing dynamic dependencies relative to SvelteKit package diff --git a/.changeset/wet-dancers-kneel.md b/.changeset/wet-dancers-kneel.md deleted file mode 100644 index 2c3a34603489..000000000000 --- a/.changeset/wet-dancers-kneel.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: use arrow function types over bound funcs diff --git a/.changeset/wild-coins-live.md b/.changeset/wild-coins-live.md deleted file mode 100644 index b6b989ba8425..000000000000 --- a/.changeset/wild-coins-live.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly navigate when hash router is enabled and the browser encodes extra hashes diff --git a/packages/adapter-node/CHANGELOG.md b/packages/adapter-node/CHANGELOG.md index 79262dfdfd7d..801c1d19a294 100644 --- a/packages/adapter-node/CHANGELOG.md +++ b/packages/adapter-node/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-node +## 5.2.12 +### Patch Changes + + +- fix: include ambient type declarations ([#12088](https://github.com/sveltejs/kit/pull/12088)) + +- Updated dependencies [[`d440c68acac67ed64eea4b9bda267e229303db7b`](https://github.com/sveltejs/kit/commit/d440c68acac67ed64eea4b9bda267e229303db7b), [`6774ebc34330b12ae8c0cae08e98b577d819fffb`](https://github.com/sveltejs/kit/commit/6774ebc34330b12ae8c0cae08e98b577d819fffb), [`777c8ef11f17d2ab48aee0f2347c051663da5826`](https://github.com/sveltejs/kit/commit/777c8ef11f17d2ab48aee0f2347c051663da5826), [`f451f6c4a3dbbc73dc86667c6ff89ab2f46ca9d2`](https://github.com/sveltejs/kit/commit/f451f6c4a3dbbc73dc86667c6ff89ab2f46ca9d2), [`34a03ff16af29e917abebb649b31eadfc40a98a0`](https://github.com/sveltejs/kit/commit/34a03ff16af29e917abebb649b31eadfc40a98a0), [`1c77e283896058084c1cb5752d9ec207987a585e`](https://github.com/sveltejs/kit/commit/1c77e283896058084c1cb5752d9ec207987a585e), [`04958cca5905aaeeff367c9e4a5ce6e90fc64779`](https://github.com/sveltejs/kit/commit/04958cca5905aaeeff367c9e4a5ce6e90fc64779), [`9dc5c0e3e01a3c07010e9996688169be68e1dde8`](https://github.com/sveltejs/kit/commit/9dc5c0e3e01a3c07010e9996688169be68e1dde8), [`00e1a7621de554054d068e4525a9e505d1c2e588`](https://github.com/sveltejs/kit/commit/00e1a7621de554054d068e4525a9e505d1c2e588), [`9fcd1e7574197fa6e7ac000a030378d877cb8837`](https://github.com/sveltejs/kit/commit/9fcd1e7574197fa6e7ac000a030378d877cb8837), [`e541a4057a00f5ab6740fb51b7f88f17776da50a`](https://github.com/sveltejs/kit/commit/e541a4057a00f5ab6740fb51b7f88f17776da50a), [`37f72fbb075b481de8263f62c77125333735f382`](https://github.com/sveltejs/kit/commit/37f72fbb075b481de8263f62c77125333735f382), [`b60707ca8e755be95c86490122aa1b792b9bd6be`](https://github.com/sveltejs/kit/commit/b60707ca8e755be95c86490122aa1b792b9bd6be), [`699f4405c752261cf46c1ad32e4dbadceaffc75b`](https://github.com/sveltejs/kit/commit/699f4405c752261cf46c1ad32e4dbadceaffc75b), [`e2a4538c48295cde06f64fb8c7f0b333fbf95496`](https://github.com/sveltejs/kit/commit/e2a4538c48295cde06f64fb8c7f0b333fbf95496), [`a91ba1f326b6e244503de9a010771d942b461dad`](https://github.com/sveltejs/kit/commit/a91ba1f326b6e244503de9a010771d942b461dad)]: + - @sveltejs/kit@2.16.0 + ## 5.2.11 ### Patch Changes diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 6f9fe38f5c2c..87cd9366ad69 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-node", - "version": "5.2.11", + "version": "5.2.12", "description": "Adapter for SvelteKit apps that generates a standalone Node server", "keywords": [ "adapter", diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index 4ac8af405f4b..bc400c74d42f 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-vercel +## 5.5.3 +### Patch Changes + + +- fix: include ambient type declarations ([#12088](https://github.com/sveltejs/kit/pull/12088)) + +- Updated dependencies [[`d440c68acac67ed64eea4b9bda267e229303db7b`](https://github.com/sveltejs/kit/commit/d440c68acac67ed64eea4b9bda267e229303db7b), [`6774ebc34330b12ae8c0cae08e98b577d819fffb`](https://github.com/sveltejs/kit/commit/6774ebc34330b12ae8c0cae08e98b577d819fffb), [`777c8ef11f17d2ab48aee0f2347c051663da5826`](https://github.com/sveltejs/kit/commit/777c8ef11f17d2ab48aee0f2347c051663da5826), [`f451f6c4a3dbbc73dc86667c6ff89ab2f46ca9d2`](https://github.com/sveltejs/kit/commit/f451f6c4a3dbbc73dc86667c6ff89ab2f46ca9d2), [`34a03ff16af29e917abebb649b31eadfc40a98a0`](https://github.com/sveltejs/kit/commit/34a03ff16af29e917abebb649b31eadfc40a98a0), [`1c77e283896058084c1cb5752d9ec207987a585e`](https://github.com/sveltejs/kit/commit/1c77e283896058084c1cb5752d9ec207987a585e), [`04958cca5905aaeeff367c9e4a5ce6e90fc64779`](https://github.com/sveltejs/kit/commit/04958cca5905aaeeff367c9e4a5ce6e90fc64779), [`9dc5c0e3e01a3c07010e9996688169be68e1dde8`](https://github.com/sveltejs/kit/commit/9dc5c0e3e01a3c07010e9996688169be68e1dde8), [`00e1a7621de554054d068e4525a9e505d1c2e588`](https://github.com/sveltejs/kit/commit/00e1a7621de554054d068e4525a9e505d1c2e588), [`9fcd1e7574197fa6e7ac000a030378d877cb8837`](https://github.com/sveltejs/kit/commit/9fcd1e7574197fa6e7ac000a030378d877cb8837), [`e541a4057a00f5ab6740fb51b7f88f17776da50a`](https://github.com/sveltejs/kit/commit/e541a4057a00f5ab6740fb51b7f88f17776da50a), [`37f72fbb075b481de8263f62c77125333735f382`](https://github.com/sveltejs/kit/commit/37f72fbb075b481de8263f62c77125333735f382), [`b60707ca8e755be95c86490122aa1b792b9bd6be`](https://github.com/sveltejs/kit/commit/b60707ca8e755be95c86490122aa1b792b9bd6be), [`699f4405c752261cf46c1ad32e4dbadceaffc75b`](https://github.com/sveltejs/kit/commit/699f4405c752261cf46c1ad32e4dbadceaffc75b), [`e2a4538c48295cde06f64fb8c7f0b333fbf95496`](https://github.com/sveltejs/kit/commit/e2a4538c48295cde06f64fb8c7f0b333fbf95496), [`a91ba1f326b6e244503de9a010771d942b461dad`](https://github.com/sveltejs/kit/commit/a91ba1f326b6e244503de9a010771d942b461dad)]: + - @sveltejs/kit@2.16.0 + ## 5.5.2 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 43394dd6d10e..e3589ce10d26 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.5.2", + "version": "5.5.3", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 181b5b389e8b..c5c1c47d44e3 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,67 @@ # @sveltejs/kit +## 2.16.0 +### Minor Changes + + +- feat: add ability to invalidate a custom identifier on `goto()` ([#13256](https://github.com/sveltejs/kit/pull/13256)) + + +- feat: remove the `postinstall` script to support pnpm 10 ([#13304](https://github.com/sveltejs/kit/pull/13304)) + + NOTE: users should add `"prepare": "svelte-kit sync`" to their `package.json` in order to avoid the following warning upon first running Vite: + ``` + ▲ [WARNING] Cannot find base config file "./.svelte-kit/tsconfig.json" [tsconfig.json] + + tsconfig.json:2:12: + 2 │ "extends": "./.svelte-kit/tsconfig.json", + ╵ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ``` + +- feat: provide `PageProps` and `LayoutProps` types ([#13308](https://github.com/sveltejs/kit/pull/13308)) + + +### Patch Changes + + +- perf: shorten chunk file names ([#13003](https://github.com/sveltejs/kit/pull/13003)) + + +- fix: strip internal data before passing URL to `reroute` ([#13092](https://github.com/sveltejs/kit/pull/13092)) + + +- fix: support absolute URLs and reroutes with `data-sveltekit-preload-code="viewport"` ([#12217](https://github.com/sveltejs/kit/pull/12217)) + + +- fix: use current `window.fetch` for server load fetch requests ([#13315](https://github.com/sveltejs/kit/pull/13315)) + + +- fix: resolve symlinks when handling routes ([#12740](https://github.com/sveltejs/kit/pull/12740)) + + +- fix: prevent infinite reload when using the hash router and previewing `/index.html` ([#13296](https://github.com/sveltejs/kit/pull/13296)) + + +- fix: service worker base path in dev mode ([#12577](https://github.com/sveltejs/kit/pull/12577)) + + +- chore: error during development when using `use:enhance` with `+server` ([#13197](https://github.com/sveltejs/kit/pull/13197)) + + +- chore: add most common status codes to `redirect()` JS documentation ([#13301](https://github.com/sveltejs/kit/pull/13301)) + + +- fix: correctly link to assets inlined by the `inlineStyleThreshold` option ([#13068](https://github.com/sveltejs/kit/pull/13068)) + + +- fix: fall back to importing dynamic dependencies relative to SvelteKit package ([#12532](https://github.com/sveltejs/kit/pull/12532)) + + +- fix: use arrow function types over bound funcs ([#12955](https://github.com/sveltejs/kit/pull/12955)) + + +- fix: correctly navigate when hash router is enabled and the browser encodes extra hashes ([#13321](https://github.com/sveltejs/kit/pull/13321)) + ## 2.15.3 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index d7339b433916..4f48c2241278 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.15.3", + "version": "2.16.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index b187e0432143..8bd2e479bb57 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.15.3'; +export const VERSION = '2.16.0'; From 702575ed5aa582f92e3b37b257984299a1d23fbb Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sun, 19 Jan 2025 17:26:50 -0800 Subject: [PATCH 0901/1135] chore: upgrade to vitest 3 (#13330) * chore: upgrade to vitest 3 * increase timeout * more timeout * more * more * more --- packages/adapter-auto/package.json | 2 +- packages/adapter-netlify/package.json | 2 +- packages/adapter-node/package.json | 2 +- packages/adapter-vercel/package.json | 2 +- packages/enhanced-img/package.json | 2 +- packages/kit/package.json | 2 +- .../src/core/sync/write_types/index.spec.js | 2 +- packages/kit/test/build-errors/env.spec.js | 24 +- packages/kit/test/build-errors/package.json | 2 +- .../kit/test/build-errors/prerender.spec.js | 10 +- .../kit/test/build-errors/server-only.spec.js | 18 +- .../test/build-errors/syntax-error.spec.js | 6 +- .../kit/test/prerendering/basics/package.json | 2 +- .../test/prerendering/options/package.json | 2 +- .../test/prerendering/paths-base/package.json | 2 +- pnpm-lock.yaml | 876 +++++++++--------- 16 files changed, 489 insertions(+), 467 deletions(-) diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index 7535be368372..d3930a91865c 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -44,7 +44,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "typescript": "^5.3.3", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "dependencies": { "import-meta-resolve": "^4.1.0" diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 363023025338..6601bdc5e8d9 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -56,7 +56,7 @@ "@types/set-cookie-parser": "^2.4.7", "rollup": "^4.14.2", "typescript": "^5.3.3", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 87cd9366ad69..6f93a6d4a3a6 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -49,7 +49,7 @@ "polka": "^1.0.0-next.28", "sirv": "^3.0.0", "typescript": "^5.3.3", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "dependencies": { "@rollup/plugin-commonjs": "^28.0.1", diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index e3589ce10d26..ee30816395fb 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -48,7 +48,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "typescript": "^5.3.3", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index dd08ac13fcff..a46762d6003e 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -49,7 +49,7 @@ "svelte": "^5.2.9", "typescript": "^5.6.3", "vite": "^6.0.1", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "peerDependencies": { "svelte": "^5.0.0", diff --git a/packages/kit/package.json b/packages/kit/package.json index 4f48c2241278..a8ba2b6c5b87 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -42,7 +42,7 @@ "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", "vite": "^6.0.1", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", diff --git a/packages/kit/src/core/sync/write_types/index.spec.js b/packages/kit/src/core/sync/write_types/index.spec.js index 6aa4de64ea7d..210922514089 100644 --- a/packages/kit/src/core/sync/write_types/index.spec.js +++ b/packages/kit/src/core/sync/write_types/index.spec.js @@ -29,7 +29,7 @@ function run_test(dir) { write_all_types(initial, manifest); } -test('Creates correct $types', () => { +test('Creates correct $types', { timeout: 6000 }, () => { // To save us from creating a real SvelteKit project for each of the tests, // we first run the type generation directly for each test case, and then // call `tsc` to check that the generated types are valid. diff --git a/packages/kit/test/build-errors/env.spec.js b/packages/kit/test/build-errors/env.spec.js index c0c897d11b74..64d21150f85a 100644 --- a/packages/kit/test/build-errors/env.spec.js +++ b/packages/kit/test/build-errors/env.spec.js @@ -3,55 +3,57 @@ import { execSync } from 'node:child_process'; import path from 'node:path'; import process from 'node:process'; -test('$env/dynamic/private is not statically importable from the client', () => { +const timeout = 60_000; + +test('$env/dynamic/private is not statically importable from the client', { timeout }, () => { assert.throws( () => execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/private-dynamic-env'), stdio: 'pipe', - timeout: 60000 + timeout }), /.*Cannot import \$env\/dynamic\/private into client-side code:.*/gs ); }); -test('$env/dynamic/private is not dynamically importable from the client', () => { +test('$env/dynamic/private is not dynamically importable from the client', { timeout }, () => { assert.throws( () => execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/private-dynamic-env-dynamic-import'), stdio: 'pipe', - timeout: 60000 + timeout }), /.*Cannot import \$env\/dynamic\/private into client-side code:.*/gs ); }); -test('$env/static/private is not statically importable from the client', () => { +test('$env/static/private is not statically importable from the client', { timeout }, () => { assert.throws( () => execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/private-static-env'), stdio: 'pipe', - timeout: 60000 + timeout }), /.*Cannot import \$env\/static\/private into client-side code:.*/gs ); }); -test('$env/static/private is not dynamically importable from the client', () => { +test('$env/static/private is not dynamically importable from the client', { timeout }, () => { assert.throws( () => execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/private-static-env-dynamic-import'), stdio: 'pipe', - timeout: 60000 + timeout }), /.*Cannot import \$env\/static\/private into client-side code:.*/gs ); }); -test('$env/dynamic/private is not importable from the service worker', () => { +test('$env/dynamic/private is not importable from the service worker', { timeout }, () => { assert.throws( () => execSync('pnpm build', { @@ -63,13 +65,13 @@ test('$env/dynamic/private is not importable from the service worker', () => { ); }); -test('$env/dynamic/public is not importable from the service worker', () => { +test('$env/dynamic/public is not importable from the service worker', { timeout }, () => { assert.throws( () => execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/service-worker-dynamic-public-env'), stdio: 'pipe', - timeout: 60000 + timeout }), /.*Cannot import \$env\/dynamic\/public into service-worker code.*/gs ); diff --git a/packages/kit/test/build-errors/package.json b/packages/kit/test/build-errors/package.json index 1a10dab30e56..cda1f114aac0 100644 --- a/packages/kit/test/build-errors/package.json +++ b/packages/kit/test/build-errors/package.json @@ -8,6 +8,6 @@ }, "type": "module", "devDependencies": { - "vitest": "^2.1.6" + "vitest": "^3.0.1" } } diff --git a/packages/kit/test/build-errors/prerender.spec.js b/packages/kit/test/build-errors/prerender.spec.js index fc4d683a7901..0bda6a070781 100644 --- a/packages/kit/test/build-errors/prerender.spec.js +++ b/packages/kit/test/build-errors/prerender.spec.js @@ -4,25 +4,27 @@ import path from 'node:path'; import { EOL } from 'node:os'; import process from 'node:process'; -test('prerenderable routes must be prerendered', () => { +const timeout = 60_000; + +test('prerenderable routes must be prerendered', { timeout }, () => { assert.throws( () => execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/prerenderable-not-prerendered'), stdio: 'pipe', - timeout: 60000 + timeout }), /The following routes were marked as prerenderable, but were not prerendered because they were not found while crawling your app:\r?\n {2}- \/\[x\]/gs ); }); -test('entry generators should match their own route', () => { +test('entry generators should match their own route', { timeout }, () => { assert.throws( () => execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/prerender-entry-generator-mismatch'), stdio: 'pipe', - timeout: 60000 + timeout }), `Error: The entries export from /[slug]/[notSpecific] generated entry /whatever/specific, which was matched by /[slug]/specific - see the \`handleEntryGeneratorMismatch\` option in https://svelte.dev/docs/kit/configuration#prerender for more info.${EOL}To suppress or handle this error, implement \`handleEntryGeneratorMismatch\` in https://svelte.dev/docs/kit/configuration#prerender` ); diff --git a/packages/kit/test/build-errors/server-only.spec.js b/packages/kit/test/build-errors/server-only.spec.js index ec63de1313bd..987d2a0ea5a4 100644 --- a/packages/kit/test/build-errors/server-only.spec.js +++ b/packages/kit/test/build-errors/server-only.spec.js @@ -3,12 +3,14 @@ import { execSync } from 'node:child_process'; import path from 'node:path'; import process from 'node:process'; -test('$lib/*.server.* is not statically importable from the client', () => { +const timeout = 60_000; + +test('$lib/*.server.* is not statically importable from the client', { timeout }, () => { try { execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/server-only-module'), stdio: 'pipe', - timeout: 60000 + timeout }); } catch (err) { assert.ok( @@ -20,12 +22,12 @@ test('$lib/*.server.* is not statically importable from the client', () => { throw new Error(); }); -test('$lib/*.server.* is not dynamically importable from the client', () => { +test('$lib/*.server.* is not dynamically importable from the client', { timeout }, () => { try { execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/server-only-module-dynamic-import'), stdio: 'pipe', - timeout: 60000 + timeout }); } catch (err) { assert.ok( @@ -37,12 +39,12 @@ test('$lib/*.server.* is not dynamically importable from the client', () => { throw new Error(); }); -test('$lib/server/* is not statically importable from the client', () => { +test('$lib/server/* is not statically importable from the client', { timeout }, () => { try { execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/server-only-folder'), stdio: 'pipe', - timeout: 60000 + timeout }); } catch (err) { assert.ok( @@ -54,12 +56,12 @@ test('$lib/server/* is not statically importable from the client', () => { throw new Error(); }); -test('$lib/server/* is not dynamically importable from the client', () => { +test('$lib/server/* is not dynamically importable from the client', { timeout }, () => { try { execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/server-only-folder-dynamic-import'), stdio: 'pipe', - timeout: 60000 + timeout }); } catch (err) { assert.ok( diff --git a/packages/kit/test/build-errors/syntax-error.spec.js b/packages/kit/test/build-errors/syntax-error.spec.js index c32ec27d2b61..999fcd35f4ad 100644 --- a/packages/kit/test/build-errors/syntax-error.spec.js +++ b/packages/kit/test/build-errors/syntax-error.spec.js @@ -3,12 +3,14 @@ import { execSync } from 'node:child_process'; import path from 'node:path'; import process from 'node:process'; -test('$lib/*.server.* is not statically importable from the client', () => { +const timeout = 60_000; + +test('$lib/*.server.* is not statically importable from the client', { timeout }, () => { try { execSync('pnpm build', { cwd: path.join(process.cwd(), 'apps/syntax-error'), stdio: 'pipe', - timeout: 60000 + timeout }); } catch (err) { assert.ok( diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index 0b14e85ec19c..a0b573ede480 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -17,7 +17,7 @@ "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "type": "module" } diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index e9f9b5be82e4..484927908260 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -16,7 +16,7 @@ "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "type": "module" } diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index 7a09ce50a317..a2215e7d379c 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -16,7 +16,7 @@ "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.1", - "vitest": "^2.1.6" + "vitest": "^3.0.1" }, "type": "module" } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index aee018de1039..0db7e238b763 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -52,8 +52,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-cloudflare: dependencies: @@ -62,7 +62,7 @@ importers: version: 4.20241205.0 esbuild: specifier: ^0.24.0 - version: 0.24.0 + version: 0.24.2 worktop: specifier: 0.8.0-next.18 version: 0.8.0-next.18 @@ -93,7 +93,7 @@ importers: version: 2.2.5 esbuild: specifier: ^0.24.0 - version: 0.24.0 + version: 0.24.2 wrangler: specifier: ^3.28.4 version: 3.94.0(@cloudflare/workers-types@4.20241205.0) @@ -118,7 +118,7 @@ importers: version: 2.2.5 esbuild: specifier: ^0.24.0 - version: 0.24.0 + version: 0.24.2 set-cookie-parser: specifier: ^2.6.0 version: 2.6.0 @@ -128,19 +128,19 @@ importers: version: 3.0.0 '@rollup/plugin-commonjs': specifier: ^28.0.1 - version: 28.0.1(rollup@4.27.4) + version: 28.0.1(rollup@4.30.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.27.4) + version: 6.1.0(rollup@4.30.1) '@rollup/plugin-node-resolve': specifier: ^16.0.0 - version: 16.0.0(rollup@4.27.4) + version: 16.0.0(rollup@4.30.1) '@sveltejs/kit': specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -149,28 +149,28 @@ importers: version: 2.4.7 rollup: specifier: ^4.14.2 - version: 4.27.4 + version: 4.30.1 typescript: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-node: dependencies: '@rollup/plugin-commonjs': specifier: ^28.0.1 - version: 28.0.1(rollup@4.27.4) + version: 28.0.1(rollup@4.30.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.27.4) + version: 6.1.0(rollup@4.30.1) '@rollup/plugin-node-resolve': specifier: ^16.0.0 - version: 16.0.0(rollup@4.27.4) + version: 16.0.0(rollup@4.30.1) rollup: specifier: ^4.9.5 - version: 4.27.4 + version: 4.30.1 devDependencies: '@polka/url': specifier: ^1.0.0-next.28 @@ -180,7 +180,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -194,8 +194,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static: devDependencies: @@ -207,7 +207,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -222,7 +222,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/prerendered: devDependencies: @@ -231,7 +231,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -240,7 +240,7 @@ importers: version: 5.2.9 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/spa: devDependencies: @@ -252,7 +252,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -261,23 +261,23 @@ importers: version: 5.2.9 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-vercel: dependencies: '@vercel/nft': specifier: ^0.29.0 - version: 0.29.0(rollup@4.27.4) + version: 0.29.0(rollup@4.30.1) esbuild: specifier: ^0.24.0 - version: 0.24.0 + version: 0.24.2 devDependencies: '@sveltejs/kit': specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -285,8 +285,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/amp: dependencies: @@ -304,7 +304,7 @@ importers: dependencies: magic-string: specifier: ^0.30.5 - version: 0.30.14 + version: 0.30.17 sharp: specifier: ^0.33.5 version: 0.33.5 @@ -313,7 +313,7 @@ importers: version: 0.1.5(svelte@5.2.9) vite-imagetools: specifier: ^7.0.1 - version: 7.0.1(rollup@4.27.4) + version: 7.0.1(rollup@4.30.1) zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -326,7 +326,7 @@ importers: version: 18.19.50 rollup: specifier: ^4.27.4 - version: 4.27.4 + version: 4.30.1 svelte: specifier: ^5.2.9 version: 5.2.9 @@ -335,10 +335,10 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit: dependencies: @@ -362,7 +362,7 @@ importers: version: 4.1.5 magic-string: specifier: ^0.30.5 - version: 0.30.14 + version: 0.30.17 mrmime: specifier: ^2.0.0 version: 2.0.0 @@ -381,7 +381,7 @@ importers: version: 1.44.1 '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/connect': specifier: ^3.4.38 version: 3.4.38 @@ -396,22 +396,22 @@ importers: version: 0.5.4(typescript@5.6.3) rollup: specifier: ^4.14.2 - version: 4.27.4 + version: 4.30.1 svelte: specifier: ^5.2.9 version: 5.2.9 svelte-preprocess: specifier: ^6.0.0 - version: 6.0.0(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@5.2.9)(typescript@5.6.3) + version: 6.0.0(postcss-load-config@3.1.4(postcss@8.5.1))(postcss@8.5.1)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.3.3 version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/amp: devDependencies: @@ -423,7 +423,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -441,7 +441,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/basics: devDependencies: @@ -450,7 +450,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -465,7 +465,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/dev-only: devDependencies: @@ -474,7 +474,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -519,7 +519,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/embed: devDependencies: @@ -528,7 +528,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -543,7 +543,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/hash-based-routing: devDependencies: @@ -552,7 +552,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -567,7 +567,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/no-ssr: devDependencies: @@ -576,7 +576,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -591,7 +591,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options: devDependencies: @@ -603,7 +603,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -618,7 +618,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options-2: devDependencies: @@ -630,7 +630,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -645,7 +645,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/writes: devDependencies: @@ -654,7 +654,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -669,13 +669,13 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors: devDependencies: vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch: devDependencies: @@ -687,7 +687,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -699,7 +699,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment: devDependencies: @@ -711,7 +711,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -723,7 +723,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-not-prerendered: devDependencies: @@ -735,7 +735,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -747,7 +747,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env: devDependencies: @@ -756,7 +756,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -768,7 +768,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import: devDependencies: @@ -777,7 +777,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -789,7 +789,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env: devDependencies: @@ -798,7 +798,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -813,7 +813,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env-dynamic-import: devDependencies: @@ -822,7 +822,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -834,7 +834,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder: devDependencies: @@ -843,7 +843,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -855,7 +855,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder-dynamic-import: devDependencies: @@ -864,7 +864,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -876,7 +876,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module: devDependencies: @@ -885,7 +885,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -897,7 +897,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module-dynamic-import: devDependencies: @@ -906,7 +906,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -918,7 +918,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-dynamic-public-env: devDependencies: @@ -927,7 +927,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -939,7 +939,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-private-env: devDependencies: @@ -948,7 +948,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -960,7 +960,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/syntax-error: devDependencies: @@ -969,7 +969,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -981,7 +981,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/basics: devDependencies: @@ -990,7 +990,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -1002,10 +1002,10 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/options: devDependencies: @@ -1014,7 +1014,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -1026,10 +1026,10 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/paths-base: devDependencies: @@ -1038,7 +1038,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -1050,10 +1050,10 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^2.1.6 - version: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.0.1 + version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/package: dependencies: @@ -1075,7 +1075,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1090,7 +1090,7 @@ importers: version: 5.2.9 svelte-preprocess: specifier: ^6.0.0 - version: 6.0.0(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@5.2.9)(typescript@5.6.3) + version: 6.0.0(postcss-load-config@3.1.4(postcss@8.5.1))(postcss@8.5.1)(svelte@5.2.9)(typescript@5.6.3) typescript: specifier: ^5.3.3 version: 5.6.3 @@ -1135,7 +1135,7 @@ importers: version: link:../../packages/package '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) prettier: specifier: ^3.3.2 version: 3.3.3 @@ -1156,7 +1156,7 @@ importers: version: 5.6.3 vite: specifier: ^6.0.1 - version: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) packages: @@ -1288,8 +1288,8 @@ packages: peerDependencies: esbuild: '*' - '@esbuild/aix-ppc64@0.24.0': - resolution: {integrity: sha512-WtKdFM7ls47zkKHFVzMz8opM7LkcsIp9amDUBIAWirg70RM71WRSjdILPsY5Uv1D42ZpUfaPILDlfactHgsRkw==} + '@esbuild/aix-ppc64@0.24.2': + resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] @@ -1300,8 +1300,8 @@ packages: cpu: [arm64] os: [android] - '@esbuild/android-arm64@0.24.0': - resolution: {integrity: sha512-Vsm497xFM7tTIPYK9bNTYJyF/lsP590Qc1WxJdlB6ljCbdZKU9SY8i7+Iin4kyhV/KV5J2rOKsBQbB77Ab7L/w==} + '@esbuild/android-arm64@0.24.2': + resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] @@ -1312,8 +1312,8 @@ packages: cpu: [arm] os: [android] - '@esbuild/android-arm@0.24.0': - resolution: {integrity: sha512-arAtTPo76fJ/ICkXWetLCc9EwEHKaeya4vMrReVlEIUCAUncH7M4bhMQ+M9Vf+FFOZJdTNMXNBrWwW+OXWpSew==} + '@esbuild/android-arm@0.24.2': + resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] @@ -1324,8 +1324,8 @@ packages: cpu: [x64] os: [android] - '@esbuild/android-x64@0.24.0': - resolution: {integrity: sha512-t8GrvnFkiIY7pa7mMgJd7p8p8qqYIz1NYiAoKc75Zyv73L3DZW++oYMSHPRarcotTKuSs6m3hTOa5CKHaS02TQ==} + '@esbuild/android-x64@0.24.2': + resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] @@ -1336,8 +1336,8 @@ packages: cpu: [arm64] os: [darwin] - '@esbuild/darwin-arm64@0.24.0': - resolution: {integrity: sha512-CKyDpRbK1hXwv79soeTJNHb5EiG6ct3efd/FTPdzOWdbZZfGhpbcqIpiD0+vwmpu0wTIL97ZRPZu8vUt46nBSw==} + '@esbuild/darwin-arm64@0.24.2': + resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] @@ -1348,8 +1348,8 @@ packages: cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.24.0': - resolution: {integrity: sha512-rgtz6flkVkh58od4PwTRqxbKH9cOjaXCMZgWD905JOzjFKW+7EiUObfd/Kav+A6Gyud6WZk9w+xu6QLytdi2OA==} + '@esbuild/darwin-x64@0.24.2': + resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] @@ -1360,8 +1360,8 @@ packages: cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-arm64@0.24.0': - resolution: {integrity: sha512-6Mtdq5nHggwfDNLAHkPlyLBpE5L6hwsuXZX8XNmHno9JuL2+bg2BX5tRkwjyfn6sKbxZTq68suOjgWqCicvPXA==} + '@esbuild/freebsd-arm64@0.24.2': + resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] @@ -1372,8 +1372,8 @@ packages: cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.0': - resolution: {integrity: sha512-D3H+xh3/zphoX8ck4S2RxKR6gHlHDXXzOf6f/9dbFt/NRBDIE33+cVa49Kil4WUjxMGW0ZIYBYtaGCa2+OsQwQ==} + '@esbuild/freebsd-x64@0.24.2': + resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] @@ -1384,8 +1384,8 @@ packages: cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.24.0': - resolution: {integrity: sha512-TDijPXTOeE3eaMkRYpcy3LarIg13dS9wWHRdwYRnzlwlA370rNdZqbcp0WTyyV/k2zSxfko52+C7jU5F9Tfj1g==} + '@esbuild/linux-arm64@0.24.2': + resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] @@ -1396,8 +1396,8 @@ packages: cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.24.0': - resolution: {integrity: sha512-gJKIi2IjRo5G6Glxb8d3DzYXlxdEj2NlkixPsqePSZMhLudqPhtZ4BUrpIuTjJYXxvF9njql+vRjB2oaC9XpBw==} + '@esbuild/linux-arm@0.24.2': + resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] @@ -1408,8 +1408,8 @@ packages: cpu: [ia32] os: [linux] - '@esbuild/linux-ia32@0.24.0': - resolution: {integrity: sha512-K40ip1LAcA0byL05TbCQ4yJ4swvnbzHscRmUilrmP9Am7//0UjPreh4lpYzvThT2Quw66MhjG//20mrufm40mA==} + '@esbuild/linux-ia32@0.24.2': + resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] @@ -1420,8 +1420,8 @@ packages: cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.24.0': - resolution: {integrity: sha512-0mswrYP/9ai+CU0BzBfPMZ8RVm3RGAN/lmOMgW4aFUSOQBjA31UP8Mr6DDhWSuMwj7jaWOT0p0WoZ6jeHhrD7g==} + '@esbuild/linux-loong64@0.24.2': + resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] @@ -1432,8 +1432,8 @@ packages: cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.24.0': - resolution: {integrity: sha512-hIKvXm0/3w/5+RDtCJeXqMZGkI2s4oMUGj3/jM0QzhgIASWrGO5/RlzAzm5nNh/awHE0A19h/CvHQe6FaBNrRA==} + '@esbuild/linux-mips64el@0.24.2': + resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] @@ -1444,8 +1444,8 @@ packages: cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.24.0': - resolution: {integrity: sha512-HcZh5BNq0aC52UoocJxaKORfFODWXZxtBaaZNuN3PUX3MoDsChsZqopzi5UupRhPHSEHotoiptqikjN/B77mYQ==} + '@esbuild/linux-ppc64@0.24.2': + resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] @@ -1456,8 +1456,8 @@ packages: cpu: [riscv64] os: [linux] - '@esbuild/linux-riscv64@0.24.0': - resolution: {integrity: sha512-bEh7dMn/h3QxeR2KTy1DUszQjUrIHPZKyO6aN1X4BCnhfYhuQqedHaa5MxSQA/06j3GpiIlFGSsy1c7Gf9padw==} + '@esbuild/linux-riscv64@0.24.2': + resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] @@ -1468,8 +1468,8 @@ packages: cpu: [s390x] os: [linux] - '@esbuild/linux-s390x@0.24.0': - resolution: {integrity: sha512-ZcQ6+qRkw1UcZGPyrCiHHkmBaj9SiCD8Oqd556HldP+QlpUIe2Wgn3ehQGVoPOvZvtHm8HPx+bH20c9pvbkX3g==} + '@esbuild/linux-s390x@0.24.2': + resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] @@ -1480,26 +1480,32 @@ packages: cpu: [x64] os: [linux] - '@esbuild/linux-x64@0.24.0': - resolution: {integrity: sha512-vbutsFqQ+foy3wSSbmjBXXIJ6PL3scghJoM8zCL142cGaZKAdCZHyf+Bpu/MmX9zT9Q0zFBVKb36Ma5Fzfa8xA==} + '@esbuild/linux-x64@0.24.2': + resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/netbsd-arm64@0.24.2': + resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.17.19': resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} engines: {node: '>=12'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.0': - resolution: {integrity: sha512-hjQ0R/ulkO8fCYFsG0FZoH+pWgTTDreqpqY7UnQntnaKv95uP5iW3+dChxnx7C3trQQU40S+OgWhUVwCjVFLvg==} + '@esbuild/netbsd-x64@0.24.2': + resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.0': - resolution: {integrity: sha512-MD9uzzkPQbYehwcN583yx3Tu5M8EIoTD+tUgKF982WYL9Pf5rKy9ltgD0eUgs8pvKnmizxjXZyLt0z6DC3rRXg==} + '@esbuild/openbsd-arm64@0.24.2': + resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] @@ -1510,8 +1516,8 @@ packages: cpu: [x64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.0': - resolution: {integrity: sha512-4ir0aY1NGUhIC1hdoCzr1+5b43mw99uNwVzhIq1OY3QcEwPDO3B7WNXBzaKY5Nsf1+N11i1eOfFcq+D/gOS15Q==} + '@esbuild/openbsd-x64@0.24.2': + resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] @@ -1522,8 +1528,8 @@ packages: cpu: [x64] os: [sunos] - '@esbuild/sunos-x64@0.24.0': - resolution: {integrity: sha512-jVzdzsbM5xrotH+W5f1s+JtUy1UWgjU0Cf4wMvffTB8m6wP5/kx0KiaLHlbJO+dMgtxKV8RQ/JvtlFcdZ1zCPA==} + '@esbuild/sunos-x64@0.24.2': + resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] @@ -1534,8 +1540,8 @@ packages: cpu: [arm64] os: [win32] - '@esbuild/win32-arm64@0.24.0': - resolution: {integrity: sha512-iKc8GAslzRpBytO2/aN3d2yb2z8XTVfNV0PjGlCxKo5SgWmNXx82I/Q3aG1tFfS+A2igVCY97TJ8tnYwpUWLCA==} + '@esbuild/win32-arm64@0.24.2': + resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] @@ -1546,8 +1552,8 @@ packages: cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.24.0': - resolution: {integrity: sha512-vQW36KZolfIudCcTnaTpmLQ24Ha1RjygBo39/aLkM2kmjkWmZGEJ5Gn9l5/7tzXA42QGIoWbICfg6KLLkIw6yw==} + '@esbuild/win32-ia32@0.24.2': + resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] @@ -1558,8 +1564,8 @@ packages: cpu: [x64] os: [win32] - '@esbuild/win32-x64@0.24.0': - resolution: {integrity: sha512-7IAFPrjSQIJrGsK6flwg7NFmwBoSTyF3rl7If0hNUFQU4ilTsEPL6GuMuU9BfIWVVGuRnuIidkSMC+c0Otu8IA==} + '@esbuild/win32-x64@0.24.2': + resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -1832,93 +1838,98 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.27.4': - resolution: {integrity: sha512-2Y3JT6f5MrQkICUyRVCw4oa0sutfAsgaSsb0Lmmy1Wi2y7X5vT9Euqw4gOsCyy0YfKURBg35nhUKZS4mDcfULw==} + '@rollup/rollup-android-arm-eabi@4.30.1': + resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.27.4': - resolution: {integrity: sha512-wzKRQXISyi9UdCVRqEd0H4cMpzvHYt1f/C3CoIjES6cG++RHKhrBj2+29nPF0IB5kpy9MS71vs07fvrNGAl/iA==} + '@rollup/rollup-android-arm64@4.30.1': + resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.27.4': - resolution: {integrity: sha512-PlNiRQapift4LNS8DPUHuDX/IdXiLjf8mc5vdEmUR0fF/pyy2qWwzdLjB+iZquGr8LuN4LnUoSEvKRwjSVYz3Q==} + '@rollup/rollup-darwin-arm64@4.30.1': + resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.27.4': - resolution: {integrity: sha512-o9bH2dbdgBDJaXWJCDTNDYa171ACUdzpxSZt+u/AAeQ20Nk5x+IhA+zsGmrQtpkLiumRJEYef68gcpn2ooXhSQ==} + '@rollup/rollup-darwin-x64@4.30.1': + resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.27.4': - resolution: {integrity: sha512-NBI2/i2hT9Q+HySSHTBh52da7isru4aAAo6qC3I7QFVsuhxi2gM8t/EI9EVcILiHLj1vfi+VGGPaLOUENn7pmw==} + '@rollup/rollup-freebsd-arm64@4.30.1': + resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.27.4': - resolution: {integrity: sha512-wYcC5ycW2zvqtDYrE7deary2P2UFmSh85PUpAx+dwTCO9uw3sgzD6Gv9n5X4vLaQKsrfTSZZ7Z7uynQozPVvWA==} + '@rollup/rollup-freebsd-x64@4.30.1': + resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': - resolution: {integrity: sha512-9OwUnK/xKw6DyRlgx8UizeqRFOfi9mf5TYCw1uolDaJSbUmBxP85DE6T4ouCMoN6pXw8ZoTeZCSEfSaYo+/s1w==} + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.27.4': - resolution: {integrity: sha512-Vgdo4fpuphS9V24WOV+KwkCVJ72u7idTgQaBoLRD0UxBAWTF9GWurJO9YD9yh00BzbkhpeXtm6na+MvJU7Z73A==} + '@rollup/rollup-linux-arm-musleabihf@4.30.1': + resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.27.4': - resolution: {integrity: sha512-pleyNgyd1kkBkw2kOqlBx+0atfIIkkExOTiifoODo6qKDSpnc6WzUY5RhHdmTdIJXBdSnh6JknnYTtmQyobrVg==} + '@rollup/rollup-linux-arm64-gnu@4.30.1': + resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.27.4': - resolution: {integrity: sha512-caluiUXvUuVyCHr5DxL8ohaaFFzPGmgmMvwmqAITMpV/Q+tPoaHZ/PWa3t8B2WyoRcIIuu1hkaW5KkeTDNSnMA==} + '@rollup/rollup-linux-arm64-musl@4.30.1': + resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': - resolution: {integrity: sha512-FScrpHrO60hARyHh7s1zHE97u0KlT/RECzCKAdmI+LEoC1eDh/RDji9JgFqyO+wPDb86Oa/sXkily1+oi4FzJQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + cpu: [loong64] + os: [linux] + + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.27.4': - resolution: {integrity: sha512-qyyprhyGb7+RBfMPeww9FlHwKkCXdKHeGgSqmIXw9VSUtvyFZ6WZRtnxgbuz76FK7LyoN8t/eINRbPUcvXB5fw==} + '@rollup/rollup-linux-riscv64-gnu@4.30.1': + resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.27.4': - resolution: {integrity: sha512-PFz+y2kb6tbh7m3A7nA9++eInGcDVZUACulf/KzDtovvdTizHpZaJty7Gp0lFwSQcrnebHOqxF1MaKZd7psVRg==} + '@rollup/rollup-linux-s390x-gnu@4.30.1': + resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.27.4': - resolution: {integrity: sha512-Ni8mMtfo+o/G7DVtweXXV/Ol2TFf63KYjTtoZ5f078AUgJTmaIJnj4JFU7TK/9SVWTaSJGxPi5zMDgK4w+Ez7Q==} + '@rollup/rollup-linux-x64-gnu@4.30.1': + resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.27.4': - resolution: {integrity: sha512-5AeeAF1PB9TUzD+3cROzFTnAJAcVUGLuR8ng0E0WXGkYhp6RD6L+6szYVX+64Rs0r72019KHZS1ka1q+zU/wUw==} + '@rollup/rollup-linux-x64-musl@4.30.1': + resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.27.4': - resolution: {integrity: sha512-yOpVsA4K5qVwu2CaS3hHxluWIK5HQTjNV4tWjQXluMiiiu4pJj4BN98CvxohNCpcjMeTXk/ZMJBRbgRg8HBB6A==} + '@rollup/rollup-win32-arm64-msvc@4.30.1': + resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.27.4': - resolution: {integrity: sha512-KtwEJOaHAVJlxV92rNYiG9JQwQAdhBlrjNRp7P9L8Cb4Rer3in+0A+IPhJC9y68WAi9H0sX4AiG2NTsVlmqJeQ==} + '@rollup/rollup-win32-ia32-msvc@4.30.1': + resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.27.4': - resolution: {integrity: sha512-3j4jx1TppORdTAoBJRd+/wJRGCPC0ETWkXOecJ6PPZLj6SptXkrXcNqdj0oclbKML6FkQltdz7bBA3rUSirZug==} + '@rollup/rollup-win32-x64-msvc@4.30.1': + resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} cpu: [x64] os: [win32] @@ -2056,11 +2067,11 @@ packages: engines: {node: '>=18'} hasBin: true - '@vitest/expect@2.1.6': - resolution: {integrity: sha512-9M1UR9CAmrhJOMoSwVnPh2rELPKhYo0m/CSgqw9PyStpxtkwhmdM6XYlXGKeYyERY1N6EIuzkQ7e3Lm1WKCoUg==} + '@vitest/expect@3.0.1': + resolution: {integrity: sha512-oPrXe8dwvQdzUxQFWwibY97/smQ6k8iPVeSf09KEvU1yWzu40G6naHExY0lUgjnTPWMRGQOJnhMBb8lBu48feg==} - '@vitest/mocker@2.1.6': - resolution: {integrity: sha512-MHZp2Z+Q/A3am5oD4WSH04f9B0T7UvwEb+v5W0kCYMhtXGYbdyl2NUk1wdSMqGthmhpiThPDp/hEoVwu16+u1A==} + '@vitest/mocker@3.0.1': + resolution: {integrity: sha512-5letLsVdFhReCPws/SNwyekBCyi4w2IusycV4T7eVdt2mfellS2yKDrEmnE5KPCHr0Ez5xCZVJbJws3ckuNNgQ==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -2070,20 +2081,20 @@ packages: vite: optional: true - '@vitest/pretty-format@2.1.6': - resolution: {integrity: sha512-exZyLcEnHgDMKc54TtHca4McV4sKT+NKAe9ix/yhd/qkYb/TP8HTyXRFDijV19qKqTZM0hPL4753zU/U8L/gAA==} + '@vitest/pretty-format@3.0.1': + resolution: {integrity: sha512-FnyGQ9eFJ/Dnqg3jCvq9O6noXtxbZhOlSvNLZsCGJxhsGiZ5LDepmsTCizRfyGJt4Q6pJmZtx7rO/qqr9R9gDA==} - '@vitest/runner@2.1.6': - resolution: {integrity: sha512-SjkRGSFyrA82m5nz7To4CkRSEVWn/rwQISHoia/DB8c6IHIhaE/UNAo+7UfeaeJRE979XceGl00LNkIz09RFsA==} + '@vitest/runner@3.0.1': + resolution: {integrity: sha512-LfVbbYOduTVx8PnYFGH98jpgubHBefIppbPQJBSlgjnRRlaX/KR6J46htECUHpf+ElJZ4xxssAfEz/Cb2iIMYA==} - '@vitest/snapshot@2.1.6': - resolution: {integrity: sha512-5JTWHw8iS9l3v4/VSuthCndw1lN/hpPB+mlgn1BUhFbobeIUj1J1V/Bj2t2ovGEmkXLTckFjQddsxS5T6LuVWw==} + '@vitest/snapshot@3.0.1': + resolution: {integrity: sha512-ZYV+iw2lGyc4QY2xt61b7Y3NJhSAO7UWcYWMcV0UnMrkXa8hXtfZES6WAk4g7Jr3p4qJm1P0cgDcOFyY5me+Ug==} - '@vitest/spy@2.1.6': - resolution: {integrity: sha512-oTFObV8bd4SDdRka5O+mSh5w9irgx5IetrD5i+OsUUsk/shsBoHifwCzy45SAORzAhtNiprUVaK3hSCCzZh1jQ==} + '@vitest/spy@3.0.1': + resolution: {integrity: sha512-HnGJB3JFflnlka4u7aD0CfqrEtX3FgNaZAar18/KIhfo0r/WADn9PhBfiqAmNw4R/xaRcLzLPFXDwEQV1vHlJA==} - '@vitest/utils@2.1.6': - resolution: {integrity: sha512-ixNkFy3k4vokOUTU2blIUvOgKq/N2PW8vKIjZZYsGJCMX69MRa9J2sKqX5hY/k5O5Gty3YJChepkqZ3KM9LyIQ==} + '@vitest/utils@3.0.1': + resolution: {integrity: sha512-i+Gm61rfIeSitPUsu4ZcWqucfb18ShAanRpOG6KlXfd1j6JVK5XxO2Z6lEmfjMnAQRIvvLtJ3JByzDTv347e8w==} abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} @@ -2288,8 +2299,8 @@ packages: date-fns@4.1.0: resolution: {integrity: sha512-Ukq0owbQXxa/U3EGtsdVBkR1w7KOQ5gIBqdH2hkvknzZPYvBxb/aa6E8L7tmjFtkwZBu3UXBbjIgPo/Ez4xaNg==} - debug@4.3.7: - resolution: {integrity: sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==} + debug@4.4.0: + resolution: {integrity: sha512-6WTZ/IxCY/T6BALoZHaE4ctp9xm+Z5kY/pzYaCHRFeyVhojxlrm+46y68HA6hr0TcwEssoxNiDEUJQjfPZ/RYA==} engines: {node: '>=6.0'} peerDependencies: supports-color: '*' @@ -2375,16 +2386,16 @@ packages: resolution: {integrity: sha512-rRqJg/6gd538VHvR3PSrdRBb/1Vy2YfzHqzvbhGIQpDRKIa4FgV/54b5Q1xYSxOOwKvjXweS26E0Q+nAMwp2pQ==} engines: {node: '>=8.6'} - es-module-lexer@1.5.4: - resolution: {integrity: sha512-MVNK56NiMrOwitFB7cqDwq0CQutbw+0BvLshJSse0MUNU+y1FC3bUS/AQg7oUng+/wKrrki7JfmwtVHkVfPLlw==} + es-module-lexer@1.6.0: + resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} esbuild@0.17.19: resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} engines: {node: '>=12'} hasBin: true - esbuild@0.24.0: - resolution: {integrity: sha512-FuLPevChGDshgSicjisSooU0cemp/sGXR841D5LHMB7mTVOmsEHcAxaH3irL53+8YDIeVNQEySh4DaYU/iuPqQ==} + esbuild@0.24.2: + resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} hasBin: true @@ -2447,9 +2458,6 @@ packages: engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true - esm-env@1.2.1: - resolution: {integrity: sha512-U9JedYYjCnadUlXk7e1Kr+aENQhtUaoaV9+gZm1T8LC/YBAPJx3NSPIAurFOC0U5vrdSevnUJS2/wUVxGwPhng==} - esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} @@ -2866,8 +2874,8 @@ packages: magic-string@0.25.9: resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.14: - resolution: {integrity: sha512-5c99P1WKTed11ZC0HMJOj6CDIue6F8ySu+bJL+85q1zBEIY8IklrJ1eiKC2NDRh3Ct3FcvmJPyQHb9erXMTJNw==} + magic-string@0.30.17: + resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} merge2@1.4.1: resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} @@ -3007,9 +3015,6 @@ packages: package-json-from-dist@1.0.1: resolution: {integrity: sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==} - package-manager-detector@0.2.0: - resolution: {integrity: sha512-E385OSk9qDcXhcM9LNSe4sdhx8a9mAPrZ4sMLW+tmxl5ZuGtPUcdFu+MPP2jbgiWAZ6Pfe5soGFMd+0Db5Vrog==} - package-manager-detector@0.2.8: resolution: {integrity: sha512-ts9KSdroZisdvKMWVAVCXiKqnqNfXz4+IbrBG8/BWx/TR5le+jfenvoBuIZ6UWM9nz47W7AbD9qYfAwfWMIwzA==} @@ -3049,6 +3054,9 @@ packages: pathe@1.1.2: resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} + pathe@2.0.1: + resolution: {integrity: sha512-6jpjMpOth5S9ITVu5clZ7NOgHNsv5vRQdheL9ztp2vZmM6fRbLvyua1tiBIL4lk8SAe3ARzeXEly6siXCjDHDw==} + pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} engines: {node: '>= 14.16'} @@ -3110,8 +3118,8 @@ packages: resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} engines: {node: '>=4'} - postcss@8.4.49: - resolution: {integrity: sha512-OCVPnIObs4N29kxTjzLfUryOkvZEq+pf8jTF0lg8E7uETuWHA+v7j3c/xJmiqpX450191LlmZfUKkXxkTry7nA==} + postcss@8.5.1: + resolution: {integrity: sha512-6oz2beyjc5VMn/KV1pPw8fliQkhBXrVn1Z3TVyqZxU8kZpzEKhBdmCFqI6ZbmGtamQvQGuU1sgPTk8ZrXDD7jQ==} engines: {node: ^10 || ^12 || >=14} prelude-ls@1.2.1: @@ -3197,8 +3205,8 @@ packages: rollup-pluginutils@2.8.2: resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.27.4: - resolution: {integrity: sha512-RLKxqHEMjh/RGLsDxAEsaLO3mWgyoU6x9w6n1ikAzet4B3gI2/3yP6PWY2p9QzRTh6MfEIXB3MwsOY0Iv3vNrw==} + rollup@4.30.1: + resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3424,15 +3432,15 @@ packages: resolution: {integrity: sha512-7cR8rLy2QhYHpsBDBVYnnWXm8uRTr38RoZakFSW7Bs7PzfMPNZthuMLkwqZv7MTu8lhQ91cOFYS5a7iFj2oR3w==} engines: {node: '>=4'} - tinyexec@0.3.1: - resolution: {integrity: sha512-WiCJLEECkO18gwqIp6+hJg0//p23HXp4S+gGtAKu3mI2F2/sXC4FvHvXvB0zJVVaTPhx1/tOwdbRsa1sOBIKqQ==} + tinyexec@0.3.2: + resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} - tinyrainbow@1.2.0: - resolution: {integrity: sha512-weEDEq7Z5eTHPDh4xjX789+fHfF+P8boiFB+0vbWzpbnbsEr/GRaohi/uMKxg8RZMXnl1ItAi/IUHWMsjDV7kQ==} + tinyrainbow@2.0.0: + resolution: {integrity: sha512-op4nsTR47R6p0vMUUoYl/a+ljLFVtlfaXkLQmqfLR1qHma1h/ysYk4hEXZ880bf2CYgTskvTa/e196Vd5dDQXw==} engines: {node: '>=14.0.0'} tinyspy@3.0.2: @@ -3520,13 +3528,13 @@ packages: resolution: {integrity: sha512-23jnLhkTH0HR9Vd9LxMYnajOLeo0RJNEAHhtlsQP6kfPuOBoTzt54rWbEWB9jmhEXAOflLQpM+FrmilVPAoyGA==} engines: {node: '>=18.0.0'} - vite-node@2.1.6: - resolution: {integrity: sha512-DBfJY0n9JUwnyLxPSSUmEePT21j8JZp/sR9n+/gBwQU6DcQOioPdb8/pibWfXForbirSagZCilseYIwaL3f95A==} + vite-node@3.0.1: + resolution: {integrity: sha512-PoH9mCNsSZQXl3gdymM5IE4WR0k0WbnFd89nAyyDvltF2jVGdFcI8vpB1PBdKTcjAR7kkYiHSlIO68X/UT8Q1A==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.0.1: - resolution: {integrity: sha512-Ldn6gorLGr4mCdFnmeAOLweJxZ34HjKnDm4HGo6P66IEqTxQb36VEdFJQENKxWjupNfoIjvRUnswjn1hpYEpjQ==} + vite@6.0.7: + resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -3573,15 +3581,15 @@ packages: vite: optional: true - vitest@2.1.6: - resolution: {integrity: sha512-isUCkvPL30J4c5O5hgONeFRsDmlw6kzFEdLQHLezmDdKQHy8Ke/B/dgdTMEgU0vm+iZ0TjW8GuK83DiahBoKWQ==} + vitest@3.0.1: + resolution: {integrity: sha512-SWKoSAkxtFHqt8biR3eN53dzmeWkigEpyipqfblcsoAghVvoFMpxQEj0gc7AajMi6Ra49fjcTN6v4AxklmS4aQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 2.1.6 - '@vitest/ui': 2.1.6 + '@vitest/browser': 3.0.1 + '@vitest/ui': 3.0.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3746,7 +3754,7 @@ snapshots: fs-extra: 7.0.1 mri: 1.2.0 p-limit: 2.3.0 - package-manager-detector: 0.2.0 + package-manager-detector: 0.2.8 picocolors: 1.1.1 resolve-from: 5.0.0 semver: 7.6.3 @@ -3887,142 +3895,145 @@ snapshots: escape-string-regexp: 4.0.0 rollup-plugin-node-polyfills: 0.2.1 - '@esbuild/aix-ppc64@0.24.0': + '@esbuild/aix-ppc64@0.24.2': optional: true '@esbuild/android-arm64@0.17.19': optional: true - '@esbuild/android-arm64@0.24.0': + '@esbuild/android-arm64@0.24.2': optional: true '@esbuild/android-arm@0.17.19': optional: true - '@esbuild/android-arm@0.24.0': + '@esbuild/android-arm@0.24.2': optional: true '@esbuild/android-x64@0.17.19': optional: true - '@esbuild/android-x64@0.24.0': + '@esbuild/android-x64@0.24.2': optional: true '@esbuild/darwin-arm64@0.17.19': optional: true - '@esbuild/darwin-arm64@0.24.0': + '@esbuild/darwin-arm64@0.24.2': optional: true '@esbuild/darwin-x64@0.17.19': optional: true - '@esbuild/darwin-x64@0.24.0': + '@esbuild/darwin-x64@0.24.2': optional: true '@esbuild/freebsd-arm64@0.17.19': optional: true - '@esbuild/freebsd-arm64@0.24.0': + '@esbuild/freebsd-arm64@0.24.2': optional: true '@esbuild/freebsd-x64@0.17.19': optional: true - '@esbuild/freebsd-x64@0.24.0': + '@esbuild/freebsd-x64@0.24.2': optional: true '@esbuild/linux-arm64@0.17.19': optional: true - '@esbuild/linux-arm64@0.24.0': + '@esbuild/linux-arm64@0.24.2': optional: true '@esbuild/linux-arm@0.17.19': optional: true - '@esbuild/linux-arm@0.24.0': + '@esbuild/linux-arm@0.24.2': optional: true '@esbuild/linux-ia32@0.17.19': optional: true - '@esbuild/linux-ia32@0.24.0': + '@esbuild/linux-ia32@0.24.2': optional: true '@esbuild/linux-loong64@0.17.19': optional: true - '@esbuild/linux-loong64@0.24.0': + '@esbuild/linux-loong64@0.24.2': optional: true '@esbuild/linux-mips64el@0.17.19': optional: true - '@esbuild/linux-mips64el@0.24.0': + '@esbuild/linux-mips64el@0.24.2': optional: true '@esbuild/linux-ppc64@0.17.19': optional: true - '@esbuild/linux-ppc64@0.24.0': + '@esbuild/linux-ppc64@0.24.2': optional: true '@esbuild/linux-riscv64@0.17.19': optional: true - '@esbuild/linux-riscv64@0.24.0': + '@esbuild/linux-riscv64@0.24.2': optional: true '@esbuild/linux-s390x@0.17.19': optional: true - '@esbuild/linux-s390x@0.24.0': + '@esbuild/linux-s390x@0.24.2': optional: true '@esbuild/linux-x64@0.17.19': optional: true - '@esbuild/linux-x64@0.24.0': + '@esbuild/linux-x64@0.24.2': + optional: true + + '@esbuild/netbsd-arm64@0.24.2': optional: true '@esbuild/netbsd-x64@0.17.19': optional: true - '@esbuild/netbsd-x64@0.24.0': + '@esbuild/netbsd-x64@0.24.2': optional: true - '@esbuild/openbsd-arm64@0.24.0': + '@esbuild/openbsd-arm64@0.24.2': optional: true '@esbuild/openbsd-x64@0.17.19': optional: true - '@esbuild/openbsd-x64@0.24.0': + '@esbuild/openbsd-x64@0.24.2': optional: true '@esbuild/sunos-x64@0.17.19': optional: true - '@esbuild/sunos-x64@0.24.0': + '@esbuild/sunos-x64@0.24.2': optional: true '@esbuild/win32-arm64@0.17.19': optional: true - '@esbuild/win32-arm64@0.24.0': + '@esbuild/win32-arm64@0.24.2': optional: true '@esbuild/win32-ia32@0.17.19': optional: true - '@esbuild/win32-ia32@0.24.0': + '@esbuild/win32-ia32@0.24.2': optional: true '@esbuild/win32-x64@0.17.19': optional: true - '@esbuild/win32-x64@0.24.0': + '@esbuild/win32-x64@0.24.2': optional: true '@eslint-community/eslint-utils@4.4.1(eslint@9.6.0)': @@ -4035,7 +4046,7 @@ snapshots: '@eslint/config-array@0.17.0': dependencies: '@eslint/object-schema': 2.1.4 - debug: 4.3.7 + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -4043,7 +4054,7 @@ snapshots: '@eslint/eslintrc@3.1.0': dependencies: ajv: 6.12.6 - debug: 4.3.7 + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -4246,94 +4257,97 @@ snapshots: '@publint/pack@0.1.0': {} - '@rollup/plugin-commonjs@28.0.1(rollup@4.27.4)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.30.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.0(picomatch@4.0.2) is-reference: 1.2.1 - magic-string: 0.30.14 + magic-string: 0.30.17 picomatch: 4.0.2 optionalDependencies: - rollup: 4.27.4 + rollup: 4.30.1 - '@rollup/plugin-json@6.1.0(rollup@4.27.4)': + '@rollup/plugin-json@6.1.0(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.30.1) optionalDependencies: - rollup: 4.27.4 + rollup: 4.30.1 - '@rollup/plugin-node-resolve@16.0.0(rollup@4.27.4)': + '@rollup/plugin-node-resolve@16.0.0(rollup@4.30.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.30.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.27.4 + rollup: 4.30.1 - '@rollup/pluginutils@5.1.3(rollup@4.27.4)': + '@rollup/pluginutils@5.1.3(rollup@4.30.1)': dependencies: '@types/estree': 1.0.6 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.27.4 + rollup: 4.30.1 + + '@rollup/rollup-android-arm-eabi@4.30.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.27.4': + '@rollup/rollup-android-arm64@4.30.1': optional: true - '@rollup/rollup-android-arm64@4.27.4': + '@rollup/rollup-darwin-arm64@4.30.1': optional: true - '@rollup/rollup-darwin-arm64@4.27.4': + '@rollup/rollup-darwin-x64@4.30.1': optional: true - '@rollup/rollup-darwin-x64@4.27.4': + '@rollup/rollup-freebsd-arm64@4.30.1': optional: true - '@rollup/rollup-freebsd-arm64@4.27.4': + '@rollup/rollup-freebsd-x64@4.30.1': optional: true - '@rollup/rollup-freebsd-x64@4.27.4': + '@rollup/rollup-linux-arm-gnueabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.27.4': + '@rollup/rollup-linux-arm-musleabihf@4.30.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.27.4': + '@rollup/rollup-linux-arm64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.27.4': + '@rollup/rollup-linux-arm64-musl@4.30.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.27.4': + '@rollup/rollup-linux-loongarch64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.27.4': + '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.27.4': + '@rollup/rollup-linux-riscv64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.27.4': + '@rollup/rollup-linux-s390x-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.27.4': + '@rollup/rollup-linux-x64-gnu@4.30.1': optional: true - '@rollup/rollup-linux-x64-musl@4.27.4': + '@rollup/rollup-linux-x64-musl@4.30.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.27.4': + '@rollup/rollup-win32-arm64-msvc@4.30.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.27.4': + '@rollup/rollup-win32-ia32-msvc@4.30.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.27.4': + '@rollup/rollup-win32-x64-msvc@4.30.1': optional: true '@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0)': @@ -4355,25 +4369,25 @@ snapshots: typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.7 + '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.4.0 svelte: 5.2.9 - vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.3.7 + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 - magic-string: 0.30.14 + magic-string: 0.30.17 svelte: 5.2.9 - vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 1.0.4(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) + vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.4(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) transitivePeerDependencies: - supports-color @@ -4445,7 +4459,7 @@ snapshots: '@typescript-eslint/types': 8.4.0 '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.4.0 - debug: 4.3.7 + debug: 4.4.0 eslint: 9.6.0 optionalDependencies: typescript: 5.6.3 @@ -4461,7 +4475,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) - debug: 4.3.7 + debug: 4.4.0 ts-api-utils: 1.3.0(typescript@5.6.3) optionalDependencies: typescript: 5.6.3 @@ -4475,7 +4489,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.4.0 '@typescript-eslint/visitor-keys': 8.4.0 - debug: 4.3.7 + debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -4502,10 +4516,10 @@ snapshots: '@typescript-eslint/types': 8.4.0 eslint-visitor-keys: 3.4.3 - '@vercel/nft@0.29.0(rollup@4.27.4)': + '@vercel/nft@0.29.0(rollup@4.30.1)': dependencies: '@mapbox/node-pre-gyp': 2.0.0-rc.0 - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.30.1) acorn: 8.14.0 acorn-import-attributes: 1.9.5(acorn@8.14.0) async-sema: 3.1.1 @@ -4521,45 +4535,45 @@ snapshots: - rollup - supports-color - '@vitest/expect@2.1.6': + '@vitest/expect@3.0.1': dependencies: - '@vitest/spy': 2.1.6 - '@vitest/utils': 2.1.6 + '@vitest/spy': 3.0.1 + '@vitest/utils': 3.0.1 chai: 5.1.2 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/mocker@2.1.6(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1))': + '@vitest/mocker@3.0.1(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@vitest/spy': 2.1.6 + '@vitest/spy': 3.0.1 estree-walker: 3.0.3 - magic-string: 0.30.14 + magic-string: 0.30.17 optionalDependencies: - vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) - '@vitest/pretty-format@2.1.6': + '@vitest/pretty-format@3.0.1': dependencies: - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 - '@vitest/runner@2.1.6': + '@vitest/runner@3.0.1': dependencies: - '@vitest/utils': 2.1.6 - pathe: 1.1.2 + '@vitest/utils': 3.0.1 + pathe: 2.0.1 - '@vitest/snapshot@2.1.6': + '@vitest/snapshot@3.0.1': dependencies: - '@vitest/pretty-format': 2.1.6 - magic-string: 0.30.14 - pathe: 1.1.2 + '@vitest/pretty-format': 3.0.1 + magic-string: 0.30.17 + pathe: 2.0.1 - '@vitest/spy@2.1.6': + '@vitest/spy@3.0.1': dependencies: tinyspy: 3.0.2 - '@vitest/utils@2.1.6': + '@vitest/utils@3.0.1': dependencies: - '@vitest/pretty-format': 2.1.6 + '@vitest/pretty-format': 3.0.1 loupe: 3.1.2 - tinyrainbow: 1.2.0 + tinyrainbow: 2.0.0 abbrev@2.0.0: {} @@ -4651,7 +4665,7 @@ snapshots: capnp-ts@0.7.0: dependencies: - debug: 4.3.7 + debug: 4.4.0 tslib: 2.6.2 transitivePeerDependencies: - supports-color @@ -4727,7 +4741,7 @@ snapshots: date-fns@4.1.0: {} - debug@4.3.7: + debug@4.4.0: dependencies: ms: 2.1.3 @@ -4769,7 +4783,7 @@ snapshots: globrex: 0.1.2 kleur: 4.1.5 locate-character: 3.0.0 - magic-string: 0.30.14 + magic-string: 0.30.17 sade: 1.8.1 tiny-glob: 0.2.9 ts-api-utils: 1.3.0(typescript@5.6.3) @@ -4793,7 +4807,7 @@ snapshots: ansi-colors: 4.1.3 strip-ansi: 6.0.1 - es-module-lexer@1.5.4: {} + es-module-lexer@1.6.0: {} esbuild@0.17.19: optionalDependencies: @@ -4820,32 +4834,33 @@ snapshots: '@esbuild/win32-ia32': 0.17.19 '@esbuild/win32-x64': 0.17.19 - esbuild@0.24.0: + esbuild@0.24.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.0 - '@esbuild/android-arm': 0.24.0 - '@esbuild/android-arm64': 0.24.0 - '@esbuild/android-x64': 0.24.0 - '@esbuild/darwin-arm64': 0.24.0 - '@esbuild/darwin-x64': 0.24.0 - '@esbuild/freebsd-arm64': 0.24.0 - '@esbuild/freebsd-x64': 0.24.0 - '@esbuild/linux-arm': 0.24.0 - '@esbuild/linux-arm64': 0.24.0 - '@esbuild/linux-ia32': 0.24.0 - '@esbuild/linux-loong64': 0.24.0 - '@esbuild/linux-mips64el': 0.24.0 - '@esbuild/linux-ppc64': 0.24.0 - '@esbuild/linux-riscv64': 0.24.0 - '@esbuild/linux-s390x': 0.24.0 - '@esbuild/linux-x64': 0.24.0 - '@esbuild/netbsd-x64': 0.24.0 - '@esbuild/openbsd-arm64': 0.24.0 - '@esbuild/openbsd-x64': 0.24.0 - '@esbuild/sunos-x64': 0.24.0 - '@esbuild/win32-arm64': 0.24.0 - '@esbuild/win32-ia32': 0.24.0 - '@esbuild/win32-x64': 0.24.0 + '@esbuild/aix-ppc64': 0.24.2 + '@esbuild/android-arm': 0.24.2 + '@esbuild/android-arm64': 0.24.2 + '@esbuild/android-x64': 0.24.2 + '@esbuild/darwin-arm64': 0.24.2 + '@esbuild/darwin-x64': 0.24.2 + '@esbuild/freebsd-arm64': 0.24.2 + '@esbuild/freebsd-x64': 0.24.2 + '@esbuild/linux-arm': 0.24.2 + '@esbuild/linux-arm64': 0.24.2 + '@esbuild/linux-ia32': 0.24.2 + '@esbuild/linux-loong64': 0.24.2 + '@esbuild/linux-mips64el': 0.24.2 + '@esbuild/linux-ppc64': 0.24.2 + '@esbuild/linux-riscv64': 0.24.2 + '@esbuild/linux-s390x': 0.24.2 + '@esbuild/linux-x64': 0.24.2 + '@esbuild/netbsd-arm64': 0.24.2 + '@esbuild/netbsd-x64': 0.24.2 + '@esbuild/openbsd-arm64': 0.24.2 + '@esbuild/openbsd-x64': 0.24.2 + '@esbuild/sunos-x64': 0.24.2 + '@esbuild/win32-arm64': 0.24.2 + '@esbuild/win32-ia32': 0.24.2 + '@esbuild/win32-x64': 0.24.2 escape-string-regexp@4.0.0: {} @@ -4885,9 +4900,9 @@ snapshots: eslint-compat-utils: 0.5.1(eslint@9.6.0) esutils: 2.0.3 known-css-properties: 0.34.0 - postcss: 8.4.49 - postcss-load-config: 3.1.4(postcss@8.4.49) - postcss-safe-parser: 6.0.0(postcss@8.4.49) + postcss: 8.5.1 + postcss-load-config: 3.1.4(postcss@8.5.1) + postcss-safe-parser: 6.0.0(postcss@8.5.1) postcss-selector-parser: 6.1.2 semver: 7.6.3 svelte-eslint-parser: 0.39.2(svelte@5.2.9) @@ -4923,7 +4938,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.3.7 + debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.0.1 eslint-visitor-keys: 4.2.0 @@ -4949,8 +4964,6 @@ snapshots: transitivePeerDependencies: - supports-color - esm-env@1.2.1: {} - esm-env@1.2.2: {} espree@10.3.0: @@ -5149,7 +5162,7 @@ snapshots: https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.3.7 + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -5329,7 +5342,7 @@ snapshots: dependencies: sourcemap-codec: 1.4.8 - magic-string@0.30.14: + magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -5454,8 +5467,6 @@ snapshots: package-json-from-dist@1.0.1: {} - package-manager-detector@0.2.0: {} - package-manager-detector@0.2.8: {} parent-module@1.0.1: @@ -5486,6 +5497,8 @@ snapshots: pathe@1.1.2: {} + pathe@2.0.1: {} + pathval@2.0.0: {} picocolors@1.1.1: {} @@ -5509,27 +5522,27 @@ snapshots: '@polka/url': 1.0.0-next.28 trouter: 4.0.0 - postcss-load-config@3.1.4(postcss@8.4.49): + postcss-load-config@3.1.4(postcss@8.5.1): dependencies: lilconfig: 2.1.0 yaml: 1.10.2 optionalDependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-safe-parser@6.0.0(postcss@8.4.49): + postcss-safe-parser@6.0.0(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 - postcss-scss@4.0.9(postcss@8.4.49): + postcss-scss@4.0.9(postcss@8.5.1): dependencies: - postcss: 8.4.49 + postcss: 8.5.1 postcss-selector-parser@6.1.2: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 - postcss@8.4.49: + postcss@8.5.1: dependencies: nanoid: 3.3.8 picocolors: 1.1.1 @@ -5604,28 +5617,29 @@ snapshots: dependencies: estree-walker: 0.6.1 - rollup@4.27.4: + rollup@4.30.1: dependencies: '@types/estree': 1.0.6 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.27.4 - '@rollup/rollup-android-arm64': 4.27.4 - '@rollup/rollup-darwin-arm64': 4.27.4 - '@rollup/rollup-darwin-x64': 4.27.4 - '@rollup/rollup-freebsd-arm64': 4.27.4 - '@rollup/rollup-freebsd-x64': 4.27.4 - '@rollup/rollup-linux-arm-gnueabihf': 4.27.4 - '@rollup/rollup-linux-arm-musleabihf': 4.27.4 - '@rollup/rollup-linux-arm64-gnu': 4.27.4 - '@rollup/rollup-linux-arm64-musl': 4.27.4 - '@rollup/rollup-linux-powerpc64le-gnu': 4.27.4 - '@rollup/rollup-linux-riscv64-gnu': 4.27.4 - '@rollup/rollup-linux-s390x-gnu': 4.27.4 - '@rollup/rollup-linux-x64-gnu': 4.27.4 - '@rollup/rollup-linux-x64-musl': 4.27.4 - '@rollup/rollup-win32-arm64-msvc': 4.27.4 - '@rollup/rollup-win32-ia32-msvc': 4.27.4 - '@rollup/rollup-win32-x64-msvc': 4.27.4 + '@rollup/rollup-android-arm-eabi': 4.30.1 + '@rollup/rollup-android-arm64': 4.30.1 + '@rollup/rollup-darwin-arm64': 4.30.1 + '@rollup/rollup-darwin-x64': 4.30.1 + '@rollup/rollup-freebsd-arm64': 4.30.1 + '@rollup/rollup-freebsd-x64': 4.30.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 + '@rollup/rollup-linux-arm-musleabihf': 4.30.1 + '@rollup/rollup-linux-arm64-gnu': 4.30.1 + '@rollup/rollup-linux-arm64-musl': 4.30.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 + '@rollup/rollup-linux-riscv64-gnu': 4.30.1 + '@rollup/rollup-linux-s390x-gnu': 4.30.1 + '@rollup/rollup-linux-x64-gnu': 4.30.1 + '@rollup/rollup-linux-x64-musl': 4.30.1 + '@rollup/rollup-win32-arm64-msvc': 4.30.1 + '@rollup/rollup-win32-ia32-msvc': 4.30.1 + '@rollup/rollup-win32-x64-msvc': 4.30.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -5783,8 +5797,8 @@ snapshots: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 espree: 9.6.1 - postcss: 8.4.49 - postcss-scss: 4.0.9(postcss@8.4.49) + postcss: 8.5.1 + postcss-scss: 4.0.9(postcss@8.5.1) optionalDependencies: svelte: 5.2.9 @@ -5792,14 +5806,14 @@ snapshots: dependencies: svelte: 5.2.9 - svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.4.49))(postcss@8.4.49)(svelte@5.2.9)(typescript@5.6.3): + svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.5.1))(postcss@8.5.1)(svelte@5.2.9)(typescript@5.6.3): dependencies: detect-indent: 6.1.0 strip-indent: 3.0.0 svelte: 5.2.9 optionalDependencies: - postcss: 8.4.49 - postcss-load-config: 3.1.4(postcss@8.4.49) + postcss: 8.5.1 + postcss-load-config: 3.1.4(postcss@8.5.1) typescript: 5.6.3 svelte2tsx@0.7.18(svelte@5.2.9)(typescript@5.6.3): @@ -5818,11 +5832,11 @@ snapshots: acorn-typescript: 1.4.13(acorn@8.14.0) aria-query: 5.3.2 axobject-query: 4.1.0 - esm-env: 1.2.1 + esm-env: 1.2.2 esrap: 1.2.2 is-reference: 3.0.3 locate-character: 3.0.0 - magic-string: 0.30.14 + magic-string: 0.30.17 zimmerframe: 1.1.2 tapable@2.2.1: {} @@ -5849,11 +5863,11 @@ snapshots: tinydate@1.3.0: {} - tinyexec@0.3.1: {} + tinyexec@0.3.2: {} tinypool@1.0.2: {} - tinyrainbow@1.2.0: {} + tinyrainbow@2.0.0: {} tinyspy@3.0.2: {} @@ -5928,20 +5942,20 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 - vite-imagetools@7.0.1(rollup@4.27.4): + vite-imagetools@7.0.1(rollup@4.30.1): dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.27.4) + '@rollup/pluginutils': 5.1.3(rollup@4.30.1) imagetools-core: 7.0.0 transitivePeerDependencies: - rollup - vite-node@2.1.6(@types/node@18.19.50)(lightningcss@1.24.1): + vite-node@3.0.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: cac: 6.7.14 - debug: 4.3.7 - es-module-lexer: 1.5.4 - pathe: 1.1.2 - vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + debug: 4.4.0 + es-module-lexer: 1.6.0 + pathe: 2.0.1 + vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - '@types/node' - jiti @@ -5956,41 +5970,41 @@ snapshots: - tsx - yaml - vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1): + vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: - esbuild: 0.24.0 - postcss: 8.4.49 - rollup: 4.27.4 + esbuild: 0.24.2 + postcss: 8.5.1 + rollup: 4.30.1 optionalDependencies: '@types/node': 18.19.50 fsevents: 2.3.3 lightningcss: 1.24.1 - vitefu@1.0.4(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)): + vitefu@1.0.4(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)): optionalDependencies: - vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) - vitest@2.1.6(@types/node@18.19.50)(lightningcss@1.24.1): + vitest@3.0.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: - '@vitest/expect': 2.1.6 - '@vitest/mocker': 2.1.6(vite@6.0.1(@types/node@18.19.50)(lightningcss@1.24.1)) - '@vitest/pretty-format': 2.1.6 - '@vitest/runner': 2.1.6 - '@vitest/snapshot': 2.1.6 - '@vitest/spy': 2.1.6 - '@vitest/utils': 2.1.6 + '@vitest/expect': 3.0.1 + '@vitest/mocker': 3.0.1(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + '@vitest/pretty-format': 3.0.1 + '@vitest/runner': 3.0.1 + '@vitest/snapshot': 3.0.1 + '@vitest/spy': 3.0.1 + '@vitest/utils': 3.0.1 chai: 5.1.2 - debug: 4.3.7 + debug: 4.4.0 expect-type: 1.1.0 - magic-string: 0.30.14 - pathe: 1.1.2 + magic-string: 0.30.17 + pathe: 2.0.1 std-env: 3.8.0 tinybench: 2.9.0 - tinyexec: 0.3.1 + tinyexec: 0.3.2 tinypool: 1.0.2 - tinyrainbow: 1.2.0 - vite: 6.0.1(@types/node@18.19.50)(lightningcss@1.24.1) - vite-node: 2.1.6(@types/node@18.19.50)(lightningcss@1.24.1) + tinyrainbow: 2.0.0 + vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + vite-node: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.50 From 18d69fb92a1d3cf419882bbfb9f08421974e5c22 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 20 Jan 2025 17:10:30 +0800 Subject: [PATCH 0902/1135] docs: mention page state (#13348) --- packages/kit/src/exports/public.d.ts | 12 ++++++------ packages/kit/types/index.d.ts | 12 ++++++------ 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 81d0de63f0ac..0d5888be0699 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1088,31 +1088,31 @@ export interface AfterNavigate extends Omit { } /** - * The shape of the `$page` store + * The shape of the [`page`](https://svelte.dev/docs/kit/$app-state#page) reactive object and the [`$page`](https://svelte.dev/docs/kit/$app-stores) store. */ export interface Page< Params extends Record = Record, RouteId extends string | null = string | null > { /** - * The URL of the current page + * The URL of the current page. */ url: URL; /** - * The parameters of the current page - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object + * The parameters of the current page - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object. */ params: Params; /** - * Info about the current route + * Info about the current route. */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]` + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. */ id: RouteId; }; /** - * Http status code of the current page + * HTTP status code of the current page. */ status: number; /** diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index e56cee9c8c31..0a615f90f4fd 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1070,31 +1070,31 @@ declare module '@sveltejs/kit' { } /** - * The shape of the `$page` store + * The shape of the [`page`](https://svelte.dev/docs/kit/$app-state#page) reactive object and the [`$page`](https://svelte.dev/docs/kit/$app-stores) store. */ export interface Page< Params extends Record = Record, RouteId extends string | null = string | null > { /** - * The URL of the current page + * The URL of the current page. */ url: URL; /** - * The parameters of the current page - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object + * The parameters of the current page - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object. */ params: Params; /** - * Info about the current route + * Info about the current route. */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]` + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. */ id: RouteId; }; /** - * Http status code of the current page + * HTTP status code of the current page. */ status: number; /** From f5103c6135c66e0c2d63a4826f535759a79b5d31 Mon Sep 17 00:00:00 2001 From: JD Huntington Date: Mon, 20 Jan 2025 03:32:51 -0600 Subject: [PATCH 0903/1135] docs: document derived use of $app/state's page (#13346) #13305 --- packages/kit/src/runtime/app/state/index.js | 11 +++++++++++ packages/kit/types/index.d.ts | 11 +++++++++++ 2 files changed, 22 insertions(+) diff --git a/packages/kit/src/runtime/app/state/index.js b/packages/kit/src/runtime/app/state/index.js index b9622267fb31..70ed0eaab425 100644 --- a/packages/kit/src/runtime/app/state/index.js +++ b/packages/kit/src/runtime/app/state/index.js @@ -32,6 +32,17 @@ import { BROWSER } from 'esm-env'; * {/if} * ``` * + * Changes to `page` are available exclusively with runes. (The legacy reactivity syntax will not reflect any changes) + * + * ```svelte + * + * + * ``` + * * On the server, values can only be read during rendering (in other words _not_ in e.g. `load` functions). In the browser, the values can be read at any time. * * @type {import('@sveltejs/kit').Page} diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 0a615f90f4fd..a7b9cf1e4a09 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2356,6 +2356,17 @@ declare module '$app/state' { * {/if} * ``` * + * Changes to `page` are available exclusively with runes. (The legacy reactivity syntax will not reflect any changes) + * + * ```svelte + * + * + * ``` + * * On the server, values can only be read during rendering (in other words _not_ in e.g. `load` functions). In the browser, the values can be read at any time. * * */ From 2ca09ce6ff1b5dbd5bb2ac0099b6b1d2a45ea3f0 Mon Sep 17 00:00:00 2001 From: Vladislav Logvin <122863429+Black1358@users.noreply.github.com> Date: Mon, 20 Jan 2025 22:07:29 +0300 Subject: [PATCH 0904/1135] fix: svelte-package resolve alias (#13351) --- .changeset/many-gorillas-shout.md | 5 ++++ packages/package/src/utils.js | 25 ++++++++++++++++--- .../fixtures/resolve-alias/expected/not.d.ts | 1 + .../fixtures/resolve-alias/expected/not.js | 1 + .../resolve-alias/expected/sub/bar.d.ts | 1 + .../resolve-alias/expected/sub/bar.js | 1 + .../fixtures/resolve-alias/src/lib/not.ts | 1 + .../fixtures/resolve-alias/src/lib/sub/bar.ts | 1 + 8 files changed, 32 insertions(+), 4 deletions(-) create mode 100644 .changeset/many-gorillas-shout.md create mode 100644 packages/package/test/fixtures/resolve-alias/expected/not.d.ts create mode 100644 packages/package/test/fixtures/resolve-alias/expected/not.js create mode 100644 packages/package/test/fixtures/resolve-alias/src/lib/not.ts diff --git a/.changeset/many-gorillas-shout.md b/.changeset/many-gorillas-shout.md new file mode 100644 index 000000000000..50f23660ae7f --- /dev/null +++ b/.changeset/many-gorillas-shout.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/package': patch +--- + +fix: resolve aliases more robustly diff --git a/packages/package/src/utils.js b/packages/package/src/utils.js index 0c5f25736620..7262a32ba9b5 100644 --- a/packages/package/src/utils.js +++ b/packages/package/src/utils.js @@ -17,10 +17,9 @@ const is_svelte_5_plus = Number(VERSION.split('.')[0]) >= 5; export function resolve_aliases(input, file, content, aliases) { /** * @param {string} match - * @param {string} _ * @param {string} import_path */ - const replace_import_path = (match, _, import_path) => { + const replace_import_path = (match, import_path) => { for (const [alias, value] of Object.entries(aliases)) { if (!import_path.startsWith(alias)) continue; @@ -33,8 +32,26 @@ export function resolve_aliases(input, file, content, aliases) { return match; }; - content = content.replace(/from\s+('|")([^"';,]+?)\1/g, replace_import_path); - content = content.replace(/import\s*\(\s*('|")([^"';,]+?)\1\s*\)/g, replace_import_path); + // import/export ... from ... + content = content.replace( + /\b(import|export)\s+([\w*\s{},]*)\s+from\s+(['"])([^'";]+)\3/g, + (_, keyword, specifier, quote, import_path) => + replace_import_path( + `${keyword} ${specifier} from ${quote}${import_path}${quote}`, + import_path + ) + ); + + // import(...) + content = content.replace(/\bimport\s*\(\s*(['"])([^'";]+)\1\s*\)/g, (_, quote, import_path) => + replace_import_path(`import(${quote}${import_path}${quote})`, import_path) + ); + + // import '...' + content = content.replace(/\bimport\s+(['"])([^'";]+)\1/g, (_, quote, import_path) => + replace_import_path(`import ${quote}${import_path}${quote}`, import_path) + ); + return content; } diff --git a/packages/package/test/fixtures/resolve-alias/expected/not.d.ts b/packages/package/test/fixtures/resolve-alias/expected/not.d.ts new file mode 100644 index 000000000000..24bce3e70b9b --- /dev/null +++ b/packages/package/test/fixtures/resolve-alias/expected/not.d.ts @@ -0,0 +1 @@ +export declare const notImportFromLib: () => string; diff --git a/packages/package/test/fixtures/resolve-alias/expected/not.js b/packages/package/test/fixtures/resolve-alias/expected/not.js new file mode 100644 index 000000000000..ebb522bcef22 --- /dev/null +++ b/packages/package/test/fixtures/resolve-alias/expected/not.js @@ -0,0 +1 @@ +export const notImportFromLib = () => " from '$lib/Test.svelte'"; diff --git a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts index 9f1a49e9dfd6..fac8707fc2ad 100644 --- a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts +++ b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts @@ -1,2 +1,3 @@ +export declare const dynamic: () => Promise; export declare const bar1: import('./foo').Foo; export declare const bar2: import('../baz').Baz; diff --git a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js index 17941b746387..6c2ec176b703 100644 --- a/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js +++ b/packages/package/test/fixtures/resolve-alias/expected/sub/bar.js @@ -1,4 +1,5 @@ import { baz } from '../baz'; import { foo } from './foo'; +export const dynamic = () => import('../Test.svelte'); export const bar1 = foo; export const bar2 = baz; diff --git a/packages/package/test/fixtures/resolve-alias/src/lib/not.ts b/packages/package/test/fixtures/resolve-alias/src/lib/not.ts new file mode 100644 index 000000000000..ebb522bcef22 --- /dev/null +++ b/packages/package/test/fixtures/resolve-alias/src/lib/not.ts @@ -0,0 +1 @@ +export const notImportFromLib = () => " from '$lib/Test.svelte'"; diff --git a/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts b/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts index 335e08c551d3..c1d073daa6d0 100644 --- a/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts +++ b/packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts @@ -1,5 +1,6 @@ import { baz } from '$lib/baz'; import { foo } from '$lib/sub/foo'; +export const dynamic = () => import('$lib/Test.svelte'); export const bar1 = foo; export const bar2 = baz; From 891429ec7d6acb05eb15f40a8723de0af5fcbb2f Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 21 Jan 2025 14:49:51 +0800 Subject: [PATCH 0905/1135] run build step before pkg-pr-new publish (#13355) --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index b8529b9a6a7b..b4637e191726 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,6 +29,7 @@ jobs: node-version: 22 cache: pnpm - run: pnpm install --frozen-lockfile + - run: pnpm build - run: pnpx pkg-pr-new publish --comment=off ./packages/* lint-all: runs-on: ubuntu-latest From b7642987f57fe700ddf22a781a8ef12ffdab60e5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Aur=C3=A8le=20Oul=C3=A8s?= Date: Tue, 21 Jan 2025 10:24:36 +0100 Subject: [PATCH 0906/1135] fix: do not replace headers on fetch requests with error state (#13341) Fixes #13340 --- .changeset/bright-scissors-grow.md | 5 +++++ packages/kit/src/runtime/server/respond.js | 10 +++++----- 2 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 .changeset/bright-scissors-grow.md diff --git a/.changeset/bright-scissors-grow.md b/.changeset/bright-scissors-grow.md new file mode 100644 index 000000000000..f2cd51db71ae --- /dev/null +++ b/.changeset/bright-scissors-grow.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: avoid overwriting headers for sub-requests made while loading the error page diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index ab51505a897c..5f5ae7b795e4 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -508,11 +508,11 @@ export async function respond(request, options, manifest, state) { } if (state.error && event.isSubRequest) { - return await fetch(request, { - headers: { - 'x-sveltekit-error': 'true' - } - }); + // avoid overwriting the headers. This could be a same origin fetch request + // to an external service from the root layout while rendering an error page + const headers = new Headers(request.headers); + headers.set('x-sveltekit-error', 'true'); + return await fetch(request, { headers }); } if (state.error) { From a8bdcf800b1e96a969ce69547d61b703b0999d87 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 21 Jan 2025 17:29:03 +0800 Subject: [PATCH 0907/1135] fix: correctly handle relative anchors when hash router is enabled (#13356) fixes #13320 This PR enables relative hash links to be used with the hash router so that links such as #example get recognised as a link to the current page. We do this by assuming links that have a hash value starting with #/ links to a route while anything else is probably linking to an element with an id on the current page. --- .changeset/forty-houses-collect.md | 5 +++++ packages/kit/src/runtime/client/utils.js | 6 ++++++ .../hash-based-routing/src/routes/anchor/+page.svelte | 3 +++ packages/kit/test/apps/hash-based-routing/test/test.js | 9 +++++++++ 4 files changed, 23 insertions(+) create mode 100644 .changeset/forty-houses-collect.md create mode 100644 packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte diff --git a/.changeset/forty-houses-collect.md b/.changeset/forty-houses-collect.md new file mode 100644 index 000000000000..6a48772b3742 --- /dev/null +++ b/.changeset/forty-houses-collect.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly handle relative anchors when using the hash router diff --git a/packages/kit/src/runtime/client/utils.js b/packages/kit/src/runtime/client/utils.js index 28a06d862489..3e121a75e47a 100644 --- a/packages/kit/src/runtime/client/utils.js +++ b/packages/kit/src/runtime/client/utils.js @@ -130,6 +130,12 @@ export function get_link_info(a, base, uses_hash_router) { try { url = new URL(a instanceof SVGAElement ? a.href.baseVal : a.href, document.baseURI); + + // if the hash doesn't start with `#/` then it's probably linking to an id on the current page + if (uses_hash_router && url.hash.match(/^#[^/]/)) { + const route = location.hash.split('#')[1] || '/'; + url.hash = `#${route}${url.hash}`; + } } catch {} const target = a instanceof SVGAElement ? a.target.baseVal : a.target; diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte new file mode 100644 index 000000000000..3be87857c826 --- /dev/null +++ b/packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte @@ -0,0 +1,3 @@ +go to #test + +

#test

diff --git a/packages/kit/test/apps/hash-based-routing/test/test.js b/packages/kit/test/apps/hash-based-routing/test/test.js index 23666ed5e562..d7962d380ea4 100644 --- a/packages/kit/test/apps/hash-based-routing/test/test.js +++ b/packages/kit/test/apps/hash-based-routing/test/test.js @@ -89,4 +89,13 @@ test.describe('hash based navigation', () => { url = new URL(page.url()); expect(url.hash).toBe('#/reroute-b'); }); + + test('relative anchor works', async ({ page }) => { + await page.goto('/#/anchor'); + + await page.locator('a[href="#test"]').click(); + await expect(page.locator('#test')).toHaveText('#test'); + const url = new URL(page.url()); + expect(url.hash).toBe('#/anchor#test'); + }); }); From ab58c2205a7e9d60aa3e8dd827ed4e1202b0b1b1 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 21 Jan 2025 17:31:59 +0800 Subject: [PATCH 0908/1135] fix: correctly check index file exists when resolving an entry (#13354) fixes #13350 #13188 caused a regression where index.js and index.ts files would not be resolved as entries because of the additional isFile() check that was added to prioritise matching files over folders. --- .changeset/cyan-dancers-tap.md | 5 +++++ packages/kit/src/utils/filesystem.js | 7 +++--- packages/kit/src/utils/filesystem.spec.js | 26 +++++++++++++++-------- 3 files changed, 26 insertions(+), 12 deletions(-) create mode 100644 .changeset/cyan-dancers-tap.md diff --git a/.changeset/cyan-dancers-tap.md b/.changeset/cyan-dancers-tap.md new file mode 100644 index 000000000000..8e30367161af --- /dev/null +++ b/.changeset/cyan-dancers-tap.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly resolve index file entrypoints such as `src/service-worker/index.js` diff --git a/packages/kit/src/utils/filesystem.js b/packages/kit/src/utils/filesystem.js index 4a2c5e502cb0..af490f13701d 100644 --- a/packages/kit/src/utils/filesystem.js +++ b/packages/kit/src/utils/filesystem.js @@ -169,11 +169,12 @@ export function from_fs(str) { export function resolve_entry(entry) { if (fs.existsSync(entry)) { const stats = fs.statSync(entry); - const index = path.join(entry, 'index'); - if (stats.isFile()) { return entry; - } else if (fs.existsSync(index)) { + } + + const index = path.join(entry, 'index'); + if (fs.existsSync(index + '.js') || fs.existsSync(index + '.ts')) { return resolve_entry(index); } } diff --git a/packages/kit/src/utils/filesystem.spec.js b/packages/kit/src/utils/filesystem.spec.js index 84d58d406097..86e0322f02ff 100644 --- a/packages/kit/src/utils/filesystem.spec.js +++ b/packages/kit/src/utils/filesystem.spec.js @@ -100,27 +100,35 @@ test('replaces strings', () => { ); }); -test('ignores hooks.server folder when resolving hooks', () => { - write(join('hooks.server', 'index.js'), ''); +test('resolves index files', () => { + write(join('service-worker', 'index.js'), ''); - expect(resolve_entry(source_dir + '/hooks')).null; + expect(resolve_entry(source_dir + '/service-worker')).toBe( + join(source_dir, 'service-worker', 'index.js') + ); +}); + +test('resolves entries that have an extension', () => { + write('hooks.js', ''); + + expect(resolve_entry(join(source_dir, 'hooks.js'))).toBe(join(source_dir, 'hooks.js')); }); -test('ignores hooks folder that has no index file when resolving hooks', () => { +test('resolves universal hooks file when hooks folder exists', () => { write(join('hooks', 'not-index.js'), ''); write('hooks.js', ''); expect(resolve_entry(source_dir + '/hooks')).toBe(join(source_dir, 'hooks.js')); }); -test('ignores hooks folder when resolving universal hooks', () => { - write(join('hooks', 'hooks.server.js'), ''); +test('ignores hooks.server folder when resolving universal hooks file', () => { + write(join('hooks.server', 'index.js'), ''); expect(resolve_entry(source_dir + '/hooks')).null; }); -test('resolves entries that have an extension', () => { - write('hooks.js', ''); +test('ignores hooks folder when resolving universal hooks file', () => { + write(join('hooks', 'hooks.server.js'), ''); - expect(resolve_entry(join(source_dir, 'hooks.js'))).toBe(join(source_dir, 'hooks.js')); + expect(resolve_entry(source_dir + '/hooks')).null; }); From 7c81ac95c8687b09e2d49bad66528b415fd66bb3 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 21 Jan 2025 10:33:39 +0100 Subject: [PATCH 0909/1135] Version Packages (#13353) Co-authored-by: github-actions[bot] --- .changeset/bright-scissors-grow.md | 5 ----- .changeset/cyan-dancers-tap.md | 5 ----- .changeset/forty-houses-collect.md | 5 ----- .changeset/many-gorillas-shout.md | 5 ----- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- packages/package/CHANGELOG.md | 6 ++++++ packages/package/package.json | 2 +- 9 files changed, 21 insertions(+), 23 deletions(-) delete mode 100644 .changeset/bright-scissors-grow.md delete mode 100644 .changeset/cyan-dancers-tap.md delete mode 100644 .changeset/forty-houses-collect.md delete mode 100644 .changeset/many-gorillas-shout.md diff --git a/.changeset/bright-scissors-grow.md b/.changeset/bright-scissors-grow.md deleted file mode 100644 index f2cd51db71ae..000000000000 --- a/.changeset/bright-scissors-grow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: avoid overwriting headers for sub-requests made while loading the error page diff --git a/.changeset/cyan-dancers-tap.md b/.changeset/cyan-dancers-tap.md deleted file mode 100644 index 8e30367161af..000000000000 --- a/.changeset/cyan-dancers-tap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly resolve index file entrypoints such as `src/service-worker/index.js` diff --git a/.changeset/forty-houses-collect.md b/.changeset/forty-houses-collect.md deleted file mode 100644 index 6a48772b3742..000000000000 --- a/.changeset/forty-houses-collect.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly handle relative anchors when using the hash router diff --git a/.changeset/many-gorillas-shout.md b/.changeset/many-gorillas-shout.md deleted file mode 100644 index 50f23660ae7f..000000000000 --- a/.changeset/many-gorillas-shout.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/package': patch ---- - -fix: resolve aliases more robustly diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index c5c1c47d44e3..37d851401ed6 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.16.1 +### Patch Changes + + +- fix: avoid overwriting headers for sub-requests made while loading the error page ([#13341](https://github.com/sveltejs/kit/pull/13341)) + + +- fix: correctly resolve index file entrypoints such as `src/service-worker/index.js` ([#13354](https://github.com/sveltejs/kit/pull/13354)) + + +- fix: correctly handle relative anchors when using the hash router ([#13356](https://github.com/sveltejs/kit/pull/13356)) + ## 2.16.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index a8ba2b6c5b87..19d5d88873f3 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.16.0", + "version": "2.16.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 8bd2e479bb57..d00911eed750 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.16.0'; +export const VERSION = '2.16.1'; diff --git a/packages/package/CHANGELOG.md b/packages/package/CHANGELOG.md index bc660c081a19..329fc14bfa1a 100644 --- a/packages/package/CHANGELOG.md +++ b/packages/package/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/package +## 2.3.8 +### Patch Changes + + +- fix: resolve aliases more robustly ([#13351](https://github.com/sveltejs/kit/pull/13351)) + ## 2.3.7 ### Patch Changes diff --git a/packages/package/package.json b/packages/package/package.json index 1ab629b29654..e3f83019ea03 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/package", - "version": "2.3.7", + "version": "2.3.8", "description": "The fastest way to build Svelte packages", "repository": { "type": "git", From 0d813dc87091e4d058b07d0c1e00d01d0b6a078f Mon Sep 17 00:00:00 2001 From: Philippe Serhal Date: Tue, 21 Jan 2025 08:42:00 -0500 Subject: [PATCH 0910/1135] fix: prevent conflict between Netlify Identity and edge function rendering (#12052) Previously Netlify Edge Functions didn't support a way to configure path matching that *excludes* paths. Now that it does, we can avoid running the "render" edge function on static assets. Currently, it's [just a no-op](https://github.com/sveltejs/kit/blob/80386437030c5c79913e859e3c32fd194613e1b6/packages/adapter-netlify/src/edge.js#L18-L22), but it's still nice to avoid the invocation. Fixes #5235. --------- Co-authored-by: Simon Holthausen Co-authored-by: Chew Tee Ming Co-authored-by: Tee Ming --- .changeset/witty-teachers-film.md | 5 ++ packages/adapter-netlify/index.js | 64 +++++++++++++++++--------- packages/adapter-netlify/internal.d.ts | 1 - packages/adapter-netlify/src/edge.js | 39 +--------------- 4 files changed, 47 insertions(+), 62 deletions(-) create mode 100644 .changeset/witty-teachers-film.md diff --git a/.changeset/witty-teachers-film.md b/.changeset/witty-teachers-film.md new file mode 100644 index 000000000000..62e0c79a9ea4 --- /dev/null +++ b/.changeset/witty-teachers-film.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-netlify': patch +--- + +fix: avoid unnecessary Netlify edge function invocations for static files, which resolves a conflict between Netlify Edge Functions and Netlify Identity diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js index 8fc380cc270f..034acd70ab94 100644 --- a/packages/adapter-netlify/index.js +++ b/packages/adapter-netlify/index.js @@ -14,15 +14,19 @@ import toml from '@iarna/toml'; */ /** + * TODO(serhalp) Replace this custom type with an import from `@netlify/edge-functions`, + * once that type is fixed to include `excludedPath` and `function`. * @typedef {{ * functions: Array< * | { * function: string; * path: string; + * excludedPath?: string | string[]; * } * | { * function: string; * pattern: string; + * excludedPattern?: string | string[]; * } * >; * version: 1; @@ -122,23 +126,6 @@ async function generate_edge_functions({ builder }) { builder.mkdirp('.netlify/edge-functions'); - // Don't match the static directory - const pattern = '^/.*$'; - - // Go doesn't support lookarounds, so we can't do this - // const pattern = appDir ? `^/(?!${escapeStringRegexp(appDir)}).*$` : '^/.*$'; - - /** @type {HandlerManifest} */ - const edge_manifest = { - functions: [ - { - function: 'render', - pattern - } - ], - version: 1 - }; - builder.log.minor('Generating Edge Function...'); const relativePath = posix.relative(tmp, builder.getServerDirectory()); @@ -153,12 +140,43 @@ async function generate_edge_functions({ builder }) { relativePath }); - writeFileSync( - `${tmp}/manifest.js`, - `export const manifest = ${manifest};\n\nexport const prerendered = new Set(${JSON.stringify( - builder.prerendered.paths - )});\n` - ); + writeFileSync(`${tmp}/manifest.js`, `export const manifest = ${manifest};\n`); + + /** @type {{ assets: Set }} */ + const { assets } = (await import(`${tmp}/manifest.js`)).manifest; + + const path = '/*'; + // We only need to specify paths without the trailing slash because + // Netlify will handle the optional trailing slash for us + const excludedPath = [ + // Contains static files + `/${builder.getAppPath()}/*`, + ...builder.prerendered.paths, + ...Array.from(assets).flatMap((asset) => { + if (asset.endsWith('/index.html')) { + const dir = asset.replace(/\/index\.html$/, ''); + return [ + `${builder.config.kit.paths.base}/${asset}`, + `${builder.config.kit.paths.base}/${dir}` + ]; + } + return `${builder.config.kit.paths.base}/${asset}`; + }), + // Should not be served by SvelteKit at all + '/.netlify/*' + ]; + + /** @type {HandlerManifest} */ + const edge_manifest = { + functions: [ + { + function: 'render', + path, + excludedPath + } + ], + version: 1 + }; await esbuild.build({ entryPoints: [`${tmp}/entry.js`], diff --git a/packages/adapter-netlify/internal.d.ts b/packages/adapter-netlify/internal.d.ts index 450140da9871..55da8ba1fbf5 100644 --- a/packages/adapter-netlify/internal.d.ts +++ b/packages/adapter-netlify/internal.d.ts @@ -6,5 +6,4 @@ declare module 'MANIFEST' { import { SSRManifest } from '@sveltejs/kit'; export const manifest: SSRManifest; - export const prerendered: Set; } diff --git a/packages/adapter-netlify/src/edge.js b/packages/adapter-netlify/src/edge.js index 85f75483ea35..f6aeb2b25655 100644 --- a/packages/adapter-netlify/src/edge.js +++ b/packages/adapter-netlify/src/edge.js @@ -1,8 +1,7 @@ import { Server } from '0SERVER'; -import { manifest, prerendered } from 'MANIFEST'; +import { manifest } from 'MANIFEST'; const server = new Server(manifest); -const prefix = `/${manifest.appPath}/`; const initialized = server.init({ // @ts-ignore @@ -15,12 +14,6 @@ const initialized = server.init({ * @returns { Promise } */ export default async function handler(request, context) { - if (is_static_file(request)) { - // Static files can skip the handler - // TODO can we serve _app/immutable files with an immutable cache header? - return; - } - await initialized; return server.respond(request, { platform: { context }, @@ -29,33 +22,3 @@ export default async function handler(request, context) { } }); } - -/** - * @param {Request} request - */ -function is_static_file(request) { - const url = new URL(request.url); - - // Assets in the app dir - if (url.pathname.startsWith(prefix)) { - return true; - } - - // prerendered pages and index.html files - const pathname = url.pathname.replace(/\/$/, ''); - let file = pathname.substring(1); - - try { - file = decodeURIComponent(file); - } catch { - // ignore - } - - return ( - manifest.assets.has(file) || - manifest.assets.has(file + '/index.html') || - file in manifest._.server_assets || - file + '/index.html' in manifest._.server_assets || - prerendered.has(pathname || '/') - ); -} From d9f152254849cf332be6a457d09efdcc8be7d9e1 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 21 Jan 2025 15:25:04 +0100 Subject: [PATCH 0911/1135] fix: adjust declaration map paths (#8843) closes #7793 --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> Co-authored-by: Tee Ming --- .changeset/dirty-doors-hide.md | 5 ++++ .changeset/pretty-lizards-attend.md | 5 ++++ .../docs/30-advanced/70-packaging.md | 17 ++++++++++++ packages/package/package.json | 2 +- packages/package/src/index.js | 4 +-- packages/package/src/typescript.js | 27 ++++++++++++++++--- .../expected/Test.svelte | 5 ++++ .../expected/Test.svelte.d.ts | 7 +++++ .../expected/Test.svelte.d.ts.map | 1 + .../expected/index.d.ts | 2 ++ .../expected/index.d.ts.map | 1 + .../expected/index.js | 1 + .../typescript-declaration-map/package.json | 16 +++++++++++ .../src/lib/Test.svelte | 5 ++++ .../src/lib/index.ts | 1 + .../svelte.config.js | 5 ++++ .../typescript-declaration-map/tsconfig.json | 8 ++++++ packages/package/test/index.js | 10 ++++++- pnpm-lock.yaml | 10 +++---- 19 files changed, 120 insertions(+), 12 deletions(-) create mode 100644 .changeset/dirty-doors-hide.md create mode 100644 .changeset/pretty-lizards-attend.md create mode 100644 packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte create mode 100644 packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts create mode 100644 packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts.map create mode 100644 packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts create mode 100644 packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts.map create mode 100644 packages/package/test/fixtures/typescript-declaration-map/expected/index.js create mode 100644 packages/package/test/fixtures/typescript-declaration-map/package.json create mode 100644 packages/package/test/fixtures/typescript-declaration-map/src/lib/Test.svelte create mode 100644 packages/package/test/fixtures/typescript-declaration-map/src/lib/index.ts create mode 100644 packages/package/test/fixtures/typescript-declaration-map/svelte.config.js create mode 100644 packages/package/test/fixtures/typescript-declaration-map/tsconfig.json diff --git a/.changeset/dirty-doors-hide.md b/.changeset/dirty-doors-hide.md new file mode 100644 index 000000000000..da40c8d476a1 --- /dev/null +++ b/.changeset/dirty-doors-hide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/package': patch +--- + +chore: bump `svelte2tsx` dependency for more up-to-date `d.ts` output diff --git a/.changeset/pretty-lizards-attend.md b/.changeset/pretty-lizards-attend.md new file mode 100644 index 000000000000..51d8dbc4bc7a --- /dev/null +++ b/.changeset/pretty-lizards-attend.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/package': patch +--- + +fix: adjust declaration map paths diff --git a/documentation/docs/30-advanced/70-packaging.md b/documentation/docs/30-advanced/70-packaging.md index 04d9b4dace04..93294e3f2616 100644 --- a/documentation/docs/30-advanced/70-packaging.md +++ b/documentation/docs/30-advanced/70-packaging.md @@ -218,6 +218,23 @@ You should think carefully about whether or not the changes you make to your pac } ``` +## Source maps + +You can create so-called declaration maps (`d.ts.map` files) by setting `"declarationMap": true` in your `tsconfig.json`. This will allow editors such as VS Code to go to the original `.ts` or `.svelte` file when using features like _Go to Definition_. This means you also need to publish your source files alongside your dist folder in a way that the relative path inside the declaration files leads to a file on disk. Assuming that you have all your library code inside `src/lib` as suggested by Svelte's CLI, this is as simple as adding `src/lib` to `files` in your `package.json`: + +```json +{ + "files": [ + "dist", + "!dist/**/*.test.*", + "!dist/**/*.spec.*", + +++"src/lib", + "!src/lib/**/*.test.*", + "!src/lib/**/*.spec.*"+++ + ] +} +``` + ## Options `svelte-package` accepts the following options: diff --git a/packages/package/package.json b/packages/package/package.json index e3f83019ea03..e3191faa8b31 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -24,7 +24,7 @@ "kleur": "^4.1.5", "sade": "^1.8.1", "semver": "^7.5.4", - "svelte2tsx": "~0.7.16" + "svelte2tsx": "~0.7.33" }, "devDependencies": { "@sveltejs/vite-plugin-svelte": "^5.0.1", diff --git a/packages/package/src/index.js b/packages/package/src/index.js index 05d3d3d7116b..2630e657cdb5 100644 --- a/packages/package/src/index.js +++ b/packages/package/src/index.js @@ -34,7 +34,7 @@ async function do_build(options, analyse_code) { const files = scan(input, extensions); if (options.types) { - await emit_dts(input, temp, options.cwd, alias, files, tsconfig); + await emit_dts(input, temp, output, options.cwd, alias, files, tsconfig); } for (const file of files) { @@ -137,7 +137,7 @@ export async function watch(options) { if (!errored && options.types) { try { - await emit_dts(input, output, options.cwd, alias, files, tsconfig); + await emit_dts(input, output, output, options.cwd, alias, files, tsconfig); console.log('Updated .d.ts files'); } catch (e) { errored = true; diff --git a/packages/package/src/typescript.js b/packages/package/src/typescript.js index 7608c8624880..12d1c32d710f 100644 --- a/packages/package/src/typescript.js +++ b/packages/package/src/typescript.js @@ -14,12 +14,13 @@ import { load_pkg_json } from './config.js'; * * @param {string} input * @param {string} output + * @param {string} final_output * @param {string} cwd * @param {Record} alias * @param {import('./types.js').File[]} files * @param {string | undefined} tsconfig */ -export async function emit_dts(input, output, cwd, alias, files, tsconfig) { +export async function emit_dts(input, output, final_output, cwd, alias, files, tsconfig) { const tmp = `${output}/__package_types_tmp__`; rimraf(tmp); mkdirp(tmp); @@ -54,8 +55,28 @@ export async function emit_dts(input, output, cwd, alias, files, tsconfig) { console.warn(`Using $lib/${normalized} instead of generated .d.ts file`); } - const source = fs.readFileSync(path.join(tmp, normalized), 'utf8'); - write(path.join(output, normalized), resolve_aliases(input, normalized, source, alias)); + let source = fs.readFileSync(path.join(tmp, normalized), 'utf8'); + if (file.endsWith('.d.ts.map')) { + // Because we put the .d.ts files in a temporary directory, the relative path needs to be adjusted + const parsed = JSON.parse(source); + if (parsed.sources) { + parsed.sources = /** @type {string[]} */ (parsed.sources).map((source) => + posixify( + path.join( + path.relative( + path.dirname(path.join(final_output, normalized)), + path.dirname(path.join(input, normalized)) + ), + path.basename(source) + ) + ) + ); + source = JSON.stringify(parsed); + } + } else { + source = resolve_aliases(input, normalized, source, alias); + } + write(path.join(output, normalized), source); } rimraf(tmp); diff --git a/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte b/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte new file mode 100644 index 000000000000..2892a2582db5 --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte @@ -0,0 +1,5 @@ + + +{foo} diff --git a/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts b/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts new file mode 100644 index 000000000000..a085b329fba8 --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts @@ -0,0 +1,7 @@ +type $$ComponentProps = { + foo: string; +}; +declare const Test: import("svelte").Component<$$ComponentProps, {}, "">; +type Test = ReturnType; +export default Test +//# sourceMappingURL=Test.svelte.d.ts.map \ No newline at end of file diff --git a/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts.map b/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts.map new file mode 100644 index 000000000000..fd94dc2b8f55 --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"Test.svelte.d.ts","sourceRoot":"","sources":["../src/lib/Test.svelte.ts"],"names":[],"mappings":"AAGC,KAAK,gBAAgB,GAAI;IAAE,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAS1C,QAAA,MAAM,IAAI,sDAAsC,CAAC;AACjD,KAAK,IAAI,GAAG,UAAU,CAAC,OAAO,IAAI,CAAC,CAAC;AACpC,eAAe,IAAI,CAAC"} \ No newline at end of file diff --git a/packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts b/packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts new file mode 100644 index 000000000000..3a13848c9369 --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts @@ -0,0 +1,2 @@ +export { default as Test } from './Test.svelte'; +//# sourceMappingURL=index.d.ts.map \ No newline at end of file diff --git a/packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts.map b/packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts.map new file mode 100644 index 000000000000..d62430ee3b6c --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts.map @@ -0,0 +1 @@ +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,IAAI,IAAI,EAAE,MAAM,eAAe,CAAC"} \ No newline at end of file diff --git a/packages/package/test/fixtures/typescript-declaration-map/expected/index.js b/packages/package/test/fixtures/typescript-declaration-map/expected/index.js new file mode 100644 index 000000000000..4c44188c3648 --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/expected/index.js @@ -0,0 +1 @@ +export { default as Test } from './Test.svelte'; diff --git a/packages/package/test/fixtures/typescript-declaration-map/package.json b/packages/package/test/fixtures/typescript-declaration-map/package.json new file mode 100644 index 000000000000..0f71eb5defeb --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/package.json @@ -0,0 +1,16 @@ +{ + "name": "typescript-declaration-map", + "private": true, + "version": "1.0.0", + "description": "standard typescript package with declarationMap:true", + "type": "module", + "peerDependencies": { + "svelte": "^5.0.0" + }, + "exports": { + ".": { + "types": "./dist/index.d.ts", + "svelte": "./dist/index.js" + } + } +} diff --git a/packages/package/test/fixtures/typescript-declaration-map/src/lib/Test.svelte b/packages/package/test/fixtures/typescript-declaration-map/src/lib/Test.svelte new file mode 100644 index 000000000000..50483b0ec942 --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/src/lib/Test.svelte @@ -0,0 +1,5 @@ + + +{foo} diff --git a/packages/package/test/fixtures/typescript-declaration-map/src/lib/index.ts b/packages/package/test/fixtures/typescript-declaration-map/src/lib/index.ts new file mode 100644 index 000000000000..4c44188c3648 --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/src/lib/index.ts @@ -0,0 +1 @@ +export { default as Test } from './Test.svelte'; diff --git a/packages/package/test/fixtures/typescript-declaration-map/svelte.config.js b/packages/package/test/fixtures/typescript-declaration-map/svelte.config.js new file mode 100644 index 000000000000..6bd253bdf27d --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/svelte.config.js @@ -0,0 +1,5 @@ +import preprocess from 'svelte-preprocess'; + +export default { + preprocess: preprocess() +}; diff --git a/packages/package/test/fixtures/typescript-declaration-map/tsconfig.json b/packages/package/test/fixtures/typescript-declaration-map/tsconfig.json new file mode 100644 index 000000000000..cd86fcfd945f --- /dev/null +++ b/packages/package/test/fixtures/typescript-declaration-map/tsconfig.json @@ -0,0 +1,8 @@ +{ + "compilerOptions": { + "target": "ESNext", + "module": "ESNext", + "declaration": true, + "declarationMap": true + } +} diff --git a/packages/package/test/index.js b/packages/package/test/index.js index 45903ecb0b23..f455487e9704 100644 --- a/packages/package/test/index.js +++ b/packages/package/test/index.js @@ -42,7 +42,7 @@ async function test_make_package(path, options) { assert.equal(actual_files, expected_files); - const extensions = ['.json', '.svelte', '.ts', 'js']; + const extensions = ['.json', '.svelte', '.ts', 'js', '.map']; for (const file of actual_files) { const pathname = join(output, file); if (fs.statSync(pathname).isDirectory()) continue; @@ -68,6 +68,10 @@ async function test_make_package(path, options) { * @param {string} content */ async function format(file, content) { + if (file.endsWith('.map')) { + return content; + } + if (file.endsWith('package.json')) { // For some reason these are ordered differently in different test environments const json = JSON.parse(content); @@ -152,6 +156,10 @@ test('SvelteKit interop', async () => { await test_make_package('svelte-kit'); }); +test('create package with declaration map', async () => { + await test_make_package('typescript-declaration-map'); +}); + test('create package with tsconfig specified', async () => { await test_make_package('tsconfig-specified', { tsconfig: 'tsconfig.build.json' }); }); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0db7e238b763..2ee92a5c7df3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1070,8 +1070,8 @@ importers: specifier: ^7.5.4 version: 7.6.3 svelte2tsx: - specifier: ~0.7.16 - version: 0.7.18(svelte@5.2.9)(typescript@5.6.3) + specifier: ~0.7.33 + version: 0.7.33(svelte@5.2.9)(typescript@5.6.3) devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 @@ -3397,8 +3397,8 @@ packages: typescript: optional: true - svelte2tsx@0.7.18: - resolution: {integrity: sha512-PCOhH7uQaV472ZvNAcnkvShjFRMMkKUc/eNJImQMH9T4CyHeQpdatedFrEjaMCsweFb/oo3a6bv4qtdfaCPw8g==} + svelte2tsx@0.7.33: + resolution: {integrity: sha512-geogGkzfciwteiKvlbaDBnKOitWuh6e1n2f5KLBBXEfZgui9gy5yRlOBYtNEkdwciO4MC9fTM/EyltsiQrOPNQ==} peerDependencies: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 @@ -5816,7 +5816,7 @@ snapshots: postcss-load-config: 3.1.4(postcss@8.5.1) typescript: 5.6.3 - svelte2tsx@0.7.18(svelte@5.2.9)(typescript@5.6.3): + svelte2tsx@0.7.33(svelte@5.2.9)(typescript@5.6.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 From cc6dace0bfc79ccb5248699de5ba3ca8b801d321 Mon Sep 17 00:00:00 2001 From: Hyunbin Seo <47051820+hyunbinseo@users.noreply.github.com> Date: Wed, 22 Jan 2025 16:04:23 +0900 Subject: [PATCH 0912/1135] docs: handle immutable headers error (#12543) * docs: handle immutable headers error * Update documentation/docs/30-advanced/20-hooks.md Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --------- Co-authored-by: Tee Ming Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- documentation/docs/30-advanced/20-hooks.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index a0f7a36c79c3..b35e66b73a09 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -67,6 +67,13 @@ export async function handle({ event, resolve }) { event.locals.user = await getUserInformation(event.cookies.get('sessionid')); const response = await resolve(event); + + // Note that modifying response headers isn't always safe. + // Response objects can have immutable headers + // (e.g. Response.redirect() returned from an endpoint). + // Modifying immutable headers throws a TypeError. + // In that case, clone the response or avoid creating a + // response object with immutable headers. response.headers.set('x-custom-header', 'potato'); return response; From 416dbdf67527dfe938dd1da4cddb12e90ffe0846 Mon Sep 17 00:00:00 2001 From: Elliott Johnson Date: Wed, 22 Jan 2025 00:12:00 -0700 Subject: [PATCH 0913/1135] feat: Improve errors from dev-time illegal module imports (#13329) * feat: Improve errors from dev-time illegal module imports * periodt * Update packages/kit/src/exports/vite/index.js Co-authored-by: Willow (GHOST) * chore: tests * fix tests * format --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> Co-authored-by: Willow (GHOST) Co-authored-by: Chew Tee Ming --- packages/kit/src/exports/vite/index.js | 11 ++- packages/kit/test/apps/dev-only/test/test.js | 76 +++++++++++++------- 2 files changed, 61 insertions(+), 26 deletions(-) diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index ddbe74618e81..82594f0979aa 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -421,15 +421,22 @@ async function kit({ svelte_config }) { const illegal_module = strip_virtual_prefix(relative); + const error_prefix = `Cannot import ${illegal_module} into client-side code. This could leak sensitive information.`; + const error_suffix = ` +Tips: + - To resolve this error, ensure that no exports from ${illegal_module} are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`; + if (import_map.has(illegal_module)) { const importer = path.relative( cwd, /** @type {string} */ (import_map.get(illegal_module)) ); - throw new Error(`Cannot import ${illegal_module} into client-side code: ${importer}`); + throw new Error(`${error_prefix}\nImported by: ${importer}.${error_suffix}`); } - throw new Error(`Cannot import ${illegal_module} into client-side code`); + throw new Error(`${error_prefix}${error_suffix}`); } } diff --git a/packages/kit/test/apps/dev-only/test/test.js b/packages/kit/test/apps/dev-only/test/test.js index 00a2288b1daf..7fad2ea676b0 100644 --- a/packages/kit/test/apps/dev-only/test/test.js +++ b/packages/kit/test/apps/dev-only/test/test.js @@ -16,72 +16,100 @@ test.describe.serial('Illegal imports', () => { await page.goto('/illegal-imports/env/dynamic-private', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/dynamic/private into client-side code: src/routes/illegal-imports/env/dynamic-private/+page.svelte' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import $env/dynamic/private into client-side code. This could leak sensitive information. +Imported by: src/routes/illegal-imports/env/dynamic-private/+page.svelte. +Tips: + - To resolve this error, ensure that no exports from $env/dynamic/private are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); test('$env/dynamic/private is not dynamically importable from the client', async ({ page }) => { await page.goto('/illegal-imports/env/dynamic-private-dynamic-import', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/dynamic/private into client-side code: src/routes/illegal-imports/env/dynamic-private-dynamic-import/+page.svelte' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import $env/dynamic/private into client-side code. This could leak sensitive information. +Imported by: src/routes/illegal-imports/env/dynamic-private-dynamic-import/+page.svelte. +Tips: + - To resolve this error, ensure that no exports from $env/dynamic/private are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); test('$env/static/private is not statically importable from the client', async ({ page }) => { await page.goto('/illegal-imports/env/static-private', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/static/private into client-side code: src/routes/illegal-imports/env/static-private/+page.svelte' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import $env/static/private into client-side code. This could leak sensitive information. +Imported by: src/routes/illegal-imports/env/static-private/+page.svelte. +Tips: + - To resolve this error, ensure that no exports from $env/static/private are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); test('$env/static/private is not dynamically importable from the client', async ({ page }) => { await page.goto('/illegal-imports/env/static-private-dynamic-import', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import $env/static/private into client-side code: src/routes/illegal-imports/env/static-private-dynamic-import/+page.svelte' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import $env/static/private into client-side code. This could leak sensitive information. +Imported by: src/routes/illegal-imports/env/static-private-dynamic-import/+page.svelte. +Tips: + - To resolve this error, ensure that no exports from $env/static/private are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); test('server-only module is not statically importable from the client', async ({ page }) => { await page.goto('/illegal-imports/server-only-modules/static-import', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import src/routes/illegal-imports/server-only-modules/illegal.server.js into client-side code' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import src/routes/illegal-imports/server-only-modules/illegal.server.js into client-side code. This could leak sensitive information. +Tips: + - To resolve this error, ensure that no exports from src/routes/illegal-imports/server-only-modules/illegal.server.js are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); test('server-only module is not dynamically importable from the client', async ({ page }) => { await page.goto('/illegal-imports/server-only-modules/dynamic-import', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import src/routes/illegal-imports/server-only-modules/illegal.server.js into client-side code' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import src/routes/illegal-imports/server-only-modules/illegal.server.js into client-side code. This could leak sensitive information. +Tips: + - To resolve this error, ensure that no exports from src/routes/illegal-imports/server-only-modules/illegal.server.js are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); test('server-only folder is not statically importable from the client', async ({ page }) => { await page.goto('/illegal-imports/server-only-folder/static-import', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import $lib/server/blah/private.js into client-side code' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import $lib/server/blah/private.js into client-side code. This could leak sensitive information. +Tips: + - To resolve this error, ensure that no exports from $lib/server/blah/private.js are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); test('server-only folder is not dynamically importable from the client', async ({ page }) => { await page.goto('/illegal-imports/server-only-folder/dynamic-import', { wait_for_started: false }); - expect(await page.textContent('.message-body')).toBe( - 'Cannot import $lib/server/blah/private.js into client-side code' - ); + expect(await page.textContent('.message-body')) + .toBe(`Cannot import $lib/server/blah/private.js into client-side code. This could leak sensitive information. +Tips: + - To resolve this error, ensure that no exports from $lib/server/blah/private.js are used, even transitively, in client-side code. + - If you're only using the import as a type, change it to \`import type\`. + - If you're not sure which module is causing this, try building your app -- it will create a more helpful error.`); }); }); From ca1d09f09ed123f72a98de031a34ec6db68fe915 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 22 Jan 2025 09:46:23 +0100 Subject: [PATCH 0914/1135] Version Packages (#13358) Co-authored-by: github-actions[bot] --- .changeset/dirty-doors-hide.md | 5 ----- .changeset/pretty-lizards-attend.md | 5 ----- .changeset/witty-teachers-film.md | 5 ----- packages/adapter-netlify/CHANGELOG.md | 6 ++++++ packages/adapter-netlify/package.json | 2 +- packages/package/CHANGELOG.md | 9 +++++++++ packages/package/package.json | 2 +- 7 files changed, 17 insertions(+), 17 deletions(-) delete mode 100644 .changeset/dirty-doors-hide.md delete mode 100644 .changeset/pretty-lizards-attend.md delete mode 100644 .changeset/witty-teachers-film.md diff --git a/.changeset/dirty-doors-hide.md b/.changeset/dirty-doors-hide.md deleted file mode 100644 index da40c8d476a1..000000000000 --- a/.changeset/dirty-doors-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/package': patch ---- - -chore: bump `svelte2tsx` dependency for more up-to-date `d.ts` output diff --git a/.changeset/pretty-lizards-attend.md b/.changeset/pretty-lizards-attend.md deleted file mode 100644 index 51d8dbc4bc7a..000000000000 --- a/.changeset/pretty-lizards-attend.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/package': patch ---- - -fix: adjust declaration map paths diff --git a/.changeset/witty-teachers-film.md b/.changeset/witty-teachers-film.md deleted file mode 100644 index 62e0c79a9ea4..000000000000 --- a/.changeset/witty-teachers-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-netlify': patch ---- - -fix: avoid unnecessary Netlify edge function invocations for static files, which resolves a conflict between Netlify Edge Functions and Netlify Identity diff --git a/packages/adapter-netlify/CHANGELOG.md b/packages/adapter-netlify/CHANGELOG.md index c1d077ff49aa..4f7041300a4d 100644 --- a/packages/adapter-netlify/CHANGELOG.md +++ b/packages/adapter-netlify/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-netlify +## 4.4.1 +### Patch Changes + + +- fix: avoid unnecessary Netlify edge function invocations for static files, which resolves a conflict between Netlify Edge Functions and Netlify Identity ([#12052](https://github.com/sveltejs/kit/pull/12052)) + ## 4.4.0 ### Minor Changes diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 6601bdc5e8d9..bcc1d4d2ed0f 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-netlify", - "version": "4.4.0", + "version": "4.4.1", "description": "A SvelteKit adapter that creates a Netlify app", "keywords": [ "adapter", diff --git a/packages/package/CHANGELOG.md b/packages/package/CHANGELOG.md index 329fc14bfa1a..5f6e96396313 100644 --- a/packages/package/CHANGELOG.md +++ b/packages/package/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/package +## 2.3.9 +### Patch Changes + + +- chore: bump `svelte2tsx` dependency for more up-to-date `d.ts` output ([#8843](https://github.com/sveltejs/kit/pull/8843)) + + +- fix: adjust declaration map paths ([#8843](https://github.com/sveltejs/kit/pull/8843)) + ## 2.3.8 ### Patch Changes diff --git a/packages/package/package.json b/packages/package/package.json index e3191faa8b31..8f2b68d0f04a 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/package", - "version": "2.3.8", + "version": "2.3.9", "description": "The fastest way to build Svelte packages", "repository": { "type": "git", From e1451fa0db9386daead15988c4f679c486fed4d8 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 23 Jan 2025 13:10:07 -0800 Subject: [PATCH 0915/1135] chore: upgrade to Vite 6.0.11 (#13366) --- packages/adapter-static/package.json | 2 +- .../test/apps/prerendered/package.json | 2 +- .../adapter-static/test/apps/spa/package.json | 2 +- packages/enhanced-img/package.json | 2 +- packages/kit/package.json | 2 +- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- .../test/apps/hash-based-routing/package.json | 2 +- packages/kit/test/apps/no-ssr/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- packages/kit/test/apps/writes/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../apps/private-dynamic-env/package.json | 2 +- .../package.json | 2 +- .../apps/private-static-env/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-folder/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-module/package.json | 2 +- .../package.json | 2 +- .../service-worker-private-env/package.json | 2 +- .../apps/syntax-error/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 2 +- .../test/prerendering/options/package.json | 2 +- .../test/prerendering/paths-base/package.json | 2 +- playgrounds/basic/package.json | 2 +- pnpm-lock.yaml | 242 +++++++++--------- 33 files changed, 153 insertions(+), 153 deletions(-) diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 8c212cbb07f4..77a66a9834c9 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -46,7 +46,7 @@ "sirv": "^3.0.0", "svelte": "^5.2.9", "typescript": "^5.3.3", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0" diff --git a/packages/adapter-static/test/apps/prerendered/package.json b/packages/adapter-static/test/apps/prerendered/package.json index c040f5a6b7e2..97dbdc3949a9 100644 --- a/packages/adapter-static/test/apps/prerendered/package.json +++ b/packages/adapter-static/test/apps/prerendered/package.json @@ -13,7 +13,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", "svelte": "^5.2.9", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/adapter-static/test/apps/spa/package.json b/packages/adapter-static/test/apps/spa/package.json index a13507f14424..f265383b717b 100644 --- a/packages/adapter-static/test/apps/spa/package.json +++ b/packages/adapter-static/test/apps/spa/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", "svelte": "^5.2.9", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index a46762d6003e..91c125e98851 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -48,7 +48,7 @@ "rollup": "^4.27.4", "svelte": "^5.2.9", "typescript": "^5.6.3", - "vite": "^6.0.1", + "vite": "^6.0.11", "vitest": "^3.0.1" }, "peerDependencies": { diff --git a/packages/kit/package.json b/packages/kit/package.json index 19d5d88873f3..c361f509f320 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -41,7 +41,7 @@ "svelte": "^5.2.9", "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", - "vite": "^6.0.1", + "vite": "^6.0.11", "vitest": "^3.0.1" }, "peerDependencies": { diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index 25ebbbebc084..b2a9247c9b91 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -21,7 +21,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index 2627746ce7fd..41a9d4795f9a 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -21,7 +21,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index 02f5605fc3f0..927b13d6639b 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -27,7 +27,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index ce95b4974ee9..cb4256a61991 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -19,7 +19,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/hash-based-routing/package.json b/packages/kit/test/apps/hash-based-routing/package.json index e3f1186e3069..dca93ac5ac1a 100644 --- a/packages/kit/test/apps/hash-based-routing/package.json +++ b/packages/kit/test/apps/hash-based-routing/package.json @@ -19,7 +19,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index f894c1cc0116..765ebb314dc9 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -19,7 +19,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index ffb334b0d7c3..2ccc8cb8f532 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -20,7 +20,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 6a2f5883f48f..c53a63b72c62 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -20,7 +20,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index 93bf67a7556f..5fa4dd93d654 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -19,7 +19,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index 57b7a858d66c..2866ca4ccbfc 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index 57b7a858d66c..2866ca4ccbfc 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index 476e7566e259..497158c7c610 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index baf4b7995a73..60a837ad906a 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index f1fb38292390..715ffb1f708e 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index e6cbe7084777..46b54337afdf 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index 7217befce459..c84a5acd95d3 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -17,7 +17,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index 123d621cc558..b69abaef5222 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index a1ffc94d9d47..bb63d0badfc5 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index d41ec5f19afd..0067f7f5d7de 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index 51ce8aebd0d0..8835d696aa4a 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index aaf360d34974..5bbcc1ba1faa 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index 466853ba6c0b..0f8adf3a1a1f 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index e2afad26e8e3..5ab8604383b5 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -14,7 +14,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module" } diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index a0b573ede480..48bd614e913d 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -16,7 +16,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1", + "vite": "^6.0.11", "vitest": "^3.0.1" }, "type": "module" diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index 484927908260..8b2de283d8a3 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -15,7 +15,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1", + "vite": "^6.0.11", "vitest": "^3.0.1" }, "type": "module" diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index a2215e7d379c..fb7ad38e5750 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -15,7 +15,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.1", + "vite": "^6.0.11", "vitest": "^3.0.1" }, "type": "module" diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index 777ff2d38116..e6fecc6caf1f 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -33,7 +33,7 @@ "svelte": "^5.2.9", "svelte-check": "^4.1.1", "typescript": "^5.5.0", - "vite": "^6.0.1" + "vite": "^6.0.11" }, "type": "module", "exports": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 2ee92a5c7df3..f7795edd7fa3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -140,7 +140,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -180,7 +180,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -207,7 +207,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -221,8 +221,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/prerendered: devDependencies: @@ -231,7 +231,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -239,8 +239,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/spa: devDependencies: @@ -252,7 +252,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -260,8 +260,8 @@ importers: specifier: ^5.2.9 version: 5.2.9 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-vercel: dependencies: @@ -277,7 +277,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -334,8 +334,8 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.0.1 version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -381,7 +381,7 @@ importers: version: 1.44.1 '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/connect': specifier: ^3.4.38 version: 3.4.38 @@ -407,8 +407,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.0.1 version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -423,7 +423,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -440,8 +440,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/basics: devDependencies: @@ -450,7 +450,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -464,8 +464,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/dev-only: devDependencies: @@ -474,7 +474,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -518,8 +518,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/embed: devDependencies: @@ -528,7 +528,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -542,8 +542,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/hash-based-routing: devDependencies: @@ -552,7 +552,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -566,8 +566,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/no-ssr: devDependencies: @@ -576,7 +576,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -590,8 +590,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options: devDependencies: @@ -603,7 +603,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -617,8 +617,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options-2: devDependencies: @@ -630,7 +630,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -644,8 +644,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/writes: devDependencies: @@ -654,7 +654,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -668,8 +668,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors: devDependencies: @@ -687,7 +687,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -698,8 +698,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment: devDependencies: @@ -711,7 +711,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -722,8 +722,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-not-prerendered: devDependencies: @@ -735,7 +735,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -746,8 +746,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env: devDependencies: @@ -756,7 +756,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -767,8 +767,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import: devDependencies: @@ -777,7 +777,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -788,8 +788,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env: devDependencies: @@ -798,7 +798,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -812,8 +812,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env-dynamic-import: devDependencies: @@ -822,7 +822,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -833,8 +833,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder: devDependencies: @@ -843,7 +843,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -854,8 +854,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder-dynamic-import: devDependencies: @@ -864,7 +864,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -875,8 +875,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module: devDependencies: @@ -885,7 +885,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -896,8 +896,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module-dynamic-import: devDependencies: @@ -906,7 +906,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -917,8 +917,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-dynamic-public-env: devDependencies: @@ -927,7 +927,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -938,8 +938,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-private-env: devDependencies: @@ -948,7 +948,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -959,8 +959,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/syntax-error: devDependencies: @@ -969,7 +969,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -980,8 +980,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/basics: devDependencies: @@ -990,7 +990,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -1001,8 +1001,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.0.1 version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1014,7 +1014,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -1025,8 +1025,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.0.1 version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1038,7 +1038,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.2.9 version: 5.2.9 @@ -1049,8 +1049,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.0.1 version: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1075,7 +1075,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1135,7 +1135,7 @@ importers: version: link:../../packages/package '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) prettier: specifier: ^3.3.2 version: 3.3.3 @@ -1155,8 +1155,8 @@ importers: specifier: ^5.5.0 version: 5.6.3 vite: - specifier: ^6.0.1 - version: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) packages: @@ -2602,8 +2602,8 @@ packages: get-source@2.0.12: resolution: {integrity: sha512-X5+4+iD+HoSeEED+uwrQ07BOQr0kEDFMVqqpBuI+RaZBpBpHCuXxo70bjar6f0b0u/DQJsJ7ssurpP0V60Az+w==} - get-tsconfig@4.8.1: - resolution: {integrity: sha512-k9PN+cFBmaLWtVz29SkUoqU5O0slLuHJXt/2P+tMVFT+phsSGXGkp9t3rQIqdz0e+06EHNGs3oM6ZX1s2zHxRg==} + get-tsconfig@4.10.0: + resolution: {integrity: sha512-kGzZ3LWWQcGIAmg6iWvXn0ei6WDtV26wzHRMwDSzmAbcXrTEXxHy6IehI6/4eT6VRKyMP1eF1VqwrVUmE/LR7A==} glob-parent@5.1.2: resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} @@ -3533,8 +3533,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.0.7: - resolution: {integrity: sha512-RDt8r/7qx9940f8FcOIAH9PTViRrghKaK2K1jY3RaAURrEUbm9Du1mJ72G+jlhtG3WwodnfzY8ORQZbBavZEAQ==} + vite@6.0.11: + resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -4369,25 +4369,25 @@ snapshots: typescript: 5.6.3 typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 svelte: 5.2.9 - vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.2.9 - vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 1.0.4(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.4(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) transitivePeerDependencies: - supports-color @@ -4542,13 +4542,13 @@ snapshots: chai: 5.1.2 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.1(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1))': + '@vitest/mocker@3.0.1(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: '@vitest/spy': 3.0.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) '@vitest/pretty-format@3.0.1': dependencies: @@ -4886,7 +4886,7 @@ snapshots: enhanced-resolve: 5.18.0 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) - get-tsconfig: 4.8.1 + get-tsconfig: 4.10.0 globals: 15.14.0 ignore: 5.3.2 minimatch: 9.0.5 @@ -5100,7 +5100,7 @@ snapshots: data-uri-to-buffer: 2.0.2 source-map: 0.6.1 - get-tsconfig@4.8.1: + get-tsconfig@4.10.0: dependencies: resolve-pkg-maps: 1.0.0 @@ -5955,7 +5955,7 @@ snapshots: debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.1 - vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - '@types/node' - jiti @@ -5970,7 +5970,7 @@ snapshots: - tsx - yaml - vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1): + vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: esbuild: 0.24.2 postcss: 8.5.1 @@ -5980,14 +5980,14 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.24.1 - vitefu@1.0.4(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)): + vitefu@1.0.4(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)): optionalDependencies: - vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vitest@3.0.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: '@vitest/expect': 3.0.1 - '@vitest/mocker': 3.0.1(vite@6.0.7(@types/node@18.19.50)(lightningcss@1.24.1)) + '@vitest/mocker': 3.0.1(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@vitest/pretty-format': 3.0.1 '@vitest/runner': 3.0.1 '@vitest/snapshot': 3.0.1 @@ -6003,7 +6003,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.0.7(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vite-node: 3.0.1(@types/node@18.19.50)(lightningcss@1.24.1) why-is-node-running: 2.3.0 optionalDependencies: From b8f678b01d8ac4bbdc7975a629f4e02eb0c3c96e Mon Sep 17 00:00:00 2001 From: Elliott Johnson Date: Thu, 23 Jan 2025 16:45:21 -0700 Subject: [PATCH 0916/1135] feat: Remove repository-sync workflows in favor of github-docs-bot (#13367) * feat: Remove repository-sync workflows in favor of github-docs-bot * does this fix this idiotic test --- .../workflows/docs-preview-create-request.yml | 26 ------------------ .../workflows/docs-preview-delete-request.yml | 27 ------------------- .github/workflows/sync-request.yml | 22 --------------- .../test/apps/hash-based-routing/test/test.js | 1 + 4 files changed, 1 insertion(+), 75 deletions(-) delete mode 100644 .github/workflows/docs-preview-create-request.yml delete mode 100644 .github/workflows/docs-preview-delete-request.yml delete mode 100644 .github/workflows/sync-request.yml diff --git a/.github/workflows/docs-preview-create-request.yml b/.github/workflows/docs-preview-create-request.yml deleted file mode 100644 index bc5b40f95148..000000000000 --- a/.github/workflows/docs-preview-create-request.yml +++ /dev/null @@ -1,26 +0,0 @@ -# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md -name: Docs preview create request - -on: - pull_request_target: - branches: - - main - -jobs: - dispatch: - runs-on: ubuntu-latest - steps: - - name: Repository Dispatch - uses: peter-evans/repository-dispatch@v3 - with: - token: ${{ secrets.SYNC_REQUEST_TOKEN }} - repository: sveltejs/svelte.dev - event-type: docs-preview-create - client-payload: |- - { - "package": "kit", - "repo": "${{ github.repository }}", - "owner": "${{ github.event.pull_request.head.repo.owner.login }}", - "branch": "${{ github.event.pull_request.head.ref }}", - "pr": ${{ github.event.pull_request.number }} - } diff --git a/.github/workflows/docs-preview-delete-request.yml b/.github/workflows/docs-preview-delete-request.yml deleted file mode 100644 index fc96fcfa3fc1..000000000000 --- a/.github/workflows/docs-preview-delete-request.yml +++ /dev/null @@ -1,27 +0,0 @@ -# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md -name: Docs preview delete request - -on: - pull_request_target: - branches: - - main - types: [closed] - -jobs: - dispatch: - runs-on: ubuntu-latest - steps: - - name: Repository Dispatch - uses: peter-evans/repository-dispatch@v3 - with: - token: ${{ secrets.SYNC_REQUEST_TOKEN }} - repository: sveltejs/svelte.dev - event-type: docs-preview-delete - client-payload: |- - { - "package": "kit", - "repo": "${{ github.repository }}", - "owner": "${{ github.event.pull_request.head.repo.owner.login }}", - "branch": "${{ github.event.pull_request.head.ref }}", - "pr": ${{ github.event.pull_request.number }} - } diff --git a/.github/workflows/sync-request.yml b/.github/workflows/sync-request.yml deleted file mode 100644 index 0e09c5b9a4bc..000000000000 --- a/.github/workflows/sync-request.yml +++ /dev/null @@ -1,22 +0,0 @@ -# https://github.com/sveltejs/svelte.dev/blob/main/apps/svelte.dev/scripts/sync-docs/README.md -name: Sync request - -on: - push: - branches: - - main - -jobs: - dispatch: - runs-on: ubuntu-latest - steps: - - name: Repository Dispatch - uses: peter-evans/repository-dispatch@v3 - with: - token: ${{ secrets.SYNC_REQUEST_TOKEN }} - repository: sveltejs/svelte.dev - event-type: sync-request - client-payload: |- - { - "package": "kit" - } diff --git a/packages/kit/test/apps/hash-based-routing/test/test.js b/packages/kit/test/apps/hash-based-routing/test/test.js index d7962d380ea4..12589824e332 100644 --- a/packages/kit/test/apps/hash-based-routing/test/test.js +++ b/packages/kit/test/apps/hash-based-routing/test/test.js @@ -94,6 +94,7 @@ test.describe('hash based navigation', () => { await page.goto('/#/anchor'); await page.locator('a[href="#test"]').click(); + await page.waitForURL('#/anchor#test'); await expect(page.locator('#test')).toHaveText('#test'); const url = new URL(page.url()); expect(url.hash).toBe('#/anchor#test'); From 2b7b0d1cd9f3c0af55a11bcc900c148d643d6d06 Mon Sep 17 00:00:00 2001 From: Elliott Johnson Date: Thu, 23 Jan 2025 17:26:13 -0700 Subject: [PATCH 0917/1135] chore: Inconsequential change to docs to test sync (#13369) * oops * inconsequential change to docs to test sync --- documentation/docs/40-best-practices/03-auth.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/40-best-practices/03-auth.md b/documentation/docs/40-best-practices/03-auth.md index a68197ef8bbb..40ceb28acdbb 100644 --- a/documentation/docs/40-best-practices/03-auth.md +++ b/documentation/docs/40-best-practices/03-auth.md @@ -18,6 +18,6 @@ Auth [cookies](@sveltejs-kit#Cookies) can be checked inside [server hooks](hooks ## Guides -[Lucia](https://lucia-auth.com/) is a reference for session-based web app auth. It contains example code snippets and projects for implementing session-based auth within SvelteKit and other JS projects. You can add code which follows the Lucia guide to your project with `npx sv create` when creating a new project or `npx sv add lucia` for an existing project. +[Lucia](https://lucia-auth.com/) is a good reference for session-based web app auth. It contains example code snippets and projects for implementing session-based auth within SvelteKit and other JS projects. You can add code which follows the Lucia guide to your project with `npx sv create` when creating a new project or `npx sv add lucia` for an existing project. An auth system is tightly coupled to a web framework because most of the code lies in validating user input, handling errors, and directing users to the appropriate next page. As a result, many of the generic JS auth libraries include one or more web frameworks within them. For this reason, many users will find it preferrable to follow a SvelteKit-specific guide such as the examples found in [Lucia](https://lucia-auth.com/) rather than having multiple web frameworks inside their project. From 01f001bd861e399027a580c9402b7b6206de3d24 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 24 Jan 2025 23:37:42 +0800 Subject: [PATCH 0918/1135] docs: fix 32 character long generation code snippet (#13372) * Update 90-adapter-vercel.md * Update documentation/docs/25-build-and-deploy/90-adapter-vercel.md Co-authored-by: Elliott Johnson --------- Co-authored-by: Elliott Johnson --- .../docs/25-build-and-deploy/90-adapter-vercel.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index c3b6637571b5..b06fb3393476 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -124,16 +124,16 @@ Making a `GET` or `HEAD` request with `x-prerender-revalidate: ` will for Note that the `BYPASS_TOKEN` string must be at least 32 characters long. You could generate one using the JavaScript console like so: -```console -btoa(Math.random().toString()).substring(0,32); +```js +crypto.randomUUID(); ``` Set this string as an environment variable on Vercel by logging in and going to your project then Settings > Environment Variables. For "Key" put `BYPASS_TOKEN` and for "value" use the string generated above, then hit "Save". To get this key known about for local development, you can use the [Vercel CLI](https://vercel.com/docs/cli/env) by running the `vercel env pull` command locally like so: -```console -$ vercel env pull .env.development.local +```sh +vercel env pull .env.development.local ``` ### allowQuery From ced7db1ee260b63cdb94953e297875ded753fbc3 Mon Sep 17 00:00:00 2001 From: Matei Trandafir Date: Sat, 25 Jan 2025 19:21:21 +0200 Subject: [PATCH 0919/1135] chore: update to chokidar 4.0.3 (#13381) --- .changeset/neat-mirrors-rush.md | 5 +++++ packages/package/package.json | 2 +- packages/package/src/index.js | 1 + pnpm-lock.yaml | 14 +++++++------- 4 files changed, 14 insertions(+), 8 deletions(-) create mode 100644 .changeset/neat-mirrors-rush.md diff --git a/.changeset/neat-mirrors-rush.md b/.changeset/neat-mirrors-rush.md new file mode 100644 index 000000000000..2315b1cee766 --- /dev/null +++ b/.changeset/neat-mirrors-rush.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/package": patch +--- + +chore: update to chokidar 4.0.3 diff --git a/packages/package/package.json b/packages/package/package.json index 8f2b68d0f04a..1b833fa63c94 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -20,7 +20,7 @@ "homepage": "https://svelte.dev", "type": "module", "dependencies": { - "chokidar": "^4.0.0", + "chokidar": "^4.0.3", "kleur": "^4.1.5", "sade": "^1.8.1", "semver": "^7.5.4", diff --git a/packages/package/src/index.js b/packages/package/src/index.js index 2630e657cdb5..1f25fb3b0eab 100644 --- a/packages/package/src/index.js +++ b/packages/package/src/index.js @@ -78,6 +78,7 @@ export async function watch(options) { let timeout; const watcher = chokidar.watch(input, { ignoreInitial: true }); + /** @type {Promise} */ const ready = new Promise((resolve) => watcher.on('ready', resolve)); watcher.on('all', (type, filepath) => { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f7795edd7fa3..e918a1764f38 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1058,8 +1058,8 @@ importers: packages/package: dependencies: chokidar: - specifier: ^4.0.0 - version: 4.0.1 + specifier: ^4.0.3 + version: 4.0.3 kleur: specifier: ^4.1.5 version: 4.1.5 @@ -2228,8 +2228,8 @@ packages: resolution: {integrity: sha512-OAlb+T7V4Op9OwdkjmguYRqncdlx5JiofwOAUkmTF+jNdHwzTaTs4sRAGpzLF3oOz5xAyDGrPgeIDFQmDOTiJw==} engines: {node: '>= 16'} - chokidar@4.0.1: - resolution: {integrity: sha512-n8enUVCED/KVRQlab1hr3MVpcVMvxtZjmEa956u+4YijlmQED223XMSYj2tLuKvr4jcCTzNNMpQDUer72MMmzA==} + chokidar@4.0.3: + resolution: {integrity: sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==} engines: {node: '>= 14.16.0'} chownr@3.0.0: @@ -4687,7 +4687,7 @@ snapshots: check-error@2.1.1: {} - chokidar@4.0.1: + chokidar@4.0.3: dependencies: readdirp: 4.0.1 @@ -5783,7 +5783,7 @@ snapshots: svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 - chokidar: 4.0.1 + chokidar: 4.0.3 fdir: 6.4.0(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 @@ -6058,7 +6058,7 @@ snapshots: '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) blake3-wasm: 2.1.5 - chokidar: 4.0.1 + chokidar: 4.0.3 date-fns: 4.1.0 esbuild: 0.17.19 itty-time: 1.0.6 From 75f6cd8f1233d112e6b4cb50c79afee47649653d Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 28 Jan 2025 03:27:43 +0800 Subject: [PATCH 0920/1135] fix: prevent Vitest from hanging (#13373) --- .changeset/rare-berries-retire.md | 6 ++++++ packages/adapter-cloudflare-workers/index.js | 13 +++++++------ packages/adapter-cloudflare/index.js | 13 +++++++------ 3 files changed, 20 insertions(+), 12 deletions(-) create mode 100644 .changeset/rare-berries-retire.md diff --git a/.changeset/rare-berries-retire.md b/.changeset/rare-berries-retire.md new file mode 100644 index 000000000000..0017a576bbfa --- /dev/null +++ b/.changeset/rare-berries-retire.md @@ -0,0 +1,6 @@ +--- +'@sveltejs/adapter-cloudflare-workers': patch +'@sveltejs/adapter-cloudflare': patch +--- + +fix: prevent Vitest from hanging, which was not fully addressed in [#12830](https://github.com/sveltejs/kit/pull/12830) diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js index be1d98245cbd..5da3fe275022 100644 --- a/packages/adapter-cloudflare-workers/index.js +++ b/packages/adapter-cloudflare-workers/index.js @@ -152,7 +152,7 @@ export default function ({ config = 'wrangler.toml', platformProxy = {} } = {}) emulate() { // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. // If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens - const getting_platform = (async () => { + const get_emulated = async () => { const proxy = await getPlatformProxy(platformProxy); const platform = /** @type {App.Platform} */ ({ env: proxy.env, @@ -160,11 +160,9 @@ export default function ({ config = 'wrangler.toml', platformProxy = {} } = {}) caches: proxy.caches, cf: proxy.cf }); - /** @type {Record} */ const env = {}; const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); - for (const key in proxy.env) { Object.defineProperty(env, key, { get: () => { @@ -173,12 +171,15 @@ export default function ({ config = 'wrangler.toml', platformProxy = {} } = {}) }); } return { platform, prerender_platform }; - })(); + }; + + /** @type {{ platform: App.Platform, prerender_platform: App.Platform }} */ + let emulated; return { platform: async ({ prerender }) => { - const { platform, prerender_platform } = await getting_platform; - return prerender ? prerender_platform : platform; + emulated ??= await get_emulated(); + return prerender ? emulated.prerender_platform : emulated.platform; } }; } diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index fa47122abe29..e00eb9889929 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -70,7 +70,7 @@ export default function (options = {}) { emulate() { // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. // If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens - const getting_platform = (async () => { + const get_emulated = async () => { const proxy = await getPlatformProxy(options.platformProxy); const platform = /** @type {App.Platform} */ ({ env: proxy.env, @@ -78,11 +78,9 @@ export default function (options = {}) { caches: proxy.caches, cf: proxy.cf }); - /** @type {Record} */ const env = {}; const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); - for (const key in proxy.env) { Object.defineProperty(env, key, { get: () => { @@ -91,12 +89,15 @@ export default function (options = {}) { }); } return { platform, prerender_platform }; - })(); + }; + + /** @type {{ platform: App.Platform, prerender_platform: App.Platform }} */ + let emulated; return { platform: async ({ prerender }) => { - const { platform, prerender_platform } = await getting_platform; - return prerender ? prerender_platform : platform; + emulated ??= await get_emulated(); + return prerender ? emulated.prerender_platform : emulated.platform; } }; } From f30352f874790b9de0bd0eba985a21aef23e158e Mon Sep 17 00:00:00 2001 From: James Glenn <47917431+JR-G@users.noreply.github.com> Date: Wed, 29 Jan 2025 21:51:13 +0000 Subject: [PATCH 0921/1135] feat: validate values for `cache-control` and `content-type` headers in dev mode (#13114) * Add header validator * Validate headers * Test route for the invalid headers * changeset * Capture all IANA top level content types * chore: Slight improvements before merge * ugh lint --------- Co-authored-by: S. Elliott Johnson --- .changeset/rich-pants-beam.md | 5 + packages/kit/src/runtime/server/respond.js | 6 ++ .../src/runtime/server/validate-headers.js | 64 ++++++++++++ .../runtime/server/validate-headers.spec.js | 99 +++++++++++++++++++ .../src/routes/headers/invalid/+server.js | 9 ++ 5 files changed, 183 insertions(+) create mode 100644 .changeset/rich-pants-beam.md create mode 100644 packages/kit/src/runtime/server/validate-headers.js create mode 100644 packages/kit/src/runtime/server/validate-headers.spec.js create mode 100644 packages/kit/test/apps/dev-only/src/routes/headers/invalid/+server.js diff --git a/.changeset/rich-pants-beam.md b/.changeset/rich-pants-beam.md new file mode 100644 index 000000000000..bc87729ebebd --- /dev/null +++ b/.changeset/rich-pants-beam.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: validate values for `cache-control` and `content-type` headers in dev mode diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 5f5ae7b795e4..d95ba3514166 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -33,8 +33,10 @@ import { INVALIDATED_PARAM, TRAILING_SLASH_PARAM } from '../shared.js'; import { get_public_env } from './env_module.js'; import { load_page_nodes } from './page/load_page_nodes.js'; import { get_page_config } from '../../utils/route_config.js'; +import { validateHeaders } from './validate-headers.js'; /* global __SVELTEKIT_ADAPTER_NAME__ */ +/* global __SVELTEKIT_DEV__ */ /** @type {import('types').RequiredResolveOptions['transformPageChunk']} */ const default_transform = ({ html }) => html; @@ -186,6 +188,10 @@ export async function respond(request, options, manifest, state) { request, route: { id: route?.id ?? null }, setHeaders: (new_headers) => { + if (__SVELTEKIT_DEV__) { + validateHeaders(new_headers); + } + for (const key in new_headers) { const lower = key.toLowerCase(); const value = new_headers[key]; diff --git a/packages/kit/src/runtime/server/validate-headers.js b/packages/kit/src/runtime/server/validate-headers.js new file mode 100644 index 000000000000..6da978574108 --- /dev/null +++ b/packages/kit/src/runtime/server/validate-headers.js @@ -0,0 +1,64 @@ +/** @type {Set} */ +const VALID_CACHE_CONTROL_DIRECTIVES = new Set([ + 'max-age', + 'public', + 'private', + 'no-cache', + 'no-store', + 'must-revalidate', + 'proxy-revalidate', + 's-maxage', + 'immutable', + 'stale-while-revalidate', + 'stale-if-error', + 'no-transform', + 'only-if-cached', + 'max-stale', + 'min-fresh' +]); + +const CONTENT_TYPE_PATTERN = + /^(application|audio|example|font|haptics|image|message|model|multipart|text|video|x-[a-z]+)\/[-+.\w]+$/i; + +/** @type {Record void>} */ +const HEADER_VALIDATORS = { + 'cache-control': (value) => { + const error_suffix = `(While parsing "${value}".)`; + const parts = value.split(',').map((part) => part.trim()); + if (parts.some((part) => !part)) { + throw new Error(`\`cache-control\` header contains empty directives. ${error_suffix}`); + } + + const directives = parts.map((part) => part.split('=')[0].toLowerCase()); + const invalid = directives.find((directive) => !VALID_CACHE_CONTROL_DIRECTIVES.has(directive)); + if (invalid) { + throw new Error( + `Invalid cache-control directive "${invalid}". Did you mean one of: ${[...VALID_CACHE_CONTROL_DIRECTIVES].join(', ')}? ${error_suffix}` + ); + } + }, + + 'content-type': (value) => { + const type = value.split(';')[0].trim(); + const error_suffix = `(While parsing "${value}".)`; + if (!CONTENT_TYPE_PATTERN.test(type)) { + throw new Error(`Invalid content-type value "${type}". ${error_suffix}`); + } + } +}; + +/** + * @param {Record} headers + */ +export function validateHeaders(headers) { + for (const [key, value] of Object.entries(headers)) { + const validator = HEADER_VALIDATORS[key.toLowerCase()]; + try { + validator?.(value); + } catch (error) { + if (error instanceof Error) { + console.warn(`[SvelteKit] ${error.message}`); + } + } + } +} diff --git a/packages/kit/src/runtime/server/validate-headers.spec.js b/packages/kit/src/runtime/server/validate-headers.spec.js new file mode 100644 index 000000000000..0a043314a0c5 --- /dev/null +++ b/packages/kit/src/runtime/server/validate-headers.spec.js @@ -0,0 +1,99 @@ +import { describe, test, expect, beforeEach, vi } from 'vitest'; +import { validateHeaders } from './validate-headers.js'; + +describe('validateHeaders', () => { + const console_warn_spy = vi.spyOn(console, 'warn'); + + beforeEach(() => { + vi.resetAllMocks(); + }); + + describe('cache-control header', () => { + test('accepts valid directives', () => { + validateHeaders({ 'cache-control': 'public, max-age=3600' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); + + test('rejects invalid directives', () => { + validateHeaders({ 'cache-control': 'public, maxage=3600' }); + expect(console_warn_spy).toHaveBeenCalledWith( + expect.stringContaining('Invalid cache-control directive "maxage"') + ); + }); + + test('rejects empty directives', () => { + validateHeaders({ 'cache-control': 'public,, max-age=3600' }); + expect(console_warn_spy).toHaveBeenCalledWith( + expect.stringContaining('`cache-control` header contains empty directives') + ); + + validateHeaders({ 'cache-control': 'public, , max-age=3600' }); + expect(console_warn_spy).toHaveBeenCalledWith( + expect.stringContaining('`cache-control` header contains empty directives') + ); + }); + + test('accepts multiple cache-control values', () => { + validateHeaders({ 'cache-control': 'max-age=3600, s-maxage=7200' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); + }); + + describe('content-type header', () => { + test('accepts standard content types', () => { + validateHeaders({ 'content-type': 'application/json' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); + + test('accepts content types with parameters', () => { + validateHeaders({ 'content-type': 'text/html; charset=utf-8' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + + validateHeaders({ 'content-type': 'application/javascript; charset=utf-8' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); + + test('accepts vendor-specific content types', () => { + validateHeaders({ 'content-type': 'x-custom/whatever' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); + + test('rejects malformed content types', () => { + validateHeaders({ 'content-type': 'invalid-content-type' }); + expect(console_warn_spy).toHaveBeenCalledWith( + expect.stringContaining('Invalid content-type value "invalid-content-type"') + ); + }); + + test('rejects invalid content type categories', () => { + validateHeaders({ 'content-type': 'invalid/type; invalid=param' }); + expect(console_warn_spy).toHaveBeenCalledWith( + expect.stringContaining('Invalid content-type value "invalid/type"') + ); + + validateHeaders({ 'content-type': 'bad/type; charset=utf-8' }); + expect(console_warn_spy).toHaveBeenCalledWith( + expect.stringContaining('Invalid content-type value "bad/type"') + ); + }); + + test('handles case-insensitive content-types', () => { + validateHeaders({ 'content-type': 'TEXT/HTML; charset=utf-8' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); + }); + + test('allows unknown headers', () => { + validateHeaders({ 'x-custom-header': 'some-value' }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); + + test('handles multiple headers simultaneously', () => { + validateHeaders({ + 'cache-control': 'max-age=3600', + 'content-type': 'text/html', + 'x-custom': 'value' + }); + expect(console_warn_spy).not.toHaveBeenCalled(); + }); +}); diff --git a/packages/kit/test/apps/dev-only/src/routes/headers/invalid/+server.js b/packages/kit/test/apps/dev-only/src/routes/headers/invalid/+server.js new file mode 100644 index 000000000000..91b98c75e0c3 --- /dev/null +++ b/packages/kit/test/apps/dev-only/src/routes/headers/invalid/+server.js @@ -0,0 +1,9 @@ +/** @type {import("@sveltejs/kit").RequestHandler} */ +export function GET({ setHeaders }) { + setHeaders({ + 'cache-control': 'totally-invalid', + 'content-type': 'not-a-real-type' + }); + + return new Response('Testing invalid headers'); +} From d62ed39a431f0db3db4dd90bf6b17ed2a2a2de79 Mon Sep 17 00:00:00 2001 From: Alois Klink Date: Thu, 30 Jan 2025 18:27:39 +0900 Subject: [PATCH 0922/1135] fix: skip calling `respond` for server-side `fetch` on prerendered pages (#13377) When using server-side fetch for internal requests, if a server route is matched from the server `manifest.js`, it gets called without making a real HTTP request. However, prerendered routes are not included on this list! This is fine when routes are prerendered with `export const prerender = true;`, but will cause issues with a non-prerendered route also matches the same URL as any prerendered routes. This commit adds `prerendered_routes: Set` to the `manifest.js`, which skips calling the non-prerendered route. Fixes #12778 Fixes #12739 --- .changeset/nine-llamas-fetch.md | 5 ++++ .changeset/slow-penguins-play.md | 5 ++++ packages/kit/src/core/adapt/builder.js | 2 ++ .../kit/src/core/generate_manifest/index.js | 4 +++- packages/kit/src/exports/public.d.ts | 1 + packages/kit/src/exports/vite/dev/index.js | 1 + packages/kit/src/exports/vite/index.js | 3 +++ packages/kit/src/runtime/server/fetch.js | 12 ++++++++++ .../kit/test/apps/basics/src/hooks.server.js | 10 ++++++++ .../api-with-param/[option]/+server.js | 23 +++++++++++++++++++ .../prerendered-endpoint/proxy/+server.js | 6 ++++- .../kit/test/apps/basics/test/server.test.js | 21 +++++++++++++++++ packages/kit/types/index.d.ts | 1 + 13 files changed, 92 insertions(+), 2 deletions(-) create mode 100644 .changeset/nine-llamas-fetch.md create mode 100644 .changeset/slow-penguins-play.md create mode 100644 packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/api-with-param/[option]/+server.js diff --git a/.changeset/nine-llamas-fetch.md b/.changeset/nine-llamas-fetch.md new file mode 100644 index 000000000000..3219bf2212e2 --- /dev/null +++ b/.changeset/nine-llamas-fetch.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: skip hooks for server fetch to prerendered routes diff --git a/.changeset/slow-penguins-play.md b/.changeset/slow-penguins-play.md new file mode 100644 index 000000000000..55ea759db7cc --- /dev/null +++ b/.changeset/slow-penguins-play.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: default server fetch to use prerendered paths diff --git a/packages/kit/src/core/adapt/builder.js b/packages/kit/src/core/adapt/builder.js index e02efbdd1e28..855a26300f0e 100644 --- a/packages/kit/src/core/adapt/builder.js +++ b/packages/kit/src/core/adapt/builder.js @@ -138,6 +138,7 @@ export function create_builder({ generateManifest: ({ relativePath }) => generate_manifest({ build_data, + prerendered: [], relative_path: relativePath, routes: Array.from(filtered) }) @@ -185,6 +186,7 @@ export function create_builder({ generateManifest({ relativePath, routes: subset }) { return generate_manifest({ build_data, + prerendered: prerendered.paths, relative_path: relativePath, routes: subset ? subset.map((route) => /** @type {import('types').RouteData} */ (lookup.get(route))) diff --git a/packages/kit/src/core/generate_manifest/index.js b/packages/kit/src/core/generate_manifest/index.js index a2ef4cd4c619..c4f4a5935f4f 100644 --- a/packages/kit/src/core/generate_manifest/index.js +++ b/packages/kit/src/core/generate_manifest/index.js @@ -14,11 +14,12 @@ import { find_server_assets } from './find_server_assets.js'; * build process, to power routing, etc. * @param {{ * build_data: import('types').BuildData; + * prerendered: string[]; * relative_path: string; * routes: import('types').RouteData[]; * }} opts */ -export function generate_manifest({ build_data, relative_path, routes }) { +export function generate_manifest({ build_data, prerendered, relative_path, routes }) { /** * @type {Map} The new index of each node in the filtered nodes array */ @@ -113,6 +114,7 @@ export function generate_manifest({ build_data, relative_path, routes }) { `; }).filter(Boolean).join(',\n')} ], + prerendered_routes: new Set(${s(prerendered)}), matchers: async () => { ${Array.from( matchers, diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 0d5888be0699..192d28b33f45 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1297,6 +1297,7 @@ export interface SSRManifest { client: NonNullable; nodes: SSRNodeLoader[]; routes: SSRRoute[]; + prerendered_routes: Set; matchers: () => Promise>; /** A `[file]: size` map of all assets imported by server code */ server_assets: Record; diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index bca3f84160cb..38d224871933 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -222,6 +222,7 @@ export async function dev(vite, vite_config, svelte_config) { return result; }; }), + prerendered_routes: new Set(), routes: compact( manifest_data.routes.map((route) => { if (!route.page && !route.endpoint) return null; diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 82594f0979aa..bd153e2ca7a1 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -795,6 +795,7 @@ Tips: manifest_path, `export const manifest = ${generate_manifest({ build_data, + prerendered: [], relative_path: '.', routes: manifest_data.routes })};\n` @@ -917,6 +918,7 @@ Tips: manifest_path, `export const manifest = ${generate_manifest({ build_data, + prerendered: [], relative_path: '.', routes: manifest_data.routes })};\n` @@ -948,6 +950,7 @@ Tips: `${out}/server/manifest.js`, `export const manifest = ${generate_manifest({ build_data, + prerendered: prerendered.paths, relative_path: '.', routes: manifest_data.routes.filter((route) => prerender_map.get(route.id) !== true) })};\n` diff --git a/packages/kit/src/runtime/server/fetch.js b/packages/kit/src/runtime/server/fetch.js index 417b59c93063..81bd5c665d8e 100644 --- a/packages/kit/src/runtime/server/fetch.js +++ b/packages/kit/src/runtime/server/fetch.js @@ -112,6 +112,18 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade return await fetch(request); } + if ( + manifest._.prerendered_routes.has(decoded) || + (decoded.at(-1) === '/' && manifest._.prerendered_routes.has(decoded.slice(0, -1))) + ) { + // The path of something prerendered could match a different route + // that is still in the manifest, leading to the wrong route being loaded. + // We therefore bail early here. The prerendered logic is different for + // each adapter, (except maybe for prerendered redirects) + // so we need to make an actual HTTP request. + return await fetch(request); + } + if (credentials !== 'omit') { const cookie = get_cookie_header(url, request.headers.get('cookie')); if (cookie) { diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index e485d038d995..1c825a6a6c90 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -1,3 +1,4 @@ +import { building, dev } from '$app/environment'; import { error, isHttpError, redirect } from '@sveltejs/kit'; import { sequence } from '@sveltejs/kit/hooks'; import fs from 'node:fs'; @@ -136,6 +137,15 @@ export const handle = sequence( return resolve(event); }, + async ({ event, resolve }) => { + if (!dev && !building && event.url.pathname === '/prerendering/prerendered-endpoint/api') { + error( + 500, + `Server hooks should not be called for prerendered endpoints: isSubRequest=${event.isSubRequest}` + ); + } + return resolve(event); + }, async ({ event, resolve }) => { if (['/non-existent-route', '/non-existent-route-loop'].includes(event.url.pathname)) { event.locals.url = new URL(event.request.url); diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/api-with-param/[option]/+server.js b/packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/api-with-param/[option]/+server.js new file mode 100644 index 000000000000..fab18b27ef41 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/api-with-param/[option]/+server.js @@ -0,0 +1,23 @@ +import { building, dev } from '$app/environment'; +import { error, json } from '@sveltejs/kit'; + +export const prerender = 'auto'; + +export function entries() { + return [ + { + option: 'prerendered' + } + ]; +} + +export async function GET({ params: { option } }) { + if ((await entries()).find((entry) => entry.option === option)) { + if (dev || building) { + return json({ message: 'Im prerendered and called from a non-prerendered +page.server.js' }); + } else { + error(500, 'I should not be called at runtime because I am prerendered'); + } + } + return json({ message: 'Im not prerendered' }); +} diff --git a/packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/proxy/+server.js b/packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/proxy/+server.js index 59396b64d3ad..63cf350239b0 100644 --- a/packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/proxy/+server.js +++ b/packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/proxy/+server.js @@ -1,3 +1,7 @@ -export async function GET({ fetch }) { +export async function GET({ fetch, url }) { + if (url.searchParams.get('api-with-param-option') === 'prerendered') { + return await fetch('/prerendering/prerendered-endpoint/api-with-param/prerendered'); + } + return await fetch('/prerendering/prerendered-endpoint/api'); } diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 266373d5069d..e56b8231fb46 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -121,6 +121,27 @@ test.describe('Endpoints', () => { }); }); + test('Partially Prerendered +server.js called from a non-prerendered +server.js works', async ({ + baseURL + }) => { + for (const [description, url] of [ + ['direct', `${baseURL}/prerendering/prerendered-endpoint/api-with-param/prerendered`], + [ + 'proxied', + `${baseURL}/prerendering/prerendered-endpoint/proxy?api-with-param-option=prerendered` + ] + ]) { + await test.step(description, async () => { + const res = await fetch(url); + + expect(res.status).toBe(200); + expect(await res.json()).toStrictEqual({ + message: 'Im prerendered and called from a non-prerendered +page.server.js' + }); + }); + } + }); + test('invalid request method returns allow header', async ({ request }) => { const response = await request.post('/endpoint-output/body'); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index a7b9cf1e4a09..673872faac9d 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1279,6 +1279,7 @@ declare module '@sveltejs/kit' { client: NonNullable; nodes: SSRNodeLoader[]; routes: SSRRoute[]; + prerendered_routes: Set; matchers: () => Promise>; /** A `[file]: size` map of all assets imported by server code */ server_assets: Record; From 3dec396ac3844ac84427d915cf53bd7f4c421036 Mon Sep 17 00:00:00 2001 From: tomoam <29677552+tomoam@users.noreply.github.com> Date: Thu, 30 Jan 2025 21:33:52 +0900 Subject: [PATCH 0923/1135] docs: fix config-snippet in adapter-vercel (#13394) fixes sveltejs/svelte.dev#1122 --- documentation/docs/25-build-and-deploy/90-adapter-vercel.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index b06fb3393476..43e237b80902 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -69,13 +69,12 @@ If your functions need to access data in a specific region, it's recommended tha You may set the `images` config to control how Vercel builds your images. See the [image configuration reference](https://vercel.com/docs/build-output-api/v3/configuration#images) for full details. As an example, you may set: ```js -// @errors: 2300 2842 7031 1181 1005 1136 1128 /// file: svelte.config.js import adapter from '@sveltejs/adapter-vercel'; export default { kit: { - adapter({ + adapter: adapter({ images: { sizes: [640, 828, 1200, 1920, 3840], formats: ['image/avif', 'image/webp'], From 180fa3467e195065c0a25206c6328a908e6952d7 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 31 Jan 2025 04:25:27 +0100 Subject: [PATCH 0924/1135] fix: ignore non-entry-point CSS files during inlining (#13395) fixes https://github.com/sveltejs/kit/pull/13068#discussion_r1933373266 --- .changeset/shaggy-ravens-unite.md | 5 +++++ packages/kit/src/exports/vite/build/build_server.js | 5 +++++ .../test/apps/options/source/components/SharedCSS.svelte | 9 +++++++++ .../apps/options/source/pages/inline-assets/+page.svelte | 7 ++++++- .../apps/options/source/pages/resolve-route/+page.svelte | 2 ++ 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 .changeset/shaggy-ravens-unite.md create mode 100644 packages/kit/test/apps/options/source/components/SharedCSS.svelte diff --git a/.changeset/shaggy-ravens-unite.md b/.changeset/shaggy-ravens-unite.md new file mode 100644 index 000000000000..350d2cf50d5d --- /dev/null +++ b/.changeset/shaggy-ravens-unite.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: ignore non-entry-point CSS files during inlining diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index 47a9484eb40f..96ce9a7ed5fa 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -47,7 +47,12 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli css.filter(asset => client_stylesheets.has(asset.fileName)) .forEach((asset) => { if (asset.source.length < kit.inlineStyleThreshold) { + // We know that the names for entry points are numbers. const [index] = basename(asset.fileName).split('.'); + // There can also be other CSS files from shared components + // for example, which we need to ignore here. + if (isNaN(+index)) return; + const server_stylesheet = server_stylesheets.get(+index); const file = `${out}/server/stylesheets/${index}.js`; diff --git a/packages/kit/test/apps/options/source/components/SharedCSS.svelte b/packages/kit/test/apps/options/source/components/SharedCSS.svelte new file mode 100644 index 000000000000..deda4b46551e --- /dev/null +++ b/packages/kit/test/apps/options/source/components/SharedCSS.svelte @@ -0,0 +1,9 @@ +

+ This component is imported in multiple pages and therefore its CSS lands in a separate CSS chunk +

+ + diff --git a/packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte b/packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte index 8a017caa2622..c0a95f45f3c1 100644 --- a/packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte +++ b/packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte @@ -1,8 +1,13 @@ -

Hello world!

+

+ Test that the fontsource is referenced correctly, while the shared CSS in SharedCSS doesn't cause + problems +

+ From 281ad97ae017768dd526fe4ad1a8c8bfd02e27fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 25 Feb 2025 15:50:01 +0100 Subject: [PATCH 0959/1135] Version Packages (#13485) Co-authored-by: github-actions[bot] --- .changeset/eight-walls-melt.md | 5 ----- .changeset/forty-crabs-hang.md | 5 ----- .changeset/mighty-kiwis-laugh.md | 5 ----- .changeset/strong-ravens-film.md | 5 ----- .changeset/stupid-clocks-turn.md | 5 ----- .changeset/ten-planes-relax.md | 5 ----- packages/adapter-cloudflare-workers/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare-workers/package.json | 2 +- packages/adapter-netlify/CHANGELOG.md | 9 +++++++++ packages/adapter-netlify/package.json | 2 +- packages/kit/CHANGELOG.md | 15 +++++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 13 files changed, 40 insertions(+), 34 deletions(-) delete mode 100644 .changeset/eight-walls-melt.md delete mode 100644 .changeset/forty-crabs-hang.md delete mode 100644 .changeset/mighty-kiwis-laugh.md delete mode 100644 .changeset/strong-ravens-film.md delete mode 100644 .changeset/stupid-clocks-turn.md delete mode 100644 .changeset/ten-planes-relax.md diff --git a/.changeset/eight-walls-melt.md b/.changeset/eight-walls-melt.md deleted file mode 100644 index 0e81eb108a96..000000000000 --- a/.changeset/eight-walls-melt.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-netlify': patch ---- - -fix: correctly import manifest on Windows machines diff --git a/.changeset/forty-crabs-hang.md b/.changeset/forty-crabs-hang.md deleted file mode 100644 index 55204a1ada41..000000000000 --- a/.changeset/forty-crabs-hang.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: avoid simulated CORS errors with non-HTTP URLs diff --git a/.changeset/mighty-kiwis-laugh.md b/.changeset/mighty-kiwis-laugh.md deleted file mode 100644 index 6b7869bbc2a7..000000000000 --- a/.changeset/mighty-kiwis-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly preload links on `mousedown`/`touchstart` diff --git a/.changeset/strong-ravens-film.md b/.changeset/strong-ravens-film.md deleted file mode 100644 index 68b7675f0bc0..000000000000 --- a/.changeset/strong-ravens-film.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare-workers': minor ---- - -feat: support `.jsonc` Wrangler configuration files diff --git a/.changeset/stupid-clocks-turn.md b/.changeset/stupid-clocks-turn.md deleted file mode 100644 index 27b42d4484a5..000000000000 --- a/.changeset/stupid-clocks-turn.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: load CSS when using server-side route resolution diff --git a/.changeset/ten-planes-relax.md b/.changeset/ten-planes-relax.md deleted file mode 100644 index 48f46a0ff7bb..000000000000 --- a/.changeset/ten-planes-relax.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly find shared entry-point CSS files during inlining diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md index b15ce29c788f..3a583a002c0d 100644 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ b/packages/adapter-cloudflare-workers/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare-workers +## 2.8.0 +### Minor Changes + + +- feat: support `.jsonc` Wrangler configuration files ([#13467](https://github.com/sveltejs/kit/pull/13467)) + + +### Patch Changes + +- Updated dependencies [[`28cf64589a331ea4770c0883216c5e16d1de7496`](https://github.com/sveltejs/kit/commit/28cf64589a331ea4770c0883216c5e16d1de7496), [`ef1e8047225e7a79c6d121d8ed1a571e5ea44f08`](https://github.com/sveltejs/kit/commit/ef1e8047225e7a79c6d121d8ed1a571e5ea44f08), [`2e6527b92875976b79cc00e7b75ee0ad8b69a239`](https://github.com/sveltejs/kit/commit/2e6527b92875976b79cc00e7b75ee0ad8b69a239), [`0c0172e1463218fe63a67c587173bb3065a53c49`](https://github.com/sveltejs/kit/commit/0c0172e1463218fe63a67c587173bb3065a53c49)]: + - @sveltejs/kit@2.17.3 + ## 2.7.1 ### Patch Changes diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 33ced2718dd6..1491e69c266e 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare-workers", - "version": "2.7.1", + "version": "2.8.0", "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", "keywords": [ "adapter", diff --git a/packages/adapter-netlify/CHANGELOG.md b/packages/adapter-netlify/CHANGELOG.md index 4f7041300a4d..f9c7c894ef3e 100644 --- a/packages/adapter-netlify/CHANGELOG.md +++ b/packages/adapter-netlify/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-netlify +## 4.4.2 +### Patch Changes + + +- fix: correctly import manifest on Windows machines ([#13495](https://github.com/sveltejs/kit/pull/13495)) + +- Updated dependencies [[`28cf64589a331ea4770c0883216c5e16d1de7496`](https://github.com/sveltejs/kit/commit/28cf64589a331ea4770c0883216c5e16d1de7496), [`ef1e8047225e7a79c6d121d8ed1a571e5ea44f08`](https://github.com/sveltejs/kit/commit/ef1e8047225e7a79c6d121d8ed1a571e5ea44f08), [`2e6527b92875976b79cc00e7b75ee0ad8b69a239`](https://github.com/sveltejs/kit/commit/2e6527b92875976b79cc00e7b75ee0ad8b69a239), [`0c0172e1463218fe63a67c587173bb3065a53c49`](https://github.com/sveltejs/kit/commit/0c0172e1463218fe63a67c587173bb3065a53c49)]: + - @sveltejs/kit@2.17.3 + ## 4.4.1 ### Patch Changes diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index bcc1d4d2ed0f..5d348330663c 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-netlify", - "version": "4.4.1", + "version": "4.4.2", "description": "A SvelteKit adapter that creates a Netlify app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index a5f83dd193a0..cc54d8b876fa 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,20 @@ # @sveltejs/kit +## 2.17.3 +### Patch Changes + + +- fix: avoid simulated CORS errors with non-HTTP URLs ([#13493](https://github.com/sveltejs/kit/pull/13493)) + + +- fix: correctly preload links on `mousedown`/`touchstart` ([#13486](https://github.com/sveltejs/kit/pull/13486)) + + +- fix: load CSS when using server-side route resolution ([#13498](https://github.com/sveltejs/kit/pull/13498)) + + +- fix: correctly find shared entry-point CSS files during inlining ([#13431](https://github.com/sveltejs/kit/pull/13431)) + ## 2.17.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 40f37e3566ff..835679cbe444 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.17.2", + "version": "2.17.3", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 5154fdbae3c6..057cf3028c84 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.17.2'; +export const VERSION = '2.17.3'; From 3cf2b77b4ae87bbd4fc46367c37c129133af41f1 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 25 Feb 2025 08:18:40 -0800 Subject: [PATCH 0960/1135] chore: upgrade dts-buddy (#13501) --- packages/kit/package.json | 2 +- pnpm-lock.yaml | 50 ++++++++++++++++----------------------- 2 files changed, 21 insertions(+), 31 deletions(-) diff --git a/packages/kit/package.json b/packages/kit/package.json index 835679cbe444..56ff5e7219d4 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -36,7 +36,7 @@ "@types/connect": "^3.4.38", "@types/node": "^18.19.48", "@types/set-cookie-parser": "^2.4.7", - "dts-buddy": "^0.5.4", + "dts-buddy": "^0.5.5", "rollup": "^4.14.2", "svelte": "^5.2.9", "svelte-preprocess": "^6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 44efef30c9c3..009f9699b389 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -389,8 +389,8 @@ importers: specifier: ^2.4.7 version: 2.4.7 dts-buddy: - specifier: ^0.5.4 - version: 0.5.4(typescript@5.6.3) + specifier: ^0.5.5 + version: 0.5.5(typescript@5.6.3) rollup: specifier: ^4.14.2 version: 4.30.1 @@ -2347,8 +2347,8 @@ packages: dropcss@1.0.16: resolution: {integrity: sha512-QgA6BUh2SoBYE/dSuMmeGhNdoGtGewt3Rn66xKyXoGNyjrKRXf163wuM+xeQ83p87l/3ALoB6Il1dgKyGS5pEw==} - dts-buddy@0.5.4: - resolution: {integrity: sha512-a3jJYbMXK98aJvhdV/v+tEKTTEJXXWtMjrl5L8jJL7rnZzGtPA6JNHJZ5//NVRw4JiB5T10Ie5T7h/QsP3aaYw==} + dts-buddy@0.5.5: + resolution: {integrity: sha512-Mu5PJuP7C+EqZIwDtW/bG1tVli1UFhRIyW/dERBVBYk28OviTkribu9S2LpDQ0HF2MbkqnjQIkbbE6HnepdNTQ==} hasBin: true peerDependencies: typescript: '>=5.0.4 <5.8' @@ -2520,8 +2520,8 @@ packages: fastq@1.17.1: resolution: {integrity: sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==} - fdir@6.4.0: - resolution: {integrity: sha512-3oB133prH1o4j/L5lLW7uOCF1PlD+/It2L0eL/iAqWMB91RBbqTewABqxhj0ibBd90EEmWZq7ntIWzVaWcXTGQ==} + fdir@6.4.3: + resolution: {integrity: sha512-PMXmW2y1hDDfTSRc9gaXIuCCRpuoz3Kaz8cUelp3smouvfT632ozg2vrT6lJsHKKOF59YLbOGfAWGUcKEfRMQw==} peerDependencies: picomatch: ^3 || ^4 peerDependenciesMeta: @@ -2612,16 +2612,10 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} - globalyzer@0.1.0: - resolution: {integrity: sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==} - globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} - globrex@0.1.2: - resolution: {integrity: sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==} - graceful-fs@4.2.11: resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} @@ -3383,9 +3377,6 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - tiny-glob@0.2.9: - resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -3396,6 +3387,10 @@ packages: tinyexec@0.3.2: resolution: {integrity: sha512-KQQR9yN7R5+OSwaK0XQoj22pwHoTlgYqmUscPYoknOoWCWfj/5/ABTMRi69FrKU5ffPVh5QcFikpWJI/P1ocHA==} + tinyglobby@0.2.12: + resolution: {integrity: sha512-qkf4trmKSIiMTs/E63cxH+ojC2unam7rJ0WrauAzpT3ECNTxGRMlaXxVbfxMUC/w0LaYk6jQ4y/nGR9uBO3tww==} + engines: {node: '>=12.0.0'} + tinypool@1.0.2: resolution: {integrity: sha512-al6n+QEANGFOMf/dmUMsuS5/r9B06uwlyNjZZql/zv8J7ybHCgoihBNORZCY2mzUuAnomQa2JdhyHKzZxPCrFA==} engines: {node: ^18.0.0 || >=20.0.0} @@ -4215,7 +4210,7 @@ snapshots: '@rollup/pluginutils': 5.1.3(rollup@4.30.1) commondir: 1.0.1 estree-walker: 2.0.2 - fdir: 6.4.0(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) is-reference: 1.2.1 magic-string: 0.30.17 picomatch: 4.0.2 @@ -4718,16 +4713,15 @@ snapshots: dropcss@1.0.16: {} - dts-buddy@0.5.4(typescript@5.6.3): + dts-buddy@0.5.5(typescript@5.6.3): dependencies: '@jridgewell/source-map': 0.3.6 '@jridgewell/sourcemap-codec': 1.5.0 - globrex: 0.1.2 kleur: 4.1.5 locate-character: 3.0.0 magic-string: 0.30.17 sade: 1.8.1 - tiny-glob: 0.2.9 + tinyglobby: 0.2.12 ts-api-utils: 1.3.0(typescript@5.6.3) typescript: 5.6.3 @@ -4977,7 +4971,7 @@ snapshots: dependencies: reusify: 1.0.4 - fdir@6.4.0(picomatch@4.0.2): + fdir@6.4.3(picomatch@4.0.2): optionalDependencies: picomatch: 4.0.2 @@ -5067,8 +5061,6 @@ snapshots: globals@15.15.0: {} - globalyzer@0.1.0: {} - globby@11.1.0: dependencies: array-union: 2.1.0 @@ -5078,8 +5070,6 @@ snapshots: merge2: 1.4.1 slash: 3.0.0 - globrex@0.1.2: {} - graceful-fs@4.2.11: {} graphemer@1.4.0: {} @@ -5704,7 +5694,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 - fdir: 6.4.0(picomatch@4.0.2) + fdir: 6.4.3(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 svelte: 5.2.9 @@ -5774,17 +5764,17 @@ snapshots: text-table@0.2.0: {} - tiny-glob@0.2.9: - dependencies: - globalyzer: 0.1.0 - globrex: 0.1.2 - tinybench@2.9.0: {} tinydate@1.3.0: {} tinyexec@0.3.2: {} + tinyglobby@0.2.12: + dependencies: + fdir: 6.4.3(picomatch@4.0.2) + picomatch: 4.0.2 + tinypool@1.0.2: {} tinyrainbow@2.0.0: {} From c7f96c8f9ede1b34078cabca9bd1dcf0dac0c94d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 28 Feb 2025 18:44:11 -0800 Subject: [PATCH 0961/1135] chore(deps): update pnpm to v10.5.2 (#13500) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca29cdf8c5a1..a587be00f45e 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.0.0" }, - "packageManager": "pnpm@10.4.1", + "packageManager": "pnpm@10.5.2", "engines": { "pnpm": ">=9.0.0" }, From dc7115c707cc5bcbf090788dd599cd723abe644f Mon Sep 17 00:00:00 2001 From: Alex Fu Date: Mon, 3 Mar 2025 03:58:08 -0500 Subject: [PATCH 0962/1135] chore: add test for parsing body size limit (#13437) * node-adapter: add test for parsing body size limit * slight adjustments --------- Co-authored-by: Chew Tee Ming --- eslint.config.js | 4 ++-- packages/adapter-node/package.json | 2 +- packages/adapter-node/src/handler.js | 16 ++------------ .../{smoke.spec.js => smoke.spec_disabled.js} | 0 packages/adapter-node/tests/utils.spec.js | 21 +++++++++++++++++++ packages/adapter-node/tsconfig.json | 3 ++- packages/adapter-node/utils.js | 15 +++++++++++++ 7 files changed, 43 insertions(+), 18 deletions(-) rename packages/adapter-node/tests/{smoke.spec.js => smoke.spec_disabled.js} (100%) create mode 100644 packages/adapter-node/tests/utils.spec.js create mode 100644 packages/adapter-node/utils.js diff --git a/eslint.config.js b/eslint.config.js index c51427e9ee23..f780ffd104d9 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -27,11 +27,11 @@ export default [ '@typescript-eslint/await-thenable': 'error', '@typescript-eslint/no-unused-expressions': 'off', '@typescript-eslint/require-await': 'error', - '@typescript-eslint/no-floating-promises': 'error', + '@typescript-eslint/no-floating-promises': 'error' }, ignores: [ 'packages/adapter-node/rollup.config.js', - 'packages/adapter-node/tests/smoke.spec.js', + 'packages/adapter-node/tests/smoke.spec_disabled.js', 'packages/adapter-static/test/apps/**/*', 'packages/create-svelte/shared/**/*', 'packages/create-svelte/templates/**/*', diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index 6f93a6d4a3a6..b287b1086b3d 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -35,7 +35,7 @@ "scripts": { "dev": "node -e \"fs.rmSync('files', { force: true, recursive: true })\" && rollup -cw", "build": "node -e \"fs.rmSync('files', { force: true, recursive: true })\" && rollup -c", - "test": "echo \"tests temporarily disabled\" # vitest run", + "test": "vitest run", "check": "tsc", "lint": "prettier --check .", "format": "pnpm lint --write", diff --git a/packages/adapter-node/src/handler.js b/packages/adapter-node/src/handler.js index b6c628dd4e0c..37827e64042c 100644 --- a/packages/adapter-node/src/handler.js +++ b/packages/adapter-node/src/handler.js @@ -9,6 +9,7 @@ import { getRequest, setResponse, createReadableStream } from '@sveltejs/kit/nod import { Server } from 'SERVER'; import { manifest, prerendered, base } from 'MANIFEST'; import { env } from 'ENV'; +import { parse_as_bytes } from '../utils.js'; /* global ENV_PREFIX */ @@ -21,20 +22,7 @@ const protocol_header = env('PROTOCOL_HEADER', '').toLowerCase(); const host_header = env('HOST_HEADER', 'host').toLowerCase(); const port_header = env('PORT_HEADER', '').toLowerCase(); -/** - * @param {string} bytes - */ -function parse_body_size_limit(bytes) { - const multiplier = - { - K: 1024, - M: 1024 * 1024, - G: 1024 * 1024 * 1024 - }[bytes[bytes.length - 1]?.toUpperCase()] ?? 1; - return Number(multiplier != 1 ? bytes.substring(0, bytes.length - 1) : bytes) * multiplier; -} - -const body_size_limit = parse_body_size_limit(env('BODY_SIZE_LIMIT', '512K')); +const body_size_limit = parse_as_bytes(env('BODY_SIZE_LIMIT', '512K')); if (isNaN(body_size_limit)) { throw new Error( diff --git a/packages/adapter-node/tests/smoke.spec.js b/packages/adapter-node/tests/smoke.spec_disabled.js similarity index 100% rename from packages/adapter-node/tests/smoke.spec.js rename to packages/adapter-node/tests/smoke.spec_disabled.js diff --git a/packages/adapter-node/tests/utils.spec.js b/packages/adapter-node/tests/utils.spec.js new file mode 100644 index 000000000000..06a495fde9ba --- /dev/null +++ b/packages/adapter-node/tests/utils.spec.js @@ -0,0 +1,21 @@ +import { expect, test, describe } from 'vitest'; +import { parse_as_bytes } from '../utils.js'; + +describe('parse_as_bytes', () => { + test('parses correctly', () => { + const testData = { + 200: 200, + '512K': 512 * 1024, + '200M': 200 * 1024 * 1024, + '1G': 1024 * 1024 * 1024, + Infinity, + asdf: NaN + }; + + Object.keys(testData).forEach((input) => { + const expected = testData[/** @type {keyof typeof testData} */ (input)]; + const actual = parse_as_bytes(input); + expect(actual, `Testing input '${input}'`).toBe(expected); + }); + }); +}); diff --git a/packages/adapter-node/tsconfig.json b/packages/adapter-node/tsconfig.json index 790cb0a51563..895d76f908cf 100644 --- a/packages/adapter-node/tsconfig.json +++ b/packages/adapter-node/tsconfig.json @@ -13,5 +13,6 @@ "@sveltejs/kit": ["../kit/types/index"] } }, - "include": ["index.js", "src/**/*.js", "internal.d.ts"] + "include": ["index.js", "src/**/*.js", "tests/**/*.js", "internal.d.ts", "utils.js"], + "exclude": ["tests/smoke.spec_disabled.js"] } diff --git a/packages/adapter-node/utils.js b/packages/adapter-node/utils.js new file mode 100644 index 000000000000..16769eaa0027 --- /dev/null +++ b/packages/adapter-node/utils.js @@ -0,0 +1,15 @@ +/** + * Parses the given value into number of bytes. + * + * @param {string} value - Size in bytes. Can also be specified with a unit suffix kilobytes (K), megabytes (M), or gigabytes (G). + * @returns {number} + */ +export function parse_as_bytes(value) { + const multiplier = + { + K: 1024, + M: 1024 * 1024, + G: 1024 * 1024 * 1024 + }[value[value.length - 1]?.toUpperCase()] ?? 1; + return Number(multiplier != 1 ? value.substring(0, value.length - 1) : value) * multiplier; +} From 30b87c077895a0ab8d7c343018d108a16b691801 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:54:14 -0800 Subject: [PATCH 0963/1135] chore: speed up linting (#13533) --- package.json | 2 +- pnpm-lock.yaml | 196 ++++++++++++++++++++++++++----------------------- 2 files changed, 107 insertions(+), 91 deletions(-) diff --git a/package.json b/package.json index a587be00f45e..5da3d58ef7e9 100644 --- a/package.json +++ b/package.json @@ -29,7 +29,7 @@ "playwright": "^1.44.1", "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", - "typescript-eslint": "^8.0.0" + "typescript-eslint": "^8.24.0" }, "packageManager": "pnpm@10.5.2", "engines": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 009f9699b389..73f0d92a48cf 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.27.11 '@sveltejs/eslint-config': specifier: ^8.1.0 - version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) + version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 @@ -30,8 +30,8 @@ importers: specifier: ^3.1.2 version: 3.2.7(prettier@3.3.3)(svelte@5.2.9) typescript-eslint: - specifier: ^8.0.0 - version: 8.4.0(eslint@9.6.0)(typescript@5.6.3) + specifier: ^8.24.0 + version: 8.26.0(eslint@9.6.0)(typescript@5.6.3) packages/adapter-auto: dependencies: @@ -1995,61 +1995,51 @@ packages: '@types/ws@8.5.10': resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - '@typescript-eslint/eslint-plugin@8.4.0': - resolution: {integrity: sha512-rg8LGdv7ri3oAlenMACk9e+AR4wUV0yrrG+XKsGKOK0EVgeEDqurkXMPILG2836fW4ibokTB5v4b6Z9+GYQDEw==} + '@typescript-eslint/eslint-plugin@8.26.0': + resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.4.0': - resolution: {integrity: sha512-NHgWmKSgJk5K9N16GIhQ4jSobBoJwrmURaLErad0qlLjrpP5bECYg+wxVTGlGZmJbU03jj/dfnb6V9bw+5icsA==} + '@typescript-eslint/parser@8.26.0': + resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.4.0': - resolution: {integrity: sha512-n2jFxLeY0JmKfUqy3P70rs6vdoPjHK8P/w+zJcV3fk0b0BwRXC/zxRTEnAsgYT7MwdQDt/ZEbtdzdVC+hcpF0A==} + '@typescript-eslint/scope-manager@8.26.0': + resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.4.0': - resolution: {integrity: sha512-pu2PAmNrl9KX6TtirVOrbLPLwDmASpZhK/XU7WvoKoCUkdtq9zF7qQ7gna0GBZFN0hci0vHaSusiL2WpsQk37A==} + '@typescript-eslint/type-utils@8.26.0': + resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.4.0': - resolution: {integrity: sha512-T1RB3KQdskh9t3v/qv7niK6P8yvn7ja1mS7QK7XfRVL6wtZ8/mFs/FHf4fKvTA0rKnqnYxl/uHFNbnEt0phgbw==} + '@typescript-eslint/types@8.26.0': + resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.4.0': - resolution: {integrity: sha512-kJ2OIP4dQw5gdI4uXsaxUZHRwWAGpREJ9Zq6D5L0BweyOrWsL6Sz0YcAZGWhvKnH7fm1J5YFE1JrQL0c9dd53A==} + '@typescript-eslint/typescript-estree@8.26.0': + resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.4.0': - resolution: {integrity: sha512-swULW8n1IKLjRAgciCkTCafyTHHfwVQFt8DovmaF69sKbOxTSFMmIZaSHjqO9i/RV0wIblaawhzvtva8Nmm7lQ==} + '@typescript-eslint/utils@8.26.0': + resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.4.0': - resolution: {integrity: sha512-zTQD6WLNTre1hj5wp09nBIDiOc2U5r/qmzo7wxPn4ZgAjHql09EofqhF9WF+fZHzL5aCyaIpPcT2hyxl73kr9A==} + '@typescript-eslint/visitor-keys@8.26.0': + resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vercel/nft@0.29.2': @@ -2408,8 +2398,8 @@ packages: peerDependencies: eslint: '>=8' - eslint-plugin-n@17.9.0: - resolution: {integrity: sha512-CPSaXDXdrT4nsrOrO4mT4VB6FMUkoySRkHWuuJJHVqsIEjIeZgMY1H7AzSwPbDScikBmLN82KeM1u7ixV7PzGg==} + eslint-plugin-n@17.16.1: + resolution: {integrity: sha512-/7FVAwjUrix9P5lycnsYRIQRwFo/DZROD+ZXWLpE+/EZWLyuLvyFaRdAPYJSz+nlAdZIZp+LAzlBerQSVYUNFg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: '>=8.23.0' @@ -2863,6 +2853,10 @@ packages: engines: {node: '>=16.13'} hasBin: true + minimatch@10.0.1: + resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} + engines: {node: 20 || >=22} + minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -3428,6 +3422,17 @@ packages: peerDependencies: typescript: '>=4.2.0' + ts-api-utils@2.0.1: + resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + engines: {node: '>=18.12'} + peerDependencies: + typescript: '>=4.8.4' + + ts-declaration-location@1.0.5: + resolution: {integrity: sha512-WqmlO9IoeYwCqJ2E9kHMcY9GZhhfLYItC3VnHDlPOrg6nNdUWS4wn4hhDZUPt60m1EvtjPIZyprTjpI992Bgzw==} + peerDependencies: + typescript: '>=4.0.0' + tslib@2.6.2: resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} @@ -3435,14 +3440,12 @@ packages: resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} engines: {node: '>= 0.8.0'} - typescript-eslint@8.4.0: - resolution: {integrity: sha512-67qoc3zQZe3CAkO0ua17+7aCLI0dU+sSQd1eKPGq06QE4rfQjstVXR6woHO5qQvGUa550NfGckT4tzh3b3c8Pw==} + typescript-eslint@8.26.0: + resolution: {integrity: sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - typescript: '*' - peerDependenciesMeta: - typescript: - optional: true + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' typescript@5.6.3: resolution: {integrity: sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==} @@ -4306,16 +4309,16 @@ snapshots: eslint-visitor-keys: 4.2.0 espree: 10.3.0 - '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.9.0(eslint@9.6.0))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': + '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': dependencies: '@stylistic/eslint-plugin-js': 2.1.0(eslint@9.6.0) eslint: 9.6.0 eslint-config-prettier: 9.1.0(eslint@9.6.0) - eslint-plugin-n: 17.9.0(eslint@9.6.0) + eslint-plugin-n: 17.16.1(eslint@9.6.0)(typescript@5.6.3) eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.2.9) globals: 15.15.0 typescript: 5.6.3 - typescript-eslint: 8.4.0(eslint@9.6.0)(typescript@5.6.3) + typescript-eslint: 8.26.0(eslint@9.6.0)(typescript@5.6.3) '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: @@ -4379,86 +4382,82 @@ snapshots: dependencies: '@types/node': 18.19.50 - '@typescript-eslint/eslint-plugin@8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@typescript-eslint/scope-manager': 8.4.0 - '@typescript-eslint/type-utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.4.0 + '@typescript-eslint/parser': 8.26.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/type-utils': 8.26.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.26.0 eslint: 9.6.0 graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: + ts-api-utils: 2.0.1(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/parser@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/scope-manager': 8.4.0 - '@typescript-eslint/types': 8.4.0 - '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) - '@typescript-eslint/visitor-keys': 8.4.0 + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.6.3) + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.4.0 eslint: 9.6.0 - optionalDependencies: typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.4.0': + '@typescript-eslint/scope-manager@8.26.0': dependencies: - '@typescript-eslint/types': 8.4.0 - '@typescript-eslint/visitor-keys': 8.4.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/type-utils@8.4.0(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) - '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.6.3) + '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.6.3) debug: 4.4.0 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: + eslint: 9.6.0 + ts-api-utils: 2.0.1(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - - eslint - supports-color - '@typescript-eslint/types@8.4.0': {} + '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/typescript-estree@8.4.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.26.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.4.0 - '@typescript-eslint/visitor-keys': 8.4.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 1.3.0(typescript@5.6.3) - optionalDependencies: + ts-api-utils: 2.0.1(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.4.0(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.4.0 - '@typescript-eslint/types': 8.4.0 - '@typescript-eslint/typescript-estree': 8.4.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.26.0 + '@typescript-eslint/types': 8.26.0 + '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.6.3) eslint: 9.6.0 + typescript: 5.6.3 transitivePeerDependencies: - supports-color - - typescript - '@typescript-eslint/visitor-keys@8.4.0': + '@typescript-eslint/visitor-keys@8.26.0': dependencies: - '@typescript-eslint/types': 8.4.0 - eslint-visitor-keys: 3.4.3 + '@typescript-eslint/types': 8.26.0 + eslint-visitor-keys: 4.2.0 '@vercel/nft@0.29.2(rollup@4.30.1)': dependencies: @@ -4816,9 +4815,10 @@ snapshots: eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) - eslint-plugin-n@17.9.0(eslint@9.6.0): + eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) @@ -4827,6 +4827,10 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.5 semver: 7.7.1 + ts-declaration-location: 1.0.5(typescript@5.6.3) + transitivePeerDependencies: + - supports-color + - typescript eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9): dependencies: @@ -5286,6 +5290,10 @@ snapshots: - bufferutil - utf-8-validate + minimatch@10.0.1: + dependencies: + brace-expansion: 2.0.1 + minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -5801,21 +5809,29 @@ snapshots: dependencies: typescript: 5.6.3 + ts-api-utils@2.0.1(typescript@5.6.3): + dependencies: + typescript: 5.6.3 + + ts-declaration-location@1.0.5(typescript@5.6.3): + dependencies: + minimatch: 10.0.1 + typescript: 5.6.3 + tslib@2.6.2: {} type-check@0.4.0: dependencies: prelude-ls: 1.2.1 - typescript-eslint@8.4.0(eslint@9.6.0)(typescript@5.6.3): + typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.4.0(@typescript-eslint/parser@8.4.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3) - '@typescript-eslint/parser': 8.4.0(eslint@9.6.0)(typescript@5.6.3) - '@typescript-eslint/utils': 8.4.0(eslint@9.6.0)(typescript@5.6.3) - optionalDependencies: + '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/parser': 8.26.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.6.3) + eslint: 9.6.0 typescript: 5.6.3 transitivePeerDependencies: - - eslint - supports-color typescript@5.6.3: {} From fd13f36dfb4f1b19ba3dcd62834c8e9a9d9bd531 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 3 Mar 2025 20:58:07 -0800 Subject: [PATCH 0964/1135] chore: fix node ID types (#13535) --- packages/kit/src/exports/vite/dev/index.js | 15 ++++++--------- packages/kit/src/runtime/server/page/load_data.js | 2 +- packages/kit/src/types/internal.d.ts | 8 ++++---- packages/kit/types/index.d.ts | 8 ++++---- 4 files changed, 15 insertions(+), 18 deletions(-) diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 6d7b7acf0456..7049d8910508 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -177,17 +177,18 @@ export async function dev(vite, vite_config, svelte_config) { return async () => { /** @type {import('types').SSRNode} */ const result = {}; - - /** @type {import('vite').ModuleNode[]} */ - const module_nodes = []; - result.index = index; + result.universal_id = node.universal; + result.server_id = node.server; - // these are unused in dev, it's easier to include them + // these are unused in dev, but it's easier to include them result.imports = []; result.stylesheets = []; result.fonts = []; + /** @type {import('vite').ModuleNode[]} */ + const module_nodes = []; + if (node.component) { result.component = async () => { const { module_node, module } = await resolve( @@ -202,17 +203,13 @@ export async function dev(vite, vite_config, svelte_config) { if (node.universal) { const { module, module_node } = await resolve(node.universal); - module_nodes.push(module_node); - result.universal = module; - result.universal_id = node.universal; } if (node.server) { const { module } = await resolve(node.server); result.server = module; - result.server_id = node.server; } // in dev we inline all styles to avoid FOUC. this gets populated lazily so that diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 313dac721ed0..613093412137 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -78,7 +78,7 @@ export async function load_server_data({ event, state, node, parent }) { const { href } = new URL(dep, event.url); if (DEV) { - validate_depends(node.server_id, dep); + validate_depends(node.server_id || 'missing route ID', dep); if (done && !uses.dependencies.has(href)) { console.warn( diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index f67e6e7c3606..80cb9392766d 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -79,13 +79,13 @@ export interface BuildData { * An entry is undefined if the layout/page has no component or universal file (i.e. only has a `.server.js` file). * Only set in case of `router.resolution === 'server'`. */ - nodes?: (string | undefined)[]; + nodes?: Array; /** * CSS files referenced in the entry points of the layouts/pages. * An entry is undefined if the layout/page has no component or universal file (i.e. only has a `.server.js` file) or if has no CSS. * Only set in case of `router.resolution === 'server'`. */ - css?: (string[] | undefined)[]; + css?: Array; /** * Contains the client route manifest in a form suitable for the server which is used for server side route resolution. * Notably, it contains all routes, regardless of whether they are prerendered or not (those are missing in the optimized server route manifest). @@ -396,8 +396,8 @@ export interface SSRNode { entries?: PrerenderEntryGenerator; }; - universal_id: string; - server_id: string; + universal_id?: string; + server_id?: string; } export type SSRNodeLoader = () => Promise; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index f7ca3bce33f9..e8f7501ad5ce 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1726,13 +1726,13 @@ declare module '@sveltejs/kit' { * An entry is undefined if the layout/page has no component or universal file (i.e. only has a `.server.js` file). * Only set in case of `router.resolution === 'server'`. */ - nodes?: (string | undefined)[]; + nodes?: Array; /** * CSS files referenced in the entry points of the layouts/pages. * An entry is undefined if the layout/page has no component or universal file (i.e. only has a `.server.js` file) or if has no CSS. * Only set in case of `router.resolution === 'server'`. */ - css?: (string[] | undefined)[]; + css?: Array; /** * Contains the client route manifest in a form suitable for the server which is used for server side route resolution. * Notably, it contains all routes, regardless of whether they are prerendered or not (those are missing in the optimized server route manifest). @@ -1873,8 +1873,8 @@ declare module '@sveltejs/kit' { entries?: PrerenderEntryGenerator; }; - universal_id: string; - server_id: string; + universal_id?: string; + server_id?: string; } type SSRNodeLoader = () => Promise; From f9458e3c5979a64b995a2d31716958451783172f Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 4 Mar 2025 14:52:31 +0800 Subject: [PATCH 0965/1135] fix: include universal load assets as server assets (#13531) * some type description cleanup * add failing test * fix test * universal load assets are server assets too * changeset * format * regenerate types * we love periods --- .changeset/dirty-radios-smile.md | 5 +++ .../generate_manifest/find_server_assets.js | 1 + packages/kit/src/exports/public.d.ts | 19 +++++---- packages/kit/src/types/internal.d.ts | 38 +++++++++-------- .../src/routes/load/fetch-asset/+page.js | 9 ++++ .../src/routes/load/fetch-asset/+page.svelte | 5 +++ .../src/routes/load/fetch-asset/example.json | 3 ++ .../kit/test/apps/basics/test/server.test.js | 5 +++ packages/kit/types/index.d.ts | 41 ++++++++++--------- 9 files changed, 80 insertions(+), 46 deletions(-) create mode 100644 .changeset/dirty-radios-smile.md create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/load/fetch-asset/example.json diff --git a/.changeset/dirty-radios-smile.md b/.changeset/dirty-radios-smile.md new file mode 100644 index 000000000000..027fa152ce04 --- /dev/null +++ b/.changeset/dirty-radios-smile.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: include universal load assets as server assets diff --git a/packages/kit/src/core/generate_manifest/find_server_assets.js b/packages/kit/src/core/generate_manifest/find_server_assets.js index 3a562f4b53a0..b7232e63e0b8 100644 --- a/packages/kit/src/core/generate_manifest/find_server_assets.js +++ b/packages/kit/src/core/generate_manifest/find_server_assets.js @@ -41,6 +41,7 @@ export function find_server_assets(build_data, routes) { for (const n of used_nodes) { const node = build_data.manifest_data.nodes[n]; + if (node?.universal) add_assets(node.universal); if (node?.server) add_assets(node.server); } diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index f25cc225e194..7248f12a4a35 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1177,7 +1177,7 @@ export interface RequestEvent< * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies). */ fetch: typeof fetch; /** @@ -1189,7 +1189,7 @@ export interface RequestEvent< */ locals: App.Locals; /** - * The parameters of the current route - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object + * The parameters of the current route - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object. */ params: Params; /** @@ -1197,15 +1197,15 @@ export interface RequestEvent< */ platform: Readonly | undefined; /** - * The original request object + * The original request object. */ request: Request; /** - * Info about the current route + * Info about the current route. */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]` + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. */ id: RouteId; }; @@ -1302,15 +1302,16 @@ export class Server { } export interface ServerInitOptions { - /** A map of environment variables */ + /** A map of environment variables. */ env: Record; - /** A function that turns an asset filename into a `ReadableStream`. Required for the `read` export from `$app/server` to work */ + /** A function that turns an asset filename into a `ReadableStream`. Required for the `read` export from `$app/server` to work. */ read?: (file: string) => ReadableStream; } export interface SSRManifest { appDir: string; appPath: string; + /** Static files from `kit.config.files.assets` and the service worker (if any). */ assets: Set; mimeTypes: Record; @@ -1321,7 +1322,7 @@ export interface SSRManifest { routes: SSRRoute[]; prerendered_routes: Set; matchers: () => Promise>; - /** A `[file]: size` map of all assets imported by server code */ + /** A `[file]: size` map of all assets imported by server code. */ server_assets: Record; }; } @@ -1452,7 +1453,7 @@ export interface HttpError { } /** - * The object returned by the [`redirect`](https://svelte.dev/docs/kit/@sveltejs-kit#redirect) function + * The object returned by the [`redirect`](https://svelte.dev/docs/kit/@sveltejs-kit#redirect) function. */ export interface Redirect { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages), in the range 300-308. */ diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 80cb9392766d..1793476eace7 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -68,11 +68,11 @@ export interface BuildData { out_dir: string; service_worker: string | null; client: { - /** Path to the client entry point */ + /** Path to the client entry point. */ start: string; - /** Path to the generated `app.js` file that contains the client manifest. Only set in case of `bundleStrategy === 'split'` */ + /** Path to the generated `app.js` file that contains the client manifest. Only set in case of `bundleStrategy === 'split'`. */ app?: string; - /** JS files that the client entry point relies on */ + /** JS files that the client entry point relies on. */ imports: string[]; /** * JS files that represent the entry points of the layouts/pages. @@ -95,7 +95,7 @@ export interface BuildData { stylesheets: string[]; fonts: string[]; uses_env_dynamic_public: boolean; - /** Only set in case of `bundleStrategy === 'inline'` */ + /** Only set in case of `bundleStrategy === 'inline'`. */ inline?: { script: string; style: string | undefined; @@ -172,7 +172,7 @@ export class InternalServer extends Server { options: RequestOptions & { prerendering?: PrerenderOptions; read: (file: string) => Buffer; - /** A hook called before `handle` during dev, so that `AsyncLocalStorage` can be populated */ + /** A hook called before `handle` during dev, so that `AsyncLocalStorage` can be populated. */ before_handle?: (event: RequestEvent, config: any, prerender: PrerenderOption) => void; emulator?: Emulator; } @@ -180,6 +180,7 @@ export class InternalServer extends Server { } export interface ManifestData { + /** Static files from `kit.config.files.assets`. */ assets: Asset[]; hooks: { client: string | null; @@ -193,15 +194,15 @@ export interface ManifestData { export interface PageNode { depth: number; - /** The +page/layout.svelte */ + /** The `+page/layout.svelte`. */ component?: string; // TODO supply default component if it's missing (bit of an edge case) - /** The +page/layout.js/.ts */ + /** The `+page/layout.js/.ts`. */ universal?: string; - /** The +page/layout.server.js/ts */ + /** The `+page/layout.server.js/ts`. */ server?: string; parent_id?: string; parent?: PageNode; - /** Filled with the pages that reference this layout (if this is a layout) */ + /** Filled with the pages that reference this layout (if this is a layout). */ child_pages?: PageNode[]; } @@ -219,6 +220,7 @@ export interface PrerenderOptions { export type RecursiveRequired = { // Recursive implementation of TypeScript's Required utility type. // Will recursively continue until it reaches a primitive or Function + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type [K in keyof T]-?: Extract extends never // If it does not have a Function type ? RecursiveRequired // recursively continue through. : T[K]; // Use the exact type for everything else @@ -305,20 +307,20 @@ export interface ServerDataChunkNode { /** * Signals that the server `load` function was not run, and the - * client should use what it has in memory + * client should use what it has in memory. */ export interface ServerDataSkippedNode { type: 'skip'; } /** - * Signals that the server `load` function failed + * Signals that the server `load` function failed. */ export interface ServerErrorNode { type: 'error'; error: App.Error; /** - * Only set for HttpErrors + * Only set for HttpErrors. */ status?: number; } @@ -338,7 +340,7 @@ export interface ServerMetadataRoute { export interface ServerMetadata { nodes: Array<{ - /** Also `true` when using `trailingSlash`, because we need to do a server request in that case to get its value */ + /** Also `true` when using `trailingSlash`, because we need to do a server request in that case to get its value. */ has_server_load: boolean; }>; routes: Map; @@ -364,7 +366,7 @@ export type SSRComponentLoader = () => Promise; export interface SSRNode { component: SSRComponentLoader; - /** index into the `nodes` array in the generated `client/app.js` */ + /** index into the `nodes` array in the generated `client/app.js`. */ index: number; /** external JS files that are loaded on the client. `imports[0]` is the entry point (e.g. `client/nodes/0.js`) */ imports: string[]; @@ -372,7 +374,7 @@ export interface SSRNode { stylesheets: string[]; /** external font files that are loaded on the client */ fonts: string[]; - /** inlined styles */ + /** inlined styles. */ inline_styles?(): MaybePromise>; universal: { @@ -465,18 +467,18 @@ export interface SSRState { fallback?: string; getClientAddress(): string; /** - * True if we're currently attempting to render an error page + * True if we're currently attempting to render an error page. */ error: boolean; /** - * Allows us to prevent `event.fetch` from making infinitely looping internal requests + * Allows us to prevent `event.fetch` from making infinitely looping internal requests. */ depth: number; platform?: any; prerendering?: PrerenderOptions; /** * When fetching data from a +server.js endpoint in `load`, the page's - * prerender option is inherited by the endpoint, unless overridden + * prerender option is inherited by the endpoint, unless overridden. */ prerender_default?: PrerenderOption; read?: (file: string) => Buffer; diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js new file mode 100644 index 000000000000..1e874734d24a --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js @@ -0,0 +1,9 @@ +// @ts-expect-error we need both queries to prevent Vite from inlining the asset as base64 string on build +// see https://github.com/vitejs/vite/issues/19562 +import asset from './example.json?url&no-inline'; + +export async function load({ fetch }) { + const res = await fetch(asset); + const data = await res.json(); + return data; +} diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.svelte b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.svelte new file mode 100644 index 000000000000..fddeb0d2e5b9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.svelte @@ -0,0 +1,5 @@ + + +

{data.a}

diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-asset/example.json b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/example.json new file mode 100644 index 000000000000..aa53c37972ab --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/example.json @@ -0,0 +1,3 @@ +{ + "a": "1" +} diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index e56b8231fb46..f05101c4633d 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -477,6 +477,11 @@ test.describe('Load', () => { expect(await response.text()).toContain('status: 404'); }); + test('fetch reads universal load assets on the server', async ({ page }) => { + await page.goto('/load/fetch-asset'); + await expect(page.locator('p')).toHaveText('1'); + }); + test('includes origin header on non-GET internal request', async ({ page, baseURL }) => { await page.goto('/load/fetch-origin-internal'); expect(await page.textContent('h1')).toBe(`origin: ${new URL(baseURL).origin}`); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index e8f7501ad5ce..c0525e7c9cdb 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1159,7 +1159,7 @@ declare module '@sveltejs/kit' { * - During server-side rendering, the response will be captured and inlined into the rendered HTML by hooking into the `text` and `json` methods of the `Response` object. Note that headers will _not_ be serialized, unless explicitly included via [`filterSerializedResponseHeaders`](https://svelte.dev/docs/kit/hooks#Server-hooks-handle) * - During hydration, the response will be read from the HTML, guaranteeing consistency and preventing an additional network request. * - * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies) + * You can learn more about making credentialed requests with cookies [here](https://svelte.dev/docs/kit/load#Cookies). */ fetch: typeof fetch; /** @@ -1171,7 +1171,7 @@ declare module '@sveltejs/kit' { */ locals: App.Locals; /** - * The parameters of the current route - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object + * The parameters of the current route - e.g. for a route like `/blog/[slug]`, a `{ slug: string }` object. */ params: Params; /** @@ -1179,15 +1179,15 @@ declare module '@sveltejs/kit' { */ platform: Readonly | undefined; /** - * The original request object + * The original request object. */ request: Request; /** - * Info about the current route + * Info about the current route. */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]` + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. */ id: RouteId; }; @@ -1284,15 +1284,16 @@ declare module '@sveltejs/kit' { } export interface ServerInitOptions { - /** A map of environment variables */ + /** A map of environment variables. */ env: Record; - /** A function that turns an asset filename into a `ReadableStream`. Required for the `read` export from `$app/server` to work */ + /** A function that turns an asset filename into a `ReadableStream`. Required for the `read` export from `$app/server` to work. */ read?: (file: string) => ReadableStream; } export interface SSRManifest { appDir: string; appPath: string; + /** Static files from `kit.config.files.assets` and the service worker (if any). */ assets: Set; mimeTypes: Record; @@ -1303,7 +1304,7 @@ declare module '@sveltejs/kit' { routes: SSRRoute[]; prerendered_routes: Set; matchers: () => Promise>; - /** A `[file]: size` map of all assets imported by server code */ + /** A `[file]: size` map of all assets imported by server code. */ server_assets: Record; }; } @@ -1434,7 +1435,7 @@ declare module '@sveltejs/kit' { } /** - * The object returned by the [`redirect`](https://svelte.dev/docs/kit/@sveltejs-kit#redirect) function + * The object returned by the [`redirect`](https://svelte.dev/docs/kit/@sveltejs-kit#redirect) function. */ export interface Redirect { /** The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#redirection_messages), in the range 300-308. */ @@ -1715,11 +1716,11 @@ declare module '@sveltejs/kit' { out_dir: string; service_worker: string | null; client: { - /** Path to the client entry point */ + /** Path to the client entry point. */ start: string; - /** Path to the generated `app.js` file that contains the client manifest. Only set in case of `bundleStrategy === 'split'` */ + /** Path to the generated `app.js` file that contains the client manifest. Only set in case of `bundleStrategy === 'split'`. */ app?: string; - /** JS files that the client entry point relies on */ + /** JS files that the client entry point relies on. */ imports: string[]; /** * JS files that represent the entry points of the layouts/pages. @@ -1742,7 +1743,7 @@ declare module '@sveltejs/kit' { stylesheets: string[]; fonts: string[]; uses_env_dynamic_public: boolean; - /** Only set in case of `bundleStrategy === 'inline'` */ + /** Only set in case of `bundleStrategy === 'inline'`. */ inline?: { script: string; style: string | undefined; @@ -1752,6 +1753,7 @@ declare module '@sveltejs/kit' { } interface ManifestData { + /** Static files from `kit.config.files.assets`. */ assets: Asset[]; hooks: { client: string | null; @@ -1765,21 +1767,22 @@ declare module '@sveltejs/kit' { interface PageNode { depth: number; - /** The +page/layout.svelte */ + /** The `+page/layout.svelte`. */ component?: string; // TODO supply default component if it's missing (bit of an edge case) - /** The +page/layout.js/.ts */ + /** The `+page/layout.js/.ts`. */ universal?: string; - /** The +page/layout.server.js/ts */ + /** The `+page/layout.server.js/ts`. */ server?: string; parent_id?: string; parent?: PageNode; - /** Filled with the pages that reference this layout (if this is a layout) */ + /** Filled with the pages that reference this layout (if this is a layout). */ child_pages?: PageNode[]; } type RecursiveRequired = { // Recursive implementation of TypeScript's Required utility type. // Will recursively continue until it reaches a primitive or Function + // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type [K in keyof T]-?: Extract extends never // If it does not have a Function type ? RecursiveRequired // recursively continue through. : T[K]; // Use the exact type for everything else @@ -1841,7 +1844,7 @@ declare module '@sveltejs/kit' { interface SSRNode { component: SSRComponentLoader; - /** index into the `nodes` array in the generated `client/app.js` */ + /** index into the `nodes` array in the generated `client/app.js`. */ index: number; /** external JS files that are loaded on the client. `imports[0]` is the entry point (e.g. `client/nodes/0.js`) */ imports: string[]; @@ -1849,7 +1852,7 @@ declare module '@sveltejs/kit' { stylesheets: string[]; /** external font files that are loaded on the client */ fonts: string[]; - /** inlined styles */ + /** inlined styles. */ inline_styles?(): MaybePromise>; universal: { From 3c0df50b807a1cd4f4ae43dfb3c25ef0f80b1164 Mon Sep 17 00:00:00 2001 From: Stephen Randall Date: Tue, 4 Mar 2025 06:45:53 -0500 Subject: [PATCH 0966/1135] fix: ensure hash router back/forward navigation works (#13492) - ensure modifying the hash manually results in a reload, which also aligns with the pathname behavior. Fixes #13322 - since we now handle hash manipulation reloads, we can remove code elsewhere that was supposed to handle this but introduced bugs with back/forward navigation. Fixes #13460 --- .changeset/angry-peaches-beam.md | 5 +++++ packages/kit/src/runtime/client/client.js | 13 ++++++------- .../hash-based-routing/src/routes/+layout.svelte | 1 + .../test/apps/hash-based-routing/test/test.js | 16 ++++++++++++++++ 4 files changed, 28 insertions(+), 7 deletions(-) create mode 100644 .changeset/angry-peaches-beam.md diff --git a/.changeset/angry-peaches-beam.md b/.changeset/angry-peaches-beam.md new file mode 100644 index 000000000000..8d7a8fd61546 --- /dev/null +++ b/.changeset/angry-peaches-beam.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correct navigation history with hash router and ensure load functions are rerun on user changes to URL hash diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 630f035754a1..83833a007f31 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -2435,6 +2435,12 @@ function _start_router() { if (!hash_navigating) { const url = new URL(location.href); update_url(url); + + // if the user edits the hash via the browser URL bar, trigger a full-page + // reload to align with pathname router behavior + if (app.hash) { + location.reload(); + } } } }); @@ -2453,13 +2459,6 @@ function _start_router() { '', location.href ); - } else if (app.hash) { - // If the user edits the hash via the browser URL bar, it - // (surprisingly!) mutates `current.url`, allowing us to - // detect it and trigger a navigation - if (current.url.hash === location.hash) { - void navigate({ type: 'goto', url: decode_hash(current.url) }); - } } }); diff --git a/packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte b/packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte index 5ac801199106..76cae24dfaf8 100644 --- a/packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte +++ b/packages/kit/test/apps/hash-based-routing/src/routes/+layout.svelte @@ -9,6 +9,7 @@ / /#/a +/#/b /#/a#b /#/b/123 /#/b/456 diff --git a/packages/kit/test/apps/hash-based-routing/test/test.js b/packages/kit/test/apps/hash-based-routing/test/test.js index 12589824e332..b9ab54dd1249 100644 --- a/packages/kit/test/apps/hash-based-routing/test/test.js +++ b/packages/kit/test/apps/hash-based-routing/test/test.js @@ -99,4 +99,20 @@ test.describe('hash based navigation', () => { const url = new URL(page.url()); expect(url.hash).toBe('#/anchor#test'); }); + + test('navigation history works', async ({ page }) => { + await page.goto('/'); + + await page.locator('a[href="/#/a"]').click(); + await page.waitForURL('/#/a'); + + await page.locator('a[href="/#/b"]').click(); + await page.waitForURL('/#/b'); + + await page.goBack(); + expect(page.locator('p')).toHaveText('a'); + + await page.goForward(); + expect(page.locator('p')).toHaveText('b'); + }); }); From 993fa25ab3a70ce079d9e2d0fbaa0588587387c3 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 4 Mar 2025 12:46:35 +0100 Subject: [PATCH 0967/1135] feat: allow async `reroute` (#13520) closes #13176 --- .changeset/cool-donkeys-pump.md | 5 +++++ documentation/docs/30-advanced/20-hooks.md | 2 ++ packages/kit/src/exports/public.d.ts | 2 +- packages/kit/src/runtime/client/client.js | 12 ++++++------ packages/kit/src/runtime/server/respond.js | 2 +- packages/kit/test/apps/basics/src/hooks.js | 8 ++++++++ .../basics/src/routes/reroute/async/+page.svelte | 1 + .../basics/src/routes/reroute/async/a/+page.svelte | 1 + .../basics/src/routes/reroute/async/b/+page.svelte | 5 +++++ packages/kit/test/apps/basics/test/client.test.js | 8 ++++++++ packages/kit/test/apps/basics/test/server.test.js | 7 +++++++ packages/kit/types/index.d.ts | 2 +- 12 files changed, 46 insertions(+), 9 deletions(-) create mode 100644 .changeset/cool-donkeys-pump.md create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/async/a/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/async/b/+page.svelte diff --git a/.changeset/cool-donkeys-pump.md b/.changeset/cool-donkeys-pump.md new file mode 100644 index 000000000000..1d3be96b65a2 --- /dev/null +++ b/.changeset/cool-donkeys-pump.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: allow async `reroute` diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index b35e66b73a09..e68cc32a3e8e 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -299,6 +299,8 @@ The `lang` parameter will be correctly derived from the returned pathname. Using `reroute` will _not_ change the contents of the browser's address bar, or the value of `event.url`. +Since version 2.18, the `reroute` hook can be asynchronous, allowing it to (for example) fetch data from your backend to decide where to reroute to. Use this carefully and make sure it's fast, as it will delay navigation otherwise. + ### transport This is a collection of _transporters_, which allow you to pass custom types — returned from `load` and form actions — across the server/client boundary. Each transporter contains an `encode` function, which encodes values on the server (or returns `false` for anything that isn't an instance of the type) and a corresponding `decode` function: diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 7248f12a4a35..d85264dd5b02 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -814,7 +814,7 @@ export type ClientInit = () => MaybePromise; * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ -export type Reroute = (event: { url: URL }) => void | string; +export type Reroute = (event: { url: URL }) => MaybePromise; /** * The [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook allows you to transport custom types across the server/client boundary. diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 83833a007f31..89159a3ee622 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1198,13 +1198,13 @@ async function load_root_error_page({ status, error, url, route }) { /** * Resolve the relative rerouted URL for a client-side navigation * @param {URL} url - * @returns {URL | undefined} + * @returns {Promise} */ -function get_rerouted_url(url) { - // reroute could alter the given URL, so we pass a copy +async function get_rerouted_url(url) { let rerouted; try { - rerouted = app.hooks.reroute({ url: new URL(url) }) ?? url; + // reroute could alter the given URL, so we pass a copy + rerouted = (await app.hooks.reroute({ url: new URL(url) })) ?? url; if (typeof rerouted === 'string') { const tmp = new URL(url); // do not mutate the incoming URL @@ -1246,7 +1246,7 @@ async function get_navigation_intent(url, invalidating) { if (is_external_url(url, base, app.hash)) return; if (__SVELTEKIT_CLIENT_ROUTING__) { - const rerouted = get_rerouted_url(url); + const rerouted = await get_rerouted_url(url); if (!rerouted) return; const path = get_url_path(rerouted); @@ -1997,7 +1997,7 @@ export async function preloadCode(pathname) { } if (__SVELTEKIT_CLIENT_ROUTING__) { - const rerouted = get_rerouted_url(url); + const rerouted = await get_rerouted_url(url); if (!rerouted || !routes.find((route) => route.exec(get_url_path(rerouted)))) { throw new Error(`'${pathname}' did not match any routes`); } diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 05b1934d0595..ee53d81c6c00 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -115,7 +115,7 @@ export async function respond(request, options, manifest, state) { try { // reroute could alter the given URL, so we pass a copy - resolved_path = options.hooks.reroute({ url: new URL(url) }) ?? url.pathname; + resolved_path = (await options.hooks.reroute({ url: new URL(url) })) ?? url.pathname; } catch { return text('Internal Server Error', { status: 500 diff --git a/packages/kit/test/apps/basics/src/hooks.js b/packages/kit/test/apps/basics/src/hooks.js index 3897bb949252..379788226c64 100644 --- a/packages/kit/test/apps/basics/src/hooks.js +++ b/packages/kit/test/apps/basics/src/hooks.js @@ -27,6 +27,14 @@ export const reroute = ({ url }) => { throw new Error('Server Error - Should trigger 500 response'); } + if (url.pathname === '/reroute/async/a') { + return new Promise((resolve) => { + setTimeout(() => { + resolve('/reroute/async/b'); + }, 100); + }); + } + if (url.pathname in mapping) { return mapping[url.pathname]; } diff --git a/packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte new file mode 100644 index 000000000000..a7a995fcde0c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte @@ -0,0 +1 @@ +Go to url that should be rewritten diff --git a/packages/kit/test/apps/basics/src/routes/reroute/async/a/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/async/a/+page.svelte new file mode 100644 index 000000000000..9767ca488e13 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/async/a/+page.svelte @@ -0,0 +1 @@ +

Should have been rewritten to /reroute/async/b

diff --git a/packages/kit/test/apps/basics/src/routes/reroute/async/b/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/async/b/+page.svelte new file mode 100644 index 000000000000..e405729c9633 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/async/b/+page.svelte @@ -0,0 +1,5 @@ + + +

Successfully rewritten, URL should still show a: {page.url.pathname}

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index df67597356a2..8dd641e903a2 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1402,6 +1402,14 @@ test.describe('reroute', () => { ); }); + test('Apply async reroute during client side navigation', async ({ page }) => { + await page.goto('/reroute/async'); + await page.click("a[href='/reroute/async/a']"); + expect(await page.textContent('h1')).toContain( + 'Successfully rewritten, URL should still show a: /reroute/async/a' + ); + }); + test('Apply reroute after client-only redirects', async ({ page }) => { await page.goto('/reroute/client-only-redirect'); expect(await page.textContent('h1')).toContain('Successfully rewritten'); diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index f05101c4633d..7e13e9b3c624 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -673,6 +673,13 @@ test.describe('reroute', () => { ); }); + test('Apply async reroute when directly accessing a page', async ({ page }) => { + await page.goto('/reroute/async/a'); + expect(await page.textContent('h1')).toContain( + 'Successfully rewritten, URL should still show a: /reroute/async/a' + ); + }); + test('Returns a 500 response if reroute throws an error on the server', async ({ page }) => { const response = await page.goto('/reroute/error-handling/server-error'); expect(response?.status()).toBe(500); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index c0525e7c9cdb..0b54457bdd27 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -796,7 +796,7 @@ declare module '@sveltejs/kit' { * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ - export type Reroute = (event: { url: URL }) => void | string; + export type Reroute = (event: { url: URL }) => MaybePromise; /** * The [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook allows you to transport custom types across the server/client boundary. From 6e97d5f8bcac9564a008f02e4559cdb6a0a1b3ee Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 4 Mar 2025 19:57:01 +0800 Subject: [PATCH 0968/1135] fix: preload data on tap after code was preloaded on hover (#13530) fixes #13466 (for real this time) #13486 previously fixed the preload on tap not working by ensuring we do not skip checking the link until a preload has triggered. However, there's also the case where we have both preload link options: preload code on hover and preload data on tap. This PR ensures that we still preload data on tap even after a successful preload on hover if the preload on hover was only preloading code. --- .changeset/silver-pigs-report.md | 5 ++ packages/kit/src/runtime/client/client.js | 64 +++++++++++-------- .../data-sveltekit/preload-data/+page.svelte | 7 ++ .../preload-data/target/+page.server.js | 5 ++ .../kit/test/apps/basics/test/client.test.js | 60 +++++++++++++++-- 5 files changed, 108 insertions(+), 33 deletions(-) create mode 100644 .changeset/silver-pigs-report.md create mode 100644 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/target/+page.server.js diff --git a/.changeset/silver-pigs-report.md b/.changeset/silver-pigs-report.md new file mode 100644 index 000000000000..669acc786b8b --- /dev/null +++ b/.changeset/silver-pigs-report.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly preload data on `mousedown`/`touchstart` if code was preloaded on hover diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 89159a3ee622..98984115f962 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -1636,25 +1636,29 @@ if (import.meta.hot) { }); } +/** @typedef {(typeof PRELOAD_PRIORITIES)['hover'] | (typeof PRELOAD_PRIORITIES)['tap']} PreloadDataPriority */ + function setup_preload() { /** @type {NodeJS.Timeout} */ let mousemove_timeout; /** @type {Element} */ let current_a; + /** @type {PreloadDataPriority} */ + let current_priority; container.addEventListener('mousemove', (event) => { const target = /** @type {Element} */ (event.target); clearTimeout(mousemove_timeout); mousemove_timeout = setTimeout(() => { - void preload(target, 2); + void preload(target, PRELOAD_PRIORITIES.hover); }, 20); }); /** @param {Event} event */ function tap(event) { if (event.defaultPrevented) return; - void preload(/** @type {Element} */ (event.composedPath()[0]), 1); + void preload(/** @type {Element} */ (event.composedPath()[0]), PRELOAD_PRIORITIES.tap); } container.addEventListener('mousedown', tap); @@ -1674,11 +1678,14 @@ function setup_preload() { /** * @param {Element} element - * @param {number} priority + * @param {PreloadDataPriority} priority */ async function preload(element, priority) { const a = find_anchor(element, container); - if (!a || a === current_a) return; + + // we don't want to preload data again if the user has already hovered/tapped + const interacted = a === current_a && priority >= current_priority; + if (!a || interacted) return; const { url, external, download } = get_link_info(a, base, app.hash); if (external || download) return; @@ -1687,31 +1694,34 @@ function setup_preload() { // we don't want to preload data for a page we're already on const same_url = url && get_page_key(current.url) === get_page_key(url); - - if (!options.reload && !same_url) { - if (priority <= options.preload_data) { - current_a = a; - const intent = await get_navigation_intent(url, false); - if (intent) { - if (DEV) { - void _preload_data(intent).then((result) => { - if (result.type === 'loaded' && result.state.error) { - console.warn( - `Preloading data for ${intent.url.pathname} failed with the following error: ${result.state.error.message}\n` + - 'If this error is transient, you can ignore it. Otherwise, consider disabling preloading for this route. ' + - 'This route was preloaded due to a data-sveltekit-preload-data attribute. ' + - 'See https://svelte.dev/docs/kit/link-options for more info' - ); - } - }); - } else { - void _preload_data(intent); + if (options.reload || same_url) return; + + if (priority <= options.preload_data) { + current_a = a; + // we don't want to preload data again on tap if we've already preloaded it on hover + current_priority = PRELOAD_PRIORITIES.tap; + + const intent = await get_navigation_intent(url, false); + if (!intent) return; + + if (DEV) { + void _preload_data(intent).then((result) => { + if (result.type === 'loaded' && result.state.error) { + console.warn( + `Preloading data for ${intent.url.pathname} failed with the following error: ${result.state.error.message}\n` + + 'If this error is transient, you can ignore it. Otherwise, consider disabling preloading for this route. ' + + 'This route was preloaded due to a data-sveltekit-preload-data attribute. ' + + 'See https://svelte.dev/docs/kit/link-options for more info' + ); } - } - } else if (priority <= options.preload_code) { - current_a = a; - void _preload_code(/** @type {URL} */ (url)); + }); + } else { + void _preload_data(intent); } + } else if (priority <= options.preload_code) { + current_a = a; + current_priority = priority; + void _preload_code(/** @type {URL} */ (url)); } } diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/+page.svelte b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/+page.svelte index 15d385fb9212..6c932e99140f 100644 --- a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/+page.svelte @@ -8,3 +8,10 @@ tap + +hover for code then tap for data diff --git a/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/target/+page.server.js b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/target/+page.server.js new file mode 100644 index 000000000000..9033be2470e4 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-data/target/+page.server.js @@ -0,0 +1,5 @@ +export function load() { + return { + a: 1 + }; +} diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 8dd641e903a2..be7d628a2e62 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -887,37 +887,44 @@ test.describe('data-sveltekit attributes', () => { req .response() .then( - (res) => res.text(), + (res) => res?.text(), () => '' ) - .then((response) => { - if (response.includes('this string should only appear in this preloaded file')) { + .then((text) => { + if (text?.includes('this string should only appear in this preloaded file')) { requests.push(req.url()); } }); } + + if (req.url().includes('__data.json')) { + requests.push(req.url()); + } }); await page.goto('/data-sveltekit/preload-data'); await page.locator('#one').hover(); + await page.locator('#one').dispatchEvent('touchstart'); await Promise.all([ page.waitForTimeout(100), // wait for preloading to start page.waitForLoadState('networkidle') // wait for preloading to finish ]); - expect(requests.length).toBe(1); + expect(requests.length).toBe(2); requests.length = 0; await page.goto('/data-sveltekit/preload-data'); await page.locator('#two').hover(); + await page.locator('#two').dispatchEvent('touchstart'); await Promise.all([ page.waitForTimeout(100), // wait for preloading to start page.waitForLoadState('networkidle') // wait for preloading to finish ]); - expect(requests.length).toBe(1); + expect(requests.length).toBe(2); requests.length = 0; await page.goto('/data-sveltekit/preload-data'); await page.locator('#three').hover(); + await page.locator('#three').dispatchEvent('touchstart'); await Promise.all([ page.waitForTimeout(100), // wait for preloading to start page.waitForLoadState('networkidle') // wait for preloading to finish @@ -932,7 +939,7 @@ test.describe('data-sveltekit attributes', () => { page.waitForTimeout(100), // wait for preloading to start page.waitForLoadState('networkidle') // wait for preloading to finish ]); - expect(requests.length).toBe(1); + expect(requests.length).toBe(2); }); test('data-sveltekit-preload-data network failure does not trigger navigation', async ({ @@ -1001,6 +1008,47 @@ test.describe('data-sveltekit attributes', () => { expect(page).toHaveURL('/data-sveltekit/preload-data/offline/slow-navigation'); }); + test('data-sveltekit-preload-data tap works after data-sveltekit-preload-code hover', async ({ + page + }) => { + /** @type {string[]} */ + const requests = []; + page.on('request', (req) => { + if (req.resourceType() === 'script') { + req + .response() + .then( + (res) => res?.text(), + () => '' + ) + .then((text) => { + if (text?.includes('this string should only appear in this preloaded file')) { + requests.push(req.url()); + } + }); + } + + if (req.url().includes('__data.json')) { + requests.push(req.url()); + } + }); + + await page.goto('/data-sveltekit/preload-data'); + await page.locator('#hover-then-tap').hover(); + await Promise.all([ + page.waitForTimeout(100), // wait for preloading to start + page.waitForLoadState('networkidle') // wait for preloading to finish + ]); + expect(requests.length).toBe(1); + + await page.locator('#hover-then-tap').dispatchEvent('touchstart'); + await Promise.all([ + page.waitForTimeout(100), // wait for preloading to start + page.waitForLoadState('networkidle') // wait for preloading to finish + ]); + expect(requests.length).toBe(2); + }); + test('data-sveltekit-reload', async ({ baseURL, page, clicknav }) => { /** @type {string[]} */ const requests = []; From 0800da1c4a07baa4024847f4123782ae8c088075 Mon Sep 17 00:00:00 2001 From: Elliott Johnson Date: Tue, 4 Mar 2025 05:45:22 -0700 Subject: [PATCH 0969/1135] fix: Always include root layout/error nodes in manifest (#13522) Fixes #13518. This optimization doesn't work when an app (or a specific bundle, such as the ones generated for edge functions or when split: true in Vercel) has all prerendered routes. Given that the optimization probably isn't actually saving us much, it's probably not worth it to try to find some convoluted workaround. --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/long-hounds-listen.md | 5 ++++ package.json | 5 ++-- .../kit/src/core/generate_manifest/index.js | 6 ++-- .../prerendered-app-error-pages/.gitignore | 3 ++ .../prerendered-app-error-pages/README.md | 1 + .../prerendered-app-error-pages/jsconfig.json | 19 +++++++++++++ .../prerendered-app-error-pages/package.json | 26 ++++++++++++++++++ .../playwright.config.js | 1 + .../prerendered-app-error-pages/src/app.d.ts | 13 +++++++++ .../prerendered-app-error-pages/src/app.html | 12 ++++++++ .../src/routes/+error.svelte | 1 + .../src/routes/+layout.ts | 1 + .../src/routes/+page.svelte | 4 +++ .../static/favicon.png | Bin 0 -> 1571 bytes .../svelte.config.js | 6 ++++ .../prerendered-app-error-pages/test/test.js | 9 ++++++ .../vite.config.js | 12 ++++++++ pnpm-lock.yaml | 24 ++++++++++++++++ 18 files changed, 142 insertions(+), 6 deletions(-) create mode 100644 .changeset/long-hounds-listen.md create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/.gitignore create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/README.md create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/jsconfig.json create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/package.json create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/playwright.config.js create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/src/app.d.ts create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/src/app.html create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/src/routes/+error.svelte create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/src/routes/+layout.ts create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/src/routes/+page.svelte create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/static/favicon.png create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/svelte.config.js create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/test/test.js create mode 100644 packages/kit/test/apps/prerendered-app-error-pages/vite.config.js diff --git a/.changeset/long-hounds-listen.md b/.changeset/long-hounds-listen.md new file mode 100644 index 000000000000..b3f7ec486efd --- /dev/null +++ b/.changeset/long-hounds-listen.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: Include root layout and error nodes even when apps have only prerendered pages diff --git a/package.json b/package.json index 5da3d58ef7e9..10571e95da91 100644 --- a/package.json +++ b/package.json @@ -38,7 +38,8 @@ "pnpm": { "onlyBuiltDependencies": [ "svelte-preprocess", - "workerd" + "workerd", + "esbuild" ] } -} +} \ No newline at end of file diff --git a/packages/kit/src/core/generate_manifest/index.js b/packages/kit/src/core/generate_manifest/index.js index 5db569b5c8d8..eaaf9e6cd38e 100644 --- a/packages/kit/src/core/generate_manifest/index.js +++ b/packages/kit/src/core/generate_manifest/index.js @@ -27,12 +27,10 @@ export function generate_manifest({ build_data, prerendered, relative_path, rout const reindexed = new Map(); /** * All nodes actually used in the routes definition (prerendered routes are omitted). - * If `routes` is empty, it means that this manifest is only used for server-side resolution - * and the root layout/error is therefore not needed. - * Else, root layout/error is always included as they are needed for 404 and root errors. + * Root layout/error is always included as they are needed for 404 and root errors. * @type {Set} */ - const used_nodes = new Set(routes.length > 0 ? [0, 1] : []); + const used_nodes = new Set([0, 1]); const server_assets = find_server_assets(build_data, routes); diff --git a/packages/kit/test/apps/prerendered-app-error-pages/.gitignore b/packages/kit/test/apps/prerendered-app-error-pages/.gitignore new file mode 100644 index 000000000000..fad4d3e1518d --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/.gitignore @@ -0,0 +1,3 @@ +/test/errors.json +!/.env +/src/routes/routing/symlink-from \ No newline at end of file diff --git a/packages/kit/test/apps/prerendered-app-error-pages/README.md b/packages/kit/test/apps/prerendered-app-error-pages/README.md new file mode 100644 index 000000000000..89bb2b9c5308 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/README.md @@ -0,0 +1 @@ +Please do not edit this app unless you're absolutely sure it's not going to affect the tests. diff --git a/packages/kit/test/apps/prerendered-app-error-pages/jsconfig.json b/packages/kit/test/apps/prerendered-app-error-pages/jsconfig.json new file mode 100644 index 000000000000..0b2d8865f4ef --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/jsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://svelte.dev/docs/kit/configuration#alias + // except $lib which is handled by https://svelte.dev/docs/kit/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/packages/kit/test/apps/prerendered-app-error-pages/package.json b/packages/kit/test/apps/prerendered-app-error-pages/package.json new file mode 100644 index 000000000000..0bc92bb67968 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/package.json @@ -0,0 +1,26 @@ +{ + "name": "test-prerendered-app-error-pages", + "private": true, + "version": "0.0.1", + "type": "module", + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "prepare": "svelte-kit sync || echo ''", + "check": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./jsconfig.json --watch", + "test": "pnpm test:dev && pnpm test:build", + "test:dev": "cross-env DEV=true playwright test", + "test:build": "playwright test" + }, + "devDependencies": { + "@sveltejs/kit": "workspace:^", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "cross-env": "^7.0.3", + "svelte": "^5.2.9", + "svelte-check": "^4.1.1", + "typescript": "^5.5.4", + "vite": "^6.0.11" + } +} diff --git a/packages/kit/test/apps/prerendered-app-error-pages/playwright.config.js b/packages/kit/test/apps/prerendered-app-error-pages/playwright.config.js new file mode 100644 index 000000000000..33d36b651014 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/playwright.config.js @@ -0,0 +1 @@ +export { config as default } from '../../utils.js'; diff --git a/packages/kit/test/apps/prerendered-app-error-pages/src/app.d.ts b/packages/kit/test/apps/prerendered-app-error-pages/src/app.d.ts new file mode 100644 index 000000000000..da08e6da592d --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://svelte.dev/docs/kit/types#app.d.ts +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/packages/kit/test/apps/prerendered-app-error-pages/src/app.html b/packages/kit/test/apps/prerendered-app-error-pages/src/app.html new file mode 100644 index 000000000000..77a5ff52c923 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/src/app.html @@ -0,0 +1,12 @@ + + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+error.svelte b/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+error.svelte new file mode 100644 index 000000000000..5b44aeb7a686 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+error.svelte @@ -0,0 +1 @@ +

This is your custom error page.

diff --git a/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+layout.ts b/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+layout.ts new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+layout.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+page.svelte b/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+page.svelte new file mode 100644 index 000000000000..e7b3bd731833 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/src/routes/+page.svelte @@ -0,0 +1,4 @@ +

+ This app exists to assert that an app with only prerendered routes successfully renders custom + error pages. +

diff --git a/packages/kit/test/apps/prerendered-app-error-pages/static/favicon.png b/packages/kit/test/apps/prerendered-app-error-pages/static/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..825b9e65af7c104cfb07089bb28659393b4f2097 GIT binary patch literal 1571 zcmV+;2Hg3HP)Px)-AP12RCwC$UE6KzI1p6{F2N z1VK2vi|pOpn{~#djwYcWXTI_im_u^TJgMZ4JMOsSj!0ma>B?-(Hr@X&W@|R-$}W@Z zgj#$x=!~7LGqHW?IO8+*oE1MyDp!G=L0#^lUx?;!fXv@l^6SvTnf^ac{5OurzC#ZMYc20lI%HhX816AYVs1T3heS1*WaWH z%;x>)-J}YB5#CLzU@GBR6sXYrD>Vw(Fmt#|JP;+}<#6b63Ike{Fuo!?M{yEffez;| zp!PfsuaC)>h>-AdbnwN13g*1LowNjT5?+lFVd#9$!8Z9HA|$*6dQ8EHLu}U|obW6f z2%uGv?vr=KNq7YYa2Roj;|zooo<)lf=&2yxM@e`kM$CmCR#x>gI>I|*Ubr({5Y^rb zghxQU22N}F51}^yfDSt786oMTc!W&V;d?76)9KXX1 z+6Okem(d}YXmmOiZq$!IPk5t8nnS{%?+vDFz3BevmFNgpIod~R{>@#@5x9zJKEHLHv!gHeK~n)Ld!M8DB|Kfe%~123&Hz1Z(86nU7*G5chmyDe ziV7$pB7pJ=96hpxHv9rCR29%bLOXlKU<_13_M8x)6;P8E1Kz6G<&P?$P^%c!M5`2` zfY2zg;VK5~^>TJGQzc+33-n~gKt{{of8GzUkWmU110IgI0DLxRIM>0US|TsM=L|@F z0Bun8U!cRB7-2apz=y-7*UxOxz@Z0)@QM)9wSGki1AZ38ceG7Q72z5`i;i=J`ILzL z@iUO?SBBG-0cQuo+an4TsLy-g-x;8P4UVwk|D8{W@U1Zi z!M)+jqy@nQ$p?5tsHp-6J304Q={v-B>66$P0IDx&YT(`IcZ~bZfmn11#rXd7<5s}y zBi9eim&zQc0Dk|2>$bs0PnLmDfMP5lcXRY&cvJ=zKxI^f0%-d$tD!`LBf9^jMSYUA zI8U?CWdY@}cRq6{5~y+)#h1!*-HcGW@+gZ4B};0OnC~`xQOyH19z*TA!!BJ%9s0V3F?CAJ{hTd#*tf+ur-W9MOURF-@B77_-OshsY}6 zOXRY=5%C^*26z?l)1=$bz30!so5tfABdSYzO+H=CpV~aaUefmjvfZ3Ttu9W&W3Iu6 zROlh0MFA5h;my}8lB0tAV-Rvc2Zs_CCSJnx@d`**$idgy-iMob4dJWWw|21b4NB=LfsYp0Aeh{Ov)yztQi;eL4y5 zMi>8^SzKqk8~k?UiQK^^-5d8c%bV?$F8%X~czyiaKCI2=UH { + await page.goto('/nonexistent', { wait_for_started: false }); + expect(await page.textContent('p')).toBe('This is your custom error page.'); +}); diff --git a/packages/kit/test/apps/prerendered-app-error-pages/vite.config.js b/packages/kit/test/apps/prerendered-app-error-pages/vite.config.js new file mode 100644 index 000000000000..438fa14111b7 --- /dev/null +++ b/packages/kit/test/apps/prerendered-app-error-pages/vite.config.js @@ -0,0 +1,12 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import path from 'node:path'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()], + server: { + fs: { + allow: [path.resolve('../../../src')] + } + } +}); diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 73f0d92a48cf..f0301292918b 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -644,6 +644,30 @@ importers: specifier: ^6.0.11 version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + packages/kit/test/apps/prerendered-app-error-pages: + devDependencies: + '@sveltejs/kit': + specifier: workspace:^ + version: link:../../.. + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.1 + version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + cross-env: + specifier: ^7.0.3 + version: 7.0.3 + svelte: + specifier: ^5.2.9 + version: 5.2.9 + svelte-check: + specifier: ^4.1.1 + version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + typescript: + specifier: ^5.5.4 + version: 5.6.3 + vite: + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + packages/kit/test/apps/writes: devDependencies: '@sveltejs/kit': From 92d0dbb3431ef295fe4db9c6cd55c6c3c00544c7 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Tue, 4 Mar 2025 16:11:19 +0100 Subject: [PATCH 0970/1135] feat: provide `normalizeUrl` helper (#13539) Provides people a way to normalize a raw URL that could contain SvelteKit-internal data. One use case would be that you want to use middleware in front of, but outside of SvelteKit Extracted from #13477 --- .changeset/tough-mangos-develop.md | 5 +++ packages/kit/src/exports/index.js | 54 ++++++++++++++++++++++++++ packages/kit/src/exports/index.spec.js | 53 +++++++++++++++++++++++++ packages/kit/types/index.d.ts | 17 ++++++++ 4 files changed, 129 insertions(+) create mode 100644 .changeset/tough-mangos-develop.md create mode 100644 packages/kit/src/exports/index.spec.js diff --git a/.changeset/tough-mangos-develop.md b/.changeset/tough-mangos-develop.md new file mode 100644 index 000000000000..0b560a7b429b --- /dev/null +++ b/.changeset/tough-mangos-develop.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: provide `normalizeUrl` helper diff --git a/packages/kit/src/exports/index.js b/packages/kit/src/exports/index.js index 3b69f24de40e..1b4b7aa373b0 100644 --- a/packages/kit/src/exports/index.js +++ b/packages/kit/src/exports/index.js @@ -1,5 +1,13 @@ import { HttpError, Redirect, ActionFailure } from '../runtime/control.js'; import { BROWSER, DEV } from 'esm-env'; +import { + add_data_suffix, + add_resolution_suffix, + has_data_suffix, + has_resolution_suffix, + strip_data_suffix, + strip_resolution_suffix +} from '../runtime/pathname.js'; export { VERSION } from '../version.js'; @@ -207,3 +215,49 @@ export function fail(status, data) { export function isActionFailure(e) { return e instanceof ActionFailure; } + +/** + * Strips possible SvelteKit-internal suffixes and trailing slashes from the URL pathname. + * Returns the normalized URL as well as a method for adding the potential suffix back + * based on a new pathname (possibly including search) or URL. + * ```js + * import { normalizeUrl } from '@sveltejs/kit'; + * + * const { url, denormalize } = normalizeUrl('/blog/post/__data.json'); + * console.log(url.pathname); // /blog/post + * console.log(denormalize('/blog/post/a')); // /blog/post/a/__data.json + * ``` + * @param {URL | string} url + * @returns {{ url: URL, wasNormalized: boolean, denormalize: (url?: string | URL) => URL }} + */ +export function normalizeUrl(url) { + url = new URL(url, 'http://internal'); + + const is_route_resolution = has_resolution_suffix(url.pathname); + const is_data_request = has_data_suffix(url.pathname); + const has_trailing_slash = url.pathname !== '/' && url.pathname.endsWith('/'); + + if (is_route_resolution) { + url.pathname = strip_resolution_suffix(url.pathname); + } else if (is_data_request) { + url.pathname = strip_data_suffix(url.pathname); + } else if (has_trailing_slash) { + url.pathname = url.pathname.slice(0, -1); + } + + return { + url, + wasNormalized: is_data_request || is_route_resolution || has_trailing_slash, + denormalize: (new_url = url) => { + new_url = new URL(new_url, url); + if (is_route_resolution) { + new_url.pathname = add_resolution_suffix(new_url.pathname); + } else if (is_data_request) { + new_url.pathname = add_data_suffix(new_url.pathname); + } else if (has_trailing_slash && !new_url.pathname.endsWith('/')) { + new_url.pathname += '/'; + } + return new_url; + } + }; +} diff --git a/packages/kit/src/exports/index.spec.js b/packages/kit/src/exports/index.spec.js new file mode 100644 index 000000000000..87fbefd35b7e --- /dev/null +++ b/packages/kit/src/exports/index.spec.js @@ -0,0 +1,53 @@ +import { normalizeUrl } from './index.js'; +import { assert, describe, it } from 'vitest'; + +describe('normalizeUrl', () => { + it('noop for regular url', () => { + const original = new URL('http://example.com/foo/bar'); + const { url, wasNormalized, denormalize } = normalizeUrl(original); + + assert.equal(wasNormalized, false); + assert.equal(url.href, original.href); + assert.equal(denormalize().href, original.href); + assert.equal(denormalize('/baz').href, 'http://example.com/baz'); + assert.equal( + denormalize('?some=query#hash').href, + 'http://example.com/foo/bar?some=query#hash' + ); + assert.equal(denormalize('http://somethingelse.com/').href, 'http://somethingelse.com/'); + assert.equal( + denormalize(new URL('http://somethingelse.com/')).href, + 'http://somethingelse.com/' + ); + }); + + it('should normalize trailing slash', () => { + const original = new URL('http://example.com/foo/bar/'); + const { url, wasNormalized, denormalize } = normalizeUrl(original); + + assert.equal(wasNormalized, true); + assert.equal(url.href, original.href.slice(0, -1)); + assert.equal(denormalize().href, original.href); + assert.equal(denormalize('/baz').href, 'http://example.com/baz/'); + }); + + it('should normalize data request route', () => { + const original = new URL('http://example.com/foo/__data.json'); + const { url, wasNormalized, denormalize } = normalizeUrl(original); + + assert.equal(wasNormalized, true); + assert.equal(url.href, 'http://example.com/foo'); + assert.equal(denormalize().href, original.href); + assert.equal(denormalize('/baz').href, 'http://example.com/baz/__data.json'); + }); + + it('should normalize route request route', () => { + const original = new URL('http://example.com/foo/__route.js'); + const { url, wasNormalized, denormalize } = normalizeUrl(original); + + assert.equal(wasNormalized, true); + assert.equal(url.href, 'http://example.com/foo'); + assert.equal(denormalize().href, original.href); + assert.equal(denormalize('/baz').href, 'http://example.com/baz/__route.js'); + }); +}); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 0b54457bdd27..ff9e8c28affe 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2005,6 +2005,23 @@ declare module '@sveltejs/kit' { * @param e The object to check. * */ export function isActionFailure(e: unknown): e is ActionFailure; + /** + * Strips possible SvelteKit-internal suffixes and trailing slashes from the URL pathname. + * Returns the normalized URL as well as a method for adding the potential suffix back + * based on a new pathname (possibly including search) or URL. + * ```js + * import { normalizeUrl } from '@sveltejs/kit'; + * + * const { url, denormalize } = normalizeUrl('/blog/post/__data.json'); + * console.log(url.pathname); // /blog/post + * console.log(denormalize('/blog/post/a')); // /blog/post/a/__data.json + * ``` + * */ + export function normalizeUrl(url: URL | string): { + url: URL; + wasNormalized: boolean; + denormalize: (url?: string | URL) => URL; + }; export type LessThan = TNumber extends TArray["length"] ? TArray[number] : LessThan; export type NumericRange = Exclude, LessThan>; export const VERSION: string; From c808f3cf3c7e8cec56ab21ae817c897b2527d58c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 4 Mar 2025 16:13:02 +0100 Subject: [PATCH 0971/1135] Version Packages (#13536) Co-authored-by: github-actions[bot] --- .changeset/angry-peaches-beam.md | 5 ----- .changeset/cool-donkeys-pump.md | 5 ----- .changeset/dirty-radios-smile.md | 5 ----- .changeset/long-hounds-listen.md | 5 ----- .changeset/silver-pigs-report.md | 5 ----- .changeset/tough-mangos-develop.md | 5 ----- packages/kit/CHANGELOG.md | 24 ++++++++++++++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 9 files changed, 26 insertions(+), 32 deletions(-) delete mode 100644 .changeset/angry-peaches-beam.md delete mode 100644 .changeset/cool-donkeys-pump.md delete mode 100644 .changeset/dirty-radios-smile.md delete mode 100644 .changeset/long-hounds-listen.md delete mode 100644 .changeset/silver-pigs-report.md delete mode 100644 .changeset/tough-mangos-develop.md diff --git a/.changeset/angry-peaches-beam.md b/.changeset/angry-peaches-beam.md deleted file mode 100644 index 8d7a8fd61546..000000000000 --- a/.changeset/angry-peaches-beam.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correct navigation history with hash router and ensure load functions are rerun on user changes to URL hash diff --git a/.changeset/cool-donkeys-pump.md b/.changeset/cool-donkeys-pump.md deleted file mode 100644 index 1d3be96b65a2..000000000000 --- a/.changeset/cool-donkeys-pump.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: allow async `reroute` diff --git a/.changeset/dirty-radios-smile.md b/.changeset/dirty-radios-smile.md deleted file mode 100644 index 027fa152ce04..000000000000 --- a/.changeset/dirty-radios-smile.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: include universal load assets as server assets diff --git a/.changeset/long-hounds-listen.md b/.changeset/long-hounds-listen.md deleted file mode 100644 index b3f7ec486efd..000000000000 --- a/.changeset/long-hounds-listen.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: Include root layout and error nodes even when apps have only prerendered pages diff --git a/.changeset/silver-pigs-report.md b/.changeset/silver-pigs-report.md deleted file mode 100644 index 669acc786b8b..000000000000 --- a/.changeset/silver-pigs-report.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: correctly preload data on `mousedown`/`touchstart` if code was preloaded on hover diff --git a/.changeset/tough-mangos-develop.md b/.changeset/tough-mangos-develop.md deleted file mode 100644 index 0b560a7b429b..000000000000 --- a/.changeset/tough-mangos-develop.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: provide `normalizeUrl` helper diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index cc54d8b876fa..2c33ae2c15ac 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,29 @@ # @sveltejs/kit +## 2.18.0 +### Minor Changes + + +- feat: allow async `reroute` ([#13520](https://github.com/sveltejs/kit/pull/13520)) + + +- feat: provide `normalizeUrl` helper ([#13539](https://github.com/sveltejs/kit/pull/13539)) + + +### Patch Changes + + +- fix: correct navigation history with hash router and ensure load functions are rerun on user changes to URL hash ([#13492](https://github.com/sveltejs/kit/pull/13492)) + + +- fix: include universal load assets as server assets ([#13531](https://github.com/sveltejs/kit/pull/13531)) + + +- fix: Include root layout and error nodes even when apps have only prerendered pages ([#13522](https://github.com/sveltejs/kit/pull/13522)) + + +- fix: correctly preload data on `mousedown`/`touchstart` if code was preloaded on hover ([#13530](https://github.com/sveltejs/kit/pull/13530)) + ## 2.17.3 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 56ff5e7219d4..793787a75a58 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.17.3", + "version": "2.18.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 057cf3028c84..d43569b34c31 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.17.3'; +export const VERSION = '2.18.0'; From 0f822987c7c4755683aaaf25b462ca374b8c6bfb Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 4 Mar 2025 15:27:43 -0800 Subject: [PATCH 0972/1135] chore: avoid loading page nodes three times (#13540) --- packages/kit/src/runtime/server/page/index.js | 6 +- .../runtime/server/page/load_page_nodes.js | 11 ---- packages/kit/src/runtime/server/respond.js | 57 +++++++++++++------ 3 files changed, 41 insertions(+), 33 deletions(-) delete mode 100644 packages/kit/src/runtime/server/page/load_page_nodes.js diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 07f24f4e2561..116c8f99b1fb 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -15,7 +15,6 @@ import { render_response } from './render.js'; import { respond_with_error } from './respond_with_error.js'; import { get_option } from '../../../utils/options.js'; import { get_data_json } from '../data/index.js'; -import { load_page_nodes } from './load_page_nodes.js'; import { DEV } from 'esm-env'; /** @@ -29,10 +28,11 @@ const MAX_DEPTH = 10; * @param {import('types').SSROptions} options * @param {import('@sveltejs/kit').SSRManifest} manifest * @param {import('types').SSRState} state + * @param {Array} nodes * @param {import('types').RequiredResolveOptions} resolve_opts * @returns {Promise} */ -export async function render_page(event, page, options, manifest, state, resolve_opts) { +export async function render_page(event, page, options, manifest, state, nodes, resolve_opts) { if (state.depth > MAX_DEPTH) { // infinite request cycle detected return text(`Not found: ${event.url.pathname}`, { @@ -46,8 +46,6 @@ export async function render_page(event, page, options, manifest, state, resolve } try { - const nodes = await load_page_nodes(page, manifest); - const leaf_node = /** @type {import('types').SSRNode} */ (nodes.at(-1)); let status = 200; diff --git a/packages/kit/src/runtime/server/page/load_page_nodes.js b/packages/kit/src/runtime/server/page/load_page_nodes.js deleted file mode 100644 index 2af3f6e4c2c2..000000000000 --- a/packages/kit/src/runtime/server/page/load_page_nodes.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @param {import('types').PageNodeIndexes} page - * @param {import('@sveltejs/kit').SSRManifest} manifest - */ -export function load_page_nodes(page, manifest) { - return Promise.all([ - // we use == here rather than === because [undefined] serializes as "[null]" - ...page.layouts.map((n) => (n == undefined ? n : manifest._.nodes[n]())), - manifest._.nodes[page.leaf]() - ]); -} diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index ee53d81c6c00..816229d32bd6 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -24,7 +24,6 @@ import { json, text } from '../../exports/index.js'; import { action_json_redirect, is_action_json_request } from './page/actions.js'; import { INVALIDATED_PARAM, TRAILING_SLASH_PARAM } from '../shared.js'; import { get_public_env } from './env_module.js'; -import { load_page_nodes } from './page/load_page_nodes.js'; import { get_page_config } from '../../utils/route_config.js'; import { resolve_route } from './page/server_routing.js'; import { validateHeaders } from './validate-headers.js'; @@ -237,18 +236,19 @@ export async function respond(request, options, manifest, state) { }; try { + /** @type {Array | undefined} */ + const page_nodes = route?.page ? await load_page_nodes(route.page, manifest) : undefined; + // determine whether we need to redirect to add/remove a trailing slash if (route) { // if `paths.base === '/a/b/c`, then the root route is `/a/b/c/`, // regardless of the `trailingSlash` route option if (url.pathname === base || url.pathname === base + '/') { trailing_slash = 'always'; - } else if (route.page) { - const nodes = await load_page_nodes(route.page, manifest); - + } else if (page_nodes) { if (DEV) { - const layouts = nodes.slice(0, -1); - const page = nodes.at(-1); + const layouts = page_nodes.slice(0, -1); + const page = page_nodes.at(-1); for (const layout of layouts) { if (layout) { @@ -269,7 +269,7 @@ export async function respond(request, options, manifest, state) { } } - trailing_slash = get_option(nodes, 'trailingSlash'); + trailing_slash = get_option(page_nodes, 'trailingSlash'); } else if (route.endpoint) { const node = await route.endpoint(); trailing_slash = node.trailingSlash; @@ -306,10 +306,9 @@ export async function respond(request, options, manifest, state) { const node = await route.endpoint(); config = node.config ?? config; prerender = node.prerender ?? prerender; - } else if (route.page) { - const nodes = await load_page_nodes(route.page, manifest); - config = get_page_config(nodes) ?? config; - prerender = get_option(nodes, 'prerender') ?? false; + } else if (page_nodes) { + config = get_page_config(page_nodes) ?? config; + prerender = get_option(page_nodes, 'prerender') ?? false; } if (state.before_handle) { @@ -349,7 +348,7 @@ export async function respond(request, options, manifest, state) { const response = await options.hooks.handle({ event, resolve: (event, opts) => - resolve(event, opts).then((response) => { + resolve(event, page_nodes, opts).then((response) => { // add headers/cookies here, rather than inside `resolve`, so that we // can do it once for all responses instead of once per `return` for (const key in headers) { @@ -426,9 +425,10 @@ export async function respond(request, options, manifest, state) { /** * @param {import('@sveltejs/kit').RequestEvent} event + * @param {Array | undefined} page_nodes * @param {import('@sveltejs/kit').ResolveOptions} [opts] */ - async function resolve(event, opts) { + async function resolve(event, page_nodes, opts) { try { if (opts) { resolve_opts = { @@ -472,8 +472,18 @@ export async function respond(request, options, manifest, state) { } else if (route.endpoint && (!route.page || is_endpoint_request(event))) { response = await render_endpoint(event, await route.endpoint(), state); } else if (route.page) { - if (page_methods.has(method)) { - response = await render_page(event, route.page, options, manifest, state, resolve_opts); + if (!page_nodes) { + throw new Error('page_nodes not found. This should never happen'); + } else if (page_methods.has(method)) { + response = await render_page( + event, + route.page, + options, + manifest, + state, + page_nodes, + resolve_opts + ); } else { const allowed_methods = new Set(allowed_page_methods); const node = await manifest._.nodes[route.page.leaf](); @@ -499,9 +509,8 @@ export async function respond(request, options, manifest, state) { } } } else { - // a route will always have a page or an endpoint, but TypeScript - // doesn't know that - throw new Error('This should never happen'); + // a route will always have a page or an endpoint, but TypeScript doesn't know that + throw new Error('Route is neither page nor endpoint. This should never happen'); } // If the route contains a page and an endpoint, we need to add a @@ -578,3 +587,15 @@ export async function respond(request, options, manifest, state) { } } } + +/** + * @param {import('types').PageNodeIndexes} page + * @param {import('@sveltejs/kit').SSRManifest} manifest + */ +export function load_page_nodes(page, manifest) { + return Promise.all([ + // we use == here rather than === because [undefined] serializes as "[null]" + ...page.layouts.map((n) => (n == undefined ? n : manifest._.nodes[n]())), + manifest._.nodes[page.leaf]() + ]); +} From da78f6c61b0d45be316970a246066a114845b461 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Wed, 5 Mar 2025 19:06:57 +0800 Subject: [PATCH 0973/1135] docs: add `@since` annotation for the `normalizeUrl` helper (#13541) * Update index.js * generate types --- packages/kit/src/exports/index.js | 1 + packages/kit/types/index.d.ts | 3 ++- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/kit/src/exports/index.js b/packages/kit/src/exports/index.js index 1b4b7aa373b0..4d2bb75223f3 100644 --- a/packages/kit/src/exports/index.js +++ b/packages/kit/src/exports/index.js @@ -229,6 +229,7 @@ export function isActionFailure(e) { * ``` * @param {URL | string} url * @returns {{ url: URL, wasNormalized: boolean, denormalize: (url?: string | URL) => URL }} + * @since 2.18.0 */ export function normalizeUrl(url) { url = new URL(url, 'http://internal'); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index ff9e8c28affe..b0b8d6f1b1df 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2016,7 +2016,8 @@ declare module '@sveltejs/kit' { * console.log(url.pathname); // /blog/post * console.log(denormalize('/blog/post/a')); // /blog/post/a/__data.json * ``` - * */ + * @since 2.18.0 + */ export function normalizeUrl(url: URL | string): { url: URL; wasNormalized: boolean; From 3fdb664e860da4a58c9b59667102a37ce65b6bd6 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 5 Mar 2025 07:44:39 -0800 Subject: [PATCH 0974/1135] chore: fix types for universal and server fields (#13542) --- .../kit/src/runtime/server/page/actions.js | 2 +- packages/kit/src/types/internal.d.ts | 44 ++++++++++--------- packages/kit/src/utils/options.js | 2 +- packages/kit/types/index.d.ts | 44 ++++++++++--------- 4 files changed, 48 insertions(+), 44 deletions(-) diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index 6fd2cea38f40..80879e62e952 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -214,7 +214,7 @@ function check_named_default_separate(actions) { /** * @param {import('@sveltejs/kit').RequestEvent} event - * @param {NonNullable} actions + * @param {NonNullable} actions * @throws {Redirect | HttpError | SvelteKitError | Error} */ async function call_action(event, actions) { diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 1793476eace7..de065a656aa1 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -364,6 +364,27 @@ export interface SSRComponent { export type SSRComponentLoader = () => Promise; +export interface UniversalNode { + load?: Load; + prerender?: PrerenderOption; + ssr?: boolean; + csr?: boolean; + trailingSlash?: TrailingSlash; + config?: any; + entries?: PrerenderEntryGenerator; +} + +export interface ServerNode { + load?: ServerLoad; + prerender?: PrerenderOption; + ssr?: boolean; + csr?: boolean; + trailingSlash?: TrailingSlash; + actions?: Actions; + config?: any; + entries?: PrerenderEntryGenerator; +} + export interface SSRNode { component: SSRComponentLoader; /** index into the `nodes` array in the generated `client/app.js`. */ @@ -377,29 +398,10 @@ export interface SSRNode { /** inlined styles. */ inline_styles?(): MaybePromise>; - universal: { - load?: Load; - prerender?: PrerenderOption; - ssr?: boolean; - csr?: boolean; - trailingSlash?: TrailingSlash; - config?: any; - entries?: PrerenderEntryGenerator; - }; - - server: { - load?: ServerLoad; - prerender?: PrerenderOption; - ssr?: boolean; - csr?: boolean; - trailingSlash?: TrailingSlash; - actions?: Actions; - config?: any; - entries?: PrerenderEntryGenerator; - }; - universal_id?: string; server_id?: string; + universal?: UniversalNode; + server?: ServerNode; } export type SSRNodeLoader = () => Promise; diff --git a/packages/kit/src/utils/options.js b/packages/kit/src/utils/options.js index 46a32535128c..e224217103af 100644 --- a/packages/kit/src/utils/options.js +++ b/packages/kit/src/utils/options.js @@ -1,6 +1,6 @@ /** * @template {'prerender' | 'ssr' | 'csr' | 'trailingSlash' | 'entries'} Option - * @template {(import('types').SSRNode['universal'] | import('types').SSRNode['server'])[Option]} Value + * @template {(import('types').UniversalNode | import('types').ServerNode)[Option]} Value * * @param {Array} nodes * @param {Option} option diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index b0b8d6f1b1df..dffe47eda9aa 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1842,6 +1842,27 @@ declare module '@sveltejs/kit' { type SSRComponentLoader = () => Promise; + interface UniversalNode { + load?: Load; + prerender?: PrerenderOption; + ssr?: boolean; + csr?: boolean; + trailingSlash?: TrailingSlash; + config?: any; + entries?: PrerenderEntryGenerator; + } + + interface ServerNode { + load?: ServerLoad; + prerender?: PrerenderOption; + ssr?: boolean; + csr?: boolean; + trailingSlash?: TrailingSlash; + actions?: Actions; + config?: any; + entries?: PrerenderEntryGenerator; + } + interface SSRNode { component: SSRComponentLoader; /** index into the `nodes` array in the generated `client/app.js`. */ @@ -1855,29 +1876,10 @@ declare module '@sveltejs/kit' { /** inlined styles. */ inline_styles?(): MaybePromise>; - universal: { - load?: Load; - prerender?: PrerenderOption; - ssr?: boolean; - csr?: boolean; - trailingSlash?: TrailingSlash; - config?: any; - entries?: PrerenderEntryGenerator; - }; - - server: { - load?: ServerLoad; - prerender?: PrerenderOption; - ssr?: boolean; - csr?: boolean; - trailingSlash?: TrailingSlash; - actions?: Actions; - config?: any; - entries?: PrerenderEntryGenerator; - }; - universal_id?: string; server_id?: string; + universal?: UniversalNode; + server?: ServerNode; } type SSRNodeLoader = () => Promise; From 75efd882e09ba7a1bd7f617de99b4b1a802c27c9 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 5 Mar 2025 13:03:22 -0800 Subject: [PATCH 0975/1135] chore: fix type and add docs (#13545) --- packages/kit/src/runtime/server/page/render.js | 15 +++++++++------ packages/kit/src/types/internal.d.ts | 14 +++++++++++--- packages/kit/types/index.d.ts | 10 +++++++--- 3 files changed, 27 insertions(+), 12 deletions(-) diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index ae8ca1bb5e0b..59d9229164dc 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -116,11 +116,6 @@ export async function render_response({ } if (page_config.ssr) { - if (__SVELTEKIT_DEV__ && !branch.at(-1)?.node.component) { - // Can only be the leaf, layouts have a fallback component generated - throw new Error(`Missing +page.svelte component for route ${event.route.id}`); - } - /** @type {Record} */ const props = { stores: { @@ -128,7 +123,15 @@ export async function render_response({ navigating: writable(null), updated }, - constructors: await Promise.all(branch.map(({ node }) => node.component())), + constructors: await Promise.all( + branch.map(({ node }) => { + if (!node.component) { + // Can only be the leaf, layouts have a fallback component generated + throw new Error(`Missing +page.svelte component for route ${event.route.id}`); + } + return node.component(); + }) + ), form: form_value }; diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index de065a656aa1..82317e8417ab 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -386,7 +386,6 @@ export interface ServerNode { } export interface SSRNode { - component: SSRComponentLoader; /** index into the `nodes` array in the generated `client/app.js`. */ index: number; /** external JS files that are loaded on the client. `imports[0]` is the entry point (e.g. `client/nodes/0.js`) */ @@ -395,12 +394,17 @@ export interface SSRNode { stylesheets: string[]; /** external font files that are loaded on the client */ fonts: string[]; - /** inlined styles. */ - inline_styles?(): MaybePromise>; universal_id?: string; server_id?: string; + + /** inlined styles. */ + inline_styles?(): MaybePromise>; + /** Svelte component */ + component?: SSRComponentLoader; + /** +page.js or +layout.js */ universal?: UniversalNode; + /** +page.server.js, +layout.server.js, or +server.js */ server?: ServerNode; } @@ -484,6 +488,10 @@ export interface SSRState { */ prerender_default?: PrerenderOption; read?: (file: string) => Buffer; + /** + * Used to setup `__SVELTEKIT_TRACK__` which checks if a used feature is supported. + * E.g. if `read` from `$app/server` is used, it checks whether the route's config is compatible. + */ before_handle?: (event: RequestEvent, config: any, prerender: PrerenderOption) => void; emulator?: Emulator; } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index dffe47eda9aa..c8d91a4e2718 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1864,7 +1864,6 @@ declare module '@sveltejs/kit' { } interface SSRNode { - component: SSRComponentLoader; /** index into the `nodes` array in the generated `client/app.js`. */ index: number; /** external JS files that are loaded on the client. `imports[0]` is the entry point (e.g. `client/nodes/0.js`) */ @@ -1873,12 +1872,17 @@ declare module '@sveltejs/kit' { stylesheets: string[]; /** external font files that are loaded on the client */ fonts: string[]; - /** inlined styles. */ - inline_styles?(): MaybePromise>; universal_id?: string; server_id?: string; + + /** inlined styles. */ + inline_styles?(): MaybePromise>; + /** Svelte component */ + component?: SSRComponentLoader; + /** +page.js or +layout.js */ universal?: UniversalNode; + /** +page.server.js, +layout.server.js, or +server.js */ server?: ServerNode; } From 729aa7d454fbc4a3f9938c082fd0102518f07471 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 6 Mar 2025 00:58:24 -0800 Subject: [PATCH 0976/1135] chore: centralize page node logic into a class (#13550) --- packages/kit/src/core/postbuild/analyse.js | 26 ++--- packages/kit/src/runtime/server/page/index.js | 34 +++---- .../runtime/server/page/respond_with_error.js | 7 +- packages/kit/src/runtime/server/respond.js | 60 ++++-------- packages/kit/src/utils/options.js | 16 ---- packages/kit/src/utils/page_nodes.js | 95 +++++++++++++++++++ packages/kit/src/utils/route_config.js | 21 ---- 7 files changed, 137 insertions(+), 122 deletions(-) delete mode 100644 packages/kit/src/utils/options.js create mode 100644 packages/kit/src/utils/page_nodes.js delete mode 100644 packages/kit/src/utils/route_config.js diff --git a/packages/kit/src/core/postbuild/analyse.js b/packages/kit/src/core/postbuild/analyse.js index 2484aea4831d..25bd403f1eb8 100644 --- a/packages/kit/src/core/postbuild/analyse.js +++ b/packages/kit/src/core/postbuild/analyse.js @@ -1,22 +1,15 @@ import { join } from 'node:path'; import { pathToFileURL } from 'node:url'; -import { get_option } from '../../utils/options.js'; -import { - validate_layout_exports, - validate_layout_server_exports, - validate_page_exports, - validate_page_server_exports, - validate_server_exports -} from '../../utils/exports.js'; +import { validate_server_exports } from '../../utils/exports.js'; import { load_config } from '../config/index.js'; import { forked } from '../../utils/fork.js'; import { installPolyfills } from '../../exports/node/polyfills.js'; import { ENDPOINT_METHODS } from '../../constants.js'; import { filter_private_env, filter_public_env } from '../../utils/env.js'; import { has_server_load, resolve_route } from '../../utils/routing.js'; -import { get_page_config } from '../../utils/route_config.js'; import { check_feature } from '../../utils/features.js'; import { createReadableStream } from '@sveltejs/kit/node'; +import { PageNodes } from '../../utils/page_nodes.js'; export default forked(import.meta.url, analyse); @@ -190,25 +183,18 @@ function analyse_endpoint(route, mod) { * @param {import('types').SSRNode} leaf */ function analyse_page(layouts, leaf) { - for (const layout of layouts) { - if (layout) { - validate_layout_server_exports(layout.server, layout.server_id); - validate_layout_exports(layout.universal, layout.universal_id); - } - } - /** @type {Array<'GET' | 'POST'>} */ const methods = ['GET']; if (leaf.server?.actions) methods.push('POST'); - validate_page_server_exports(leaf.server, leaf.server_id); - validate_page_exports(leaf.universal, leaf.universal_id); + const nodes = new PageNodes([...layouts, leaf]); + nodes.validate(); return { - config: get_page_config([...layouts, leaf]), + config: nodes.get_config(), entries: leaf.universal?.entries ?? leaf.server?.entries, methods, - prerender: get_option([...layouts, leaf], 'prerender') ?? false + prerender: nodes.prerender() }; } diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 116c8f99b1fb..01337e4cac1c 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -13,7 +13,6 @@ import { import { load_data, load_server_data } from './load_data.js'; import { render_response } from './render.js'; import { respond_with_error } from './respond_with_error.js'; -import { get_option } from '../../../utils/options.js'; import { get_data_json } from '../data/index.js'; import { DEV } from 'esm-env'; @@ -28,7 +27,7 @@ const MAX_DEPTH = 10; * @param {import('types').SSROptions} options * @param {import('@sveltejs/kit').SSRManifest} manifest * @param {import('types').SSRState} state - * @param {Array} nodes + * @param {import('../../../utils/page_nodes.js').PageNodes} nodes * @param {import('types').RequiredResolveOptions} resolve_opts * @returns {Promise} */ @@ -46,7 +45,7 @@ export async function render_page(event, page, options, manifest, state, nodes, } try { - const leaf_node = /** @type {import('types').SSRNode} */ (nodes.at(-1)); + const leaf_node = /** @type {import('types').SSRNode} */ (nodes.page()); let status = 200; @@ -68,16 +67,10 @@ export async function render_page(event, page, options, manifest, state, nodes, } } - const should_prerender_data = nodes.some( - // prerender in case of trailingSlash because the client retrieves that value from the server - (node) => node?.server?.load || node?.server?.trailingSlash !== undefined - ); - const data_pathname = add_data_suffix(event.url.pathname); - // it's crucial that we do this before returning the non-SSR response, otherwise // SvelteKit will erroneously believe that the path has been prerendered, // causing functions to be omitted from the manifest generated later - const should_prerender = get_option(nodes, 'prerender') ?? false; + const should_prerender = nodes.prerender(); if (should_prerender) { const mod = leaf_node.server; if (mod?.actions) { @@ -94,13 +87,16 @@ export async function render_page(event, page, options, manifest, state, nodes, // inherit the prerender option of the page state.prerender_default = should_prerender; + const should_prerender_data = nodes.should_prerender_data(); + const data_pathname = add_data_suffix(event.url.pathname); + /** @type {import('./types.js').Fetched[]} */ const fetched = []; // renders an empty 'shell' page if SSR is turned off and if there is // no server data to prerender. As a result, the load functions and rendering // only occur client-side. - if (get_option(nodes, 'ssr') === false && !(state.prerendering && should_prerender_data)) { + if (nodes.ssr() === false && !(state.prerendering && should_prerender_data)) { // if the user makes a request through a non-enhanced form, the returned value is lost // because there is no SSR or client-side handling of the response if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) { @@ -121,7 +117,7 @@ export async function render_page(event, page, options, manifest, state, nodes, fetched, page_config: { ssr: false, - csr: get_option(nodes, 'csr') ?? true + csr: nodes.csr() }, status, error: null, @@ -140,7 +136,7 @@ export async function render_page(event, page, options, manifest, state, nodes, let load_error = null; /** @type {Array>} */ - const server_promises = nodes.map((node, i) => { + const server_promises = nodes.data.map((node, i) => { if (load_error) { // if an error happens immediately, don't bother with the rest of the nodes throw load_error; @@ -175,10 +171,10 @@ export async function render_page(event, page, options, manifest, state, nodes, }); }); - const csr = get_option(nodes, 'csr') ?? true; + const csr = nodes.csr(); /** @type {Array | null>>} */ - const load_promises = nodes.map((node, i) => { + const load_promises = nodes.data.map((node, i) => { if (load_error) throw load_error; return Promise.resolve().then(async () => { try { @@ -209,8 +205,8 @@ export async function render_page(event, page, options, manifest, state, nodes, for (const p of server_promises) p.catch(() => {}); for (const p of load_promises) p.catch(() => {}); - for (let i = 0; i < nodes.length; i += 1) { - const node = nodes[i]; + for (let i = 0; i < nodes.data.length; i += 1) { + const node = nodes.data[i]; if (node) { try { @@ -298,7 +294,7 @@ export async function render_page(event, page, options, manifest, state, nodes, }); } - const ssr = get_option(nodes, 'ssr') ?? true; + const ssr = nodes.ssr(); return await render_response({ event, @@ -307,7 +303,7 @@ export async function render_page(event, page, options, manifest, state, nodes, state, resolve_opts, page_config: { - csr: get_option(nodes, 'csr') ?? true, + csr: nodes.csr(), ssr }, status, diff --git a/packages/kit/src/runtime/server/page/respond_with_error.js b/packages/kit/src/runtime/server/page/respond_with_error.js index 10bf3fe0d324..f29e91329183 100644 --- a/packages/kit/src/runtime/server/page/respond_with_error.js +++ b/packages/kit/src/runtime/server/page/respond_with_error.js @@ -1,9 +1,9 @@ import { render_response } from './render.js'; import { load_data, load_server_data } from './load_data.js'; import { handle_error_and_jsonify, static_error_page, redirect_response } from '../utils.js'; -import { get_option } from '../../../utils/options.js'; import { Redirect } from '../../control.js'; import { get_status } from '../../../utils/error.js'; +import { PageNodes } from '../../../utils/page_nodes.js'; /** * @typedef {import('./types.js').Loaded} Loaded @@ -40,8 +40,9 @@ export async function respond_with_error({ try { const branch = []; const default_layout = await manifest._.nodes[0](); // 0 is always the root layout - const ssr = get_option([default_layout], 'ssr') ?? true; - const csr = get_option([default_layout], 'csr') ?? true; + const nodes = new PageNodes([default_layout]); + const ssr = nodes.ssr(); + const csr = nodes.csr(); if (ssr) { state.error = true; diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 816229d32bd6..fc7e8ccb8fce 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -11,20 +11,13 @@ import { exec } from '../../utils/routing.js'; import { redirect_json_response, render_data } from './data/index.js'; import { add_cookies_to_headers, get_cookies } from './cookie.js'; import { create_fetch } from './fetch.js'; +import { PageNodes } from '../../utils/page_nodes.js'; import { HttpError, Redirect, SvelteKitError } from '../control.js'; -import { - validate_layout_exports, - validate_layout_server_exports, - validate_page_exports, - validate_page_server_exports, - validate_server_exports -} from '../../utils/exports.js'; -import { get_option } from '../../utils/options.js'; +import { validate_server_exports } from '../../utils/exports.js'; import { json, text } from '../../exports/index.js'; import { action_json_redirect, is_action_json_request } from './page/actions.js'; import { INVALIDATED_PARAM, TRAILING_SLASH_PARAM } from '../shared.js'; import { get_public_env } from './env_module.js'; -import { get_page_config } from '../../utils/route_config.js'; import { resolve_route } from './page/server_routing.js'; import { validateHeaders } from './validate-headers.js'; import { @@ -172,8 +165,8 @@ export async function respond(request, options, manifest, state) { } } - /** @type {import('types').TrailingSlash | void} */ - let trailing_slash = undefined; + /** @type {import('types').TrailingSlash} */ + let trailing_slash = 'never'; /** @type {Record} */ const headers = {}; @@ -236,8 +229,10 @@ export async function respond(request, options, manifest, state) { }; try { - /** @type {Array | undefined} */ - const page_nodes = route?.page ? await load_page_nodes(route.page, manifest) : undefined; + /** @type {PageNodes|undefined} */ + const page_nodes = route?.page + ? new PageNodes(await load_page_nodes(route.page, manifest)) + : undefined; // determine whether we need to redirect to add/remove a trailing slash if (route) { @@ -247,40 +242,19 @@ export async function respond(request, options, manifest, state) { trailing_slash = 'always'; } else if (page_nodes) { if (DEV) { - const layouts = page_nodes.slice(0, -1); - const page = page_nodes.at(-1); - - for (const layout of layouts) { - if (layout) { - validate_layout_server_exports( - layout.server, - /** @type {string} */ (layout.server_id) - ); - validate_layout_exports( - layout.universal, - /** @type {string} */ (layout.universal_id) - ); - } - } - - if (page) { - validate_page_server_exports(page.server, /** @type {string} */ (page.server_id)); - validate_page_exports(page.universal, /** @type {string} */ (page.universal_id)); - } + page_nodes.validate(); } - - trailing_slash = get_option(page_nodes, 'trailingSlash'); + trailing_slash = page_nodes.trailing_slash(); } else if (route.endpoint) { const node = await route.endpoint(); - trailing_slash = node.trailingSlash; - + trailing_slash = node.trailingSlash ?? 'never'; if (DEV) { validate_server_exports(node, /** @type {string} */ (route.endpoint_id)); } } if (!is_data_request) { - const normalized = normalize_path(url.pathname, trailing_slash ?? 'never'); + const normalized = normalize_path(url.pathname, trailing_slash); if (normalized !== url.pathname && !state.prerendering?.fallback) { return new Response(undefined, { @@ -307,8 +281,8 @@ export async function respond(request, options, manifest, state) { config = node.config ?? config; prerender = node.prerender ?? prerender; } else if (page_nodes) { - config = get_page_config(page_nodes) ?? config; - prerender = get_option(page_nodes, 'prerender') ?? false; + config = page_nodes.get_config() ?? config; + prerender = page_nodes.prerender(); } if (state.before_handle) { @@ -329,7 +303,7 @@ export async function respond(request, options, manifest, state) { const { cookies, new_cookies, get_cookie_header, set_internal } = get_cookies( request, url, - trailing_slash ?? 'never' + trailing_slash ); cookies_to_add = new_cookies; @@ -425,7 +399,7 @@ export async function respond(request, options, manifest, state) { /** * @param {import('@sveltejs/kit').RequestEvent} event - * @param {Array | undefined} page_nodes + * @param {PageNodes | undefined} page_nodes * @param {import('@sveltejs/kit').ResolveOptions} [opts] */ async function resolve(event, page_nodes, opts) { @@ -467,7 +441,7 @@ export async function respond(request, options, manifest, state) { manifest, state, invalidated_data_nodes, - trailing_slash ?? 'never' + trailing_slash ); } else if (route.endpoint && (!route.page || is_endpoint_request(event))) { response = await render_endpoint(event, await route.endpoint(), state); diff --git a/packages/kit/src/utils/options.js b/packages/kit/src/utils/options.js deleted file mode 100644 index e224217103af..000000000000 --- a/packages/kit/src/utils/options.js +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @template {'prerender' | 'ssr' | 'csr' | 'trailingSlash' | 'entries'} Option - * @template {(import('types').UniversalNode | import('types').ServerNode)[Option]} Value - * - * @param {Array} nodes - * @param {Option} option - * - * @returns {Value | undefined} - */ -export function get_option(nodes, option) { - return nodes.reduce((value, node) => { - return /** @type {Value} TypeScript's too dumb to understand this */ ( - node?.universal?.[option] ?? node?.server?.[option] ?? value - ); - }, /** @type {Value | undefined} */ (undefined)); -} diff --git a/packages/kit/src/utils/page_nodes.js b/packages/kit/src/utils/page_nodes.js new file mode 100644 index 000000000000..f68f1aac0ac9 --- /dev/null +++ b/packages/kit/src/utils/page_nodes.js @@ -0,0 +1,95 @@ +import { + validate_layout_exports, + validate_layout_server_exports, + validate_page_exports, + validate_page_server_exports +} from './exports.js'; + +export class PageNodes { + data; + + /** + * @param {Array} nodes + */ + constructor(nodes) { + this.data = nodes; + } + + layouts() { + return this.data.slice(0, -1); + } + + page() { + return this.data.at(-1); + } + + validate() { + for (const layout of this.layouts()) { + if (layout) { + validate_layout_server_exports(layout.server, /** @type {string} */ (layout.server_id)); + validate_layout_exports(layout.universal, /** @type {string} */ (layout.universal_id)); + } + } + + const page = this.page(); + if (page) { + validate_page_server_exports(page.server, /** @type {string} */ (page.server_id)); + validate_page_exports(page.universal, /** @type {string} */ (page.universal_id)); + } + } + + /** + * @template {'prerender' | 'ssr' | 'csr' | 'trailingSlash' | 'entries'} Option + * @template {(import('types').UniversalNode | import('types').ServerNode)[Option]} Value + * @param {Option} option + * @returns {Value | undefined} + */ + #get_option(option) { + return this.data.reduce((value, node) => { + return /** @type {Value} TypeScript's too dumb to understand this */ ( + node?.universal?.[option] ?? node?.server?.[option] ?? value + ); + }, /** @type {Value | undefined} */ (undefined)); + } + + csr() { + return this.#get_option('csr') ?? true; + } + + ssr() { + return this.#get_option('ssr') ?? true; + } + + prerender() { + return this.#get_option('prerender') ?? false; + } + + trailing_slash() { + return this.#get_option('trailingSlash') ?? 'never'; + } + + get_config() { + /** @type {any} */ + let current = {}; + + for (const node of this.data) { + if (!node?.universal?.config && !node?.server?.config) continue; + + current = { + ...current, + ...node?.universal?.config, + ...node?.server?.config + }; + } + + // TODO 3.0 always return `current`? then we can get rid of `?? {}` in other places + return Object.keys(current).length ? current : undefined; + } + + should_prerender_data() { + return this.data.some( + // prerender in case of trailingSlash because the client retrieves that value from the server + (node) => node?.server?.load || node?.server?.trailingSlash !== undefined + ); + } +} diff --git a/packages/kit/src/utils/route_config.js b/packages/kit/src/utils/route_config.js deleted file mode 100644 index 27b67f71f765..000000000000 --- a/packages/kit/src/utils/route_config.js +++ /dev/null @@ -1,21 +0,0 @@ -/** - * Do a shallow merge (first level) of the config object - * @param {Array} nodes - */ -export function get_page_config(nodes) { - /** @type {any} */ - let current = {}; - - for (const node of nodes) { - if (!node?.universal?.config && !node?.server?.config) continue; - - current = { - ...current, - ...node?.universal?.config, - ...node?.server?.config - }; - } - - // TODO 3.0 always return `current`? then we can get rid of `?? {}` in other places - return Object.keys(current).length ? current : undefined; -} From 368d82766c9e80b3baf955a279fa7b80f1c90a08 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 6 Mar 2025 07:37:28 -0800 Subject: [PATCH 0977/1135] docs: add new project types page (#13444) Co-authored-by: Elliott Johnson Co-authored-by: Enrico Sacchetti Co-authored-by: Tee Ming --- .../10-getting-started/10-introduction.md | 2 +- .../10-getting-started/25-project-types.md | 69 +++++++++++++++++++ .../docs/30-advanced/40-service-workers.md | 6 +- documentation/docs/60-appendix/10-faq.md | 19 +---- documentation/docs/60-appendix/60-glossary.md | 20 +++++- 5 files changed, 94 insertions(+), 22 deletions(-) create mode 100644 documentation/docs/10-getting-started/25-project-types.md diff --git a/documentation/docs/10-getting-started/10-introduction.md b/documentation/docs/10-getting-started/10-introduction.md index a7f2dc3c9700..dd093ff5abea 100644 --- a/documentation/docs/10-getting-started/10-introduction.md +++ b/documentation/docs/10-getting-started/10-introduction.md @@ -12,7 +12,7 @@ title: Introduction SvelteKit is a framework for rapidly developing robust, performant web applications using [Svelte](../svelte). If you're coming from React, SvelteKit is similar to Next. If you're coming from Vue, SvelteKit is similar to Nuxt. -To learn more about the kinds of applications you can build with SvelteKit, see the [FAQ](faq#What-can-I-make-with-SvelteKit). +To learn more about the kinds of applications you can build with SvelteKit, see the [documentation regarding project types](project-types). ## What is Svelte? diff --git a/documentation/docs/10-getting-started/25-project-types.md b/documentation/docs/10-getting-started/25-project-types.md new file mode 100644 index 000000000000..730d064b47a1 --- /dev/null +++ b/documentation/docs/10-getting-started/25-project-types.md @@ -0,0 +1,69 @@ +--- +title: Project types +--- + +SvelteKit offers configurable rendering, which allows you to build and deploy your project in several different ways. You can build all of the below types of applications and more with SvelteKit. Rendering settings are not mutually exclusive and you may choose the optimal manner with which to render different parts of your application. + +If you don't have a particular way you'd like to build your application in mind, don't worry! The way your application is built, deployed, and rendered is controlled by which adapter you've chosen and a small amount of configuration and these can always be changed later. The [project structure](project-structure) and [routing](glossary#Routing) will be the same regardless of the project type that you choose. + +## Default rendering + +By default, when a user visits a site, SvelteKit will render the first page with [server-side rendering (SSR)](glossary#SSR) and subsequent pages with [client-side rendering (CSR)](glossary#CSR). Using SSR for the initial render improves SEO and perceived performance of the initial page load. Client-side rendering then takes over and updates the page without having to rerender common components, which is typically faster and eliminates a flash when navigating between pages. Apps built with this hybrid rendering approach have also been called [transitional apps](https://www.youtube.com/watch?v=860d8usGC0o). + +## Static site generation + +You can use SvelteKit as a [static site generator (SSG)](glossary#SSG) that fully [prerenders](glossary#Prerendering) your site with static rendering using [`adapter-static`](adapter-static). You may also use [the prerender option](page-options#prerender) to prerender only some pages and then choose a different adapter with which to dynamically server-render other pages. + +Tools built solely to do static site generation may scale the prerendering process more efficiently during build when rendering a very large number of pages. When working with very large statically generated sites, you can avoid long build times with [Incremental Static Regeneration (ISR) if using `adapter-vercel`](adapter-vercel#Incremental-Static-Regeneration). And in contrast to purpose-built SSGs, SvelteKit allows for nicely mixing and matching different rendering types on different pages. + +## Single-page app + +[Single-page apps (SPAs)](glossary#SPA) exclusively use [client-side rendering (CSR)](glossary#CSR). You can [build single-page apps (SPAs)](single-page-apps) with SvelteKit. As with all types of SvelteKit applications, you can write your backend in SvelteKit or [another language](#backend-in-another-language). If you are building an application with no backend or a [separate backend](#Separate-backend), you can simply skip over and ignore the parts of the docs talking about `server` files. + +## Multi-page app + +SvelteKit isn't typically used to build [traditional multi-page apps](glossary#MPA). However, in SvelteKit you can remove all JavaScript on a page with [`csr = false`](page-options#csr), which will render subsequent links on the server, or you can use [`data-sveltekit-reload`](link-options#data-sveltekit-reload) to render specific links on the server. + +## Separate backend + +If your backend is written in another language such as Go, Java, PHP, Ruby, Rust, or C#, there are a couple of ways that you can deploy your application. The most recommended way would be to deploy your SvelteKit frontend separately from your backend utilizing `adapter-node` or a serverless adapter. Some users prefer not to have a separate process to manage and decide to deploy their application as a [single-page app (SPA)](single-page-apps) served by their backend server, but note that single-page apps have worse SEO and performance characteristics. + +If you are using an external backend, you can simply skip over and ignore the parts of the docs talking about `server` files. You may also want to reference [the FAQ about how to make calls to a separate backend](faq#How-do-I-use-a-different-backend-API-server). + +## Serverless app + +SvelteKit apps are simple to run on serverless platforms. [The default zero config adapter](adapter-auto) will automatically run your app on a number of supported platforms or you can use [`adapter-vercel`](adapter-vercel), [`adapter-netlify`](adapter-netlify), or [`adapter-cloudflare`](adapter-cloudflare) to provide platform-specific configuration. And [community adapters](https://sveltesociety.dev/packages?category=sveltekit-adapters) allow you to deploy your application to almost any serverless environment. Some of these adapters such as [`adapter-vercel`](adapter-vercel) and [`adapter-netlify`](adapter-netlify) offer an `edge` option, to support [edge rendering](glossary#Edge) for improved latency. + +## Your own server + +You can deploy to your own server or VPS using [`adapter-node`](adapter-node). + +## Container + +You can use [`adapter-node`](adapter-node) to run a SvelteKit app within a container such as Docker or LXC. + +## Library + +You can create a library to be used by other Svelte apps with the [`@sveltejs/package`](packaging) add-on to SvelteKit by choosing the library option when running [`sv create`](/docs/cli/sv-create). + +## Offline app + +SvelteKit has full suppport for [service workers](service-workers) allowing you to build many types of applications such as offline apps and [progressive web apps](glossary#PWA). + +## Mobile app + +You can turn a [SvelteKit SPA](single-page-apps) into a mobile app with [Tauri](https://v2.tauri.app/start/frontend/sveltekit/) or [Capacitor](https://capacitorjs.com/solution/svelte). Mobile features like the camera, geolocation, and push notifications are available via plugins for both platforms. + +These mobile development platforms work by starting a local web server and then serving your application like a static host on your phone. You may find [`bundleStrategy: 'single'`](configuration#output) to be a helpful option to limit the number of requests made. E.g. at the time of writing, the Capacitor local server uses HTTP/1, which limits the number of concurrent connections. + +## Desktop app + +You can turn a [SvelteKit SPA](single-page-apps) into a desktop app with [Tauri](https://v2.tauri.app/start/frontend/sveltekit/), [Wails](https://wails.io/docs/guides/sveltekit/), or [Electron](https://www.electronjs.org/). + +## Browser extension + +You can build browser extensions using either [`adapter-static`](adapter-static) or [community adapters](https://sveltesociety.dev/packages?category=sveltekit-adapters) specifically tailored towards browser extensions. + +## Embedded device + +Because of its efficient rendering, Svelte can be run on low power devices. Embedded devices like microcontrollers and TVs may limit the number of concurrent connections. In order to reduce the number of concurrent requests, you may find [`bundleStrategy: 'single'`](configuration#output) to be a helpful option in this deployment configuration. diff --git a/documentation/docs/30-advanced/40-service-workers.md b/documentation/docs/30-advanced/40-service-workers.md index 7213f8d86d26..f57dba4abc7e 100644 --- a/documentation/docs/30-advanced/40-service-workers.md +++ b/documentation/docs/30-advanced/40-service-workers.md @@ -147,4 +147,8 @@ This disables access to DOM typings like `HTMLElement` which are not available i ## Other solutions -SvelteKit's service worker implementation is deliberately low-level. If you need a more full-fledged but also more opinionated solution, we recommend looking at solutions like [Vite PWA plugin](https://vite-pwa-org.netlify.app/frameworks/sveltekit.html), which uses [Workbox](https://web.dev/learn/pwa/workbox). For more general information on service workers, we recommend [the MDN web docs](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers). +SvelteKit's service worker implementation is designed to be easy to work with and is probably a good solution for most users. However, outside of SvelteKit, many PWA applications leverage the [Workbox](https://web.dev/learn/pwa/workbox) library. If you're used to using Workbox you may prefer [Vite PWA plugin](https://vite-pwa-org.netlify.app/frameworks/sveltekit.html). + +## References + +For more general information on service workers, we recommend [the MDN web docs](https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers). diff --git a/documentation/docs/60-appendix/10-faq.md b/documentation/docs/60-appendix/10-faq.md index 8b3a53154d1f..1044a99527ae 100644 --- a/documentation/docs/60-appendix/10-faq.md +++ b/documentation/docs/60-appendix/10-faq.md @@ -8,24 +8,7 @@ Please see [the Svelte FAQ](../svelte/faq) and [`vite-plugin-svelte` FAQ](https: ## What can I make with SvelteKit? -SvelteKit can be used to create most kinds of applications. Out of the box, SvelteKit supports many features including: - -- Dynamic page content with [load](load) functions and [API routes](routing#server). -- SEO-friendly dynamic content with [server-side rendering (SSR)](glossary#SSR). -- User-friendly progressively-enhanced interactive pages with SSR and [Form Actions](form-actions). -- Static pages with [prerendering](page-options#prerender). - -SvelteKit can also be deployed to a wide spectrum of hosted architectures via [adapters](adapters). In cases where SSR is used (or server-side logic is added without prerendering), those functions will be adapted to the target backend. Some examples include: - -- Self-hosted dynamic web applications with a [Node.js backend](adapter-node). -- Serverless web applications with backend loaders and APIs deployed as remote functions. See [zero-config deployments](adapter-auto) for popular deployment options. -- [Static pre-rendered sites](adapter-static) such as a blog or multi-page site hosted on a CDN or static host. Statically-generated sites are shipped without a backend. -- [Single-page Applications (SPAs)](single-page-apps) with client-side routing and rendering for API-driven dynamic content. SPAs are shipped without a backend and are not server-rendered. This option is commonly chosen when bundling SvelteKit with an app written in PHP, .Net, Java, C, Golang, Rust, etc. -- A mix of the above; some routes can be static, and some routes can use backend functions to fetch dynamic information. This can be configured with [page options](page-options) that includes the option to opt out of SSR. - -In order to support SSR, a JS backend — such as Node.js or Deno-based server, serverless function, or edge function — is required. - -It is also possible to write custom adapters or leverage community adapters to deploy SvelteKit to more platforms such as specialized server environments, browser extensions, or native applications. See [integrations](./integrations) for more examples and integrations. +See [the documentation regarding project types](project-types) for more details. ## How do I include details from package.json in my application? diff --git a/documentation/docs/60-appendix/60-glossary.md b/documentation/docs/60-appendix/60-glossary.md index 3a175ccb36e3..e071b2024b00 100644 --- a/documentation/docs/60-appendix/60-glossary.md +++ b/documentation/docs/60-appendix/60-glossary.md @@ -10,12 +10,24 @@ Client-side rendering (CSR) is the generation of the page contents in the web br In SvelteKit, client-side rendering will be used by default, but you can turn off JavaScript with [the `csr = false` page option](page-options#csr). +## Edge + +Rendering on the edge refers to rendering an application in a content delivery network (CDN) near the user. Edge rendering allows the request and response for a page to travel a shorter distance thus improving latency. + ## Hydration Svelte components store some state and update the DOM when the state is updated. When fetching data during SSR, by default SvelteKit will store this data and transmit it to the client along with the server-rendered HTML. The components can then be initialized on the client with that data without having to call the same API endpoints again. Svelte will then check that the DOM is in the expected state and attach event listeners in a process called hydration. Once the components are fully hydrated, they can react to changes to their properties just like any newly created Svelte component. In SvelteKit, pages will be hydrated by default, but you can turn off JavaScript with [the `csr = false` page option](page-options#csr). +## ISR + +Incremental static regeneration (ISR) allows you to generate static pages on your site as visitors request those pages without redeploying. This may reduces build times compared to [SSG](#SSG) sites with a large number of pages. You can do [ISR with `adapter-vercel`](adapter-vercel#Incremental-Static-Regeneration). + +## MPA + +Traditional applications that render each page view on the server — such as those written in languages other than JavaScript — are often referred to as multi-page apps (MPA). + ## Prerendering Prerendering means computing the contents of a page at build time and saving the HTML for display. This approach has the same benefits as traditional server-rendered pages, but avoids recomputing the page for each visitor and so scales nearly for free as the number of visitors increases. The tradeoff is that the build process is more expensive and prerendered content can only be updated by building and deploying a new version of the application. @@ -26,6 +38,10 @@ Pre-rendered pages are not limited to static content. You can build personalized In SvelteKit, you can control prerendering with [the `prerender` page option](page-options#prerender) and [`prerender` config](configuration#prerender) in `svelte.config.js`. +## PWA + +A progressive web app (PWA) is an app that's built using web APIs and technologies, but functions like a mobile or desktop app. Sites served as [PWAs can be installed](https://web.dev/learn/pwa/installation), allowing you to add a shortcut to the application on your launcher, home screen, or start menu. Many PWAs will utilize [service workers](service-workers) to build offline capabilities. + ## Routing By default, when you navigate to a new page (by clicking on a link or using the browser's forward or back buttons), SvelteKit will intercept the attempted navigation and handle it instead of allowing the browser to send a request to the server for the destination page. SvelteKit will then update the displayed contents on the client by rendering the component for the new page, which in turn can make calls to the necessary API endpoints. This process of updating the page on the client in response to attempted navigation is called client-side routing. @@ -34,13 +50,13 @@ In SvelteKit, client-side routing will be used by default, but you can skip it w ## SPA -A single-page app (SPA) is an application in which all requests to the server load a single HTML file which then does client-side rendering of the requested contents based on the requested URL. All navigation is handled on the client-side in a process called client-side routing with per-page contents being updated and common layout elements remaining largely unchanged. SPAs do not provide SSR, which has the shortcoming described above. However, some applications are not greatly impacted by these shortcomings such as a complex business application behind a login where SEO would not be important and it is known that users will be accessing the application from a consistent computing environment. +A single-page app (SPA) is an application in which all requests to the server load a single HTML file which then does client-side rendering of the requested contents based on the requested URL. All navigation is handled on the client-side in a process called client-side routing with per-page contents being updated and common layout elements remaining largely unchanged. SPAs do not provide SSR and thus have worse performance and SEO characteristics. However, some applications are not greatly impacted by these shortcomings such as a complex business application behind a login where SEO would not be important and it is known that users will be accessing the application from a consistent computing environment. In SvelteKit, you can [build an SPA with `adapter-static`](single-page-apps). ## SSG -Static Site Generation (SSG) is a term that refers to a site where every page is prerendered. SvelteKit was not built to do only static site generation like some tools and so may not scale as well to efficiently render a very large number of pages as tools built specifically for that purpose. However, in contrast to most purpose-built SSGs, SvelteKit does nicely allow for mixing and matching different rendering types on different pages. One benefit of fully prerendering a site is that you do not need to maintain or pay for servers to perform SSR. Once generated, the site can be served from CDNs, leading to great "time to first byte" performance. This delivery model is often referred to as JAMstack. +Static Site Generation (SSG) is a term that refers to a site where every page is prerendered. One benefit of fully prerendering a site is that you do not need to maintain or pay for servers to perform SSR. Once generated, the site can be served from CDNs, leading to great “time to first byte” performance. This delivery model is often referred to as JAMstack. In SvelteKit, you can do static site generation by using [`adapter-static`](adapter-static) or by configuring every page to be prerendered using [the `prerender` page option](page-options#prerender) or [`prerender` config](configuration#prerender) in `svelte.config.js`. From 07d4b47a28c04b78c5e24fef6d4bf7923083d778 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 6 Mar 2025 09:26:33 -0800 Subject: [PATCH 0978/1135] docs: fix link --- documentation/docs/10-getting-started/25-project-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/10-getting-started/25-project-types.md b/documentation/docs/10-getting-started/25-project-types.md index 730d064b47a1..2f85b2abdec8 100644 --- a/documentation/docs/10-getting-started/25-project-types.md +++ b/documentation/docs/10-getting-started/25-project-types.md @@ -18,7 +18,7 @@ Tools built solely to do static site generation may scale the prerendering proce ## Single-page app -[Single-page apps (SPAs)](glossary#SPA) exclusively use [client-side rendering (CSR)](glossary#CSR). You can [build single-page apps (SPAs)](single-page-apps) with SvelteKit. As with all types of SvelteKit applications, you can write your backend in SvelteKit or [another language](#backend-in-another-language). If you are building an application with no backend or a [separate backend](#Separate-backend), you can simply skip over and ignore the parts of the docs talking about `server` files. +[Single-page apps (SPAs)](glossary#SPA) exclusively use [client-side rendering (CSR)](glossary#CSR). You can [build single-page apps (SPAs)](single-page-apps) with SvelteKit. As with all types of SvelteKit applications, you can write your backend in SvelteKit or [another language or framework](#separate-backend). If you are building an application with no backend or a [separate backend](#Separate-backend), you can simply skip over and ignore the parts of the docs talking about `server` files. ## Multi-page app From a486d0fe0fe1cc164e8de9749551d1ac4d0824f5 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 6 Mar 2025 09:29:32 -0800 Subject: [PATCH 0979/1135] docs: fix capitalization --- documentation/docs/10-getting-started/25-project-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/10-getting-started/25-project-types.md b/documentation/docs/10-getting-started/25-project-types.md index 2f85b2abdec8..848c6af71d39 100644 --- a/documentation/docs/10-getting-started/25-project-types.md +++ b/documentation/docs/10-getting-started/25-project-types.md @@ -18,7 +18,7 @@ Tools built solely to do static site generation may scale the prerendering proce ## Single-page app -[Single-page apps (SPAs)](glossary#SPA) exclusively use [client-side rendering (CSR)](glossary#CSR). You can [build single-page apps (SPAs)](single-page-apps) with SvelteKit. As with all types of SvelteKit applications, you can write your backend in SvelteKit or [another language or framework](#separate-backend). If you are building an application with no backend or a [separate backend](#Separate-backend), you can simply skip over and ignore the parts of the docs talking about `server` files. +[Single-page apps (SPAs)](glossary#SPA) exclusively use [client-side rendering (CSR)](glossary#CSR). You can [build single-page apps (SPAs)](single-page-apps) with SvelteKit. As with all types of SvelteKit applications, you can write your backend in SvelteKit or [another language or framework](#Separate-backend). If you are building an application with no backend or a [separate backend](#Separate-backend), you can simply skip over and ignore the parts of the docs talking about `server` files. ## Multi-page app From d9ead2b1b2724ca1634cce7454bacb176025fc8a Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 6 Mar 2025 12:08:02 -0800 Subject: [PATCH 0980/1135] chore(deps): update pnpm to v10.6.0 (#13554) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 10571e95da91..4e02958c2d34 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.24.0" }, - "packageManager": "pnpm@10.5.2", + "packageManager": "pnpm@10.6.0", "engines": { "pnpm": ">=9.0.0" }, From adb5e25f93c6f57171f8a03882a63a5d4b5e8774 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 7 Mar 2025 19:06:42 +0100 Subject: [PATCH 0981/1135] chore: cache reroute results (#13548) Reroute is supposed to be idempotent, i.e. the same income (i.e. URL) should have always the same outcome. With the introduction of async reroute, a crucial advantage of preloading is now lost: Reroute is called on preload, then on the actual click reroute is called again. That means that if it is async and fetches from the backend, two fetches will be made, which means the actual navigation is slowed down by a few miliseconds. Therefore we introduce a cache which solves this problem. --- .changeset/thin-parents-pull.md | 5 +++ documentation/docs/30-advanced/20-hooks.md | 2 + packages/kit/src/runtime/client/client.js | 46 +++++++++++++++++----- 3 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 .changeset/thin-parents-pull.md diff --git a/.changeset/thin-parents-pull.md b/.changeset/thin-parents-pull.md new file mode 100644 index 000000000000..5a164c50e258 --- /dev/null +++ b/.changeset/thin-parents-pull.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +chore: cache reroute results diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index e68cc32a3e8e..75d9ed70da31 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -301,6 +301,8 @@ Using `reroute` will _not_ change the contents of the browser's address bar, or Since version 2.18, the `reroute` hook can be asynchronous, allowing it to (for example) fetch data from your backend to decide where to reroute to. Use this carefully and make sure it's fast, as it will delay navigation otherwise. +> [!NOTE] `reroute` is considered a pure, idempotent function. As such, it must always return the same output for the same input and not have side effects. Under these assumptions, SvelteKit caches the result of `reroute` on the client so it is only called once per unique URL. + ### transport This is a collection of _transporters_, which allow you to pass custom types — returned from `load` and form actions — across the server/client boundary. Each transporter contains an `encode` function, which encodes values on the server (or returns `false` for anything that isn't an instance of the type) and a corresponding `decode` function: diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 98984115f962..613ebed8e184 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -188,6 +188,17 @@ const components = []; /** @type {{id: string, token: {}, promise: Promise} | null} */ let load_cache = null; +/** + * @type {Map>} + * Cache for client-side rerouting, since it could contain async calls which we want to + * avoid running multiple times which would slow down navigations (e.g. else preloading + * wouldn't help because on navigation it would be called again). Since `reroute` should be + * a pure function (i.e. always return the same) value it's safe to cache across navigations. + * The server reroute calls don't need to be cached because they are called using `import(...)` + * which is cached per the JS spec. + */ +const reroute_cache = new Map(); + /** * Note on before_navigate_callbacks, on_navigate_callbacks and after_navigate_callbacks: * do not re-assign as some closures keep references to these Sets @@ -1201,23 +1212,38 @@ async function load_root_error_page({ status, error, url, route }) { * @returns {Promise} */ async function get_rerouted_url(url) { + const href = url.href; + + if (reroute_cache.has(href)) { + return reroute_cache.get(href); + } + let rerouted; + try { - // reroute could alter the given URL, so we pass a copy - rerouted = (await app.hooks.reroute({ url: new URL(url) })) ?? url; + const promise = (async () => { + // reroute could alter the given URL, so we pass a copy + let rerouted = (await app.hooks.reroute({ url: new URL(url) })) ?? url; - if (typeof rerouted === 'string') { - const tmp = new URL(url); // do not mutate the incoming URL + if (typeof rerouted === 'string') { + const tmp = new URL(url); // do not mutate the incoming URL - if (app.hash) { - tmp.hash = rerouted; - } else { - tmp.pathname = rerouted; + if (app.hash) { + tmp.hash = rerouted; + } else { + tmp.pathname = rerouted; + } + + rerouted = tmp; } - rerouted = tmp; - } + return rerouted; + })(); + + reroute_cache.set(href, promise); + rerouted = await promise; } catch (e) { + reroute_cache.delete(href); if (DEV) { // in development, print the error... console.error(e); From 78a794f682eafeb23a1b24d172d77f35a8d43141 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 7 Mar 2025 20:53:15 +0100 Subject: [PATCH 0982/1135] feat: provide `fetch` to `reroute` (#13549) This provides `fetch` as an argument to `reroute`, so that you can get the same benefits as the `fetch` provided to `load` functions from it. This is important (among other things) because else you might not be able to forward cookies on the server which influence where to go to. --- .changeset/thirty-days-wink.md | 5 + documentation/docs/30-advanced/20-hooks.md | 21 ++- packages/kit/src/exports/public.d.ts | 2 +- packages/kit/src/runtime/client/client.js | 53 ++++-- packages/kit/src/runtime/server/cookie.js | 27 ++- .../kit/src/runtime/server/cookie.spec.js | 4 +- packages/kit/src/runtime/server/respond.js | 164 +++++++++--------- packages/kit/test/apps/basics/src/hooks.js | 8 +- .../basics/src/routes/reroute/api/+server.ts | 5 + .../kit/test/apps/basics/test/client.test.js | 3 + .../kit/test/apps/basics/test/server.test.js | 3 + packages/kit/types/index.d.ts | 2 +- 12 files changed, 180 insertions(+), 117 deletions(-) create mode 100644 .changeset/thirty-days-wink.md create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/api/+server.ts diff --git a/.changeset/thirty-days-wink.md b/.changeset/thirty-days-wink.md new file mode 100644 index 000000000000..16bfb411eb40 --- /dev/null +++ b/.changeset/thirty-days-wink.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: provide `fetch` to `reroute` diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index 75d9ed70da31..849be6910b48 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -299,7 +299,26 @@ The `lang` parameter will be correctly derived from the returned pathname. Using `reroute` will _not_ change the contents of the browser's address bar, or the value of `event.url`. -Since version 2.18, the `reroute` hook can be asynchronous, allowing it to (for example) fetch data from your backend to decide where to reroute to. Use this carefully and make sure it's fast, as it will delay navigation otherwise. +Since version 2.18, the `reroute` hook can be asynchronous, allowing it to (for example) fetch data from your backend to decide where to reroute to. Use this carefully and make sure it's fast, as it will delay navigation otherwise. In case you fetch data, make sure to use the `fetch` provided to the `reroute` function. It has the [same benefits](load#Making-fetch-requests) as using the special `fetch` of `load` functions, with the caveat that `params` and `id` are unavailable to [`handleFetch`](#Server-hooks-handleFetch) because the route is not known yet. + +```js +/// file: src/hooks.js +// @errors: 2345 +// @errors: 2304 + +/** @type {import('@sveltejs/kit').Reroute} */ +export function reroute({ url, fetch }) { + // Ask a special endpoint within your app about the destination + if (url.pathname === '/api/reroute') return; + + const api = new URL('/api/reroute', url); + api.searchParams.set('pathname', url.pathname); + + const result = await fetch(api).then(r => r.json()); + return result.pathname; +} +``` + > [!NOTE] `reroute` is considered a pure, idempotent function. As such, it must always return the same output for the same input and not have side effects. Under these assumptions, SvelteKit caches the result of `reroute` on the client so it is only called once per unique URL. diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index d85264dd5b02..2ff29f3571a0 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -814,7 +814,7 @@ export type ClientInit = () => MaybePromise; * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ -export type Reroute = (event: { url: URL }) => MaybePromise; +export type Reroute = (event: { url: URL; fetch: typeof fetch }) => MaybePromise; /** * The [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook allows you to transport custom types across the server/client boundary. diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index 613ebed8e184..ecfb49b74da8 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -690,12 +690,7 @@ async function load_node({ loader, parent, url, params, route, server_data_node app.hash ), async fetch(resource, init) { - /** @type {URL | string} */ - let requested; - if (resource instanceof Request) { - requested = resource.url; - // we're not allowed to modify the received `Request` object, so in order // to fixup relative urls we create a new equivalent `init` object instead init = { @@ -720,25 +715,15 @@ async function load_node({ loader, parent, url, params, route, server_data_node signal: resource.signal, ...init }; - } else { - requested = resource; } - // we must fixup relative urls so they are resolved from the target page - const resolved = new URL(requested, url); + const { resolved, promise } = resolve_fetch_url(resource, init, url); + if (is_tracking) { depends(resolved.href); } - // match ssr serialized data url, which is important to find cached responses - if (resolved.origin === url.origin) { - requested = resolved.href.slice(url.origin.length); - } - - // prerendered pages may be served from any origin, so `initial_fetch` urls shouldn't be resolved - return started - ? subsequent_fetch(requested, resolved.href, init) - : initial_fetch(requested, init); + return promise; }, setHeaders: () => {}, // noop depends, @@ -793,6 +778,30 @@ async function load_node({ loader, parent, url, params, route, server_data_node }; } +/** + * @param {Request | string | URL} input + * @param {RequestInit | undefined} init + * @param {URL} url + */ +function resolve_fetch_url(input, init, url) { + let requested = input instanceof Request ? input.url : input; + + // we must fixup relative urls so they are resolved from the target page + const resolved = new URL(requested, url); + + // match ssr serialized data url, which is important to find cached responses + if (resolved.origin === url.origin) { + requested = resolved.href.slice(url.origin.length); + } + + // prerendered pages may be served from any origin, so `initial_fetch` urls shouldn't be resolved + const promise = started + ? subsequent_fetch(requested, resolved.href, init) + : initial_fetch(requested, init); + + return { resolved, promise }; +} + /** * @param {boolean} parent_changed * @param {boolean} route_changed @@ -1223,7 +1232,13 @@ async function get_rerouted_url(url) { try { const promise = (async () => { // reroute could alter the given URL, so we pass a copy - let rerouted = (await app.hooks.reroute({ url: new URL(url) })) ?? url; + let rerouted = + (await app.hooks.reroute({ + url: new URL(url), + fetch: async (input, init) => { + return resolve_fetch_url(input, init, url).promise; + } + })) ?? url; if (typeof rerouted === 'string') { const tmp = new URL(url); // do not mutate the incoming URL diff --git a/packages/kit/src/runtime/server/cookie.js b/packages/kit/src/runtime/server/cookie.js index b5bc4d29563b..2e683543a534 100644 --- a/packages/kit/src/runtime/server/cookie.js +++ b/packages/kit/src/runtime/server/cookie.js @@ -29,13 +29,13 @@ function validate_options(options) { /** * @param {Request} request * @param {URL} url - * @param {import('types').TrailingSlash} trailing_slash */ -export function get_cookies(request, url, trailing_slash) { +export function get_cookies(request, url) { const header = request.headers.get('cookie') ?? ''; const initial_cookies = parse(header, { decode: (value) => value }); - const normalized_url = normalize_path(url.pathname, trailing_slash); + /** @type {string | undefined} */ + let normalized_url; /** @type {Record} */ const new_cookies = {}; @@ -149,6 +149,9 @@ export function get_cookies(request, url, trailing_slash) { let path = options.path; if (!options.domain || options.domain === url.hostname) { + if (!normalized_url) { + throw new Error('Cannot serialize cookies until after the route is determined'); + } path = resolve(normalized_url, path); } @@ -190,12 +193,20 @@ export function get_cookies(request, url, trailing_slash) { .join('; '); } + /** @type {Array<() => void>} */ + const internal_queue = []; + /** * @param {string} name * @param {string} value * @param {import('./page/types.js').Cookie['options']} options */ function set_internal(name, value, options) { + if (!normalized_url) { + internal_queue.push(() => set_internal(name, value, options)); + return; + } + let path = options.path; if (!options.domain || options.domain === url.hostname) { @@ -220,7 +231,15 @@ export function get_cookies(request, url, trailing_slash) { } } - return { cookies, new_cookies, get_cookie_header, set_internal }; + /** + * @param {import('types').TrailingSlash} trailing_slash + */ + function set_trailing_slash(trailing_slash) { + normalized_url = normalize_path(url.pathname, trailing_slash); + internal_queue.forEach((fn) => fn()); + } + + return { cookies, new_cookies, get_cookie_header, set_internal, set_trailing_slash }; } /** diff --git a/packages/kit/src/runtime/server/cookie.spec.js b/packages/kit/src/runtime/server/cookie.spec.js index c8f04b1e9cdb..e8f2cb08e623 100644 --- a/packages/kit/src/runtime/server/cookie.spec.js +++ b/packages/kit/src/runtime/server/cookie.spec.js @@ -53,7 +53,9 @@ const cookies_setup = ({ href, headers } = {}) => { ...headers }) }); - return get_cookies(request, url, 'ignore'); + const result = get_cookies(request, url); + result.set_trailing_slash('ignore'); + return result; }; test('a cookie should not be present after it is deleted', () => { diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index fc7e8ccb8fce..08e142a3ce39 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -103,11 +103,82 @@ export async function respond(request, options, manifest, state) { url.searchParams.delete(INVALIDATED_PARAM); } + /** @type {Record} */ + const headers = {}; + + const { cookies, new_cookies, get_cookie_header, set_internal, set_trailing_slash } = get_cookies( + request, + url + ); + + /** @type {import('@sveltejs/kit').RequestEvent} */ + const event = { + cookies, + // @ts-expect-error `fetch` needs to be created after the `event` itself + fetch: null, + getClientAddress: + state.getClientAddress || + (() => { + throw new Error( + `${__SVELTEKIT_ADAPTER_NAME__} does not specify getClientAddress. Please raise an issue` + ); + }), + locals: {}, + params: {}, + platform: state.platform, + request, + route: { id: null }, + setHeaders: (new_headers) => { + if (__SVELTEKIT_DEV__) { + validateHeaders(new_headers); + } + + for (const key in new_headers) { + const lower = key.toLowerCase(); + const value = new_headers[key]; + + if (lower === 'set-cookie') { + throw new Error( + 'Use `event.cookies.set(name, value, options)` instead of `event.setHeaders` to set cookies' + ); + } else if (lower in headers) { + throw new Error(`"${key}" header is already set`); + } else { + headers[lower] = value; + + if (state.prerendering && lower === 'cache-control') { + state.prerendering.cache = /** @type {string} */ (value); + } + } + } + }, + url, + isDataRequest: is_data_request, + isSubRequest: state.depth > 0 + }; + + event.fetch = create_fetch({ + event, + options, + manifest, + state, + get_cookie_header, + set_internal + }); + + if (state.emulator?.platform) { + event.platform = await state.emulator.platform({ + config: {}, + prerender: !!state.prerendering?.fallback + }); + } + let resolved_path; try { // reroute could alter the given URL, so we pass a copy - resolved_path = (await options.hooks.reroute({ url: new URL(url) })) ?? url.pathname; + resolved_path = + (await options.hooks.reroute({ url: new URL(url), fetch: event.fetch })) ?? url.pathname; } catch { return text('Internal Server Error', { status: 500 @@ -123,9 +194,6 @@ export async function respond(request, options, manifest, state) { /** @type {import('types').SSRRoute | null} */ let route = null; - /** @type {Record} */ - let params = {}; - if (base && !state.prerendering?.fallback) { if (!resolved_path.startsWith(base)) { return text('Not found', { status: 404 }); @@ -159,68 +227,13 @@ export async function respond(request, options, manifest, state) { const matched = exec(match, candidate.params, matchers); if (matched) { route = candidate; - params = decode_params(matched); + event.route = { id: route.id }; + event.params = decode_params(matched); break; } } } - /** @type {import('types').TrailingSlash} */ - let trailing_slash = 'never'; - - /** @type {Record} */ - const headers = {}; - - /** @type {Record} */ - let cookies_to_add = {}; - - /** @type {import('@sveltejs/kit').RequestEvent} */ - const event = { - // @ts-expect-error `cookies` and `fetch` need to be created after the `event` itself - cookies: null, - // @ts-expect-error - fetch: null, - getClientAddress: - state.getClientAddress || - (() => { - throw new Error( - `${__SVELTEKIT_ADAPTER_NAME__} does not specify getClientAddress. Please raise an issue` - ); - }), - locals: {}, - params, - platform: state.platform, - request, - route: { id: route?.id ?? null }, - setHeaders: (new_headers) => { - if (__SVELTEKIT_DEV__) { - validateHeaders(new_headers); - } - - for (const key in new_headers) { - const lower = key.toLowerCase(); - const value = new_headers[key]; - - if (lower === 'set-cookie') { - throw new Error( - 'Use `event.cookies.set(name, value, options)` instead of `event.setHeaders` to set cookies' - ); - } else if (lower in headers) { - throw new Error(`"${key}" header is already set`); - } else { - headers[lower] = value; - - if (state.prerendering && lower === 'cache-control') { - state.prerendering.cache = /** @type {string} */ (value); - } - } - } - }, - url, - isDataRequest: is_data_request, - isSubRequest: state.depth > 0 - }; - /** @type {import('types').RequiredResolveOptions} */ let resolve_opts = { transformPageChunk: default_transform, @@ -228,6 +241,9 @@ export async function respond(request, options, manifest, state) { preload: default_preload }; + /** @type {import('types').TrailingSlash} */ + let trailing_slash = 'never'; + try { /** @type {PageNodes|undefined} */ const page_nodes = route?.page @@ -293,29 +309,9 @@ export async function respond(request, options, manifest, state) { event.platform = await state.emulator.platform({ config, prerender }); } } - } else if (state.emulator?.platform) { - event.platform = await state.emulator.platform({ - config: {}, - prerender: !!state.prerendering?.fallback - }); } - const { cookies, new_cookies, get_cookie_header, set_internal } = get_cookies( - request, - url, - trailing_slash - ); - - cookies_to_add = new_cookies; - event.cookies = cookies; - event.fetch = create_fetch({ - event, - options, - manifest, - state, - get_cookie_header, - set_internal - }); + set_trailing_slash(trailing_slash); if (state.prerendering && !state.prerendering.fallback) disable_search(url); @@ -330,7 +326,7 @@ export async function respond(request, options, manifest, state) { response.headers.set(key, /** @type {string} */ (value)); } - add_cookies_to_headers(response.headers, Object.values(cookies_to_add)); + add_cookies_to_headers(response.headers, Object.values(new_cookies)); if (state.prerendering && event.route.id !== null) { response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id)); @@ -391,7 +387,7 @@ export async function respond(request, options, manifest, state) { : route?.page && is_action_json_request(event) ? action_json_redirect(e) : redirect_response(e.status, e.location); - add_cookies_to_headers(response.headers, Object.values(cookies_to_add)); + add_cookies_to_headers(response.headers, Object.values(new_cookies)); return response; } return await handle_fatal_error(event, options, e); diff --git a/packages/kit/test/apps/basics/src/hooks.js b/packages/kit/test/apps/basics/src/hooks.js index 379788226c64..cedb23b063a2 100644 --- a/packages/kit/test/apps/basics/src/hooks.js +++ b/packages/kit/test/apps/basics/src/hooks.js @@ -9,7 +9,7 @@ const mapping = { }; /** @type {import("@sveltejs/kit").Reroute} */ -export const reroute = ({ url }) => { +export const reroute = ({ url, fetch }) => { //Try to rewrite the external url used in /reroute/external to the homepage - This should not work if (browser && url.href.startsWith('https://expired.badssl.com')) { return '/'; @@ -28,11 +28,7 @@ export const reroute = ({ url }) => { } if (url.pathname === '/reroute/async/a') { - return new Promise((resolve) => { - setTimeout(() => { - resolve('/reroute/async/b'); - }, 100); - }); + return fetch('/reroute/api').then((r) => r.text()); } if (url.pathname in mapping) { diff --git a/packages/kit/test/apps/basics/src/routes/reroute/api/+server.ts b/packages/kit/test/apps/basics/src/routes/reroute/api/+server.ts new file mode 100644 index 000000000000..5e7ccc706ea9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/api/+server.ts @@ -0,0 +1,5 @@ +import { text } from '@sveltejs/kit'; + +export function GET({ cookies }) { + return text(cookies.get('reroute-cookie') ? '/reroute/async/b' : '/reroute/async/a'); +} diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index be7d628a2e62..187dd289e043 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1451,6 +1451,9 @@ test.describe('reroute', () => { }); test('Apply async reroute during client side navigation', async ({ page }) => { + page + .context() + .addCookies([{ name: 'reroute-cookie', value: 'yes', path: '/', domain: 'localhost' }]); await page.goto('/reroute/async'); await page.click("a[href='/reroute/async/a']"); expect(await page.textContent('h1')).toContain( diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 7e13e9b3c624..bfe1b85b8e2b 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -674,6 +674,9 @@ test.describe('reroute', () => { }); test('Apply async reroute when directly accessing a page', async ({ page }) => { + page + .context() + .addCookies([{ name: 'reroute-cookie', value: 'yes', path: '/', domain: 'localhost' }]); await page.goto('/reroute/async/a'); expect(await page.textContent('h1')).toContain( 'Successfully rewritten, URL should still show a: /reroute/async/a' diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index c8d91a4e2718..af14891d66d3 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -796,7 +796,7 @@ declare module '@sveltejs/kit' { * The [`reroute`](https://svelte.dev/docs/kit/hooks#Universal-hooks-reroute) hook allows you to modify the URL before it is used to determine which route to render. * @since 2.3.0 */ - export type Reroute = (event: { url: URL }) => MaybePromise; + export type Reroute = (event: { url: URL; fetch: typeof fetch }) => MaybePromise; /** * The [`transport`](https://svelte.dev/docs/kit/hooks#Universal-hooks-transport) hook allows you to transport custom types across the server/client boundary. From d6f9beb825034ba239eed2d5e76fcb728fb8369f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 7 Mar 2025 20:59:38 +0100 Subject: [PATCH 0983/1135] Version Packages (#13558) Co-authored-by: github-actions[bot] --- .changeset/thin-parents-pull.md | 5 ----- .changeset/thirty-days-wink.md | 5 ----- packages/kit/CHANGELOG.md | 12 ++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 14 insertions(+), 12 deletions(-) delete mode 100644 .changeset/thin-parents-pull.md delete mode 100644 .changeset/thirty-days-wink.md diff --git a/.changeset/thin-parents-pull.md b/.changeset/thin-parents-pull.md deleted file mode 100644 index 5a164c50e258..000000000000 --- a/.changeset/thin-parents-pull.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -chore: cache reroute results diff --git a/.changeset/thirty-days-wink.md b/.changeset/thirty-days-wink.md deleted file mode 100644 index 16bfb411eb40..000000000000 --- a/.changeset/thirty-days-wink.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: provide `fetch` to `reroute` diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 2c33ae2c15ac..e173d686df32 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/kit +## 2.19.0 +### Minor Changes + + +- feat: provide `fetch` to `reroute` ([#13549](https://github.com/sveltejs/kit/pull/13549)) + + +### Patch Changes + + +- chore: cache reroute results ([#13548](https://github.com/sveltejs/kit/pull/13548)) + ## 2.18.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 793787a75a58..80763f3056c5 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.18.0", + "version": "2.19.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index d43569b34c31..1633de3b0a0d 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.18.0'; +export const VERSION = '2.19.0'; From 831545515231849fc5b7b97ec7ff26d660e11bc8 Mon Sep 17 00:00:00 2001 From: Hyunbin Seo <47051820+hyunbinseo@users.noreply.github.com> Date: Wed, 12 Mar 2025 11:24:49 +0900 Subject: [PATCH 0984/1135] docs: update `package.json` import (#13563) --- documentation/docs/60-appendix/10-faq.md | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/documentation/docs/60-appendix/10-faq.md b/documentation/docs/60-appendix/10-faq.md index 1044a99527ae..ab880e3fec2e 100644 --- a/documentation/docs/60-appendix/10-faq.md +++ b/documentation/docs/60-appendix/10-faq.md @@ -12,19 +12,11 @@ See [the documentation regarding project types](project-types) for more details. ## How do I include details from package.json in my application? -You cannot directly require JSON files, since SvelteKit expects [`svelte.config.js`](./configuration) to be an ES module. If you'd like to include your application's version number or other information from `package.json` in your application, you can load JSON like so: +If you'd like to include your application's version number or other information from `package.json` in your application, you can load JSON like so: ```js /// file: svelte.config.js -// @filename: index.js -/// -import { URL } from 'node:url'; -// ---cut--- -import { readFileSync } from 'node:fs'; -import { fileURLToPath } from 'node:url'; - -const path = fileURLToPath(new URL('package.json', import.meta.url)); -const pkg = JSON.parse(readFileSync(path, 'utf8')); +import pkg from './package.json' with { type: 'json' }; ``` ## How do I fix the error I'm getting trying to include a package? From 68599e96a27cce8a3b783fa7e09c11d48fec5ec8 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Thu, 13 Mar 2025 00:22:44 +0100 Subject: [PATCH 0985/1135] fix: allow reroute to point to prerendered route (#13575) When rerouting to a path that is a prerendered page, the runtime would previously return a 404, because said path does not point to a route in the manifest. This adds a check for this specifically to do a fetch to the prerendered page in that case. --- .changeset/nine-glasses-build.md | 5 +++ packages/kit/src/runtime/server/fetch.js | 6 +-- packages/kit/src/runtime/server/respond.js | 37 ++++++++++++++++++- packages/kit/src/runtime/server/utils.js | 12 ++++++ packages/kit/test/apps/basics/src/hooks.js | 4 ++ .../routes/reroute/prerendered/+page.svelte | 1 + .../prerendered/destination/+page.svelte | 1 + .../reroute/prerendered/destination/+page.ts | 1 + .../kit/test/apps/basics/test/client.test.js | 6 +++ .../kit/test/apps/basics/test/server.test.js | 5 +++ 10 files changed, 73 insertions(+), 5 deletions(-) create mode 100644 .changeset/nine-glasses-build.md create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/prerendered/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.ts diff --git a/.changeset/nine-glasses-build.md b/.changeset/nine-glasses-build.md new file mode 100644 index 000000000000..35ed0a016d31 --- /dev/null +++ b/.changeset/nine-glasses-build.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: allow reroute to point to prerendered route diff --git a/packages/kit/src/runtime/server/fetch.js b/packages/kit/src/runtime/server/fetch.js index 81bd5c665d8e..913cedaf9748 100644 --- a/packages/kit/src/runtime/server/fetch.js +++ b/packages/kit/src/runtime/server/fetch.js @@ -2,6 +2,7 @@ import * as set_cookie_parser from 'set-cookie-parser'; import { respond } from './respond.js'; import * as paths from '__sveltekit/paths'; import { read_implementation } from '__sveltekit/server'; +import { has_prerendered_path } from './utils.js'; /** * @param {{ @@ -112,10 +113,7 @@ export function create_fetch({ event, options, manifest, state, get_cookie_heade return await fetch(request); } - if ( - manifest._.prerendered_routes.has(decoded) || - (decoded.at(-1) === '/' && manifest._.prerendered_routes.has(decoded.slice(0, -1))) - ) { + if (has_prerendered_path(manifest, paths.base + decoded)) { // The path of something prerendered could match a different route // that is still in the manifest, leading to the wrong route being loaded. // We therefore bail early here. The prerendered logic is different for diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 08e142a3ce39..38ed27302b0d 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -5,7 +5,12 @@ import { render_page } from './page/index.js'; import { render_response } from './page/render.js'; import { respond_with_error } from './page/respond_with_error.js'; import { is_form_content_type } from '../../utils/http.js'; -import { handle_fatal_error, method_not_allowed, redirect_response } from './utils.js'; +import { + handle_fatal_error, + has_prerendered_path, + method_not_allowed, + redirect_response +} from './utils.js'; import { decode_pathname, decode_params, disable_search, normalize_path } from '../../utils/url.js'; import { exec } from '../../utils/routing.js'; import { redirect_json_response, render_data } from './data/index.js'; @@ -21,6 +26,8 @@ import { get_public_env } from './env_module.js'; import { resolve_route } from './page/server_routing.js'; import { validateHeaders } from './validate-headers.js'; import { + add_data_suffix, + add_resolution_suffix, has_data_suffix, has_resolution_suffix, strip_data_suffix, @@ -191,6 +198,34 @@ export async function respond(request, options, manifest, state) { return text('Malformed URI', { status: 400 }); } + if ( + resolved_path !== url.pathname && + !state.prerendering?.fallback && + has_prerendered_path(manifest, resolved_path) + ) { + const url = new URL(request.url); + url.pathname = is_data_request + ? add_data_suffix(resolved_path) + : is_route_resolution_request + ? add_resolution_suffix(resolved_path) + : resolved_path; + + // `fetch` automatically decodes the body, so we need to delete the related headers to not break the response + // Also see https://github.com/sveltejs/kit/issues/12197 for more info (we should fix this more generally at some point) + const response = await fetch(url, request); + const headers = new Headers(response.headers); + if (headers.has('content-encoding')) { + headers.delete('content-encoding'); + headers.delete('content-length'); + } + + return new Response(response.body, { + headers, + status: response.status, + statusText: response.statusText + }); + } + /** @type {import('types').SSRRoute | null} */ let route = null; diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index 473804cf9183..fe755ed3ddc0 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -163,3 +163,15 @@ export function stringify_uses(node) { return `"uses":{${uses.join(',')}}`; } + +/** + * Returns `true` if the given path was prerendered + * @param {import('@sveltejs/kit').SSRManifest} manifest + * @param {string} pathname Should include the base and be decoded + */ +export function has_prerendered_path(manifest, pathname) { + return ( + manifest._.prerendered_routes.has(pathname) || + (pathname.at(-1) === '/' && manifest._.prerendered_routes.has(pathname.slice(0, -1))) + ); +} diff --git a/packages/kit/test/apps/basics/src/hooks.js b/packages/kit/test/apps/basics/src/hooks.js index cedb23b063a2..89b90d39335d 100644 --- a/packages/kit/test/apps/basics/src/hooks.js +++ b/packages/kit/test/apps/basics/src/hooks.js @@ -31,6 +31,10 @@ export const reroute = ({ url, fetch }) => { return fetch('/reroute/api').then((r) => r.text()); } + if (url.pathname === '/reroute/prerendered/to-destination') { + return '/reroute/prerendered/destination'; + } + if (url.pathname in mapping) { return mapping[url.pathname]; } diff --git a/packages/kit/test/apps/basics/src/routes/reroute/prerendered/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/prerendered/+page.svelte new file mode 100644 index 000000000000..496da54480cd --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/prerendered/+page.svelte @@ -0,0 +1 @@ +to prerendered page diff --git a/packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.svelte new file mode 100644 index 000000000000..35b0eb9548f3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.svelte @@ -0,0 +1 @@ +

reroute that points to prerendered page works

diff --git a/packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.ts b/packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.ts new file mode 100644 index 000000000000..189f71e2e1b3 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/prerendered/destination/+page.ts @@ -0,0 +1 @@ +export const prerender = true; diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 187dd289e043..84683d43ebcd 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1461,6 +1461,12 @@ test.describe('reroute', () => { ); }); + test('Apply reroute to prerendered page during client side navigation', async ({ page }) => { + await page.goto('/reroute/prerendered'); + await page.click("a[href='/reroute/prerendered/to-destination']"); + expect(await page.textContent('h1')).toContain('reroute that points to prerendered page works'); + }); + test('Apply reroute after client-only redirects', async ({ page }) => { await page.goto('/reroute/client-only-redirect'); expect(await page.textContent('h1')).toContain('Successfully rewritten'); diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index bfe1b85b8e2b..0135b617ff94 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -683,6 +683,11 @@ test.describe('reroute', () => { ); }); + test('Apply reroute to prerendered page when directly accessing a page', async ({ page }) => { + await page.goto('/reroute/prerendered/to-destination'); + expect(await page.textContent('h1')).toContain('reroute that points to prerendered page works'); + }); + test('Returns a 500 response if reroute throws an error on the server', async ({ page }) => { const response = await page.goto('/reroute/error-handling/server-error'); expect(response?.status()).toBe(500); From ddc193ac1567975b31e3900d3e1b1b8fee1ad7aa Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 13 Mar 2025 15:07:05 -0700 Subject: [PATCH 0986/1135] docs: fix links to point to docs rather than source (#13544) --- documentation/docs/20-core-concepts/40-page-options.md | 2 +- documentation/docs/60-appendix/40-migrating.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/20-core-concepts/40-page-options.md b/documentation/docs/20-core-concepts/40-page-options.md index 204f9850a98e..5cc39027c358 100644 --- a/documentation/docs/20-core-concepts/40-page-options.md +++ b/documentation/docs/20-core-concepts/40-page-options.md @@ -31,7 +31,7 @@ Routes with `prerender = true` will be excluded from manifests used for dynamic export const prerender = 'auto'; ``` -> [!NOTE] If your entire app is suitable for prerendering, you can use [`adapter-static`](https://github.com/sveltejs/kit/tree/main/packages/adapter-static), which will output files suitable for use with any static webserver. +> [!NOTE] If your entire app is suitable for prerendering, you can use [`adapter-static`](adapter-static), which will output files suitable for use with any static webserver. The prerenderer will start at the root of your app and generate files for any prerenderable pages or `+server.js` routes it finds. Each page is scanned for `` elements that point to other pages that are candidates for prerendering — because of this, you generally don't need to specify which pages should be accessed. If you _do_ need to specify which pages should be accessed by the prerenderer, you can do so with [`config.kit.prerender.entries`](configuration#prerender), or by exporting an [`entries`](#entries) function from your dynamic route. diff --git a/documentation/docs/60-appendix/40-migrating.md b/documentation/docs/60-appendix/40-migrating.md index 2fbafe307a53..927d927832db 100644 --- a/documentation/docs/60-appendix/40-migrating.md +++ b/documentation/docs/60-appendix/40-migrating.md @@ -39,7 +39,7 @@ The bulk of your app, in `src/routes`, can be left where it is, but several proj Your `webpack.config.js` or `rollup.config.js` should be replaced with a `svelte.config.js`, as documented [here](configuration). Svelte preprocessor options should be moved to `config.preprocess`. -You will need to add an [adapter](adapters). `sapper build` is roughly equivalent to [adapter-node](https://github.com/sveltejs/kit/tree/main/packages/adapter-node) while `sapper export` is roughly equivalent to [adapter-static](https://github.com/sveltejs/kit/tree/main/packages/adapter-static), though you might prefer to use an adapter designed for the platform you're deploying to. +You will need to add an [adapter](adapters). `sapper build` is roughly equivalent to [adapter-node](adapter-node) while `sapper export` is roughly equivalent to [adapter-static](adapter-static), though you might prefer to use an adapter designed for the platform you're deploying to. If you were using plugins for filetypes that are not automatically handled by [Vite](https://vitejs.dev), you will need to find Vite equivalents and add them to the [Vite config](project-structure#Project-files-vite.config.js). From b18bff4472853a98b385beb9db957d90ea795988 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 09:17:01 -0700 Subject: [PATCH 0987/1135] chore(deps): update all non-major dependencies (#13557) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- packages/adapter-cloudflare-workers/package.json | 2 +- pnpm-lock.yaml | 12 ++++++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 4e02958c2d34..c26c82c09ec1 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.24.0" }, - "packageManager": "pnpm@10.6.0", + "packageManager": "pnpm@10.6.3", "engines": { "pnpm": ">=9.0.0" }, diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 1491e69c266e..90b2ea9b06b2 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -42,7 +42,7 @@ "esbuild": "^0.24.0" }, "devDependencies": { - "@cloudflare/kv-asset-handler": "^0.3.0", + "@cloudflare/kv-asset-handler": "^0.4.0", "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", "typescript": "^5.3.3" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f0301292918b..d576b8fea737 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -96,8 +96,8 @@ importers: version: 3.109.2(@cloudflare/workers-types@4.20241205.0) devDependencies: '@cloudflare/kv-asset-handler': - specifier: ^0.3.0 - version: 0.3.4 + specifier: ^0.4.0 + version: 0.4.0 '@sveltejs/kit': specifier: workspace:^ version: link:../kit @@ -1255,6 +1255,10 @@ packages: resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} engines: {node: '>=16.13'} + '@cloudflare/kv-asset-handler@0.4.0': + resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} + engines: {node: '>=18.0.0'} + '@cloudflare/workerd-darwin-64@1.20250214.0': resolution: {integrity: sha512-cDvvedWDc5zrgDnuXe2qYcz/TwBvzmweO55C7XpPuAWJ9Oqxv81PkdekYxD8mH989aQ/GI5YD0Fe6fDYlM+T3Q==} engines: {node: '>=16'} @@ -3834,6 +3838,10 @@ snapshots: dependencies: mime: 3.0.0 + '@cloudflare/kv-asset-handler@0.4.0': + dependencies: + mime: 3.0.0 + '@cloudflare/workerd-darwin-64@1.20250214.0': optional: true From edf7ca9711fa0f5eee986f3a030ca9c5ed1bd1c6 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sat, 15 Mar 2025 00:19:02 +0800 Subject: [PATCH 0988/1135] docs: add type to request handler (#13562) --- documentation/docs/20-core-concepts/10-routing.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 6fcbac8e583b..9c9f117419ee 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -363,10 +363,10 @@ export async function POST({ request }) { Exporting the `fallback` handler will match any unhandled request methods, including methods like `MOVE` which have no dedicated export from `+server.js`. ```js -// @errors: 7031 /// file: src/routes/api/add/+server.js import { json, text } from '@sveltejs/kit'; +/** @type {import('./$types').RequestHandler} */ export async function POST({ request }) { const { a, b } = await request.json(); return json(a + b); From 1b9daad9cf03e516c463b3bc60989acc3b988cf8 Mon Sep 17 00:00:00 2001 From: BD103 <59022059+BD103@users.noreply.github.com> Date: Fri, 14 Mar 2025 12:25:19 -0400 Subject: [PATCH 0989/1135] docs: fix faq link from jumping to database section (#13566) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- documentation/docs/60-appendix/20-integrations.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/60-appendix/20-integrations.md b/documentation/docs/60-appendix/20-integrations.md index 7f2fc1e08992..a4213c44da4a 100644 --- a/documentation/docs/60-appendix/20-integrations.md +++ b/documentation/docs/60-appendix/20-integrations.md @@ -49,4 +49,4 @@ Since SvelteKit projects are built with Vite, you can use Vite plugins to enhanc ## Integration FAQs -The SvelteKit FAQ has a [how to do X with SvelteKit](./faq#How-do-I-set-up-a-database), which may be helpful if you still have questions. +[The SvelteKit FAQ](./faq) answers many questions about how to do X with SvelteKit, which may be helpful if you still have questions. From 5de93c57e8fa123229d0ae6bf7effb96f246162f Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 14 Mar 2025 16:25:58 -0400 Subject: [PATCH 0990/1135] chore: fix 10-faq.md (#13584) --- documentation/docs/60-appendix/10-faq.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/documentation/docs/60-appendix/10-faq.md b/documentation/docs/60-appendix/10-faq.md index ab880e3fec2e..5b75f2cdba5f 100644 --- a/documentation/docs/60-appendix/10-faq.md +++ b/documentation/docs/60-appendix/10-faq.md @@ -14,7 +14,8 @@ See [the documentation regarding project types](project-types) for more details. If you'd like to include your application's version number or other information from `package.json` in your application, you can load JSON like so: -```js +```ts +// @errors: 2732 /// file: svelte.config.js import pkg from './package.json' with { type: 'json' }; ``` From 9ae6b5d3da7730f2136c5aee560dc3be29592c2d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 14 Mar 2025 17:04:40 -0400 Subject: [PATCH 0991/1135] tweak reroute docs (#13586) --- documentation/docs/30-advanced/20-hooks.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index 849be6910b48..c1adfdba1ffd 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -299,11 +299,11 @@ The `lang` parameter will be correctly derived from the returned pathname. Using `reroute` will _not_ change the contents of the browser's address bar, or the value of `event.url`. -Since version 2.18, the `reroute` hook can be asynchronous, allowing it to (for example) fetch data from your backend to decide where to reroute to. Use this carefully and make sure it's fast, as it will delay navigation otherwise. In case you fetch data, make sure to use the `fetch` provided to the `reroute` function. It has the [same benefits](load#Making-fetch-requests) as using the special `fetch` of `load` functions, with the caveat that `params` and `id` are unavailable to [`handleFetch`](#Server-hooks-handleFetch) because the route is not known yet. +Since version 2.18, the `reroute` hook can be asynchronous, allowing it to (for example) fetch data from your backend to decide where to reroute to. Use this carefully and make sure it's fast, as it will delay navigation otherwise. If you need to fetch data, use the `fetch` provided as an argument. It has the [same benefits](load#Making-fetch-requests) as the `fetch` provided to `load` functions, with the caveat that `params` and `id` are unavailable to [`handleFetch`](#Server-hooks-handleFetch) because the route is not yet known. ```js /// file: src/hooks.js -// @errors: 2345 +// @errors: 2345` // @errors: 2304 /** @type {import('@sveltejs/kit').Reroute} */ From 34fb71148146bd60c7f1f7525d473ac36776cebb Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 14 Mar 2025 17:12:19 -0400 Subject: [PATCH 0992/1135] Version Packages (#13576) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/nine-glasses-build.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/nine-glasses-build.md diff --git a/.changeset/nine-glasses-build.md b/.changeset/nine-glasses-build.md deleted file mode 100644 index 35ed0a016d31..000000000000 --- a/.changeset/nine-glasses-build.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: allow reroute to point to prerendered route diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index e173d686df32..c137c0407b14 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.19.1 +### Patch Changes + + +- fix: allow reroute to point to prerendered route ([#13575](https://github.com/sveltejs/kit/pull/13575)) + ## 2.19.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 80763f3056c5..9d9248869bfb 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.19.0", + "version": "2.19.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 1633de3b0a0d..b7ad47a77de2 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.19.0'; +export const VERSION = '2.19.1'; From 6e4f3b95f6758e2fec2672ce6e5f0a6682d4ba14 Mon Sep 17 00:00:00 2001 From: Scott Wu Date: Sat, 15 Mar 2025 05:18:17 +0800 Subject: [PATCH 0993/1135] docs: explain why route id can be null (#13581) * . * Revert "." This reverts commit be452eafe1abecf0c274f0926d098ced3435ecc9. * update public.d.ts --------- Co-authored-by: Rich Harris --- packages/kit/src/exports/public.d.ts | 13 +++++++++---- packages/kit/types/index.d.ts | 13 +++++++++---- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 2ff29f3571a0..5d41031b1613 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -990,7 +990,7 @@ export interface NavigationEvent< */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]` + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. */ id: RouteId; }; @@ -1012,7 +1012,12 @@ export interface NavigationTarget { /** * Info about the target route */ - route: { id: string | null }; + route: { + /** + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. + */ + id: string | null; + }; /** * The URL that is navigated to */ @@ -1129,7 +1134,7 @@ export interface Page< */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. */ id: RouteId; }; @@ -1205,7 +1210,7 @@ export interface RequestEvent< */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. */ id: RouteId; }; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index af14891d66d3..deed8779b9a9 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -972,7 +972,7 @@ declare module '@sveltejs/kit' { */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]` + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. */ id: RouteId; }; @@ -994,7 +994,12 @@ declare module '@sveltejs/kit' { /** * Info about the target route */ - route: { id: string | null }; + route: { + /** + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. + */ + id: string | null; + }; /** * The URL that is navigated to */ @@ -1111,7 +1116,7 @@ declare module '@sveltejs/kit' { */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. */ id: RouteId; }; @@ -1187,7 +1192,7 @@ declare module '@sveltejs/kit' { */ route: { /** - * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. + * The ID of the current route - e.g. for `src/routes/blog/[slug]`, it would be `/blog/[slug]`. It is `null` when no route is matched. */ id: RouteId; }; From e2babbb8898ea4479d8688f7b2e5a7cf349f7f76 Mon Sep 17 00:00:00 2001 From: Kotkoroid Date: Fri, 14 Mar 2025 22:54:39 +0100 Subject: [PATCH 0994/1135] docs: fix naming in 60-adapter-cloudflare.md (#13560) * docs: fix naming in 60-adapter-cloudflare.md * Update documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md --------- Co-authored-by: Rich Harris --- documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index e0f71c8dcdce..d603c4943b8a 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -4,7 +4,7 @@ title: Cloudflare Pages To deploy to [Cloudflare Pages](https://pages.cloudflare.com/), use [`adapter-cloudflare`](https://github.com/sveltejs/kit/tree/main/packages/adapter-cloudflare). -This adapter will be installed by default when you use [`adapter-auto`](adapter-auto). If you plan on staying with Cloudflare Pages, you can switch from [`adapter-auto`](adapter-auto) to using this adapter directly so that values specific to Cloudflare Workers are emulated during local development, type declarations are automatically applied, and the ability to set Cloudflare-specific options is provided. +This adapter will be installed by default when you use [`adapter-auto`](adapter-auto). If you plan on staying with Cloudflare Pages, you can switch from [`adapter-auto`](adapter-auto) to using this adapter directly so that `event.platform` is emulated during local development, type declarations are automatically applied, and the ability to set Cloudflare-specific options is provided. ## Comparisons From 001bc04dece9b0983efc2187225772c19d135345 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sat, 15 Mar 2025 06:03:31 +0800 Subject: [PATCH 0995/1135] fix: lazily load CSS for CSR dynamically imported components (#13564) fixes #13546 This PR changes server nodes from always loading dynamically imported component's styles and fonts to only loading them if they are used during SSR (to avoid FOUC). This fixes lazy loading of components on the client, only retrieving the styles when needed. We can tell which deps are used during SSR by analysing the deps of the node with both the server manifest and the client manifest, then comparing the results. If a style or font is missing from the server deps, it's probably only used on the client. Therefore, it should be safe to load lazily. --- .changeset/flat-cows-cough.md | 5 ++ .../src/exports/vite/build/build_server.js | 54 ++++++++++++++----- packages/kit/src/exports/vite/build/utils.js | 53 ++++++++++++++---- packages/kit/src/types/internal.d.ts | 1 + .../src/routes/css/dynamic/+page.svelte | 11 ++++ .../src/routes/css/dynamic/Dynamic.svelte | 7 +++ .../basics/test/cross-platform/client.test.js | 18 +++++++ 7 files changed, 127 insertions(+), 22 deletions(-) create mode 100644 .changeset/flat-cows-cough.md create mode 100644 packages/kit/test/apps/basics/src/routes/css/dynamic/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/css/dynamic/Dynamic.svelte diff --git a/.changeset/flat-cows-cough.md b/.changeset/flat-cows-cough.md new file mode 100644 index 000000000000..fe275cc38867 --- /dev/null +++ b/.changeset/flat-cows-cough.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: lazily load CSS for dynamically imported components diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index ca68244cc553..ca3eedc18cb3 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -1,6 +1,6 @@ import fs from 'node:fs'; import { mkdirp } from '../../../utils/filesystem.js'; -import { find_deps, resolve_symlinks } from './utils.js'; +import { filter_fonts, find_deps, resolve_symlinks } from './utils.js'; import { s } from '../../../utils/misc.js'; import { normalizePath } from 'vite'; import { basename } from 'node:path'; @@ -83,13 +83,13 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli const exports = [`export const index = ${i};`]; /** @type {string[]} */ - const imported = []; + let imported = []; /** @type {string[]} */ - const stylesheets = []; + let stylesheets = []; /** @type {string[]} */ - const fonts = []; + let fonts = []; if (node.component && client_manifest) { exports.push( @@ -119,15 +119,45 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli } if (client_manifest && (node.universal || node.component) && output_config.bundleStrategy === 'split') { - const entry = find_deps( - client_manifest, - `${normalizePath(kit.outDir)}/generated/client-optimized/nodes/${i}.js`, - true - ); + const entry_path = `${normalizePath(kit.outDir)}/generated/client-optimized/nodes/${i}.js`; + const entry = find_deps(client_manifest, entry_path, true); + + // eagerly load stylesheets and fonts imported by the SSR-ed page to avoid FOUC. + // If it is not used during SSR, it can be lazily loaded in the browser. + + /** @type {import('types').AssetDependencies | undefined} */ + let component; + if (node.component) { + component = find_deps(server_manifest, node.component, true); + } + + /** @type {import('types').AssetDependencies | undefined} */ + let universal; + if (node.universal) { + universal = find_deps(server_manifest, node.universal, true); + } + + /** @type {Set} */ + const css_used_by_server = new Set(); + /** @type {Set} */ + const assets_used_by_server = new Set(); + + entry.stylesheet_map.forEach((value, key) => { + // pages and layouts are named as node indexes in the client manifest + // so we need to use the original filename when checking against the server manifest + if (key === entry_path) { + key = node.component ?? key; + } + + if (component?.stylesheet_map.has(key) || universal?.stylesheet_map.has(key)) { + value.css.forEach(file => css_used_by_server.add(file)); + value.assets.forEach(file => assets_used_by_server.add(file)); + } + }); - imported.push(...entry.imports); - stylesheets.push(...entry.stylesheets); - fonts.push(...entry.fonts); + imported = entry.imports; + stylesheets = Array.from(css_used_by_server); + fonts = filter_fonts(Array.from(assets_used_by_server)); } exports.push( diff --git a/packages/kit/src/exports/vite/build/utils.js b/packages/kit/src/exports/vite/build/utils.js index f265747687a9..9bac4587d3d1 100644 --- a/packages/kit/src/exports/vite/build/utils.js +++ b/packages/kit/src/exports/vite/build/utils.js @@ -22,11 +22,16 @@ export function find_deps(manifest, entry, add_dynamic_css) { /** @type {Set} */ const imported_assets = new Set(); + /** @type {Map; assets: Set }>} */ + const stylesheet_map = new Map(); + /** * @param {string} current * @param {boolean} add_js + * @param {string} initial_importer + * @param {number} dynamic_import_depth */ - function traverse(current, add_js) { + function traverse(current, add_js, initial_importer, dynamic_import_depth) { if (seen.has(current)) return; seen.add(current); @@ -35,9 +40,7 @@ export function find_deps(manifest, entry, add_dynamic_css) { if (add_js) imports.add(chunk.file); if (chunk.assets) { - for (const asset of chunk.assets) { - imported_assets.add(asset); - } + chunk.assets.forEach(asset => imported_assets.add(asset)); } if (chunk.css) { @@ -45,17 +48,38 @@ export function find_deps(manifest, entry, add_dynamic_css) { } if (chunk.imports) { - chunk.imports.forEach((file) => traverse(file, add_js)); + chunk.imports.forEach((file) => traverse(file, add_js, initial_importer, dynamic_import_depth)); + } + + if (!add_dynamic_css) return; + + if ((chunk.css || chunk.assets) && dynamic_import_depth <= 1) { + // group files based on the initial importer because if a file is only ever + // a transitive dependency, it doesn't have a suitable name we can map back to + // the server manifest + if (stylesheet_map.has(initial_importer)) { + const { css, assets } = /** @type {{ css: Set; assets: Set }} */ (stylesheet_map.get(initial_importer)); + if (chunk.css) chunk.css.forEach((file) => css.add(file)); + if (chunk.assets) chunk.assets.forEach((file) => assets.add(file)); + } else { + stylesheet_map.set(initial_importer, { + css: new Set(chunk.css), + assets: new Set(chunk.assets) + }); + } } - if (add_dynamic_css && chunk.dynamicImports) { - chunk.dynamicImports.forEach((file) => traverse(file, false)); + if (chunk.dynamicImports) { + dynamic_import_depth++; + chunk.dynamicImports.forEach((file) => { + traverse(file, false, file, dynamic_import_depth); + }); } } const { chunk, file } = resolve_symlinks(manifest, entry); - traverse(file, true); + traverse(file, true, entry, 0); const assets = Array.from(imported_assets); @@ -65,7 +89,8 @@ export function find_deps(manifest, entry, add_dynamic_css) { imports: Array.from(imports), stylesheets: Array.from(stylesheets), // TODO do we need this separately? - fonts: assets.filter((asset) => /\.(woff2?|ttf|otf)$/.test(asset)) + fonts: filter_fonts(assets), + stylesheet_map }; } @@ -85,7 +110,15 @@ export function resolve_symlinks(manifest, file) { return { chunk, file }; } -const method_names = new Set(['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH', 'OPTIONS']); +/** + * @param {string[]} assets + * @returns {string[]} + */ +export function filter_fonts(assets) { + return assets.filter((asset) => /\.(woff2?|ttf|otf)$/.test(asset)); +} + +const method_names = new Set((['GET', 'HEAD', 'PUT', 'POST', 'DELETE', 'PATCH', 'OPTIONS'])); // If we'd written this in TypeScript, it could be easy... /** diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 82317e8417ab..6f6c04b3f416 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -59,6 +59,7 @@ export interface AssetDependencies { imports: string[]; stylesheets: string[]; fonts: string[]; + stylesheet_map: Map; assets: Set }>; } export interface BuildData { diff --git a/packages/kit/test/apps/basics/src/routes/css/dynamic/+page.svelte b/packages/kit/test/apps/basics/src/routes/css/dynamic/+page.svelte new file mode 100644 index 000000000000..694f9c43d390 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/css/dynamic/+page.svelte @@ -0,0 +1,11 @@ + + + + + diff --git a/packages/kit/test/apps/basics/src/routes/css/dynamic/Dynamic.svelte b/packages/kit/test/apps/basics/src/routes/css/dynamic/Dynamic.svelte new file mode 100644 index 000000000000..4f7b98b1bdba --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/css/dynamic/Dynamic.svelte @@ -0,0 +1,7 @@ +

I'm dynamically imported

+ + diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index c1de68907024..87c010a07f96 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -532,6 +532,24 @@ test.describe('CSS', () => { expect(await get_computed_style('#svelte-announcer', 'position')).toBe('absolute'); }); + + test('dynamically imported components lazily load CSS', async ({ page, get_computed_style }) => { + const requests = []; + page.on('request', (request) => { + const url = request.url(); + if (url.includes('Dynamic') && url.endsWith('.css')) { + requests.push(url); + } + }); + + await page.goto('/css/dynamic'); + expect(requests.length).toBe(0); + + await page.locator('button').click(); + await expect(page.locator('p')).toHaveText("I'm dynamically imported"); + expect(await get_computed_style('p', 'color')).toBe('rgb(0, 0, 255)'); + expect(requests.length).toBe(1); + }); }); test.describe.serial('Errors', () => { From 6c3d224a9613ee9859315adb2f3d2c3a5e70fc93 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 15 Mar 2025 10:26:51 -0700 Subject: [PATCH 0996/1135] feat: support wrangler 4 (#13580) * feat: support wrangler 4 * changeset * update peer range --------- Co-authored-by: Rich Harris --- .changeset/tame-weeks-punch.md | 6 + .../adapter-cloudflare-workers/package.json | 4 +- packages/adapter-cloudflare/package.json | 4 +- pnpm-lock.yaml | 625 ++++++------------ 4 files changed, 199 insertions(+), 440 deletions(-) create mode 100644 .changeset/tame-weeks-punch.md diff --git a/.changeset/tame-weeks-punch.md b/.changeset/tame-weeks-punch.md new file mode 100644 index 000000000000..c9893ddf32a1 --- /dev/null +++ b/.changeset/tame-weeks-punch.md @@ -0,0 +1,6 @@ +--- +'@sveltejs/adapter-cloudflare-workers': minor +'@sveltejs/adapter-cloudflare': minor +--- + +feat: support wrangler 4 diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 90b2ea9b06b2..86ace3237d62 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -38,7 +38,7 @@ "check": "tsc --skipLibCheck" }, "dependencies": { - "@cloudflare/workers-types": "^4.20231121.0", + "@cloudflare/workers-types": "^4.20250312.0", "esbuild": "^0.24.0" }, "devDependencies": { @@ -49,6 +49,6 @@ }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", - "wrangler": "^3.91.0" + "wrangler": "^3.91.0 || ^4.0.0" } } diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 235a6129ad36..c99ed49bbeb4 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -40,7 +40,7 @@ "prepublishOnly": "pnpm build" }, "dependencies": { - "@cloudflare/workers-types": "^4.20241106.0", + "@cloudflare/workers-types": "^4.20250312.0", "esbuild": "^0.24.0", "worktop": "0.8.0-next.18" }, @@ -52,6 +52,6 @@ }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", - "wrangler": "^3.87.0" + "wrangler": "^3.87.0 || ^4.0.0" } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index d576b8fea737..0bcec284423d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -58,8 +58,8 @@ importers: packages/adapter-cloudflare: dependencies: '@cloudflare/workers-types': - specifier: ^4.20241106.0 - version: 4.20241205.0 + specifier: ^4.20250312.0 + version: 4.20250312.0 esbuild: specifier: ^0.24.0 version: 0.24.2 @@ -67,8 +67,8 @@ importers: specifier: 0.8.0-next.18 version: 0.8.0-next.18 wrangler: - specifier: ^3.87.0 - version: 3.109.2(@cloudflare/workers-types@4.20241205.0) + specifier: ^3.87.0 || ^4.0.0 + version: 4.0.0(@cloudflare/workers-types@4.20250312.0) devDependencies: '@sveltejs/kit': specifier: workspace:^ @@ -86,14 +86,14 @@ importers: packages/adapter-cloudflare-workers: dependencies: '@cloudflare/workers-types': - specifier: ^4.20231121.0 - version: 4.20241205.0 + specifier: ^4.20250312.0 + version: 4.20250312.0 esbuild: specifier: ^0.24.0 version: 0.24.2 wrangler: - specifier: ^3.91.0 - version: 3.109.2(@cloudflare/workers-types@4.20241205.0) + specifier: ^3.91.0 || ^4.0.0 + version: 4.0.0(@cloudflare/workers-types@4.20250312.0) devDependencies: '@cloudflare/kv-asset-handler': specifier: ^0.4.0 @@ -1251,46 +1251,51 @@ packages: '@changesets/write@0.3.2': resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} - '@cloudflare/kv-asset-handler@0.3.4': - resolution: {integrity: sha512-YLPHc8yASwjNkmcDMQMY35yiWjoKAKnhUbPRszBRS0YgH+IXtsMp61j+yTcnCE3oO2DgP0U3iejLC8FTtKDC8Q==} - engines: {node: '>=16.13'} - '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@cloudflare/workerd-darwin-64@1.20250214.0': - resolution: {integrity: sha512-cDvvedWDc5zrgDnuXe2qYcz/TwBvzmweO55C7XpPuAWJ9Oqxv81PkdekYxD8mH989aQ/GI5YD0Fe6fDYlM+T3Q==} + '@cloudflare/unenv-preset@2.0.2': + resolution: {integrity: sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==} + peerDependencies: + unenv: 2.0.0-rc.14 + workerd: ^1.20250124.0 + peerDependenciesMeta: + workerd: + optional: true + + '@cloudflare/workerd-darwin-64@1.20250310.0': + resolution: {integrity: sha512-LkLJO6F8lRNaCbK5sQCITi66SyCirDpffRuI5/5iILDJWQU4KVvAOKPvHrd4E5h/WDm9FGd22zMJwky7SxaNjg==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250214.0': - resolution: {integrity: sha512-NytCvRveVzu0mRKo+tvZo3d/gCUway3B2ZVqSi/TS6NXDGBYIJo7g6s3BnTLS74kgyzeDOjhu9j/RBJBS809qw==} + '@cloudflare/workerd-darwin-arm64@1.20250310.0': + resolution: {integrity: sha512-WythDJQbsU3Ii1hhA7pJZLBQlHezeYWAnaMnv3gS2Exj45oF8G4chFvrO7zCzjlcJXwSeBTtQRJqxw9AiUDhyA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250214.0': - resolution: {integrity: sha512-pQ7+aHNHj8SiYEs4d/6cNoimE5xGeCMfgU1yfDFtA9YGN9Aj2BITZgOWPec+HW7ZkOy9oWlNrO6EvVjGgB4tbQ==} + '@cloudflare/workerd-linux-64@1.20250310.0': + resolution: {integrity: sha512-LbP769tT4/5QBHSj4lCt99QIKTi6cU+wYhLfF7rEtYHBnZS2+nIw9xttAzxeERx/aFrU+mxLcYPFV8fUeVxGng==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250214.0': - resolution: {integrity: sha512-Vhlfah6Yd9ny1npNQjNgElLIjR6OFdEbuR3LCfbLDCwzWEBFhIf7yC+Tpp/a0Hq7kLz3sLdktaP7xl3PJhyOjA==} + '@cloudflare/workerd-linux-arm64@1.20250310.0': + resolution: {integrity: sha512-FzWeKM6id20EMZACaDg0Kkvg1C4lvXZgLBXVI6h6xaXTNFReoyEp4v4eMrRTuja5ec5k+m5iGKjP4/bMWJp9ew==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250214.0': - resolution: {integrity: sha512-GMwMyFbkjBKjYJoKDhGX8nuL4Gqe3IbVnVWf2Q6086CValyIknupk5J6uQWGw2EBU3RGO3x4trDXT5WphQJZDQ==} + '@cloudflare/workerd-windows-64@1.20250310.0': + resolution: {integrity: sha512-04OgaDzm8/8nkjF3tovB+WywZLjSdAHCQT2omXKCwH3EDd1kpd8vvzE1pErtdIyKCOf9/sArY4BhPdxRj7ijlg==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20241205.0': - resolution: {integrity: sha512-pj1VKRHT/ScQbHOIMFODZaNAlJHQHdBSZXNIdr9ebJzwBff9Qz8VdqhbhggV7f+aUEh8WSbrsPIo4a+WtgjUvw==} + '@cloudflare/workers-types@4.20250312.0': + resolution: {integrity: sha512-LQBDkrXxm/L0FM4NoT8EXaKCA7+2roOAZAWg+31RGxLKcoAWWSQpbf0PFMBAyFIN/eNADu5RKKrt4qHWNsztHQ==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -1299,208 +1304,102 @@ packages: '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - '@esbuild-plugins/node-globals-polyfill@0.2.3': - resolution: {integrity: sha512-r3MIryXDeXDOZh7ih1l/yE9ZLORCd5e8vWg02azWRGj5SPTuoh69A2AIyn0Z31V/kHBfZ4HgWJ+OK3GTTwLmnw==} - peerDependencies: - esbuild: '*' - - '@esbuild-plugins/node-modules-polyfill@0.2.2': - resolution: {integrity: sha512-LXV7QsWJxRuMYvKbiznh+U1ilIop3g2TeKRzUxOG5X3YITc8JyyTa90BmLwqqv0YnX4v32CSlG+vsziZp9dMvA==} - peerDependencies: - esbuild: '*' - '@esbuild/aix-ppc64@0.24.2': resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.17.19': - resolution: {integrity: sha512-KBMWvEZooR7+kzY0BtbTQn0OAYY7CsiydT63pVEaPtVYF0hXbUaOyZog37DKxK7NF3XacBJOpYT4adIJh+avxA==} - engines: {node: '>=12'} - cpu: [arm64] - os: [android] - '@esbuild/android-arm64@0.24.2': resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.17.19': - resolution: {integrity: sha512-rIKddzqhmav7MSmoFCmDIb6e2W57geRsM94gV2l38fzhXMwq7hZoClug9USI2pFRGL06f4IOPHHpFNOkWieR8A==} - engines: {node: '>=12'} - cpu: [arm] - os: [android] - '@esbuild/android-arm@0.24.2': resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.17.19': - resolution: {integrity: sha512-uUTTc4xGNDT7YSArp/zbtmbhO0uEEK9/ETW29Wk1thYUJBz3IVnvgEiEwEa9IeLyvnpKrWK64Utw2bgUmDveww==} - engines: {node: '>=12'} - cpu: [x64] - os: [android] - '@esbuild/android-x64@0.24.2': resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.17.19': - resolution: {integrity: sha512-80wEoCfF/hFKM6WE1FyBHc9SfUblloAWx6FJkFWTWiCoht9Mc0ARGEM47e67W9rI09YoUxJL68WHfDRYEAvOhg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [darwin] - '@esbuild/darwin-arm64@0.24.2': resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.17.19': - resolution: {integrity: sha512-IJM4JJsLhRYr9xdtLytPLSH9k/oxR3boaUIYiHkAawtwNOXKE8KoU8tMvryogdcT8AU+Bflmh81Xn6Q0vTZbQw==} - engines: {node: '>=12'} - cpu: [x64] - os: [darwin] - '@esbuild/darwin-x64@0.24.2': resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.17.19': - resolution: {integrity: sha512-pBwbc7DufluUeGdjSU5Si+P3SoMF5DQ/F/UmTSb8HXO80ZEAJmrykPyzo1IfNbAoaqw48YRpv8shwd1NoI0jcQ==} - engines: {node: '>=12'} - cpu: [arm64] - os: [freebsd] - '@esbuild/freebsd-arm64@0.24.2': resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.17.19': - resolution: {integrity: sha512-4lu+n8Wk0XlajEhbEffdy2xy53dpR06SlzvhGByyg36qJw6Kpfk7cp45DR/62aPH9mtJRmIyrXAS5UWBrJT6TQ==} - engines: {node: '>=12'} - cpu: [x64] - os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.17.19': - resolution: {integrity: sha512-ct1Tg3WGwd3P+oZYqic+YZF4snNl2bsnMKRkb3ozHmnM0dGWuxcPTTntAF6bOP0Sp4x0PjSF+4uHQ1xvxfRKqg==} - engines: {node: '>=12'} - cpu: [arm64] - os: [linux] - '@esbuild/linux-arm64@0.24.2': resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.17.19': - resolution: {integrity: sha512-cdmT3KxjlOQ/gZ2cjfrQOtmhG4HJs6hhvm3mWSRDPtZ/lP5oe8FWceS10JaSJC13GBd4eH/haHnqf7hhGNLerA==} - engines: {node: '>=12'} - cpu: [arm] - os: [linux] - '@esbuild/linux-arm@0.24.2': resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.17.19': - resolution: {integrity: sha512-w4IRhSy1VbsNxHRQpeGCHEmibqdTUx61Vc38APcsRbuVgK0OPEnQ0YD39Brymn96mOx48Y2laBQGqgZ0j9w6SQ==} - engines: {node: '>=12'} - cpu: [ia32] - os: [linux] - '@esbuild/linux-ia32@0.24.2': resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.17.19': - resolution: {integrity: sha512-2iAngUbBPMq439a+z//gE+9WBldoMp1s5GWsUSgqHLzLJ9WoZLZhpwWuym0u0u/4XmZ3gpHmzV84PonE+9IIdQ==} - engines: {node: '>=12'} - cpu: [loong64] - os: [linux] - '@esbuild/linux-loong64@0.24.2': resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.17.19': - resolution: {integrity: sha512-LKJltc4LVdMKHsrFe4MGNPp0hqDFA1Wpt3jE1gEyM3nKUvOiO//9PheZZHfYRfYl6AwdTH4aTcXSqBerX0ml4A==} - engines: {node: '>=12'} - cpu: [mips64el] - os: [linux] - '@esbuild/linux-mips64el@0.24.2': resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.17.19': - resolution: {integrity: sha512-/c/DGybs95WXNS8y3Ti/ytqETiW7EU44MEKuCAcpPto3YjQbyK3IQVKfF6nbghD7EcLUGl0NbiL5Rt5DMhn5tg==} - engines: {node: '>=12'} - cpu: [ppc64] - os: [linux] - '@esbuild/linux-ppc64@0.24.2': resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.17.19': - resolution: {integrity: sha512-FC3nUAWhvFoutlhAkgHf8f5HwFWUL6bYdvLc/TTuxKlvLi3+pPzdZiFKSWz/PF30TB1K19SuCxDTI5KcqASJqA==} - engines: {node: '>=12'} - cpu: [riscv64] - os: [linux] - '@esbuild/linux-riscv64@0.24.2': resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.17.19': - resolution: {integrity: sha512-IbFsFbxMWLuKEbH+7sTkKzL6NJmG2vRyy6K7JJo55w+8xDk7RElYn6xvXtDW8HCfoKBFK69f3pgBJSUSQPr+4Q==} - engines: {node: '>=12'} - cpu: [s390x] - os: [linux] - '@esbuild/linux-s390x@0.24.2': resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.17.19': - resolution: {integrity: sha512-68ngA9lg2H6zkZcyp22tsVt38mlhWde8l3eJLWkyLrp4HwMUr3c1s/M2t7+kHIhvMjglIBrFpncX1SzMckomGw==} - engines: {node: '>=12'} - cpu: [x64] - os: [linux] - '@esbuild/linux-x64@0.24.2': resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} engines: {node: '>=18'} @@ -1513,12 +1412,6 @@ packages: cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.17.19': - resolution: {integrity: sha512-CwFq42rXCR8TYIjIfpXCbRX0rp1jo6cPIUPSaWwzbVI4aOfX96OXY8M6KNmtPcg7QjYeDmN+DD0Wp3LaBOLf4Q==} - engines: {node: '>=12'} - cpu: [x64] - os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} engines: {node: '>=18'} @@ -1531,68 +1424,38 @@ packages: cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.17.19': - resolution: {integrity: sha512-cnq5brJYrSZ2CF6c35eCmviIN3k3RczmHz8eYaVlNasVqsNY+JKohZU5MKmaOI+KkllCdzOKKdPs762VCPC20g==} - engines: {node: '>=12'} - cpu: [x64] - os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.17.19': - resolution: {integrity: sha512-vCRT7yP3zX+bKWFeP/zdS6SqdWB8OIpaRq/mbXQxTGHnIxspRtigpkUcDMlSCOejlHowLqII7K2JKevwyRP2rg==} - engines: {node: '>=12'} - cpu: [x64] - os: [sunos] - '@esbuild/sunos-x64@0.24.2': resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.17.19': - resolution: {integrity: sha512-yYx+8jwowUstVdorcMdNlzklLYhPxjniHWFKgRqH7IFlUEa0Umu3KuYplf1HUZZ422e3NU9F4LGb+4O0Kdcaag==} - engines: {node: '>=12'} - cpu: [arm64] - os: [win32] - '@esbuild/win32-arm64@0.24.2': resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.17.19': - resolution: {integrity: sha512-eggDKanJszUtCdlVs0RB+h35wNlb5v4TWEkq4vZcmVt5u/HiDZrTXe2bWFQUez3RgNHwx/x4sk5++4NSSicKkw==} - engines: {node: '>=12'} - cpu: [ia32] - os: [win32] - '@esbuild/win32-ia32@0.24.2': resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.17.19': - resolution: {integrity: sha512-lAhycmKnVOuRYNtRtatQR1LPQf2oYCkRGkSFnseDAKPl8lu5SOsK/e1sXe5a0Pc5kHIHe6P2I/ilntNv2xf3cA==} - engines: {node: '>=12'} - cpu: [x64] - os: [win32] - '@esbuild/win32-x64@0.24.2': resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.4.1': - resolution: {integrity: sha512-s3O3waFUrMV8P/XaF/+ZTp1X9XBZW1a4B97ZnjQF2KYWaFD2A8KyFBsrsfSjEmjn3RGWAIuvlneuZm3CUK3jbA==} + '@eslint-community/eslint-utils@4.5.1': + resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -2042,6 +1905,10 @@ packages: resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/scope-manager@8.26.1': + resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/type-utils@8.26.0': resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2053,12 +1920,22 @@ packages: resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/types@8.26.1': + resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/typescript-estree@8.26.0': resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/typescript-estree@8.26.1': + resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.26.0': resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -2066,10 +1943,21 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/utils@8.26.1': + resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' + '@typescript-eslint/visitor-keys@8.26.0': resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.26.1': + resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vercel/nft@0.29.2': resolution: {integrity: sha512-A/Si4mrTkQqJ6EXJKv5EYCDQ3NL6nJXxG8VGXePsaiQigsomHYQC9xSpX8qGk7AEZk4b1ssbYIqJ0ISQQ7bfcA==} engines: {node: '>=18'} @@ -2132,6 +2020,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.14.1: + resolution: {integrity: sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -2265,9 +2158,6 @@ packages: concat-map@0.0.1: resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} - confbox@0.1.8: - resolution: {integrity: sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==} - consola@3.2.3: resolution: {integrity: sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==} engines: {node: ^14.18.0 || >=16.10.0} @@ -2394,11 +2284,6 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - esbuild@0.17.19: - resolution: {integrity: sha512-XQ0jAPFkK/u3LcVRcvVHQcTIqD6E2H1fvZMA5dQPSOWb3suUbWbfbRf94pjc0bNzRYLfIrDRQXr7X+LHIm5oHw==} - engines: {node: '>=12'} - hasBin: true - esbuild@0.24.2: resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} engines: {node: '>=18'} @@ -2494,9 +2379,6 @@ packages: resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} engines: {node: '>=4.0'} - estree-walker@0.6.1: - resolution: {integrity: sha512-SqmZANLWS0mnatqbSfRP5g8OXZC12Fgg1IwNtLsyHDzJizORW4khDfjPqJZsemPWBB2uqykUah5YpQ6epsqC/w==} - estree-walker@2.0.2: resolution: {integrity: sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==} @@ -2515,6 +2397,9 @@ packages: resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} engines: {node: '>=12.0.0'} + exsolve@1.0.4: + resolution: {integrity: sha512-xsZH6PXaER4XoV+NiT7JHp1bJodJVT+cxeSH1G0f0tlT0lJqYuHUP3bUx2HtfTDvOagMINYp8rsqusxud3RXhw==} + extendable-error@0.1.7: resolution: {integrity: sha512-UOiS2in6/Q0FK0R0q6UY9vYpQ21mr/Qn1KOnte7vsACuNJf514WvCCUHSRCPcgjPT2bAhNIJdlE6bVap1GKmeg==} @@ -2525,8 +2410,8 @@ packages: fast-deep-equal@3.1.3: resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} - fast-glob@3.3.2: - resolution: {integrity: sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==} + fast-glob@3.3.3: + resolution: {integrity: sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==} engines: {node: '>=8.6.0'} fast-json-stable-stringify@2.1.0: @@ -2853,9 +2738,6 @@ packages: lru-cache@10.4.3: resolution: {integrity: sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==} - magic-string@0.25.9: - resolution: {integrity: sha512-RmF0AsMzgt25qzqqLc1+MbHmhdx0ojF2Fvs4XnOqz2ZOBXzzkEwc/dJQZCYHAn7v1jbVOjAZfK8msRn4BxO4VQ==} - magic-string@0.30.17: resolution: {integrity: sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==} @@ -2876,15 +2758,11 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - miniflare@3.20250214.0: - resolution: {integrity: sha512-XKwn+X/V2CEpbRhoeaIcJHpV/Duz5Md5rxVT8I6S1oqd3aLZkn8cUX1tuxHpUvfQSPuXwWH+2ESLNnTf9PKEWg==} - engines: {node: '>=16.13'} + miniflare@4.20250310.0: + resolution: {integrity: sha512-WL4hKQIfXyTxKyQzxJyyy/v+OYSiF51s3Qe1Q4W4MjHJbtiN8Kg7+oeTdHYgqYehanN2zYoSKJ/xooIy8q5+XA==} + engines: {node: '>=18.0.0'} hasBin: true - minimatch@10.0.1: - resolution: {integrity: sha512-ethXTt3SGGR+95gudmqJ1eNhRO7eGEGIgYA9vnPatK4/etz2MEVDno5GMCibdMTuBMyElzIlgxMna3K94XDIDQ==} - engines: {node: 20 || >=22} - minimatch@3.1.2: resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} @@ -2905,9 +2783,6 @@ packages: engines: {node: '>=10'} hasBin: true - mlly@1.7.4: - resolution: {integrity: sha512-qmdSIPC4bDJXgZTCR7XosJiNKySV7O215tsPtDN9iEO/7q/76b/ijtgRu/+epFXSJhijtTCCGp3DWS549P3xKw==} - mri@1.2.0: resolution: {integrity: sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==} engines: {node: '>=4'} @@ -2952,8 +2827,8 @@ packages: engines: {node: ^18.17.0 || >=20.5.0} hasBin: true - ohash@1.1.4: - resolution: {integrity: sha512-FlDryZAahJmEF3VR3w1KogSEdWX3WhA5GPakFx4J81kEAiHyLMpdLLElS8n8dfNadMgAne/MywcvmogzscVt4g==} + ohash@2.0.11: + resolution: {integrity: sha512-RdR9FQrFwNBNXAr4GixM8YaRZRJ5PUWbKYbE5eOsrwAjJW0q2REGcf79oYPsLyskQCZG1PLN+S/K1V00joZAoQ==} optionator@0.9.3: resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} @@ -3029,11 +2904,8 @@ packages: resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} engines: {node: '>=8'} - pathe@1.1.2: - resolution: {integrity: sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==} - - pathe@2.0.2: - resolution: {integrity: sha512-15Ztpk+nov8DR524R4BF7uEuzESgzUEAV4Ah7CUMNGXdE5ELuvxElxGXndBl32vMSsWa1jpNf22Z+Er3sKwq+w==} + pathe@2.0.3: + resolution: {integrity: sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==} pathval@2.0.0: resolution: {integrity: sha512-vE7JKRyES09KiunauX7nd2Q9/L7lhok4smP9RZTDeD4MVs72Dp2qNFVz39Nz5a0FVEW0BJR6C0DYrq6unoziZA==} @@ -3054,9 +2926,6 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - pkg-types@1.3.1: - resolution: {integrity: sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==} - playwright-core@1.44.1: resolution: {integrity: sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==} engines: {node: '>=16'} @@ -3176,16 +3045,6 @@ packages: resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} hasBin: true - rollup-plugin-inject@3.0.2: - resolution: {integrity: sha512-ptg9PQwzs3orn4jkgXJ74bfs5vYz1NCZlSQMBUA0wKcGp5i5pA1AO3fOUEte8enhGUC+iapTCzEWw2jEFFUO/w==} - deprecated: This package has been deprecated and is no longer maintained. Please use @rollup/plugin-inject. - - rollup-plugin-node-polyfills@0.2.1: - resolution: {integrity: sha512-4kCrKPTJ6sK4/gLL/U5QzVT8cxJcofO0OU74tnB19F40cmuAKSzH5/siithxlofFEjwvw1YAhPmbvGNA6jEroA==} - - rollup-pluginutils@2.8.2: - resolution: {integrity: sha512-EEp9NhnUkwY8aif6bxgovPHMoMoNr2FulJziTndpt5H9RdwC47GSGuII9XxpSdzVGM0GWrNPHV6ie1LTNJPaLQ==} - rollup@4.30.1: resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3256,10 +3115,6 @@ packages: resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} engines: {node: '>=0.10.0'} - sourcemap-codec@1.4.8: - resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} - deprecated: Please use @jridgewell/sourcemap-codec instead - spawndamnit@3.0.1: resolution: {integrity: sha512-MmnduQUuHCoFckZoWnXsTg7JaiLBJrKFj9UI2MbRPGaJeVpsLcVBu6P/IGZovziM/YBsellCmsprgNA+w0CzVg==} @@ -3456,8 +3311,8 @@ packages: peerDependencies: typescript: '>=4.8.4' - ts-declaration-location@1.0.5: - resolution: {integrity: sha512-WqmlO9IoeYwCqJ2E9kHMcY9GZhhfLYItC3VnHDlPOrg6nNdUWS4wn4hhDZUPt60m1EvtjPIZyprTjpI992Bgzw==} + ts-declaration-location@1.0.6: + resolution: {integrity: sha512-QwtM5UZ8S/NpDvSx4u2EHJgLx2+we7qN8sgyOia4nTpJlke3NO1s1Eb2ea/8IFlkc60b71SILGqWBzGGDnNeSw==} peerDependencies: typescript: '>=4.0.0' @@ -3490,8 +3345,8 @@ packages: resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} engines: {node: '>=14.0'} - unenv@2.0.0-rc.1: - resolution: {integrity: sha512-PU5fb40H8X149s117aB4ytbORcCvlASdtF97tfls4BPIyj4PeVxvpSuy1jAptqYHqB0vb2w2sHvzM0XWcp2OKg==} + unenv@2.0.0-rc.14: + resolution: {integrity: sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -3612,8 +3467,8 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20250214.0: - resolution: {integrity: sha512-QWcqXZLiMpV12wiaVnb3nLmfs/g4ZsFQq2mX85z546r3AX4CTIkXl0VP50W3CwqLADej3PGYiRDOTelDOwVG1g==} + workerd@1.20250310.0: + resolution: {integrity: sha512-bAaZ9Bmts3mArbIrXYAtr+ZRsAJAAUEsCtvwfBavIYXaZ5sgdEOJBEiBbvsHp6CsVObegOM85tIWpYLpbTxQrQ==} engines: {node: '>=16'} hasBin: true @@ -3621,12 +3476,12 @@ packages: resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} engines: {node: '>=12'} - wrangler@3.109.2: - resolution: {integrity: sha512-CT8izugPBth5o1o4gLNcQrDkHKSX2Jthy6gkyhaWiy2pFrx+536NMn/atWilLA1t1uhIgddEI5BXDNudIkPPHA==} - engines: {node: '>=16.17.0'} + wrangler@4.0.0: + resolution: {integrity: sha512-9QqqoznS5sfLNqPKPkeEkwPAIe4lPfWLzPxVATmAbMQl4sh3/8iKEYSjZXQxdtcTgiS8iGOUbHq/rdiOFU8H1w==} + engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250214.0 + '@cloudflare/workers-types': ^4.20250310.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -3834,30 +3689,32 @@ snapshots: human-id: 1.0.2 prettier: 2.8.8 - '@cloudflare/kv-asset-handler@0.3.4': + '@cloudflare/kv-asset-handler@0.4.0': dependencies: mime: 3.0.0 - '@cloudflare/kv-asset-handler@0.4.0': + '@cloudflare/unenv-preset@2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250310.0)': dependencies: - mime: 3.0.0 + unenv: 2.0.0-rc.14 + optionalDependencies: + workerd: 1.20250310.0 - '@cloudflare/workerd-darwin-64@1.20250214.0': + '@cloudflare/workerd-darwin-64@1.20250310.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250214.0': + '@cloudflare/workerd-darwin-arm64@1.20250310.0': optional: true - '@cloudflare/workerd-linux-64@1.20250214.0': + '@cloudflare/workerd-linux-64@1.20250310.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250214.0': + '@cloudflare/workerd-linux-arm64@1.20250310.0': optional: true - '@cloudflare/workerd-windows-64@1.20250214.0': + '@cloudflare/workerd-windows-64@1.20250310.0': optional: true - '@cloudflare/workers-types@4.20241205.0': {} + '@cloudflare/workers-types@4.20250312.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -3868,158 +3725,82 @@ snapshots: tslib: 2.6.2 optional: true - '@esbuild-plugins/node-globals-polyfill@0.2.3(esbuild@0.17.19)': - dependencies: - esbuild: 0.17.19 - - '@esbuild-plugins/node-modules-polyfill@0.2.2(esbuild@0.17.19)': - dependencies: - esbuild: 0.17.19 - escape-string-regexp: 4.0.0 - rollup-plugin-node-polyfills: 0.2.1 - '@esbuild/aix-ppc64@0.24.2': optional: true - '@esbuild/android-arm64@0.17.19': - optional: true - '@esbuild/android-arm64@0.24.2': optional: true - '@esbuild/android-arm@0.17.19': - optional: true - '@esbuild/android-arm@0.24.2': optional: true - '@esbuild/android-x64@0.17.19': - optional: true - '@esbuild/android-x64@0.24.2': optional: true - '@esbuild/darwin-arm64@0.17.19': - optional: true - '@esbuild/darwin-arm64@0.24.2': optional: true - '@esbuild/darwin-x64@0.17.19': - optional: true - '@esbuild/darwin-x64@0.24.2': optional: true - '@esbuild/freebsd-arm64@0.17.19': - optional: true - '@esbuild/freebsd-arm64@0.24.2': optional: true - '@esbuild/freebsd-x64@0.17.19': - optional: true - '@esbuild/freebsd-x64@0.24.2': optional: true - '@esbuild/linux-arm64@0.17.19': - optional: true - '@esbuild/linux-arm64@0.24.2': optional: true - '@esbuild/linux-arm@0.17.19': - optional: true - '@esbuild/linux-arm@0.24.2': optional: true - '@esbuild/linux-ia32@0.17.19': - optional: true - '@esbuild/linux-ia32@0.24.2': optional: true - '@esbuild/linux-loong64@0.17.19': - optional: true - '@esbuild/linux-loong64@0.24.2': optional: true - '@esbuild/linux-mips64el@0.17.19': - optional: true - '@esbuild/linux-mips64el@0.24.2': optional: true - '@esbuild/linux-ppc64@0.17.19': - optional: true - '@esbuild/linux-ppc64@0.24.2': optional: true - '@esbuild/linux-riscv64@0.17.19': - optional: true - '@esbuild/linux-riscv64@0.24.2': optional: true - '@esbuild/linux-s390x@0.17.19': - optional: true - '@esbuild/linux-s390x@0.24.2': optional: true - '@esbuild/linux-x64@0.17.19': - optional: true - '@esbuild/linux-x64@0.24.2': optional: true '@esbuild/netbsd-arm64@0.24.2': optional: true - '@esbuild/netbsd-x64@0.17.19': - optional: true - '@esbuild/netbsd-x64@0.24.2': optional: true '@esbuild/openbsd-arm64@0.24.2': optional: true - '@esbuild/openbsd-x64@0.17.19': - optional: true - '@esbuild/openbsd-x64@0.24.2': optional: true - '@esbuild/sunos-x64@0.17.19': - optional: true - '@esbuild/sunos-x64@0.24.2': optional: true - '@esbuild/win32-arm64@0.17.19': - optional: true - '@esbuild/win32-arm64@0.24.2': optional: true - '@esbuild/win32-ia32@0.17.19': - optional: true - '@esbuild/win32-ia32@0.24.2': optional: true - '@esbuild/win32-x64@0.17.19': - optional: true - '@esbuild/win32-x64@0.24.2': optional: true - '@eslint-community/eslint-utils@4.4.1(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.5.1(eslint@9.6.0)': dependencies: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 @@ -4336,7 +4117,7 @@ snapshots: '@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0)': dependencies: '@types/eslint': 8.56.12 - acorn: 8.14.0 + acorn: 8.14.1 eslint: 9.6.0 eslint-visitor-keys: 4.2.0 espree: 10.3.0 @@ -4448,6 +4229,11 @@ snapshots: '@typescript-eslint/types': 8.26.0 '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/scope-manager@8.26.1': + dependencies: + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/visitor-keys': 8.26.1 + '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.6.3) @@ -4461,12 +4247,28 @@ snapshots: '@typescript-eslint/types@8.26.0': {} + '@typescript-eslint/types@8.26.1': {} + '@typescript-eslint/typescript-estree@8.26.0(typescript@5.6.3)': dependencies: '@typescript-eslint/types': 8.26.0 '@typescript-eslint/visitor-keys': 8.26.0 debug: 4.4.0 - fast-glob: 3.3.2 + fast-glob: 3.3.3 + is-glob: 4.0.3 + minimatch: 9.0.5 + semver: 7.7.1 + ts-api-utils: 2.0.1(typescript@5.6.3) + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + + '@typescript-eslint/typescript-estree@8.26.1(typescript@5.6.3)': + dependencies: + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/visitor-keys': 8.26.1 + debug: 4.4.0 + fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 @@ -4477,7 +4279,7 @@ snapshots: '@typescript-eslint/utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) '@typescript-eslint/scope-manager': 8.26.0 '@typescript-eslint/types': 8.26.0 '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.6.3) @@ -4486,17 +4288,33 @@ snapshots: transitivePeerDependencies: - supports-color + '@typescript-eslint/utils@8.26.1(eslint@9.6.0)(typescript@5.6.3)': + dependencies: + '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@typescript-eslint/scope-manager': 8.26.1 + '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.6.3) + eslint: 9.6.0 + typescript: 5.6.3 + transitivePeerDependencies: + - supports-color + '@typescript-eslint/visitor-keys@8.26.0': dependencies: '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 + '@typescript-eslint/visitor-keys@8.26.1': + dependencies: + '@typescript-eslint/types': 8.26.1 + eslint-visitor-keys: 4.2.0 + '@vercel/nft@0.29.2(rollup@4.30.1)': dependencies: '@mapbox/node-pre-gyp': 2.0.0 '@rollup/pluginutils': 5.1.3(rollup@4.30.1) - acorn: 8.14.0 - acorn-import-attributes: 1.9.5(acorn@8.14.0) + acorn: 8.14.1 + acorn-import-attributes: 1.9.5(acorn@8.14.1) async-sema: 3.1.1 bindings: 1.5.0 estree-walker: 2.0.2 @@ -4532,13 +4350,13 @@ snapshots: '@vitest/runner@3.0.5': dependencies: '@vitest/utils': 3.0.5 - pathe: 2.0.2 + pathe: 2.0.3 '@vitest/snapshot@3.0.5': dependencies: '@vitest/pretty-format': 3.0.5 magic-string: 0.30.17 - pathe: 2.0.2 + pathe: 2.0.3 '@vitest/spy@3.0.5': dependencies: @@ -4552,22 +4370,24 @@ snapshots: abbrev@2.0.0: {} - acorn-import-attributes@1.9.5(acorn@8.14.0): + acorn-import-attributes@1.9.5(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@8.14.0): + acorn-jsx@5.3.2(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 - acorn-typescript@1.4.13(acorn@8.14.0): + acorn-typescript@1.4.13(acorn@8.14.1): dependencies: - acorn: 8.14.0 + acorn: 8.14.1 acorn-walk@8.3.2: {} acorn@8.14.0: {} + acorn@8.14.1: {} + agent-base@7.1.3: {} ajv@6.12.6: @@ -4683,8 +4503,6 @@ snapshots: concat-map@0.0.1: {} - confbox@0.1.8: {} - consola@3.2.3: {} console-clear@1.1.1: {} @@ -4776,31 +4594,6 @@ snapshots: es-module-lexer@1.6.0: {} - esbuild@0.17.19: - optionalDependencies: - '@esbuild/android-arm': 0.17.19 - '@esbuild/android-arm64': 0.17.19 - '@esbuild/android-x64': 0.17.19 - '@esbuild/darwin-arm64': 0.17.19 - '@esbuild/darwin-x64': 0.17.19 - '@esbuild/freebsd-arm64': 0.17.19 - '@esbuild/freebsd-x64': 0.17.19 - '@esbuild/linux-arm': 0.17.19 - '@esbuild/linux-arm64': 0.17.19 - '@esbuild/linux-ia32': 0.17.19 - '@esbuild/linux-loong64': 0.17.19 - '@esbuild/linux-mips64el': 0.17.19 - '@esbuild/linux-ppc64': 0.17.19 - '@esbuild/linux-riscv64': 0.17.19 - '@esbuild/linux-s390x': 0.17.19 - '@esbuild/linux-x64': 0.17.19 - '@esbuild/netbsd-x64': 0.17.19 - '@esbuild/openbsd-x64': 0.17.19 - '@esbuild/sunos-x64': 0.17.19 - '@esbuild/win32-arm64': 0.17.19 - '@esbuild/win32-ia32': 0.17.19 - '@esbuild/win32-x64': 0.17.19 - esbuild@0.24.2: optionalDependencies: '@esbuild/aix-ppc64': 0.24.2 @@ -4842,15 +4635,15 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) '@eslint-community/regexpp': 4.12.1 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) - '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.6.3) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@typescript-eslint/utils': 8.26.1(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) @@ -4859,14 +4652,14 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.5 semver: 7.7.1 - ts-declaration-location: 1.0.5(typescript@5.6.3) + ts-declaration-location: 1.0.6(typescript@5.6.3) transitivePeerDependencies: - supports-color - typescript eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9): dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) @@ -4899,7 +4692,7 @@ snapshots: eslint@9.6.0: dependencies: - '@eslint-community/eslint-utils': 4.4.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 @@ -4940,14 +4733,14 @@ snapshots: espree@10.3.0: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 4.2.0 espree@9.6.1: dependencies: - acorn: 8.14.0 - acorn-jsx: 5.3.2(acorn@8.14.0) + acorn: 8.14.1 + acorn-jsx: 5.3.2(acorn@8.14.1) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -4967,8 +4760,6 @@ snapshots: estraverse@5.3.0: {} - estree-walker@0.6.1: {} - estree-walker@2.0.2: {} estree-walker@3.0.3: @@ -4981,6 +4772,8 @@ snapshots: expect-type@1.1.0: {} + exsolve@1.0.4: {} + extendable-error@0.1.7: {} external-editor@3.1.0: @@ -4991,7 +4784,7 @@ snapshots: fast-deep-equal@3.1.3: {} - fast-glob@3.3.2: + fast-glob@3.3.3: dependencies: '@nodelib/fs.stat': 2.0.5 '@nodelib/fs.walk': 1.2.8 @@ -5101,7 +4894,7 @@ snapshots: dependencies: array-union: 2.1.0 dir-glob: 3.0.1 - fast-glob: 3.3.2 + fast-glob: 3.3.3 ignore: 5.3.2 merge2: 1.4.1 slash: 3.0.0 @@ -5286,10 +5079,6 @@ snapshots: lru-cache@10.4.3: {} - magic-string@0.25.9: - dependencies: - sourcemap-codec: 1.4.8 - magic-string@0.30.17: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 @@ -5305,7 +5094,7 @@ snapshots: min-indent@1.0.1: {} - miniflare@3.20250214.0: + miniflare@4.20250310.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -5314,7 +5103,7 @@ snapshots: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.28.5 - workerd: 1.20250214.0 + workerd: 1.20250310.0 ws: 8.18.0 youch: 3.2.3 zod: 3.22.3 @@ -5322,10 +5111,6 @@ snapshots: - bufferutil - utf-8-validate - minimatch@10.0.1: - dependencies: - brace-expansion: 2.0.1 - minimatch@3.1.2: dependencies: brace-expansion: 1.1.11 @@ -5343,13 +5128,6 @@ snapshots: mkdirp@3.0.1: {} - mlly@1.7.4: - dependencies: - acorn: 8.14.0 - pathe: 2.0.2 - pkg-types: 1.3.1 - ufo: 1.5.4 - mri@1.2.0: {} mrmime@2.0.0: {} @@ -5377,7 +5155,7 @@ snapshots: dependencies: abbrev: 2.0.0 - ohash@1.1.4: {} + ohash@2.0.11: {} optionator@0.9.3: dependencies: @@ -5444,9 +5222,7 @@ snapshots: path-type@4.0.0: {} - pathe@1.1.2: {} - - pathe@2.0.2: {} + pathe@2.0.3: {} pathval@2.0.0: {} @@ -5458,12 +5234,6 @@ snapshots: pify@4.0.1: {} - pkg-types@1.3.1: - dependencies: - confbox: 0.1.8 - mlly: 1.7.4 - pathe: 2.0.2 - playwright-core@1.44.1: {} playwright@1.44.1: @@ -5558,20 +5328,6 @@ snapshots: dependencies: glob: 10.4.5 - rollup-plugin-inject@3.0.2: - dependencies: - estree-walker: 0.6.1 - magic-string: 0.25.9 - rollup-pluginutils: 2.8.2 - - rollup-plugin-node-polyfills@0.2.1: - dependencies: - rollup-plugin-inject: 3.0.2 - - rollup-pluginutils@2.8.2: - dependencies: - estree-walker: 0.6.1 - rollup@4.30.1: dependencies: '@types/estree': 1.0.6 @@ -5676,8 +5432,6 @@ snapshots: source-map@0.6.1: {} - sourcemap-codec@1.4.8: {} - spawndamnit@3.0.1: dependencies: cross-spawn: 7.0.6 @@ -5778,8 +5532,8 @@ snapshots: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@types/estree': 1.0.6 - acorn: 8.14.0 - acorn-typescript: 1.4.13(acorn@8.14.0) + acorn: 8.14.1 + acorn-typescript: 1.4.13(acorn@8.14.1) aria-query: 5.3.2 axobject-query: 4.1.0 esm-env: 1.2.2 @@ -5845,9 +5599,9 @@ snapshots: dependencies: typescript: 5.6.3 - ts-declaration-location@1.0.5(typescript@5.6.3): + ts-declaration-location@1.0.6(typescript@5.6.3): dependencies: - minimatch: 10.0.1 + minimatch: 9.0.5 typescript: 5.6.3 tslib@2.6.2: {} @@ -5876,12 +5630,12 @@ snapshots: dependencies: '@fastify/busboy': 2.1.1 - unenv@2.0.0-rc.1: + unenv@2.0.0-rc.14: dependencies: defu: 6.1.4 - mlly: 1.7.4 - ohash: 1.1.4 - pathe: 1.1.2 + exsolve: 1.0.4 + ohash: 2.0.11 + pathe: 2.0.3 ufo: 1.5.4 universalify@0.1.2: {} @@ -5913,7 +5667,7 @@ snapshots: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 - pathe: 2.0.2 + pathe: 2.0.3 vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - '@types/node' @@ -5956,7 +5710,7 @@ snapshots: debug: 4.4.0 expect-type: 1.1.0 magic-string: 0.30.17 - pathe: 2.0.2 + pathe: 2.0.3 std-env: 3.8.0 tinybench: 2.9.0 tinyexec: 0.3.2 @@ -5997,32 +5751,31 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20250214.0: + workerd@1.20250310.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250214.0 - '@cloudflare/workerd-darwin-arm64': 1.20250214.0 - '@cloudflare/workerd-linux-64': 1.20250214.0 - '@cloudflare/workerd-linux-arm64': 1.20250214.0 - '@cloudflare/workerd-windows-64': 1.20250214.0 + '@cloudflare/workerd-darwin-64': 1.20250310.0 + '@cloudflare/workerd-darwin-arm64': 1.20250310.0 + '@cloudflare/workerd-linux-64': 1.20250310.0 + '@cloudflare/workerd-linux-arm64': 1.20250310.0 + '@cloudflare/workerd-windows-64': 1.20250310.0 worktop@0.8.0-next.18: dependencies: mrmime: 2.0.0 regexparam: 3.0.0 - wrangler@3.109.2(@cloudflare/workers-types@4.20241205.0): + wrangler@4.0.0(@cloudflare/workers-types@4.20250312.0): dependencies: - '@cloudflare/kv-asset-handler': 0.3.4 - '@esbuild-plugins/node-globals-polyfill': 0.2.3(esbuild@0.17.19) - '@esbuild-plugins/node-modules-polyfill': 0.2.2(esbuild@0.17.19) + '@cloudflare/kv-asset-handler': 0.4.0 + '@cloudflare/unenv-preset': 2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250310.0) blake3-wasm: 2.1.5 - esbuild: 0.17.19 - miniflare: 3.20250214.0 + esbuild: 0.24.2 + miniflare: 4.20250310.0 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.1 - workerd: 1.20250214.0 + unenv: 2.0.0-rc.14 + workerd: 1.20250310.0 optionalDependencies: - '@cloudflare/workers-types': 4.20241205.0 + '@cloudflare/workers-types': 4.20250312.0 fsevents: 2.3.3 sharp: 0.33.5 transitivePeerDependencies: From d9bb9509512693582e86ab20a027095cf194589b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 15 Mar 2025 13:27:31 -0400 Subject: [PATCH 0997/1135] Version Packages (#13587) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/flat-cows-cough.md | 5 ----- .changeset/tame-weeks-punch.md | 6 ------ packages/adapter-cloudflare-workers/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare-workers/package.json | 2 +- packages/adapter-cloudflare/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 9 files changed, 34 insertions(+), 15 deletions(-) delete mode 100644 .changeset/flat-cows-cough.md delete mode 100644 .changeset/tame-weeks-punch.md diff --git a/.changeset/flat-cows-cough.md b/.changeset/flat-cows-cough.md deleted file mode 100644 index fe275cc38867..000000000000 --- a/.changeset/flat-cows-cough.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: lazily load CSS for dynamically imported components diff --git a/.changeset/tame-weeks-punch.md b/.changeset/tame-weeks-punch.md deleted file mode 100644 index c9893ddf32a1..000000000000 --- a/.changeset/tame-weeks-punch.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare-workers': minor -'@sveltejs/adapter-cloudflare': minor ---- - -feat: support wrangler 4 diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md index 3a583a002c0d..30314f9e5c91 100644 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ b/packages/adapter-cloudflare-workers/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare-workers +## 2.9.0 +### Minor Changes + + +- feat: support wrangler 4 ([#13580](https://github.com/sveltejs/kit/pull/13580)) + + +### Patch Changes + +- Updated dependencies [[`001bc04dece9b0983efc2187225772c19d135345`](https://github.com/sveltejs/kit/commit/001bc04dece9b0983efc2187225772c19d135345)]: + - @sveltejs/kit@2.19.2 + ## 2.8.0 ### Minor Changes diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json index 86ace3237d62..581343d9ed3d 100644 --- a/packages/adapter-cloudflare-workers/package.json +++ b/packages/adapter-cloudflare-workers/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare-workers", - "version": "2.8.0", + "version": "2.9.0", "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", "keywords": [ "adapter", diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 0a70e9d3675f..366c4365c275 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare +## 5.1.0 +### Minor Changes + + +- feat: support wrangler 4 ([#13580](https://github.com/sveltejs/kit/pull/13580)) + + +### Patch Changes + +- Updated dependencies [[`001bc04dece9b0983efc2187225772c19d135345`](https://github.com/sveltejs/kit/commit/001bc04dece9b0983efc2187225772c19d135345)]: + - @sveltejs/kit@2.19.2 + ## 5.0.3 ### Patch Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index c99ed49bbeb4..e2412209c324 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "5.0.3", + "version": "5.1.0", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index c137c0407b14..a34dcfae31ff 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.19.2 +### Patch Changes + + +- fix: lazily load CSS for dynamically imported components ([#13564](https://github.com/sveltejs/kit/pull/13564)) + ## 2.19.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 9d9248869bfb..23fbace37d66 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.19.1", + "version": "2.19.2", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index b7ad47a77de2..27bd82b0863f 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.19.1'; +export const VERSION = '2.19.2'; From d1c0c685d89af4472554150284f54036e1ec5c21 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 17 Mar 2025 11:27:12 -0400 Subject: [PATCH 0998/1135] feat: add `getRequestEvent` to `$app/server` (#13582) * feat: add `getRequestEvent` to `$app/server` * reduce indentation * innocuous change to try and trigger a docs preview * regenerate * more detailed error message * tighten up * innocuous change to try and trigger a docs preview * innocuous change to try and trigger a docs preview * innocuous change to try and trigger a docs preview * Update packages/kit/test/apps/basics/src/routes/get-request-event/endpoint/+server.js Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> * add since tag * add some docs --------- Co-authored-by: Simon H <5968653+dummdidumm@users.noreply.github.com> --- .changeset/red-jokes-ring.md | 5 + .../docs/20-core-concepts/20-load.md | 68 ++++++++ packages/kit/src/runtime/app/server/event.js | 54 +++++++ packages/kit/src/runtime/app/server/index.js | 2 + packages/kit/src/runtime/server/endpoint.js | 5 +- .../kit/src/runtime/server/page/actions.js | 3 +- .../kit/src/runtime/server/page/load_data.js | 151 ++++++++++-------- packages/kit/src/runtime/server/respond.js | 47 +++--- packages/kit/test/apps/basics/src/app.d.ts | 1 + .../kit/test/apps/basics/src/hooks.server.js | 14 ++ .../src/routes/get-request-event/+page.svelte | 1 + .../get-request-event/endpoint/+server.js | 8 + .../with-message/+page.server.ts | 26 +++ .../with-message/+page.svelte | 10 ++ .../kit/test/apps/basics/test/server.test.js | 7 + packages/kit/test/apps/basics/test/test.js | 14 ++ packages/kit/types/index.d.ts | 8 + .../src/routes/request-event/+page.server.ts | 11 ++ .../src/routes/request-event/+page.svelte | 5 + 19 files changed, 347 insertions(+), 93 deletions(-) create mode 100644 .changeset/red-jokes-ring.md create mode 100644 packages/kit/src/runtime/app/server/event.js create mode 100644 packages/kit/test/apps/basics/src/routes/get-request-event/+page.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/get-request-event/endpoint/+server.js create mode 100644 packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.server.ts create mode 100644 packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.svelte create mode 100644 playgrounds/basic/src/routes/request-event/+page.server.ts create mode 100644 playgrounds/basic/src/routes/request-event/+page.svelte diff --git a/.changeset/red-jokes-ring.md b/.changeset/red-jokes-ring.md new file mode 100644 index 000000000000..6c04b45ee0dd --- /dev/null +++ b/.changeset/red-jokes-ring.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: add `getRequestEvent` to `$app/server` diff --git a/documentation/docs/20-core-concepts/20-load.md b/documentation/docs/20-core-concepts/20-load.md index 933d38563875..b944b8b600fd 100644 --- a/documentation/docs/20-core-concepts/20-load.md +++ b/documentation/docs/20-core-concepts/20-load.md @@ -713,6 +713,74 @@ To prevent data waterfalls and preserve layout `load` caches: Putting an auth guard in `+layout.server.js` requires all child pages to call `await parent()` before protected code. Unless every child page depends on returned data from `await parent()`, the other options will be more performant. +## Using `getRequestEvent` + +When running server `load` functions, the `event` object passed to the function as an argument can also be retrieved with [`getRequestEvent`]($app-server#getRequestEvent). This allows shared logic (such as authentication guards) to access information about the current request without it needing to be passed around. + +For example, you might have a function that requires users to be logged in, and redirects them to `/login` if not: + +```js +/// file: src/lib/server/auth.js +// @filename: ambient.d.ts +interface User { + name: string; +} + +declare namespace App { + interface Locals { + user?: User; + } +} + +// @filename: index.ts +// ---cut--- +import { redirect } from '@sveltejs/kit'; +import { getRequestEvent } from '$app/server'; + +export function requireLogin() { + const { locals, url } = getRequestEvent(); + + // assume `locals.user` is populated in `handle` + if (!locals.user) { + const redirectTo = url.pathname + url.search; + const params = new URLSearchParams({ redirectTo }); + + redirect(307, `/login?${params}`); + } + + return locals.user; +} +``` + +Now, you can call `requireLogin` in any `load` function (or [form action](form-actions), for example) to guarantee that the user is logged in: + +```js +/// file: +page.server.js +// @filename: ambient.d.ts + +declare module '$lib/server/auth' { + interface User { + name: string; + } + + export function requireLogin(): User; +} + +// @filename: index.ts +// ---cut--- +import { requireLogin } from '$lib/server/auth'; + +export function load() { + const user = requireLogin(); + + // `user` is guaranteed to be a user object here, because otherwise + // `requireLogin` would throw a redirect and we wouldn't get here + return { + message: `hello ${user.name}!` + }; +} +``` + ## Further reading - [Tutorial: Loading data](/tutorial/kit/page-data) diff --git a/packages/kit/src/runtime/app/server/event.js b/packages/kit/src/runtime/app/server/event.js new file mode 100644 index 000000000000..ca727da5d96e --- /dev/null +++ b/packages/kit/src/runtime/app/server/event.js @@ -0,0 +1,54 @@ +/** @import { RequestEvent } from '@sveltejs/kit' */ + +/** @type {RequestEvent | null} */ +let request_event = null; + +/** @type {import('node:async_hooks').AsyncLocalStorage} */ +let als; + +try { + const hooks = await import('node:async_hooks'); + als = new hooks.AsyncLocalStorage(); +} catch { + // can't use AsyncLocalStorage, but can still call getRequestEvent synchronously. + // this isn't behind `supports` because it's basically just StackBlitz (i.e. + // in-browser usage) that doesn't support it AFAICT +} + +/** + * Returns the current `RequestEvent`. Can be used inside `handle`, `load` and actions (and functions called by them). + * + * In environments without [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage), this must be called synchronously (i.e. not after an `await`). + * @since 2.20.0 + */ +export function getRequestEvent() { + const event = request_event ?? als?.getStore(); + + if (!event) { + let message = + 'Can only read the current request event inside functions invoked during `handle`, such as server `load` functions, actions, and server endpoints.'; + + if (!als) { + message += + ' In environments without `AsyncLocalStorage`, the event must be read synchronously, not after an `await`.'; + } + + throw new Error(message); + } + + return event; +} + +/** + * @template T + * @param {RequestEvent | null} event + * @param {() => T} fn + */ +export function with_event(event, fn) { + try { + request_event = event; + return als ? als.run(event, fn) : fn(); + } finally { + request_event = null; + } +} diff --git a/packages/kit/src/runtime/app/server/index.js b/packages/kit/src/runtime/app/server/index.js index 33c9b0a0d1ba..19c384932107 100644 --- a/packages/kit/src/runtime/app/server/index.js +++ b/packages/kit/src/runtime/app/server/index.js @@ -71,3 +71,5 @@ export function read(asset) { throw new Error(`Asset does not exist: ${file}`); } + +export { getRequestEvent } from './event.js'; diff --git a/packages/kit/src/runtime/server/endpoint.js b/packages/kit/src/runtime/server/endpoint.js index 55bcd87807b9..417fa8e9fb95 100644 --- a/packages/kit/src/runtime/server/endpoint.js +++ b/packages/kit/src/runtime/server/endpoint.js @@ -1,5 +1,6 @@ import { ENDPOINT_METHODS, PAGE_METHODS } from '../../constants.js'; import { negotiate } from '../../utils/http.js'; +import { with_event } from '../app/server/event.js'; import { Redirect } from '../control.js'; import { method_not_allowed } from './utils.js'; @@ -40,8 +41,8 @@ export async function render_endpoint(event, mod, state) { } try { - let response = await handler( - /** @type {import('@sveltejs/kit').RequestEvent>} */ (event) + let response = await with_event(event, () => + handler(/** @type {import('@sveltejs/kit').RequestEvent>} */ (event)) ); if (!(response instanceof Response)) { diff --git a/packages/kit/src/runtime/server/page/actions.js b/packages/kit/src/runtime/server/page/actions.js index 80879e62e952..e7703359234e 100644 --- a/packages/kit/src/runtime/server/page/actions.js +++ b/packages/kit/src/runtime/server/page/actions.js @@ -5,6 +5,7 @@ import { get_status, normalize_error } from '../../../utils/error.js'; import { is_form_content_type, negotiate } from '../../../utils/http.js'; import { HttpError, Redirect, ActionFailure, SvelteKitError } from '../../control.js'; import { handle_error_and_jsonify } from '../utils.js'; +import { with_event } from '../../app/server/event.js'; /** @param {import('@sveltejs/kit').RequestEvent} event */ export function is_action_json_request(event) { @@ -246,7 +247,7 @@ async function call_action(event, actions) { ); } - return action(event); + return with_event(event, () => action(event)); } /** @param {any} data */ diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 613093412137..2ada2b6ecde6 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -2,6 +2,7 @@ import { DEV } from 'esm-env'; import { disable_search, make_trackable } from '../../../utils/url.js'; import { validate_depends } from '../../shared.js'; import { b64_encode } from '../../utils.js'; +import { with_event } from '../../app/server/event.js'; /** * Calls the user's server `load` function. @@ -16,7 +17,6 @@ import { b64_encode } from '../../utils.js'; export async function load_server_data({ event, state, node, parent }) { if (!node?.server) return null; - let done = false; let is_tracking = true; const uses = { @@ -28,6 +28,13 @@ export async function load_server_data({ event, state, node, parent }) { search_params: new Set() }; + const load = node.server.load; + const slash = node.server.trailingSlash; + + if (!load) { + return { type: 'data', data: null, uses, slash }; + } + const url = make_trackable( event.url, () => { @@ -58,92 +65,96 @@ export async function load_server_data({ event, state, node, parent }) { disable_search(url); } - const result = await node.server.load?.call(null, { - ...event, - fetch: (info, init) => { - const url = new URL(info instanceof Request ? info.url : info, event.url); + let done = false; - if (DEV && done && !uses.dependencies.has(url.href)) { - console.warn( - `${node.server_id}: Calling \`event.fetch(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` - ); - } + const result = await with_event(event, () => + load.call(null, { + ...event, + fetch: (info, init) => { + const url = new URL(info instanceof Request ? info.url : info, event.url); - // Note: server fetches are not added to uses.depends due to security concerns - return event.fetch(info, init); - }, - /** @param {string[]} deps */ - depends: (...deps) => { - for (const dep of deps) { - const { href } = new URL(dep, event.url); + if (DEV && done && !uses.dependencies.has(url.href)) { + console.warn( + `${node.server_id}: Calling \`event.fetch(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` + ); + } - if (DEV) { - validate_depends(node.server_id || 'missing route ID', dep); + // Note: server fetches are not added to uses.depends due to security concerns + return event.fetch(info, init); + }, + /** @param {string[]} deps */ + depends: (...deps) => { + for (const dep of deps) { + const { href } = new URL(dep, event.url); + + if (DEV) { + validate_depends(node.server_id || 'missing route ID', dep); + + if (done && !uses.dependencies.has(href)) { + console.warn( + `${node.server_id}: Calling \`depends(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` + ); + } + } - if (done && !uses.dependencies.has(href)) { + uses.dependencies.add(href); + } + }, + params: new Proxy(event.params, { + get: (target, key) => { + if (DEV && done && typeof key === 'string' && !uses.params.has(key)) { console.warn( - `${node.server_id}: Calling \`depends(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the dependency is invalidated` + `${node.server_id}: Accessing \`params.${String( + key + )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the param changes` ); } - } - uses.dependencies.add(href); - } - }, - params: new Proxy(event.params, { - get: (target, key) => { - if (DEV && done && typeof key === 'string' && !uses.params.has(key)) { + if (is_tracking) { + uses.params.add(key); + } + return target[/** @type {string} */ (key)]; + } + }), + parent: async () => { + if (DEV && done && !uses.parent) { console.warn( - `${node.server_id}: Accessing \`params.${String( - key - )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the param changes` + `${node.server_id}: Calling \`parent(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when parent data changes` ); } if (is_tracking) { - uses.params.add(key); + uses.parent = true; } - return target[/** @type {string} */ (key)]; - } - }), - parent: async () => { - if (DEV && done && !uses.parent) { - console.warn( - `${node.server_id}: Calling \`parent(...)\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when parent data changes` - ); - } + return parent(); + }, + route: new Proxy(event.route, { + get: (target, key) => { + if (DEV && done && typeof key === 'string' && !uses.route) { + console.warn( + `${node.server_id}: Accessing \`route.${String( + key + )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the route changes` + ); + } - if (is_tracking) { - uses.parent = true; - } - return parent(); - }, - route: new Proxy(event.route, { - get: (target, key) => { - if (DEV && done && typeof key === 'string' && !uses.route) { - console.warn( - `${node.server_id}: Accessing \`route.${String( - key - )}\` in a promise handler after \`load(...)\` has returned will not cause the function to re-run when the route changes` - ); + if (is_tracking) { + uses.route = true; + } + return target[/** @type {'id'} */ (key)]; } - - if (is_tracking) { - uses.route = true; + }), + url, + untrack(fn) { + is_tracking = false; + try { + return fn(); + } finally { + is_tracking = true; } - return target[/** @type {'id'} */ (key)]; } - }), - url, - untrack(fn) { - is_tracking = false; - try { - return fn(); - } finally { - is_tracking = true; - } - } - }); + }) + ); if (__SVELTEKIT_DEV__) { validate_load_response(result, node.server_id); @@ -155,7 +166,7 @@ export async function load_server_data({ event, state, node, parent }) { type: 'data', data: result ?? null, uses, - slash: node.server.trailingSlash + slash }; } diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 38ed27302b0d..812ef3df7a69 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -33,6 +33,7 @@ import { strip_data_suffix, strip_resolution_suffix } from '../pathname.js'; +import { with_event } from '../app/server/event.js'; /* global __SVELTEKIT_ADAPTER_NAME__ */ /* global __SVELTEKIT_DEV__ */ @@ -350,26 +351,32 @@ export async function respond(request, options, manifest, state) { if (state.prerendering && !state.prerendering.fallback) disable_search(url); - const response = await options.hooks.handle({ - event, - resolve: (event, opts) => - resolve(event, page_nodes, opts).then((response) => { - // add headers/cookies here, rather than inside `resolve`, so that we - // can do it once for all responses instead of once per `return` - for (const key in headers) { - const value = headers[key]; - response.headers.set(key, /** @type {string} */ (value)); - } - - add_cookies_to_headers(response.headers, Object.values(new_cookies)); - - if (state.prerendering && event.route.id !== null) { - response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id)); - } - - return response; - }) - }); + const response = await with_event(event, () => + options.hooks.handle({ + event, + resolve: (event, opts) => + // counter-intuitively, we need to clear the event, so that it's not + // e.g. accessible when loading modules needed to handle the request + with_event(null, () => + resolve(event, page_nodes, opts).then((response) => { + // add headers/cookies here, rather than inside `resolve`, so that we + // can do it once for all responses instead of once per `return` + for (const key in headers) { + const value = headers[key]; + response.headers.set(key, /** @type {string} */ (value)); + } + + add_cookies_to_headers(response.headers, Object.values(new_cookies)); + + if (state.prerendering && event.route.id !== null) { + response.headers.set('x-sveltekit-routeid', encodeURI(event.route.id)); + } + + return response; + }) + ) + }) + ); // respond with 304 if etag matches if (response.status === 200 && response.headers.has('etag')) { diff --git a/packages/kit/test/apps/basics/src/app.d.ts b/packages/kit/test/apps/basics/src/app.d.ts index 16bdf501b907..f40b6d8c868a 100644 --- a/packages/kit/test/apps/basics/src/app.d.ts +++ b/packages/kit/test/apps/basics/src/app.d.ts @@ -6,6 +6,7 @@ declare global { key: string; params: Record; url?: URL; + message?: string; } interface PageState { diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index 1c825a6a6c90..a9aa2bc0ceb9 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -4,6 +4,7 @@ import { sequence } from '@sveltejs/kit/hooks'; import fs from 'node:fs'; import { COOKIE_NAME } from './routes/cookies/shared'; import { _set_from_init } from './routes/init-hooks/+page.server'; +import { getRequestEvent } from '$app/server'; /** * Transform an error into a POJO, by copying its `name`, `message` @@ -150,6 +151,19 @@ export const handle = sequence( if (['/non-existent-route', '/non-existent-route-loop'].includes(event.url.pathname)) { event.locals.url = new URL(event.request.url); } + return resolve(event); + }, + async ({ event, resolve }) => { + if (event.url.pathname.startsWith('/get-request-event/')) { + const e = getRequestEvent(); + + if (event !== e) { + throw new Error('event !== e'); + } + + e.locals.message = 'hello from hooks.server.js'; + } + return resolve(event); } ); diff --git a/packages/kit/test/apps/basics/src/routes/get-request-event/+page.svelte b/packages/kit/test/apps/basics/src/routes/get-request-event/+page.svelte new file mode 100644 index 000000000000..2a7fa697c765 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/get-request-event/+page.svelte @@ -0,0 +1 @@ +
go diff --git a/packages/kit/test/apps/basics/src/routes/get-request-event/endpoint/+server.js b/packages/kit/test/apps/basics/src/routes/get-request-event/endpoint/+server.js new file mode 100644 index 000000000000..c8136555431e --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/get-request-event/endpoint/+server.js @@ -0,0 +1,8 @@ +import { getRequestEvent } from '$app/server'; +import { text } from '@sveltejs/kit'; + +export function GET() { + const event = getRequestEvent(); + + return text(event.locals.message); +} diff --git a/packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.server.ts b/packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.server.ts new file mode 100644 index 000000000000..b0c59da7ab36 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.server.ts @@ -0,0 +1,26 @@ +import { getRequestEvent } from '$app/server'; + +export async function load() { + const e1 = getRequestEvent(); + await Promise.resolve(); + const e2 = getRequestEvent(); // check AsyncLocalStorage works + + if (e1 !== e2) { + throw new Error('e1 !== e2'); + } + + return { + message: e1.locals.message + }; +} + +export const actions = { + default: async () => { + const { request } = getRequestEvent(); + const data = await request.formData(); + + return { + message: `from form: ${data.get('message')}` + }; + } +}; diff --git a/packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.svelte b/packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.svelte new file mode 100644 index 000000000000..9a05621baa38 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/get-request-event/with-message/+page.svelte @@ -0,0 +1,10 @@ + + +

{form?.message ?? data.message}

+ + + + + diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 0135b617ff94..905c345a9681 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -702,3 +702,10 @@ test.describe('init', () => { await expect(page.locator('p')).toHaveText('1'); }); }); + +test.describe('getRequestEvent', () => { + test('getRequestEvent works in server endpoints', async ({ request }) => { + const response = await request.get('/get-request-event/endpoint'); + expect(await response.text()).toBe('hello from hooks.server.js'); + }); +}); diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index c5867f34e00c..52d6a5bf8d78 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1532,3 +1532,17 @@ test.describe('Serialization', () => { expect(await page.textContent('h1')).toBe('It works!'); }); }); + +test.describe('getRequestEvent', () => { + test('getRequestEvent works in hooks, load functions and actions', async ({ page, clicknav }) => { + await page.goto('/get-request-event'); + await clicknav('[href="/get-request-event/with-message"]'); + + expect(await page.textContent('h1')).toBe('hello from hooks.server.js'); + + await page.locator('input[name="message"]').fill('hello'); + await page.click('button'); + + expect(await page.textContent('h1')).toBe('from form: hello'); + }); +}); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index deed8779b9a9..1fe7fbcb88d6 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2402,6 +2402,7 @@ declare module '$app/paths' { } declare module '$app/server' { + import type { RequestEvent } from '@sveltejs/kit'; /** * Read the contents of an imported asset from the filesystem * @example @@ -2415,6 +2416,13 @@ declare module '$app/server' { * @since 2.4.0 */ export function read(asset: string): Response; + /** + * Returns the current `RequestEvent`. Can be used inside `handle`, `load` and actions (and functions called by them). + * + * In environments without [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage), this must be called synchronously (i.e. not after an `await`). + * @since 2.20.0 + */ + export function getRequestEvent(): RequestEvent>, string | null>; export {}; } diff --git a/playgrounds/basic/src/routes/request-event/+page.server.ts b/playgrounds/basic/src/routes/request-event/+page.server.ts new file mode 100644 index 000000000000..e81bd63fc51e --- /dev/null +++ b/playgrounds/basic/src/routes/request-event/+page.server.ts @@ -0,0 +1,11 @@ +import { getRequestEvent } from '$app/server'; + +export async function load() { + await Promise.resolve(); + + const event = getRequestEvent(); + + return { + pathname: event.url.pathname + }; +} diff --git a/playgrounds/basic/src/routes/request-event/+page.svelte b/playgrounds/basic/src/routes/request-event/+page.svelte new file mode 100644 index 000000000000..8e3cefb98577 --- /dev/null +++ b/playgrounds/basic/src/routes/request-event/+page.svelte @@ -0,0 +1,5 @@ + + +

{data.pathname}

From ee214121cb0ae38824c29b25ab36ef48e754705b Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 17 Mar 2025 11:37:48 -0400 Subject: [PATCH 0999/1135] Version Packages (#13594) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/red-jokes-ring.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/red-jokes-ring.md diff --git a/.changeset/red-jokes-ring.md b/.changeset/red-jokes-ring.md deleted file mode 100644 index 6c04b45ee0dd..000000000000 --- a/.changeset/red-jokes-ring.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: add `getRequestEvent` to `$app/server` diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index a34dcfae31ff..42c321c1a739 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.0 +### Minor Changes + + +- feat: add `getRequestEvent` to `$app/server` ([#13582](https://github.com/sveltejs/kit/pull/13582)) + ## 2.19.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 23fbace37d66..eeac2831403e 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.19.2", + "version": "2.20.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 27bd82b0863f..8a2a232f345b 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.19.2'; +export const VERSION = '2.20.0'; From da8b5dc99e75374e9b2887a3d85d97d8a51a0514 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Tue, 18 Mar 2025 10:29:17 -0400 Subject: [PATCH 1000/1135] fix: avoid using top-level await (#13607) --- .changeset/nervous-islands-shave.md | 5 +++++ packages/kit/src/runtime/app/server/event.js | 15 +++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) create mode 100644 .changeset/nervous-islands-shave.md diff --git a/.changeset/nervous-islands-shave.md b/.changeset/nervous-islands-shave.md new file mode 100644 index 000000000000..6eaadb3bc266 --- /dev/null +++ b/.changeset/nervous-islands-shave.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: avoid using top-level await diff --git a/packages/kit/src/runtime/app/server/event.js b/packages/kit/src/runtime/app/server/event.js index ca727da5d96e..8b772e14ecfe 100644 --- a/packages/kit/src/runtime/app/server/event.js +++ b/packages/kit/src/runtime/app/server/event.js @@ -6,14 +6,13 @@ let request_event = null; /** @type {import('node:async_hooks').AsyncLocalStorage} */ let als; -try { - const hooks = await import('node:async_hooks'); - als = new hooks.AsyncLocalStorage(); -} catch { - // can't use AsyncLocalStorage, but can still call getRequestEvent synchronously. - // this isn't behind `supports` because it's basically just StackBlitz (i.e. - // in-browser usage) that doesn't support it AFAICT -} +import('node:async_hooks') + .then((hooks) => (als = new hooks.AsyncLocalStorage())) + .catch(() => { + // can't use AsyncLocalStorage, but can still call getRequestEvent synchronously. + // this isn't behind `supports` because it's basically just StackBlitz (i.e. + // in-browser usage) that doesn't support it AFAICT + }); /** * Returns the current `RequestEvent`. Can be used inside `handle`, `load` and actions (and functions called by them). From 55cc232ac0677ee31d02f21d4c3724102b6a1e8f Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 10:38:49 -0400 Subject: [PATCH 1001/1135] Version Packages (#13608) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/nervous-islands-shave.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/nervous-islands-shave.md diff --git a/.changeset/nervous-islands-shave.md b/.changeset/nervous-islands-shave.md deleted file mode 100644 index 6eaadb3bc266..000000000000 --- a/.changeset/nervous-islands-shave.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: avoid using top-level await diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 42c321c1a739..c28703e8d0fb 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.1 +### Patch Changes + + +- fix: avoid using top-level await ([#13607](https://github.com/sveltejs/kit/pull/13607)) + ## 2.20.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index eeac2831403e..151abe56b06e 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.0", + "version": "2.20.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 8a2a232f345b..9c65cb3afdc0 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.0'; +export const VERSION = '2.20.1'; From caf2bc50674f0701c0863e8d5b618fbebe4a8d7d Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 18 Mar 2025 11:57:01 -0400 Subject: [PATCH 1002/1135] chore: bump svelte (#13599) --- packages/adapter-static/package.json | 2 +- .../test/apps/prerendered/package.json | 2 +- .../adapter-static/test/apps/spa/package.json | 2 +- packages/enhanced-img/package.json | 2 +- packages/kit/package.json | 2 +- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- .../test/apps/hash-based-routing/package.json | 2 +- packages/kit/test/apps/no-ssr/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- .../prerendered-app-error-pages/package.json | 2 +- packages/kit/test/apps/writes/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../apps/private-dynamic-env/package.json | 2 +- .../package.json | 2 +- .../apps/private-static-env/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-folder/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-module/package.json | 2 +- .../package.json | 2 +- .../service-worker-private-env/package.json | 2 +- .../apps/syntax-error/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 2 +- .../test/prerendering/options/package.json | 2 +- .../test/prerendering/paths-base/package.json | 2 +- packages/package/package.json | 2 +- playgrounds/basic/package.json | 2 +- pnpm-lock.yaml | 368 +++++++++--------- 35 files changed, 221 insertions(+), 215 deletions(-) diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 77a66a9834c9..ab3e6ac81d43 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -44,7 +44,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "sirv": "^3.0.0", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "typescript": "^5.3.3", "vite": "^6.0.11" }, diff --git a/packages/adapter-static/test/apps/prerendered/package.json b/packages/adapter-static/test/apps/prerendered/package.json index 97dbdc3949a9..51df595c2b3b 100644 --- a/packages/adapter-static/test/apps/prerendered/package.json +++ b/packages/adapter-static/test/apps/prerendered/package.json @@ -12,7 +12,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "vite": "^6.0.11" }, "type": "module" diff --git a/packages/adapter-static/test/apps/spa/package.json b/packages/adapter-static/test/apps/spa/package.json index f265383b717b..f0e904150f90 100644 --- a/packages/adapter-static/test/apps/spa/package.json +++ b/packages/adapter-static/test/apps/spa/package.json @@ -13,7 +13,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "vite": "^6.0.11" }, "type": "module" diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 91c125e98851..159fde874159 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -46,7 +46,7 @@ "@types/estree": "^1.0.5", "@types/node": "^18.19.48", "rollup": "^4.27.4", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "typescript": "^5.6.3", "vite": "^6.0.11", "vitest": "^3.0.1" diff --git a/packages/kit/package.json b/packages/kit/package.json index 151abe56b06e..839bb7a1335f 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -38,7 +38,7 @@ "@types/set-cookie-parser": "^2.4.7", "dts-buddy": "^0.5.5", "rollup": "^4.14.2", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", "vite": "^6.0.11", diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index b2a9247c9b91..639d685be68d 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -18,7 +18,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", "dropcss": "^1.0.16", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index ce33b20dd9e1..3da0838951bf 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -20,7 +20,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index 927b13d6639b..078b0c47ee02 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -24,7 +24,7 @@ "e2e-test-dep-page-svelte": "file:./_test_dependencies/cjs-only", "e2e-test-dep-page-universal": "file:./_test_dependencies/cjs-only", "e2e-test-dep-server": "file:./_test_dependencies/cjs-only", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index cb4256a61991..7d4018b001f8 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -16,7 +16,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/hash-based-routing/package.json b/packages/kit/test/apps/hash-based-routing/package.json index dca93ac5ac1a..89ed83181efe 100644 --- a/packages/kit/test/apps/hash-based-routing/package.json +++ b/packages/kit/test/apps/hash-based-routing/package.json @@ -16,7 +16,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index 765ebb314dc9..d6a0f87f2802 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -16,7 +16,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index 2ccc8cb8f532..b786390c9eea 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -17,7 +17,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 4974a6fe3d53..0b30bdcd51fa 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -19,7 +19,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/prerendered-app-error-pages/package.json b/packages/kit/test/apps/prerendered-app-error-pages/package.json index 0bc92bb67968..f3a7e7036d21 100644 --- a/packages/kit/test/apps/prerendered-app-error-pages/package.json +++ b/packages/kit/test/apps/prerendered-app-error-pages/package.json @@ -18,7 +18,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index 5fa4dd93d654..c4aa7f7ea77e 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -16,7 +16,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index 2866ca4ccbfc..3d3078348793 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -13,7 +13,7 @@ "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index 2866ca4ccbfc..3d3078348793 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -13,7 +13,7 @@ "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index 497158c7c610..117d1e83ee2e 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -13,7 +13,7 @@ "@sveltejs/adapter-auto": "workspace:^", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index 60a837ad906a..5e0da74b7cab 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index 715ffb1f708e..060db892bc20 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index 46b54337afdf..d7a5e58919bd 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index c84a5acd95d3..679a5ec2a8be 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -14,7 +14,7 @@ "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "cross-env": "^7.0.3", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index b69abaef5222..c4ad4ab9b5a3 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index bb63d0badfc5..38b229b88872 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index 0067f7f5d7de..108c55f49ed2 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index 8835d696aa4a..f37f38b721db 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index 5bbcc1ba1faa..3d56d865eeb1 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index 0f8adf3a1a1f..70b5ec524bf1 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index 5ab8604383b5..a930900ccc57 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -11,7 +11,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11" diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index 48bd614e913d..5a96a5e2711f 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11", diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index 8b2de283d8a3..6dc858250520 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11", diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index fb7ad38e5750..ac97df18a409 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -12,7 +12,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", "vite": "^6.0.11", diff --git a/packages/package/package.json b/packages/package/package.json index ccabb095ae38..da4f7b5af74a 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -31,7 +31,7 @@ "@types/node": "^18.19.48", "@types/semver": "^7.5.6", "prettier": "^3.1.1", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", "uvu": "^0.5.6" diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index e6fecc6caf1f..a36379053856 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -30,7 +30,7 @@ "prettier": "^3.3.2", "prettier-plugin-svelte": "^3.2.6", "publint": "^0.3.0", - "svelte": "^5.2.9", + "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.0", "vite": "^6.0.11" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 0bcec284423d..9ba706f70711 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -13,7 +13,7 @@ importers: version: 2.27.11 '@sveltejs/eslint-config': specifier: ^8.1.0 - version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) + version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) '@svitejs/changesets-changelog-github-compact': specifier: ^1.1.0 version: 1.1.0 @@ -28,7 +28,7 @@ importers: version: 3.3.3 prettier-plugin-svelte: specifier: ^3.1.2 - version: 3.2.7(prettier@3.3.3)(svelte@5.2.9) + version: 3.2.7(prettier@3.3.3)(svelte@5.23.1) typescript-eslint: specifier: ^8.24.0 version: 8.26.0(eslint@9.6.0)(typescript@5.6.3) @@ -44,7 +44,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -137,7 +137,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -177,7 +177,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -204,7 +204,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -212,8 +212,8 @@ importers: specifier: ^3.0.0 version: 3.0.0 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 typescript: specifier: ^5.3.3 version: 5.6.3 @@ -228,13 +228,13 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 vite: specifier: ^6.0.11 version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) @@ -249,13 +249,13 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 vite: specifier: ^6.0.11 version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) @@ -274,7 +274,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -307,7 +307,7 @@ importers: version: 0.33.5 svelte-parse-markup: specifier: ^0.1.5 - version: 0.1.5(svelte@5.2.9) + version: 0.1.5(svelte@5.23.1) vite-imagetools: specifier: ^7.0.1 version: 7.0.1(rollup@4.30.1) @@ -325,8 +325,8 @@ importers: specifier: ^4.27.4 version: 4.30.1 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 typescript: specifier: ^5.6.3 version: 5.6.3 @@ -378,7 +378,7 @@ importers: version: 1.44.1 '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/connect': specifier: ^3.4.38 version: 3.4.38 @@ -395,11 +395,11 @@ importers: specifier: ^4.14.2 version: 4.30.1 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-preprocess: specifier: ^6.0.0 - version: 6.0.0(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(svelte@5.2.9)(typescript@5.6.3) + version: 6.0.0(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.3.3 version: 5.6.3 @@ -420,7 +420,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -428,11 +428,11 @@ importers: specifier: ^1.0.16 version: 1.0.16 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -447,16 +447,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -471,7 +471,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -506,11 +506,11 @@ importers: specifier: file:./_test_dependencies/cjs-only version: e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -525,16 +525,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -549,16 +549,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -573,16 +573,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -600,16 +600,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -627,16 +627,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -651,16 +651,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -675,16 +675,16 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -708,13 +708,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -732,13 +732,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -756,13 +756,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -777,13 +777,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -798,13 +798,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -819,16 +819,16 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -843,13 +843,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -864,13 +864,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -885,13 +885,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -906,13 +906,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -927,13 +927,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -948,13 +948,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -969,13 +969,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -990,13 +990,13 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -1011,13 +1011,13 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -1035,13 +1035,13 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -1059,13 +1059,13 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.4 version: 5.6.3 @@ -1092,11 +1092,11 @@ importers: version: 7.7.1 svelte2tsx: specifier: ~0.7.33 - version: 0.7.33(svelte@5.2.9)(typescript@5.6.3) + version: 0.7.33(svelte@5.23.1)(typescript@5.6.3) devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1107,11 +1107,11 @@ importers: specifier: ^3.1.1 version: 3.3.3 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-preprocess: specifier: ^6.0.0 - version: 6.0.0(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(svelte@5.2.9)(typescript@5.6.3) + version: 6.0.0(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.3.3 version: 5.6.3 @@ -1156,22 +1156,22 @@ importers: version: link:../../packages/package '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) prettier: specifier: ^3.3.2 version: 3.3.3 prettier-plugin-svelte: specifier: ^3.2.6 - version: 3.2.7(prettier@3.3.3)(svelte@5.2.9) + version: 3.2.7(prettier@3.3.3)(svelte@5.23.1) publint: specifier: ^0.3.0 version: 0.3.0 svelte: - specifier: ^5.2.9 - version: 5.2.9 + specifier: ^5.23.1 + version: 5.23.1 svelte-check: specifier: ^4.1.1 - version: 4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3) + version: 4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3) typescript: specifier: ^5.5.0 version: 5.6.3 @@ -1823,6 +1823,11 @@ packages: peerDependencies: eslint: '>=8.40.0' + '@sveltejs/acorn-typescript@1.0.5': + resolution: {integrity: sha512-IwQk4yfwLdibDlrXVE04jTZYlLnwsTT2PIOQQGNLWfjavGifnk1JD1LcZjZaBTRcxZu2FfPfNLOE04DSu9lqtQ==} + peerDependencies: + acorn: ^8.9.0 + '@sveltejs/eslint-config@8.1.0': resolution: {integrity: sha512-cfgp4lPREYBjNd4ZzaP/jA85ufm7vfXiaV7h9vILXNogne80IbZRNhRCQ8XoOqTAOY/pChIzWTBuR8aDNMbAEA==} peerDependencies: @@ -2006,11 +2011,6 @@ packages: peerDependencies: acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 - acorn-typescript@1.4.13: - resolution: {integrity: sha512-xsc9Xv0xlVfwp2o7sQ+GCQ1PgbkdcpWdTzrwXxO3xDMTAywVS3oXVOcOHuRjAPkS4P9b+yc/qNF15460v+jp4Q==} - peerDependencies: - acorn: '>=8.9.0' - acorn-walk@8.3.2: resolution: {integrity: sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==} engines: {node: '>=0.4.0'} @@ -2138,6 +2138,10 @@ packages: resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} engines: {node: '>=8'} + clsx@2.1.1: + resolution: {integrity: sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==} + engines: {node: '>=6'} + color-convert@2.0.1: resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} engines: {node: '>=7.0.0'} @@ -2368,8 +2372,8 @@ packages: resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} engines: {node: '>=0.10'} - esrap@1.2.2: - resolution: {integrity: sha512-F2pSJklxx1BlQIQgooczXCPHmcWpn6EsP5oo73LQfonG9fIlIENQ8vMmfGXeojP9MrkzUNAfyU5vdFlR9shHAw==} + esrap@1.4.5: + resolution: {integrity: sha512-CjNMjkBWWZeHn+VX+gS8YvFwJ5+NDhg8aWZBSFJPR8qQduDNjbJodA2WcwCm7uQa5Rjqj+nZvVmceg1RbHFB9g==} esrecurse@4.3.0: resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} @@ -3235,8 +3239,8 @@ packages: svelte: ^3.55 || ^4.0.0-next.0 || ^4.0 || ^5.0.0-next.0 typescript: ^4.9.4 || ^5.0.0 - svelte@5.2.9: - resolution: {integrity: sha512-LjO7R6K8FI8dA3l+4CcsbJ3djIe2TtokHGzfpDTro5g8nworMbTz9alCR95EQXGsqlzIAvqJtZ7Yy0o33lL09Q==} + svelte@5.23.1: + resolution: {integrity: sha512-DUu3e5tQDO+PtKffjqJ548YfeKtw2Rqc9/+nlP26DZ0AopWTJNylkNnTOP/wcgIt1JSnovyISxEZ/lDR1OhbOw==} engines: {node: '>=18'} tapable@2.2.1: @@ -4122,34 +4126,38 @@ snapshots: eslint-visitor-keys: 4.2.0 espree: 10.3.0 - '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': + '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': + dependencies: + acorn: 8.14.1 + + '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3)': dependencies: '@stylistic/eslint-plugin-js': 2.1.0(eslint@9.6.0) eslint: 9.6.0 eslint-config-prettier: 9.1.0(eslint@9.6.0) eslint-plugin-n: 17.16.1(eslint@9.6.0)(typescript@5.6.3) - eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.2.9) + eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.23.1) globals: 15.15.0 typescript: 5.6.3 typescript-eslint: 8.26.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 - svelte: 5.2.9 + svelte: 5.23.1 vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.2.9)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 - svelte: 5.2.9 + svelte: 5.23.1 vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) vitefu: 1.0.4(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) transitivePeerDependencies: @@ -4378,10 +4386,6 @@ snapshots: dependencies: acorn: 8.14.1 - acorn-typescript@1.4.13(acorn@8.14.1): - dependencies: - acorn: 8.14.1 - acorn-walk@8.3.2: {} acorn@8.14.0: {} @@ -4483,6 +4487,8 @@ snapshots: ci-info@3.9.0: {} + clsx@2.1.1: {} + color-convert@2.0.1: dependencies: color-name: 1.1.4 @@ -4657,7 +4663,7 @@ snapshots: - supports-color - typescript - eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.2.9): + eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1): dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 @@ -4670,9 +4676,9 @@ snapshots: postcss-safe-parser: 6.0.0(postcss@8.5.3) postcss-selector-parser: 6.1.2 semver: 7.7.1 - svelte-eslint-parser: 0.39.2(svelte@5.2.9) + svelte-eslint-parser: 0.39.2(svelte@5.23.1) optionalDependencies: - svelte: 5.2.9 + svelte: 5.23.1 transitivePeerDependencies: - ts-node @@ -4749,10 +4755,9 @@ snapshots: dependencies: estraverse: 5.3.0 - esrap@1.2.2: + esrap@1.4.5: dependencies: '@jridgewell/sourcemap-codec': 1.5.0 - '@types/estree': 1.0.6 esrecurse@4.3.0: dependencies: @@ -5275,10 +5280,10 @@ snapshots: prelude-ls@1.2.1: {} - prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.2.9): + prettier-plugin-svelte@3.2.7(prettier@3.3.3)(svelte@5.23.1): dependencies: prettier: 3.3.3 - svelte: 5.2.9 + svelte: 5.23.1 prettier@2.8.8: {} @@ -5484,19 +5489,19 @@ snapshots: supports-preserve-symlinks-flag@1.0.0: {} - svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.2.9)(typescript@5.6.3): + svelte-check@4.1.1(picomatch@4.0.2)(svelte@5.23.1)(typescript@5.6.3): dependencies: '@jridgewell/trace-mapping': 0.3.25 chokidar: 4.0.3 fdir: 6.4.3(picomatch@4.0.2) picocolors: 1.1.1 sade: 1.8.1 - svelte: 5.2.9 + svelte: 5.23.1 typescript: 5.6.3 transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.39.2(svelte@5.2.9): + svelte-eslint-parser@0.39.2(svelte@5.23.1): dependencies: eslint-scope: 7.2.2 eslint-visitor-keys: 3.4.3 @@ -5504,40 +5509,41 @@ snapshots: postcss: 8.5.3 postcss-scss: 4.0.9(postcss@8.5.3) optionalDependencies: - svelte: 5.2.9 + svelte: 5.23.1 - svelte-parse-markup@0.1.5(svelte@5.2.9): + svelte-parse-markup@0.1.5(svelte@5.23.1): dependencies: - svelte: 5.2.9 + svelte: 5.23.1 - svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(svelte@5.2.9)(typescript@5.6.3): + svelte-preprocess@6.0.0(postcss-load-config@3.1.4(postcss@8.5.3))(postcss@8.5.3)(svelte@5.23.1)(typescript@5.6.3): dependencies: detect-indent: 6.1.0 strip-indent: 3.0.0 - svelte: 5.2.9 + svelte: 5.23.1 optionalDependencies: postcss: 8.5.3 postcss-load-config: 3.1.4(postcss@8.5.3) typescript: 5.6.3 - svelte2tsx@0.7.33(svelte@5.2.9)(typescript@5.6.3): + svelte2tsx@0.7.33(svelte@5.23.1)(typescript@5.6.3): dependencies: dedent-js: 1.0.1 pascal-case: 3.1.2 - svelte: 5.2.9 + svelte: 5.23.1 typescript: 5.6.3 - svelte@5.2.9: + svelte@5.23.1: dependencies: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 + '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) '@types/estree': 1.0.6 acorn: 8.14.1 - acorn-typescript: 1.4.13(acorn@8.14.1) aria-query: 5.3.2 axobject-query: 4.1.0 + clsx: 2.1.1 esm-env: 1.2.2 - esrap: 1.2.2 + esrap: 1.4.5 is-reference: 3.0.3 locate-character: 3.0.0 magic-string: 0.30.17 From 770a7eb6e98bbdcd71d791be5f49c4114ce7f615 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 18 Mar 2025 09:07:04 -0700 Subject: [PATCH 1003/1135] chore(deps): update pnpm to v10.6.4 (#13595) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index c26c82c09ec1..f4a585a29940 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.24.0" }, - "packageManager": "pnpm@10.6.3", + "packageManager": "pnpm@10.6.4", "engines": { "pnpm": ">=9.0.0" }, From d0b41eec0df9eb66660031940729eabfa5ec375a Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Wed, 19 Mar 2025 08:00:04 -0400 Subject: [PATCH 1004/1135] chore: tidy up walk logic in enhanced-img (#13600) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- packages/enhanced-img/src/preprocessor.js | 37 +++++++++-------------- 1 file changed, 14 insertions(+), 23 deletions(-) diff --git a/packages/enhanced-img/src/preprocessor.js b/packages/enhanced-img/src/preprocessor.js index eef343b2dda0..3f46ba43a768 100644 --- a/packages/enhanced-img/src/preprocessor.js +++ b/packages/enhanced-img/src/preprocessor.js @@ -127,31 +127,22 @@ export function image(opts) { */ const pending_ast_updates = []; - walk( - /** @type {import('svelte/compiler').AST.Root} */ (ast), - {}, - { - _(_, { next }) { - next(); - }, - /** @param {import('svelte/compiler').AST.RegularElement} node */ - // @ts-ignore - RegularElement(node, { next }) { - if ('name' in node && node.name === 'enhanced:img') { - // Compare node tag match - const src = get_attr_value(node, 'src'); - - if (!src || typeof src === 'boolean') return; - - pending_ast_updates.push(update_element(node, src)); - - return; - } - - next(); + walk(/** @type {import('svelte/compiler').AST.TemplateNode} */ (ast), null, { + RegularElement(node, { next }) { + if ('name' in node && node.name === 'enhanced:img') { + // Compare node tag match + const src = get_attr_value(node, 'src'); + + if (!src || typeof src === 'boolean') return; + + pending_ast_updates.push(update_element(node, src)); + + return; } + + next(); } - ); + }); await Promise.all(pending_ast_updates); From a9611fa808dc566954471915575ef4d2bc666b0d Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 19 Mar 2025 11:47:25 -0700 Subject: [PATCH 1005/1135] chore(deps): bump @babel/runtime to address dependabot warning --- pnpm-lock.yaml | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9ba706f70711..fb5fae117180 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1189,8 +1189,8 @@ packages: resolution: {integrity: sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==} engines: {node: '>=6.0.0'} - '@babel/runtime@7.24.4': - resolution: {integrity: sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==} + '@babel/runtime@7.26.10': + resolution: {integrity: sha512-2WJMeRQPHKSPemqk/awGrAiuFfzBmOIPXKizAsVhWH9YJqLZ0H+HS4c8loHGgW6utJ3E/ejXQUsiGaQy2NZ9Fw==} engines: {node: '>=6.9.0'} '@changesets/apply-release-plan@7.0.7': @@ -3540,7 +3540,7 @@ snapshots: '@jridgewell/gen-mapping': 0.3.5 '@jridgewell/trace-mapping': 0.3.25 - '@babel/runtime@7.24.4': + '@babel/runtime@7.26.10': dependencies: regenerator-runtime: 0.14.1 @@ -3964,14 +3964,14 @@ snapshots: '@manypkg/find-root@1.1.0': dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.26.10 '@types/node': 12.20.55 find-up: 4.1.0 fs-extra: 8.1.0 '@manypkg/get-packages@1.1.3': dependencies: - '@babel/runtime': 7.24.4 + '@babel/runtime': 7.26.10 '@changesets/types': 4.1.0 '@manypkg/find-root': 1.1.0 fs-extra: 8.1.0 From 6e8583137a7236186816e9865048bc9aaab181f6 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 20 Mar 2025 09:33:13 +0800 Subject: [PATCH 1006/1135] fix: write server files to `_worker.js/` directory (#13610) * write server to _worker.js directory * add changeset --- .changeset/shy-knives-matter.md | 5 +++++ packages/adapter-cloudflare/index.js | 20 +++++++++----------- 2 files changed, 14 insertions(+), 11 deletions(-) create mode 100644 .changeset/shy-knives-matter.md diff --git a/.changeset/shy-knives-matter.md b/.changeset/shy-knives-matter.md new file mode 100644 index 000000000000..e002ab6af510 --- /dev/null +++ b/.changeset/shy-knives-matter.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: write server files to the cloudflare build directory diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index ceac64d92a2a..c1554216895b 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -10,19 +10,18 @@ export default function (options = {}) { async adapt(builder) { if (existsSync('_routes.json')) { throw new Error( - 'Cloudflare routes should be configured in svelte.config.js rather than _routes.json' + "Cloudflare's _routes.json should be configured in svelte.config.js. See https://svelte.dev/docs/kit/adapter-cloudflare#Options-routes" ); } const files = fileURLToPath(new URL('./files', import.meta.url).href); const dest = builder.getBuildDirectory('cloudflare'); - const tmp = builder.getBuildDirectory('cloudflare-tmp'); + const worker_dest = `${dest}/_worker.js`; builder.rimraf(dest); - builder.rimraf(tmp); builder.mkdirp(dest); - builder.mkdirp(tmp); + builder.mkdirp(worker_dest); // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page const fallback = path.join(dest, '404.html'); @@ -35,12 +34,11 @@ export default function (options = {}) { const dest_dir = `${dest}${builder.config.kit.paths.base}`; const written_files = builder.writeClient(dest_dir); builder.writePrerendered(dest_dir); - - const relativePath = path.posix.relative(dest, builder.getServerDirectory()); + builder.writeServer(`${worker_dest}/server`); writeFileSync( - `${tmp}/manifest.js`, - `export const manifest = ${builder.generateManifest({ relativePath })};\n\n` + + `${worker_dest}/manifest.js`, + `export const manifest = ${builder.generateManifest({ relativePath: './server' })};\n\n` + `export const prerendered = new Set(${JSON.stringify(builder.prerendered.paths)});\n\n` + `export const base_path = ${JSON.stringify(builder.config.kit.paths.base)};\n` ); @@ -60,10 +58,10 @@ export default function (options = {}) { writeFileSync(`${dest}/.assetsignore`, generate_assetsignore(), { flag: 'a' }); - builder.copy(`${files}/worker.js`, `${dest}/_worker.js`, { + builder.copy(`${files}/worker.js`, `${worker_dest}/index.js`, { replace: { - SERVER: `${relativePath}/index.js`, - MANIFEST: `${path.posix.relative(dest, tmp)}/manifest.js` + SERVER: './server/index.js', + MANIFEST: './manifest.js' } }); }, From da7b82e69f38f4c1eaeab34cdb9682feaf57e57e Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 20 Mar 2025 17:26:26 +0800 Subject: [PATCH 1007/1135] fix: copy `_headers` and `_redirects` from project root instead of `/static` (#13227) * docs * fix * fix again * add service worker link * grammar * try to fix docs deployment * copy files from project root instead of /static * Update .changeset/few-apricots-study.md * add error message to netlify adapter --- .changeset/afraid-rules-fold.md | 5 +++++ .changeset/few-apricots-study.md | 5 +++++ .../60-adapter-cloudflare.md | 2 +- .../25-build-and-deploy/80-adapter-netlify.md | 4 ++++ packages/adapter-cloudflare/index.js | 22 ++++++++++++++++++- packages/adapter-netlify/index.js | 20 +++++++++++++---- 6 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 .changeset/afraid-rules-fold.md create mode 100644 .changeset/few-apricots-study.md diff --git a/.changeset/afraid-rules-fold.md b/.changeset/afraid-rules-fold.md new file mode 100644 index 000000000000..b7316c01d4af --- /dev/null +++ b/.changeset/afraid-rules-fold.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-netlify': major +--- + +fix: error if the `_headers` and `_redirects` files are in the `/static` directory instead of the project root diff --git a/.changeset/few-apricots-study.md b/.changeset/few-apricots-study.md new file mode 100644 index 000000000000..3f2f8ec6e6ef --- /dev/null +++ b/.changeset/few-apricots-study.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': major +--- + +fix: copy the `_headers` and `_redirects` files from the project root instead of the `/static` directory diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index d603c4943b8a..c963795b61da 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -111,7 +111,7 @@ For testing the build, you should use [Wrangler](https://developers.cloudflare.c Functions contained in the [`/functions` directory](https://developers.cloudflare.com/pages/functions/routing/) at the project's root will _not_ be included in the deployment. Instead, functions should be implemented as [server endpoints](routing#server) in your SvelteKit app, which is compiled to a [single `_worker.js` file](https://developers.cloudflare.com/pages/functions/advanced-mode/). -The [`_headers`](https://developers.cloudflare.com/pages/configuration/headers/) and [`_redirects`](https://developers.cloudflare.com/pages/configuration/redirects/) files specific to Cloudflare Pages can be used for static asset responses (like images) by putting them into the `/static` folder. +The [`_headers`](https://developers.cloudflare.com/pages/configuration/headers/) and [`_redirects`](https://developers.cloudflare.com/pages/configuration/redirects/) files specific to Cloudflare Pages can be used for static asset responses (like images) by putting them into the project root folder. However, they will have no effect on responses dynamically rendered by SvelteKit, which should return custom headers or redirect responses from [server endpoints](routing#server) or with the [`handle`](hooks#Server-hooks-handle) hook. diff --git a/documentation/docs/25-build-and-deploy/80-adapter-netlify.md b/documentation/docs/25-build-and-deploy/80-adapter-netlify.md index ccba74650895..75f2203df301 100644 --- a/documentation/docs/25-build-and-deploy/80-adapter-netlify.md +++ b/documentation/docs/25-build-and-deploy/80-adapter-netlify.md @@ -70,6 +70,10 @@ export default { You may build your app using functionality provided directly by SvelteKit without relying on any Netlify functionality. Using the SvelteKit versions of these features will allow them to be used in dev mode, tested with integration tests, and to work with other adapters should you ever decide to switch away from Netlify. However, in some scenarios you may find it beneficial to use the Netlify versions of these features. One example would be if you're migrating an app that's already hosted on Netlify to SvelteKit. +### `_headers` and `_redirects` + +The [`_headers`](https://docs.netlify.com/routing/headers/#syntax-for-the-headers-file) and [`_redirects`](https://docs.netlify.com/routing/redirects/redirect-options/) files specific to Netlify can be used for static asset responses (like images) by putting them into the project root folder. + ### Redirect rules During compilation, redirect rules are automatically appended to your `_redirects` file. (If it doesn't exist yet, it will be created.) That means: diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index c1554216895b..b819e7efbf8b 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -1,4 +1,4 @@ -import { existsSync, writeFileSync } from 'node:fs'; +import { copyFileSync, existsSync, writeFileSync } from 'node:fs'; import * as path from 'node:path'; import { fileURLToPath } from 'node:url'; import { getPlatformProxy } from 'wrangler'; @@ -14,6 +14,18 @@ export default function (options = {}) { ); } + if (existsSync(`${builder.config.kit.files.assets}/_headers`)) { + throw new Error( + `The _headers file should be placed in the project root rather than the ${builder.config.kit.files.assets} directory` + ); + } + + if (existsSync(`${builder.config.kit.files.assets}/_redirects`)) { + throw new Error( + `The _redirects file should be placed in the project root rather than the ${builder.config.kit.files.assets} directory` + ); + } + const files = fileURLToPath(new URL('./files', import.meta.url).href); const dest = builder.getBuildDirectory('cloudflare'); const worker_dest = `${dest}/_worker.js`; @@ -48,8 +60,16 @@ export default function (options = {}) { JSON.stringify(get_routes_json(builder, written_files, options.routes ?? {}), null, '\t') ); + if (existsSync('_headers')) { + copyFileSync('_headers', `${dest}/_headers`); + } + writeFileSync(`${dest}/_headers`, generate_headers(builder.getAppPath()), { flag: 'a' }); + if (existsSync('_redirects')) { + copyFileSync('_redirects', `${dest}/_redirects`); + } + if (builder.prerendered.redirects.size > 0) { writeFileSync(`${dest}/_redirects`, generate_redirects(builder.prerendered.redirects), { flag: 'a' diff --git a/packages/adapter-netlify/index.js b/packages/adapter-netlify/index.js index a405702118e6..348ebdea52b7 100644 --- a/packages/adapter-netlify/index.js +++ b/packages/adapter-netlify/index.js @@ -55,6 +55,18 @@ export default function ({ split = false, edge = edge_set_in_env_var } = {}) { ); } + if (existsSync(`${builder.config.kit.files.assets}/_headers`)) { + throw new Error( + `The _headers file should be placed in the project root rather than the ${builder.config.kit.files.assets} directory` + ); + } + + if (existsSync(`${builder.config.kit.files.assets}/_redirects`)) { + throw new Error( + `The _redirects file should be placed in the project root rather than the ${builder.config.kit.files.assets} directory` + ); + } + const netlify_config = get_netlify_config(); // "build" is the default publish directory when Netlify detects SvelteKit @@ -298,12 +310,12 @@ function generate_lambda_functions({ builder, publish, split }) { // so that generated redirects are appended to custom redirects // rather than replaced by them builder.log.minor('Writing redirects...'); - const redirect_file = join(publish, '_redirects'); + const redirects_file = join(publish, '_redirects'); if (existsSync('_redirects')) { - builder.copy('_redirects', redirect_file); + builder.copy('_redirects', redirects_file); } - builder.mkdirp(dirname(redirect_file)); - appendFileSync(redirect_file, `\n\n${redirects.join('\n')}`); + builder.mkdirp(dirname(redirects_file)); + appendFileSync(redirects_file, `\n\n${redirects.join('\n')}`); } function get_netlify_config() { From 6fd4a1e0dea74059ca22a0f8500cd16c17f7aac6 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 20 Mar 2025 20:04:57 +0800 Subject: [PATCH 1008/1135] feat: update Cloudflare and Netlify adapter major versions (#13615) --- .changeset/shaggy-rats-laugh.md | 5 +++++ packages/adapter-auto/adapters.js | 4 ++-- 2 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 .changeset/shaggy-rats-laugh.md diff --git a/.changeset/shaggy-rats-laugh.md b/.changeset/shaggy-rats-laugh.md new file mode 100644 index 000000000000..0bdb2365a75d --- /dev/null +++ b/.changeset/shaggy-rats-laugh.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-auto': major +--- + +feat: update Netlify and Cloudflare Pages major versions diff --git a/packages/adapter-auto/adapters.js b/packages/adapter-auto/adapters.js index 6bb2bb943e8b..58fb79eb63f3 100644 --- a/packages/adapter-auto/adapters.js +++ b/packages/adapter-auto/adapters.js @@ -13,13 +13,13 @@ export const adapters = [ name: 'Cloudflare Pages', test: () => !!process.env.CF_PAGES, module: '@sveltejs/adapter-cloudflare', - version: '5' + version: '6' }, { name: 'Netlify', test: () => !!process.env.NETLIFY, module: '@sveltejs/adapter-netlify', - version: '4' + version: '5' }, { name: 'Azure Static Web Apps', From 4261e28785cb3e8016451b0b36ce8e193886e8aa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 20 Mar 2025 13:08:42 +0100 Subject: [PATCH 1009/1135] Version Packages (#13613) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/afraid-rules-fold.md | 5 ----- .changeset/few-apricots-study.md | 5 ----- .changeset/shaggy-rats-laugh.md | 5 ----- .changeset/shy-knives-matter.md | 5 ----- packages/adapter-auto/CHANGELOG.md | 6 ++++++ packages/adapter-auto/package.json | 2 +- packages/adapter-cloudflare/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/CHANGELOG.md | 6 ++++++ packages/adapter-netlify/package.json | 2 +- 10 files changed, 27 insertions(+), 23 deletions(-) delete mode 100644 .changeset/afraid-rules-fold.md delete mode 100644 .changeset/few-apricots-study.md delete mode 100644 .changeset/shaggy-rats-laugh.md delete mode 100644 .changeset/shy-knives-matter.md diff --git a/.changeset/afraid-rules-fold.md b/.changeset/afraid-rules-fold.md deleted file mode 100644 index b7316c01d4af..000000000000 --- a/.changeset/afraid-rules-fold.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-netlify': major ---- - -fix: error if the `_headers` and `_redirects` files are in the `/static` directory instead of the project root diff --git a/.changeset/few-apricots-study.md b/.changeset/few-apricots-study.md deleted file mode 100644 index 3f2f8ec6e6ef..000000000000 --- a/.changeset/few-apricots-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': major ---- - -fix: copy the `_headers` and `_redirects` files from the project root instead of the `/static` directory diff --git a/.changeset/shaggy-rats-laugh.md b/.changeset/shaggy-rats-laugh.md deleted file mode 100644 index 0bdb2365a75d..000000000000 --- a/.changeset/shaggy-rats-laugh.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-auto': major ---- - -feat: update Netlify and Cloudflare Pages major versions diff --git a/.changeset/shy-knives-matter.md b/.changeset/shy-knives-matter.md deleted file mode 100644 index e002ab6af510..000000000000 --- a/.changeset/shy-knives-matter.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -fix: write server files to the cloudflare build directory diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index 13a7e071642e..829946b2e48f 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-auto +## 5.0.0 +### Major Changes + + +- feat: update Netlify and Cloudflare Pages major versions ([#13615](https://github.com/sveltejs/kit/pull/13615)) + ## 4.0.0 ### Major Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index d3930a91865c..f92ae66ecc77 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-auto", - "version": "4.0.0", + "version": "5.0.0", "description": "Automatically chooses the SvelteKit adapter for your current environment, if possible.", "keywords": [ "adapter", diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 366c4365c275..abca3a87df0a 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare +## 6.0.0 +### Major Changes + + +- fix: copy the `_headers` and `_redirects` files from the project root instead of the `/static` directory ([#13227](https://github.com/sveltejs/kit/pull/13227)) + + +### Patch Changes + + +- fix: write server files to the cloudflare build directory ([#13610](https://github.com/sveltejs/kit/pull/13610)) + ## 5.1.0 ### Minor Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index e2412209c324..025bbf5b335c 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "5.1.0", + "version": "6.0.0", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/adapter-netlify/CHANGELOG.md b/packages/adapter-netlify/CHANGELOG.md index f9c7c894ef3e..5fa5a64b3fd1 100644 --- a/packages/adapter-netlify/CHANGELOG.md +++ b/packages/adapter-netlify/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-netlify +## 5.0.0 +### Major Changes + + +- fix: error if the `_headers` and `_redirects` files are in the `/static` directory instead of the project root ([#13227](https://github.com/sveltejs/kit/pull/13227)) + ## 4.4.2 ### Patch Changes diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 5d348330663c..cdd966df59c9 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-netlify", - "version": "4.4.2", + "version": "5.0.0", "description": "A SvelteKit adapter that creates a Netlify app", "keywords": [ "adapter", From c9198a3a11a75fb249b9dc29a2c94677dd2a17b6 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Fri, 21 Mar 2025 10:51:24 +0100 Subject: [PATCH 1010/1135] fix: allow non-prerendered API endpoint calls during reroute when prerendering (#13616) * fix: allow non-prerendered API endpoint calls during reroute when prerendering * test * tweak * fix other prerendering bug * lint --- .changeset/khaki-buttons-add.md | 5 ++++ packages/kit/src/runtime/server/endpoint.js | 27 ++++++++++++++----- packages/kit/src/runtime/server/respond.js | 11 +++++++- packages/kit/src/types/internal.d.ts | 2 ++ packages/kit/test/apps/basics/src/hooks.js | 4 +++ .../reroute/api/[prerendered]/+server.ts | 9 +++++++ .../src/routes/reroute/async/+page.svelte | 3 +++ .../basics/src/routes/reroute/async/+page.ts | 3 +++ .../kit/test/apps/basics/svelte.config.js | 8 +++++- .../kit/test/apps/basics/test/client.test.js | 8 ++++++ .../kit/test/apps/basics/test/server.test.js | 7 +++++ 11 files changed, 78 insertions(+), 9 deletions(-) create mode 100644 .changeset/khaki-buttons-add.md create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/api/[prerendered]/+server.ts create mode 100644 packages/kit/test/apps/basics/src/routes/reroute/async/+page.ts diff --git a/.changeset/khaki-buttons-add.md b/.changeset/khaki-buttons-add.md new file mode 100644 index 000000000000..ba543c9fa850 --- /dev/null +++ b/.changeset/khaki-buttons-add.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: allow non-prerendered API endpoint calls during reroute when prerendering diff --git a/packages/kit/src/runtime/server/endpoint.js b/packages/kit/src/runtime/server/endpoint.js index 417fa8e9fb95..96f3913c01ed 100644 --- a/packages/kit/src/runtime/server/endpoint.js +++ b/packages/kit/src/runtime/server/endpoint.js @@ -29,7 +29,7 @@ export async function render_endpoint(event, mod, state) { throw new Error('Cannot prerender endpoints that have mutative methods'); } - if (state.prerendering && !prerender) { + if (state.prerendering && !state.prerendering.inside_reroute && !prerender) { if (state.depth > 0) { // if request came from a prerendered page, bail throw new Error(`${event.route.id} is not prerenderable`); @@ -41,7 +41,7 @@ export async function render_endpoint(event, mod, state) { } try { - let response = await with_event(event, () => + const response = await with_event(event, () => handler(/** @type {import('@sveltejs/kit').RequestEvent>} */ (event)) ); @@ -51,15 +51,28 @@ export async function render_endpoint(event, mod, state) { ); } - if (state.prerendering) { - // the returned Response might have immutable Headers - // so we should clone them before trying to mutate them - response = new Response(response.body, { + if (state.prerendering && (!state.prerendering.inside_reroute || prerender)) { + // The returned Response might have immutable Headers + // so we should clone them before trying to mutate them. + // We also need to clone the response body since it may be read twice during prerendering + const cloned = new Response(response.clone().body, { status: response.status, statusText: response.statusText, headers: new Headers(response.headers) }); - response.headers.set('x-sveltekit-prerender', String(prerender)); + cloned.headers.set('x-sveltekit-prerender', String(prerender)); + + if (state.prerendering.inside_reroute && prerender) { + // Without this, the route wouldn't be recorded as prerendered, + // because there's nothing after reroute that would do that. + cloned.headers.set( + 'x-sveltekit-routeid', + encodeURI(/** @type {string} */ (event.route.id)) + ); + state.prerendering.dependencies.set(event.url.pathname, { response: cloned, body: null }); + } else { + return cloned; + } } return response; diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 812ef3df7a69..81b30e0756a5 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -183,7 +183,12 @@ export async function respond(request, options, manifest, state) { let resolved_path; + const prerendering_reroute_state = state.prerendering?.inside_reroute; try { + // For the duration or a reroute, disable the prerendering state as reroute could call API endpoints + // which would end up in the wrong logic path if not disabled. + if (state.prerendering) state.prerendering.inside_reroute = true; + // reroute could alter the given URL, so we pass a copy resolved_path = (await options.hooks.reroute({ url: new URL(url), fetch: event.fetch })) ?? url.pathname; @@ -191,6 +196,8 @@ export async function respond(request, options, manifest, state) { return text('Internal Server Error', { status: 500 }); + } finally { + if (state.prerendering) state.prerendering.inside_reroute = prerendering_reroute_state; } try { @@ -349,7 +356,9 @@ export async function respond(request, options, manifest, state) { set_trailing_slash(trailing_slash); - if (state.prerendering && !state.prerendering.fallback) disable_search(url); + if (state.prerendering && !state.prerendering.fallback && !state.prerendering.inside_reroute) { + disable_search(url); + } const response = await with_event(event, () => options.hooks.handle({ diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 6f6c04b3f416..2d54b37ac145 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -216,6 +216,8 @@ export interface PrerenderOptions { cache?: string; // including this here is a bit of a hack, but it makes it easy to add fallback?: boolean; dependencies: Map; + /** True for the duration of a call to the `reroute` hook */ + inside_reroute?: boolean; } export type RecursiveRequired = { diff --git a/packages/kit/test/apps/basics/src/hooks.js b/packages/kit/test/apps/basics/src/hooks.js index 89b90d39335d..2b21ad1bdc2b 100644 --- a/packages/kit/test/apps/basics/src/hooks.js +++ b/packages/kit/test/apps/basics/src/hooks.js @@ -31,6 +31,10 @@ export const reroute = ({ url, fetch }) => { return fetch('/reroute/api').then((r) => r.text()); } + if (url.pathname === '/reroute/async/c') { + return fetch('/reroute/api/prerendered').then((r) => r.text()); + } + if (url.pathname === '/reroute/prerendered/to-destination') { return '/reroute/prerendered/destination'; } diff --git a/packages/kit/test/apps/basics/src/routes/reroute/api/[prerendered]/+server.ts b/packages/kit/test/apps/basics/src/routes/reroute/api/[prerendered]/+server.ts new file mode 100644 index 000000000000..399f9b37ef88 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/api/[prerendered]/+server.ts @@ -0,0 +1,9 @@ +import { text } from '@sveltejs/kit'; + +// This is inside a route with a route segment to ensure that the route is marked as prerendered +// as part of reroute resolution even when no `entries` is given. +export const prerender = true; + +export function GET() { + return text('/reroute/async/b'); +} diff --git a/packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte b/packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte index a7a995fcde0c..b84f51ae69fa 100644 --- a/packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/reroute/async/+page.svelte @@ -1 +1,4 @@ Go to url that should be rewritten +Go to url that should be rewritten and its reroute api call prerendered diff --git a/packages/kit/test/apps/basics/src/routes/reroute/async/+page.ts b/packages/kit/test/apps/basics/src/routes/reroute/async/+page.ts new file mode 100644 index 000000000000..a2f7163f1f06 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/reroute/async/+page.ts @@ -0,0 +1,3 @@ +// through this we test that the crawler during prerendering does not fail on +// reroute calls that call non-prerendered endpoints. +export const prerender = true; diff --git a/packages/kit/test/apps/basics/svelte.config.js b/packages/kit/test/apps/basics/svelte.config.js index bca05e5376ee..d2193940f0ab 100644 --- a/packages/kit/test/apps/basics/svelte.config.js +++ b/packages/kit/test/apps/basics/svelte.config.js @@ -25,7 +25,13 @@ const config = { '/routing/prerendered/trailing-slash/never', '/routing/prerendered/trailing-slash/ignore' ], - handleHttpError: 'warn' + handleHttpError: ({ path, message }) => { + if (path.includes('/reroute/async')) { + throw new Error('shouldnt error on ' + path); + } + + console.warn(message); + } }, version: { diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index 84683d43ebcd..a4851fd773c2 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -1461,6 +1461,14 @@ test.describe('reroute', () => { ); }); + test('Apply async prerendered reroute during client side navigation', async ({ page }) => { + await page.goto('/reroute/async'); + await page.click("a[href='/reroute/async/c']"); + expect(await page.textContent('h1')).toContain( + 'Successfully rewritten, URL should still show a: /reroute/async/c' + ); + }); + test('Apply reroute to prerendered page during client side navigation', async ({ page }) => { await page.goto('/reroute/prerendered'); await page.click("a[href='/reroute/prerendered/to-destination']"); diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 905c345a9681..eb8572489fb0 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -683,6 +683,13 @@ test.describe('reroute', () => { ); }); + test('Apply async prerendered reroute when directly accessing a page', async ({ page }) => { + await page.goto('/reroute/async/c'); + expect(await page.textContent('h1')).toContain( + 'Successfully rewritten, URL should still show a: /reroute/async/c' + ); + }); + test('Apply reroute to prerendered page when directly accessing a page', async ({ page }) => { await page.goto('/reroute/prerendered/to-destination'); expect(await page.textContent('h1')).toContain('reroute that points to prerendered page works'); From 6df1496e82417bdae90e1a83b5d1598e4b5457b0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 21 Mar 2025 11:00:55 +0100 Subject: [PATCH 1011/1135] Version Packages (#13619) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/khaki-buttons-add.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/khaki-buttons-add.md diff --git a/.changeset/khaki-buttons-add.md b/.changeset/khaki-buttons-add.md deleted file mode 100644 index ba543c9fa850..000000000000 --- a/.changeset/khaki-buttons-add.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: allow non-prerendered API endpoint calls during reroute when prerendering diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index c28703e8d0fb..2f3e1790336a 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.2 +### Patch Changes + + +- fix: allow non-prerendered API endpoint calls during reroute when prerendering ([#13616](https://github.com/sveltejs/kit/pull/13616)) + ## 2.20.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 839bb7a1335f..105470b94170 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.1", + "version": "2.20.2", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 9c65cb3afdc0..f18dad60e55a 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.1'; +export const VERSION = '2.20.2'; From c158d2cd112edbaf582ad003bc5bc32346aa91f7 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sat, 22 Mar 2025 03:57:03 +0800 Subject: [PATCH 1012/1135] fix and changeset (#13622) --- .changeset/silent-tables-raise.md | 5 +++++ packages/adapter-cloudflare/index.js | 23 +++++++++++------------ 2 files changed, 16 insertions(+), 12 deletions(-) create mode 100644 .changeset/silent-tables-raise.md diff --git a/.changeset/silent-tables-raise.md b/.changeset/silent-tables-raise.md new file mode 100644 index 000000000000..eb84e2fc3f3c --- /dev/null +++ b/.changeset/silent-tables-raise.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: revert writing server files to the cloudflare build directory diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index b819e7efbf8b..085aa8b26c80 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -28,12 +28,12 @@ export default function (options = {}) { const files = fileURLToPath(new URL('./files', import.meta.url).href); const dest = builder.getBuildDirectory('cloudflare'); - const worker_dest = `${dest}/_worker.js`; + const tmp = builder.getBuildDirectory('cloudflare-tmp'); builder.rimraf(dest); builder.mkdirp(dest); - builder.mkdirp(worker_dest); + builder.mkdirp(tmp); // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page const fallback = path.join(dest, '404.html'); @@ -46,14 +46,20 @@ export default function (options = {}) { const dest_dir = `${dest}${builder.config.kit.paths.base}`; const written_files = builder.writeClient(dest_dir); builder.writePrerendered(dest_dir); - builder.writeServer(`${worker_dest}/server`); + const relativePath = path.posix.relative(dest, builder.getServerDirectory()); writeFileSync( - `${worker_dest}/manifest.js`, - `export const manifest = ${builder.generateManifest({ relativePath: './server' })};\n\n` + + `${tmp}/manifest.js`, + `export const manifest = ${builder.generateManifest({ relativePath })};\n\n` + `export const prerendered = new Set(${JSON.stringify(builder.prerendered.paths)});\n\n` + `export const base_path = ${JSON.stringify(builder.config.kit.paths.base)};\n` ); + builder.copy(`${files}/worker.js`, `${dest}/_worker.js`, { + replace: { + SERVER: `${relativePath}/index.js`, + MANIFEST: `${path.posix.relative(dest, tmp)}/manifest.js` + } + }); writeFileSync( `${dest}/_routes.json`, @@ -77,13 +83,6 @@ export default function (options = {}) { } writeFileSync(`${dest}/.assetsignore`, generate_assetsignore(), { flag: 'a' }); - - builder.copy(`${files}/worker.js`, `${worker_dest}/index.js`, { - replace: { - SERVER: './server/index.js', - MANIFEST: './manifest.js' - } - }); }, emulate() { // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. From fc9017c15e981140302fa567753214283bf53374 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sat, 22 Mar 2025 11:29:08 -0400 Subject: [PATCH 1013/1135] Version Packages (#13623) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/silent-tables-raise.md | 5 ----- packages/adapter-cloudflare/CHANGELOG.md | 6 ++++++ packages/adapter-cloudflare/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/silent-tables-raise.md diff --git a/.changeset/silent-tables-raise.md b/.changeset/silent-tables-raise.md deleted file mode 100644 index eb84e2fc3f3c..000000000000 --- a/.changeset/silent-tables-raise.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -fix: revert writing server files to the cloudflare build directory diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index abca3a87df0a..76802ad572b7 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-cloudflare +## 6.0.1 +### Patch Changes + + +- fix: revert writing server files to the cloudflare build directory ([#13622](https://github.com/sveltejs/kit/pull/13622)) + ## 6.0.0 ### Major Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 025bbf5b335c..113c512af3dc 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "6.0.0", + "version": "6.0.1", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", From 370e9f95c1d6efd5393f73d2dbef68143b27f681 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Sun, 23 Mar 2025 13:18:04 +0800 Subject: [PATCH 1014/1135] fix: only call `afterNavigate` once on start when SSR is disabled (#13593) * add fix and test * changeset * format --- .changeset/angry-ravens-eat.md | 5 ++ packages/kit/src/exports/public.d.ts | 4 +- packages/kit/src/runtime/client/client.js | 48 +++++++++++-------- .../routes/no-ssr/after-navigate/+page.svelte | 13 +++++ .../kit/test/apps/basics/test/client.test.js | 17 ++++--- .../basics/test/cross-platform/client.test.js | 2 +- packages/kit/types/index.d.ts | 4 +- 7 files changed, 61 insertions(+), 32 deletions(-) create mode 100644 .changeset/angry-ravens-eat.md create mode 100644 packages/kit/test/apps/basics/src/routes/no-ssr/after-navigate/+page.svelte diff --git a/.changeset/angry-ravens-eat.md b/.changeset/angry-ravens-eat.md new file mode 100644 index 000000000000..539c2cc946d7 --- /dev/null +++ b/.changeset/angry-ravens-eat.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: only call `afterNavigate` once on app start when SSR is disabled diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 5d41031b1613..732df205d0ae 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -1025,7 +1025,7 @@ export interface NavigationTarget { } /** - * - `enter`: The app has hydrated + * - `enter`: The app has hydrated/started * - `form`: The user submitted a `
` with a GET method * - `leave`: The user is leaving the app by closing the tab or using the back/forward buttons to go to a different document * - `link`: Navigation was triggered by a link click @@ -1101,7 +1101,7 @@ export interface OnNavigate extends Navigation { export interface AfterNavigate extends Omit { /** * The type of navigation: - * - `enter`: The app has hydrated + * - `enter`: The app has hydrated/started * - `form`: The user submitted a `` * - `link`: Navigation was triggered by a link click * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index ecfb49b74da8..f831afa5db34 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -320,8 +320,10 @@ export async function start(_app, _target, hydrate) { if (hydrate) { await _hydrate(target, hydrate); } else { - await goto(app.hash ? decode_hash(new URL(location.href)) : location.href, { - replaceState: true + await navigate({ + type: 'enter', + url: resolve_url(app.hash ? decode_hash(new URL(location.href)) : location.href), + replace_state: true }); } @@ -479,20 +481,22 @@ function initialize(result, target, hydrate) { restore_snapshot(current_navigation_index); - /** @type {import('@sveltejs/kit').AfterNavigate} */ - const navigation = { - from: null, - to: { - params: current.params, - route: { id: current.route?.id ?? null }, - url: new URL(location.href) - }, - willUnload: false, - type: 'enter', - complete: Promise.resolve() - }; + if (hydrate) { + /** @type {import('@sveltejs/kit').AfterNavigate} */ + const navigation = { + from: null, + to: { + params: current.params, + route: { id: current.route?.id ?? null }, + url: new URL(location.href) + }, + willUnload: false, + type: 'enter', + complete: Promise.resolve() + }; - after_navigate_callbacks.forEach((fn) => fn(navigation)); + after_navigate_callbacks.forEach((fn) => fn(navigation)); + } started = true; } @@ -1373,7 +1377,7 @@ function _before_navigate({ url, type, intent, delta }) { /** * @param {{ - * type: import('@sveltejs/kit').Navigation["type"]; + * type: import('@sveltejs/kit').NavigationType; * url: URL; * popped?: { * state: Record; @@ -1407,7 +1411,10 @@ async function navigate({ token = nav_token; const intent = await get_navigation_intent(url, false); - const nav = _before_navigate({ url, type, delta: popped?.delta, intent }); + const nav = + type === 'enter' + ? create_navigation(current, intent, url, type) + : _before_navigate({ url, type, delta: popped?.delta, intent }); if (!nav) { block(); @@ -1423,7 +1430,7 @@ async function navigate({ is_navigating = true; - if (started) { + if (started && nav.navigation.type !== 'enter') { stores.navigating.set((navigating.current = nav.navigation)); } @@ -2847,10 +2854,11 @@ function reset_focus() { } /** + * @template {import('@sveltejs/kit').NavigationType} T * @param {import('./types.js').NavigationState} current * @param {import('./types.js').NavigationIntent | undefined} intent * @param {URL | null} url - * @param {Exclude} type + * @param {T} type */ function create_navigation(current, intent, url, type) { /** @type {(value: any) => void} */ @@ -2867,7 +2875,7 @@ function create_navigation(current, intent, url, type) { // Handle any errors off-chain so that it doesn't show up as an unhandled rejection complete.catch(() => {}); - /** @type {import('@sveltejs/kit').Navigation} */ + /** @type {Omit & { type: T }} */ const navigation = { from: { params: current.params, diff --git a/packages/kit/test/apps/basics/src/routes/no-ssr/after-navigate/+page.svelte b/packages/kit/test/apps/basics/src/routes/no-ssr/after-navigate/+page.svelte new file mode 100644 index 000000000000..0e99d8405c54 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/no-ssr/after-navigate/+page.svelte @@ -0,0 +1,13 @@ + + +

{type.toString()} {count}

diff --git a/packages/kit/test/apps/basics/test/client.test.js b/packages/kit/test/apps/basics/test/client.test.js index a4851fd773c2..aac0920419ea 100644 --- a/packages/kit/test/apps/basics/test/client.test.js +++ b/packages/kit/test/apps/basics/test/client.test.js @@ -335,8 +335,8 @@ test.describe('Load', () => { } }); -test.describe('Page options', () => { - test('applies generated component styles with ssr=false (hides announcer)', async ({ +test.describe('SPA mode / no SSR', () => { + test('applies generated component styles (hides announcer)', async ({ page, clicknav, get_computed_style @@ -346,9 +346,7 @@ test.describe('Page options', () => { expect(await get_computed_style('#svelte-announcer', 'position')).toBe('absolute'); }); -}); -test.describe('SPA mode / no SSR', () => { test('Can use browser-only global on client-only page through ssr config in handle', async ({ page, read_errors @@ -358,7 +356,7 @@ test.describe('SPA mode / no SSR', () => { expect(read_errors('/no-ssr/browser-only-global')).toBe(undefined); }); - test('Can use browser-only global on client-only page through ssr config in +layout.js', async ({ + test('can use browser-only global on client-only page through ssr config in +layout.js', async ({ page, read_errors }) => { @@ -367,7 +365,7 @@ test.describe('SPA mode / no SSR', () => { expect(read_errors('/no-ssr/ssr-page-config')).toBe(undefined); }); - test('Can use browser-only global on client-only page through ssr config in +page.js', async ({ + test('can use browser-only global on client-only page through ssr config in +page.js', async ({ page, read_errors }) => { @@ -376,7 +374,7 @@ test.describe('SPA mode / no SSR', () => { expect(read_errors('/no-ssr/ssr-page-config/layout/inherit')).toBe(undefined); }); - test('Cannot use browser-only global on page because of ssr config in +page.js', async ({ + test('cannot use browser-only global on page because of ssr config in +page.js', async ({ page }) => { await page.goto('/no-ssr/ssr-page-config/layout/overwrite'); @@ -384,6 +382,11 @@ test.describe('SPA mode / no SSR', () => { 'This is your custom error page saying: "document is not defined (500 Internal Error)"' ); }); + + test('afterNavigate is only called once during start', async ({ page }) => { + await page.goto('/no-ssr/after-navigate'); + await expect(page.locator('p')).toHaveText('enter 1'); + }); }); // TODO SvelteKit 3: remove these tests diff --git a/packages/kit/test/apps/basics/test/cross-platform/client.test.js b/packages/kit/test/apps/basics/test/cross-platform/client.test.js index 87c010a07f96..50cc68bc8659 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/client.test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/client.test.js @@ -257,7 +257,7 @@ test.describe('Navigation lifecycle functions', () => { ); }); - test('afterNavigate properly removed', async ({ page, clicknav }) => { + test('onNavigate returned function is only called once', async ({ page, clicknav }) => { await page.goto('/navigation-lifecycle/after-navigate-properly-removed/b'); await clicknav('[href="/navigation-lifecycle/after-navigate-properly-removed/a"]'); await clicknav('[href="/navigation-lifecycle/after-navigate-properly-removed/b"]'); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 1fe7fbcb88d6..3ac640b17196 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1007,7 +1007,7 @@ declare module '@sveltejs/kit' { } /** - * - `enter`: The app has hydrated + * - `enter`: The app has hydrated/started * - `form`: The user submitted a `` with a GET method * - `leave`: The user is leaving the app by closing the tab or using the back/forward buttons to go to a different document * - `link`: Navigation was triggered by a link click @@ -1083,7 +1083,7 @@ declare module '@sveltejs/kit' { export interface AfterNavigate extends Omit { /** * The type of navigation: - * - `enter`: The app has hydrated + * - `enter`: The app has hydrated/started * - `form`: The user submitted a `` * - `link`: Navigation was triggered by a link click * - `goto`: Navigation was triggered by a `goto(...)` call or a redirect From b54e6b2a97d005c15a77346341f9247c89a59791 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 24 Mar 2025 23:36:55 +0800 Subject: [PATCH 1015/1135] chore: move `esbuild` to devDependencies (#13633) --- .changeset/eleven-ears-hide.md | 5 +++++ packages/adapter-cloudflare/package.json | 3 +-- pnpm-lock.yaml | 16 +++------------- 3 files changed, 9 insertions(+), 15 deletions(-) create mode 100644 .changeset/eleven-ears-hide.md diff --git a/.changeset/eleven-ears-hide.md b/.changeset/eleven-ears-hide.md new file mode 100644 index 000000000000..75869df94859 --- /dev/null +++ b/.changeset/eleven-ears-hide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +chore: remove `esbuild` as dependency diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 113c512af3dc..4c787c346e61 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -41,13 +41,12 @@ }, "dependencies": { "@cloudflare/workers-types": "^4.20250312.0", - "esbuild": "^0.24.0", "worktop": "0.8.0-next.18" }, "devDependencies": { "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", - "@types/ws": "^8.5.10", + "esbuild": "^0.24.0", "typescript": "^5.3.3" }, "peerDependencies": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index fb5fae117180..6ce13f0751d3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -60,9 +60,6 @@ importers: '@cloudflare/workers-types': specifier: ^4.20250312.0 version: 4.20250312.0 - esbuild: - specifier: ^0.24.0 - version: 0.24.2 worktop: specifier: 0.8.0-next.18 version: 0.8.0-next.18 @@ -76,9 +73,9 @@ importers: '@types/node': specifier: ^18.19.48 version: 18.19.50 - '@types/ws': - specifier: ^8.5.10 - version: 8.5.10 + esbuild: + specifier: ^0.24.0 + version: 0.24.2 typescript: specifier: ^5.3.3 version: 5.6.3 @@ -1888,9 +1885,6 @@ packages: '@types/set-cookie-parser@2.4.7': resolution: {integrity: sha512-+ge/loa0oTozxip6zmhRIk8Z/boU51wl9Q6QdLZcokIGMzY5lFXYy/x7Htj2HTC6/KZP1hUbZ1ekx8DYXICvWg==} - '@types/ws@8.5.10': - resolution: {integrity: sha512-vmQSUcfalpIq0R9q7uTo2lXs6eGIpt9wtnLdMv9LVpIjCA/+ufZRozlVoVelIYixx1ugCBKDhn89vnsEGOCx9A==} - '@typescript-eslint/eslint-plugin@8.26.0': resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} @@ -4199,10 +4193,6 @@ snapshots: dependencies: '@types/node': 18.19.50 - '@types/ws@8.5.10': - dependencies: - '@types/node': 18.19.50 - '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.6.0)(typescript@5.6.3))(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/regexpp': 4.12.1 From 6c582b6b4936c195689d43b6b24b26588a116894 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 24 Mar 2025 21:56:02 -0700 Subject: [PATCH 1016/1135] docs: flesh out icons section and make standalone page (#13555) * docs: flesh out icons section and make standalone page * Update documentation/docs/40-best-practices/06-icons.md Co-authored-by: Tee Ming --------- Co-authored-by: Tee Ming --- documentation/docs/40-best-practices/06-icons.md | 11 +++++++++++ documentation/docs/40-best-practices/07-images.md | 6 ------ 2 files changed, 11 insertions(+), 6 deletions(-) create mode 100644 documentation/docs/40-best-practices/06-icons.md diff --git a/documentation/docs/40-best-practices/06-icons.md b/documentation/docs/40-best-practices/06-icons.md new file mode 100644 index 000000000000..20f8a9fab12b --- /dev/null +++ b/documentation/docs/40-best-practices/06-icons.md @@ -0,0 +1,11 @@ +--- +title: Icons +--- + +## CSS + +A great way to use icons is to define them purely via CSS. Iconify offers support for [many popular icon sets](https://icon-sets.iconify.design/) that [can be included via CSS](https://iconify.design/docs/usage/css/). This method can also be used with popular CSS frameworks by leveraging the Iconify [Tailwind CSS plugin](https://iconify.design/docs/usage/css/tailwind/) or [UnoCSS plugin](https://iconify.design/docs/usage/css/unocss/). As opposed to libraries based on Svelte components, it doesn't require each icon to be imported into your `.svelte` file. + +## Svelte + +There are many [icon libraries for Svelte](https://www.sveltesociety.dev/packages?category=icons). When choosing an icon library, it is recommended to avoid those that provide a `.svelte` file per icon as these libraries can have thousands of `.svelte` files which really slow down [Vite's dependency optimization](https://vite.dev/guide/dep-pre-bundling.html). This can become especially pathological if the icons are imported both via an umbrella import and subpath import [as described in the `vite-plugin-svelte` FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md#what-is-going-on-with-vite-and-pre-bundling-dependencies). diff --git a/documentation/docs/40-best-practices/07-images.md b/documentation/docs/40-best-practices/07-images.md index b86513216ffa..8bf255243565 100644 --- a/documentation/docs/40-best-practices/07-images.md +++ b/documentation/docs/40-best-practices/07-images.md @@ -152,12 +152,6 @@ Using a content delivery network (CDN) can allow you to optimize these images dy CDNs can generally be used without any need for a library. However, there are a number of libraries with Svelte support that make it easier. [`@unpic/svelte`](https://unpic.pics/img/svelte/) is a CDN-agnostic library with support for a large number of providers. You may also find that specific CDNs like [Cloudinary](https://svelte.cloudinary.dev/) have Svelte support. Finally, some content management systems (CMS) which support Svelte (such as [Contentful](https://www.contentful.com/sveltekit-starter-guide/), [Storyblok](https://github.com/storyblok/storyblok-svelte), and [Contentstack](https://www.contentstack.com/docs/developers/sample-apps/build-a-starter-website-with-sveltekit-and-contentstack)) have built-in support for image handling. -## Icons - -A great way to use icons is to define them purely in CSS. Iconify offers a huge set of icons [available via CSS](https://iconify.design/docs/usage/css/). - -For icons defined in `.svelte` files, it is recommended to avoid libraries that provide a `.svelte` file per icon. These libraries can have thousands of `.svelte` files which really slow down Vite's dependency optimization. This can become especially pathological if the icons are imported both via an umbrella import and subpath import [as described in the `vite-plugin-svelte` FAQ](https://github.com/sveltejs/vite-plugin-svelte/blob/main/docs/faq.md#what-is-going-on-with-vite-and-pre-bundling-dependencies). - ## Best practices - For each image type, use the appropriate solution from those discussed above. You can mix and match all three solutions in one project. For example, you may use Vite's built-in handling to provide images for `` tags, display images on your homepage with `@sveltejs/enhanced-img`, and display user-submitted content with a dynamic approach. From f4ce1856ad9ea446c424bd818b25ae89e34a0692 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Mon, 31 Mar 2025 10:42:42 -0700 Subject: [PATCH 1017/1135] chore: upgrade minizlib to remove rimraf dependency (#13657) --- pnpm-lock.yaml | 108 ++++++++++++++++++++++++------------------------- 1 file changed, 52 insertions(+), 56 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6ce13f0751d3..1935a7b66ebd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -314,7 +314,7 @@ importers: devDependencies: '@types/estree': specifier: ^1.0.5 - version: 1.0.6 + version: 1.0.7 '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1867,6 +1867,9 @@ packages: '@types/estree@1.0.6': resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} + '@types/estree@1.0.7': + resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} + '@types/json-schema@7.0.15': resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==} @@ -1904,8 +1907,8 @@ packages: resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.26.1': - resolution: {integrity: sha512-6EIvbE5cNER8sqBu6V7+KeMZIC1664d2Yjt+B9EWUXrsyWpxx4lEZrmvxgSKRC6gX+efDL/UY9OpPZ267io3mg==} + '@typescript-eslint/scope-manager@8.28.0': + resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.26.0': @@ -1919,8 +1922,8 @@ packages: resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.26.1': - resolution: {integrity: sha512-n4THUQW27VmQMx+3P+B0Yptl7ydfceUj4ON/AQILAASwgYdZ/2dhfymRMh5egRUrvK5lSmaOm77Ry+lmXPOgBQ==} + '@typescript-eslint/types@8.28.0': + resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.26.0': @@ -1929,8 +1932,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.26.1': - resolution: {integrity: sha512-yUwPpUHDgdrv1QJ7YQal3cMVBGWfnuCdKbXw1yyjArax3353rEJP1ZA+4F8nOlQ3RfS2hUN/wze3nlY+ZOhvoA==} + '@typescript-eslint/typescript-estree@8.28.0': + resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -1942,8 +1945,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.26.1': - resolution: {integrity: sha512-V4Urxa/XtSUroUrnI7q6yUTD3hDtfJ2jzVfeT3VK0ciizfK2q/zGC0iDh1lFMUZR8cImRrep6/q0xd/1ZGPQpg==} + '@typescript-eslint/utils@8.28.0': + resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1953,8 +1956,8 @@ packages: resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.26.1': - resolution: {integrity: sha512-AjOC3zfnxd6S4Eiy3jwktJPclqhFHNyd8L6Gycf9WUPoKZpgM5PjkxY1X7uSy61xVpiJDhhk7XT2NVsN3ALTWg==} + '@typescript-eslint/visitor-keys@8.28.0': + resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vercel/nft@0.29.2': @@ -2772,8 +2775,8 @@ packages: resolution: {integrity: sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==} engines: {node: '>=16 || 14 >=14.17'} - minizlib@3.0.1: - resolution: {integrity: sha512-umcy022ILvb5/3Djuu8LWeqUa8D68JaBzlttKeMWen48SjabqS3iY5w/vzeMzMUNhLDifyhbOwKDSznB1vvrwg==} + minizlib@3.0.2: + resolution: {integrity: sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==} engines: {node: '>= 18'} mkdirp@3.0.1: @@ -3039,10 +3042,6 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rimraf@5.0.10: - resolution: {integrity: sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==} - hasBin: true - rollup@4.30.1: resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} @@ -3303,14 +3302,14 @@ packages: peerDependencies: typescript: '>=4.2.0' - ts-api-utils@2.0.1: - resolution: {integrity: sha512-dnlgjFSVetynI8nzgJ+qF62efpglpWRk8isUEWZGWlJYySCTD6aKvbUDu+zbPeDakk3bg5H4XpitHukgfL1m9w==} + ts-api-utils@2.1.0: + resolution: {integrity: sha512-CUgTZL1irw8u29bzrOD/nH85jqyc74D6SshFgujOIA7osm2Rz7dYH77agkx7H4FBNxDq7Cjf+IjaX/8zwFW+ZQ==} engines: {node: '>=18.12'} peerDependencies: typescript: '>=4.8.4' - ts-declaration-location@1.0.6: - resolution: {integrity: sha512-QwtM5UZ8S/NpDvSx4u2EHJgLx2+we7qN8sgyOia4nTpJlke3NO1s1Eb2ea/8IFlkc60b71SILGqWBzGGDnNeSw==} + ts-declaration-location@1.0.7: + resolution: {integrity: sha512-EDyGAwH1gO0Ausm9gV6T2nUvBgXT5kGoCMJPllOaooZ+4VvJiKBdZE7wK18N1deEowhcUptS+5GXZK8U/fvpwA==} peerDependencies: typescript: '>=4.0.0' @@ -4049,7 +4048,7 @@ snapshots: '@rollup/pluginutils@5.1.3(rollup@4.30.1)': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: @@ -4172,11 +4171,13 @@ snapshots: '@types/eslint@8.56.12': dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 '@types/estree@1.0.6': {} + '@types/estree@1.0.7': {} + '@types/json-schema@7.0.15': {} '@types/node@12.20.55': {} @@ -4205,7 +4206,7 @@ snapshots: graphemer: 1.4.0 ignore: 5.3.2 natural-compare: 1.4.0 - ts-api-utils: 2.0.1(typescript@5.6.3) + ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -4227,10 +4228,10 @@ snapshots: '@typescript-eslint/types': 8.26.0 '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/scope-manager@8.26.1': + '@typescript-eslint/scope-manager@8.28.0': dependencies: - '@typescript-eslint/types': 8.26.1 - '@typescript-eslint/visitor-keys': 8.26.1 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: @@ -4238,14 +4239,14 @@ snapshots: '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.6.3) debug: 4.4.0 eslint: 9.6.0 - ts-api-utils: 2.0.1(typescript@5.6.3) + ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/types@8.26.1': {} + '@typescript-eslint/types@8.28.0': {} '@typescript-eslint/typescript-estree@8.26.0(typescript@5.6.3)': dependencies: @@ -4256,21 +4257,21 @@ snapshots: is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.6.3) + ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.26.1(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.28.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.26.1 - '@typescript-eslint/visitor-keys': 8.26.1 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/visitor-keys': 8.28.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 minimatch: 9.0.5 semver: 7.7.1 - ts-api-utils: 2.0.1(typescript@5.6.3) + ts-api-utils: 2.1.0(typescript@5.6.3) typescript: 5.6.3 transitivePeerDependencies: - supports-color @@ -4286,12 +4287,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.1(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.28.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.26.1 - '@typescript-eslint/types': 8.26.1 - '@typescript-eslint/typescript-estree': 8.26.1(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.28.0 + '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.6.3) eslint: 9.6.0 typescript: 5.6.3 transitivePeerDependencies: @@ -4302,9 +4303,9 @@ snapshots: '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.26.1': + '@typescript-eslint/visitor-keys@8.28.0': dependencies: - '@typescript-eslint/types': 8.26.1 + '@typescript-eslint/types': 8.28.0 eslint-visitor-keys: 4.2.0 '@vercel/nft@0.29.2(rollup@4.30.1)': @@ -4639,7 +4640,7 @@ snapshots: eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) - '@typescript-eslint/utils': 8.26.1(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.28.0(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) @@ -4648,7 +4649,7 @@ snapshots: ignore: 5.3.2 minimatch: 9.0.5 semver: 7.7.1 - ts-declaration-location: 1.0.6(typescript@5.6.3) + ts-declaration-location: 1.0.7(typescript@5.6.3) transitivePeerDependencies: - supports-color - typescript @@ -4759,7 +4760,7 @@ snapshots: estree-walker@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 esutils@2.0.3: {} @@ -4954,11 +4955,11 @@ snapshots: is-reference@1.2.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-reference@3.0.3: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 is-subdir@1.2.0: dependencies: @@ -5116,10 +5117,9 @@ snapshots: minipass@7.1.2: {} - minizlib@3.0.1: + minizlib@3.0.2: dependencies: minipass: 7.1.2 - rimraf: 5.0.10 mkdirp@3.0.1: {} @@ -5319,10 +5319,6 @@ snapshots: reusify@1.0.4: {} - rimraf@5.0.10: - dependencies: - glob: 10.4.5 - rollup@4.30.1: dependencies: '@types/estree': 1.0.6 @@ -5527,7 +5523,7 @@ snapshots: '@ampproject/remapping': 2.3.0 '@jridgewell/sourcemap-codec': 1.5.0 '@sveltejs/acorn-typescript': 1.0.5(acorn@8.14.1) - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 acorn: 8.14.1 aria-query: 5.3.2 axobject-query: 4.1.0 @@ -5546,7 +5542,7 @@ snapshots: '@isaacs/fs-minipass': 4.0.1 chownr: 3.0.0 minipass: 7.1.2 - minizlib: 3.0.1 + minizlib: 3.0.2 mkdirp: 3.0.1 yallist: 5.0.0 @@ -5591,13 +5587,13 @@ snapshots: dependencies: typescript: 5.6.3 - ts-api-utils@2.0.1(typescript@5.6.3): + ts-api-utils@2.1.0(typescript@5.6.3): dependencies: typescript: 5.6.3 - ts-declaration-location@1.0.6(typescript@5.6.3): + ts-declaration-location@1.0.7(typescript@5.6.3): dependencies: - minimatch: 9.0.5 + picomatch: 4.0.2 typescript: 5.6.3 tslib@2.6.2: {} From ebec1e95694644ba49dc74baeb906f853a30ce41 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Wed, 2 Apr 2025 10:26:24 +0800 Subject: [PATCH 1018/1135] feat: deprecate `adapter-cloudflare-workers` in favour of `adapter-cloudflare` (#13634) * merge adapters * changeset * it's valid to not specify a main entry if the user is only deploying static assets * format * adjust docs * also use cf pages env var * fix migration guide link * try to fix doc build error * Update index.d.ts Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * Update kind-carrots-deliver.md Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * validate assets key if main key is set * delete adapter-cloudflare-workers * adjust docs and workspace for removing cloudflare workers * fix docs title * clarify _routes.json belongs to cloudflare pages * Update packages/adapter-cloudflare/src/worker.js Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * changes according to feedback * revert type change * fix lock file * fixes * tests * fix lockfile * format --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/kind-carrots-deliver.md | 5 + README.md | 1 - .../docs/25-build-and-deploy/20-adapters.md | 3 +- .../60-adapter-cloudflare.md | 142 +++- .../70-adapter-cloudflare-workers.md | 8 +- eslint.config.js | 1 + .../adapter-cloudflare-workers/CHANGELOG.md | 761 ------------------ packages/adapter-cloudflare-workers/README.md | 13 - .../adapter-cloudflare-workers/ambient.d.ts | 13 - .../files/_package.json | 9 - .../adapter-cloudflare-workers/files/entry.js | 136 ---- .../adapter-cloudflare-workers/index.d.ts | 17 - packages/adapter-cloudflare-workers/index.js | 223 ----- .../adapter-cloudflare-workers/internal.d.ts | 16 - .../adapter-cloudflare-workers/package.json | 54 -- .../adapter-cloudflare-workers/tsconfig.json | 17 - packages/adapter-cloudflare/README.md | 2 +- packages/adapter-cloudflare/ambient.d.ts | 11 +- packages/adapter-cloudflare/index.d.ts | 26 +- packages/adapter-cloudflare/index.js | 143 +++- packages/adapter-cloudflare/package.json | 6 +- packages/adapter-cloudflare/src/worker.js | 31 +- .../test/apps/pages}/.gitignore | 2 + .../test/apps/pages/package.json | 21 + .../test/apps/pages/playwright.config.js | 1 + .../apps/pages/server-side-dep/index.d.ts | 1 + .../test/apps/pages/server-side-dep/index.js | 4 + .../apps/pages/server-side-dep/package.json | 11 + .../test/apps/pages/src/app.html | 11 + .../apps/pages/src/routes/+page.server.js | 7 + .../test/apps/pages/src/routes/+page.svelte | 5 + .../test/apps/pages/svelte.config.js | 10 + .../test/apps/pages/test/test.js | 6 + .../test/apps/pages/tsconfig.json | 14 + .../test/apps/pages/vite.config.js | 11 + .../test/apps/workers/.gitignore | 5 + .../test/apps/workers/package.json | 21 + .../test/apps/workers/playwright.config.js | 1 + .../apps/workers/server-side-dep/index.d.ts | 1 + .../apps/workers/server-side-dep/index.js | 4 + .../apps/workers/server-side-dep/package.json | 11 + .../test/apps/workers/src/app.html | 11 + .../apps/workers/src/routes/+page.server.js | 7 + .../test/apps/workers/src/routes/+page.svelte | 5 + .../test/apps/workers/svelte.config.js | 10 + .../test/apps/workers/test/test.js | 6 + .../test/apps/workers/tsconfig.json | 14 + .../test/apps/workers/vite.config.js | 11 + .../test/apps/workers/wrangler.jsonc | 7 + packages/adapter-cloudflare/test/utils.js | 28 + packages/adapter-cloudflare/tsconfig.json | 7 +- playgrounds/basic/package.json | 1 - pnpm-lock.yaml | 73 +- pnpm-workspace.yaml | 1 + 54 files changed, 599 insertions(+), 1367 deletions(-) create mode 100644 .changeset/kind-carrots-deliver.md delete mode 100644 packages/adapter-cloudflare-workers/CHANGELOG.md delete mode 100644 packages/adapter-cloudflare-workers/README.md delete mode 100644 packages/adapter-cloudflare-workers/ambient.d.ts delete mode 100644 packages/adapter-cloudflare-workers/files/_package.json delete mode 100644 packages/adapter-cloudflare-workers/files/entry.js delete mode 100644 packages/adapter-cloudflare-workers/index.d.ts delete mode 100644 packages/adapter-cloudflare-workers/index.js delete mode 100644 packages/adapter-cloudflare-workers/internal.d.ts delete mode 100644 packages/adapter-cloudflare-workers/package.json delete mode 100644 packages/adapter-cloudflare-workers/tsconfig.json rename packages/{adapter-cloudflare-workers => adapter-cloudflare/test/apps/pages}/.gitignore (50%) create mode 100644 packages/adapter-cloudflare/test/apps/pages/package.json create mode 100644 packages/adapter-cloudflare/test/apps/pages/playwright.config.js create mode 100644 packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.d.ts create mode 100644 packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.js create mode 100644 packages/adapter-cloudflare/test/apps/pages/server-side-dep/package.json create mode 100644 packages/adapter-cloudflare/test/apps/pages/src/app.html create mode 100644 packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js create mode 100644 packages/adapter-cloudflare/test/apps/pages/src/routes/+page.svelte create mode 100644 packages/adapter-cloudflare/test/apps/pages/svelte.config.js create mode 100644 packages/adapter-cloudflare/test/apps/pages/test/test.js create mode 100644 packages/adapter-cloudflare/test/apps/pages/tsconfig.json create mode 100644 packages/adapter-cloudflare/test/apps/pages/vite.config.js create mode 100644 packages/adapter-cloudflare/test/apps/workers/.gitignore create mode 100644 packages/adapter-cloudflare/test/apps/workers/package.json create mode 100644 packages/adapter-cloudflare/test/apps/workers/playwright.config.js create mode 100644 packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.d.ts create mode 100644 packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.js create mode 100644 packages/adapter-cloudflare/test/apps/workers/server-side-dep/package.json create mode 100644 packages/adapter-cloudflare/test/apps/workers/src/app.html create mode 100644 packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js create mode 100644 packages/adapter-cloudflare/test/apps/workers/src/routes/+page.svelte create mode 100644 packages/adapter-cloudflare/test/apps/workers/svelte.config.js create mode 100644 packages/adapter-cloudflare/test/apps/workers/test/test.js create mode 100644 packages/adapter-cloudflare/test/apps/workers/tsconfig.json create mode 100644 packages/adapter-cloudflare/test/apps/workers/vite.config.js create mode 100644 packages/adapter-cloudflare/test/apps/workers/wrangler.jsonc create mode 100644 packages/adapter-cloudflare/test/utils.js diff --git a/.changeset/kind-carrots-deliver.md b/.changeset/kind-carrots-deliver.md new file mode 100644 index 000000000000..3e59bbc5d6e6 --- /dev/null +++ b/.changeset/kind-carrots-deliver.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': major +--- + +feat: support specifically building for Cloudflare Workers Static Assets diff --git a/README.md b/README.md index ada896b1fa99..23b1395bd036 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,6 @@ Web development, streamlined. Read the [documentation](https://svelte.dev/docs/k | [@sveltejs/kit](packages/kit) | [Changelog](packages/kit/CHANGELOG.md) | | [@sveltejs/adapter-auto](packages/adapter-auto) | [Changelog](packages/adapter-auto/CHANGELOG.md) | | [@sveltejs/adapter-cloudflare](packages/adapter-cloudflare) | [Changelog](packages/adapter-cloudflare/CHANGELOG.md) | -| [@sveltejs/adapter-cloudflare-workers](packages/adapter-cloudflare-workers) | [Changelog](packages/adapter-cloudflare-workers/CHANGELOG.md) | | [@sveltejs/adapter-netlify](packages/adapter-netlify) | [Changelog](packages/adapter-netlify/CHANGELOG.md) | | [@sveltejs/adapter-node](packages/adapter-node) | [Changelog](packages/adapter-node/CHANGELOG.md) | | [@sveltejs/adapter-static](packages/adapter-static) | [Changelog](packages/adapter-static/CHANGELOG.md) | diff --git a/documentation/docs/25-build-and-deploy/20-adapters.md b/documentation/docs/25-build-and-deploy/20-adapters.md index c12df05964a2..62f0cc20fb8a 100644 --- a/documentation/docs/25-build-and-deploy/20-adapters.md +++ b/documentation/docs/25-build-and-deploy/20-adapters.md @@ -6,8 +6,7 @@ Before you can deploy your SvelteKit app, you need to _adapt_ it for your deploy Official adapters exist for a variety of platforms — these are documented on the following pages: -- [`@sveltejs/adapter-cloudflare`](adapter-cloudflare) for Cloudflare Pages -- [`@sveltejs/adapter-cloudflare-workers`](adapter-cloudflare-workers) for Cloudflare Workers +- [`@sveltejs/adapter-cloudflare`](adapter-cloudflare) for Cloudflare Workers and Cloudflare Pages - [`@sveltejs/adapter-netlify`](adapter-netlify) for Netlify - [`@sveltejs/adapter-node`](adapter-node) for Node servers - [`@sveltejs/adapter-static`](adapter-static) for static site generation (SSG) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index c963795b61da..a8fbb725d9d2 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -2,22 +2,21 @@ title: Cloudflare Pages --- -To deploy to [Cloudflare Pages](https://pages.cloudflare.com/), use [`adapter-cloudflare`](https://github.com/sveltejs/kit/tree/main/packages/adapter-cloudflare). +To deploy to [Cloudflare Workers](https://workers.cloudflare.com/) or [Cloudflare Pages](https://pages.cloudflare.com/), use [`adapter-cloudflare`](https://github.com/sveltejs/kit/tree/main/packages/adapter-cloudflare). -This adapter will be installed by default when you use [`adapter-auto`](adapter-auto). If you plan on staying with Cloudflare Pages, you can switch from [`adapter-auto`](adapter-auto) to using this adapter directly so that `event.platform` is emulated during local development, type declarations are automatically applied, and the ability to set Cloudflare-specific options is provided. +This adapter will be installed by default when you use [`adapter-auto`](adapter-auto). If you plan on staying with Cloudflare, you can switch from [`adapter-auto`](adapter-auto) to using this adapter directly so that `event.platform` is emulated during local development, type declarations are automatically applied, and the ability to set Cloudflare-specific options is provided. ## Comparisons -- `adapter-cloudflare` – supports all SvelteKit features; builds for [Cloudflare Pages](https://blog.cloudflare.com/cloudflare-pages-goes-full-stack/) -- `adapter-cloudflare-workers` – supports all SvelteKit features; builds for Cloudflare Workers -- `adapter-static` – only produces client-side static assets; compatible with Cloudflare Pages +- `adapter-cloudflare` – supports all SvelteKit features; builds for Cloudflare Workers Static Assets and Cloudflare Pages +- `adapter-cloudflare-workers` – deprecated. Supports all SvelteKit features; builds for Cloudflare Workers Sites +- `adapter-static` – only produces client-side static assets; compatible with Cloudflare Workers Static Assets and Cloudflare Pages ## Usage Install with `npm i -D @sveltejs/adapter-cloudflare`, then add the adapter to your `svelte.config.js`: ```js -// @errors: 2307 /// file: svelte.config.js import adapter from '@sveltejs/adapter-cloudflare'; @@ -25,14 +24,16 @@ export default { kit: { adapter: adapter({ // See below for an explanation of these options - routes: { - include: ['/*'], - exclude: [''] - }, + config: undefined, platformProxy: { configPath: undefined, environment: undefined, persist: undefined + }, + fallback: 'plaintext', + routes: { + include: ['/*'], + exclude: [''] } }) } @@ -41,9 +42,31 @@ export default { ## Options +### config + +Path to your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/). If you would like to use a Wrangler configuration filename other than `wrangler.jsonc`, `wrangler.json`, or `wrangler.toml` you can specify it using this option. + +### platformProxy + +Preferences for the emulated `platform.env` local bindings. See the [getPlatformProxy](https://developers.cloudflare.com/workers/wrangler/api/#parameters-1) Wrangler API documentation for a full list of options. + +### fallback + +Whether to render a plaintext 404.html page or a rendered SPA fallback page for non-matching asset requests. + +For Cloudflare Workers, the default behaviour is to return a null-body 404-status response for non-matching assets requests. However, if the [`assets.not_found_handling`](https://developers.cloudflare.com/workers/static-assets/routing/#2-not_found_handling) Wrangler configuration setting is set to `"404-page"`, this page will be served if a request fails to match an asset. If `assets.not_found_handling` is set to `"single-page-application"`, the adapter will render a SPA fallback index.html page regardless of the `fallback` option specified. + +For Cloudflare Pages, this page will only be served when a request that matches an entry in `routes.exclude` fails to match an asset. + +Most of the time `plaintext` is sufficient, but if you are using `routes.exclude` to manually +exclude a set of prerendered pages without exceeding the 100 route limit, you may wish to +use `spa` instead to avoid showing an unstyled 404 page to users. + +See Cloudflare Pages' [Not Found behaviour](https://developers.cloudflare.com/pages/configuration/serving-pages/#not-found-behavior) for more info. + ### routes -Allows you to customise the [`_routes.json`](https://developers.cloudflare.com/pages/functions/routing/#create-a-_routesjson-file) file generated by `adapter-cloudflare`. +Only for Cloudflare Pages. Allows you to customise the [`_routes.json`](https://developers.cloudflare.com/pages/functions/routing/#create-a-_routesjson-file) file generated by `adapter-cloudflare`. - `include` defines routes that will invoke a function, and defaults to `['/*']` - `exclude` defines routes that will _not_ invoke a function — this is a faster and cheaper way to serve your app's static assets. This array can include the following special values: @@ -54,23 +77,52 @@ Allows you to customise the [`_routes.json`](https://developers.cloudflare.com/p You can have up to 100 `include` and `exclude` rules combined. Generally you can omit the `routes` options, but if (for example) your `` paths exceed that limit, you may find it helpful to manually create an `exclude` list that includes `'/articles/*'` instead of the auto-generated `['/articles/foo', '/articles/bar', '/articles/baz', ...]`. -### platformProxy +## Cloudflare Workers -Preferences for the emulated `platform.env` local bindings. See the [getPlatformProxy](https://developers.cloudflare.com/workers/wrangler/api/#parameters-1) Wrangler API documentation for a full list of options. +### Basic configuration + +When building for Cloudflare Workers, this adapter expects to find a [Wrangler configuration file](https://developers.cloudflare.com/workers/configuration/sites/configuration/) in the project root. It should look something like this: + +```jsonc +/// file: wrangler.jsonc +{ + "name": "", + "main": ".svelte-kit/cloudflare/_worker.js", + "compatibility_date": "2025-01-01", + "assets": { + "binding": "ASSETS", + "directory": ".svelte-kit/cloudflare", + } +} +``` + +### Deployment + +Please follow the [framework guide](https://developers.cloudflare.com/workers/frameworks/framework-guides/svelte/) for Cloudflare Workers to begin. + +## Cloudflare Pages -## Deployment +### Deployment Please follow the [Get Started Guide](https://developers.cloudflare.com/pages/get-started/) for Cloudflare Pages to begin. -When configuring your project settings, you must use the following settings: +If you're using the [Git integration](https://developers.cloudflare.com/pages/get-started/git-integration/), your build settings should look like this: - **Framework preset** – SvelteKit - **Build command** – `npm run build` or `vite build` - **Build output directory** – `.svelte-kit/cloudflare` +### Further reading + +You may wish to refer to [Cloudflare's documentation for deploying a SvelteKit site on Cloudflare Pages](https://developers.cloudflare.com/pages/framework-guides/deploy-a-svelte-kit-site/). + +### Notes + +Functions contained in the [`/functions` directory](https://developers.cloudflare.com/pages/functions/routing/) at the project's root will _not_ be included in the deployment. Instead, functions should be implemented as [server endpoints](routing#server) in your SvelteKit app, which is compiled to a [single `_worker.js` file](https://developers.cloudflare.com/pages/functions/advanced-mode/). + ## Runtime APIs -The [`env`](https://developers.cloudflare.com/workers/runtime-apis/fetch-event#parameters) object contains your project's [bindings](https://developers.cloudflare.com/pages/functions/bindings/), which consist of KV/DO namespaces, etc. It is passed to SvelteKit via the `platform` property, along with [`context`](https://developers.cloudflare.com/workers/runtime-apis/context/), [`caches`](https://developers.cloudflare.com/workers/runtime-apis/cache/), and [`cf`](https://developers.cloudflare.com/workers/runtime-apis/request/#incomingrequestcfproperties), meaning that you can access it in hooks and endpoints: +The [`env`](https://developers.cloudflare.com/workers/runtime-apis/fetch-event#parameters) object contains your project's [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/), which consist of KV/DO namespaces, etc. It is passed to SvelteKit via the `platform` property, along with [`context`](https://developers.cloudflare.com/workers/runtime-apis/context/), [`caches`](https://developers.cloudflare.com/workers/runtime-apis/cache/), and [`cf`](https://developers.cloudflare.com/workers/runtime-apis/request/#incomingrequestcfproperties), meaning that you can access it in hooks and endpoints: ```js // @errors: 7031 @@ -101,26 +153,20 @@ declare global { export {}; ``` -### Testing Locally +### Testing locally -Cloudflare Workers specific values in the `platform` property are emulated during dev and preview modes. Local [bindings](https://developers.cloudflare.com/pages/functions/bindings/) are created based on your [Wrangler configuration file](https://developers.cloudflare.com/pages/functions/wrangler-configuration/#local-development) and are used to populate `platform.env` during development and preview. Use the adapter config [`platformProxy` option](#Options-platformProxy) to change your preferences for the bindings. +Cloudflare specific values in the `platform` property are emulated during dev and preview modes. Local [bindings](https://developers.cloudflare.com/workers/wrangler/configuration/#bindings) are created based on your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/) and are used to populate `platform.env` during development and preview. Use the adapter config [`platformProxy` option](#Options-platformProxy) to change your preferences for the bindings. -For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 3**. Once you have built your site, run `wrangler pages dev .svelte-kit/cloudflare`. +For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 4**. Once you have built your site, run `wrangler dev .svelte-kit/cloudflare` if you're testing for Cloudflare Workers or `wrangler pages dev .svelte-kit/cloudflare` for Cloudflare Pages. -## Notes - -Functions contained in the [`/functions` directory](https://developers.cloudflare.com/pages/functions/routing/) at the project's root will _not_ be included in the deployment. Instead, functions should be implemented as [server endpoints](routing#server) in your SvelteKit app, which is compiled to a [single `_worker.js` file](https://developers.cloudflare.com/pages/functions/advanced-mode/). +## `_headers` and `_redirects` -The [`_headers`](https://developers.cloudflare.com/pages/configuration/headers/) and [`_redirects`](https://developers.cloudflare.com/pages/configuration/redirects/) files specific to Cloudflare Pages can be used for static asset responses (like images) by putting them into the project root folder. +The [`_headers`](https://developers.cloudflare.com/pages/configuration/headers/) and [`_redirects`](https://developers.cloudflare.com/pages/configuration/redirects/) files specific can be used for static asset responses (like images) by putting them into the project root folder. However, they will have no effect on responses dynamically rendered by SvelteKit, which should return custom headers or redirect responses from [server endpoints](routing#server) or with the [`handle`](hooks#Server-hooks-handle) hook. ## Troubleshooting -### Further reading - -You may wish to refer to [Cloudflare's documentation for deploying a SvelteKit site](https://developers.cloudflare.com/pages/framework-guides/deploy-a-svelte-kit-site/). - ### Node.js compatibility If you would like to enable [Node.js compatibility](https://developers.cloudflare.com/workers/runtime-apis/nodejs/), you can add the `nodejs_compat` compatibility flag to your Wrangler configuration file: @@ -139,3 +185,45 @@ When deploying your application, the server generated by SvelteKit is bundled in ### Accessing the file system You can't use `fs` in Cloudflare Workers — you must [prerender](page-options#prerender) the routes in question. + +## Migrating from Workers Sites to Workers Static Assets + +Cloudflare no longer recommends using [Workers Sites](https://developers.cloudflare.com/workers/configuration/sites/configuration/) and instead recommends using [Workers Static Assets](https://developers.cloudflare.com/workers/static-assets/). To migrate, replace `@sveltejs/adapter-cloudflare-workers` with `@sveltejs/adapter-cloudflare` and remove all `site` configuration settings from your Wrangler configuration file, then add the `assets.directory` and `assets.binding` configuration settings: + +### svelte.config.js + +```js +/// file: svelte.config.js +---import adapter from '@sveltejs/adapter-cloudflare-workers';--- ++++import adapter from '@sveltejs/adapter-cloudflare';+++ + +export default { + kit: { + adapter: adapter() + } +}; +``` + +### wrangler.toml + +```toml +/// file: wrangler.toml +---site.bucket = ".cloudflare/public"--- ++++assets.directory = ".cloudflare/public" +assets.binding = "ASSETS"+++ +``` + +### wrangler.jsonc + +```jsonc +/// file: wrangler.jsonc +{ +--- "site": { + "bucket": ".cloudflare/public" + },--- ++++ "assets": { + "directory": ".cloudflare/public", + "binding": "ASSETS" + }+++ +} +``` \ No newline at end of file diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index 71197d9daabe..f346b1d83572 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -2,9 +2,9 @@ title: Cloudflare Workers --- -To deploy to [Cloudflare Workers](https://workers.cloudflare.com/), use [`adapter-cloudflare-workers`](https://github.com/sveltejs/kit/tree/main/packages/adapter-cloudflare-workers). +> [!NOTE] `adapter-cloudflare-workers` has been deprecated in favour of [`adapter-cloudflare`](adapter-cloudflare). We recommend using `adapter-cloudflare` to deploy to Cloudflare Workers with [Static Assets](https://developers.cloudflare.com/workers/static-assets/) since Cloudflare Workers Sites will be deprecated in favour of it. -> [!NOTE] Unless you have a specific reason to use `adapter-cloudflare-workers`, it's recommended that you use [`adapter-cloudflare`](adapter-cloudflare) instead. Both adapters have equivalent functionality, but Cloudflare Pages offers features like GitHub integration with automatic builds and deploys, preview deployments, instant rollback and so on. +To deploy to [Cloudflare Workers](https://workers.cloudflare.com/) with [Workers Sites](https://developers.cloudflare.com/workers/configuration/sites/), use `adapter-cloudflare-workers`. ## Usage @@ -28,7 +28,7 @@ export default { ### config -Path to your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/). If you would like to use a Wrangler configuration filename other than `wrangler.jsonc`, you can specify it using this option. +Path to your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/). If you would like to use a Wrangler configuration filename other than `wrangler.jsonc`, `wrangler.json`, or `wrangler.toml` you can specify it using this option. ### platformProxy @@ -112,7 +112,7 @@ export {}; Cloudflare Workers specific values in the `platform` property are emulated during dev and preview modes. Local [bindings](https://developers.cloudflare.com/workers/wrangler/configuration/#bindings) are created based on your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/) and are used to populate `platform.env` during development and preview. Use the adapter config [`platformProxy` option](#Options-platformProxy) to change your preferences for the bindings. -For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 3**. Once you have built your site, run `wrangler dev`. +For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 4**. Once you have built your site, run `wrangler dev`. ## Troubleshooting diff --git a/eslint.config.js b/eslint.config.js index f780ffd104d9..8444424cd723 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -30,6 +30,7 @@ export default [ '@typescript-eslint/no-floating-promises': 'error' }, ignores: [ + 'packages/adapter-cloudflare/test/apps/**/*', 'packages/adapter-node/rollup.config.js', 'packages/adapter-node/tests/smoke.spec_disabled.js', 'packages/adapter-static/test/apps/**/*', diff --git a/packages/adapter-cloudflare-workers/CHANGELOG.md b/packages/adapter-cloudflare-workers/CHANGELOG.md deleted file mode 100644 index 30314f9e5c91..000000000000 --- a/packages/adapter-cloudflare-workers/CHANGELOG.md +++ /dev/null @@ -1,761 +0,0 @@ -# @sveltejs/adapter-cloudflare-workers - -## 2.9.0 -### Minor Changes - - -- feat: support wrangler 4 ([#13580](https://github.com/sveltejs/kit/pull/13580)) - - -### Patch Changes - -- Updated dependencies [[`001bc04dece9b0983efc2187225772c19d135345`](https://github.com/sveltejs/kit/commit/001bc04dece9b0983efc2187225772c19d135345)]: - - @sveltejs/kit@2.19.2 - -## 2.8.0 -### Minor Changes - - -- feat: support `.jsonc` Wrangler configuration files ([#13467](https://github.com/sveltejs/kit/pull/13467)) - - -### Patch Changes - -- Updated dependencies [[`28cf64589a331ea4770c0883216c5e16d1de7496`](https://github.com/sveltejs/kit/commit/28cf64589a331ea4770c0883216c5e16d1de7496), [`ef1e8047225e7a79c6d121d8ed1a571e5ea44f08`](https://github.com/sveltejs/kit/commit/ef1e8047225e7a79c6d121d8ed1a571e5ea44f08), [`2e6527b92875976b79cc00e7b75ee0ad8b69a239`](https://github.com/sveltejs/kit/commit/2e6527b92875976b79cc00e7b75ee0ad8b69a239), [`0c0172e1463218fe63a67c587173bb3065a53c49`](https://github.com/sveltejs/kit/commit/0c0172e1463218fe63a67c587173bb3065a53c49)]: - - @sveltejs/kit@2.17.3 - -## 2.7.1 -### Patch Changes - - -- fix: prevent Vitest from hanging, which was not fully addressed in [#12830](https://github.com/sveltejs/kit/pull/12830) ([#13373](https://github.com/sveltejs/kit/pull/13373)) - -- Updated dependencies [[`09296d0f19c8d1ff57d699e637bd1beabb69d438`](https://github.com/sveltejs/kit/commit/09296d0f19c8d1ff57d699e637bd1beabb69d438), [`d62ed39a431f0db3db4dd90bf6b17ed2a2a2de79`](https://github.com/sveltejs/kit/commit/d62ed39a431f0db3db4dd90bf6b17ed2a2a2de79), [`f30352f874790b9de0bd0eba985a21aef23e158e`](https://github.com/sveltejs/kit/commit/f30352f874790b9de0bd0eba985a21aef23e158e), [`180fa3467e195065c0a25206c6328a908e6952d7`](https://github.com/sveltejs/kit/commit/180fa3467e195065c0a25206c6328a908e6952d7), [`5906e9708965b848b468d0014999c36272dc8d50`](https://github.com/sveltejs/kit/commit/5906e9708965b848b468d0014999c36272dc8d50), [`d62ed39a431f0db3db4dd90bf6b17ed2a2a2de79`](https://github.com/sveltejs/kit/commit/d62ed39a431f0db3db4dd90bf6b17ed2a2a2de79)]: - - @sveltejs/kit@2.17.0 - -## 2.7.0 -### Minor Changes - - -- feat: support `wrangler.json` config file ([#13151](https://github.com/sveltejs/kit/pull/13151)) - - -### Patch Changes - -- Updated dependencies [[`11a9f66922199ee5925cc71c0efc513376753754`](https://github.com/sveltejs/kit/commit/11a9f66922199ee5925cc71c0efc513376753754), [`3d9e03a8a55a539b02c76d44df4874e4642bbd17`](https://github.com/sveltejs/kit/commit/3d9e03a8a55a539b02c76d44df4874e4642bbd17)]: - - @sveltejs/kit@2.11.0 - -## 2.6.0 -### Minor Changes - - -- chore: upgrade esbuild to 0.24.0 ([#12270](https://github.com/sveltejs/kit/pull/12270)) - - -### Patch Changes - -- Updated dependencies [[`d030f4bb285e70844d09b3f0c87809bae43014b8`](https://github.com/sveltejs/kit/commit/d030f4bb285e70844d09b3f0c87809bae43014b8), [`67dd214863cbc5852eb0e8512efbb7bad5358e8a`](https://github.com/sveltejs/kit/commit/67dd214863cbc5852eb0e8512efbb7bad5358e8a)]: - - @sveltejs/kit@2.9.0 - -## 2.5.6 -### Patch Changes - - -- docs: update URLs for new svelte.dev site ([#12857](https://github.com/sveltejs/kit/pull/12857)) - -- Updated dependencies [[`dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46`](https://github.com/sveltejs/kit/commit/dcbe4222a194c5f90cfc0fc020cf065f7a4e4c46), [`4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d`](https://github.com/sveltejs/kit/commit/4cdbf76fbbf0c0ce7f574ef69c8daddcf954d39d), [`3a9b78f04786898ca93f6d4b75ab18d26bc45192`](https://github.com/sveltejs/kit/commit/3a9b78f04786898ca93f6d4b75ab18d26bc45192), [`723eb8b31e6a22c82f730c30e485386c8676b746`](https://github.com/sveltejs/kit/commit/723eb8b31e6a22c82f730c30e485386c8676b746), [`8ec471c875345b751344e67580ff1b772ef2735b`](https://github.com/sveltejs/kit/commit/8ec471c875345b751344e67580ff1b772ef2735b)]: - - @sveltejs/kit@2.7.3 - -## 2.5.5 -### Patch Changes - - -- fix: correctly handle relative paths when fetching assets on the server ([#12113](https://github.com/sveltejs/kit/pull/12113)) - -- Updated dependencies [[`df48fc6ede3859beabaae9fd7c6f722215bb8a42`](https://github.com/sveltejs/kit/commit/df48fc6ede3859beabaae9fd7c6f722215bb8a42), [`5780deba8e3ebd0e2b0abea029068ad0c6daf6ad`](https://github.com/sveltejs/kit/commit/5780deba8e3ebd0e2b0abea029068ad0c6daf6ad), [`6f9aefdb8699fc126d76a88471602cb9a80822eb`](https://github.com/sveltejs/kit/commit/6f9aefdb8699fc126d76a88471602cb9a80822eb), [`8aa95b4b3431e79f62f580abdcdcb157b4de86cd`](https://github.com/sveltejs/kit/commit/8aa95b4b3431e79f62f580abdcdcb157b4de86cd)]: - - @sveltejs/kit@2.7.0 - -## 2.5.4 -### Patch Changes - - -- chore: configure provenance in a simpler manner ([#12570](https://github.com/sveltejs/kit/pull/12570)) - -- Updated dependencies [[`087a43d391fc38b8c008fb39a804dc6988974101`](https://github.com/sveltejs/kit/commit/087a43d391fc38b8c008fb39a804dc6988974101)]: - - @sveltejs/kit@2.5.22 - -## 2.5.3 -### Patch Changes - - -- chore: package provenance ([#12567](https://github.com/sveltejs/kit/pull/12567)) - -- Updated dependencies [[`4930a8443caa53bcecee7b690cd28e429b1c8a20`](https://github.com/sveltejs/kit/commit/4930a8443caa53bcecee7b690cd28e429b1c8a20)]: - - @sveltejs/kit@2.5.21 - -## 2.5.2 -### Patch Changes - - -- fix: correctly return static assets if base path is set ([#12075](https://github.com/sveltejs/kit/pull/12075)) - -## 2.5.1 -### Patch Changes - - -- fix: copy `.eot`, `.otf`, `.ttf`, `.woff`, and `woff2` font files when bundling ([#12439](https://github.com/sveltejs/kit/pull/12439)) - -## 2.5.0 -### Minor Changes - - -- chore(deps): upgrade to esbuild 0.21 ([#12415](https://github.com/sveltejs/kit/pull/12415)) - - -### Patch Changes - -- Updated dependencies [[`84298477a014ec471839adf7a4448d91bc7949e4`](https://github.com/sveltejs/kit/commit/84298477a014ec471839adf7a4448d91bc7949e4), [`5645614f497931f587b7cb8b3c885fce892a6a72`](https://github.com/sveltejs/kit/commit/5645614f497931f587b7cb8b3c885fce892a6a72), [`84298477a014ec471839adf7a4448d91bc7949e4`](https://github.com/sveltejs/kit/commit/84298477a014ec471839adf7a4448d91bc7949e4)]: - - @sveltejs/kit@2.5.18 - -## 2.4.1 - -### Patch Changes - -- chore: add keywords for discovery in npm search ([#12330](https://github.com/sveltejs/kit/pull/12330)) - -- Updated dependencies [[`25acb1d9fce998dccd8050b93cf4142c2b082611`](https://github.com/sveltejs/kit/commit/25acb1d9fce998dccd8050b93cf4142c2b082611), [`642c4a4aff4351b786fe6274aa2f0bf7d905faf9`](https://github.com/sveltejs/kit/commit/642c4a4aff4351b786fe6274aa2f0bf7d905faf9), [`0a0e9aa897123ebec50af08e9385b2ca4fc5bb28`](https://github.com/sveltejs/kit/commit/0a0e9aa897123ebec50af08e9385b2ca4fc5bb28)]: - - @sveltejs/kit@2.5.11 - -## 2.4.0 - -### Minor Changes - -- chore(deps): upgrade esbuild ([#12118](https://github.com/sveltejs/kit/pull/12118)) - -### Patch Changes - -- Updated dependencies [[`bbab296f6fcc05af6b999182798bcdedabbaa4c9`](https://github.com/sveltejs/kit/commit/bbab296f6fcc05af6b999182798bcdedabbaa4c9)]: - - @sveltejs/kit@2.5.6 - -## 2.3.0 - -### Minor Changes - -- feat: support platform emulation configuration via the `platformProxy` adapter option ([#12011](https://github.com/sveltejs/kit/pull/12011)) - -## 2.2.1 - -### Patch Changes - -- fix: add `workerd` to esbuild conditions ([#12069](https://github.com/sveltejs/kit/pull/12069)) - -## 2.2.0 - -### Minor Changes - -- feat: emulate Cloudflare Workers bindings and incoming request properties in `event.platform` for `dev` and `preview` ([#11974](https://github.com/sveltejs/kit/pull/11974)) - -### Patch Changes - -- Updated dependencies [[`4562275ed42964148df03c79434172024897c08c`](https://github.com/sveltejs/kit/commit/4562275ed42964148df03c79434172024897c08c)]: - - @sveltejs/kit@2.5.4 - -## 2.1.0 - -### Minor Changes - -- feat: more helpful errors when using incompatible Node modules ([#11673](https://github.com/sveltejs/kit/pull/11673)) - -- feat: support compatible node modules without prefixes ([#11672](https://github.com/sveltejs/kit/pull/11672)) - -- feat: Add Node.js compatibility ([#10544](https://github.com/sveltejs/kit/pull/10544)) - -### Patch Changes - -- Updated dependencies [[`288f731c8a5b20cadb9e219f9583f3f16bf8c7b8`](https://github.com/sveltejs/kit/commit/288f731c8a5b20cadb9e219f9583f3f16bf8c7b8)]: - - @sveltejs/kit@2.4.0 - -## 2.0.3 - -### Patch Changes - -- chore: upgrade esbuild to 0.19.11 ([#11632](https://github.com/sveltejs/kit/pull/11632)) - -## 2.0.2 - -### Patch Changes - -- fix: serve static files in `_app` from function, if not already handled ([#11593](https://github.com/sveltejs/kit/pull/11593)) - -- Updated dependencies [[`553e14c8320ad9c6ebb3c554c35f1482755c9555`](https://github.com/sveltejs/kit/commit/553e14c8320ad9c6ebb3c554c35f1482755c9555), [`48576de0dc8b1fbbab7954113004540ea4e76935`](https://github.com/sveltejs/kit/commit/48576de0dc8b1fbbab7954113004540ea4e76935)]: - - @sveltejs/kit@2.3.2 - -## 2.0.1 - -### Patch Changes - -- chore: update primary branch from master to main ([`47779436c5f6c4d50011d0ef8b2709a07c0fec5d`](https://github.com/sveltejs/kit/commit/47779436c5f6c4d50011d0ef8b2709a07c0fec5d)) - -- Updated dependencies [[`47779436c5f6c4d50011d0ef8b2709a07c0fec5d`](https://github.com/sveltejs/kit/commit/47779436c5f6c4d50011d0ef8b2709a07c0fec5d), [`16961e8cd3fa6a7f382153b1ff056bc2aae9b31b`](https://github.com/sveltejs/kit/commit/16961e8cd3fa6a7f382153b1ff056bc2aae9b31b), [`197e01f95652f511160f38b37b9da73a124ecd48`](https://github.com/sveltejs/kit/commit/197e01f95652f511160f38b37b9da73a124ecd48), [`102e4a5ae5b29624302163faf5a20c94a64a5b2c`](https://github.com/sveltejs/kit/commit/102e4a5ae5b29624302163faf5a20c94a64a5b2c), [`f8e3d8b9728c9f1ab63389342c31d7246b6f9db6`](https://github.com/sveltejs/kit/commit/f8e3d8b9728c9f1ab63389342c31d7246b6f9db6)]: - - @sveltejs/kit@2.0.4 - -## 2.0.0 - -### Major Changes - -- breaking: require SvelteKit 2 ([#11316](https://github.com/sveltejs/kit/pull/11316)) - -- chore: upgrade esbuild ([#11122](https://github.com/sveltejs/kit/pull/11122)) - -### Patch Changes - -- fix: declare the adapter plugin options as optional ([#11246](https://github.com/sveltejs/kit/pull/11246)) - -## 1.2.3 - -### Patch Changes - -- fix: correctly map prerendered pages when base path is set ([#11245](https://github.com/sveltejs/kit/pull/11245)) - -- Updated dependencies [[`bd383f576`](https://github.com/sveltejs/kit/commit/bd383f576592948a2a96b357118cdc7598a8b61c), [`b6a0be712`](https://github.com/sveltejs/kit/commit/b6a0be712644bca4bbd7bec194c1bff682e39d71), [`ded16305b`](https://github.com/sveltejs/kit/commit/ded16305b4c180a697c457ca1b2bec249b4b38fb), [`15422d21d`](https://github.com/sveltejs/kit/commit/15422d21d08a1484f92490da5dd4b77ca7332c23)]: - - @sveltejs/kit@1.28.0 - -## 1.2.2 - -### Patch Changes - -- fix: retain URL query string for trailing slash redirects to prerendered pages ([#11142](https://github.com/sveltejs/kit/pull/11142)) - -- Updated dependencies [[`a7f8bdcfa`](https://github.com/sveltejs/kit/commit/a7f8bdcfabce5cda85dd073a21d0afb6138a7a08), [`a4d91304e`](https://github.com/sveltejs/kit/commit/a4d91304eebc08bf2e748d83a46d3548a546e3ab)]: - - @sveltejs/kit@1.27.7 - -## 1.2.1 - -### Patch Changes - -- fix: correctly check url pathnames for trailing slashes ([#10968](https://github.com/sveltejs/kit/pull/10968)) - -## 1.2.0 - -### Minor Changes - -- feat: add cloudflare's `request.cf` object to the `event.platform` property ([#10873](https://github.com/sveltejs/kit/pull/10873)) - -## 1.1.4 - -### Patch Changes - -- fix: mark `cloudflare:` packages as external ([#10404](https://github.com/sveltejs/kit/pull/10404)) - -- Updated dependencies [[`0f0049810`](https://github.com/sveltejs/kit/commit/0f00498100361ef0a4ea8b0b4e8465e442fa22a6), [`6f36aefe1`](https://github.com/sveltejs/kit/commit/6f36aefe13bf55cfaef14166c60ecee989061ddd)]: - - @sveltejs/kit@1.22.4 - -## 1.1.3 - -### Patch Changes - -- chore: upgrade to esbuild 0.18.11 ([#10330](https://github.com/sveltejs/kit/pull/10330)) - -- Updated dependencies [[`23d1df702`](https://github.com/sveltejs/kit/commit/23d1df702f0fd77983040404352d8d83fd1dd8a1), [`486a971fe`](https://github.com/sveltejs/kit/commit/486a971fe7c375aae1585f1fa2505e28f86f4b8e)]: - - @sveltejs/kit@1.22.2 - -## 1.1.2 - -### Patch Changes - -- fix: Copy .wasm files during build ([#9940](https://github.com/sveltejs/kit/pull/9940)) - -- Updated dependencies [[`50acb22ca`](https://github.com/sveltejs/kit/commit/50acb22caf2901283e044cdfda36db6f07b3e0ae), [`2e6da9496`](https://github.com/sveltejs/kit/commit/2e6da9496bdace2c65040b9d1845c44801ca868c), [`a81106b3a`](https://github.com/sveltejs/kit/commit/a81106b3a817829c41e048207d6253e63988c58c), [`a6338a0b1`](https://github.com/sveltejs/kit/commit/a6338a0b124f54bda7ba3fe64be1d6173e118d00), [`4a85b7f08`](https://github.com/sveltejs/kit/commit/4a85b7f0820d35c7830c00afe1df3c94fcbf8c3d), [`26d2b7f8f`](https://github.com/sveltejs/kit/commit/26d2b7f8f5ca29c60ef61b936ff86deaeb1636ce), [`bc70b4e63`](https://github.com/sveltejs/kit/commit/bc70b4e636fcbd9593356996bf737e014ff8c238), [`ab9f57721`](https://github.com/sveltejs/kit/commit/ab9f57721fca146af7c4eb41f4875fafa5dfc0d2)]: - - @sveltejs/kit@1.17.0 - -## 1.1.1 - -### Patch Changes - -- chore: update all dependencies with minor version bumps ([#9761](https://github.com/sveltejs/kit/pull/9761)) - -## 1.1.0 - -### Minor Changes - -- feat: use `es2022` target ([#9293](https://github.com/sveltejs/kit/pull/9293)) - -### Patch Changes - -- Updated dependencies [[`2b647fd8`](https://github.com/sveltejs/kit/commit/2b647fd85be028bc5775894567ee8b13f91411a7), [`fbe4fe76`](https://github.com/sveltejs/kit/commit/fbe4fe768140abac09bd66edd12c77787cafc2c5), [`744dc81c`](https://github.com/sveltejs/kit/commit/744dc81c6b0d8cade087df733c6d3d3f1281e68c)]: - - @sveltejs/kit@1.10.0 - -## 1.0.6 - -### Patch Changes - -- feat: expose `App.Platform` interface automatically ([#8531](https://github.com/sveltejs/kit/pull/8531)) - -- docs: move adapter docs to site ([#8531](https://github.com/sveltejs/kit/pull/8531)) - -- fix: amend `App.Platform` ([#8531](https://github.com/sveltejs/kit/pull/8531)) - -## 1.0.5 - -### Patch Changes - -- fix: publish missing files ([#8532](https://github.com/sveltejs/kit/pull/8532)) - -## 1.0.4 - -### Patch Changes - -- chore: remove superfluous main field from package.json ([#8519](https://github.com/sveltejs/kit/pull/8519)) - -- Updated dependencies [[`7e2d3405`](https://github.com/sveltejs/kit/commit/7e2d34056e99f371e22406d941b764df365a2649)]: - - @sveltejs/kit@1.1.1 - -## 1.0.3 - -### Patch Changes - -- fix: don't load ambient worker types ([#8483](https://github.com/sveltejs/kit/pull/8483)) - -## 1.0.2 - -### Patch Changes - -- docs: add note about inability to access file system at runtime ([#8441](https://github.com/sveltejs/kit/pull/8441)) - -- Updated dependencies [[`9c01c32e`](https://github.com/sveltejs/kit/commit/9c01c32ef72bbed630fadcb8283f8f8533ced5e1), [`b6ca02a6`](https://github.com/sveltejs/kit/commit/b6ca02a684dbf13a3138b552e2d2be64697f2254), [`130abe43`](https://github.com/sveltejs/kit/commit/130abe43cef2cfbaf922aa16b20cbd4332a07c15), [`c4137536`](https://github.com/sveltejs/kit/commit/c4137536f2c6572eaeec1a82ccea0852f5be6b98), [`40464efa`](https://github.com/sveltejs/kit/commit/40464efab172a17f0b637d7dadea30d77ef1ed10), [`ce028470`](https://github.com/sveltejs/kit/commit/ce0284708184198efdd30f3ff72fd579cef830b4)]: - - @sveltejs/kit@1.0.12 - -## 1.0.1 - -### Patch Changes - -- chore: update @cloudflare/kv-asset-handler ([`30e1130e`](https://github.com/sveltejs/kit/commit/30e1130ef84e56a77be5cb1136d5c53edef6e5f9)) -- Updated dependencies [[`fab0de4f`](https://github.com/sveltejs/kit/commit/fab0de4f06ac5b1e9b049e106889b193975c1c29), [`89b8d94b`](https://github.com/sveltejs/kit/commit/89b8d94b1b20d586e1ca525c30d07587c3f2d8f2)]: - - @sveltejs/kit@1.0.2 - -## 1.0.0 - -### Major Changes - -First major release, see below for the history of changes that lead up to this. -Starting from now all releases follow semver and changes will be listed as Major/Minor/Patch - -## 1.0.0-next.65 - -### Patch Changes - -- breaking: remove warnings/errors about removed/changed APIs ([#8019](https://github.com/sveltejs/kit/pull/8019)) -- Updated dependencies [[`f42604a2`](https://github.com/sveltejs/kit/commit/f42604a2b4c04026d3d8bad95807720b79529539)]: - - @sveltejs/kit@1.0.0-next.589 - -## 1.0.0-next.64 - -### Patch Changes - -- chore: add peerDependencies, add more specific next version ([#8141](https://github.com/sveltejs/kit/pull/8141)) - -## 1.0.0-next.63 - -### Patch Changes - -- fix: revert platform change from browser to neutral ([#8122](https://github.com/sveltejs/kit/pull/8122)) - -## 1.0.0-next.62 - -### Patch Changes - -- fix: set esbuild platform to neutral ([#8083](https://github.com/sveltejs/kit/pull/8083)) - -## 1.0.0-next.61 - -### Patch Changes - -- update esbuild to ^0.16.3 ([#7543](https://github.com/sveltejs/kit/pull/7543)) - -## 1.0.0-next.60 - -### Patch Changes - -- update dependencies ([#7355](https://github.com/sveltejs/kit/pull/7355)) - -## 1.0.0-next.59 - -### Patch Changes - -- Use config.kit.paths.base prefix for static assets ([#4448](https://github.com/sveltejs/kit/pull/4448)) - -## 1.0.0-next.58 - -### Patch Changes - -- Add config option to set custom `wrangler.toml` file name ([#7104](https://github.com/sveltejs/kit/pull/7104)) - -## 1.0.0-next.57 - -### Patch Changes - -- Include ambient.d.ts files in adapter packages. ([#6917](https://github.com/sveltejs/kit/pull/6917)) - -## 1.0.0-next.56 - -### Patch Changes - -- chore: bump esbuild ([#6829](https://github.com/sveltejs/kit/pull/6829)) - -## 1.0.0-next.55 - -### Patch Changes - -- Update to esbuild 0.15 ([#6740](https://github.com/sveltejs/kit/pull/6740)) - -## 1.0.0-next.54 - -### Patch Changes - -- feat: Moved hooks.js initialization from Server.respond into Server.init ([#6179](https://github.com/sveltejs/kit/pull/6179)) - -## 1.0.0-next.53 - -### Patch Changes - -- expose caches on platform ([#5887](https://github.com/sveltejs/kit/pull/5887)) - -## 1.0.0-next.52 - -### Patch Changes - -- Initialise `env` ([#5663](https://github.com/sveltejs/kit/pull/5663)) - -## 1.0.0-next.51 - -### Patch Changes - -- breaking: remove writeStatic to align with Vite ([#5618](https://github.com/sveltejs/kit/pull/5618)) - -## 1.0.0-next.50 - -### Patch Changes - -- Update dependencies ([#5005](https://github.com/sveltejs/kit/pull/5005)) - -## 1.0.0-next.49 - -### Patch Changes - -- breaking: Don't pass arbitrary options to esbuild ([#4639](https://github.com/sveltejs/kit/pull/4639)) - -## 1.0.0-next.48 - -### Patch Changes - -- Expose App interfaces ([#5386](https://github.com/sveltejs/kit/pull/5386)) - -## 1.0.0-next.47 - -### Patch Changes - -- chore: upgrade TypeScript to 4.7.4 ([#5414](https://github.com/sveltejs/kit/pull/5414)) - -## 1.0.0-next.46 - -### Patch Changes - -- Generate sourcemaps for server-side functions when bundling with esbuild ([#5258](https://github.com/sveltejs/kit/pull/5258)) - -## 1.0.0-next.45 - -### Patch Changes - -- Simplify example wrangler.toml, and fix outdated README ([#5187](https://github.com/sveltejs/kit/pull/5187)) - -## 1.0.0-next.44 - -### Patch Changes - -- Update dependencies ([#5121](https://github.com/sveltejs/kit/pull/5121)) - -## 1.0.0-next.43 - -### Patch Changes - -- Update adapter entrypoint typings to be NodeNext/ESNext-compatible ([#5111](https://github.com/sveltejs/kit/pull/5111)) - -## 1.0.0-next.42 - -### Patch Changes - -- only serve `_app/immutable` with immutable cache header, not `_app/version.json` ([#5051](https://github.com/sveltejs/kit/pull/5051)) - -## 1.0.0-next.41 - -### Patch Changes - -- Add types to pkg.exports ([#5045](https://github.com/sveltejs/kit/pull/5045)) - -## 1.0.0-next.40 - -### Patch Changes - -- breaking: support Wrangler 2, drop Wrangler 1 ([#4887](https://github.com/sveltejs/kit/pull/4887)) - -## 1.0.0-next.39 - -### Patch Changes - -- breaking: Remove try-catch around server.respond ([#4738](https://github.com/sveltejs/kit/pull/4738)) - -## 1.0.0-next.38 - -### Patch Changes - -- - Fix an issue related to prerendered pages incorrectly resolving in @sveltejs/adapter-cloudflare-workers ([#4626](https://github.com/sveltejs/kit/pull/4626)) - -## 1.0.0-next.37 - -### Patch Changes - -- Breaking: refactor implementation from "Service Worker" pattern to "Module Worker" used in adapter-cloudflare ([#4276](https://github.com/sveltejs/kit/pull/4276)) - - #### add the following to your wrangler.toml - - ```toml - [build.upload] - format = "modules" - main = "./worker.mjs" - ``` - -## 1.0.0-next.36 - -### Patch Changes - -- Provide getClientAddress function ([#4289](https://github.com/sveltejs/kit/pull/4289)) - -## 1.0.0-next.35 - -### Patch Changes - -- breaking: replace builder.prerender() with builder.writePrerendered() and builder.prerendered ([#4192](https://github.com/sveltejs/kit/pull/4192)) ([#4229](https://github.com/sveltejs/kit/pull/4229)) - -## 1.0.0-next.34 - -### Patch Changes - -- breaking: rename `app.render` to `server.respond` ([#4034](https://github.com/sveltejs/kit/pull/4034)) - -## 1.0.0-next.33 - -### Patch Changes - -- revert change to Cloudflare ES target version ([#3847](https://github.com/sveltejs/kit/pull/3847)) - -## 1.0.0-next.32 - -### Patch Changes - -- Fix Cloudflare adapter targets ([#3827](https://github.com/sveltejs/kit/pull/3827)) - -## 1.0.0-next.31 - -### Patch Changes - -- update to Vite 2.8 and esbuild 0.14 ([#3791](https://github.com/sveltejs/kit/pull/3791)) - -## 1.0.0-next.30 - -### Patch Changes - -- Breaking: change app.render signature to (request: Request) => Promise ([#3384](https://github.com/sveltejs/kit/pull/3384)) - -## 1.0.0-next.29 - -### Patch Changes - -- Add immutable cache headers to generated assets ([#3222](https://github.com/sveltejs/kit/pull/3222)) - -## 1.0.0-next.28 - -### Patch Changes - -- use path/posix to resolve relative paths for esmodules ([#3212](https://github.com/sveltejs/kit/pull/3212)) - -## 1.0.0-next.27 - -### Patch Changes - -- Overhaul adapter API ([#2931](https://github.com/sveltejs/kit/pull/2931)) -- Remove esbuild options ([#2931](https://github.com/sveltejs/kit/pull/2931)) -- Update adapters to provide app.render with a url ([#3133](https://github.com/sveltejs/kit/pull/3133)) - -## 1.0.0-next.26 - -### Patch Changes - -- update to esbuild 0.13.15 and other dependency updates ([#2957](https://github.com/sveltejs/kit/pull/2957)) - -## 1.0.0-next.25 - -### Patch Changes - -- chore: upgrade `@cloudflare/kv-asset-handler` ([#2650](https://github.com/sveltejs/kit/pull/2650)) - -## 1.0.0-next.24 - -### Patch Changes - -- update dependencies ([#2574](https://github.com/sveltejs/kit/pull/2574)) - -## 1.0.0-next.23 - -### Patch Changes - -- update to vite 2.6.0 and esbuild 0.13 ([#2522](https://github.com/sveltejs/kit/pull/2522)) - -## 1.0.0-next.22 - -### Patch Changes - -- chore: add links to repository and homepage to package.json ([#2425](https://github.com/sveltejs/kit/pull/2425)) - -## 1.0.0-next.21 - -### Patch Changes - -- chore: export package.json from adapters ([#2351](https://github.com/sveltejs/kit/pull/2351)) - -## 1.0.0-next.20 - -### Patch Changes - -- Support assigning multiple values to a header ([#2313](https://github.com/sveltejs/kit/pull/2313)) - -## 1.0.0-next.19 - -### Patch Changes - -- Ensure the raw body is an Uint8Array before passing it to request handlers ([#2215](https://github.com/sveltejs/kit/pull/2215)) - -## 1.0.0-next.18 - -### Patch Changes - -- d81de603: revert adapters automatically updating .gitignore ([#1924](https://github.com/sveltejs/kit/pull/1924)) - -## 1.0.0-next.17 - -### Patch Changes - -- e9f78999: fix: include esbuild config in adapter type definition ([#1954](https://github.com/sveltejs/kit/pull/1954)) - -## 1.0.0-next.16 - -### Patch Changes - -- e6995797: feat(adapters): expose esbuild configuration ([#1914](https://github.com/sveltejs/kit/pull/1914)) - -## 1.0.0-next.15 - -### Patch Changes - -- 4720b67: Default body parsing to binary ([#1890](https://github.com/sveltejs/kit/pull/1890)) - -## 1.0.0-next.14 - -### Patch Changes - -- 7faf52f: Update and consolidate checks for binary body types ([#1687](https://github.com/sveltejs/kit/pull/1687)) - -## 1.0.0-next.13 - -### Patch Changes - -- 9f0c54a: Externalize app initialization to adapters ([#1804](https://github.com/sveltejs/kit/pull/1804)) - -## 1.0.0-next.12 - -### Patch Changes - -- c51ab7d: Upgrade esbuild to ^0.12.5 ([#1627](https://github.com/sveltejs/kit/pull/1627)) - -## 1.0.0-next.11 - -### Patch Changes - -- edc307d: Remove peerDependencies due to pnpm bug ([#1621](https://github.com/sveltejs/kit/pull/1621)) -- 2636e68: Attempt to fix peerDependencies specification ([#1620](https://github.com/sveltejs/kit/pull/1620)) - -## 1.0.0-next.10 - -### Patch Changes - -- 028abd9: Pass validated svelte config to adapter adapt function ([#1559](https://github.com/sveltejs/kit/pull/1559)) -- Updated dependencies [6372690] -- Updated dependencies [c3d36a3] -- Updated dependencies [bf77940] -- Updated dependencies [2172469] -- Updated dependencies [028abd9] - - @sveltejs/kit@1.0.0-next.110 - -## 1.0.0-next.9 - -### Patch Changes - -- 71e293d: change toml parser to support dotted keys and other language features added after the TOML v0.4.0 spec ([#1509](https://github.com/sveltejs/kit/pull/1509)) -- dca4946: Make kit a peerDependency of the adapters ([#1505](https://github.com/sveltejs/kit/pull/1505)) -- Updated dependencies [261ee1c] -- Updated dependencies [ec156c6] -- Updated dependencies [586785d] - - @sveltejs/kit@1.0.0-next.109 - -## 1.0.0-next.8 - -### Patch Changes - -- dad93fc: Fix workspace dependencies ([#1434](https://github.com/sveltejs/kit/pull/1434)) - -## 1.0.0-next.7 - -### Patch Changes - -- 11e7840: Ensure rawBody is a string or Uint8Array ([#1382](https://github.com/sveltejs/kit/pull/1382)) - -## 0.0.2-next.6 - -### Patch Changes - -- c6fde99: Convert to ESM ([#1323](https://github.com/sveltejs/kit/pull/1323)) - -## 0.0.2-next.5 - -### Patch Changes - -- 9e67505: Add es2020 target to esbuild function to solve Unexpected character '#' error ([#1287](https://github.com/sveltejs/kit/pull/1287)) - -## 0.0.2-next.4 - -### Patch Changes - -- 2e72a94: Add type declarations ([#1230](https://github.com/sveltejs/kit/pull/1230)) - -## 0.0.2-next.3 - -### Patch Changes - -- b372d61: Generate required package.json ([#1116](https://github.com/sveltejs/kit/pull/1116)) - -## 0.0.2-next.2 - -### Patch Changes - -- 1237eb3: Pass rawBody to SvelteKit, bundle worker with esbuild ([#1109](https://github.com/sveltejs/kit/pull/1109)) - -## 0.0.2-next.1 - -### Patch Changes - -- 4325b39: Aligns request/response API of cloudflare-workers adapter with others ([#946](https://github.com/sveltejs/kit/pull/946)) - -## 0.0.2-next.0 - -### Patch Changes - -- e890031: Fix dev/prod deps (oops) ([#749](https://github.com/sveltejs/kit/pull/749)) diff --git a/packages/adapter-cloudflare-workers/README.md b/packages/adapter-cloudflare-workers/README.md deleted file mode 100644 index a3805020a4aa..000000000000 --- a/packages/adapter-cloudflare-workers/README.md +++ /dev/null @@ -1,13 +0,0 @@ -# adapter-cloudflare-workers - -SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering. - -**Requires [Wrangler v2](https://developers.cloudflare.com/workers/wrangler/get-started/).** Wrangler v1 is no longer supported. - -## Docs - -[Docs](https://svelte.dev/docs/kit/adapter-cloudflare-workers) - -## Changelog - -[The Changelog for this package is available on GitHub](https://github.com/sveltejs/kit/blob/main/packages/adapter-cloudflare-workers/CHANGELOG.md). diff --git a/packages/adapter-cloudflare-workers/ambient.d.ts b/packages/adapter-cloudflare-workers/ambient.d.ts deleted file mode 100644 index fbd01afd6557..000000000000 --- a/packages/adapter-cloudflare-workers/ambient.d.ts +++ /dev/null @@ -1,13 +0,0 @@ -import { CacheStorage, IncomingRequestCfProperties } from '@cloudflare/workers-types'; - -declare global { - namespace App { - export interface Platform { - context: { - waitUntil(promise: Promise): void; - }; - caches: CacheStorage; - cf?: IncomingRequestCfProperties; - } - } -} diff --git a/packages/adapter-cloudflare-workers/files/_package.json b/packages/adapter-cloudflare-workers/files/_package.json deleted file mode 100644 index bc4c8d4aabac..000000000000 --- a/packages/adapter-cloudflare-workers/files/_package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "private": true, - "version": "0.0.1", - "description": "Worker site generated by SvelteKit", - "main": "index.js", - "dependencies": { - "@cloudflare/kv-asset-handler": "~0.1.3" - } -} diff --git a/packages/adapter-cloudflare-workers/files/entry.js b/packages/adapter-cloudflare-workers/files/entry.js deleted file mode 100644 index 5f022e5096b9..000000000000 --- a/packages/adapter-cloudflare-workers/files/entry.js +++ /dev/null @@ -1,136 +0,0 @@ -import { Server } from 'SERVER'; -import { manifest, prerendered, base_path } from 'MANIFEST'; -import { getAssetFromKV, mapRequestToAsset } from '@cloudflare/kv-asset-handler'; -import static_asset_manifest_json from '__STATIC_CONTENT_MANIFEST'; -const static_asset_manifest = JSON.parse(static_asset_manifest_json); - -const server = new Server(manifest); - -const app_path = `/${manifest.appPath}`; - -const immutable = `${app_path}/immutable/`; -const version_file = `${app_path}/version.json`; - -export default { - /** - * @param {Request} req - * @param {any} env - * @param {any} context - */ - async fetch(req, env, context) { - await server.init({ env }); - - const url = new URL(req.url); - - // static assets - if (url.pathname.startsWith(app_path)) { - /** @type {Response} */ - const res = await get_asset_from_kv(req, env, context); - if (is_error(res.status)) return res; - - const cache_control = url.pathname.startsWith(immutable) - ? 'public, immutable, max-age=31536000' - : 'no-cache'; - - return new Response(res.body, { - headers: { - // include original headers, minus cache-control which - // is overridden, and etag which is no longer useful - 'cache-control': cache_control, - 'content-type': res.headers.get('content-type'), - 'x-robots-tag': 'noindex' - } - }); - } - - let { pathname, search } = url; - try { - pathname = decodeURIComponent(pathname); - } catch { - // ignore invalid URI - } - - const stripped_pathname = pathname.replace(/\/$/, ''); - - // prerendered pages and /static files - let is_static_asset = false; - const filename = stripped_pathname.slice(base_path.length + 1); - if (filename) { - is_static_asset = - manifest.assets.has(filename) || - manifest.assets.has(filename + '/index.html') || - filename in manifest._.server_assets || - filename + '/index.html' in manifest._.server_assets; - } - - let location = pathname.at(-1) === '/' ? stripped_pathname : pathname + '/'; - - if ( - is_static_asset || - prerendered.has(pathname) || - pathname === version_file || - pathname.startsWith(immutable) - ) { - return get_asset_from_kv(req, env, context, (request, options) => { - if (prerendered.has(pathname)) { - url.pathname = '/' + prerendered.get(pathname).file; - return new Request(url.toString(), request); - } - - return mapRequestToAsset(request, options); - }); - } else if (location && prerendered.has(location)) { - if (search) location += search; - return new Response('', { - status: 308, - headers: { - location - } - }); - } - - // dynamically-generated pages - return await server.respond(req, { - platform: { - env, - context, - // @ts-expect-error lib.dom is interfering with workers-types - caches, - // @ts-expect-error req is actually a Cloudflare request not a standard request - cf: req.cf - }, - getClientAddress() { - return req.headers.get('cf-connecting-ip'); - } - }); - } -}; - -/** - * @param {Request} req - * @param {any} env - * @param {any} context - */ -async function get_asset_from_kv(req, env, context, map = mapRequestToAsset) { - return await getAssetFromKV( - { - request: req, - waitUntil(promise) { - return context.waitUntil(promise); - } - }, - { - ASSET_NAMESPACE: env.__STATIC_CONTENT, - ASSET_MANIFEST: static_asset_manifest, - mapRequestToAsset: map - } - ); -} - -/** - * @param {number} status - * @returns {boolean} - */ -function is_error(status) { - return status > 399; -} diff --git a/packages/adapter-cloudflare-workers/index.d.ts b/packages/adapter-cloudflare-workers/index.d.ts deleted file mode 100644 index 878b48649d5e..000000000000 --- a/packages/adapter-cloudflare-workers/index.d.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { Adapter } from '@sveltejs/kit'; -import './ambient.js'; -import { GetPlatformProxyOptions } from 'wrangler'; - -export default function plugin(options?: AdapterOptions): Adapter; - -export interface AdapterOptions { - /** - * Path to your {@link https://developers.cloudflare.com/workers/wrangler/configuration/ | Wrangler configuration file}. - */ - config?: string; - /** - * Config object passed to {@link https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy | getPlatformProxy} - * during development and preview. - */ - platformProxy?: GetPlatformProxyOptions; -} diff --git a/packages/adapter-cloudflare-workers/index.js b/packages/adapter-cloudflare-workers/index.js deleted file mode 100644 index 5d13539cd915..000000000000 --- a/packages/adapter-cloudflare-workers/index.js +++ /dev/null @@ -1,223 +0,0 @@ -import { execSync } from 'node:child_process'; -import { writeFileSync } from 'node:fs'; -import { posix, dirname } from 'node:path'; -import { fileURLToPath } from 'node:url'; -import esbuild from 'esbuild'; -import { getPlatformProxy, unstable_readConfig } from 'wrangler'; - -// list from https://developers.cloudflare.com/workers/runtime-apis/nodejs/ -const compatible_node_modules = [ - 'assert', - 'async_hooks', - 'buffer', - 'crypto', - 'diagnostics_channel', - 'events', - 'path', - 'process', - 'stream', - 'string_decoder', - 'util' -]; - -/** @type {import('./index.js').default} */ -export default function ({ config, platformProxy = {} } = {}) { - return { - name: '@sveltejs/adapter-cloudflare-workers', - - async adapt(builder) { - const { main, site, compatibility_flags } = validate_config(builder, config); - - const files = fileURLToPath(new URL('./files', import.meta.url).href); - const tmp = builder.getBuildDirectory('cloudflare-workers-tmp'); - - builder.rimraf(site.bucket); - builder.rimraf(dirname(main)); - - builder.log.info('Installing worker dependencies...'); - builder.copy(`${files}/_package.json`, `${tmp}/package.json`); - - // TODO would be cool if we could make this step unnecessary somehow - const stdout = execSync('npm install', { cwd: tmp }); - builder.log.info(stdout.toString()); - - builder.log.minor('Generating worker...'); - const relativePath = posix.relative(tmp, builder.getServerDirectory()); - - builder.copy(`${files}/entry.js`, `${tmp}/entry.js`, { - replace: { - SERVER: `${relativePath}/index.js`, - MANIFEST: './manifest.js' - } - }); - - let prerendered_entries = Array.from(builder.prerendered.pages.entries()); - - if (builder.config.kit.paths.base) { - prerendered_entries = prerendered_entries.map(([path, { file }]) => [ - path, - { file: `${builder.config.kit.paths.base}/${file}` } - ]); - } - - writeFileSync( - `${tmp}/manifest.js`, - `export const manifest = ${builder.generateManifest({ relativePath })};\n\n` + - `export const prerendered = new Map(${JSON.stringify(prerendered_entries)});\n\n` + - `export const base_path = ${JSON.stringify(builder.config.kit.paths.base)};\n` - ); - - const external = ['__STATIC_CONTENT_MANIFEST', 'cloudflare:*']; - if (compatibility_flags && compatibility_flags.includes('nodejs_compat')) { - external.push(...compatible_node_modules.map((id) => `node:${id}`)); - } - - try { - const result = await esbuild.build({ - platform: 'browser', - // https://github.com/cloudflare/workers-sdk/blob/a12b2786ce745f24475174bcec994ad691e65b0f/packages/wrangler/src/deployment-bundle/bundle.ts#L35-L36 - conditions: ['workerd', 'worker', 'browser'], - sourcemap: 'linked', - target: 'es2022', - entryPoints: [`${tmp}/entry.js`], - outfile: main, - bundle: true, - external, - alias: Object.fromEntries(compatible_node_modules.map((id) => [id, `node:${id}`])), - format: 'esm', - loader: { - '.wasm': 'copy', - '.woff': 'copy', - '.woff2': 'copy', - '.ttf': 'copy', - '.eot': 'copy', - '.otf': 'copy' - }, - logLevel: 'silent' - }); - - if (result.warnings.length > 0) { - const formatted = await esbuild.formatMessages(result.warnings, { - kind: 'warning', - color: true - }); - - console.error(formatted.join('\n')); - } - } catch (error) { - for (const e of error.errors) { - for (const node of e.notes) { - const match = - /The package "(.+)" wasn't found on the file system but is built into node/.exec( - node.text - ); - - if (match) { - node.text = `Cannot use "${match[1]}" when deploying to Cloudflare.`; - } - } - } - - const formatted = await esbuild.formatMessages(error.errors, { - kind: 'error', - color: true - }); - - console.error(formatted.join('\n')); - - throw new Error( - `Bundling with esbuild failed with ${error.errors.length} ${ - error.errors.length === 1 ? 'error' : 'errors' - }` - ); - } - - builder.log.minor('Copying assets...'); - const bucket_dir = `${site.bucket}${builder.config.kit.paths.base}`; - builder.writeClient(bucket_dir); - builder.writePrerendered(bucket_dir); - }, - - emulate() { - // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. - // If we would await it here, it would hang indefinitely because the platform proxy only resolves once a request happens - const get_emulated = async () => { - const proxy = await getPlatformProxy(platformProxy); - const platform = /** @type {App.Platform} */ ({ - env: proxy.env, - context: proxy.ctx, - caches: proxy.caches, - cf: proxy.cf - }); - /** @type {Record} */ - const env = {}; - const prerender_platform = /** @type {App.Platform} */ (/** @type {unknown} */ ({ env })); - for (const key in proxy.env) { - Object.defineProperty(env, key, { - get: () => { - throw new Error(`Cannot access platform.env.${key} in a prerenderable route`); - } - }); - } - return { platform, prerender_platform }; - }; - - /** @type {{ platform: App.Platform, prerender_platform: App.Platform }} */ - let emulated; - - return { - platform: async ({ prerender }) => { - emulated ??= await get_emulated(); - return prerender ? emulated.prerender_platform : emulated.platform; - } - }; - } - }; -} - -/** - * @param {import('@sveltejs/kit').Builder} builder - * @param {string} config_file - * @returns {import('wrangler').Unstable_Config} - */ -function validate_config(builder, config_file = undefined) { - const wrangler_config = unstable_readConfig({ config: config_file }); - - if (!wrangler_config.configPath) { - builder.log.error( - 'Consult https://developers.cloudflare.com/workers/platform/sites/configuration on how to setup your site' - ); - builder.log( - ` -Sample wrangler.jsonc: -{ - "name": "", - "account_id": "", - "main": "./.cloudflare/worker.js", - "site": { - "bucket": "./.cloudflare/public" - }, - "build": { - "command": "npm run build" - }, - "compatibility_date": "2021-11-12" -} - `.trim() - ); - throw new Error('Missing a Wrangler configuration file'); - } - - if (!wrangler_config.site?.bucket) { - throw new Error( - `You must specify the \`site.bucket\` key in ${wrangler_config.configPath}. Consult https://developers.cloudflare.com/workers/platform/sites/configuration` - ); - } - - if (!wrangler_config.main) { - throw new Error( - `You must specify the \`main\` key in ${wrangler_config.configPath}. Consult https://developers.cloudflare.com/workers/platform/sites/configuration` - ); - } - - return wrangler_config; -} diff --git a/packages/adapter-cloudflare-workers/internal.d.ts b/packages/adapter-cloudflare-workers/internal.d.ts deleted file mode 100644 index 3877ad52f4a5..000000000000 --- a/packages/adapter-cloudflare-workers/internal.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -declare module 'SERVER' { - export { Server } from '@sveltejs/kit'; -} - -declare module 'MANIFEST' { - import { SSRManifest } from '@sveltejs/kit'; - - export const manifest: SSRManifest; - export const prerendered: Map; - export const base_path: string; -} - -declare module '__STATIC_CONTENT_MANIFEST' { - const json: string; - export default json; -} diff --git a/packages/adapter-cloudflare-workers/package.json b/packages/adapter-cloudflare-workers/package.json deleted file mode 100644 index 581343d9ed3d..000000000000 --- a/packages/adapter-cloudflare-workers/package.json +++ /dev/null @@ -1,54 +0,0 @@ -{ - "name": "@sveltejs/adapter-cloudflare-workers", - "version": "2.9.0", - "description": "SvelteKit adapter that creates a Cloudflare Workers site using a function for dynamic server rendering", - "keywords": [ - "adapter", - "cloudflare workers", - "deploy", - "hosting", - "svelte", - "sveltekit" - ], - "repository": { - "type": "git", - "url": "https://github.com/sveltejs/kit", - "directory": "packages/adapter-cloudflare-workers" - }, - "license": "MIT", - "homepage": "https://svelte.dev", - "type": "module", - "exports": { - ".": { - "types": "./index.d.ts", - "import": "./index.js" - }, - "./package.json": "./package.json" - }, - "types": "index.d.ts", - "files": [ - "ambient.d.ts", - "files", - "index.js", - "index.d.ts" - ], - "scripts": { - "lint": "prettier --check .", - "format": "pnpm lint --write", - "check": "tsc --skipLibCheck" - }, - "dependencies": { - "@cloudflare/workers-types": "^4.20250312.0", - "esbuild": "^0.24.0" - }, - "devDependencies": { - "@cloudflare/kv-asset-handler": "^0.4.0", - "@sveltejs/kit": "workspace:^", - "@types/node": "^18.19.48", - "typescript": "^5.3.3" - }, - "peerDependencies": { - "@sveltejs/kit": "^2.0.0", - "wrangler": "^3.91.0 || ^4.0.0" - } -} diff --git a/packages/adapter-cloudflare-workers/tsconfig.json b/packages/adapter-cloudflare-workers/tsconfig.json deleted file mode 100644 index e4cdc5abd1b7..000000000000 --- a/packages/adapter-cloudflare-workers/tsconfig.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "compilerOptions": { - "allowJs": true, - "checkJs": true, - "noEmit": true, - "noImplicitAny": true, - "target": "es2022", - "module": "node16", - "moduleResolution": "node16", - "allowSyntheticDefaultImports": true, - "baseUrl": ".", - "paths": { - "@sveltejs/kit": ["../kit/types/index"] - } - }, - "include": ["**/*.js", "internal.d.ts"] -} diff --git a/packages/adapter-cloudflare/README.md b/packages/adapter-cloudflare/README.md index fa00adbf1c94..fb8ce1266e61 100644 --- a/packages/adapter-cloudflare/README.md +++ b/packages/adapter-cloudflare/README.md @@ -1,6 +1,6 @@ # adapter-cloudflare -[Adapter](https://svelte.dev/docs/kit/building-your-app) for building SvelteKit applications on [Cloudflare Pages](https://developers.cloudflare.com/pages/) with [Workers integration](https://developers.cloudflare.com/pages/platform/functions). +[Adapter](https://svelte.dev/docs/kit/building-your-app) for building SvelteKit applications on [Cloudflare Workers](https://developers.cloudflare.com/workers/) with [static assets](https://developers.cloudflare.com/workers/static-assets/) or [Cloudflare Pages](https://developers.cloudflare.com/pages/) with [Workers integration](https://developers.cloudflare.com/pages/functions/). ## Docs diff --git a/packages/adapter-cloudflare/ambient.d.ts b/packages/adapter-cloudflare/ambient.d.ts index fbd01afd6557..9bee6700f8ac 100644 --- a/packages/adapter-cloudflare/ambient.d.ts +++ b/packages/adapter-cloudflare/ambient.d.ts @@ -1,11 +1,14 @@ -import { CacheStorage, IncomingRequestCfProperties } from '@cloudflare/workers-types'; +import { + CacheStorage, + IncomingRequestCfProperties, + ExecutionContext +} from '@cloudflare/workers-types'; declare global { namespace App { export interface Platform { - context: { - waitUntil(promise: Promise): void; - }; + env: unknown; + context: ExecutionContext; caches: CacheStorage; cf?: IncomingRequestCfProperties; } diff --git a/packages/adapter-cloudflare/index.d.ts b/packages/adapter-cloudflare/index.d.ts index a1cacb498e24..0c02fb786cee 100644 --- a/packages/adapter-cloudflare/index.d.ts +++ b/packages/adapter-cloudflare/index.d.ts @@ -6,20 +6,36 @@ export default function plugin(options?: AdapterOptions): Adapter; export interface AdapterOptions { /** - * Whether to render a plaintext 404.html page, or a rendered SPA fallback page. This page will - * only be served when a request that matches an entry in `routes.exclude` fails to match an asset. + * Path to your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/configuration/). + */ + config?: string; + /** + * Whether to render a plaintext 404.html page or a rendered SPA fallback page + * for non-matching asset requests. + * + * For Cloudflare Workers, the default behaviour is to return a null-body + * 404-status response for non-matching assets requests. However, if the + * [`assets.not_found_handling`](https://developers.cloudflare.com/workers/static-assets/routing/#2-not_found_handling) + * Wrangler configuration setting is set to `"404-page"`, this page will be + * served if a request fails to match an asset. If `assets.not_found_handling` + * is set to `"single-page-application"`, the adapter will render a SPA fallback + * index.html page regardless of the `fallback` option specified. + * + * For Cloudflare Pages, this page will only be served when a request that + * matches an entry in `routes.exclude` fails to match an asset. * * Most of the time `plaintext` is sufficient, but if you are using `routes.exclude` to manually * exclude a set of prerendered pages without exceeding the 100 route limit, you may wish to * use `spa` instead to avoid showing an unstyled 404 page to users. * + * See [Cloudflare Pages' Not Found behavior](https://developers.cloudflare.com/pages/configuration/serving-pages/#not-found-behavior) for more info. + * * @default 'plaintext' */ fallback?: 'plaintext' | 'spa'; /** - * Customize the automatically-generated `_routes.json` file. - * https://developers.cloudflare.com/pages/platform/functions/routing/#create-a-_routesjson-file + * Only for Cloudflare Pages. Customize the automatically-generated [`_routes.json`](https://developers.cloudflare.com/pages/platform/functions/routing/#create-a-_routesjson-file) file. */ routes?: { /** @@ -45,7 +61,7 @@ export interface AdapterOptions { }; /** - * Config object passed to {@link https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy | getPlatformProxy} + * Config object passed to [`getPlatformProxy`](https://developers.cloudflare.com/workers/wrangler/api/#getplatformproxy) * during development and preview. */ platformProxy?: GetPlatformProxyOptions; diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 085aa8b26c80..39260432c9d8 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -1,7 +1,8 @@ import { copyFileSync, existsSync, writeFileSync } from 'node:fs'; -import * as path from 'node:path'; +import path from 'node:path'; +import process from 'node:process'; import { fileURLToPath } from 'node:url'; -import { getPlatformProxy } from 'wrangler'; +import { getPlatformProxy, unstable_readConfig } from 'wrangler'; /** @type {import('./index.js').default} */ export default function (options = {}) { @@ -10,7 +11,7 @@ export default function (options = {}) { async adapt(builder) { if (existsSync('_routes.json')) { throw new Error( - "Cloudflare's _routes.json should be configured in svelte.config.js. See https://svelte.dev/docs/kit/adapter-cloudflare#Options-routes" + "Cloudflare Pages' _routes.json should be configured in svelte.config.js. See https://svelte.dev/docs/kit/adapter-cloudflare#Options-routes" ); } @@ -26,56 +27,87 @@ export default function (options = {}) { ); } + const wrangler_config = validate_config(options.config); + const building_for_cloudflare_pages = is_building_for_cloudflare_pages(wrangler_config); + + let dest = builder.getBuildDirectory('cloudflare'); + let worker_dest = `${dest}/_worker.js`; + let assets_binding = 'ASSETS'; + + if (building_for_cloudflare_pages) { + if (wrangler_config.pages_build_output_dir) { + dest = wrangler_config.pages_build_output_dir; + } + } else { + if (wrangler_config.main) { + worker_dest = wrangler_config.main; + } + if (wrangler_config.assets?.directory) { + dest = wrangler_config.assets.directory; + } + if (wrangler_config.assets?.binding) { + assets_binding = wrangler_config.assets.binding; + } + } + const files = fileURLToPath(new URL('./files', import.meta.url).href); - const dest = builder.getBuildDirectory('cloudflare'); const tmp = builder.getBuildDirectory('cloudflare-tmp'); builder.rimraf(dest); + builder.rimraf(worker_dest); builder.mkdirp(dest); builder.mkdirp(tmp); - // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page - const fallback = path.join(dest, '404.html'); - if (options.fallback === 'spa') { - await builder.generateFallback(fallback); - } else { - writeFileSync(fallback, 'Not Found'); + // client assets and prerendered pages + const assets_dest = `${dest}${builder.config.kit.paths.base}`; + if ( + building_for_cloudflare_pages || + wrangler_config.assets?.not_found_handling === '404-page' + ) { + // generate plaintext 404.html first which can then be overridden by prerendering, if the user defined such a page + const fallback = path.join(assets_dest, '404.html'); + if (options.fallback === 'spa') { + await builder.generateFallback(fallback); + } else { + writeFileSync(fallback, 'Not Found'); + } + } + const client_assets = builder.writeClient(assets_dest); + builder.writePrerendered(assets_dest); + if ( + !building_for_cloudflare_pages && + wrangler_config.assets?.not_found_handling === 'single-page-application' + ) { + await builder.generateFallback(path.join(assets_dest, 'index.html')); } - const dest_dir = `${dest}${builder.config.kit.paths.base}`; - const written_files = builder.writeClient(dest_dir); - builder.writePrerendered(dest_dir); - - const relativePath = path.posix.relative(dest, builder.getServerDirectory()); + // worker + const worker_dest_dir = path.dirname(worker_dest); writeFileSync( `${tmp}/manifest.js`, - `export const manifest = ${builder.generateManifest({ relativePath })};\n\n` + + `export const manifest = ${builder.generateManifest({ relativePath: path.posix.relative(tmp, builder.getServerDirectory()) })};\n\n` + `export const prerendered = new Set(${JSON.stringify(builder.prerendered.paths)});\n\n` + `export const base_path = ${JSON.stringify(builder.config.kit.paths.base)};\n` ); - builder.copy(`${files}/worker.js`, `${dest}/_worker.js`, { + builder.copy(`${files}/worker.js`, worker_dest, { replace: { - SERVER: `${relativePath}/index.js`, - MANIFEST: `${path.posix.relative(dest, tmp)}/manifest.js` + SERVER: `${path.posix.relative(worker_dest_dir, builder.getServerDirectory())}/index.js`, + MANIFEST: `${path.posix.relative(worker_dest_dir, tmp)}/manifest.js`, + ASSETS: assets_binding } }); - writeFileSync( - `${dest}/_routes.json`, - JSON.stringify(get_routes_json(builder, written_files, options.routes ?? {}), null, '\t') - ); - + // _headers if (existsSync('_headers')) { copyFileSync('_headers', `${dest}/_headers`); } - writeFileSync(`${dest}/_headers`, generate_headers(builder.getAppPath()), { flag: 'a' }); + // _redirects if (existsSync('_redirects')) { copyFileSync('_redirects', `${dest}/_redirects`); } - if (builder.prerendered.redirects.size > 0) { writeFileSync(`${dest}/_redirects`, generate_redirects(builder.prerendered.redirects), { flag: 'a' @@ -83,6 +115,13 @@ export default function (options = {}) { } writeFileSync(`${dest}/.assetsignore`, generate_assetsignore(), { flag: 'a' }); + + if (building_for_cloudflare_pages) { + writeFileSync( + `${dest}/_routes.json`, + JSON.stringify(get_routes_json(builder, client_assets, options.routes ?? {}), null, '\t') + ); + } }, emulate() { // we want to invoke `getPlatformProxy` only once, but await it only when it is accessed. @@ -169,7 +208,7 @@ function get_routes_json(builder, assets, { include = ['/*'], exclude = ['' const excess = include.length + exclude.length - 100; if (excess > 0) { - const message = `Function includes/excludes exceeds _routes.json limits (see https://developers.cloudflare.com/pages/platform/functions/routing/#limits). Dropping ${excess} exclude rules — this will cause unnecessary function invocations.`; + const message = `Cloudflare Pages Functions' includes/excludes exceeds _routes.json limits (see https://developers.cloudflare.com/pages/platform/functions/routing/#limits). Dropping ${excess} exclude rules — this will cause unnecessary function invocations.`; builder.log.warn(message); exclude.length -= excess; @@ -220,3 +259,53 @@ _headers _redirects `; } + +/** + * @param {string} config_file + * @returns {import('wrangler').Unstable_Config} + */ +function validate_config(config_file = undefined) { + const wrangler_config = unstable_readConfig({ config: config_file }); + + // we don't support workers sites + if (wrangler_config.site) { + throw new Error( + `You must remove all \`site\` keys in ${wrangler_config.configPath}. Consult https://svelte.dev/docs/kit/adapter-cloudflare#Migrating-from-Workers-Sites-to-Workers-Static-Assets` + ); + } + + if (is_building_for_cloudflare_pages(wrangler_config)) { + return wrangler_config; + } + + // probably deploying to Cloudflare Workers + if (wrangler_config.main || wrangler_config.assets) { + if (!wrangler_config.assets?.directory) { + throw new Error( + `You must specify the \`assets.directory\` key in ${wrangler_config.configPath}. Consult https://developers.cloudflare.com/workers/static-assets/binding/#directory` + ); + } + + if (!wrangler_config.assets?.binding) { + throw new Error( + `You must specify the \`assets.binding\` key in ${wrangler_config.configPath}. Consult https://developers.cloudflare.com/workers/static-assets/binding/#binding` + ); + } + } + + return wrangler_config; +} + +/** + * @param {import('wrangler').Unstable_Config} wrangler_config + * @returns {boolean} + */ +function is_building_for_cloudflare_pages(wrangler_config) { + return ( + !!process.env.CF_PAGES || + !wrangler_config.configPath || + !!wrangler_config.pages_build_output_dir || + !wrangler_config.main || + !wrangler_config.assets + ); +} diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 4c787c346e61..2d3aa42a802b 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -37,13 +37,15 @@ "lint": "prettier --check .", "format": "pnpm lint --write", "check": "tsc --skipLibCheck", - "prepublishOnly": "pnpm build" + "prepublishOnly": "pnpm build", + "test": "pnpm build && pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test" }, "dependencies": { "@cloudflare/workers-types": "^4.20250312.0", "worktop": "0.8.0-next.18" }, "devDependencies": { + "@playwright/test": "^1.44.1", "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", "esbuild": "^0.24.0", @@ -51,6 +53,6 @@ }, "peerDependencies": { "@sveltejs/kit": "^2.0.0", - "wrangler": "^3.87.0 || ^4.0.0" + "wrangler": "^4.0.0" } } diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index c3c27a0b041f..a2ea423c1653 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -9,11 +9,19 @@ const app_path = `/${manifest.appPath}`; const immutable = `${app_path}/immutable/`; const version_file = `${app_path}/version.json`; -/** @type {import('worktop/cfw').Module.Worker<{ ASSETS: import('worktop/cfw.durable').Durable.Object }>} */ -const worker = { +export default { + /** + * @param {Request} req + * @param {{ ASSETS: { fetch: typeof fetch } }} env + * @param {ExecutionContext} context + * @returns {Promise} + */ async fetch(req, env, context) { - // @ts-ignore - await server.init({ env }); + await server.init({ + // @ts-expect-error env contains environment variables and bindings + env + }); + // skip cache if "cache-control: no-cache" in request let pragma = req.headers.get('cache-control') || ''; let res = !pragma.includes('no-cache') && (await Cache.lookup(req)); @@ -28,7 +36,7 @@ const worker = { const stripped_pathname = pathname.replace(/\/$/, ''); - // prerendered pages and /static files + // files in /static, the service worker, and Vite imported server assets let is_static_asset = false; const filename = stripped_pathname.slice(base_path.length + 1); if (filename) { @@ -49,6 +57,7 @@ const worker = { ) { res = await env.ASSETS.fetch(req); } else if (location && prerendered.has(location)) { + // trailing slash redirect for prerendered pages if (search) location += search; res = new Response('', { status: 308, @@ -59,8 +68,14 @@ const worker = { } else { // dynamically-generated pages res = await server.respond(req, { - // @ts-ignore - platform: { env, context, caches, cf: req.cf }, + platform: { + env, + context, + // @ts-expect-error webworker types from worktop are not compatible with Cloudflare Workers types + caches, + // @ts-expect-error the type is correct but ts is confused because platform.cf uses the type from index.ts while req.cf uses the type from index.d.ts + cf: req.cf + }, getClientAddress() { return req.headers.get('cf-connecting-ip'); } @@ -73,5 +88,3 @@ const worker = { return pragma && res.status < 400 ? Cache.save(req, res, context) : res; } }; - -export default worker; diff --git a/packages/adapter-cloudflare-workers/.gitignore b/packages/adapter-cloudflare/test/apps/pages/.gitignore similarity index 50% rename from packages/adapter-cloudflare-workers/.gitignore rename to packages/adapter-cloudflare/test/apps/pages/.gitignore index 9daa8247da45..1bd7b63de4b6 100644 --- a/packages/adapter-cloudflare-workers/.gitignore +++ b/packages/adapter-cloudflare/test/apps/pages/.gitignore @@ -1,2 +1,4 @@ .DS_Store node_modules +/.svelte-kit +/.wrangler \ No newline at end of file diff --git a/packages/adapter-cloudflare/test/apps/pages/package.json b/packages/adapter-cloudflare/test/apps/pages/package.json new file mode 100644 index 000000000000..af7c37ad2003 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/package.json @@ -0,0 +1,21 @@ +{ + "name": "test-cloudflare-pages", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "wrangler pages dev .svelte-kit/cloudflare --port 8787", + "prepare": "svelte-kit sync || echo ''", + "test": "playwright test" + }, + "devDependencies": { + "@sveltejs/kit": "workspace:^", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "server-side-dep": "file:server-side-dep", + "svelte": "^5.23.1", + "vite": "^6.0.11", + "wrangler": "^4.0.0" + }, + "type": "module" +} diff --git a/packages/adapter-cloudflare/test/apps/pages/playwright.config.js b/packages/adapter-cloudflare/test/apps/pages/playwright.config.js new file mode 100644 index 000000000000..33d36b651014 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/playwright.config.js @@ -0,0 +1 @@ +export { config as default } from '../../utils.js'; diff --git a/packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.d.ts b/packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.d.ts new file mode 100644 index 000000000000..0e1188e04a67 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.d.ts @@ -0,0 +1 @@ +export function sum(a: number, b: number): number; diff --git a/packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.js b/packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.js new file mode 100644 index 000000000000..568b90577d43 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/server-side-dep/index.js @@ -0,0 +1,4 @@ +/** @type {import('./index.js').sum} */ +export function sum(a, b) { + return a + b; +} diff --git a/packages/adapter-cloudflare/test/apps/pages/server-side-dep/package.json b/packages/adapter-cloudflare/test/apps/pages/server-side-dep/package.json new file mode 100644 index 000000000000..5b26c9d1855a --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/server-side-dep/package.json @@ -0,0 +1,11 @@ +{ + "name": "server-side-dep", + "version": "0.0.1", + "type": "module", + "exports": { + ".": { + "default": "./index.js", + "types": "./index.d.ts" + } + } +} diff --git a/packages/adapter-cloudflare/test/apps/pages/src/app.html b/packages/adapter-cloudflare/test/apps/pages/src/app.html new file mode 100644 index 000000000000..d533c5e31716 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js b/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js new file mode 100644 index 000000000000..2e1aac593126 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js @@ -0,0 +1,7 @@ +import { sum } from 'server-side-dep'; + +export function load() { + return { + sum: sum(1, 2) + }; +} diff --git a/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.svelte b/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.svelte new file mode 100644 index 000000000000..d5e339683387 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.svelte @@ -0,0 +1,5 @@ + + +

Sum: {data.sum}

diff --git a/packages/adapter-cloudflare/test/apps/pages/svelte.config.js b/packages/adapter-cloudflare/test/apps/pages/svelte.config.js new file mode 100644 index 000000000000..20cd2b3ff5b8 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/svelte.config.js @@ -0,0 +1,10 @@ +import adapter from '../../../index.js'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + adapter: adapter() + } +}; + +export default config; diff --git a/packages/adapter-cloudflare/test/apps/pages/test/test.js b/packages/adapter-cloudflare/test/apps/pages/test/test.js new file mode 100644 index 000000000000..aab7cbca568a --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/test/test.js @@ -0,0 +1,6 @@ +import { expect, test } from '@playwright/test'; + +test('worker works', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('h1')).toContainText('Sum: 3'); +}); diff --git a/packages/adapter-cloudflare/test/apps/pages/tsconfig.json b/packages/adapter-cloudflare/test/apps/pages/tsconfig.json new file mode 100644 index 000000000000..34380ebc986e --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + }, + "extends": "./.svelte-kit/tsconfig.json" +} diff --git a/packages/adapter-cloudflare/test/apps/pages/vite.config.js b/packages/adapter-cloudflare/test/apps/pages/vite.config.js new file mode 100644 index 000000000000..29ad08debe6a --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/pages/vite.config.js @@ -0,0 +1,11 @@ +import { sveltekit } from '@sveltejs/kit/vite'; + +/** @type {import('vite').UserConfig} */ +const config = { + build: { + minify: false + }, + plugins: [sveltekit()] +}; + +export default config; diff --git a/packages/adapter-cloudflare/test/apps/workers/.gitignore b/packages/adapter-cloudflare/test/apps/workers/.gitignore new file mode 100644 index 000000000000..f9ee23cc8621 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/.gitignore @@ -0,0 +1,5 @@ +.DS_Store +node_modules +/.svelte-kit +/.wrangler +/dist \ No newline at end of file diff --git a/packages/adapter-cloudflare/test/apps/workers/package.json b/packages/adapter-cloudflare/test/apps/workers/package.json new file mode 100644 index 000000000000..43cf8da6bd9f --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/package.json @@ -0,0 +1,21 @@ +{ + "name": "test-cloudflare-workers", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "wrangler dev dist/index.js", + "prepare": "svelte-kit sync || echo ''", + "test": "playwright test" + }, + "devDependencies": { + "@sveltejs/kit": "workspace:^", + "@sveltejs/vite-plugin-svelte": "^5.0.1", + "server-side-dep": "file:server-side-dep", + "svelte": "^5.23.1", + "vite": "^6.0.11", + "wrangler": "^4.0.0" + }, + "type": "module" +} diff --git a/packages/adapter-cloudflare/test/apps/workers/playwright.config.js b/packages/adapter-cloudflare/test/apps/workers/playwright.config.js new file mode 100644 index 000000000000..33d36b651014 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/playwright.config.js @@ -0,0 +1 @@ +export { config as default } from '../../utils.js'; diff --git a/packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.d.ts b/packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.d.ts new file mode 100644 index 000000000000..0e1188e04a67 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.d.ts @@ -0,0 +1 @@ +export function sum(a: number, b: number): number; diff --git a/packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.js b/packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.js new file mode 100644 index 000000000000..568b90577d43 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/server-side-dep/index.js @@ -0,0 +1,4 @@ +/** @type {import('./index.js').sum} */ +export function sum(a, b) { + return a + b; +} diff --git a/packages/adapter-cloudflare/test/apps/workers/server-side-dep/package.json b/packages/adapter-cloudflare/test/apps/workers/server-side-dep/package.json new file mode 100644 index 000000000000..5b26c9d1855a --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/server-side-dep/package.json @@ -0,0 +1,11 @@ +{ + "name": "server-side-dep", + "version": "0.0.1", + "type": "module", + "exports": { + ".": { + "default": "./index.js", + "types": "./index.d.ts" + } + } +} diff --git a/packages/adapter-cloudflare/test/apps/workers/src/app.html b/packages/adapter-cloudflare/test/apps/workers/src/app.html new file mode 100644 index 000000000000..d533c5e31716 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/src/app.html @@ -0,0 +1,11 @@ + + + + + + %sveltekit.head% + + +
%sveltekit.body%
+ + diff --git a/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js b/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js new file mode 100644 index 000000000000..2e1aac593126 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js @@ -0,0 +1,7 @@ +import { sum } from 'server-side-dep'; + +export function load() { + return { + sum: sum(1, 2) + }; +} diff --git a/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.svelte b/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.svelte new file mode 100644 index 000000000000..d5e339683387 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.svelte @@ -0,0 +1,5 @@ + + +

Sum: {data.sum}

diff --git a/packages/adapter-cloudflare/test/apps/workers/svelte.config.js b/packages/adapter-cloudflare/test/apps/workers/svelte.config.js new file mode 100644 index 000000000000..20cd2b3ff5b8 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/svelte.config.js @@ -0,0 +1,10 @@ +import adapter from '../../../index.js'; + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + kit: { + adapter: adapter() + } +}; + +export default config; diff --git a/packages/adapter-cloudflare/test/apps/workers/test/test.js b/packages/adapter-cloudflare/test/apps/workers/test/test.js new file mode 100644 index 000000000000..aab7cbca568a --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/test/test.js @@ -0,0 +1,6 @@ +import { expect, test } from '@playwright/test'; + +test('worker works', async ({ page }) => { + await page.goto('/'); + await expect(page.locator('h1')).toContainText('Sum: 3'); +}); diff --git a/packages/adapter-cloudflare/test/apps/workers/tsconfig.json b/packages/adapter-cloudflare/test/apps/workers/tsconfig.json new file mode 100644 index 000000000000..34380ebc986e --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/tsconfig.json @@ -0,0 +1,14 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + }, + "extends": "./.svelte-kit/tsconfig.json" +} diff --git a/packages/adapter-cloudflare/test/apps/workers/vite.config.js b/packages/adapter-cloudflare/test/apps/workers/vite.config.js new file mode 100644 index 000000000000..29ad08debe6a --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/vite.config.js @@ -0,0 +1,11 @@ +import { sveltekit } from '@sveltejs/kit/vite'; + +/** @type {import('vite').UserConfig} */ +const config = { + build: { + minify: false + }, + plugins: [sveltekit()] +}; + +export default config; diff --git a/packages/adapter-cloudflare/test/apps/workers/wrangler.jsonc b/packages/adapter-cloudflare/test/apps/workers/wrangler.jsonc new file mode 100644 index 000000000000..1f2cb073f7b6 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/wrangler.jsonc @@ -0,0 +1,7 @@ +{ + "main": "./dist/index.js", + "assets": { + "directory": "./dist/public", + "binding": "ASSETS" + } +} diff --git a/packages/adapter-cloudflare/test/utils.js b/packages/adapter-cloudflare/test/utils.js new file mode 100644 index 000000000000..719822d7aa53 --- /dev/null +++ b/packages/adapter-cloudflare/test/utils.js @@ -0,0 +1,28 @@ +import { devices } from '@playwright/test'; +import process from 'node:process'; + +/** @type {import('@playwright/test').PlaywrightTestConfig} */ +export const config = { + forbidOnly: !!process.env.CI, + // generous timeouts on CI + timeout: process.env.CI ? 45000 : 15000, + webServer: { + command: 'pnpm build && pnpm preview', + port: 8787 + }, + retries: process.env.CI ? 2 : 0, + projects: [ + { + name: 'chromium' + } + ], + use: { + ...devices['Desktop Chrome'], + screenshot: 'only-on-failure', + trace: 'retain-on-failure' + }, + workers: process.env.CI ? 2 : undefined, + reporter: 'list', + testDir: 'test', + testMatch: /(.+\.)?(test|spec)\.[jt]s/ +}; diff --git a/packages/adapter-cloudflare/tsconfig.json b/packages/adapter-cloudflare/tsconfig.json index b258035a3555..dea57ac8d9a4 100644 --- a/packages/adapter-cloudflare/tsconfig.json +++ b/packages/adapter-cloudflare/tsconfig.json @@ -10,7 +10,10 @@ "baseUrl": ".", "paths": { "@sveltejs/kit": ["../kit/types/index"] - } + }, + // taken from the Cloudflare Workers TypeScript template https://github.com/cloudflare/workers-sdk/blob/main/packages/create-cloudflare/templates/hello-world/ts/tsconfig.json + "lib": ["es2021"], + "types": ["@cloudflare/workers-types"] }, - "include": ["index.js", "internal.d.ts", "src/worker.js"] + "include": ["index.js", "utils.js", "test/utils.js", "internal.d.ts", "src/worker.js"] } diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index a36379053856..fab80ccaef95 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -17,7 +17,6 @@ "devDependencies": { "@sveltejs/adapter-auto": "workspace:*", "@sveltejs/adapter-cloudflare": "workspace:*", - "@sveltejs/adapter-cloudflare-workers": "workspace:*", "@sveltejs/adapter-netlify": "workspace:*", "@sveltejs/adapter-node": "workspace:*", "@sveltejs/adapter-static": "workspace:*", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1935a7b66ebd..09d9e10803c5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,9 +64,12 @@ importers: specifier: 0.8.0-next.18 version: 0.8.0-next.18 wrangler: - specifier: ^3.87.0 || ^4.0.0 + specifier: ^4.0.0 version: 4.0.0(@cloudflare/workers-types@4.20250312.0) devDependencies: + '@playwright/test': + specifier: ^1.44.1 + version: 1.44.1 '@sveltejs/kit': specifier: workspace:^ version: link:../kit @@ -80,30 +83,47 @@ importers: specifier: ^5.3.3 version: 5.6.3 - packages/adapter-cloudflare-workers: - dependencies: - '@cloudflare/workers-types': - specifier: ^4.20250312.0 - version: 4.20250312.0 - esbuild: - specifier: ^0.24.0 - version: 0.24.2 + packages/adapter-cloudflare/test/apps/pages: + devDependencies: + '@sveltejs/kit': + specifier: workspace:^ + version: link:../../../../kit + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.1 + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + server-side-dep: + specifier: file:server-side-dep + version: file:packages/adapter-cloudflare/test/apps/pages/server-side-dep + svelte: + specifier: ^5.23.1 + version: 5.23.1 + vite: + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) wrangler: - specifier: ^3.91.0 || ^4.0.0 + specifier: ^4.0.0 version: 4.0.0(@cloudflare/workers-types@4.20250312.0) + + packages/adapter-cloudflare/test/apps/workers: devDependencies: - '@cloudflare/kv-asset-handler': - specifier: ^0.4.0 - version: 0.4.0 '@sveltejs/kit': specifier: workspace:^ - version: link:../kit - '@types/node': - specifier: ^18.19.48 - version: 18.19.50 - typescript: - specifier: ^5.3.3 - version: 5.6.3 + version: link:../../../../kit + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.1 + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + server-side-dep: + specifier: file:server-side-dep + version: file:packages/adapter-cloudflare/test/apps/workers/server-side-dep + svelte: + specifier: ^5.23.1 + version: 5.23.1 + vite: + specifier: ^6.0.11 + version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + wrangler: + specifier: ^4.0.0 + version: 4.0.0(@cloudflare/workers-types@4.20250312.0) packages/adapter-netlify: dependencies: @@ -1124,9 +1144,6 @@ importers: '@sveltejs/adapter-cloudflare': specifier: workspace:* version: link:../../packages/adapter-cloudflare - '@sveltejs/adapter-cloudflare-workers': - specifier: workspace:* - version: link:../../packages/adapter-cloudflare-workers '@sveltejs/adapter-netlify': specifier: workspace:* version: link:../../packages/adapter-netlify @@ -3066,6 +3083,12 @@ packages: engines: {node: '>=10'} hasBin: true + server-side-dep@file:packages/adapter-cloudflare/test/apps/pages/server-side-dep: + resolution: {directory: packages/adapter-cloudflare/test/apps/pages/server-side-dep, type: directory} + + server-side-dep@file:packages/adapter-cloudflare/test/apps/workers/server-side-dep: + resolution: {directory: packages/adapter-cloudflare/test/apps/workers/server-side-dep, type: directory} + set-cookie-parser@2.6.0: resolution: {integrity: sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==} @@ -5358,6 +5381,10 @@ snapshots: semver@7.7.1: {} + server-side-dep@file:packages/adapter-cloudflare/test/apps/pages/server-side-dep: {} + + server-side-dep@file:packages/adapter-cloudflare/test/apps/workers/server-side-dep: {} + set-cookie-parser@2.6.0: {} sharp@0.33.5: diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index a390bbed591a..3ecf23a8fd4b 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,5 +1,6 @@ packages: - 'packages/*' + - 'packages/adapter-cloudflare/test/apps/*' - 'packages/adapter-static/test/apps/*' - 'packages/kit/test/apps/*' - 'packages/kit/test/prerendering/*' From a9805eea0aa79ce390e968fefc67fa1f2fb64ee2 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 19:49:00 -0700 Subject: [PATCH 1019/1135] chore(deps): update dependency vite to v6.0.13 [security] (#13643) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 09d9e10803c5..dfe16eebb55c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1924,8 +1924,8 @@ packages: resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.28.0': - resolution: {integrity: sha512-u2oITX3BJwzWCapoZ/pXw6BCOl8rJP4Ij/3wPoGvY8XwvXflOzd1kLrDUUUAIEdJSFh+ASwdTHqtan9xSg8buw==} + '@typescript-eslint/scope-manager@8.29.0': + resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.26.0': @@ -1939,8 +1939,8 @@ packages: resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.28.0': - resolution: {integrity: sha512-bn4WS1bkKEjx7HqiwG2JNB3YJdC1q6Ue7GyGlwPHyt0TnVq6TtD/hiOdTZt71sq0s7UzqBFXD8t8o2e63tXgwA==} + '@typescript-eslint/types@8.29.0': + resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.26.0': @@ -1949,8 +1949,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.28.0': - resolution: {integrity: sha512-H74nHEeBGeklctAVUvmDkxB1mk+PAZ9FiOMPFncdqeRBXxk1lWSYraHw8V12b7aa6Sg9HOBNbGdSHobBPuQSuA==} + '@typescript-eslint/typescript-estree@8.29.0': + resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -1962,8 +1962,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.28.0': - resolution: {integrity: sha512-OELa9hbTYciYITqgurT1u/SzpQVtDLmQMFzy/N8pQE+tefOyCWT79jHsav294aTqV1q1u+VzqDGbuujvRYaeSQ==} + '@typescript-eslint/utils@8.29.0': + resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1973,8 +1973,8 @@ packages: resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.28.0': - resolution: {integrity: sha512-hbn8SZ8w4u2pRwgQ1GlUrPKE+t2XvcCW5tTRF7j6SMYIuYG37XuzIW44JCZPa36evi0Oy2SnM664BlIaAuQcvg==} + '@typescript-eslint/visitor-keys@8.29.0': + resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vercel/nft@0.29.2': @@ -4251,10 +4251,10 @@ snapshots: '@typescript-eslint/types': 8.26.0 '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/scope-manager@8.28.0': + '@typescript-eslint/scope-manager@8.29.0': dependencies: - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/visitor-keys': 8.28.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: @@ -4269,7 +4269,7 @@ snapshots: '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/types@8.28.0': {} + '@typescript-eslint/types@8.29.0': {} '@typescript-eslint/typescript-estree@8.26.0(typescript@5.6.3)': dependencies: @@ -4285,10 +4285,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.28.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.29.0(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/visitor-keys': 8.28.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/visitor-keys': 8.29.0 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -4310,12 +4310,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.28.0(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.29.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.28.0 - '@typescript-eslint/types': 8.28.0 - '@typescript-eslint/typescript-estree': 8.28.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.29.0 + '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.6.3) eslint: 9.6.0 typescript: 5.6.3 transitivePeerDependencies: @@ -4326,9 +4326,9 @@ snapshots: '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.28.0': + '@typescript-eslint/visitor-keys@8.29.0': dependencies: - '@typescript-eslint/types': 8.28.0 + '@typescript-eslint/types': 8.29.0 eslint-visitor-keys: 4.2.0 '@vercel/nft@0.29.2(rollup@4.30.1)': @@ -4663,7 +4663,7 @@ snapshots: eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) - '@typescript-eslint/utils': 8.28.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.29.0(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) From 12925fb1665c0de1619b2eece237414f0ca686fc Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 1 Apr 2025 19:59:42 -0700 Subject: [PATCH 1020/1135] docs: escape underscore so it is not rendered as italic --- documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index a8fbb725d9d2..7fe0def724bd 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -159,7 +159,7 @@ Cloudflare specific values in the `platform` property are emulated during dev an For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 4**. Once you have built your site, run `wrangler dev .svelte-kit/cloudflare` if you're testing for Cloudflare Workers or `wrangler pages dev .svelte-kit/cloudflare` for Cloudflare Pages. -## `_headers` and `_redirects` +## \_headers and \_redirects The [`_headers`](https://developers.cloudflare.com/pages/configuration/headers/) and [`_redirects`](https://developers.cloudflare.com/pages/configuration/redirects/) files specific can be used for static asset responses (like images) by putting them into the project root folder. From 564500b394c7b8b42a15fecaa6fd366599a035d4 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Wed, 2 Apr 2025 11:18:51 +0800 Subject: [PATCH 1021/1135] docs: avoid using titles that have _ in them (#13660) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .../docs/25-build-and-deploy/60-adapter-cloudflare.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index 7fe0def724bd..a74d68859edc 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -159,9 +159,9 @@ Cloudflare specific values in the `platform` property are emulated during dev an For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 4**. Once you have built your site, run `wrangler dev .svelte-kit/cloudflare` if you're testing for Cloudflare Workers or `wrangler pages dev .svelte-kit/cloudflare` for Cloudflare Pages. -## \_headers and \_redirects +## Headers and redirects -The [`_headers`](https://developers.cloudflare.com/pages/configuration/headers/) and [`_redirects`](https://developers.cloudflare.com/pages/configuration/redirects/) files specific can be used for static asset responses (like images) by putting them into the project root folder. +The [`_headers`](https://developers.cloudflare.com/pages/configuration/headers/) and [`_redirects`](https://developers.cloudflare.com/pages/configuration/redirects/) files, specific to Cloudflare, can be used for static asset responses (like images) by putting them into the project root folder. However, they will have no effect on responses dynamically rendered by SvelteKit, which should return custom headers or redirect responses from [server endpoints](routing#server) or with the [`handle`](hooks#Server-hooks-handle) hook. @@ -226,4 +226,4 @@ assets.binding = "ASSETS"+++ "binding": "ASSETS" }+++ } -``` \ No newline at end of file +``` From fa29a79a766159dad4e14dcd2c4069230d3fee76 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 20:31:31 -0700 Subject: [PATCH 1022/1135] Version Packages (#13632) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/angry-ravens-eat.md | 5 ----- .changeset/eleven-ears-hide.md | 5 ----- .changeset/kind-carrots-deliver.md | 5 ----- packages/adapter-cloudflare/CHANGELOG.md | 15 +++++++++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 8 files changed, 24 insertions(+), 18 deletions(-) delete mode 100644 .changeset/angry-ravens-eat.md delete mode 100644 .changeset/eleven-ears-hide.md delete mode 100644 .changeset/kind-carrots-deliver.md diff --git a/.changeset/angry-ravens-eat.md b/.changeset/angry-ravens-eat.md deleted file mode 100644 index 539c2cc946d7..000000000000 --- a/.changeset/angry-ravens-eat.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: only call `afterNavigate` once on app start when SSR is disabled diff --git a/.changeset/eleven-ears-hide.md b/.changeset/eleven-ears-hide.md deleted file mode 100644 index 75869df94859..000000000000 --- a/.changeset/eleven-ears-hide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -chore: remove `esbuild` as dependency diff --git a/.changeset/kind-carrots-deliver.md b/.changeset/kind-carrots-deliver.md deleted file mode 100644 index 3e59bbc5d6e6..000000000000 --- a/.changeset/kind-carrots-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': major ---- - -feat: support specifically building for Cloudflare Workers Static Assets diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 76802ad572b7..0f78effce1ef 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,20 @@ # @sveltejs/adapter-cloudflare +## 7.0.0 +### Major Changes + + +- feat: support specifically building for Cloudflare Workers Static Assets ([#13634](https://github.com/sveltejs/kit/pull/13634)) + + +### Patch Changes + + +- chore: remove `esbuild` as dependency ([#13633](https://github.com/sveltejs/kit/pull/13633)) + +- Updated dependencies [[`370e9f95c1d6efd5393f73d2dbef68143b27f681`](https://github.com/sveltejs/kit/commit/370e9f95c1d6efd5393f73d2dbef68143b27f681)]: + - @sveltejs/kit@2.20.3 + ## 6.0.1 ### Patch Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 2d3aa42a802b..66459941c481 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "6.0.1", + "version": "7.0.0", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 2f3e1790336a..6b95b44dd045 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.3 +### Patch Changes + + +- fix: only call `afterNavigate` once on app start when SSR is disabled ([#13593](https://github.com/sveltejs/kit/pull/13593)) + ## 2.20.2 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 105470b94170..07f6315ba23c 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.2", + "version": "2.20.3", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index f18dad60e55a..e11001d5013a 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.2'; +export const VERSION = '2.20.3'; From d59d78ca799b293a1d8a40e9d5cb5662f9b6486d Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 1 Apr 2025 20:48:19 -0700 Subject: [PATCH 1023/1135] docs: shorten header --- documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index a74d68859edc..48a9ecb3e8d0 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -186,7 +186,7 @@ When deploying your application, the server generated by SvelteKit is bundled in You can't use `fs` in Cloudflare Workers — you must [prerender](page-options#prerender) the routes in question. -## Migrating from Workers Sites to Workers Static Assets +## Migrating from Workers Sites Cloudflare no longer recommends using [Workers Sites](https://developers.cloudflare.com/workers/configuration/sites/configuration/) and instead recommends using [Workers Static Assets](https://developers.cloudflare.com/workers/static-assets/). To migrate, replace `@sveltejs/adapter-cloudflare-workers` with `@sveltejs/adapter-cloudflare` and remove all `site` configuration settings from your Wrangler configuration file, then add the `assets.directory` and `assets.binding` configuration settings: From 01a2681eb18feb100e4e9ee33b36351f693343f5 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 1 Apr 2025 21:22:46 -0700 Subject: [PATCH 1024/1135] chore: upgrade `@sveltejs/adapter-cloudflare` to version 7 (#13661) --- .changeset/curvy-dodos-clean.md | 5 +++++ packages/adapter-auto/adapters.js | 2 +- 2 files changed, 6 insertions(+), 1 deletion(-) create mode 100644 .changeset/curvy-dodos-clean.md diff --git a/.changeset/curvy-dodos-clean.md b/.changeset/curvy-dodos-clean.md new file mode 100644 index 000000000000..1a859bd73147 --- /dev/null +++ b/.changeset/curvy-dodos-clean.md @@ -0,0 +1,5 @@ +--- +"@sveltejs/adapter-auto": major +--- + +feat: upgrade `@sveltejs/adapter-cloudflare` to version 7 diff --git a/packages/adapter-auto/adapters.js b/packages/adapter-auto/adapters.js index 58fb79eb63f3..94fe1417ec73 100644 --- a/packages/adapter-auto/adapters.js +++ b/packages/adapter-auto/adapters.js @@ -13,7 +13,7 @@ export const adapters = [ name: 'Cloudflare Pages', test: () => !!process.env.CF_PAGES, module: '@sveltejs/adapter-cloudflare', - version: '6' + version: '7' }, { name: 'Netlify', From 84eb6c20717cd0eb3f8bfa8d6462709e351e801c Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 1 Apr 2025 21:23:46 -0700 Subject: [PATCH 1025/1135] Version Packages (#13662) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/curvy-dodos-clean.md | 5 ----- packages/adapter-auto/CHANGELOG.md | 6 ++++++ packages/adapter-auto/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/curvy-dodos-clean.md diff --git a/.changeset/curvy-dodos-clean.md b/.changeset/curvy-dodos-clean.md deleted file mode 100644 index 1a859bd73147..000000000000 --- a/.changeset/curvy-dodos-clean.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -"@sveltejs/adapter-auto": major ---- - -feat: upgrade `@sveltejs/adapter-cloudflare` to version 7 diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index 829946b2e48f..d530b435e833 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-auto +## 6.0.0 +### Major Changes + + +- feat: upgrade `@sveltejs/adapter-cloudflare` to version 7 ([#13661](https://github.com/sveltejs/kit/pull/13661)) + ## 5.0.0 ### Major Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index f92ae66ecc77..38b900a2be02 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-auto", - "version": "5.0.0", + "version": "6.0.0", "description": "Automatically chooses the SvelteKit adapter for your current environment, if possible.", "keywords": [ "adapter", From aefa5b1e0f87ae9d1487f31c9d517b7677877dd7 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Wed, 2 Apr 2025 10:38:32 +0200 Subject: [PATCH 1026/1135] chore: tweak tsconfig includes (#13663) this should hopefully make the editor experience more stable, as the chance of the world being loaded in is minimized. Previously (I think) the import of the general utils file from any of the project's test files meant that as soon as you open one test project, all the test projects at once were loaded into memory, including stuff from .svelte-kit, because the general test config didn't have an include config. Also removes an unnecessary duplicate from the kit root tsconfig --- packages/kit/test/build-errors/tsconfig.json | 13 +++++++++++++ packages/kit/test/tsconfig.json | 3 ++- packages/kit/tsconfig.json | 2 +- 3 files changed, 16 insertions(+), 2 deletions(-) create mode 100644 packages/kit/test/build-errors/tsconfig.json diff --git a/packages/kit/test/build-errors/tsconfig.json b/packages/kit/test/build-errors/tsconfig.json new file mode 100644 index 000000000000..e502a4f0c0d3 --- /dev/null +++ b/packages/kit/test/build-errors/tsconfig.json @@ -0,0 +1,13 @@ +{ + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "noEmit": true, + "strict": true, + "target": "esnext", + "module": "esnext", + "moduleResolution": "node", + "allowSyntheticDefaultImports": true + }, + "include": ["./*"] +} diff --git a/packages/kit/test/tsconfig.json b/packages/kit/test/tsconfig.json index bcdbf6a2f066..4e6297280a0e 100644 --- a/packages/kit/test/tsconfig.json +++ b/packages/kit/test/tsconfig.json @@ -8,5 +8,6 @@ "module": "esnext", "moduleResolution": "node", "allowSyntheticDefaultImports": true - } + }, + "include": ["./*", "./mocks/**/*", "./prerendering/*"] } diff --git a/packages/kit/tsconfig.json b/packages/kit/tsconfig.json index 2fe96624a921..154c2a7fbfa9 100644 --- a/packages/kit/tsconfig.json +++ b/packages/kit/tsconfig.json @@ -17,6 +17,6 @@ "noUnusedLocals": true, "noUnusedParameters": true }, - "include": ["*.js", "scripts/**/*", "src/**/*", "src/types/**/*"], + "include": ["*.js", "scripts/**/*", "src/**/*"], "exclude": ["./**/write_types/test/**"] } From 7fd7bcb7142e7d0d2dd64174fa1a94d56a45d643 Mon Sep 17 00:00:00 2001 From: Simon H <5968653+dummdidumm@users.noreply.github.com> Date: Thu, 3 Apr 2025 14:19:57 +0200 Subject: [PATCH 1027/1135] chore: get rid of class-replacement hack (#13664) We previously used a grotesque hack that would ensure the HttpError etc classes would be the same between what Vite imports via its transformation toolchain and what you get from a regular node import. Turns out we don't need that anymore - since #9242 SvelteKit is guaranteed to always be loaded through the Vite toolchain. --- .changeset/olive-mugs-search.md | 5 +++++ packages/kit/src/exports/vite/dev/index.js | 26 ---------------------- packages/kit/src/runtime/control.js | 24 -------------------- 3 files changed, 5 insertions(+), 50 deletions(-) create mode 100644 .changeset/olive-mugs-search.md diff --git a/.changeset/olive-mugs-search.md b/.changeset/olive-mugs-search.md new file mode 100644 index 000000000000..86613bcb3549 --- /dev/null +++ b/.changeset/olive-mugs-search.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +chore: remove internal class-replacement hack that isn't needed anymore diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 7049d8910508..ded4685f527c 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -392,32 +392,6 @@ export async function dev(vite, vite_config, svelte_config) { } }); - async function align_exports() { - // This shameful hack allows us to load runtime server code via Vite - // while apps load `HttpError` and `Redirect` in Node, without - // causing `instanceof` checks to fail - const control_module_node = await import('../../../runtime/control.js'); - const control_module_vite = await vite.ssrLoadModule(`${runtime_base}/control.js`); - - control_module_node.replace_implementations({ - ActionFailure: control_module_vite.ActionFailure, - HttpError: control_module_vite.HttpError, - Redirect: control_module_vite.Redirect, - SvelteKitError: control_module_vite.SvelteKitError - }); - } - await align_exports(); - const ws_send = vite.ws.send; - /** @param {any} args */ - vite.ws.send = function (...args) { - // We need to reapply the patch after Vite did dependency optimizations - // because that clears the module resolutions - if (args[0]?.type === 'full-reload' && args[0].path === '*') { - void align_exports(); - } - return ws_send.apply(vite.ws, args); - }; - vite.middlewares.use((req, res, next) => { const base = `${vite.config.server.https ? 'https' : 'http'}://${ req.headers[':authority'] || req.headers.host diff --git a/packages/kit/src/runtime/control.js b/packages/kit/src/runtime/control.js index 64737a9cff1d..aa0b93f8965b 100644 --- a/packages/kit/src/runtime/control.js +++ b/packages/kit/src/runtime/control.js @@ -61,27 +61,3 @@ export class ActionFailure { this.data = data; } } - -/** - * This is a grotesque hack that, in dev, allows us to replace the implementations - * of these classes that you'd get by importing them from `@sveltejs/kit` with the - * ones that are imported via Vite and loaded internally, so that instanceof - * checks work even though SvelteKit imports this module via Vite and consumers - * import it via Node - * @param {{ - * ActionFailure: typeof ActionFailure; - * HttpError: typeof HttpError; - * Redirect: typeof Redirect; - * SvelteKitError: typeof SvelteKitError; - * }} implementations - */ -export function replace_implementations(implementations) { - // @ts-expect-error - ActionFailure = implementations.ActionFailure; // eslint-disable-line no-class-assign - // @ts-expect-error - HttpError = implementations.HttpError; // eslint-disable-line no-class-assign - // @ts-expect-error - Redirect = implementations.Redirect; // eslint-disable-line no-class-assign - // @ts-expect-error - SvelteKitError = implementations.SvelteKitError; // eslint-disable-line no-class-assign -} From 50d9072a653ef93613ddd76d5a6ba7d15b6a321a Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Thu, 3 Apr 2025 20:24:04 +0800 Subject: [PATCH 1028/1135] fix: correctly resolve paths provided through Wrangler config on Windows (#13671) * fix fixes #13667 This PR uses the non-posix relative() method so that it correctly resolves when used with Windows paths that may be provided through the Wrangler configuration. It also converts the path to a POSIX path before embedding them into the worker script since backslashes get interpreted as escape characters and are lost in the process. Also includes a minor fix where if the user had pages_build_output_dir set in their wrangler configuration, the adapter wasn't writing the worker to that directory (Cloudflare Pages expects the worker and assets to be in the same directory). --- .changeset/bright-houses-kick.md | 5 +++++ .changeset/gentle-parrots-clap.md | 5 +++++ packages/adapter-cloudflare/index.js | 13 +++++++++++-- 3 files changed, 21 insertions(+), 2 deletions(-) create mode 100644 .changeset/bright-houses-kick.md create mode 100644 .changeset/gentle-parrots-clap.md diff --git a/.changeset/bright-houses-kick.md b/.changeset/bright-houses-kick.md new file mode 100644 index 000000000000..4239b45c8189 --- /dev/null +++ b/.changeset/bright-houses-kick.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: correctly write the worker to the `pages_build_output_dir` path if set in the Wrangler configuration path diff --git a/.changeset/gentle-parrots-clap.md b/.changeset/gentle-parrots-clap.md new file mode 100644 index 000000000000..889a8a14fe1b --- /dev/null +++ b/.changeset/gentle-parrots-clap.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: correctly resolve paths provided by the Wrangler config on Windows diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 39260432c9d8..af99452ef8fd 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -37,6 +37,7 @@ export default function (options = {}) { if (building_for_cloudflare_pages) { if (wrangler_config.pages_build_output_dir) { dest = wrangler_config.pages_build_output_dir; + worker_dest = `${dest}/_worker.js`; } } else { if (wrangler_config.main) { @@ -92,8 +93,11 @@ export default function (options = {}) { ); builder.copy(`${files}/worker.js`, worker_dest, { replace: { - SERVER: `${path.posix.relative(worker_dest_dir, builder.getServerDirectory())}/index.js`, - MANIFEST: `${path.posix.relative(worker_dest_dir, tmp)}/manifest.js`, + // the paths returned by the Wrangler config might be Windows paths, + // so we need to convert them to POSIX paths or else the backslashes + // will be interpreted as escape characters and create an incorrect import path + SERVER: `${posixify(path.relative(worker_dest_dir, builder.getServerDirectory()))}/index.js`, + MANIFEST: `${posixify(path.relative(worker_dest_dir, tmp))}/manifest.js`, ASSETS: assets_binding } }); @@ -309,3 +313,8 @@ function is_building_for_cloudflare_pages(wrangler_config) { !wrangler_config.assets ); } + +/** @param {string} str */ +function posixify(str) { + return str.replace(/\\/g, '/'); +} From 810063536faf2093589befb0cf90aef21e99a8e8 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 4 Apr 2025 09:35:56 -0400 Subject: [PATCH 1029/1135] add pkg.pr.new workflows (#13676) --- .github/workflows/pkg.pr.new-comment.yml | 108 +++++++++++++++++++++++ .github/workflows/pkg.pr.new.yml | 47 ++++++++++ 2 files changed, 155 insertions(+) create mode 100644 .github/workflows/pkg.pr.new-comment.yml create mode 100644 .github/workflows/pkg.pr.new.yml diff --git a/.github/workflows/pkg.pr.new-comment.yml b/.github/workflows/pkg.pr.new-comment.yml new file mode 100644 index 000000000000..9f1eaa7a13ac --- /dev/null +++ b/.github/workflows/pkg.pr.new-comment.yml @@ -0,0 +1,108 @@ +name: Update pkg.pr.new comment + +on: + workflow_run: + workflows: ['Publish Any Commit'] + types: + - completed + +permissions: + pull-requests: write + +jobs: + build: + name: 'Update comment' + runs-on: ubuntu-latest + steps: + - uses: GitHubSecurityLab/actions-permissions/monitor@v1 + - name: Download artifact + uses: actions/download-artifact@v4 + with: + name: output + github-token: ${{ secrets.GITHUB_TOKEN }} + run-id: ${{ github.event.workflow_run.id }} + + - run: ls -R . + - name: 'Post or update comment' + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const output = JSON.parse(fs.readFileSync('output.json', 'utf8')); + + const bot_comment_identifier = ``; + + const body = (number) => `${bot_comment_identifier} + + \`\`\` + ${output.packages.map((p) => `pnpm add https://pkg.pr.new/${p.name}@${number}`).join('\n')} + \`\`\` + `; + + async function find_bot_comment(issue_number) { + if (!issue_number) return null; + const comments = await github.rest.issues.listComments({ + owner: context.repo.owner, + repo: context.repo.repo, + issue_number: issue_number, + }); + return comments.data.find((comment) => + comment.body.includes(bot_comment_identifier) + ); + } + + async function create_or_update_comment(issue_number) { + if (!issue_number) { + console.log('No issue number provided. Cannot post or update comment.'); + return; + } + + const existing_comment = await find_bot_comment(issue_number); + if (existing_comment) { + await github.rest.issues.updateComment({ + owner: context.repo.owner, + repo: context.repo.repo, + comment_id: existing_comment.id, + body: body(issue_number), + }); + } else { + await github.rest.issues.createComment({ + issue_number: issue_number, + owner: context.repo.owner, + repo: context.repo.repo, + body: body(issue_number), + }); + } + } + + async function log_publish_info() { + console.log('\n' + '='.repeat(50)); + console.log('Publish Information'); + console.log('='.repeat(50)); + console.log('\nPublished Packages:'); + console.log(output.packages.map((p) => `${p.name} - pnpm add https://pkg.pr.new/${p.name}@${p.url.replace(/^.+@([^@]+)$/, '$1')}`).join('\n')); + console.log('\n' + '='.repeat(50)); + } + + if (output.event_name === 'pull_request') { + if (output.number) { + await create_or_update_comment(output.number); + } + } else if (output.event_name === 'push') { + const pull_requests = await github.rest.pulls.list({ + owner: context.repo.owner, + repo: context.repo.repo, + state: 'open', + head: `${context.repo.owner}:${output.ref.replace('refs/heads/', '')}`, + }); + + if (pull_requests.data.length > 0) { + await create_or_update_comment(pull_requests.data[0].number); + } else { + console.log( + 'No open pull request found for this push. Logging publish information to console:' + ); + await log_publish_info(); + } + } diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml new file mode 100644 index 000000000000..2100ddeee3db --- /dev/null +++ b/.github/workflows/pkg.pr.new.yml @@ -0,0 +1,47 @@ +name: Publish Any Commit +on: [push, pull_request] + +jobs: + build: + permissions: {} + + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v4 + + - name: install corepack + run: npm i -g corepack@0.31.0 + + - run: corepack enable + - uses: actions/setup-node@v4 + with: + node-version: 18.x + cache: pnpm + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Build + run: pnpm build + + - run: pnpx pkg-pr-new publish --comment=off --json output.json --compact --no-template './packages/*' + - name: Add metadata to output + uses: actions/github-script@v6 + with: + github-token: ${{ secrets.GITHUB_TOKEN }} + script: | + const fs = require('fs'); + const output = JSON.parse(fs.readFileSync('output.json', 'utf8')); + output.number = context.issue.number; + output.event_name = context.eventName; + output.ref = context.ref; + fs.writeFileSync('output.json', JSON.stringify(output), 'utf8'); + - name: Upload output + uses: actions/upload-artifact@v4 + with: + name: output + path: ./output.json + + - run: ls -R . From 4f32fb0f53dfc6dead6c344ca6b39409d5e6254c Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 4 Apr 2025 12:40:56 -0400 Subject: [PATCH 1030/1135] feat: `adapter-vercel` o11y (#13679) * Implement better build output using symlinks * snake_case * prettier * explanatory comment * generate symlinks when app uses function splitting * improve internal function naming and eliminate conflicts * changeset --------- Co-authored-by: Tobias Lins --- .changeset/sour-moles-heal.md | 5 +++ packages/adapter-vercel/index.js | 72 +++++++++++++++++++++++--------- 2 files changed, 58 insertions(+), 19 deletions(-) create mode 100644 .changeset/sour-moles-heal.md diff --git a/.changeset/sour-moles-heal.md b/.changeset/sour-moles-heal.md new file mode 100644 index 000000000000..bee630913f01 --- /dev/null +++ b/.changeset/sour-moles-heal.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': minor +--- + +feat: create symlink functions for each route, for better observability diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index d87f6946ed79..257383302658 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -8,7 +8,7 @@ import { get_pathname, pattern_to_src } from './utils.js'; import { VERSION } from '@sveltejs/kit'; const name = '@sveltejs/adapter-vercel'; -const DEFAULT_FUNCTION_NAME = 'fn'; +const INTERNAL = '![-]'; // this name is guaranteed not to conflict with user routes const get_default_runtime = () => { const major = Number(process.version.slice(1).split('.')[0]); @@ -319,7 +319,7 @@ const plugin = function (defaults = {}) { group.config.runtime === 'edge' ? generate_edge_function : generate_serverless_function; // generate one function for the group - const name = singular ? DEFAULT_FUNCTION_NAME : `fn-${group.i}`; + const name = singular ? `${INTERNAL}/catchall` : `${INTERNAL}/${group.i}`; await generate_function( name, @@ -332,12 +332,27 @@ const plugin = function (defaults = {}) { } } + if (!singular) { + // we need to create a catch-all route so that 404s are handled + // by SvelteKit rather than Vercel + + const runtime = defaults.runtime ?? get_default_runtime(); + const generate_function = + runtime === 'edge' ? generate_edge_function : generate_serverless_function; + + await generate_function( + `${INTERNAL}/catchall`, + /** @type {any} */ ({ runtime, ...defaults }), + [] + ); + } + for (const route of builder.routes) { if (is_prerendered(route)) continue; const pattern = route.pattern.toString(); const src = pattern_to_src(pattern); - const name = functions.get(pattern) ?? 'fn-0'; + const name = functions.get(pattern); const isr = isr_config.get(route); if (isr) { @@ -370,24 +385,43 @@ const plugin = function (defaults = {}) { src: src + '/__data.json$', dest: `/${isr_name}/__data.json${q}` }); - } else if (!singular) { - static_config.routes.push({ src: src + '(?:/__data.json)?$', dest: `/${name}` }); - } - } + } else { + // Create a symlink for each route to the main function for better observability + // (without this, every request appears to go through `/![-]`) - if (!singular) { - // we need to create a catch-all route so that 404s are handled - // by SvelteKit rather than Vercel + // Use 'index' for the root route's filesystem representation + // Use an empty string ('') for the root route's destination name part in Vercel config + const is_root = route.id === '/'; + const route_fs_name = is_root ? 'index' : route.id.slice(1); + const route_dest_name = is_root ? '' : route.id.slice(1); - const runtime = defaults.runtime ?? get_default_runtime(); - const generate_function = - runtime === 'edge' ? generate_edge_function : generate_serverless_function; + // Define paths using path.join for safety + const base_dir = path.join(dirs.functions, route_fs_name); // e.g., .vercel/output/functions/index + // The main symlink should be named based on the route, adjacent to its potential directory + const main_symlink_path = `${base_dir}.func`; // e.g., .vercel/output/functions/index.func + // The data symlink goes inside the directory + const data_symlink_path = path.join(base_dir, '__data.json.func'); // e.g., .vercel/output/functions/index/__data.json.func - await generate_function( - DEFAULT_FUNCTION_NAME, - /** @type {any} */ ({ runtime, ...defaults }), - [] - ); + const target = path.join(dirs.functions, `${name}.func`); // The actual function directory e.g., .vercel/output/functions/![-].func + + // Ensure the directory for the data endpoint symlink exists (e.g., functions/index/) + builder.mkdirp(base_dir); + + // Calculate relative paths FROM the directory containing the symlink TO the target + const relative_for_main = path.relative(path.dirname(main_symlink_path), target); + const relative_for_data = path.relative(path.dirname(data_symlink_path), target); // This is path.relative(base_dir, target) + + // Create symlinks + fs.symlinkSync(relative_for_main, main_symlink_path); // Creates functions/index.func -> ![-].func + fs.symlinkSync(relative_for_data, data_symlink_path); // Creates functions/index/__data.json.func -> ../![-].func + + // Add route to the config + static_config.routes.push({ + src: src + '(?:/__data.json)?$', // Matches the incoming request path + dest: `/${route_dest_name}` // Maps to the function: '/' for root, '/about' for about, etc. + // Vercel uses this dest to find the corresponding .func dir/symlink + }); + } } // optional chaining to support older versions that don't have this setting yet @@ -412,7 +446,7 @@ const plugin = function (defaults = {}) { // Catch-all route must come at the end, otherwise it will swallow all other routes, // including ISR aliases if there is only one function - static_config.routes.push({ src: '/.*', dest: `/${DEFAULT_FUNCTION_NAME}` }); + static_config.routes.push({ src: '/.*', dest: `/${INTERNAL}/catchall` }); builder.log.minor('Writing routes...'); From 1fc4ed97c4eb3b930fc43d8399aaa34dc19d80f5 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Fri, 4 Apr 2025 12:44:09 -0400 Subject: [PATCH 1031/1135] Version Packages (#13672) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/bright-houses-kick.md | 5 ----- .changeset/gentle-parrots-clap.md | 5 ----- .changeset/olive-mugs-search.md | 5 ----- .changeset/sour-moles-heal.md | 5 ----- packages/adapter-cloudflare/CHANGELOG.md | 12 ++++++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/adapter-vercel/CHANGELOG.md | 12 ++++++++++++ packages/adapter-vercel/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 11 files changed, 34 insertions(+), 24 deletions(-) delete mode 100644 .changeset/bright-houses-kick.md delete mode 100644 .changeset/gentle-parrots-clap.md delete mode 100644 .changeset/olive-mugs-search.md delete mode 100644 .changeset/sour-moles-heal.md diff --git a/.changeset/bright-houses-kick.md b/.changeset/bright-houses-kick.md deleted file mode 100644 index 4239b45c8189..000000000000 --- a/.changeset/bright-houses-kick.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -fix: correctly write the worker to the `pages_build_output_dir` path if set in the Wrangler configuration path diff --git a/.changeset/gentle-parrots-clap.md b/.changeset/gentle-parrots-clap.md deleted file mode 100644 index 889a8a14fe1b..000000000000 --- a/.changeset/gentle-parrots-clap.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -fix: correctly resolve paths provided by the Wrangler config on Windows diff --git a/.changeset/olive-mugs-search.md b/.changeset/olive-mugs-search.md deleted file mode 100644 index 86613bcb3549..000000000000 --- a/.changeset/olive-mugs-search.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -chore: remove internal class-replacement hack that isn't needed anymore diff --git a/.changeset/sour-moles-heal.md b/.changeset/sour-moles-heal.md deleted file mode 100644 index bee630913f01..000000000000 --- a/.changeset/sour-moles-heal.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-vercel': minor ---- - -feat: create symlink functions for each route, for better observability diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 0f78effce1ef..18d2461a8d66 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-cloudflare +## 7.0.1 +### Patch Changes + + +- fix: correctly write the worker to the `pages_build_output_dir` path if set in the Wrangler configuration path ([#13671](https://github.com/sveltejs/kit/pull/13671)) + + +- fix: correctly resolve paths provided by the Wrangler config on Windows ([#13671](https://github.com/sveltejs/kit/pull/13671)) + +- Updated dependencies [[`7fd7bcb7142e7d0d2dd64174fa1a94d56a45d643`](https://github.com/sveltejs/kit/commit/7fd7bcb7142e7d0d2dd64174fa1a94d56a45d643)]: + - @sveltejs/kit@2.20.4 + ## 7.0.0 ### Major Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 66459941c481..1e84904bc1c6 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "7.0.0", + "version": "7.0.1", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index 3f3d1a3cbdb0..f2da2cf98f55 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-vercel +## 5.7.0 +### Minor Changes + + +- feat: create symlink functions for each route, for better observability ([#13679](https://github.com/sveltejs/kit/pull/13679)) + + +### Patch Changes + +- Updated dependencies [[`7fd7bcb7142e7d0d2dd64174fa1a94d56a45d643`](https://github.com/sveltejs/kit/commit/7fd7bcb7142e7d0d2dd64174fa1a94d56a45d643)]: + - @sveltejs/kit@2.20.4 + ## 5.6.3 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index db09ede3b6ce..6cd6bde46db0 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.6.3", + "version": "5.7.0", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 6b95b44dd045..57112a777ed4 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.4 +### Patch Changes + + +- chore: remove internal class-replacement hack that isn't needed anymore ([#13664](https://github.com/sveltejs/kit/pull/13664)) + ## 2.20.3 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 07f6315ba23c..8eb17ac54571 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.3", + "version": "2.20.4", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index e11001d5013a..843ba64073c2 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.3'; +export const VERSION = '2.20.4'; From e4c672f8697013867269b0ca4c334aef84bfb7ef Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 6 Apr 2025 14:44:51 -0400 Subject: [PATCH 1032/1135] Revert "add pkg.pr.new workflows (#13676)" (#13682) This reverts commit 810063536faf2093589befb0cf90aef21e99a8e8. --- .github/workflows/pkg.pr.new-comment.yml | 108 ----------------------- .github/workflows/pkg.pr.new.yml | 47 ---------- 2 files changed, 155 deletions(-) delete mode 100644 .github/workflows/pkg.pr.new-comment.yml delete mode 100644 .github/workflows/pkg.pr.new.yml diff --git a/.github/workflows/pkg.pr.new-comment.yml b/.github/workflows/pkg.pr.new-comment.yml deleted file mode 100644 index 9f1eaa7a13ac..000000000000 --- a/.github/workflows/pkg.pr.new-comment.yml +++ /dev/null @@ -1,108 +0,0 @@ -name: Update pkg.pr.new comment - -on: - workflow_run: - workflows: ['Publish Any Commit'] - types: - - completed - -permissions: - pull-requests: write - -jobs: - build: - name: 'Update comment' - runs-on: ubuntu-latest - steps: - - uses: GitHubSecurityLab/actions-permissions/monitor@v1 - - name: Download artifact - uses: actions/download-artifact@v4 - with: - name: output - github-token: ${{ secrets.GITHUB_TOKEN }} - run-id: ${{ github.event.workflow_run.id }} - - - run: ls -R . - - name: 'Post or update comment' - uses: actions/github-script@v6 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const fs = require('fs'); - const output = JSON.parse(fs.readFileSync('output.json', 'utf8')); - - const bot_comment_identifier = ``; - - const body = (number) => `${bot_comment_identifier} - - \`\`\` - ${output.packages.map((p) => `pnpm add https://pkg.pr.new/${p.name}@${number}`).join('\n')} - \`\`\` - `; - - async function find_bot_comment(issue_number) { - if (!issue_number) return null; - const comments = await github.rest.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issue_number, - }); - return comments.data.find((comment) => - comment.body.includes(bot_comment_identifier) - ); - } - - async function create_or_update_comment(issue_number) { - if (!issue_number) { - console.log('No issue number provided. Cannot post or update comment.'); - return; - } - - const existing_comment = await find_bot_comment(issue_number); - if (existing_comment) { - await github.rest.issues.updateComment({ - owner: context.repo.owner, - repo: context.repo.repo, - comment_id: existing_comment.id, - body: body(issue_number), - }); - } else { - await github.rest.issues.createComment({ - issue_number: issue_number, - owner: context.repo.owner, - repo: context.repo.repo, - body: body(issue_number), - }); - } - } - - async function log_publish_info() { - console.log('\n' + '='.repeat(50)); - console.log('Publish Information'); - console.log('='.repeat(50)); - console.log('\nPublished Packages:'); - console.log(output.packages.map((p) => `${p.name} - pnpm add https://pkg.pr.new/${p.name}@${p.url.replace(/^.+@([^@]+)$/, '$1')}`).join('\n')); - console.log('\n' + '='.repeat(50)); - } - - if (output.event_name === 'pull_request') { - if (output.number) { - await create_or_update_comment(output.number); - } - } else if (output.event_name === 'push') { - const pull_requests = await github.rest.pulls.list({ - owner: context.repo.owner, - repo: context.repo.repo, - state: 'open', - head: `${context.repo.owner}:${output.ref.replace('refs/heads/', '')}`, - }); - - if (pull_requests.data.length > 0) { - await create_or_update_comment(pull_requests.data[0].number); - } else { - console.log( - 'No open pull request found for this push. Logging publish information to console:' - ); - await log_publish_info(); - } - } diff --git a/.github/workflows/pkg.pr.new.yml b/.github/workflows/pkg.pr.new.yml deleted file mode 100644 index 2100ddeee3db..000000000000 --- a/.github/workflows/pkg.pr.new.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Publish Any Commit -on: [push, pull_request] - -jobs: - build: - permissions: {} - - runs-on: ubuntu-latest - - steps: - - name: Checkout code - uses: actions/checkout@v4 - - - name: install corepack - run: npm i -g corepack@0.31.0 - - - run: corepack enable - - uses: actions/setup-node@v4 - with: - node-version: 18.x - cache: pnpm - - - name: Install dependencies - run: pnpm install --frozen-lockfile - - - name: Build - run: pnpm build - - - run: pnpx pkg-pr-new publish --comment=off --json output.json --compact --no-template './packages/*' - - name: Add metadata to output - uses: actions/github-script@v6 - with: - github-token: ${{ secrets.GITHUB_TOKEN }} - script: | - const fs = require('fs'); - const output = JSON.parse(fs.readFileSync('output.json', 'utf8')); - output.number = context.issue.number; - output.event_name = context.eventName; - output.ref = context.ref; - fs.writeFileSync('output.json', JSON.stringify(output), 'utf8'); - - name: Upload output - uses: actions/upload-artifact@v4 - with: - name: output - path: ./output.json - - - run: ls -R . From 99b8079bfb8e7b403ef3d03db653302b20571bab Mon Sep 17 00:00:00 2001 From: George Daskalakis Date: Mon, 7 Apr 2025 07:31:15 +0300 Subject: [PATCH 1033/1135] fix: allow `HandleServerError` hook to access the ` getRequestEvent` (#13666) * fix: allow usage of `getRequestEvent` inside `handleError` * chore: format and add changeset * fix: add test for `getReqeuestEvent` in `handleError` * Update packages/kit/types/index.d.ts * Update packages/kit/src/runtime/app/server/event.js * Update packages/kit/src/runtime/app/server/event.js --------- Co-authored-by: Tee Ming --- .changeset/ninety-planets-remember.md | 5 +++++ packages/kit/src/runtime/app/server/event.js | 4 ++-- packages/kit/src/runtime/server/utils.js | 7 ++++++- packages/kit/test/apps/basics/src/hooks.server.js | 5 +++++ .../src/routes/get-request-event/with-error/+error.svelte | 5 +++++ .../routes/get-request-event/with-error/+page.server.js | 3 +++ packages/kit/test/apps/basics/test/test.js | 3 +++ packages/kit/types/index.d.ts | 2 +- 8 files changed, 30 insertions(+), 4 deletions(-) create mode 100644 .changeset/ninety-planets-remember.md create mode 100644 packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+error.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+page.server.js diff --git a/.changeset/ninety-planets-remember.md b/.changeset/ninety-planets-remember.md new file mode 100644 index 000000000000..0cda886b1e17 --- /dev/null +++ b/.changeset/ninety-planets-remember.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +allow `HandleServerError` hook to access `getRequestEvent` diff --git a/packages/kit/src/runtime/app/server/event.js b/packages/kit/src/runtime/app/server/event.js index 8b772e14ecfe..8351e21e9000 100644 --- a/packages/kit/src/runtime/app/server/event.js +++ b/packages/kit/src/runtime/app/server/event.js @@ -15,7 +15,7 @@ import('node:async_hooks') }); /** - * Returns the current `RequestEvent`. Can be used inside `handle`, `load` and actions (and functions called by them). + * Returns the current `RequestEvent`. Can be used inside server hooks, server `load` functions, actions, and endpoints (and functions called by them). * * In environments without [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage), this must be called synchronously (i.e. not after an `await`). * @since 2.20.0 @@ -25,7 +25,7 @@ export function getRequestEvent() { if (!event) { let message = - 'Can only read the current request event inside functions invoked during `handle`, such as server `load` functions, actions, and server endpoints.'; + 'Can only read the current request event inside functions invoked during `handle`, such as server `load` functions, actions, endpoints, and other server hooks.'; if (!als) { message += diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index fe755ed3ddc0..349a5057e120 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -6,6 +6,7 @@ import { HttpError } from '../control.js'; import { fix_stack_trace } from '../shared-server.js'; import { ENDPOINT_METHODS } from '../../constants.js'; import { escape_html } from '../../utils/escape.js'; +import { with_event } from '../app/server/event.js'; /** @param {any} body */ export function is_pojo(body) { @@ -107,7 +108,11 @@ export async function handle_error_and_jsonify(event, options, error) { const status = get_status(error); const message = get_message(error); - return (await options.hooks.handleError({ error, event, status, message })) ?? { message }; + return ( + (await with_event(event, () => + options.hooks.handleError({ error, event, status, message }) + )) ?? { message } + ); } /** diff --git a/packages/kit/test/apps/basics/src/hooks.server.js b/packages/kit/test/apps/basics/src/hooks.server.js index a9aa2bc0ceb9..5976df3f5763 100644 --- a/packages/kit/test/apps/basics/src/hooks.server.js +++ b/packages/kit/test/apps/basics/src/hooks.server.js @@ -38,6 +38,11 @@ export const handleError = ({ event, error: e, status, message }) => { errors[event.url.pathname] = error_to_pojo(error); fs.writeFileSync('test/errors.json', JSON.stringify(errors)); + if (event.url.pathname.startsWith('/get-request-event/')) { + const ev = getRequestEvent(); + message = ev.locals.message; + } + return event.url.pathname.endsWith('404-fallback') ? undefined : { message: `${error.message} (${status} ${message})` }; diff --git a/packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+error.svelte b/packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+error.svelte new file mode 100644 index 000000000000..4d082a41ea50 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+error.svelte @@ -0,0 +1,5 @@ + + +

{page.error.message}

diff --git a/packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+page.server.js b/packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+page.server.js new file mode 100644 index 000000000000..e8528686504b --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/get-request-event/with-error/+page.server.js @@ -0,0 +1,3 @@ +export const load = async () => { + throw new Error('Crashing now'); +}; diff --git a/packages/kit/test/apps/basics/test/test.js b/packages/kit/test/apps/basics/test/test.js index 52d6a5bf8d78..5abb712141a1 100644 --- a/packages/kit/test/apps/basics/test/test.js +++ b/packages/kit/test/apps/basics/test/test.js @@ -1544,5 +1544,8 @@ test.describe('getRequestEvent', () => { await page.click('button'); expect(await page.textContent('h1')).toBe('from form: hello'); + + await page.goto('/get-request-event/with-error'); + expect(await page.textContent('h1')).toBe('Crashing now (500 hello from hooks.server.js)'); }); }); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 3ac640b17196..23bb6d7287a4 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2417,7 +2417,7 @@ declare module '$app/server' { */ export function read(asset: string): Response; /** - * Returns the current `RequestEvent`. Can be used inside `handle`, `load` and actions (and functions called by them). + * Returns the current `RequestEvent`. Can be used inside server hooks, server `load` functions, actions, and endpoints (and functions called by them). * * In environments without [`AsyncLocalStorage`](https://nodejs.org/api/async_context.html#class-asynclocalstorage), this must be called synchronously (i.e. not after an `await`). * @since 2.20.0 From dd5381a17b72cc0182f36dd45a9b85198d07805b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 8 Apr 2025 03:54:55 -0400 Subject: [PATCH 1034/1135] Squelch rollup warnings (#13687) * fix: prevent Rollup warnings for undefined hooks * better approach * revert original change --- .changeset/thirty-foxes-study.md | 5 +++++ packages/kit/src/exports/vite/index.js | 14 +++++++++++++- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 .changeset/thirty-foxes-study.md diff --git a/.changeset/thirty-foxes-study.md b/.changeset/thirty-foxes-study.md new file mode 100644 index 000000000000..389239f36664 --- /dev/null +++ b/.changeset/thirty-foxes-study.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: prevent Rollup warnings for undefined hooks diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index bdb37b1f9cff..c2e445e865d2 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -678,7 +678,19 @@ Tips: manualChunks: split ? undefined : () => 'bundle', inlineDynamicImports: false }, - preserveEntrySignatures: 'strict' + preserveEntrySignatures: 'strict', + onwarn(warning, handler) { + if ( + warning.code === 'MISSING_EXPORT' && + warning.id === `${kit.outDir}/generated/client-optimized/app.js` + ) { + // ignore e.g. undefined `handleError` hook when + // referencing `client_hooks.handleError` + return; + } + + handler(warning); + } }, ssrEmitAssets: true, target: ssr ? 'node18.13' : undefined From a4acd47f547b9716e0ce3e3ec4549a3f34211f56 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 9 Apr 2025 13:29:02 -0400 Subject: [PATCH 1035/1135] Version Packages (#13685) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/ninety-planets-remember.md | 5 ----- .changeset/thirty-foxes-study.md | 5 ----- packages/kit/CHANGELOG.md | 9 +++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 .changeset/ninety-planets-remember.md delete mode 100644 .changeset/thirty-foxes-study.md diff --git a/.changeset/ninety-planets-remember.md b/.changeset/ninety-planets-remember.md deleted file mode 100644 index 0cda886b1e17..000000000000 --- a/.changeset/ninety-planets-remember.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -allow `HandleServerError` hook to access `getRequestEvent` diff --git a/.changeset/thirty-foxes-study.md b/.changeset/thirty-foxes-study.md deleted file mode 100644 index 389239f36664..000000000000 --- a/.changeset/thirty-foxes-study.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: prevent Rollup warnings for undefined hooks diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 57112a777ed4..100afe7fd9f3 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/kit +## 2.20.5 +### Patch Changes + + +- allow `HandleServerError` hook to access `getRequestEvent` ([#13666](https://github.com/sveltejs/kit/pull/13666)) + + +- fix: prevent Rollup warnings for undefined hooks ([#13687](https://github.com/sveltejs/kit/pull/13687)) + ## 2.20.4 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 8eb17ac54571..f95e2fc36742 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.4", + "version": "2.20.5", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 843ba64073c2..741853ec5096 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.4'; +export const VERSION = '2.20.5'; From 0b60ea7b23d26796ed5c0d930c9a89751bd89d8e Mon Sep 17 00:00:00 2001 From: ageorgeh <59073632+ageorgeh@users.noreply.github.com> Date: Thu, 10 Apr 2025 08:23:04 +1000 Subject: [PATCH 1036/1135] fix: handle missing package.json gracefully (#13691) --- .changeset/red-pugs-smell.md | 5 +++++ packages/package/src/config.js | 2 +- packages/package/src/validate.js | 11 ++++++++--- 3 files changed, 14 insertions(+), 4 deletions(-) create mode 100644 .changeset/red-pugs-smell.md diff --git a/.changeset/red-pugs-smell.md b/.changeset/red-pugs-smell.md new file mode 100644 index 000000000000..a777e9f77459 --- /dev/null +++ b/.changeset/red-pugs-smell.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/package': patch +--- + +fix: handle missing package.json gracefully diff --git a/packages/package/src/config.js b/packages/package/src/config.js index 651c09f3fcf3..acdb7435fb7f 100644 --- a/packages/package/src/config.js +++ b/packages/package/src/config.js @@ -29,7 +29,7 @@ export async function load_config({ cwd = process.cwd() } = {}) { /** * @param {string} cwd - * @returns Record + * @returns {Record} */ export function load_pkg_json(cwd = process.cwd()) { const pkg_json_file = path.join(cwd, 'package.json'); diff --git a/packages/package/src/validate.js b/packages/package/src/validate.js index af97dc09b5ed..16b818e7ddb5 100644 --- a/packages/package/src/validate.js +++ b/packages/package/src/validate.js @@ -1,6 +1,5 @@ -import { readFileSync } from 'node:fs'; -import { join } from 'node:path'; import colors from 'kleur'; +import { load_pkg_json } from './config.js'; /** * @param {import("./types.js").Options} options @@ -19,8 +18,14 @@ export function create_validator(options) { }, validate() { /** @type {Record} */ - const pkg = JSON.parse(readFileSync(join(options.cwd, 'package.json'), 'utf-8')); + const pkg = load_pkg_json(options.cwd); const warnings = validate(pkg); + if (Object.keys(pkg).length === 0) { + warnings.push( + 'No package.json found in the current directory. Please create one or run this command in a directory containing one.' + ); + } + // Just warnings, not errors, because // - would be annoying in watch mode (would have to restart the server) // - maybe there's a custom post-build script that fixes some of these From 4b2cc9e1ede59fa5d779fe40f7e0ebad303dd9cb Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 11 Apr 2025 08:58:32 -0700 Subject: [PATCH 1037/1135] chore(deps): update dependency vite to v6.0.14 [security] (#13688) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 48 ++++++++++++++++++++++++------------------------ 1 file changed, 24 insertions(+), 24 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dfe16eebb55c..19fce6479775 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1924,8 +1924,8 @@ packages: resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.29.0': - resolution: {integrity: sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw==} + '@typescript-eslint/scope-manager@8.29.1': + resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.26.0': @@ -1939,8 +1939,8 @@ packages: resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.29.0': - resolution: {integrity: sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg==} + '@typescript-eslint/types@8.29.1': + resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.26.0': @@ -1949,8 +1949,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.29.0': - resolution: {integrity: sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow==} + '@typescript-eslint/typescript-estree@8.29.1': + resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -1962,8 +1962,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.29.0': - resolution: {integrity: sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA==} + '@typescript-eslint/utils@8.29.1': + resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1973,8 +1973,8 @@ packages: resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.29.0': - resolution: {integrity: sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg==} + '@typescript-eslint/visitor-keys@8.29.1': + resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vercel/nft@0.29.2': @@ -4251,10 +4251,10 @@ snapshots: '@typescript-eslint/types': 8.26.0 '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/scope-manager@8.29.0': + '@typescript-eslint/scope-manager@8.29.1': dependencies: - '@typescript-eslint/types': 8.29.0 - '@typescript-eslint/visitor-keys': 8.29.0 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: @@ -4269,7 +4269,7 @@ snapshots: '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/types@8.29.0': {} + '@typescript-eslint/types@8.29.1': {} '@typescript-eslint/typescript-estree@8.26.0(typescript@5.6.3)': dependencies: @@ -4285,10 +4285,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.29.0(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.29.1(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.29.0 - '@typescript-eslint/visitor-keys': 8.29.0 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/visitor-keys': 8.29.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -4310,12 +4310,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.29.0(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.29.1(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.29.0 - '@typescript-eslint/types': 8.29.0 - '@typescript-eslint/typescript-estree': 8.29.0(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.29.1 + '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.6.3) eslint: 9.6.0 typescript: 5.6.3 transitivePeerDependencies: @@ -4326,9 +4326,9 @@ snapshots: '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.29.0': + '@typescript-eslint/visitor-keys@8.29.1': dependencies: - '@typescript-eslint/types': 8.29.0 + '@typescript-eslint/types': 8.29.1 eslint-visitor-keys: 4.2.0 '@vercel/nft@0.29.2(rollup@4.30.1)': @@ -4663,7 +4663,7 @@ snapshots: eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) - '@typescript-eslint/utils': 8.29.0(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.29.1(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) From 4cdea1893c9d814ff84864e8c4283331c939018d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 07:53:44 -0700 Subject: [PATCH 1038/1135] chore(deps): update dependency vite to v6.0.15 [security] (#13703) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 19fce6479775..1e8b3d6ebe9d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1474,6 +1474,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.6.0': + resolution: {integrity: sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -3825,6 +3831,11 @@ snapshots: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.6.0(eslint@9.6.0)': + dependencies: + eslint: 9.6.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.17.0': @@ -4312,7 +4323,7 @@ snapshots: '@typescript-eslint/utils@8.29.1(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) '@typescript-eslint/scope-manager': 8.29.1 '@typescript-eslint/types': 8.29.1 '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.6.3) @@ -4655,14 +4666,14 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) '@eslint-community/regexpp': 4.12.1 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) '@typescript-eslint/utils': 8.29.1(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 @@ -4679,7 +4690,7 @@ snapshots: eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1): dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) From e39d2e7e7ca91596f48b5f8c88d02125e3d328f1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 13:05:37 -0400 Subject: [PATCH 1039/1135] Version Packages (#13697) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/red-pugs-smell.md | 5 ----- packages/package/CHANGELOG.md | 6 ++++++ packages/package/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/red-pugs-smell.md diff --git a/.changeset/red-pugs-smell.md b/.changeset/red-pugs-smell.md deleted file mode 100644 index a777e9f77459..000000000000 --- a/.changeset/red-pugs-smell.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/package': patch ---- - -fix: handle missing package.json gracefully diff --git a/packages/package/CHANGELOG.md b/packages/package/CHANGELOG.md index c03f50ebc4e5..02dd2797de3e 100644 --- a/packages/package/CHANGELOG.md +++ b/packages/package/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/package +## 2.3.11 +### Patch Changes + + +- fix: handle missing package.json gracefully ([#13691](https://github.com/sveltejs/kit/pull/13691)) + ## 2.3.10 ### Patch Changes diff --git a/packages/package/package.json b/packages/package/package.json index da4f7b5af74a..d7d29db9f639 100644 --- a/packages/package/package.json +++ b/packages/package/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/package", - "version": "2.3.10", + "version": "2.3.11", "description": "The fastest way to build Svelte packages", "repository": { "type": "git", From d3300c6a67908590266c363dba7b0835d9a194cf Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 14 Apr 2025 13:37:21 -0400 Subject: [PATCH 1040/1135] Merge commit from fork * fix: escape names of tracked search parameters * oops --- .changeset/rotten-colts-arrive.md | 5 +++++ packages/kit/src/runtime/server/data/index.js | 6 +++--- packages/kit/src/runtime/server/page/render.js | 10 ++++++---- packages/kit/src/runtime/server/utils.js | 18 +++++++++--------- .../routes/xss/query-tracking/+page.server.js | 11 +++++++++++ .../src/routes/xss/query-tracking/+page.svelte | 1 + .../apps/basics/test/cross-platform/test.js | 8 ++++++++ 7 files changed, 43 insertions(+), 16 deletions(-) create mode 100644 .changeset/rotten-colts-arrive.md create mode 100644 packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.svelte diff --git a/.changeset/rotten-colts-arrive.md b/.changeset/rotten-colts-arrive.md new file mode 100644 index 000000000000..e92438e3f414 --- /dev/null +++ b/.changeset/rotten-colts-arrive.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: escape names of tracked search parameters diff --git a/packages/kit/src/runtime/server/data/index.js b/packages/kit/src/runtime/server/data/index.js index 6377fd7a0ef1..e42935636940 100644 --- a/packages/kit/src/runtime/server/data/index.js +++ b/packages/kit/src/runtime/server/data/index.js @@ -2,7 +2,7 @@ import { HttpError, SvelteKitError, Redirect } from '../../control.js'; import { normalize_error } from '../../../utils/error.js'; import { once } from '../../../utils/functions.js'; import { load_server_data } from '../page/load_data.js'; -import { clarify_devalue_error, handle_error_and_jsonify, stringify_uses } from '../utils.js'; +import { clarify_devalue_error, handle_error_and_jsonify, serialize_uses } from '../utils.js'; import { normalize_path } from '../../../utils/url.js'; import { text } from '../../../exports/index.js'; import * as devalue from 'devalue'; @@ -253,8 +253,8 @@ export function get_data_json(event, options, nodes) { return JSON.stringify(node); } - return `{"type":"data","data":${devalue.stringify(node.data, reducers)},${stringify_uses( - node + return `{"type":"data","data":${devalue.stringify(node.data, reducers)},${JSON.stringify( + serialize_uses(node) )}${node.slash ? `,"slash":${JSON.stringify(node.slash)}` : ''}}`; }); diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 59d9229164dc..29d7dc7cfc7a 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -7,7 +7,7 @@ import { serialize_data } from './serialize_data.js'; import { s } from '../../../utils/misc.js'; import { Csp } from './csp.js'; import { uneval_action_response } from './actions.js'; -import { clarify_devalue_error, stringify_uses, handle_error_and_jsonify } from '../utils.js'; +import { clarify_devalue_error, handle_error_and_jsonify, serialize_uses } from '../utils.js'; import { public_env, safe_public_env } from '../../shared-server.js'; import { text } from '../../../exports/index.js'; import { create_async_iterator } from '../../../utils/streaming.js'; @@ -646,9 +646,11 @@ function get_data(event, options, nodes, csp, global) { const strings = nodes.map((node) => { if (!node) return 'null'; - return `{"type":"data","data":${devalue.uneval(node.data, replacer)},${stringify_uses(node)}${ - node.slash ? `,"slash":${JSON.stringify(node.slash)}` : '' - }}`; + /** @type {any} */ + const payload = { type: 'data', data: node.data, uses: serialize_uses(node) }; + if (node.slash) payload.slash = node.slash; + + return devalue.uneval(payload, replacer); }); return { diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index 349a5057e120..1cdd22ddb9b8 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -147,26 +147,26 @@ export function clarify_devalue_error(event, error) { /** * @param {import('types').ServerDataNode} node */ -export function stringify_uses(node) { - const uses = []; +export function serialize_uses(node) { + const uses = {}; if (node.uses && node.uses.dependencies.size > 0) { - uses.push(`"dependencies":${JSON.stringify(Array.from(node.uses.dependencies))}`); + uses.dependencies = Array.from(node.uses.dependencies); } if (node.uses && node.uses.search_params.size > 0) { - uses.push(`"search_params":${JSON.stringify(Array.from(node.uses.search_params))}`); + uses.search_params = Array.from(node.uses.search_params); } if (node.uses && node.uses.params.size > 0) { - uses.push(`"params":${JSON.stringify(Array.from(node.uses.params))}`); + uses.params = Array.from(node.uses.params); } - if (node.uses?.parent) uses.push('"parent":1'); - if (node.uses?.route) uses.push('"route":1'); - if (node.uses?.url) uses.push('"url":1'); + if (node.uses?.parent) uses.parent = 1; + if (node.uses?.route) uses.route = 1; + if (node.uses?.url) uses.url = 1; - return `"uses":{${uses.join(',')}}`; + return uses; } /** diff --git a/packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.server.js b/packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.server.js new file mode 100644 index 000000000000..ea6225fa375f --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.server.js @@ -0,0 +1,11 @@ +export function load({ url }) { + const values = {}; + + for (const key of url.searchParams.keys()) { + values[key] = url.searchParams.get(key); + } + + return { + values + }; +} diff --git a/packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.svelte b/packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.svelte new file mode 100644 index 000000000000..745350f9f824 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/xss/query-tracking/+page.svelte @@ -0,0 +1 @@ +

check window.pwned

diff --git a/packages/kit/test/apps/basics/test/cross-platform/test.js b/packages/kit/test/apps/basics/test/cross-platform/test.js index b94cbf3f078f..9910bed94aba 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/test.js @@ -1049,6 +1049,14 @@ test.describe('XSS', () => { 'user.name is ' ); }); + + test('no xss via tracked search parameters', async ({ page }) => { + // https://github.com/sveltejs/kit/security/advisories/GHSA-6q87-84jw-cjhp + await page.goto('/xss/query-tracking?'); + + // @ts-expect-error - check global injected variable + expect(await page.evaluate(() => window.pwned)).toBeUndefined(); + }); }); test.describe('$app/server', () => { From 711d37a788d6c5f522caf8c348d1a587f90b30fa Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 13:39:07 -0400 Subject: [PATCH 1041/1135] Version Packages (#13706) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/rotten-colts-arrive.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/rotten-colts-arrive.md diff --git a/.changeset/rotten-colts-arrive.md b/.changeset/rotten-colts-arrive.md deleted file mode 100644 index e92438e3f414..000000000000 --- a/.changeset/rotten-colts-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: escape names of tracked search parameters diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 100afe7fd9f3..1ec6832e67d4 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.6 +### Patch Changes + + +- fix: escape names of tracked search parameters ([`d3300c6a67908590266c363dba7b0835d9a194cf`](https://github.com/sveltejs/kit/commit/d3300c6a67908590266c363dba7b0835d9a194cf)) + ## 2.20.5 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index f95e2fc36742..44aea69c9a1e 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.5", + "version": "2.20.6", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 741853ec5096..ee86b15a64d0 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.5'; +export const VERSION = '2.20.6'; From fa00cc3e7996c6dd4af02d6a98ea1cde0752feb1 Mon Sep 17 00:00:00 2001 From: Conduitry Date: Mon, 14 Apr 2025 18:49:02 -0400 Subject: [PATCH 1042/1135] fix: regression when serializing server data (#13709) * fix: regression when serializing server data * fix --------- Co-authored-by: Rich Harris --- .changeset/chilly-dancers-deliver.md | 5 +++++ packages/kit/src/runtime/server/data/index.js | 4 +++- packages/kit/src/runtime/server/page/render.js | 2 ++ packages/kit/src/runtime/server/utils.js | 2 +- 4 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 .changeset/chilly-dancers-deliver.md diff --git a/.changeset/chilly-dancers-deliver.md b/.changeset/chilly-dancers-deliver.md new file mode 100644 index 000000000000..d88844d3352d --- /dev/null +++ b/.changeset/chilly-dancers-deliver.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: regression when serializing server data diff --git a/packages/kit/src/runtime/server/data/index.js b/packages/kit/src/runtime/server/data/index.js index e42935636940..46150a987ae9 100644 --- a/packages/kit/src/runtime/server/data/index.js +++ b/packages/kit/src/runtime/server/data/index.js @@ -253,7 +253,7 @@ export function get_data_json(event, options, nodes) { return JSON.stringify(node); } - return `{"type":"data","data":${devalue.stringify(node.data, reducers)},${JSON.stringify( + return `{"type":"data","data":${devalue.stringify(node.data, reducers)},"uses":${JSON.stringify( serialize_uses(node) )}${node.slash ? `,"slash":${JSON.stringify(node.slash)}` : ''}}`; }); @@ -263,6 +263,8 @@ export function get_data_json(event, options, nodes) { chunks: count > 0 ? iterator : null }; } catch (e) { + // @ts-expect-error + e.path = 'data' + e.path; throw new Error(clarify_devalue_error(event, /** @type {any} */ (e))); } } diff --git a/packages/kit/src/runtime/server/page/render.js b/packages/kit/src/runtime/server/page/render.js index 29d7dc7cfc7a..13c07e8c10fd 100644 --- a/packages/kit/src/runtime/server/page/render.js +++ b/packages/kit/src/runtime/server/page/render.js @@ -658,6 +658,8 @@ function get_data(event, options, nodes, csp, global) { chunks: count > 0 ? iterator : null }; } catch (e) { + // @ts-expect-error + e.path = e.path.slice(1); throw new Error(clarify_devalue_error(event, /** @type {any} */ (e))); } } diff --git a/packages/kit/src/runtime/server/utils.js b/packages/kit/src/runtime/server/utils.js index 1cdd22ddb9b8..880e966e99f1 100644 --- a/packages/kit/src/runtime/server/utils.js +++ b/packages/kit/src/runtime/server/utils.js @@ -133,7 +133,7 @@ export function redirect_response(status, location) { */ export function clarify_devalue_error(event, error) { if (error.path) { - return `Data returned from \`load\` while rendering ${event.route.id} is not serializable: ${error.message} (data${error.path})`; + return `Data returned from \`load\` while rendering ${event.route.id} is not serializable: ${error.message} (${error.path})`; } if (error.path === '') { From 1c6c7c92e7abd6c65e099f60a58d6cf3a0e5ea60 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 14 Apr 2025 18:50:43 -0400 Subject: [PATCH 1043/1135] Version Packages (#13710) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/chilly-dancers-deliver.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/chilly-dancers-deliver.md diff --git a/.changeset/chilly-dancers-deliver.md b/.changeset/chilly-dancers-deliver.md deleted file mode 100644 index d88844d3352d..000000000000 --- a/.changeset/chilly-dancers-deliver.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: regression when serializing server data diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 1ec6832e67d4..b4b3dfdeea85 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.7 +### Patch Changes + + +- fix: regression when serializing server data ([#13709](https://github.com/sveltejs/kit/pull/13709)) + ## 2.20.6 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 44aea69c9a1e..8cfa35a03d5f 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.6", + "version": "2.20.7", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index ee86b15a64d0..322d93c9c47f 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.6'; +export const VERSION = '2.20.7'; From 58508ca9c5ac398e1b431ab47609b79deb4b0ba1 Mon Sep 17 00:00:00 2001 From: Ravi van Rooijen Date: Tue, 15 Apr 2025 12:23:54 +0200 Subject: [PATCH 1044/1135] fix: skip symlink test on windows (#13712) See: - https://github.com/sveltejs/kit/blob/1c6c7c92e7abd6c65e099f60a58d6cf3a0e5ea60/packages/kit/test/apps/basics/test/setup.js#L4 - https://github.com/sveltejs/kit/blob/1c6c7c92e7abd6c65e099f60a58d6cf3a0e5ea60/packages/kit/test/apps/basics/test/cross-platform/test.js#L940 --- packages/kit/test/apps/basics/test/server.test.js | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index eb8572489fb0..4f231b29d68a 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -616,11 +616,13 @@ test.describe('Static files', () => { expect(await r2.json()).toEqual({ works: true }); }); - test('Serves symlinked asset', async ({ request }) => { - const response = await request.get('/symlink-from/hello.txt'); - expect(response.status()).toBe(200); - expect(await response.text()).toBe('hello'); - }); + if (process.platform !== 'win32') { + test('Serves symlinked asset', async ({ request }) => { + const response = await request.get('/symlink-from/hello.txt'); + expect(response.status()).toBe(200); + expect(await response.text()).toBe('hello'); + }); + } }); test.describe('setHeaders', () => { From c51fb554416e0c4a21655c1d79e834f69743d1d5 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Tue, 15 Apr 2025 20:20:48 +0800 Subject: [PATCH 1045/1135] fix: respect page options when rendering an error page as a result of an error thrown from a load function on the server (#13695) * fix * changeset * edit changeset * add test * use the page options for the nearest error page --- .changeset/khaki-queens-provide.md | 5 ++++ packages/kit/src/runtime/server/page/index.js | 24 ++++++++++++------- .../load-error-page-options/+error.svelte | 5 ++++ .../errors/load-error-page-options/+layout.js | 2 ++ .../load-error-page-options/csr/+layout.js | 1 + .../load-error-page-options/csr/+page.js | 3 +++ .../kit/test/apps/basics/test/server.test.js | 11 +++++++++ 7 files changed, 42 insertions(+), 9 deletions(-) create mode 100644 .changeset/khaki-queens-provide.md create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+error.svelte create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+layout.js create mode 100644 packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+page.js diff --git a/.changeset/khaki-queens-provide.md b/.changeset/khaki-queens-provide.md new file mode 100644 index 000000000000..74571d33e5de --- /dev/null +++ b/.changeset/khaki-queens-provide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: ensure that `ssr` and `csr` page options apply to error pages rendered as a result of a load function error on the server diff --git a/packages/kit/src/runtime/server/page/index.js b/packages/kit/src/runtime/server/page/index.js index 01337e4cac1c..e7b462a74dda 100644 --- a/packages/kit/src/runtime/server/page/index.js +++ b/packages/kit/src/runtime/server/page/index.js @@ -15,6 +15,7 @@ import { render_response } from './render.js'; import { respond_with_error } from './respond_with_error.js'; import { get_data_json } from '../data/index.js'; import { DEV } from 'esm-env'; +import { PageNodes } from '../../../utils/page_nodes.js'; /** * The maximum request depth permitted before assuming we're stuck in an infinite loop @@ -93,10 +94,13 @@ export async function render_page(event, page, options, manifest, state, nodes, /** @type {import('./types.js').Fetched[]} */ const fetched = []; + const ssr = nodes.ssr(); + const csr = nodes.csr(); + // renders an empty 'shell' page if SSR is turned off and if there is // no server data to prerender. As a result, the load functions and rendering // only occur client-side. - if (nodes.ssr() === false && !(state.prerendering && should_prerender_data)) { + if (ssr === false && !(state.prerendering && should_prerender_data)) { // if the user makes a request through a non-enhanced form, the returned value is lost // because there is no SSR or client-side handling of the response if (DEV && action_result && !event.request.headers.has('x-sveltekit-action')) { @@ -117,7 +121,7 @@ export async function render_page(event, page, options, manifest, state, nodes, fetched, page_config: { ssr: false, - csr: nodes.csr() + csr }, status, error: null, @@ -171,8 +175,6 @@ export async function render_page(event, page, options, manifest, state, nodes, }); }); - const csr = nodes.csr(); - /** @type {Array | null>>} */ const load_promises = nodes.data.map((node, i) => { if (load_error) throw load_error; @@ -244,16 +246,22 @@ export async function render_page(event, page, options, manifest, state, nodes, let j = i; while (!branch[j]) j -= 1; + const layouts = compact(branch.slice(0, j + 1)); + const nodes = new PageNodes(layouts.map((layout) => layout.node)); + return await render_response({ event, options, manifest, state, resolve_opts, - page_config: { ssr: true, csr: true }, + page_config: { + ssr: nodes.ssr(), + csr: nodes.csr() + }, status, error, - branch: compact(branch.slice(0, j + 1)).concat({ + branch: layouts.concat({ node, data: null, server_data: null @@ -294,8 +302,6 @@ export async function render_page(event, page, options, manifest, state, nodes, }); } - const ssr = nodes.ssr(); - return await render_response({ event, options, @@ -303,7 +309,7 @@ export async function render_page(event, page, options, manifest, state, nodes, state, resolve_opts, page_config: { - csr: nodes.csr(), + csr, ssr }, status, diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+error.svelte b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+error.svelte new file mode 100644 index 000000000000..b4ac29aec4b9 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+error.svelte @@ -0,0 +1,5 @@ + + +

{$page.error.message}

diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+layout.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+layout.js new file mode 100644 index 000000000000..7c8af84c5b54 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/+layout.js @@ -0,0 +1,2 @@ +// disables csr for the error page +export const csr = false; diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+layout.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+layout.js new file mode 100644 index 000000000000..ce9d762e74cf --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+layout.js @@ -0,0 +1 @@ +export const csr = true; diff --git a/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+page.js b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+page.js new file mode 100644 index 000000000000..6fb722159401 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/errors/load-error-page-options/csr/+page.js @@ -0,0 +1,3 @@ +export function load() { + throw new Error('Crashing now'); +} diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 4f231b29d68a..1a6f709bf535 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -462,6 +462,17 @@ test.describe('Errors', () => { }); } }); + + test('error thrown from load on the server respects page options when rendering the error page', async ({ + request + }) => { + const res = await request.get('/errors/load-error-page-options/csr'); + expect(res.status()).toBe(500); + const content = await res.text(); + expect(content).toContain('Crashing now'); + // the hydration script should not be present if the csr page option is respected + expect(content).not.toContain('kit.start(app'); + }); }); test.describe('Load', () => { From ec80f8d01295dd379696d194db23238e93bfa2a7 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 15 Apr 2025 08:14:33 -0700 Subject: [PATCH 1046/1135] chore: allow sharp post-install to run --- package.json | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index f4a585a29940..cd9398b4d78e 100644 --- a/package.json +++ b/package.json @@ -37,9 +37,10 @@ }, "pnpm": { "onlyBuiltDependencies": [ + "esbuild", + "sharp", "svelte-preprocess", - "workerd", - "esbuild" + "workerd" ] } } \ No newline at end of file From a6cde448b55831fb38555d9dcc03058ac426303d Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 15 Apr 2025 09:34:12 -0700 Subject: [PATCH 1047/1135] chore(deps): upgrade vite, vitest, esbuild, wrangler (#13716) --- .changeset/hip-moons-camp.md | 6 + .changeset/purple-feet-lay.md | 5 + packages/adapter-auto/package.json | 2 +- packages/adapter-cloudflare/package.json | 4 +- .../test/apps/pages/package.json | 4 +- .../test/apps/workers/package.json | 4 +- packages/adapter-netlify/package.json | 4 +- packages/adapter-node/package.json | 2 +- packages/adapter-static/package.json | 2 +- .../test/apps/prerendered/package.json | 2 +- .../adapter-static/test/apps/spa/package.json | 2 +- packages/adapter-vercel/package.json | 4 +- packages/enhanced-img/package.json | 4 +- packages/kit/package.json | 4 +- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- .../src/routes/load/fetch-asset/+page.js | 2 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- .../test/apps/hash-based-routing/package.json | 2 +- packages/kit/test/apps/no-ssr/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- .../prerendered-app-error-pages/package.json | 2 +- packages/kit/test/apps/writes/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../apps/private-dynamic-env/package.json | 2 +- .../package.json | 2 +- .../apps/private-static-env/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-folder/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-module/package.json | 2 +- .../package.json | 2 +- .../service-worker-private-env/package.json | 2 +- .../apps/syntax-error/package.json | 2 +- packages/kit/test/build-errors/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 4 +- .../test/prerendering/options/package.json | 4 +- .../test/prerendering/paths-base/package.json | 4 +- playgrounds/basic/package.json | 2 +- pnpm-lock.yaml | 839 +++++++++--------- 45 files changed, 477 insertions(+), 477 deletions(-) create mode 100644 .changeset/hip-moons-camp.md create mode 100644 .changeset/purple-feet-lay.md diff --git a/.changeset/hip-moons-camp.md b/.changeset/hip-moons-camp.md new file mode 100644 index 000000000000..e72d48dd177e --- /dev/null +++ b/.changeset/hip-moons-camp.md @@ -0,0 +1,6 @@ +--- +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-vercel': patch +--- + +chore(deps): upgrade esbuild to 0.25.2 diff --git a/.changeset/purple-feet-lay.md b/.changeset/purple-feet-lay.md new file mode 100644 index 000000000000..217c504a9caa --- /dev/null +++ b/.changeset/purple-feet-lay.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +chore(deps): upgrade @cloudflare/workers-types to 4.20250415.0 diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index 38b900a2be02..8237696d05a9 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -44,7 +44,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "typescript": "^5.3.3", - "vitest": "^3.0.1" + "vitest": "^3.1.1" }, "dependencies": { "import-meta-resolve": "^4.1.0" diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 1e84904bc1c6..cbb521c36373 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -41,14 +41,14 @@ "test": "pnpm build && pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test" }, "dependencies": { - "@cloudflare/workers-types": "^4.20250312.0", + "@cloudflare/workers-types": "^4.20250415.0", "worktop": "0.8.0-next.18" }, "devDependencies": { "@playwright/test": "^1.44.1", "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", - "esbuild": "^0.24.0", + "esbuild": "^0.25.2", "typescript": "^5.3.3" }, "peerDependencies": { diff --git a/packages/adapter-cloudflare/test/apps/pages/package.json b/packages/adapter-cloudflare/test/apps/pages/package.json index af7c37ad2003..5de5f0f98be1 100644 --- a/packages/adapter-cloudflare/test/apps/pages/package.json +++ b/packages/adapter-cloudflare/test/apps/pages/package.json @@ -14,8 +14,8 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "server-side-dep": "file:server-side-dep", "svelte": "^5.23.1", - "vite": "^6.0.11", - "wrangler": "^4.0.0" + "vite": "^6.2.6", + "wrangler": "^4.11.0" }, "type": "module" } diff --git a/packages/adapter-cloudflare/test/apps/workers/package.json b/packages/adapter-cloudflare/test/apps/workers/package.json index 43cf8da6bd9f..532e3169e0d4 100644 --- a/packages/adapter-cloudflare/test/apps/workers/package.json +++ b/packages/adapter-cloudflare/test/apps/workers/package.json @@ -14,8 +14,8 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "server-side-dep": "file:server-side-dep", "svelte": "^5.23.1", - "vite": "^6.0.11", - "wrangler": "^4.0.0" + "vite": "^6.2.6", + "wrangler": "^4.11.0" }, "type": "module" } diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index cdd966df59c9..8166d923fd87 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -42,7 +42,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "esbuild": "^0.24.0", + "esbuild": "^0.25.2", "set-cookie-parser": "^2.6.0" }, "devDependencies": { @@ -56,7 +56,7 @@ "@types/set-cookie-parser": "^2.4.7", "rollup": "^4.14.2", "typescript": "^5.3.3", - "vitest": "^3.0.1" + "vitest": "^3.1.1" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" diff --git a/packages/adapter-node/package.json b/packages/adapter-node/package.json index b287b1086b3d..7f5f72c60d02 100644 --- a/packages/adapter-node/package.json +++ b/packages/adapter-node/package.json @@ -49,7 +49,7 @@ "polka": "^1.0.0-next.28", "sirv": "^3.0.0", "typescript": "^5.3.3", - "vitest": "^3.0.1" + "vitest": "^3.1.1" }, "dependencies": { "@rollup/plugin-commonjs": "^28.0.1", diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index ab3e6ac81d43..5c65c03ed9fd 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -46,7 +46,7 @@ "sirv": "^3.0.0", "svelte": "^5.23.1", "typescript": "^5.3.3", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0" diff --git a/packages/adapter-static/test/apps/prerendered/package.json b/packages/adapter-static/test/apps/prerendered/package.json index 51df595c2b3b..81c72ec1613f 100644 --- a/packages/adapter-static/test/apps/prerendered/package.json +++ b/packages/adapter-static/test/apps/prerendered/package.json @@ -13,7 +13,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", "svelte": "^5.23.1", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/adapter-static/test/apps/spa/package.json b/packages/adapter-static/test/apps/spa/package.json index f0e904150f90..ba15affd4ff8 100644 --- a/packages/adapter-static/test/apps/spa/package.json +++ b/packages/adapter-static/test/apps/spa/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", "svelte": "^5.23.1", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 6cd6bde46db0..5110b3db4e66 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -41,14 +41,14 @@ }, "dependencies": { "@vercel/nft": "^0.29.2", - "esbuild": "^0.24.0" + "esbuild": "^0.25.2" }, "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", "typescript": "^5.3.3", - "vitest": "^3.0.1" + "vitest": "^3.1.1" }, "peerDependencies": { "@sveltejs/kit": "^2.4.0" diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 159fde874159..225daa66576f 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -48,8 +48,8 @@ "rollup": "^4.27.4", "svelte": "^5.23.1", "typescript": "^5.6.3", - "vite": "^6.0.11", - "vitest": "^3.0.1" + "vite": "^6.2.6", + "vitest": "^3.1.1" }, "peerDependencies": { "svelte": "^5.0.0", diff --git a/packages/kit/package.json b/packages/kit/package.json index 8cfa35a03d5f..c1b66a3ade0b 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -41,8 +41,8 @@ "svelte": "^5.23.1", "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", - "vite": "^6.0.11", - "vitest": "^3.0.1" + "vite": "^6.2.6", + "vitest": "^3.1.1" }, "peerDependencies": { "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0", diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index 639d685be68d..981c960ea5a1 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -21,7 +21,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index 3da0838951bf..d20b35bf7d9b 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -23,7 +23,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js index 1e874734d24a..b9bc041e3021 100644 --- a/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js +++ b/packages/kit/test/apps/basics/src/routes/load/fetch-asset/+page.js @@ -1,4 +1,4 @@ -// @ts-expect-error we need both queries to prevent Vite from inlining the asset as base64 string on build +// we need both queries to prevent Vite from inlining the asset as base64 string on build // see https://github.com/vitejs/vite/issues/19562 import asset from './example.json?url&no-inline'; diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index 078b0c47ee02..da1b81c8a160 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -27,7 +27,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index 7d4018b001f8..63792c626533 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/hash-based-routing/package.json b/packages/kit/test/apps/hash-based-routing/package.json index 89ed83181efe..eb496edfbf32 100644 --- a/packages/kit/test/apps/hash-based-routing/package.json +++ b/packages/kit/test/apps/hash-based-routing/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index d6a0f87f2802..4ade924d597b 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index b786390c9eea..8d79716c0be3 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -20,7 +20,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 0b30bdcd51fa..de826d899822 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -22,7 +22,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/apps/prerendered-app-error-pages/package.json b/packages/kit/test/apps/prerendered-app-error-pages/package.json index f3a7e7036d21..4e046db3c958 100644 --- a/packages/kit/test/apps/prerendered-app-error-pages/package.json +++ b/packages/kit/test/apps/prerendered-app-error-pages/package.json @@ -21,6 +21,6 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" } } diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index c4aa7f7ea77e..180546669229 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index 3d3078348793..0fe96139113a 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index 3d3078348793..0fe96139113a 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index 117d1e83ee2e..cbc39306fd82 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index 5e0da74b7cab..cc83100eeb3a 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index 060db892bc20..edd8c6d43198 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index d7a5e58919bd..f168b7a20cd4 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index 679a5ec2a8be..d88b7be855d6 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -17,7 +17,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index c4ad4ab9b5a3..419c62ed9d41 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index 38b229b88872..09b7494020c2 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index 108c55f49ed2..723d0b722322 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index f37f38b721db..51fd5cc1cc18 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index 3d56d865eeb1..2d136357896d 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index 70b5ec524bf1..7ec2371e7d41 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index a930900ccc57..122ec235de51 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -14,7 +14,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module" } diff --git a/packages/kit/test/build-errors/package.json b/packages/kit/test/build-errors/package.json index cda1f114aac0..0a783b8ca39c 100644 --- a/packages/kit/test/build-errors/package.json +++ b/packages/kit/test/build-errors/package.json @@ -8,6 +8,6 @@ }, "type": "module", "devDependencies": { - "vitest": "^3.0.1" + "vitest": "^3.1.1" } } diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index 5a96a5e2711f..004159178408 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -16,8 +16,8 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11", - "vitest": "^3.0.1" + "vite": "^6.2.6", + "vitest": "^3.1.1" }, "type": "module" } diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index 6dc858250520..d28ca80a037e 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -15,8 +15,8 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11", - "vitest": "^3.0.1" + "vite": "^6.2.6", + "vitest": "^3.1.1" }, "type": "module" } diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index ac97df18a409..42cd9666d073 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -15,8 +15,8 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.0.11", - "vitest": "^3.0.1" + "vite": "^6.2.6", + "vitest": "^3.1.1" }, "type": "module" } diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index fab80ccaef95..e3f08fedf3d1 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -32,7 +32,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.0", - "vite": "^6.0.11" + "vite": "^6.2.6" }, "type": "module", "exports": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1e8b3d6ebe9d..e32bd34e3ddd 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -44,7 +44,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -52,20 +52,20 @@ importers: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-cloudflare: dependencies: '@cloudflare/workers-types': - specifier: ^4.20250312.0 - version: 4.20250312.0 + specifier: ^4.20250415.0 + version: 4.20250415.0 worktop: specifier: 0.8.0-next.18 version: 0.8.0-next.18 wrangler: specifier: ^4.0.0 - version: 4.0.0(@cloudflare/workers-types@4.20250312.0) + version: 4.11.0(@cloudflare/workers-types@4.20250415.0) devDependencies: '@playwright/test': specifier: ^1.44.1 @@ -77,8 +77,8 @@ importers: specifier: ^18.19.48 version: 18.19.50 esbuild: - specifier: ^0.24.0 - version: 0.24.2 + specifier: ^0.25.2 + version: 0.25.2 typescript: specifier: ^5.3.3 version: 5.6.3 @@ -90,7 +90,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) server-side-dep: specifier: file:server-side-dep version: file:packages/adapter-cloudflare/test/apps/pages/server-side-dep @@ -98,11 +98,11 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) wrangler: - specifier: ^4.0.0 - version: 4.0.0(@cloudflare/workers-types@4.20250312.0) + specifier: ^4.11.0 + version: 4.11.0(@cloudflare/workers-types@4.20250415.0) packages/adapter-cloudflare/test/apps/workers: devDependencies: @@ -111,7 +111,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) server-side-dep: specifier: file:server-side-dep version: file:packages/adapter-cloudflare/test/apps/workers/server-side-dep @@ -119,11 +119,11 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) wrangler: - specifier: ^4.0.0 - version: 4.0.0(@cloudflare/workers-types@4.20250312.0) + specifier: ^4.11.0 + version: 4.11.0(@cloudflare/workers-types@4.20250415.0) packages/adapter-netlify: dependencies: @@ -131,8 +131,8 @@ importers: specifier: ^2.2.5 version: 2.2.5 esbuild: - specifier: ^0.24.0 - version: 0.24.2 + specifier: ^0.25.2 + version: 0.25.2 set-cookie-parser: specifier: ^2.6.0 version: 2.6.0 @@ -154,7 +154,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -168,8 +168,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-node: dependencies: @@ -194,7 +194,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -208,8 +208,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static: devDependencies: @@ -221,7 +221,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -235,8 +235,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/prerendered: devDependencies: @@ -245,7 +245,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -253,8 +253,8 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/spa: devDependencies: @@ -266,7 +266,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -274,8 +274,8 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-vercel: dependencies: @@ -283,15 +283,15 @@ importers: specifier: ^0.29.2 version: 0.29.2(rollup@4.30.1) esbuild: - specifier: ^0.24.0 - version: 0.24.2 + specifier: ^0.25.2 + version: 0.25.2 devDependencies: '@sveltejs/kit': specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -299,8 +299,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/amp: dependencies: @@ -348,11 +348,11 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit: dependencies: @@ -395,7 +395,7 @@ importers: version: 1.44.1 '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/connect': specifier: ^3.4.38 version: 3.4.38 @@ -421,11 +421,11 @@ importers: specifier: ^5.3.3 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/amp: devDependencies: @@ -437,7 +437,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -454,8 +454,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/basics: devDependencies: @@ -464,7 +464,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -478,8 +478,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/dev-only: devDependencies: @@ -488,7 +488,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -532,8 +532,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/embed: devDependencies: @@ -542,7 +542,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -556,8 +556,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/hash-based-routing: devDependencies: @@ -566,7 +566,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -580,8 +580,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/no-ssr: devDependencies: @@ -590,7 +590,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -604,8 +604,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options: devDependencies: @@ -617,7 +617,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -631,8 +631,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options-2: devDependencies: @@ -644,7 +644,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -658,8 +658,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/prerendered-app-error-pages: devDependencies: @@ -668,7 +668,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -682,8 +682,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/writes: devDependencies: @@ -692,7 +692,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -706,14 +706,14 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors: devDependencies: vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch: devDependencies: @@ -725,7 +725,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -736,8 +736,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment: devDependencies: @@ -749,7 +749,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -760,8 +760,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-not-prerendered: devDependencies: @@ -773,7 +773,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -784,8 +784,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env: devDependencies: @@ -794,7 +794,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -805,8 +805,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import: devDependencies: @@ -815,7 +815,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -826,8 +826,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env: devDependencies: @@ -836,7 +836,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -850,8 +850,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env-dynamic-import: devDependencies: @@ -860,7 +860,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -871,8 +871,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder: devDependencies: @@ -881,7 +881,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -892,8 +892,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder-dynamic-import: devDependencies: @@ -902,7 +902,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -913,8 +913,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module: devDependencies: @@ -923,7 +923,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -934,8 +934,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module-dynamic-import: devDependencies: @@ -944,7 +944,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -955,8 +955,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-dynamic-public-env: devDependencies: @@ -965,7 +965,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -976,8 +976,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-private-env: devDependencies: @@ -986,7 +986,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -997,8 +997,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/syntax-error: devDependencies: @@ -1007,7 +1007,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1018,8 +1018,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/basics: devDependencies: @@ -1028,7 +1028,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1039,11 +1039,11 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/options: devDependencies: @@ -1052,7 +1052,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1063,11 +1063,11 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/paths-base: devDependencies: @@ -1076,7 +1076,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1087,11 +1087,11 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) vitest: - specifier: ^3.0.1 - version: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^3.1.1 + version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) packages/package: dependencies: @@ -1113,7 +1113,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1170,7 +1170,7 @@ importers: version: link:../../packages/package '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) prettier: specifier: ^3.3.2 version: 3.3.3 @@ -1190,8 +1190,8 @@ importers: specifier: ^5.5.0 version: 5.6.3 vite: - specifier: ^6.0.11 - version: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.6 + version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) packages: @@ -1269,47 +1269,47 @@ packages: resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} engines: {node: '>=18.0.0'} - '@cloudflare/unenv-preset@2.0.2': - resolution: {integrity: sha512-nyzYnlZjjV5xT3LizahG1Iu6mnrCaxglJ04rZLpDwlDVDZ7v46lNsfxhV3A/xtfgQuSHmLnc6SVI+KwBpc3Lwg==} + '@cloudflare/unenv-preset@2.3.1': + resolution: {integrity: sha512-Xq57Qd+ADpt6hibcVBO0uLG9zzRgyRhfCUgBT9s+g3+3Ivg5zDyVgLFy40ES1VdNcu8rPNSivm9A+kGP5IVaPg==} peerDependencies: - unenv: 2.0.0-rc.14 - workerd: ^1.20250124.0 + unenv: 2.0.0-rc.15 + workerd: ^1.20250320.0 peerDependenciesMeta: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20250310.0': - resolution: {integrity: sha512-LkLJO6F8lRNaCbK5sQCITi66SyCirDpffRuI5/5iILDJWQU4KVvAOKPvHrd4E5h/WDm9FGd22zMJwky7SxaNjg==} + '@cloudflare/workerd-darwin-64@1.20250410.0': + resolution: {integrity: sha512-U3Pb+pr6DYeESXGiDAS/SKTVBoDA/BbFyiTTi4BJSdk2I703vaDJGH4k1jFsOJmb/S+Gy7w5xVJwHgZA7w6Kaw==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250310.0': - resolution: {integrity: sha512-WythDJQbsU3Ii1hhA7pJZLBQlHezeYWAnaMnv3gS2Exj45oF8G4chFvrO7zCzjlcJXwSeBTtQRJqxw9AiUDhyA==} + '@cloudflare/workerd-darwin-arm64@1.20250410.0': + resolution: {integrity: sha512-stvgUOVDXGBdV1HTEdgcQ/d/c9T4Vrmg+8OJK4HXn6uM1spMediyQXed64greG0I5rNJ0pTPq0uZsfCjn9T7cA==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250310.0': - resolution: {integrity: sha512-LbP769tT4/5QBHSj4lCt99QIKTi6cU+wYhLfF7rEtYHBnZS2+nIw9xttAzxeERx/aFrU+mxLcYPFV8fUeVxGng==} + '@cloudflare/workerd-linux-64@1.20250410.0': + resolution: {integrity: sha512-n7BRelPUc7+UNVKlS7z/uhI6xqsoyoZayjrezLcZ54IY4o9XASt4oc4kFDrc5ow9YNW94sq2tBG8z/ZQ9wBjLA==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250310.0': - resolution: {integrity: sha512-FzWeKM6id20EMZACaDg0Kkvg1C4lvXZgLBXVI6h6xaXTNFReoyEp4v4eMrRTuja5ec5k+m5iGKjP4/bMWJp9ew==} + '@cloudflare/workerd-linux-arm64@1.20250410.0': + resolution: {integrity: sha512-R9zE5LhVQCgIPIB/LWSt+XqFjzkPRfkLk4pqae8OYhMg0Dr3G7xO/xNxIabCVNPHhF7dj2yXfMyLGX603Y8/LQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250310.0': - resolution: {integrity: sha512-04OgaDzm8/8nkjF3tovB+WywZLjSdAHCQT2omXKCwH3EDd1kpd8vvzE1pErtdIyKCOf9/sArY4BhPdxRj7ijlg==} + '@cloudflare/workerd-windows-64@1.20250410.0': + resolution: {integrity: sha512-UcoQ2u+TQcKNEQUXBRsoqfXibOCklCilukN5xxz7svuAi1f2P0/lR29iuq6DBEwDu/GqQd6H5WLrczXwfPLZsQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20250312.0': - resolution: {integrity: sha512-LQBDkrXxm/L0FM4NoT8EXaKCA7+2roOAZAWg+31RGxLKcoAWWSQpbf0PFMBAyFIN/eNADu5RKKrt4qHWNsztHQ==} + '@cloudflare/workers-types@4.20250415.0': + resolution: {integrity: sha512-6N3N7yZEBVhztPUcloHSMm5+kSY0/e1OtoPjNrI5Jw8dyFTNSf875u0D76YFiYCV8WVwbp3RtdEAb6TWdAwoEw==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -1318,162 +1318,156 @@ packages: '@emnapi/runtime@1.2.0': resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} - '@esbuild/aix-ppc64@0.24.2': - resolution: {integrity: sha512-thpVCb/rhxE/BnMLQ7GReQLLN8q9qbHmI55F4489/ByVg2aQaQ6kbcLb6FHkocZzQhxc4gx0sCk0tJkKBFzDhA==} + '@esbuild/aix-ppc64@0.25.2': + resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/android-arm64@0.24.2': - resolution: {integrity: sha512-cNLgeqCqV8WxfcTIOeL4OAtSmL8JjcN6m09XIgro1Wi7cF4t/THaWEa7eL5CMoMBdjoHOTh/vwTO/o2TRXIyzg==} + '@esbuild/android-arm64@0.25.2': + resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.24.2': - resolution: {integrity: sha512-tmwl4hJkCfNHwFB3nBa8z1Uy3ypZpxqxfTQOcHX+xRByyYgunVbZ9MzUUfb0RxaHIMnbHagwAxuTL+tnNM+1/Q==} + '@esbuild/android-arm@0.25.2': + resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.24.2': - resolution: {integrity: sha512-B6Q0YQDqMx9D7rvIcsXfmJfvUYLoP722bgfBlO5cGvNVb5V/+Y7nhBE3mHV9OpxBf4eAS2S68KZztiPaWq4XYw==} + '@esbuild/android-x64@0.25.2': + resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.24.2': - resolution: {integrity: sha512-kj3AnYWc+CekmZnS5IPu9D+HWtUI49hbnyqk0FLEJDbzCIQt7hg7ucF1SQAilhtYpIujfaHr6O0UHlzzSPdOeA==} + '@esbuild/darwin-arm64@0.25.2': + resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.24.2': - resolution: {integrity: sha512-WeSrmwwHaPkNR5H3yYfowhZcbriGqooyu3zI/3GGpF8AyUdsrrP0X6KumITGA9WOyiJavnGZUwPGvxvwfWPHIA==} + '@esbuild/darwin-x64@0.25.2': + resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/freebsd-arm64@0.24.2': - resolution: {integrity: sha512-UN8HXjtJ0k/Mj6a9+5u6+2eZ2ERD7Edt1Q9IZiB5UZAIdPnVKDoG7mdTVGhHJIeEml60JteamR3qhsr1r8gXvg==} + '@esbuild/freebsd-arm64@0.25.2': + resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.24.2': - resolution: {integrity: sha512-TvW7wE/89PYW+IevEJXZ5sF6gJRDY/14hyIGFXdIucxCsbRmLUcjseQu1SyTko+2idmCw94TgyaEZi9HUSOe3Q==} + '@esbuild/freebsd-x64@0.25.2': + resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/linux-arm64@0.24.2': - resolution: {integrity: sha512-7HnAD6074BW43YvvUmE/35Id9/NB7BeX5EoNkK9obndmZBUk8xmJJeU7DwmUeN7tkysslb2eSl6CTrYz6oEMQg==} + '@esbuild/linux-arm64@0.25.2': + resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm@0.24.2': - resolution: {integrity: sha512-n0WRM/gWIdU29J57hJyUdIsk0WarGd6To0s+Y+LwvlC55wt+GT/OgkwoXCXvIue1i1sSNWblHEig00GBWiJgfA==} + '@esbuild/linux-arm@0.25.2': + resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-ia32@0.24.2': - resolution: {integrity: sha512-sfv0tGPQhcZOgTKO3oBE9xpHuUqguHvSo4jl+wjnKwFpapx+vUDcawbwPNuBIAYdRAvIDBfZVvXprIj3HA+Ugw==} + '@esbuild/linux-ia32@0.25.2': + resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.24.2': - resolution: {integrity: sha512-CN9AZr8kEndGooS35ntToZLTQLHEjtVB5n7dl8ZcTZMonJ7CCfStrYhrzF97eAecqVbVJ7APOEe18RPI4KLhwQ==} + '@esbuild/linux-loong64@0.25.2': + resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-mips64el@0.24.2': - resolution: {integrity: sha512-iMkk7qr/wl3exJATwkISxI7kTcmHKE+BlymIAbHO8xanq/TjHaaVThFF6ipWzPHryoFsesNQJPE/3wFJw4+huw==} + '@esbuild/linux-mips64el@0.25.2': + resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-ppc64@0.24.2': - resolution: {integrity: sha512-shsVrgCZ57Vr2L8mm39kO5PPIb+843FStGt7sGGoqiiWYconSxwTiuswC1VJZLCjNiMLAMh34jg4VSEQb+iEbw==} + '@esbuild/linux-ppc64@0.25.2': + resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-riscv64@0.24.2': - resolution: {integrity: sha512-4eSFWnU9Hhd68fW16GD0TINewo1L6dRrB+oLNNbYyMUAeOD2yCK5KXGK1GH4qD/kT+bTEXjsyTCiJGHPZ3eM9Q==} + '@esbuild/linux-riscv64@0.25.2': + resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.24.2': - resolution: {integrity: sha512-S0Bh0A53b0YHL2XEXC20bHLuGMOhFDO6GN4b3YjRLK//Ep3ql3erpNcPlEFed93hsQAjAQDNsvcK+hV90FubSw==} + '@esbuild/linux-s390x@0.25.2': + resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.24.2': - resolution: {integrity: sha512-8Qi4nQcCTbLnK9WoMjdC9NiTG6/E38RNICU6sUNqK0QFxCYgoARqVqxdFmWkdonVsvGqWhmm7MO0jyTqLqwj0Q==} + '@esbuild/linux-x64@0.25.2': + resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.24.2': - resolution: {integrity: sha512-wuLK/VztRRpMt9zyHSazyCVdCXlpHkKm34WUyinD2lzK07FAHTq0KQvZZlXikNWkDGoT6x3TD51jKQ7gMVpopw==} + '@esbuild/netbsd-arm64@0.25.2': + resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-x64@0.24.2': - resolution: {integrity: sha512-VefFaQUc4FMmJuAxmIHgUmfNiLXY438XrL4GDNV1Y1H/RW3qow68xTwjZKfj/+Plp9NANmzbH5R40Meudu8mmw==} + '@esbuild/netbsd-x64@0.25.2': + resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/openbsd-arm64@0.24.2': - resolution: {integrity: sha512-YQbi46SBct6iKnszhSvdluqDmxCJA+Pu280Av9WICNwQmMxV7nLRHZfjQzwbPs3jeWnuAhE9Jy0NrnJ12Oz+0A==} + '@esbuild/openbsd-arm64@0.25.2': + resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.24.2': - resolution: {integrity: sha512-+iDS6zpNM6EnJyWv0bMGLWSWeXGN/HTaF/LXHXHwejGsVi+ooqDfMCCTerNFxEkM3wYVcExkeGXNqshc9iMaOA==} + '@esbuild/openbsd-x64@0.25.2': + resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.24.2': - resolution: {integrity: sha512-hTdsW27jcktEvpwNHJU4ZwWFGkz2zRJUz8pvddmXPtXDzVKTTINmlmga3ZzwcuMpUvLw7JkLy9QLKyGpD2Yxig==} + '@esbuild/sunos-x64@0.25.2': + resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.24.2': - resolution: {integrity: sha512-LihEQ2BBKVFLOC9ZItT9iFprsE9tqjDjnbulhHoFxYQtQfai7qfluVODIYxt1PgdoyQkz23+01rzwNwYfutxUQ==} + '@esbuild/win32-arm64@0.25.2': + resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.24.2': - resolution: {integrity: sha512-q+iGUwfs8tncmFC9pcnD5IvRHAzmbwQ3GPS5/ceCyHdjXubwQWI12MKWSNSMYLJMq23/IUCvJMS76PDqXe1fxA==} + '@esbuild/win32-ia32@0.25.2': + resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-x64@0.24.2': - resolution: {integrity: sha512-7VTgWzgMGvup6aSqDPLiW5zHaxYJGTO4OokMjIlrCtf+VpEL+cXKtCvg723iguPYI5oaUNdS+/V7OU2gvXVWEg==} + '@esbuild/win32-x64@0.25.2': + resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.5.1': - resolution: {integrity: sha512-soEIOALTfTK6EjmKMMoLugwaP0rzkad90iIWd1hMO9ARkSAyjfMfkRRhLvD5qH7vvM0Cg72pieUfR6yh6XxC4w==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.6.0': resolution: {integrity: sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} @@ -1930,8 +1924,8 @@ packages: resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.29.1': - resolution: {integrity: sha512-2nggXGX5F3YrsGN08pw4XpMLO1Rgtnn4AzTegC2MDesv6q3QaTU5yU7IbS1tf1IwCR0Hv/1EFygLn9ms6LIpDA==} + '@typescript-eslint/scope-manager@8.30.1': + resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.26.0': @@ -1945,8 +1939,8 @@ packages: resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.29.1': - resolution: {integrity: sha512-VT7T1PuJF1hpYC3AGm2rCgJBjHL3nc+A/bhOp9sGMKfi5v0WufsX/sHCFBfNTx2F+zA6qBc/PD0/kLRLjdt8mQ==} + '@typescript-eslint/types@8.30.1': + resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.26.0': @@ -1955,8 +1949,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.29.1': - resolution: {integrity: sha512-l1enRoSaUkQxOQnbi0KPUtqeZkSiFlqrx9/3ns2rEDhGKfTa+88RmXqedC1zmVTOWrLc2e6DEJrTA51C9iLH5g==} + '@typescript-eslint/typescript-estree@8.30.1': + resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -1968,8 +1962,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.29.1': - resolution: {integrity: sha512-QAkFEbytSaB8wnmB+DflhUPz6CLbFWE2SnSCrRMEa+KnXIzDYbpsn++1HGvnfAsUY44doDXmvRkO5shlM/3UfA==} + '@typescript-eslint/utils@8.30.1': + resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1979,8 +1973,8 @@ packages: resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.29.1': - resolution: {integrity: sha512-RGLh5CRaUEf02viP5c1Vh1cMGffQscyHe7HPAzGpfmfflFg1wUz2rYxd+OZqwpeypYvZ8UxSxuIpF++fmOzEcg==} + '@typescript-eslint/visitor-keys@8.30.1': + resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vercel/nft@0.29.2': @@ -1988,11 +1982,11 @@ packages: engines: {node: '>=18'} hasBin: true - '@vitest/expect@3.0.5': - resolution: {integrity: sha512-nNIOqupgZ4v5jWuQx2DSlHLEs7Q4Oh/7AYwNyE+k0UQzG7tSmjPXShUikn1mpNGzYEN2jJbTvLejwShMitovBA==} + '@vitest/expect@3.1.1': + resolution: {integrity: sha512-q/zjrW9lgynctNbwvFtQkGK9+vvHA5UzVi2V8APrp1C6fG6/MuYYkmlx4FubuqLycCeSdHD5aadWfua/Vr0EUA==} - '@vitest/mocker@3.0.5': - resolution: {integrity: sha512-CLPNBFBIE7x6aEGbIjaQAX03ZZlBMaWwAjBdMkIf/cAn6xzLTiM3zYqO/WAbieEjsAZir6tO71mzeHZoodThvw==} + '@vitest/mocker@3.1.1': + resolution: {integrity: sha512-bmpJJm7Y7i9BBELlLuuM1J1Q6EQ6K5Ye4wcyOpOMXMcePYKSIYlpcrCm4l/O6ja4VJA5G2aMJiuZkZdnxlC3SA==} peerDependencies: msw: ^2.4.9 vite: ^5.0.0 || ^6.0.0 @@ -2002,20 +1996,20 @@ packages: vite: optional: true - '@vitest/pretty-format@3.0.5': - resolution: {integrity: sha512-CjUtdmpOcm4RVtB+up8r2vVDLR16Mgm/bYdkGFe3Yj/scRfCpbSi2W/BDSDcFK7ohw8UXvjMbOp9H4fByd/cOA==} + '@vitest/pretty-format@3.1.1': + resolution: {integrity: sha512-dg0CIzNx+hMMYfNmSqJlLSXEmnNhMswcn3sXO7Tpldr0LiGmg3eXdLLhwkv2ZqgHb/d5xg5F7ezNFRA1fA13yA==} - '@vitest/runner@3.0.5': - resolution: {integrity: sha512-BAiZFityFexZQi2yN4OX3OkJC6scwRo8EhRB0Z5HIGGgd2q+Nq29LgHU/+ovCtd0fOfXj5ZI6pwdlUmC5bpi8A==} + '@vitest/runner@3.1.1': + resolution: {integrity: sha512-X/d46qzJuEDO8ueyjtKfxffiXraPRfmYasoC4i5+mlLEJ10UvPb0XH5M9C3gWuxd7BAQhpK42cJgJtq53YnWVA==} - '@vitest/snapshot@3.0.5': - resolution: {integrity: sha512-GJPZYcd7v8QNUJ7vRvLDmRwl+a1fGg4T/54lZXe+UOGy47F9yUfE18hRCtXL5aHN/AONu29NGzIXSVFh9K0feA==} + '@vitest/snapshot@3.1.1': + resolution: {integrity: sha512-bByMwaVWe/+1WDf9exFxWWgAixelSdiwo2p33tpqIlM14vW7PRV5ppayVXtfycqze4Qhtwag5sVhX400MLBOOw==} - '@vitest/spy@3.0.5': - resolution: {integrity: sha512-5fOzHj0WbUNqPK6blI/8VzZdkBlQLnT25knX0r4dbZI9qoZDf3qAdjoMmDcLG5A83W6oUUFJgUd0EYBc2P5xqg==} + '@vitest/spy@3.1.1': + resolution: {integrity: sha512-+EmrUOOXbKzLkTDwlsc/xrwOlPDXyVk3Z6P6K4oiCndxz7YLpp/0R0UsWVOKT0IXWjjBJuSMk6D27qipaupcvQ==} - '@vitest/utils@3.0.5': - resolution: {integrity: sha512-N9AX0NUoUtVwKwy21JtwzaqR5L5R5A99GAbrHfCCXK1lp593i/3AZAXhSP43wRQuxYsflrdzEfXZFo1reR1Nkg==} + '@vitest/utils@3.1.1': + resolution: {integrity: sha512-1XIjflyaU2k3HMArJ50bwSh3wKWPD6Q47wz/NUSmRV0zNywPc4w79ARjg/i/aNINHwA+mIALhUVqD9/aUvZNgg==} abbrev@2.0.0: resolution: {integrity: sha512-6/mh1E2u2YgEsCHdY0Yx5oW+61gZU+1vXaoiHHrpKeuRNNgFvS+/jrwHiQhB5apAf5oB7UB7E19ol2R2LKH8hQ==} @@ -2131,8 +2125,8 @@ packages: resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} engines: {node: '>=6'} - chai@5.1.2: - resolution: {integrity: sha512-aGtmf24DW6MLHHG5gCx4zaI3uBq3KRtxeVs0DjFH6Z0rDNbsvTxFASFvdj79pxjxZ8/5u3PIiN3IwEIQkiiuPw==} + chai@5.2.0: + resolution: {integrity: sha512-mCuXncKXk5iCLhfhwTc0izo0gtEmpz5CtG2y8GiOINBlMVS6v8TMRc5TaLWKS6692m9+dVVfzgeVxR5UxWHTYw==} engines: {node: '>=12'} chalk@4.1.2: @@ -2190,14 +2184,14 @@ packages: resolution: {integrity: sha512-pMD+MVR538ipqkG5JXeOEbKWS5um1H4LUUccUQG68qpeqBYbzYy79Gh55jkd2TtPdRfUaLWdv6LPP//5Zt0aPQ==} engines: {node: '>=4'} - cookie@0.5.0: - resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} - engines: {node: '>= 0.6'} - cookie@0.6.0: resolution: {integrity: sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==} engines: {node: '>= 0.6'} + cookie@0.7.2: + resolution: {integrity: sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==} + engines: {node: '>= 0.6'} + cross-env@7.0.3: resolution: {integrity: sha512-+/HKd6EgcQCJGh2PSjZuUitQBQynKor4wrFbRg4DtAgS1aWO+gU52xpH7M9ScGgXSYmAVS9bIJ8EzuaGw0oNAw==} engines: {node: '>=10.14', npm: '>=6', yarn: '>=1'} @@ -2308,8 +2302,8 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - esbuild@0.24.2: - resolution: {integrity: sha512-+9egpBW8I3CD5XPe0n6BfT5fxLzxrlDzqydF3aviG+9ni1lDC/OvMHcxqEFV0+LANZG5R1bFMWfUrjVsdwxJvA==} + esbuild@0.25.2: + resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} engines: {node: '>=18'} hasBin: true @@ -2417,8 +2411,8 @@ packages: resolution: {integrity: sha512-eNTPlAD67BmP31LDINZ3U7HSF8l57TxOY2PmBJ1shpCvpnxBF93mWCE8YHBnXs8qiUZJc9WDcWIeC3a2HIAMfw==} engines: {node: '>=6'} - expect-type@1.1.0: - resolution: {integrity: sha512-bFi65yM+xZgk+u/KRIpekdSYkTB5W1pEf0Lt8Q8Msh7b+eQ7LXVtIB1Bkm4fvclDEL1b2CZkMhv2mOeF8tMdkA==} + expect-type@1.2.1: + resolution: {integrity: sha512-/kP8CAwxzLVEeFrMm4kMmy4CCDlpipyA7MYLVrdJIkV0fYF0UaigQHRsxHiuY/GEea+bh4KSv3TIlgr+2UL6bw==} engines: {node: '>=12.0.0'} exsolve@1.0.4: @@ -2782,8 +2776,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - miniflare@4.20250310.0: - resolution: {integrity: sha512-WL4hKQIfXyTxKyQzxJyyy/v+OYSiF51s3Qe1Q4W4MjHJbtiN8Kg7+oeTdHYgqYehanN2zYoSKJ/xooIy8q5+XA==} + miniflare@4.20250410.0: + resolution: {integrity: sha512-vvbVssljSZathZ0gYQknXW4g/Oye/jAYlQStnbW+8Sa3BnF0u+vhP3MaCGea/OlC9+FsD/2HUwVnb56Tof9UZA==} engines: {node: '>=18.0.0'} hasBin: true @@ -3153,8 +3147,8 @@ packages: stacktracey@2.1.8: resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==} - std-env@3.8.0: - resolution: {integrity: sha512-Bc3YwwCB+OzldMxOXJIIvC6cPRWr/LxOp48CdQTOkPyk/t4JWWJbrilwBd7RJzKV8QW7tJkcgAmeuLLJugl5/w==} + std-env@3.9.0: + resolution: {integrity: sha512-UGvjygr6F6tpH7o2qyqR6QYpwraIjKSdtzyBdyytFOHmPZY917kwdwLG0RbOjWOnKmnm3PeHjaoLLMie7kPLQw==} stoppable@1.1.0: resolution: {integrity: sha512-KXDYZ9dszj6bzvnEMRYvxgeTHU74QBFL54XKtP3nyMuJ81CFYtABZ3bAzL2EdFUaEwJOBOgENyFj3R7oTzDyyw==} @@ -3361,18 +3355,18 @@ packages: engines: {node: '>=14.17'} hasBin: true - ufo@1.5.4: - resolution: {integrity: sha512-UsUk3byDzKd04EyoZ7U4DOlxQaD14JUKQl6/P7wiX4FNvUfm3XL246n9W5AmqwW5RSFJ27NAuM0iLscAOYUiGQ==} + ufo@1.6.1: + resolution: {integrity: sha512-9a4/uxlTWJ4+a5i0ooc1rU7C7YOw3wT+UGqdeNNHWnOF9qcMBgLRS+4IYUqbczewFx4mLEig6gawh7X6mFlEkA==} undici-types@5.26.5: resolution: {integrity: sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==} - undici@5.28.5: - resolution: {integrity: sha512-zICwjrDrcrUE0pyyJc1I2QzBkLM8FINsgOrt6WjA+BgajVq9Nxu2PbFFXUrAggLfDXlZGZBVZYw7WNV5KiBiBA==} + undici@5.29.0: + resolution: {integrity: sha512-raqeBD6NQK4SkWhQzeYKd1KmIG6dllBOTt55Rmkt4HtI9mwdWtJljnrXjAFUBLTSN67HWrOIZ3EPF4kjUw80Bg==} engines: {node: '>=14.0'} - unenv@2.0.0-rc.14: - resolution: {integrity: sha512-od496pShMen7nOy5VmVJCnq8rptd45vh6Nx/r2iPbrba6pa6p+tS2ywuIHRZ/OBvSbQZB0kWvpO9XBNVFXHD3Q==} + unenv@2.0.0-rc.15: + resolution: {integrity: sha512-J/rEIZU8w6FOfLNz/hNKsnY+fFHWnu9MH4yRbSZF3xbbGHovcetXPs7sD+9p8L6CeNC//I9bhRYAOsBt2u7/OA==} universalify@0.1.2: resolution: {integrity: sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==} @@ -3396,13 +3390,13 @@ packages: resolution: {integrity: sha512-23jnLhkTH0HR9Vd9LxMYnajOLeo0RJNEAHhtlsQP6kfPuOBoTzt54rWbEWB9jmhEXAOflLQpM+FrmilVPAoyGA==} engines: {node: '>=18.0.0'} - vite-node@3.0.5: - resolution: {integrity: sha512-02JEJl7SbtwSDJdYS537nU6l+ktdvcREfLksk/NDAqtdKWGqHl+joXzEubHROmS3E6pip+Xgu2tFezMu75jH7A==} + vite-node@3.1.1: + resolution: {integrity: sha512-V+IxPAE2FvXpTCHXyNem0M+gWm6J7eRyWPR6vYoG/Gl+IscNOjXzztUhimQgTxaAoUoj40Qqimaa0NLIOOAH4w==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.0.11: - resolution: {integrity: sha512-4VL9mQPKoHy4+FE0NnRE/kbY51TOfaknxAjt3fJbGJxhIpBZiqVzlZDEesWWsuREXHwNdAoOFZ9MkPEVXczHwg==} + vite@6.2.6: + resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -3449,16 +3443,16 @@ packages: vite: optional: true - vitest@3.0.5: - resolution: {integrity: sha512-4dof+HvqONw9bvsYxtkfUp2uHsTN9bV2CZIi1pWgoFpL1Lld8LA1ka9q/ONSsoScAKG7NVGf2stJTI7XRkXb2Q==} + vitest@3.1.1: + resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: '@edge-runtime/vm': '*' '@types/debug': ^4.1.12 '@types/node': ^18.0.0 || ^20.0.0 || >=22.0.0 - '@vitest/browser': 3.0.5 - '@vitest/ui': 3.0.5 + '@vitest/browser': 3.1.1 + '@vitest/ui': 3.1.1 happy-dom: '*' jsdom: '*' peerDependenciesMeta: @@ -3493,8 +3487,8 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20250310.0: - resolution: {integrity: sha512-bAaZ9Bmts3mArbIrXYAtr+ZRsAJAAUEsCtvwfBavIYXaZ5sgdEOJBEiBbvsHp6CsVObegOM85tIWpYLpbTxQrQ==} + workerd@1.20250410.0: + resolution: {integrity: sha512-W7vy1+Z3+jpLr68nmda3VFapn284VwIb22TZlI1LbCvThAiNABIa/t06bTE9mohSjUudFou9rc9de49fUvrUDQ==} engines: {node: '>=16'} hasBin: true @@ -3502,12 +3496,12 @@ packages: resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} engines: {node: '>=12'} - wrangler@4.0.0: - resolution: {integrity: sha512-9QqqoznS5sfLNqPKPkeEkwPAIe4lPfWLzPxVATmAbMQl4sh3/8iKEYSjZXQxdtcTgiS8iGOUbHq/rdiOFU8H1w==} + wrangler@4.11.0: + resolution: {integrity: sha512-P9jyp1wDUmspi9sRMQG16TyeiN8IP7pLkfeknRkqm/3AwkD8L32AvgqDYqk/jZhI+eIGAzue5h1JX6jILX2qBQ==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250310.0 + '@cloudflare/workers-types': ^4.20250410.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -3544,8 +3538,8 @@ packages: resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} engines: {node: '>=10'} - youch@3.2.3: - resolution: {integrity: sha512-ZBcWz/uzZaQVdCvfV4uk616Bbpf2ee+F/AvuKDR5EwX/Y4v06xWdtMluqTD7+KlZdM93lLm9gMZYo0sKBS0pgw==} + youch@3.3.4: + resolution: {integrity: sha512-UeVBXie8cA35DS6+nBkls68xaBBXCye0CNznrhszZjTbRVnJKQuNsyLKBTTL4ln1o1rh2PKtv35twV7irj5SEg==} zimmerframe@1.1.2: resolution: {integrity: sha512-rAbqEGa8ovJy4pyBxZM70hg4pE6gDgaQ0Sl9M3enG3I0d6H4XSAM3GeNGLKnsBpuijUow064sf7ww1nutC5/3w==} @@ -3719,28 +3713,28 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250310.0)': + '@cloudflare/unenv-preset@2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250410.0)': dependencies: - unenv: 2.0.0-rc.14 + unenv: 2.0.0-rc.15 optionalDependencies: - workerd: 1.20250310.0 + workerd: 1.20250410.0 - '@cloudflare/workerd-darwin-64@1.20250310.0': + '@cloudflare/workerd-darwin-64@1.20250410.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250310.0': + '@cloudflare/workerd-darwin-arm64@1.20250410.0': optional: true - '@cloudflare/workerd-linux-64@1.20250310.0': + '@cloudflare/workerd-linux-64@1.20250410.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250310.0': + '@cloudflare/workerd-linux-arm64@1.20250410.0': optional: true - '@cloudflare/workerd-windows-64@1.20250310.0': + '@cloudflare/workerd-windows-64@1.20250410.0': optional: true - '@cloudflare/workers-types@4.20250312.0': {} + '@cloudflare/workers-types@4.20250415.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -3751,86 +3745,81 @@ snapshots: tslib: 2.6.2 optional: true - '@esbuild/aix-ppc64@0.24.2': + '@esbuild/aix-ppc64@0.25.2': optional: true - '@esbuild/android-arm64@0.24.2': + '@esbuild/android-arm64@0.25.2': optional: true - '@esbuild/android-arm@0.24.2': + '@esbuild/android-arm@0.25.2': optional: true - '@esbuild/android-x64@0.24.2': + '@esbuild/android-x64@0.25.2': optional: true - '@esbuild/darwin-arm64@0.24.2': + '@esbuild/darwin-arm64@0.25.2': optional: true - '@esbuild/darwin-x64@0.24.2': + '@esbuild/darwin-x64@0.25.2': optional: true - '@esbuild/freebsd-arm64@0.24.2': + '@esbuild/freebsd-arm64@0.25.2': optional: true - '@esbuild/freebsd-x64@0.24.2': + '@esbuild/freebsd-x64@0.25.2': optional: true - '@esbuild/linux-arm64@0.24.2': + '@esbuild/linux-arm64@0.25.2': optional: true - '@esbuild/linux-arm@0.24.2': + '@esbuild/linux-arm@0.25.2': optional: true - '@esbuild/linux-ia32@0.24.2': + '@esbuild/linux-ia32@0.25.2': optional: true - '@esbuild/linux-loong64@0.24.2': + '@esbuild/linux-loong64@0.25.2': optional: true - '@esbuild/linux-mips64el@0.24.2': + '@esbuild/linux-mips64el@0.25.2': optional: true - '@esbuild/linux-ppc64@0.24.2': + '@esbuild/linux-ppc64@0.25.2': optional: true - '@esbuild/linux-riscv64@0.24.2': + '@esbuild/linux-riscv64@0.25.2': optional: true - '@esbuild/linux-s390x@0.24.2': + '@esbuild/linux-s390x@0.25.2': optional: true - '@esbuild/linux-x64@0.24.2': + '@esbuild/linux-x64@0.25.2': optional: true - '@esbuild/netbsd-arm64@0.24.2': + '@esbuild/netbsd-arm64@0.25.2': optional: true - '@esbuild/netbsd-x64@0.24.2': + '@esbuild/netbsd-x64@0.25.2': optional: true - '@esbuild/openbsd-arm64@0.24.2': + '@esbuild/openbsd-arm64@0.25.2': optional: true - '@esbuild/openbsd-x64@0.24.2': + '@esbuild/openbsd-x64@0.25.2': optional: true - '@esbuild/sunos-x64@0.24.2': + '@esbuild/sunos-x64@0.25.2': optional: true - '@esbuild/win32-arm64@0.24.2': + '@esbuild/win32-arm64@0.25.2': optional: true - '@esbuild/win32-ia32@0.24.2': + '@esbuild/win32-ia32@0.25.2': optional: true - '@esbuild/win32-x64@0.24.2': + '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.5.1(eslint@9.6.0)': - dependencies: - eslint: 9.6.0 - eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.6.0(eslint@9.6.0)': dependencies: eslint: 9.6.0 @@ -4168,25 +4157,25 @@ snapshots: typescript: 5.6.3 typescript-eslint: 8.26.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 svelte: 5.23.1 - vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.23.1 - vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 1.0.4(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.4(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) transitivePeerDependencies: - supports-color @@ -4262,10 +4251,10 @@ snapshots: '@typescript-eslint/types': 8.26.0 '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/scope-manager@8.29.1': + '@typescript-eslint/scope-manager@8.30.1': dependencies: - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: @@ -4280,7 +4269,7 @@ snapshots: '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/types@8.29.1': {} + '@typescript-eslint/types@8.30.1': {} '@typescript-eslint/typescript-estree@8.26.0(typescript@5.6.3)': dependencies: @@ -4296,10 +4285,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.29.1(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.30.1(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/visitor-keys': 8.29.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/visitor-keys': 8.30.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -4312,7 +4301,7 @@ snapshots: '@typescript-eslint/utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) '@typescript-eslint/scope-manager': 8.26.0 '@typescript-eslint/types': 8.26.0 '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.6.3) @@ -4321,12 +4310,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.29.1(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.30.1(eslint@9.6.0)(typescript@5.6.3)': dependencies: '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.29.1 - '@typescript-eslint/types': 8.29.1 - '@typescript-eslint/typescript-estree': 8.29.1(typescript@5.6.3) + '@typescript-eslint/scope-manager': 8.30.1 + '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.6.3) eslint: 9.6.0 typescript: 5.6.3 transitivePeerDependencies: @@ -4337,9 +4326,9 @@ snapshots: '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.29.1': + '@typescript-eslint/visitor-keys@8.30.1': dependencies: - '@typescript-eslint/types': 8.29.1 + '@typescript-eslint/types': 8.30.1 eslint-visitor-keys: 4.2.0 '@vercel/nft@0.29.2(rollup@4.30.1)': @@ -4361,43 +4350,43 @@ snapshots: - rollup - supports-color - '@vitest/expect@3.0.5': + '@vitest/expect@3.1.1': dependencies: - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 - chai: 5.1.2 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 + chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.0.5(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1))': + '@vitest/mocker@3.1.1(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@vitest/spy': 3.0.5 + '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) - '@vitest/pretty-format@3.0.5': + '@vitest/pretty-format@3.1.1': dependencies: tinyrainbow: 2.0.0 - '@vitest/runner@3.0.5': + '@vitest/runner@3.1.1': dependencies: - '@vitest/utils': 3.0.5 + '@vitest/utils': 3.1.1 pathe: 2.0.3 - '@vitest/snapshot@3.0.5': + '@vitest/snapshot@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.1.1 magic-string: 0.30.17 pathe: 2.0.3 - '@vitest/spy@3.0.5': + '@vitest/spy@3.1.1': dependencies: tinyspy: 3.0.2 - '@vitest/utils@3.0.5': + '@vitest/utils@3.1.1': dependencies: - '@vitest/pretty-format': 3.0.5 + '@vitest/pretty-format': 3.1.1 loupe: 3.1.3 tinyrainbow: 2.0.0 @@ -4487,7 +4476,7 @@ snapshots: callsites@3.1.0: {} - chai@5.1.2: + chai@5.2.0: dependencies: assertion-error: 2.0.1 check-error: 2.1.1 @@ -4538,10 +4527,10 @@ snapshots: console-clear@1.1.1: {} - cookie@0.5.0: {} - cookie@0.6.0: {} + cookie@0.7.2: {} + cross-env@7.0.3: dependencies: cross-spawn: 7.0.6 @@ -4625,33 +4614,33 @@ snapshots: es-module-lexer@1.6.0: {} - esbuild@0.24.2: + esbuild@0.25.2: optionalDependencies: - '@esbuild/aix-ppc64': 0.24.2 - '@esbuild/android-arm': 0.24.2 - '@esbuild/android-arm64': 0.24.2 - '@esbuild/android-x64': 0.24.2 - '@esbuild/darwin-arm64': 0.24.2 - '@esbuild/darwin-x64': 0.24.2 - '@esbuild/freebsd-arm64': 0.24.2 - '@esbuild/freebsd-x64': 0.24.2 - '@esbuild/linux-arm': 0.24.2 - '@esbuild/linux-arm64': 0.24.2 - '@esbuild/linux-ia32': 0.24.2 - '@esbuild/linux-loong64': 0.24.2 - '@esbuild/linux-mips64el': 0.24.2 - '@esbuild/linux-ppc64': 0.24.2 - '@esbuild/linux-riscv64': 0.24.2 - '@esbuild/linux-s390x': 0.24.2 - '@esbuild/linux-x64': 0.24.2 - '@esbuild/netbsd-arm64': 0.24.2 - '@esbuild/netbsd-x64': 0.24.2 - '@esbuild/openbsd-arm64': 0.24.2 - '@esbuild/openbsd-x64': 0.24.2 - '@esbuild/sunos-x64': 0.24.2 - '@esbuild/win32-arm64': 0.24.2 - '@esbuild/win32-ia32': 0.24.2 - '@esbuild/win32-x64': 0.24.2 + '@esbuild/aix-ppc64': 0.25.2 + '@esbuild/android-arm': 0.25.2 + '@esbuild/android-arm64': 0.25.2 + '@esbuild/android-x64': 0.25.2 + '@esbuild/darwin-arm64': 0.25.2 + '@esbuild/darwin-x64': 0.25.2 + '@esbuild/freebsd-arm64': 0.25.2 + '@esbuild/freebsd-x64': 0.25.2 + '@esbuild/linux-arm': 0.25.2 + '@esbuild/linux-arm64': 0.25.2 + '@esbuild/linux-ia32': 0.25.2 + '@esbuild/linux-loong64': 0.25.2 + '@esbuild/linux-mips64el': 0.25.2 + '@esbuild/linux-ppc64': 0.25.2 + '@esbuild/linux-riscv64': 0.25.2 + '@esbuild/linux-s390x': 0.25.2 + '@esbuild/linux-x64': 0.25.2 + '@esbuild/netbsd-arm64': 0.25.2 + '@esbuild/netbsd-x64': 0.25.2 + '@esbuild/openbsd-arm64': 0.25.2 + '@esbuild/openbsd-x64': 0.25.2 + '@esbuild/sunos-x64': 0.25.2 + '@esbuild/win32-arm64': 0.25.2 + '@esbuild/win32-ia32': 0.25.2 + '@esbuild/win32-x64': 0.25.2 escape-string-regexp@4.0.0: {} @@ -4674,7 +4663,7 @@ snapshots: eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) - '@typescript-eslint/utils': 8.29.1(eslint@9.6.0)(typescript@5.6.3) + '@typescript-eslint/utils': 8.30.1(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) @@ -4723,7 +4712,7 @@ snapshots: eslint@9.6.0: dependencies: - '@eslint-community/eslint-utils': 4.5.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 @@ -4800,7 +4789,7 @@ snapshots: exit-hook@2.2.1: {} - expect-type@1.1.0: {} + expect-type@1.2.1: {} exsolve@1.0.4: {} @@ -5124,7 +5113,7 @@ snapshots: min-indent@1.0.1: {} - miniflare@4.20250310.0: + miniflare@4.20250410.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -5132,10 +5121,10 @@ snapshots: exit-hook: 2.2.1 glob-to-regexp: 0.4.1 stoppable: 1.1.0 - undici: 5.28.5 - workerd: 1.20250310.0 + undici: 5.29.0 + workerd: 1.20250410.0 ws: 8.18.0 - youch: 3.2.3 + youch: 3.3.4 zod: 3.22.3 transitivePeerDependencies: - bufferutil @@ -5475,7 +5464,7 @@ snapshots: as-table: 1.0.55 get-source: 2.0.12 - std-env@3.8.0: {} + std-env@3.9.0: {} stoppable@1.1.0: {} @@ -5652,21 +5641,21 @@ snapshots: typescript@5.6.3: {} - ufo@1.5.4: {} + ufo@1.6.1: {} undici-types@5.26.5: {} - undici@5.28.5: + undici@5.29.0: dependencies: '@fastify/busboy': 2.1.1 - unenv@2.0.0-rc.14: + unenv@2.0.0-rc.15: dependencies: defu: 6.1.4 exsolve: 1.0.4 ohash: 2.0.11 pathe: 2.0.3 - ufo: 1.5.4 + ufo: 1.6.1 universalify@0.1.2: {} @@ -5692,13 +5681,13 @@ snapshots: transitivePeerDependencies: - rollup - vite-node@3.0.5(@types/node@18.19.50)(lightningcss@1.24.1): + vite-node@3.1.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: cac: 6.7.14 debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - '@types/node' - jiti @@ -5713,9 +5702,9 @@ snapshots: - tsx - yaml - vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1): + vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: - esbuild: 0.24.2 + esbuild: 0.25.2 postcss: 8.5.3 rollup: 4.30.1 optionalDependencies: @@ -5723,31 +5712,31 @@ snapshots: fsevents: 2.3.3 lightningcss: 1.24.1 - vitefu@1.0.4(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)): + vitefu@1.0.4(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)): optionalDependencies: - vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) - - vitest@3.0.5(@types/node@18.19.50)(lightningcss@1.24.1): - dependencies: - '@vitest/expect': 3.0.5 - '@vitest/mocker': 3.0.5(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) - '@vitest/pretty-format': 3.0.5 - '@vitest/runner': 3.0.5 - '@vitest/snapshot': 3.0.5 - '@vitest/spy': 3.0.5 - '@vitest/utils': 3.0.5 - chai: 5.1.2 + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + + vitest@3.1.1(@types/node@18.19.50)(lightningcss@1.24.1): + dependencies: + '@vitest/expect': 3.1.1 + '@vitest/mocker': 3.1.1(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@vitest/pretty-format': 3.1.1 + '@vitest/runner': 3.1.1 + '@vitest/snapshot': 3.1.1 + '@vitest/spy': 3.1.1 + '@vitest/utils': 3.1.1 + chai: 5.2.0 debug: 4.4.0 - expect-type: 1.1.0 + expect-type: 1.2.1 magic-string: 0.30.17 pathe: 2.0.3 - std-env: 3.8.0 + std-env: 3.9.0 tinybench: 2.9.0 tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.0.11(@types/node@18.19.50)(lightningcss@1.24.1) - vite-node: 3.0.5(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite-node: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) why-is-node-running: 2.3.0 optionalDependencies: '@types/node': 18.19.50 @@ -5781,31 +5770,31 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20250310.0: + workerd@1.20250410.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250310.0 - '@cloudflare/workerd-darwin-arm64': 1.20250310.0 - '@cloudflare/workerd-linux-64': 1.20250310.0 - '@cloudflare/workerd-linux-arm64': 1.20250310.0 - '@cloudflare/workerd-windows-64': 1.20250310.0 + '@cloudflare/workerd-darwin-64': 1.20250410.0 + '@cloudflare/workerd-darwin-arm64': 1.20250410.0 + '@cloudflare/workerd-linux-64': 1.20250410.0 + '@cloudflare/workerd-linux-arm64': 1.20250410.0 + '@cloudflare/workerd-windows-64': 1.20250410.0 worktop@0.8.0-next.18: dependencies: mrmime: 2.0.0 regexparam: 3.0.0 - wrangler@4.0.0(@cloudflare/workers-types@4.20250312.0): + wrangler@4.11.0(@cloudflare/workers-types@4.20250415.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.0.2(unenv@2.0.0-rc.14)(workerd@1.20250310.0) + '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250410.0) blake3-wasm: 2.1.5 - esbuild: 0.24.2 - miniflare: 4.20250310.0 + esbuild: 0.25.2 + miniflare: 4.20250410.0 path-to-regexp: 6.3.0 - unenv: 2.0.0-rc.14 - workerd: 1.20250310.0 + unenv: 2.0.0-rc.15 + workerd: 1.20250410.0 optionalDependencies: - '@cloudflare/workers-types': 4.20250312.0 + '@cloudflare/workers-types': 4.20250415.0 fsevents: 2.3.3 sharp: 0.33.5 transitivePeerDependencies: @@ -5832,9 +5821,9 @@ snapshots: yocto-queue@0.1.0: {} - youch@3.2.3: + youch@3.3.4: dependencies: - cookie: 0.5.0 + cookie: 0.7.2 mustache: 4.2.0 stacktracey: 2.1.8 From 43ed84338b1aee8df3e8b08e38737ad3ca8953be Mon Sep 17 00:00:00 2001 From: Kai Pepler <109538547+kaipepler@users.noreply.github.com> Date: Tue, 15 Apr 2025 17:21:25 -0400 Subject: [PATCH 1048/1135] docs: removed reference to js/ts toggle. (#13717) There is no toggle on the bottom of the page now, so removing the sentence about it to avoid confusion. --- documentation/docs/10-getting-started/30-project-structure.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/10-getting-started/30-project-structure.md b/documentation/docs/10-getting-started/30-project-structure.md index 34b938c0a862..0d9e64141723 100644 --- a/documentation/docs/10-getting-started/30-project-structure.md +++ b/documentation/docs/10-getting-started/30-project-structure.md @@ -55,7 +55,7 @@ The `src` directory contains the meat of your project. Everything except `src/ro - `hooks.server.js` contains your server [hooks](hooks) - `service-worker.js` contains your [service worker](service-workers) -(Whether the project contains `.js` or `.ts` files depends on whether you opt to use TypeScript when you create your project. You can switch between JavaScript and TypeScript in the documentation using the toggle at the bottom of this page.) +(Whether the project contains `.js` or `.ts` files depends on whether you opt to use TypeScript when you create your project.) If you added [Vitest](https://vitest.dev) when you set up your project, your unit tests will live in the `src` directory with a `.test.js` extension. From 0656e113b68b33a4215a203f523bf185d18f1deb Mon Sep 17 00:00:00 2001 From: Ravi van Rooijen Date: Wed, 16 Apr 2025 14:46:18 +0200 Subject: [PATCH 1049/1135] chore(deps): update playwright (#13715) Co-authored-by: Tee Ming --- package.json | 4 +- packages/adapter-cloudflare/package.json | 2 +- packages/adapter-static/package.json | 2 +- packages/kit/package.json | 2 +- .../apps/basics/test/cross-platform/test.js | 3 +- .../new-route/zzzz1662642734866/+page.svelte | 1 - pnpm-lock.yaml | 52 +++++++++++-------- pnpm-workspace.yaml | 3 ++ 8 files changed, 39 insertions(+), 30 deletions(-) delete mode 100644 packages/kit/test/apps/writes/src/routes/new-route/zzzz1662642734866/+page.svelte diff --git a/package.json b/package.json index cd9398b4d78e..121bb214891d 100644 --- a/package.json +++ b/package.json @@ -26,7 +26,7 @@ "@sveltejs/eslint-config": "^8.1.0", "@svitejs/changesets-changelog-github-compact": "^1.1.0", "eslint": "^9.6.0", - "playwright": "^1.44.1", + "@playwright/test": "catalog:", "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.24.0" @@ -43,4 +43,4 @@ "workerd" ] } -} \ No newline at end of file +} diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index cbb521c36373..5d882e6ea9ac 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -45,7 +45,7 @@ "worktop": "0.8.0-next.18" }, "devDependencies": { - "@playwright/test": "^1.44.1", + "@playwright/test": "catalog:", "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", "esbuild": "^0.25.2", diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index 5c65c03ed9fd..ca93ec90434c 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -39,7 +39,7 @@ "test": "pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test" }, "devDependencies": { - "@playwright/test": "^1.44.1", + "@playwright/test": "catalog:", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/node": "^18.19.48", diff --git a/packages/kit/package.json b/packages/kit/package.json index c1b66a3ade0b..dae9833a5f72 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -31,7 +31,7 @@ "sirv": "^3.0.0" }, "devDependencies": { - "@playwright/test": "^1.44.1", + "@playwright/test": "catalog:", "@sveltejs/vite-plugin-svelte": "^5.0.1", "@types/connect": "^3.4.38", "@types/node": "^18.19.48", diff --git a/packages/kit/test/apps/basics/test/cross-platform/test.js b/packages/kit/test/apps/basics/test/cross-platform/test.js index 9910bed94aba..2cdff4d9d844 100644 --- a/packages/kit/test/apps/basics/test/cross-platform/test.js +++ b/packages/kit/test/apps/basics/test/cross-platform/test.js @@ -34,7 +34,8 @@ test.describe('CSS', () => { test('applies styles correctly', async ({ page, get_computed_style }) => { await page.goto('/css'); - + // without this assertion, the WebKit browser seems to close before we can compute the styles + await expect(page.locator('.styled')).toBeVisible(); check_styles(get_computed_style); }); diff --git a/packages/kit/test/apps/writes/src/routes/new-route/zzzz1662642734866/+page.svelte b/packages/kit/test/apps/writes/src/routes/new-route/zzzz1662642734866/+page.svelte deleted file mode 100644 index ed6399be5c7d..000000000000 --- a/packages/kit/test/apps/writes/src/routes/new-route/zzzz1662642734866/+page.svelte +++ /dev/null @@ -1 +0,0 @@ -

Hello new route

diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e32bd34e3ddd..a6c6f8084015 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -4,6 +4,12 @@ settings: autoInstallPeers: true excludeLinksFromLockfile: false +catalogs: + default: + '@playwright/test': + specifier: ^1.51.1 + version: 1.51.1 + importers: .: @@ -11,6 +17,9 @@ importers: '@changesets/cli': specifier: ^2.27.11 version: 2.27.11 + '@playwright/test': + specifier: 'catalog:' + version: 1.51.1 '@sveltejs/eslint-config': specifier: ^8.1.0 version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.6.3))(typescript@5.6.3) @@ -20,9 +29,6 @@ importers: eslint: specifier: ^9.6.0 version: 9.6.0 - playwright: - specifier: ^1.44.1 - version: 1.44.1 prettier: specifier: ^3.1.1 version: 3.3.3 @@ -68,8 +74,8 @@ importers: version: 4.11.0(@cloudflare/workers-types@4.20250415.0) devDependencies: '@playwright/test': - specifier: ^1.44.1 - version: 1.44.1 + specifier: 'catalog:' + version: 1.51.1 '@sveltejs/kit': specifier: workspace:^ version: link:../kit @@ -214,8 +220,8 @@ importers: packages/adapter-static: devDependencies: '@playwright/test': - specifier: ^1.44.1 - version: 1.44.1 + specifier: 'catalog:' + version: 1.51.1 '@sveltejs/kit': specifier: workspace:^ version: link:../kit @@ -391,8 +397,8 @@ importers: version: 3.0.0 devDependencies: '@playwright/test': - specifier: ^1.44.1 - version: 1.44.1 + specifier: 'catalog:' + version: 1.51.1 '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) @@ -1688,9 +1694,9 @@ packages: resolution: {integrity: sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==} engines: {node: '>=14'} - '@playwright/test@1.44.1': - resolution: {integrity: sha512-1hZ4TNvD5z9VuhNJ/walIjvMVvYkZKf71axoF/uiAqpntQJXpG64dlXhoDXE3OczPuTuvjf/M5KWFg5VAVUS3Q==} - engines: {node: '>=16'} + '@playwright/test@1.51.1': + resolution: {integrity: sha512-nM+kEaTSAoVlXmMPH10017vn3FSiFqr/bh4fKg9vmAdMfd9SDqRZNvPSiAHADc/itWak+qPvMPZQOPwCBW7k7Q==} + engines: {node: '>=18'} hasBin: true '@polka/url@1.0.0-next.28': @@ -2944,14 +2950,14 @@ packages: resolution: {integrity: sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==} engines: {node: '>=6'} - playwright-core@1.44.1: - resolution: {integrity: sha512-wh0JWtYTrhv1+OSsLPgFzGzt67Y7BE/ZS3jEqgGBlp2ppp1ZDj8c+9IARNW4dwf1poq5MgHreEM2KV/GuR4cFA==} - engines: {node: '>=16'} + playwright-core@1.51.1: + resolution: {integrity: sha512-/crRMj8+j/Nq5s8QcvegseuyeZPxpQCZb6HNk3Sos3BlZyAknRjoyJPFWkpNn8v0+P3WiwqFF8P+zQo4eqiNuw==} + engines: {node: '>=18'} hasBin: true - playwright@1.44.1: - resolution: {integrity: sha512-qr/0UJ5CFAtloI3avF95Y0L1xQo6r3LQArLIg/z/PoGJ6xa+EwzrwO5lpNr/09STxdHuUoP2mvuELJS+hLdtgg==} - engines: {node: '>=16'} + playwright@1.51.1: + resolution: {integrity: sha512-kkx+MB2KQRkyxjYPc3a0wLZZoDczmppyGJIvQ43l+aZihkaVvmu/21kiyaHeHjiFxjxNNFnUncKmcGIyOojsaw==} + engines: {node: '>=18'} hasBin: true polka@1.0.0-next.28: @@ -4033,9 +4039,9 @@ snapshots: '@pkgjs/parseargs@0.11.0': optional: true - '@playwright/test@1.44.1': + '@playwright/test@1.51.1': dependencies: - playwright: 1.44.1 + playwright: 1.51.1 '@polka/url@1.0.0-next.28': {} @@ -5252,11 +5258,11 @@ snapshots: pify@4.0.1: {} - playwright-core@1.44.1: {} + playwright-core@1.51.1: {} - playwright@1.44.1: + playwright@1.51.1: dependencies: - playwright-core: 1.44.1 + playwright-core: 1.51.1 optionalDependencies: fsevents: 2.3.2 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 3ecf23a8fd4b..c6f37693af59 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -9,3 +9,6 @@ packages: - 'packages/create-svelte/templates/*' - '!.test-tmp/**' - 'playgrounds/*' + +catalog: + "@playwright/test": "^1.51.1" From ee81145c2e6ce50f65f0ff59d584e1bf8f3af5fd Mon Sep 17 00:00:00 2001 From: blaine-arcjet <146491715+blaine-arcjet@users.noreply.github.com> Date: Thu, 17 Apr 2025 21:53:24 -0700 Subject: [PATCH 1050/1135] feat: use edge-light condition when building for Vercel Edge Runtime (#13720) * feat: use edge-light condition when building for Vercel Edge Runtime * fmt * Update packages/adapter-vercel/index.js * Update packages/adapter-vercel/index.js * changeset --------- Co-authored-by: Tee Ming Co-authored-by: Chew Tee Ming --- .changeset/silly-ears-visit.md | 5 +++++ packages/adapter-vercel/index.js | 12 +++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) create mode 100644 .changeset/silly-ears-visit.md diff --git a/.changeset/silly-ears-visit.md b/.changeset/silly-ears-visit.md new file mode 100644 index 000000000000..75bca012fc7f --- /dev/null +++ b/.changeset/silly-ears-visit.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-vercel': patch +--- + +fix: include the `edge-light` bundling condition when building edge functions diff --git a/packages/adapter-vercel/index.js b/packages/adapter-vercel/index.js index 257383302658..a1f141d3bc12 100644 --- a/packages/adapter-vercel/index.js +++ b/packages/adapter-vercel/index.js @@ -137,9 +137,19 @@ const plugin = function (defaults = {}) { const result = await esbuild.build({ entryPoints: [`${tmp}/edge.js`], outfile: `${dirs.functions}/${name}.func/index.js`, - target: 'es2020', // TODO verify what the edge runtime supports + // minimum Node.js version supported is v14.6.0 that is mapped to ES2019 + // https://edge-runtime.vercel.app/features/polyfills + // TODO verify the latest ES version the edge runtime supports + target: 'es2020', bundle: true, platform: 'browser', + conditions: [ + // Vercel's Edge runtime key https://runtime-keys.proposal.wintercg.org/#edge-light + 'edge-light', + // re-include these since they are included by default when no conditions are specified + // https://esbuild.github.io/api/#conditions + 'module' + ], format: 'esm', external: [ ...compatible_node_modules, From 648c0956291147aac3d081f52cb03a8ac599ecfa Mon Sep 17 00:00:00 2001 From: Jamin Roberts <58916292+jaminwebdev@users.noreply.github.com> Date: Sat, 19 Apr 2025 08:37:51 -0500 Subject: [PATCH 1051/1135] docs: Update reroute async example (#13727) --- documentation/docs/30-advanced/20-hooks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index c1adfdba1ffd..aa6650d2fbec 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -307,7 +307,7 @@ Since version 2.18, the `reroute` hook can be asynchronous, allowing it to (for // @errors: 2304 /** @type {import('@sveltejs/kit').Reroute} */ -export function reroute({ url, fetch }) { +export async function reroute({ url, fetch }) { // Ask a special endpoint within your app about the destination if (url.pathname === '/api/reroute') return; From b183244819559ec20b6726379b00552d4fbf97e8 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 21 Apr 2025 11:24:50 +0800 Subject: [PATCH 1052/1135] docs: change "Cloudflare Pages" title to just "Cloudflare" (#13725) --- documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index 48a9ecb3e8d0..b078b25ee4fa 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -1,5 +1,5 @@ --- -title: Cloudflare Pages +title: Cloudflare --- To deploy to [Cloudflare Workers](https://workers.cloudflare.com/) or [Cloudflare Pages](https://pages.cloudflare.com/), use [`adapter-cloudflare`](https://github.com/sveltejs/kit/tree/main/packages/adapter-cloudflare). From 1244721d441ee5046f1f6e8a8841e574fdf59601 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 13:32:19 -0700 Subject: [PATCH 1053/1135] Version Packages (#13713) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/hip-moons-camp.md | 6 ------ .changeset/khaki-queens-provide.md | 5 ----- .changeset/purple-feet-lay.md | 5 ----- .changeset/silly-ears-visit.md | 5 ----- packages/adapter-cloudflare/CHANGELOG.md | 9 +++++++++ packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/CHANGELOG.md | 9 +++++++++ packages/adapter-netlify/package.json | 2 +- packages/adapter-vercel/CHANGELOG.md | 12 ++++++++++++ packages/adapter-vercel/package.json | 2 +- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 13 files changed, 41 insertions(+), 26 deletions(-) delete mode 100644 .changeset/hip-moons-camp.md delete mode 100644 .changeset/khaki-queens-provide.md delete mode 100644 .changeset/purple-feet-lay.md delete mode 100644 .changeset/silly-ears-visit.md diff --git a/.changeset/hip-moons-camp.md b/.changeset/hip-moons-camp.md deleted file mode 100644 index e72d48dd177e..000000000000 --- a/.changeset/hip-moons-camp.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@sveltejs/adapter-netlify': patch -'@sveltejs/adapter-vercel': patch ---- - -chore(deps): upgrade esbuild to 0.25.2 diff --git a/.changeset/khaki-queens-provide.md b/.changeset/khaki-queens-provide.md deleted file mode 100644 index 74571d33e5de..000000000000 --- a/.changeset/khaki-queens-provide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: ensure that `ssr` and `csr` page options apply to error pages rendered as a result of a load function error on the server diff --git a/.changeset/purple-feet-lay.md b/.changeset/purple-feet-lay.md deleted file mode 100644 index 217c504a9caa..000000000000 --- a/.changeset/purple-feet-lay.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -chore(deps): upgrade @cloudflare/workers-types to 4.20250415.0 diff --git a/.changeset/silly-ears-visit.md b/.changeset/silly-ears-visit.md deleted file mode 100644 index 75bca012fc7f..000000000000 --- a/.changeset/silly-ears-visit.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-vercel': patch ---- - -fix: include the `edge-light` bundling condition when building edge functions diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index 18d2461a8d66..d3eb4e954595 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-cloudflare +## 7.0.2 +### Patch Changes + + +- chore(deps): upgrade @cloudflare/workers-types to 4.20250415.0 ([#13716](https://github.com/sveltejs/kit/pull/13716)) + +- Updated dependencies [[`c51fb554416e0c4a21655c1d79e834f69743d1d5`](https://github.com/sveltejs/kit/commit/c51fb554416e0c4a21655c1d79e834f69743d1d5)]: + - @sveltejs/kit@2.20.8 + ## 7.0.1 ### Patch Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index 5d882e6ea9ac..fa24270f8faa 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "7.0.1", + "version": "7.0.2", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/adapter-netlify/CHANGELOG.md b/packages/adapter-netlify/CHANGELOG.md index 5fa5a64b3fd1..6b0b375d524a 100644 --- a/packages/adapter-netlify/CHANGELOG.md +++ b/packages/adapter-netlify/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-netlify +## 5.0.1 +### Patch Changes + + +- chore(deps): upgrade esbuild to 0.25.2 ([#13716](https://github.com/sveltejs/kit/pull/13716)) + +- Updated dependencies [[`c51fb554416e0c4a21655c1d79e834f69743d1d5`](https://github.com/sveltejs/kit/commit/c51fb554416e0c4a21655c1d79e834f69743d1d5)]: + - @sveltejs/kit@2.20.8 + ## 5.0.0 ### Major Changes diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 8166d923fd87..9d61a1a26060 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-netlify", - "version": "5.0.0", + "version": "5.0.1", "description": "A SvelteKit adapter that creates a Netlify app", "keywords": [ "adapter", diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index f2da2cf98f55..afd5caa8c8a1 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,17 @@ # @sveltejs/adapter-vercel +## 5.7.1 +### Patch Changes + + +- chore(deps): upgrade esbuild to 0.25.2 ([#13716](https://github.com/sveltejs/kit/pull/13716)) + + +- fix: include the `edge-light` bundling condition when building edge functions ([#13720](https://github.com/sveltejs/kit/pull/13720)) + +- Updated dependencies [[`c51fb554416e0c4a21655c1d79e834f69743d1d5`](https://github.com/sveltejs/kit/commit/c51fb554416e0c4a21655c1d79e834f69743d1d5)]: + - @sveltejs/kit@2.20.8 + ## 5.7.0 ### Minor Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 5110b3db4e66..ad1443520a47 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.7.0", + "version": "5.7.1", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index b4b3dfdeea85..6d348fa64b52 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.20.8 +### Patch Changes + + +- fix: ensure that `ssr` and `csr` page options apply to error pages rendered as a result of a load function error on the server ([#13695](https://github.com/sveltejs/kit/pull/13695)) + ## 2.20.7 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index dae9833a5f72..2273ec079873 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.7", + "version": "2.20.8", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 322d93c9c47f..576661e8272f 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.7'; +export const VERSION = '2.20.8'; From 81bf5c1c775a763e7dc75403df82714454eaf54d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Wed, 30 Apr 2025 16:08:58 -0700 Subject: [PATCH 1054/1135] chore(deps): update dependency vite to v6.2.7 [security] (#13759) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 67 +++++++++++++++++++++++++++++--------------------- 1 file changed, 39 insertions(+), 28 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index a6c6f8084015..673e6a8674aa 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1480,6 +1480,12 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/eslint-utils@4.6.1': + resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@eslint-community/regexpp@4.12.1': resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} @@ -1930,8 +1936,8 @@ packages: resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/scope-manager@8.30.1': - resolution: {integrity: sha512-+C0B6ChFXZkuaNDl73FJxRYT0G7ufVPOSQkqkpM/U198wUwUFOtgo1k/QzFh1KjpBitaK7R1tgjVz6o9HmsRPg==} + '@typescript-eslint/scope-manager@8.31.1': + resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/type-utils@8.26.0': @@ -1945,8 +1951,8 @@ packages: resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/types@8.30.1': - resolution: {integrity: sha512-81KawPfkuulyWo5QdyG/LOKbspyyiW+p4vpn4bYO7DM/hZImlVnFwrpCTnmNMOt8CvLRr5ojI9nU1Ekpw4RcEw==} + '@typescript-eslint/types@8.31.1': + resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@typescript-eslint/typescript-estree@8.26.0': @@ -1955,8 +1961,8 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/typescript-estree@8.30.1': - resolution: {integrity: sha512-kQQnxymiUy9tTb1F2uep9W6aBiYODgq5EMSk6Nxh4Z+BDUoYUSa029ISs5zTzKBFnexQEh71KqwjKnRz58lusQ==} + '@typescript-eslint/typescript-estree@8.31.1': + resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: typescript: '>=4.8.4 <5.9.0' @@ -1968,8 +1974,8 @@ packages: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.30.1': - resolution: {integrity: sha512-T/8q4R9En2tcEsWPQgB5BQ0XJVOtfARcUvOa8yJP3fh9M/mXraLxZrkCfGb6ChrO/V3W+Xbd04RacUEqk1CFEQ==} + '@typescript-eslint/utils@8.31.1': + resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -1979,8 +1985,8 @@ packages: resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.30.1': - resolution: {integrity: sha512-aEhgas7aJ6vZnNFC7K4/vMGDGyOiqWcYZPpIWrTKuTAlsvDNKy2GFDqh9smL+iq069ZvR0YzEeq0B8NJlLzjFA==} + '@typescript-eslint/visitor-keys@8.31.1': + resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@vercel/nft@0.29.2': @@ -3831,6 +3837,11 @@ snapshots: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 + '@eslint-community/eslint-utils@4.6.1(eslint@9.6.0)': + dependencies: + eslint: 9.6.0 + eslint-visitor-keys: 3.4.3 + '@eslint-community/regexpp@4.12.1': {} '@eslint/config-array@0.17.0': @@ -4257,10 +4268,10 @@ snapshots: '@typescript-eslint/types': 8.26.0 '@typescript-eslint/visitor-keys': 8.26.0 - '@typescript-eslint/scope-manager@8.30.1': + '@typescript-eslint/scope-manager@8.31.1': dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/visitor-keys': 8.31.1 '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: @@ -4275,7 +4286,7 @@ snapshots: '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/types@8.30.1': {} + '@typescript-eslint/types@8.31.1': {} '@typescript-eslint/typescript-estree@8.26.0(typescript@5.6.3)': dependencies: @@ -4291,10 +4302,10 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.30.1(typescript@5.6.3)': + '@typescript-eslint/typescript-estree@8.31.1(typescript@5.6.3)': dependencies: - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/visitor-keys': 8.30.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/visitor-keys': 8.31.1 debug: 4.4.0 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -4316,12 +4327,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.30.1(eslint@9.6.0)(typescript@5.6.3)': + '@typescript-eslint/utils@8.31.1(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.30.1 - '@typescript-eslint/types': 8.30.1 - '@typescript-eslint/typescript-estree': 8.30.1(typescript@5.6.3) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) + '@typescript-eslint/scope-manager': 8.31.1 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.6.3) eslint: 9.6.0 typescript: 5.6.3 transitivePeerDependencies: @@ -4332,9 +4343,9 @@ snapshots: '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.30.1': + '@typescript-eslint/visitor-keys@8.31.1': dependencies: - '@typescript-eslint/types': 8.30.1 + '@typescript-eslint/types': 8.31.1 eslint-visitor-keys: 4.2.0 '@vercel/nft@0.29.2(rollup@4.30.1)': @@ -4661,15 +4672,15 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) '@eslint-community/regexpp': 4.12.1 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: - '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) - '@typescript-eslint/utils': 8.30.1(eslint@9.6.0)(typescript@5.6.3) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) + '@typescript-eslint/utils': 8.31.1(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 eslint-plugin-es-x: 7.8.0(eslint@9.6.0) @@ -4685,7 +4696,7 @@ snapshots: eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1): dependencies: - '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) From 943beeda27cd78e919abfe36b336cc191c5fbb6c Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 1 May 2025 05:46:11 -0700 Subject: [PATCH 1055/1135] chore: convert preprocessor to vite plugin (#13617) --- .changeset/curvy-flies-carry.md | 5 + .../docs/40-best-practices/07-images.md | 4 +- packages/enhanced-img/package.json | 2 + packages/enhanced-img/src/index.js | 38 +- packages/enhanced-img/src/preprocessor.js | 362 ----------------- packages/enhanced-img/src/vite-plugin.js | 382 ++++++++++++++++++ .../enhanced-img/test/markup-plugin.spec.js | 71 ++++ .../enhanced-img/test/preprocessor.spec.js | 66 --- .../basic/src/routes/images/+page.svelte | 6 + pnpm-lock.yaml | 3 + 10 files changed, 471 insertions(+), 468 deletions(-) create mode 100644 .changeset/curvy-flies-carry.md delete mode 100644 packages/enhanced-img/src/preprocessor.js create mode 100644 packages/enhanced-img/src/vite-plugin.js create mode 100644 packages/enhanced-img/test/markup-plugin.spec.js delete mode 100644 packages/enhanced-img/test/preprocessor.spec.js diff --git a/.changeset/curvy-flies-carry.md b/.changeset/curvy-flies-carry.md new file mode 100644 index 000000000000..bd27d04b270d --- /dev/null +++ b/.changeset/curvy-flies-carry.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': minor +--- + +feat: add support for targeting `enhanced\:img` in CSS diff --git a/documentation/docs/40-best-practices/07-images.md b/documentation/docs/40-best-practices/07-images.md index 8bf255243565..f2ef787daac6 100644 --- a/documentation/docs/40-best-practices/07-images.md +++ b/documentation/docs/40-best-practices/07-images.md @@ -27,8 +27,6 @@ Doing this manually is tedious. There are a variety of techniques you can use, d `@sveltejs/enhanced-img` is a plugin offered on top of Vite's built-in asset handling. It provides plug and play image processing that serves smaller file formats like `avif` or `webp`, automatically sets the intrinsic `width` and `height` of the image to avoid layout shift, creates images of multiple sizes for various devices, and strips EXIF data for privacy. It will work in any Vite-based project including, but not limited to, SvelteKit projects. > [!NOTE] As a build plugin, `@sveltejs/enhanced-img` can only optimize files located on your machine during the build process. If you have an image located elsewhere (such as a path served from your database, CMS, or backend), please read about [loading images dynamically from a CDN](#Loading-images-dynamically-from-a-CDN). -> -> **WARNING**: The `@sveltejs/enhanced-img` package is experimental. It uses pre-1.0 versioning and may introduce breaking changes with every minor version release. ### Setup @@ -67,7 +65,7 @@ At build time, your `` tag will be replaced with an `` wrappe You should provide your image at 2x resolution for HiDPI displays (a.k.a. retina displays). `` will automatically take care of serving smaller versions to smaller devices. -If you wish to add styles to your ``, you should add a `class` and target that. +> [!NOTE] if you wish to use a [tag name CSS selector](https://developer.mozilla.org/en-US/docs/Learn_web_development/Core/Styling_basics/Basic_selectors#type_selectors) in your ` diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 673e6a8674aa..e8c222549d4d 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -338,6 +338,9 @@ importers: specifier: ^1.1.2 version: 1.1.2 devDependencies: + '@sveltejs/vite-plugin-svelte': + specifier: ^5.0.1 + version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/estree': specifier: ^1.0.5 version: 1.0.7 From f32a276ff0ffdd96abd9034946e42fb85512ab8d Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 06:01:24 -0700 Subject: [PATCH 1056/1135] chore(deps): update dependency vite to v6.2.7 [security] (#13760) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 43 ++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e8c222549d4d..020ce0b5cf90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -340,7 +340,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.0.11(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/estree': specifier: ^1.0.5 version: 1.0.7 @@ -1883,6 +1883,13 @@ packages: svelte: ^5.0.0 vite: ^6.0.0 + '@sveltejs/vite-plugin-svelte@5.0.3': + resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} + engines: {node: ^18.0.0 || ^20.0.0 || >=22} + peerDependencies: + svelte: ^5.0.0 + vite: ^6.0.0 + '@svitejs/changesets-changelog-github-compact@1.1.0': resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} @@ -3458,6 +3465,14 @@ packages: vite: optional: true + vitefu@1.0.6: + resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} + peerDependencies: + vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 + peerDependenciesMeta: + vite: + optional: true + vitest@3.1.1: resolution: {integrity: sha512-kiZc/IYmKICeBAZr9DQ5rT7/6bD9G7uqQEki4fxazi1jdVl2mWGzedtBs5s6llz59yQhVb7FFY2MbHzHCnT79Q==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} @@ -4186,6 +4201,15 @@ snapshots: transitivePeerDependencies: - supports-color + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.4.0 + svelte: 5.23.1 + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + transitivePeerDependencies: + - supports-color + '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) @@ -4199,6 +4223,19 @@ snapshots: transitivePeerDependencies: - supports-color + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + debug: 4.4.0 + deepmerge: 4.3.1 + kleur: 4.1.5 + magic-string: 0.30.17 + svelte: 5.23.1 + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.6(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + transitivePeerDependencies: + - supports-color + '@svitejs/changesets-changelog-github-compact@1.1.0': dependencies: '@changesets/get-github-info': 0.5.2 @@ -5736,6 +5773,10 @@ snapshots: optionalDependencies: vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu@1.0.6(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)): + optionalDependencies: + vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vitest@3.1.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: '@vitest/expect': 3.1.1 From b1b7b537762cf251c526a0043d2d7d8d34a6823d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Thu, 1 May 2025 10:59:01 -0700 Subject: [PATCH 1057/1135] Version Packages (#13761) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/curvy-flies-carry.md | 5 ----- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- 3 files changed, 7 insertions(+), 6 deletions(-) delete mode 100644 .changeset/curvy-flies-carry.md diff --git a/.changeset/curvy-flies-carry.md b/.changeset/curvy-flies-carry.md deleted file mode 100644 index bd27d04b270d..000000000000 --- a/.changeset/curvy-flies-carry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': minor ---- - -feat: add support for targeting `enhanced\:img` in CSS diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index 103fb8489359..508e85bdda39 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.5.0 +### Minor Changes + + +- feat: add support for targeting `enhanced\:img` in CSS ([#13617](https://github.com/sveltejs/kit/pull/13617)) + ## 0.4.4 ### Patch Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 4d66d8777973..e3301f3e3280 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.4.4", + "version": "0.5.0", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", From acd64007bf4675d8c597e78d2b7d6803dac47355 Mon Sep 17 00:00:00 2001 From: Andri Soone <5224431+ndri@users.noreply.github.com> Date: Sun, 4 May 2025 13:47:10 +0200 Subject: [PATCH 1058/1135] docs: fix npx sv create command (#13765) --- packages/package/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/package/README.md b/packages/package/README.md index edcbdb96a560..df0a8935c7e3 100644 --- a/packages/package/README.md +++ b/packages/package/README.md @@ -5,7 +5,7 @@ The quickest way to get started is via the [sv](https://npmjs.com/package/sv) package: ```bash -npm sv create my-app +npx sv create my-app cd my-app npm install npm run dev From 488434fd78ec565f6b635aa24956847cd045491b Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Sun, 4 May 2025 08:55:41 -0700 Subject: [PATCH 1059/1135] chore(deps): update dependency vite to v6.2.7 [security] (#13763) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- pnpm-lock.yaml | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 020ce0b5cf90..f193c5eed584 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1483,8 +1483,8 @@ packages: peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 - '@eslint-community/eslint-utils@4.6.1': - resolution: {integrity: sha512-KTsJMmobmbrFLe3LDh0PC2FXpcSYJt/MLjlkh/9LEnmKYLSYmT/0EW9JWANjeoemiuZrmogti0tW5Ch+qNUYDw==} + '@eslint-community/eslint-utils@4.7.0': + resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} peerDependencies: eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 @@ -3855,7 +3855,7 @@ snapshots: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 - '@eslint-community/eslint-utils@4.6.1(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.6.0)': dependencies: eslint: 9.6.0 eslint-visitor-keys: 3.4.3 @@ -4369,7 +4369,7 @@ snapshots: '@typescript-eslint/utils@8.31.1(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) '@typescript-eslint/scope-manager': 8.31.1 '@typescript-eslint/types': 8.31.1 '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.6.3) @@ -4712,14 +4712,14 @@ snapshots: eslint-plugin-es-x@7.8.0(eslint@9.6.0): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) '@eslint-community/regexpp': 4.12.1 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.6.3): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) '@typescript-eslint/utils': 8.31.1(eslint@9.6.0)(typescript@5.6.3) enhanced-resolve: 5.18.1 eslint: 9.6.0 @@ -4736,7 +4736,7 @@ snapshots: eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1): dependencies: - '@eslint-community/eslint-utils': 4.6.1(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) '@jridgewell/sourcemap-codec': 1.5.0 eslint: 9.6.0 eslint-compat-utils: 0.5.1(eslint@9.6.0) From 9995cf503eab05c738f04f388376998bc21fa34a Mon Sep 17 00:00:00 2001 From: Malcolm Crum Date: Mon, 5 May 2025 01:59:00 +1000 Subject: [PATCH 1060/1135] docs: clarify positioning of enhancedImages plugin relative to sveltekit plugin (#13766) Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- documentation/docs/40-best-practices/07-images.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/40-best-practices/07-images.md b/documentation/docs/40-best-practices/07-images.md index f2ef787daac6..c0cc54f2724a 100644 --- a/documentation/docs/40-best-practices/07-images.md +++ b/documentation/docs/40-best-practices/07-images.md @@ -45,7 +45,7 @@ import { defineConfig } from 'vite'; export default defineConfig({ plugins: [ - +++enhancedImages(),+++ + +++enhancedImages(), // must come before the SvelteKit plugin+++ sveltekit() ] }); From 7bb41aa4263b057a8912f4cdd35db03755d37342 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 5 May 2025 10:39:06 +0200 Subject: [PATCH 1061/1135] minor doc tweaks etc (#13767) --- documentation/docs/20-core-concepts/10-routing.md | 2 +- .../docs/25-build-and-deploy/40-adapter-node.md | 4 ++-- .../25-build-and-deploy/99-writing-adapters.md | 2 +- documentation/docs/30-advanced/20-hooks.md | 4 ++-- packages/adapter-auto/index.js | 15 +++++++++++++-- .../test/apps/pages/package.json | 2 +- packages/kit/src/exports/public.d.ts | 14 +++++++------- packages/kit/src/exports/vite/preview/index.js | 2 +- packages/kit/src/runtime/server/endpoint.js | 2 +- packages/kit/types/index.d.ts | 14 +++++++------- 10 files changed, 36 insertions(+), 25 deletions(-) diff --git a/documentation/docs/20-core-concepts/10-routing.md b/documentation/docs/20-core-concepts/10-routing.md index 9c9f117419ee..9dc82135f606 100644 --- a/documentation/docs/20-core-concepts/10-routing.md +++ b/documentation/docs/20-core-concepts/10-routing.md @@ -277,7 +277,7 @@ Like `+layout.js`, `+layout.server.js` can export [page options](page-options) ## +server -As well as pages, you can define routes with a `+server.js` file (sometimes referred to as an 'API route' or an 'endpoint'), which gives you full control over the response. Your `+server.js` file exports functions corresponding to HTTP verbs like `GET`, `POST`, `PATCH`, `PUT`, `DELETE`, `OPTIONS`, and `HEAD` that take a `RequestEvent` argument and return a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) object. +As well as pages, you can define routes with a `+server.js` file (sometimes referred to as an 'API route' or an 'endpoint'), which gives you full control over the response. Your `+server.js` file exports functions corresponding to HTTP verbs like `GET`, `POST`, `PATCH`, `PUT`, `DELETE`, `OPTIONS`, and `HEAD` that take a [`RequestEvent`](@sveltejs-kit#RequestEvent) argument and return a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) object. For example we could create an `/api/random-number` route with a `GET` handler: diff --git a/documentation/docs/25-build-and-deploy/40-adapter-node.md b/documentation/docs/25-build-and-deploy/40-adapter-node.md index 0a7c553c4acc..ce0a5bccf95f 100644 --- a/documentation/docs/25-build-and-deploy/40-adapter-node.md +++ b/documentation/docs/25-build-and-deploy/40-adapter-node.md @@ -34,7 +34,7 @@ Development dependencies will be bundled into your app using [Rollup](https://ro ### Compressing responses -You will typically want to compress responses coming from the server. If you are already deploying your server behind a reverse proxy for SSL or load balancing, it typically results in better performance to also handle compression at that layer since Node.js is single-threaded. +You will typically want to compress responses coming from the server. If you're already deploying your server behind a reverse proxy for SSL or load balancing, it typically results in better performance to also handle compression at that layer since Node.js is single-threaded. However, if you're building a [custom server](#Custom-server) and do want to add a compression middleware there, note that we would recommend using [`@polka/compression`](https://www.npmjs.com/package/@polka/compression) since SvelteKit streams responses and the more popular `compression` package does not support streaming and may cause errors when used. @@ -101,7 +101,7 @@ If `adapter-node` can't correctly determine the URL of your deployment, you may ### `ADDRESS_HEADER` and `XFF_DEPTH` -The [RequestEvent](@sveltejs-kit#RequestEvent) object passed to hooks and endpoints includes an `event.getClientAddress()` function that returns the client's IP address. By default this is the connecting `remoteAddress`. If your server is behind one or more proxies (such as a load balancer), this value will contain the innermost proxy's IP address rather than the client's, so we need to specify an `ADDRESS_HEADER` to read the address from: +The [`RequestEvent`](@sveltejs-kit#RequestEvent) object passed to hooks and endpoints includes an `event.getClientAddress()` function that returns the client's IP address. By default this is the connecting `remoteAddress`. If your server is behind one or more proxies (such as a load balancer), this value will contain the innermost proxy's IP address rather than the client's, so we need to specify an `ADDRESS_HEADER` to read the address from: ``` ADDRESS_HEADER=True-Client-IP node build diff --git a/documentation/docs/25-build-and-deploy/99-writing-adapters.md b/documentation/docs/25-build-and-deploy/99-writing-adapters.md index c4092af15fb2..a2bfb50cd7b2 100644 --- a/documentation/docs/25-build-and-deploy/99-writing-adapters.md +++ b/documentation/docs/25-build-and-deploy/99-writing-adapters.md @@ -51,7 +51,7 @@ Within the `adapt` method, there are a number of things that an adapter should d - Output code that: - Imports `Server` from `${builder.getServerDirectory()}/index.js` - Instantiates the app with a manifest generated with `builder.generateManifest({ relativePath })` - - Listens for requests from the platform, converts them to a standard [Request](https://developer.mozilla.org/en-US/docs/Web/API/Request) if necessary, calls the `server.respond(request, { getClientAddress })` function to generate a [Response](https://developer.mozilla.org/en-US/docs/Web/API/Response) and responds with it + - Listens for requests from the platform, converts them to a standard [`Request`](https://developer.mozilla.org/en-US/docs/Web/API/Request) if necessary, calls the `server.respond(request, { getClientAddress })` function to generate a [`Response`](https://developer.mozilla.org/en-US/docs/Web/API/Response) and responds with it - expose any platform-specific information to SvelteKit via the `platform` option passed to `server.respond` - Globally shims `fetch` to work on the target platform, if necessary. SvelteKit provides a `@sveltejs/kit/node/polyfills` helper for platforms that can use `undici` - Bundle the output to avoid needing to install dependencies on the target platform, if necessary diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index aa6650d2fbec..f924b83ad075 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -106,7 +106,7 @@ Note that `resolve(...)` will never throw an error, it will always return a `Pro ### handleFetch -This function allows you to modify (or replace) a `fetch` request that happens inside a `load` or `action` function that runs on the server (or during pre-rendering). +This function allows you to modify (or replace) a `fetch` request that happens inside a `load`, `action` or `handle` function that runs on the server (or during prerendering). For example, your `load` function might make a request to a public URL like `https://api.yourapp.com` when the user performs a client-side navigation to the respective page, but during SSR it might make sense to hit the API directly (bypassing whatever proxies and load balancers sit between it and the public internet). @@ -153,7 +153,7 @@ The following can be added to `src/hooks.server.js` _and_ `src/hooks.client.js`: ### handleError -If an [unexpected error](errors#Unexpected-errors) is thrown during loading or rendering, this function will be called with the `error`, `event`, `status` code and `message`. This allows for two things: +If an [unexpected error](errors#Unexpected-errors) is thrown during loading, rendering, or from an endpoint, this function will be called with the `error`, `event`, `status` code and `message`. This allows for two things: - you can log the error - you can generate a custom representation of the error that is safe to show to users, omitting sensitive details like messages and stack traces. The returned value, which defaults to `{ message }`, becomes the value of `$page.error`. diff --git a/packages/adapter-auto/index.js b/packages/adapter-auto/index.js index c83ba6246c59..ccd20f600e56 100644 --- a/packages/adapter-auto/index.js +++ b/packages/adapter-auto/index.js @@ -122,9 +122,20 @@ export default () => ({ }, supports: { read: () => { - throw new Error( - "The read function imported from $app/server only works in certain environments. Since you're using @sveltejs/adapter-auto, SvelteKit cannot determine whether it will work when your app is deployed. Please replace it with an adapter tailored to your target environment." + supports_error( + 'The read function imported from $app/server only works in certain environments' ); } } }); + +/** + * @param {string} message + * @returns {never} + * @throws {Error} + */ +function supports_error(message) { + throw new Error( + `${message}. Since you're using @sveltejs/adapter-auto, SvelteKit cannot determine whether it will work when your app is deployed. Please replace it with an adapter tailored to your target environment.` + ); +} diff --git a/packages/adapter-cloudflare/test/apps/pages/package.json b/packages/adapter-cloudflare/test/apps/pages/package.json index 5de5f0f98be1..4ad30198ed3f 100644 --- a/packages/adapter-cloudflare/test/apps/pages/package.json +++ b/packages/adapter-cloudflare/test/apps/pages/package.json @@ -5,7 +5,7 @@ "scripts": { "dev": "vite dev", "build": "vite build", - "preview": "wrangler pages dev .svelte-kit/cloudflare --port 8787", + "preview": "wrangler pages dev .svelte-kit/cloudflare --port 8787", "prepare": "svelte-kit sync || echo ''", "test": "playwright test" }, diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 732df205d0ae..684f18981610 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -36,18 +36,18 @@ export interface Adapter { */ adapt: (builder: Builder) => MaybePromise; /** - * Checks called during dev and build to determine whether specific features will work in production with this adapter + * Checks called during dev and build to determine whether specific features will work in production with this adapter. */ supports?: { /** - * Test support for `read` from `$app/server` - * @param config The merged route config + * Test support for `read` from `$app/server`. + * @param details.config The merged route config */ read?: (details: { config: any; route: { id: string } }) => boolean; }; /** * Creates an `Emulator`, which allows the adapter to influence the environment - * during dev, build and prerendering + * during dev, build and prerendering. */ emulate?: () => MaybePromise; } @@ -790,7 +790,7 @@ export type HandleClientError = (input: { }) => MaybePromise; /** - * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during prerendering). */ export type HandleFetch = (input: { event: RequestEvent; @@ -1409,7 +1409,7 @@ export interface ServerLoadEvent< } /** - * Shape of a form action method that is part of `export const actions = {..}` in `+page.server.js`. + * Shape of a form action method that is part of `export const actions = {...}` in `+page.server.js`. * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Action< @@ -1419,7 +1419,7 @@ export type Action< > = (event: RequestEvent) => MaybePromise; /** - * Shape of the `export const actions = {..}` object in `+page.server.js`. + * Shape of the `export const actions = {...}` object in `+page.server.js`. * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Actions< diff --git a/packages/kit/src/exports/vite/preview/index.js b/packages/kit/src/exports/vite/preview/index.js index 0342e718c75c..efff12bbd3b7 100644 --- a/packages/kit/src/exports/vite/preview/index.js +++ b/packages/kit/src/exports/vite/preview/index.js @@ -14,7 +14,7 @@ import { not_found } from '../utils.js'; /** @typedef {(req: Req, res: Res, next: () => void) => void} Handler */ /** - * @param {{ middlewares: import('connect').Server }} vite + * @param {import('vite').PreviewServer} vite * @param {import('vite').ResolvedConfig} vite_config * @param {import('types').ValidatedConfig} svelte_config */ diff --git a/packages/kit/src/runtime/server/endpoint.js b/packages/kit/src/runtime/server/endpoint.js index 96f3913c01ed..d480d344036b 100644 --- a/packages/kit/src/runtime/server/endpoint.js +++ b/packages/kit/src/runtime/server/endpoint.js @@ -15,7 +15,7 @@ export async function render_endpoint(event, mod, state) { let handler = mod[method] || mod.fallback; - if (method === 'HEAD' && mod.GET && !mod.HEAD) { + if (method === 'HEAD' && !mod.HEAD && mod.GET) { handler = mod.GET; } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 23bb6d7287a4..4dfb901cda11 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -18,18 +18,18 @@ declare module '@sveltejs/kit' { */ adapt: (builder: Builder) => MaybePromise; /** - * Checks called during dev and build to determine whether specific features will work in production with this adapter + * Checks called during dev and build to determine whether specific features will work in production with this adapter. */ supports?: { /** - * Test support for `read` from `$app/server` - * @param config The merged route config + * Test support for `read` from `$app/server`. + * @param details.config The merged route config */ read?: (details: { config: any; route: { id: string } }) => boolean; }; /** * Creates an `Emulator`, which allows the adapter to influence the environment - * during dev, build and prerendering + * during dev, build and prerendering. */ emulate?: () => MaybePromise; } @@ -772,7 +772,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise; /** - * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during pre-rendering) + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during prerendering). */ export type HandleFetch = (input: { event: RequestEvent; @@ -1391,7 +1391,7 @@ declare module '@sveltejs/kit' { } /** - * Shape of a form action method that is part of `export const actions = {..}` in `+page.server.js`. + * Shape of a form action method that is part of `export const actions = {...}` in `+page.server.js`. * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Action< @@ -1401,7 +1401,7 @@ declare module '@sveltejs/kit' { > = (event: RequestEvent) => MaybePromise; /** - * Shape of the `export const actions = {..}` object in `+page.server.js`. + * Shape of the `export const actions = {...}` object in `+page.server.js`. * See [form actions](https://svelte.dev/docs/kit/form-actions) for more information. */ export type Actions< From 149779ad085a511d48b063864247c3cf119697e2 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 5 May 2025 10:11:03 -0700 Subject: [PATCH 1062/1135] chore(deps-dev): bump vite from 6.2.6 to 6.2.7 (#13770) * chore(deps-dev): bump vite from 6.2.6 to 6.2.7 Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 6.2.6 to 6.2.7. - [Release notes](https://github.com/vitejs/vite/releases) - [Changelog](https://github.com/vitejs/vite/blob/v6.2.7/packages/vite/CHANGELOG.md) - [Commits](https://github.com/vitejs/vite/commits/v6.2.7/packages/vite) --- updated-dependencies: - dependency-name: vite dependency-version: 6.2.7 dependency-type: direct:development ... Signed-off-by: dependabot[bot] * dedupe * upgrade esbuild --------- Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/heavy-roses-grab.md | 6 + packages/adapter-cloudflare/package.json | 2 +- .../test/apps/pages/package.json | 2 +- .../test/apps/workers/package.json | 2 +- packages/adapter-netlify/package.json | 2 +- packages/adapter-static/package.json | 2 +- .../test/apps/prerendered/package.json | 2 +- .../adapter-static/test/apps/spa/package.json | 2 +- packages/adapter-vercel/package.json | 2 +- packages/enhanced-img/package.json | 2 +- packages/kit/package.json | 2 +- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- .../test/apps/hash-based-routing/package.json | 2 +- packages/kit/test/apps/no-ssr/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- .../prerendered-app-error-pages/package.json | 2 +- packages/kit/test/apps/writes/package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../package.json | 2 +- .../apps/private-dynamic-env/package.json | 2 +- .../package.json | 2 +- .../apps/private-static-env/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-folder/package.json | 2 +- .../package.json | 2 +- .../apps/server-only-module/package.json | 2 +- .../package.json | 2 +- .../service-worker-private-env/package.json | 2 +- .../apps/syntax-error/package.json | 2 +- .../kit/test/prerendering/basics/package.json | 2 +- .../test/prerendering/options/package.json | 2 +- .../test/prerendering/paths-base/package.json | 2 +- playgrounds/basic/package.json | 2 +- pnpm-lock.yaml | 816 +++++++++++------- 40 files changed, 557 insertions(+), 341 deletions(-) create mode 100644 .changeset/heavy-roses-grab.md diff --git a/.changeset/heavy-roses-grab.md b/.changeset/heavy-roses-grab.md new file mode 100644 index 000000000000..d895d3acb509 --- /dev/null +++ b/.changeset/heavy-roses-grab.md @@ -0,0 +1,6 @@ +--- +'@sveltejs/adapter-netlify': patch +'@sveltejs/adapter-vercel': patch +--- + +chore(deps): upgrade to esbuild 0.25.3 diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index fa24270f8faa..ddbd8f9817b2 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -48,7 +48,7 @@ "@playwright/test": "catalog:", "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", - "esbuild": "^0.25.2", + "esbuild": "^0.25.3", "typescript": "^5.3.3" }, "peerDependencies": { diff --git a/packages/adapter-cloudflare/test/apps/pages/package.json b/packages/adapter-cloudflare/test/apps/pages/package.json index 4ad30198ed3f..051c727d2cd5 100644 --- a/packages/adapter-cloudflare/test/apps/pages/package.json +++ b/packages/adapter-cloudflare/test/apps/pages/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "server-side-dep": "file:server-side-dep", "svelte": "^5.23.1", - "vite": "^6.2.6", + "vite": "^6.2.7", "wrangler": "^4.11.0" }, "type": "module" diff --git a/packages/adapter-cloudflare/test/apps/workers/package.json b/packages/adapter-cloudflare/test/apps/workers/package.json index 532e3169e0d4..a776dab0f2c4 100644 --- a/packages/adapter-cloudflare/test/apps/workers/package.json +++ b/packages/adapter-cloudflare/test/apps/workers/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "server-side-dep": "file:server-side-dep", "svelte": "^5.23.1", - "vite": "^6.2.6", + "vite": "^6.2.7", "wrangler": "^4.11.0" }, "type": "module" diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 9d61a1a26060..34701bbbdfa8 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -42,7 +42,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "esbuild": "^0.25.2", + "esbuild": "^0.25.3", "set-cookie-parser": "^2.6.0" }, "devDependencies": { diff --git a/packages/adapter-static/package.json b/packages/adapter-static/package.json index ca93ec90434c..882a3686f2a6 100644 --- a/packages/adapter-static/package.json +++ b/packages/adapter-static/package.json @@ -46,7 +46,7 @@ "sirv": "^3.0.0", "svelte": "^5.23.1", "typescript": "^5.3.3", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "peerDependencies": { "@sveltejs/kit": "^2.0.0" diff --git a/packages/adapter-static/test/apps/prerendered/package.json b/packages/adapter-static/test/apps/prerendered/package.json index 81c72ec1613f..969c40dd6aaa 100644 --- a/packages/adapter-static/test/apps/prerendered/package.json +++ b/packages/adapter-static/test/apps/prerendered/package.json @@ -13,7 +13,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", "svelte": "^5.23.1", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/adapter-static/test/apps/spa/package.json b/packages/adapter-static/test/apps/spa/package.json index ba15affd4ff8..538ba001d869 100644 --- a/packages/adapter-static/test/apps/spa/package.json +++ b/packages/adapter-static/test/apps/spa/package.json @@ -14,7 +14,7 @@ "@sveltejs/vite-plugin-svelte": "^5.0.1", "sirv-cli": "^3.0.0", "svelte": "^5.23.1", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index ad1443520a47..235311573e64 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -41,7 +41,7 @@ }, "dependencies": { "@vercel/nft": "^0.29.2", - "esbuild": "^0.25.2" + "esbuild": "^0.25.3" }, "devDependencies": { "@sveltejs/kit": "workspace:^", diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index e3301f3e3280..65eb84410e2b 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -49,7 +49,7 @@ "rollup": "^4.27.4", "svelte": "^5.23.1", "typescript": "^5.6.3", - "vite": "^6.2.6", + "vite": "^6.2.7", "vitest": "^3.1.1" }, "peerDependencies": { diff --git a/packages/kit/package.json b/packages/kit/package.json index 2273ec079873..f59a31aa54dd 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -41,7 +41,7 @@ "svelte": "^5.23.1", "svelte-preprocess": "^6.0.0", "typescript": "^5.3.3", - "vite": "^6.2.6", + "vite": "^6.2.7", "vitest": "^3.1.1" }, "peerDependencies": { diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index 981c960ea5a1..b488afff8089 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -21,7 +21,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index d20b35bf7d9b..2f421f3f836f 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -23,7 +23,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index da1b81c8a160..90617f241025 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -27,7 +27,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index 63792c626533..b3c18ff0b748 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/hash-based-routing/package.json b/packages/kit/test/apps/hash-based-routing/package.json index eb496edfbf32..f00e4d94dae6 100644 --- a/packages/kit/test/apps/hash-based-routing/package.json +++ b/packages/kit/test/apps/hash-based-routing/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index 4ade924d597b..6077f9218832 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index 8d79716c0be3..63993ea7d667 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -20,7 +20,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index de826d899822..633e159a63d9 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -22,7 +22,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/apps/prerendered-app-error-pages/package.json b/packages/kit/test/apps/prerendered-app-error-pages/package.json index 4e046db3c958..9132763a7710 100644 --- a/packages/kit/test/apps/prerendered-app-error-pages/package.json +++ b/packages/kit/test/apps/prerendered-app-error-pages/package.json @@ -21,6 +21,6 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" } } diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index 180546669229..19bed4a9f687 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -19,7 +19,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json index 0fe96139113a..c53c49d14801 100644 --- a/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json +++ b/packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json index 0fe96139113a..c53c49d14801 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json index cbc39306fd82..c463f79bcf11 100644 --- a/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json +++ b/packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json index cc83100eeb3a..b792342fccba 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json index edd8c6d43198..78fb4bc3eedb 100644 --- a/packages/kit/test/build-errors/apps/private-dynamic-env/package.json +++ b/packages/kit/test/build-errors/apps/private-dynamic-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json index f168b7a20cd4..7cf80ec768ea 100644 --- a/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index d88b7be855d6..edd5ec12d366 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -17,7 +17,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json index 419c62ed9d41..d94d6c7e2c46 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-folder/package.json b/packages/kit/test/build-errors/apps/server-only-folder/package.json index 09b7494020c2..8eeaf2c6b0a5 100644 --- a/packages/kit/test/build-errors/apps/server-only-folder/package.json +++ b/packages/kit/test/build-errors/apps/server-only-folder/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json index 723d0b722322..0c4927e379ee 100644 --- a/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/server-only-module/package.json b/packages/kit/test/build-errors/apps/server-only-module/package.json index 51fd5cc1cc18..353195694980 100644 --- a/packages/kit/test/build-errors/apps/server-only-module/package.json +++ b/packages/kit/test/build-errors/apps/server-only-module/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json index 2d136357896d..0692166560cc 100644 --- a/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json index 7ec2371e7d41..bcc5f2b656ed 100644 --- a/packages/kit/test/build-errors/apps/service-worker-private-env/package.json +++ b/packages/kit/test/build-errors/apps/service-worker-private-env/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/build-errors/apps/syntax-error/package.json b/packages/kit/test/build-errors/apps/syntax-error/package.json index 122ec235de51..97ea3f6717e4 100644 --- a/packages/kit/test/build-errors/apps/syntax-error/package.json +++ b/packages/kit/test/build-errors/apps/syntax-error/package.json @@ -14,7 +14,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module" } diff --git a/packages/kit/test/prerendering/basics/package.json b/packages/kit/test/prerendering/basics/package.json index 004159178408..932cde95ba5b 100644 --- a/packages/kit/test/prerendering/basics/package.json +++ b/packages/kit/test/prerendering/basics/package.json @@ -16,7 +16,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6", + "vite": "^6.2.7", "vitest": "^3.1.1" }, "type": "module" diff --git a/packages/kit/test/prerendering/options/package.json b/packages/kit/test/prerendering/options/package.json index d28ca80a037e..bc5bb0003cf9 100644 --- a/packages/kit/test/prerendering/options/package.json +++ b/packages/kit/test/prerendering/options/package.json @@ -15,7 +15,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6", + "vite": "^6.2.7", "vitest": "^3.1.1" }, "type": "module" diff --git a/packages/kit/test/prerendering/paths-base/package.json b/packages/kit/test/prerendering/paths-base/package.json index 42cd9666d073..231808d2d30c 100644 --- a/packages/kit/test/prerendering/paths-base/package.json +++ b/packages/kit/test/prerendering/paths-base/package.json @@ -15,7 +15,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", - "vite": "^6.2.6", + "vite": "^6.2.7", "vitest": "^3.1.1" }, "type": "module" diff --git a/playgrounds/basic/package.json b/playgrounds/basic/package.json index e3f08fedf3d1..f91d660f6fa6 100644 --- a/playgrounds/basic/package.json +++ b/playgrounds/basic/package.json @@ -32,7 +32,7 @@ "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.0", - "vite": "^6.2.6" + "vite": "^6.2.7" }, "type": "module", "exports": { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index f193c5eed584..133c7b67ebf3 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -50,7 +50,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -83,8 +83,8 @@ importers: specifier: ^18.19.48 version: 18.19.50 esbuild: - specifier: ^0.25.2 - version: 0.25.2 + specifier: ^0.25.3 + version: 0.25.3 typescript: specifier: ^5.3.3 version: 5.6.3 @@ -96,7 +96,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) server-side-dep: specifier: file:server-side-dep version: file:packages/adapter-cloudflare/test/apps/pages/server-side-dep @@ -104,8 +104,8 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) wrangler: specifier: ^4.11.0 version: 4.11.0(@cloudflare/workers-types@4.20250415.0) @@ -117,7 +117,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) server-side-dep: specifier: file:server-side-dep version: file:packages/adapter-cloudflare/test/apps/workers/server-side-dep @@ -125,8 +125,8 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) wrangler: specifier: ^4.11.0 version: 4.11.0(@cloudflare/workers-types@4.20250415.0) @@ -137,8 +137,8 @@ importers: specifier: ^2.2.5 version: 2.2.5 esbuild: - specifier: ^0.25.2 - version: 0.25.2 + specifier: ^0.25.3 + version: 0.25.3 set-cookie-parser: specifier: ^2.6.0 version: 2.6.0 @@ -148,19 +148,19 @@ importers: version: 3.0.0 '@rollup/plugin-commonjs': specifier: ^28.0.1 - version: 28.0.1(rollup@4.30.1) + version: 28.0.1(rollup@4.40.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.30.1) + version: 6.1.0(rollup@4.40.1) '@rollup/plugin-node-resolve': specifier: ^16.0.0 - version: 16.0.0(rollup@4.30.1) + version: 16.0.0(rollup@4.40.1) '@sveltejs/kit': specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -169,7 +169,7 @@ importers: version: 2.4.7 rollup: specifier: ^4.14.2 - version: 4.30.1 + version: 4.40.1 typescript: specifier: ^5.3.3 version: 5.6.3 @@ -181,16 +181,16 @@ importers: dependencies: '@rollup/plugin-commonjs': specifier: ^28.0.1 - version: 28.0.1(rollup@4.30.1) + version: 28.0.1(rollup@4.40.1) '@rollup/plugin-json': specifier: ^6.1.0 - version: 6.1.0(rollup@4.30.1) + version: 6.1.0(rollup@4.40.1) '@rollup/plugin-node-resolve': specifier: ^16.0.0 - version: 16.0.0(rollup@4.30.1) + version: 16.0.0(rollup@4.40.1) rollup: specifier: ^4.9.5 - version: 4.30.1 + version: 4.40.1 devDependencies: '@polka/url': specifier: ^1.0.0-next.28 @@ -200,7 +200,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -227,7 +227,7 @@ importers: version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -241,8 +241,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/prerendered: devDependencies: @@ -251,7 +251,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -259,8 +259,8 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-static/test/apps/spa: devDependencies: @@ -272,7 +272,7 @@ importers: version: link:../../../../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) sirv-cli: specifier: ^3.0.0 version: 3.0.0 @@ -280,24 +280,24 @@ importers: specifier: ^5.23.1 version: 5.23.1 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/adapter-vercel: dependencies: '@vercel/nft': specifier: ^0.29.2 - version: 0.29.2(rollup@4.30.1) + version: 0.29.2(rollup@4.40.1) esbuild: - specifier: ^0.25.2 - version: 0.25.2 + specifier: ^0.25.3 + version: 0.25.3 devDependencies: '@sveltejs/kit': specifier: workspace:^ version: link:../kit '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -333,14 +333,14 @@ importers: version: 0.1.5(svelte@5.23.1) vite-imagetools: specifier: ^7.0.1 - version: 7.0.1(rollup@4.30.1) + version: 7.0.1(rollup@4.40.1) zimmerframe: specifier: ^1.1.2 version: 1.1.2 devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/estree': specifier: ^1.0.5 version: 1.0.7 @@ -349,7 +349,7 @@ importers: version: 18.19.50 rollup: specifier: ^4.27.4 - version: 4.30.1 + version: 4.40.1 svelte: specifier: ^5.23.1 version: 5.23.1 @@ -357,8 +357,8 @@ importers: specifier: ^5.6.3 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.1.1 version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -404,7 +404,7 @@ importers: version: 1.51.1 '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/connect': specifier: ^3.4.38 version: 3.4.38 @@ -419,7 +419,7 @@ importers: version: 0.5.5(typescript@5.6.3) rollup: specifier: ^4.14.2 - version: 4.30.1 + version: 4.40.1 svelte: specifier: ^5.23.1 version: 5.23.1 @@ -430,8 +430,8 @@ importers: specifier: ^5.3.3 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.1.1 version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -446,7 +446,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -463,8 +463,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/basics: devDependencies: @@ -473,7 +473,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -487,8 +487,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/dev-only: devDependencies: @@ -497,7 +497,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -541,8 +541,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/embed: devDependencies: @@ -551,7 +551,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -565,8 +565,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/hash-based-routing: devDependencies: @@ -575,7 +575,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -589,8 +589,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/no-ssr: devDependencies: @@ -599,7 +599,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -613,8 +613,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options: devDependencies: @@ -626,7 +626,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -640,8 +640,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/options-2: devDependencies: @@ -653,7 +653,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -667,8 +667,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/prerendered-app-error-pages: devDependencies: @@ -677,7 +677,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -691,8 +691,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/apps/writes: devDependencies: @@ -701,7 +701,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -715,8 +715,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors: devDependencies: @@ -734,7 +734,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -745,8 +745,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment: devDependencies: @@ -758,7 +758,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -769,8 +769,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/prerenderable-not-prerendered: devDependencies: @@ -782,7 +782,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -793,8 +793,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env: devDependencies: @@ -803,7 +803,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -814,8 +814,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import: devDependencies: @@ -824,7 +824,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -835,8 +835,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env: devDependencies: @@ -845,7 +845,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) cross-env: specifier: ^7.0.3 version: 7.0.3 @@ -859,8 +859,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/private-static-env-dynamic-import: devDependencies: @@ -869,7 +869,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -880,8 +880,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder: devDependencies: @@ -890,7 +890,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -901,8 +901,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-folder-dynamic-import: devDependencies: @@ -911,7 +911,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -922,8 +922,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module: devDependencies: @@ -932,7 +932,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -943,8 +943,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/server-only-module-dynamic-import: devDependencies: @@ -953,7 +953,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -964,8 +964,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-dynamic-public-env: devDependencies: @@ -974,7 +974,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -985,8 +985,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/service-worker-private-env: devDependencies: @@ -995,7 +995,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1006,8 +1006,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/build-errors/apps/syntax-error: devDependencies: @@ -1016,7 +1016,7 @@ importers: version: link:../../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1027,8 +1027,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages/kit/test/prerendering/basics: devDependencies: @@ -1037,7 +1037,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1048,8 +1048,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.1.1 version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1061,7 +1061,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1072,8 +1072,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.1.1 version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1085,7 +1085,7 @@ importers: version: link:../../.. '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) svelte: specifier: ^5.23.1 version: 5.23.1 @@ -1096,8 +1096,8 @@ importers: specifier: ^5.5.4 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest: specifier: ^3.1.1 version: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) @@ -1122,7 +1122,7 @@ importers: devDependencies: '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@types/node': specifier: ^18.19.48 version: 18.19.50 @@ -1179,7 +1179,7 @@ importers: version: link:../../packages/package '@sveltejs/vite-plugin-svelte': specifier: ^5.0.1 - version: 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + version: 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) prettier: specifier: ^3.3.2 version: 3.3.3 @@ -1199,8 +1199,8 @@ importers: specifier: ^5.5.0 version: 5.6.3 vite: - specifier: ^6.2.6 - version: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + specifier: ^6.2.7 + version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) packages: @@ -1333,155 +1333,299 @@ packages: cpu: [ppc64] os: [aix] + '@esbuild/aix-ppc64@0.25.3': + resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [aix] + '@esbuild/android-arm64@0.25.2': resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} engines: {node: '>=18'} cpu: [arm64] os: [android] + '@esbuild/android-arm64@0.25.3': + resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [android] + '@esbuild/android-arm@0.25.2': resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} engines: {node: '>=18'} cpu: [arm] os: [android] + '@esbuild/android-arm@0.25.3': + resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + engines: {node: '>=18'} + cpu: [arm] + os: [android] + '@esbuild/android-x64@0.25.2': resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} engines: {node: '>=18'} cpu: [x64] os: [android] + '@esbuild/android-x64@0.25.3': + resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + engines: {node: '>=18'} + cpu: [x64] + os: [android] + '@esbuild/darwin-arm64@0.25.2': resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] + '@esbuild/darwin-arm64@0.25.3': + resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + engines: {node: '>=18'} + cpu: [arm64] + os: [darwin] + '@esbuild/darwin-x64@0.25.2': resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} engines: {node: '>=18'} cpu: [x64] os: [darwin] + '@esbuild/darwin-x64@0.25.3': + resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} + engines: {node: '>=18'} + cpu: [x64] + os: [darwin] + '@esbuild/freebsd-arm64@0.25.2': resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] + '@esbuild/freebsd-arm64@0.25.3': + resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + engines: {node: '>=18'} + cpu: [arm64] + os: [freebsd] + '@esbuild/freebsd-x64@0.25.2': resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] + '@esbuild/freebsd-x64@0.25.3': + resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} + engines: {node: '>=18'} + cpu: [x64] + os: [freebsd] + '@esbuild/linux-arm64@0.25.2': resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} engines: {node: '>=18'} cpu: [arm64] os: [linux] + '@esbuild/linux-arm64@0.25.3': + resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} + engines: {node: '>=18'} + cpu: [arm64] + os: [linux] + '@esbuild/linux-arm@0.25.2': resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} engines: {node: '>=18'} cpu: [arm] os: [linux] + '@esbuild/linux-arm@0.25.3': + resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} + engines: {node: '>=18'} + cpu: [arm] + os: [linux] + '@esbuild/linux-ia32@0.25.2': resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] + '@esbuild/linux-ia32@0.25.3': + resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + engines: {node: '>=18'} + cpu: [ia32] + os: [linux] + '@esbuild/linux-loong64@0.25.2': resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} engines: {node: '>=18'} cpu: [loong64] os: [linux] + '@esbuild/linux-loong64@0.25.3': + resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} + engines: {node: '>=18'} + cpu: [loong64] + os: [linux] + '@esbuild/linux-mips64el@0.25.2': resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] + '@esbuild/linux-mips64el@0.25.3': + resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} + engines: {node: '>=18'} + cpu: [mips64el] + os: [linux] + '@esbuild/linux-ppc64@0.25.2': resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] + '@esbuild/linux-ppc64@0.25.3': + resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} + engines: {node: '>=18'} + cpu: [ppc64] + os: [linux] + '@esbuild/linux-riscv64@0.25.2': resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] + '@esbuild/linux-riscv64@0.25.3': + resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + engines: {node: '>=18'} + cpu: [riscv64] + os: [linux] + '@esbuild/linux-s390x@0.25.2': resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} engines: {node: '>=18'} cpu: [s390x] os: [linux] + '@esbuild/linux-s390x@0.25.3': + resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + engines: {node: '>=18'} + cpu: [s390x] + os: [linux] + '@esbuild/linux-x64@0.25.2': resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} engines: {node: '>=18'} cpu: [x64] os: [linux] + '@esbuild/linux-x64@0.25.3': + resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + engines: {node: '>=18'} + cpu: [x64] + os: [linux] + '@esbuild/netbsd-arm64@0.25.2': resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] + '@esbuild/netbsd-arm64@0.25.3': + resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} + engines: {node: '>=18'} + cpu: [arm64] + os: [netbsd] + '@esbuild/netbsd-x64@0.25.2': resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] + '@esbuild/netbsd-x64@0.25.3': + resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} + engines: {node: '>=18'} + cpu: [x64] + os: [netbsd] + '@esbuild/openbsd-arm64@0.25.2': resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] + '@esbuild/openbsd-arm64@0.25.3': + resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [openbsd] + '@esbuild/openbsd-x64@0.25.2': resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] + '@esbuild/openbsd-x64@0.25.3': + resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + engines: {node: '>=18'} + cpu: [x64] + os: [openbsd] + '@esbuild/sunos-x64@0.25.2': resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} engines: {node: '>=18'} cpu: [x64] os: [sunos] + '@esbuild/sunos-x64@0.25.3': + resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + engines: {node: '>=18'} + cpu: [x64] + os: [sunos] + '@esbuild/win32-arm64@0.25.2': resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} engines: {node: '>=18'} cpu: [arm64] os: [win32] + '@esbuild/win32-arm64@0.25.3': + resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + engines: {node: '>=18'} + cpu: [arm64] + os: [win32] + '@esbuild/win32-ia32@0.25.2': resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] + '@esbuild/win32-ia32@0.25.3': + resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} + engines: {node: '>=18'} + cpu: [ia32] + os: [win32] + '@esbuild/win32-x64@0.25.2': resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} engines: {node: '>=18'} cpu: [x64] os: [win32] - '@eslint-community/eslint-utils@4.6.0': - resolution: {integrity: sha512-WhCn7Z7TauhBtmzhvKpoQs0Wwb/kBcy4CwpuI0/eEIr2Lx2auxmulAzLr91wVZJaz47iUZdkXOK7WlAfxGKCnA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - peerDependencies: - eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + '@esbuild/win32-x64@0.25.3': + resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + engines: {node: '>=18'} + cpu: [x64] + os: [win32] '@eslint-community/eslint-utils@4.7.0': resolution: {integrity: sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==} @@ -1751,98 +1895,103 @@ packages: rollup: optional: true - '@rollup/rollup-android-arm-eabi@4.30.1': - resolution: {integrity: sha512-pSWY+EVt3rJ9fQ3IqlrEUtXh3cGqGtPDH1FQlNZehO2yYxCHEX1SPsz1M//NXwYfbTlcKr9WObLnJX9FsS9K1Q==} + '@rollup/rollup-android-arm-eabi@4.40.1': + resolution: {integrity: sha512-kxz0YeeCrRUHz3zyqvd7n+TVRlNyTifBsmnmNPtk3hQURUyG9eAB+usz6DAwagMusjx/zb3AjvDUvhFGDAexGw==} cpu: [arm] os: [android] - '@rollup/rollup-android-arm64@4.30.1': - resolution: {integrity: sha512-/NA2qXxE3D/BRjOJM8wQblmArQq1YoBVJjrjoTSBS09jgUisq7bqxNHJ8kjCHeV21W/9WDGwJEWSN0KQ2mtD/w==} + '@rollup/rollup-android-arm64@4.40.1': + resolution: {integrity: sha512-PPkxTOisoNC6TpnDKatjKkjRMsdaWIhyuMkA4UsBXT9WEZY4uHezBTjs6Vl4PbqQQeu6oION1w2voYZv9yquCw==} cpu: [arm64] os: [android] - '@rollup/rollup-darwin-arm64@4.30.1': - resolution: {integrity: sha512-r7FQIXD7gB0WJ5mokTUgUWPl0eYIH0wnxqeSAhuIwvnnpjdVB8cRRClyKLQr7lgzjctkbp5KmswWszlwYln03Q==} + '@rollup/rollup-darwin-arm64@4.40.1': + resolution: {integrity: sha512-VWXGISWFY18v/0JyNUy4A46KCFCb9NVsH+1100XP31lud+TzlezBbz24CYzbnA4x6w4hx+NYCXDfnvDVO6lcAA==} cpu: [arm64] os: [darwin] - '@rollup/rollup-darwin-x64@4.30.1': - resolution: {integrity: sha512-x78BavIwSH6sqfP2xeI1hd1GpHL8J4W2BXcVM/5KYKoAD3nNsfitQhvWSw+TFtQTLZ9OmlF+FEInEHyubut2OA==} + '@rollup/rollup-darwin-x64@4.40.1': + resolution: {integrity: sha512-nIwkXafAI1/QCS7pxSpv/ZtFW6TXcNUEHAIA9EIyw5OzxJZQ1YDrX+CL6JAIQgZ33CInl1R6mHet9Y/UZTg2Bw==} cpu: [x64] os: [darwin] - '@rollup/rollup-freebsd-arm64@4.30.1': - resolution: {integrity: sha512-HYTlUAjbO1z8ywxsDFWADfTRfTIIy/oUlfIDmlHYmjUP2QRDTzBuWXc9O4CXM+bo9qfiCclmHk1x4ogBjOUpUQ==} + '@rollup/rollup-freebsd-arm64@4.40.1': + resolution: {integrity: sha512-BdrLJ2mHTrIYdaS2I99mriyJfGGenSaP+UwGi1kB9BLOCu9SR8ZpbkmmalKIALnRw24kM7qCN0IOm6L0S44iWw==} cpu: [arm64] os: [freebsd] - '@rollup/rollup-freebsd-x64@4.30.1': - resolution: {integrity: sha512-1MEdGqogQLccphhX5myCJqeGNYTNcmTyaic9S7CG3JhwuIByJ7J05vGbZxsizQthP1xpVx7kd3o31eOogfEirw==} + '@rollup/rollup-freebsd-x64@4.40.1': + resolution: {integrity: sha512-VXeo/puqvCG8JBPNZXZf5Dqq7BzElNJzHRRw3vjBE27WujdzuOPecDPc/+1DcdcTptNBep3861jNq0mYkT8Z6Q==} cpu: [x64] os: [freebsd] - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': - resolution: {integrity: sha512-PaMRNBSqCx7K3Wc9QZkFx5+CX27WFpAMxJNiYGAXfmMIKC7jstlr32UhTgK6T07OtqR+wYlWm9IxzennjnvdJg==} + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': + resolution: {integrity: sha512-ehSKrewwsESPt1TgSE/na9nIhWCosfGSFqv7vwEtjyAqZcvbGIg4JAcV7ZEh2tfj/IlfBeZjgOXm35iOOjadcg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm-musleabihf@4.30.1': - resolution: {integrity: sha512-B8Rcyj9AV7ZlEFqvB5BubG5iO6ANDsRKlhIxySXcF1axXYUyqwBok+XZPgIYGBgs7LDXfWfifxhw0Ik57T0Yug==} + '@rollup/rollup-linux-arm-musleabihf@4.40.1': + resolution: {integrity: sha512-m39iO/aaurh5FVIu/F4/Zsl8xppd76S4qoID8E+dSRQvTyZTOI2gVk3T4oqzfq1PtcvOfAVlwLMK3KRQMaR8lg==} cpu: [arm] os: [linux] - '@rollup/rollup-linux-arm64-gnu@4.30.1': - resolution: {integrity: sha512-hqVyueGxAj3cBKrAI4aFHLV+h0Lv5VgWZs9CUGqr1z0fZtlADVV1YPOij6AhcK5An33EXaxnDLmJdQikcn5NEw==} + '@rollup/rollup-linux-arm64-gnu@4.40.1': + resolution: {integrity: sha512-Y+GHnGaku4aVLSgrT0uWe2o2Rq8te9hi+MwqGF9r9ORgXhmHK5Q71N757u0F8yU1OIwUIFy6YiJtKjtyktk5hg==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-arm64-musl@4.30.1': - resolution: {integrity: sha512-i4Ab2vnvS1AE1PyOIGp2kXni69gU2DAUVt6FSXeIqUCPIR3ZlheMW3oP2JkukDfu3PsexYRbOiJrY+yVNSk9oA==} + '@rollup/rollup-linux-arm64-musl@4.40.1': + resolution: {integrity: sha512-jEwjn3jCA+tQGswK3aEWcD09/7M5wGwc6+flhva7dsQNRZZTe30vkalgIzV4tjkopsTS9Jd7Y1Bsj6a4lzz8gQ==} cpu: [arm64] os: [linux] - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': - resolution: {integrity: sha512-fARcF5g296snX0oLGkVxPmysetwUk2zmHcca+e9ObOovBR++9ZPOhqFUM61UUZ2EYpXVPN1redgqVoBB34nTpQ==} + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': + resolution: {integrity: sha512-ySyWikVhNzv+BV/IDCsrraOAZ3UaC8SZB67FZlqVwXwnFhPihOso9rPOxzZbjp81suB1O2Topw+6Ug3JNegejQ==} cpu: [loong64] os: [linux] - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': - resolution: {integrity: sha512-GLrZraoO3wVT4uFXh67ElpwQY0DIygxdv0BNW9Hkm3X34wu+BkqrDrkcsIapAY+N2ATEbvak0XQ9gxZtCIA5Rw==} + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': + resolution: {integrity: sha512-BvvA64QxZlh7WZWqDPPdt0GH4bznuL6uOO1pmgPnnv86rpUpc8ZxgZwcEgXvo02GRIZX1hQ0j0pAnhwkhwPqWg==} cpu: [ppc64] os: [linux] - '@rollup/rollup-linux-riscv64-gnu@4.30.1': - resolution: {integrity: sha512-0WKLaAUUHKBtll0wvOmh6yh3S0wSU9+yas923JIChfxOaaBarmb/lBKPF0w/+jTVozFnOXJeRGZ8NvOxvk/jcw==} + '@rollup/rollup-linux-riscv64-gnu@4.40.1': + resolution: {integrity: sha512-EQSP+8+1VuSulm9RKSMKitTav89fKbHymTf25n5+Yr6gAPZxYWpj3DzAsQqoaHAk9YX2lwEyAf9S4W8F4l3VBQ==} cpu: [riscv64] os: [linux] - '@rollup/rollup-linux-s390x-gnu@4.30.1': - resolution: {integrity: sha512-GWFs97Ruxo5Bt+cvVTQkOJ6TIx0xJDD/bMAOXWJg8TCSTEK8RnFeOeiFTxKniTc4vMIaWvCplMAFBt9miGxgkA==} + '@rollup/rollup-linux-riscv64-musl@4.40.1': + resolution: {integrity: sha512-n/vQ4xRZXKuIpqukkMXZt9RWdl+2zgGNx7Uda8NtmLJ06NL8jiHxUawbwC+hdSq1rrw/9CghCpEONor+l1e2gA==} + cpu: [riscv64] + os: [linux] + + '@rollup/rollup-linux-s390x-gnu@4.40.1': + resolution: {integrity: sha512-h8d28xzYb98fMQKUz0w2fMc1XuGzLLjdyxVIbhbil4ELfk5/orZlSTpF/xdI9C8K0I8lCkq+1En2RJsawZekkg==} cpu: [s390x] os: [linux] - '@rollup/rollup-linux-x64-gnu@4.30.1': - resolution: {integrity: sha512-UtgGb7QGgXDIO+tqqJ5oZRGHsDLO8SlpE4MhqpY9Llpzi5rJMvrK6ZGhsRCST2abZdBqIBeXW6WPD5fGK5SDwg==} + '@rollup/rollup-linux-x64-gnu@4.40.1': + resolution: {integrity: sha512-XiK5z70PEFEFqcNj3/zRSz/qX4bp4QIraTy9QjwJAb/Z8GM7kVUsD0Uk8maIPeTyPCP03ChdI+VVmJriKYbRHQ==} cpu: [x64] os: [linux] - '@rollup/rollup-linux-x64-musl@4.30.1': - resolution: {integrity: sha512-V9U8Ey2UqmQsBT+xTOeMzPzwDzyXmnAoO4edZhL7INkwQcaW1Ckv3WJX3qrrp/VHaDkEWIBWhRwP47r8cdrOow==} + '@rollup/rollup-linux-x64-musl@4.40.1': + resolution: {integrity: sha512-2BRORitq5rQ4Da9blVovzNCMaUlyKrzMSvkVR0D4qPuOy/+pMCrh1d7o01RATwVy+6Fa1WBw+da7QPeLWU/1mQ==} cpu: [x64] os: [linux] - '@rollup/rollup-win32-arm64-msvc@4.30.1': - resolution: {integrity: sha512-WabtHWiPaFF47W3PkHnjbmWawnX/aE57K47ZDT1BXTS5GgrBUEpvOzq0FI0V/UYzQJgdb8XlhVNH8/fwV8xDjw==} + '@rollup/rollup-win32-arm64-msvc@4.40.1': + resolution: {integrity: sha512-b2bcNm9Kbde03H+q+Jjw9tSfhYkzrDUf2d5MAd1bOJuVplXvFhWz7tRtWvD8/ORZi7qSCy0idW6tf2HgxSXQSg==} cpu: [arm64] os: [win32] - '@rollup/rollup-win32-ia32-msvc@4.30.1': - resolution: {integrity: sha512-pxHAU+Zv39hLUTdQQHUVHf4P+0C47y/ZloorHpzs2SXMRqeAWmGghzAhfOlzFHHwjvgokdFAhC4V+6kC1lRRfw==} + '@rollup/rollup-win32-ia32-msvc@4.40.1': + resolution: {integrity: sha512-DfcogW8N7Zg7llVEfpqWMZcaErKfsj9VvmfSyRjCyo4BI3wPEfrzTtJkZG6gKP/Z92wFm6rz2aDO7/JfiR/whA==} cpu: [ia32] os: [win32] - '@rollup/rollup-win32-x64-msvc@4.30.1': - resolution: {integrity: sha512-D6qjsXGcvhTjv0kI4fU8tUuBDF/Ueee4SVX79VfNDXZa64TfCW1Slkb6Z7O1p7vflqZjcmOVdZlqf8gvJxc6og==} + '@rollup/rollup-win32-x64-msvc@4.40.1': + resolution: {integrity: sha512-ECyOuDeH3C1I8jH2MK1RtBJW+YPMvSfT0a5NN0nHfQYnDSJ6tUiZH3gzwVP5/Kfh/+Tt7tpWVF9LXNTnhTJ3kA==} cpu: [x64] os: [win32] @@ -1876,13 +2025,6 @@ packages: svelte: ^5.0.0 vite: ^6.0.0 - '@sveltejs/vite-plugin-svelte@5.0.1': - resolution: {integrity: sha512-D5l5+STmywGoLST07T9mrqqFFU+xgv5fqyTWM+VbxTvQ6jujNn4h3lQNCvlwVYs4Erov8i0K5Rwr3LQtmBYmBw==} - engines: {node: ^18.0.0 || ^20.0.0 || >=22} - peerDependencies: - svelte: ^5.0.0 - vite: ^6.0.0 - '@sveltejs/vite-plugin-svelte@5.0.3': resolution: {integrity: sha512-MCFS6CrQDu1yGwspm4qtli0e63vaPCehf6V7pIMP15AsWgMKrqDGCPFF/0kn4SP0ii4aySu4Pa62+fIRGFMjgw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} @@ -1903,9 +2045,6 @@ packages: '@types/eslint@8.56.12': resolution: {integrity: sha512-03ruubjWyOHlmljCVoxSuNDdmfZDzsrrz0P2LeJsOXr+ZwFQ+0yQIwNCwt/GYhV7Z31fgtXJTAEs+FYlEL851g==} - '@types/estree@1.0.6': - resolution: {integrity: sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==} - '@types/estree@1.0.7': resolution: {integrity: sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==} @@ -2329,6 +2468,11 @@ packages: engines: {node: '>=18'} hasBin: true + esbuild@0.25.3: + resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + engines: {node: '>=18'} + hasBin: true + escape-string-regexp@4.0.0: resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} engines: {node: '>=10'} @@ -2838,8 +2982,8 @@ packages: resolution: {integrity: sha512-71ippSywq5Yb7/tVYyGbkBggbU8H3u5Rz56fH60jGFgr8uHwxs+aSKeqmluIVzM0m0kB7xQjKS6qPfd0b2ZoqQ==} hasBin: true - nanoid@3.3.8: - resolution: {integrity: sha512-WNLf5Sd8oZxOm+TzppcYk8gVOgP+l58xNy58D0nbUnOxOWRWvlcCV4kUF7ltmI6PsrLl/BgKEyS4mqsGChFN0w==} + nanoid@3.3.11: + resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==} engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1} hasBin: true @@ -3081,8 +3225,8 @@ packages: resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} engines: {iojs: '>=1.0.0', node: '>=0.10.0'} - rollup@4.30.1: - resolution: {integrity: sha512-mlJ4glW020fPuLi7DkM/lN97mYEZGWeqBnrljzN0gs7GLctqX3lNWxKQ7Gl712UAX+6fog/L3jh4gb7R6aVi3w==} + rollup@4.40.1: + resolution: {integrity: sha512-C5VvvgCCyfyotVITIAv+4efVytl5F7wt+/I2i9q9GZcEXW9BP52YYOXC58igUi+LFZVHukErIIqQSWwv/M3WRw==} engines: {node: '>=18.0.0', npm: '>=8.0.0'} hasBin: true @@ -3417,8 +3561,8 @@ packages: engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true - vite@6.2.6: - resolution: {integrity: sha512-9xpjNl3kR4rVDZgPNdTL0/c6ao4km69a/2ihNQbcANz8RuCOK3hQBmLSJf3bRKVQjVMda+YvizNE8AwvogcPbw==} + vite@6.2.7: + resolution: {integrity: sha512-qg3LkeuinTrZoJHHF94coSaTfIPyBYoywp+ys4qu20oSJFbKMYoIJo0FWJT9q6Vp49l6z9IsJRbHdcGtiKbGoQ==} engines: {node: ^18.0.0 || ^20.0.0 || >=22.0.0} hasBin: true peerDependencies: @@ -3457,14 +3601,6 @@ packages: yaml: optional: true - vitefu@1.0.4: - resolution: {integrity: sha512-y6zEE3PQf6uu/Mt6DTJ9ih+kyJLr4XcSgHR2zUkM8SWDhuixEJxfJ6CZGMHh1Ec3vPLoEA0IHU5oWzVqw8ulow==} - peerDependencies: - vite: ^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 - peerDependenciesMeta: - vite: - optional: true - vitefu@1.0.6: resolution: {integrity: sha512-+Rex1GlappUyNN6UfwbVZne/9cYC4+R2XDk9xkNXBKMw6HQagdX9PgZ8V2v1WUSK1wfBLp7qbI1+XSNIlB1xmA==} peerDependencies: @@ -3778,82 +3914,152 @@ snapshots: '@esbuild/aix-ppc64@0.25.2': optional: true + '@esbuild/aix-ppc64@0.25.3': + optional: true + '@esbuild/android-arm64@0.25.2': optional: true + '@esbuild/android-arm64@0.25.3': + optional: true + '@esbuild/android-arm@0.25.2': optional: true + '@esbuild/android-arm@0.25.3': + optional: true + '@esbuild/android-x64@0.25.2': optional: true + '@esbuild/android-x64@0.25.3': + optional: true + '@esbuild/darwin-arm64@0.25.2': optional: true + '@esbuild/darwin-arm64@0.25.3': + optional: true + '@esbuild/darwin-x64@0.25.2': optional: true + '@esbuild/darwin-x64@0.25.3': + optional: true + '@esbuild/freebsd-arm64@0.25.2': optional: true + '@esbuild/freebsd-arm64@0.25.3': + optional: true + '@esbuild/freebsd-x64@0.25.2': optional: true + '@esbuild/freebsd-x64@0.25.3': + optional: true + '@esbuild/linux-arm64@0.25.2': optional: true + '@esbuild/linux-arm64@0.25.3': + optional: true + '@esbuild/linux-arm@0.25.2': optional: true + '@esbuild/linux-arm@0.25.3': + optional: true + '@esbuild/linux-ia32@0.25.2': optional: true + '@esbuild/linux-ia32@0.25.3': + optional: true + '@esbuild/linux-loong64@0.25.2': optional: true + '@esbuild/linux-loong64@0.25.3': + optional: true + '@esbuild/linux-mips64el@0.25.2': optional: true + '@esbuild/linux-mips64el@0.25.3': + optional: true + '@esbuild/linux-ppc64@0.25.2': optional: true + '@esbuild/linux-ppc64@0.25.3': + optional: true + '@esbuild/linux-riscv64@0.25.2': optional: true + '@esbuild/linux-riscv64@0.25.3': + optional: true + '@esbuild/linux-s390x@0.25.2': optional: true + '@esbuild/linux-s390x@0.25.3': + optional: true + '@esbuild/linux-x64@0.25.2': optional: true + '@esbuild/linux-x64@0.25.3': + optional: true + '@esbuild/netbsd-arm64@0.25.2': optional: true + '@esbuild/netbsd-arm64@0.25.3': + optional: true + '@esbuild/netbsd-x64@0.25.2': optional: true + '@esbuild/netbsd-x64@0.25.3': + optional: true + '@esbuild/openbsd-arm64@0.25.2': optional: true + '@esbuild/openbsd-arm64@0.25.3': + optional: true + '@esbuild/openbsd-x64@0.25.2': optional: true + '@esbuild/openbsd-x64@0.25.3': + optional: true + '@esbuild/sunos-x64@0.25.2': optional: true + '@esbuild/sunos-x64@0.25.3': + optional: true + '@esbuild/win32-arm64@0.25.2': optional: true + '@esbuild/win32-arm64@0.25.3': + optional: true + '@esbuild/win32-ia32@0.25.2': optional: true + '@esbuild/win32-ia32@0.25.3': + optional: true + '@esbuild/win32-x64@0.25.2': optional: true - '@eslint-community/eslint-utils@4.6.0(eslint@9.6.0)': - dependencies: - eslint: 9.6.0 - eslint-visitor-keys: 3.4.3 + '@esbuild/win32-x64@0.25.3': + optional: true '@eslint-community/eslint-utils@4.7.0(eslint@9.6.0)': dependencies: @@ -4076,9 +4282,9 @@ snapshots: '@publint/pack@0.1.0': {} - '@rollup/plugin-commonjs@28.0.1(rollup@4.30.1)': + '@rollup/plugin-commonjs@28.0.1(rollup@4.40.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.30.1) + '@rollup/pluginutils': 5.1.3(rollup@4.40.1) commondir: 1.0.1 estree-walker: 2.0.2 fdir: 6.4.3(picomatch@4.0.2) @@ -4086,87 +4292,90 @@ snapshots: magic-string: 0.30.17 picomatch: 4.0.2 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.1 - '@rollup/plugin-json@6.1.0(rollup@4.30.1)': + '@rollup/plugin-json@6.1.0(rollup@4.40.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.30.1) + '@rollup/pluginutils': 5.1.3(rollup@4.40.1) optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.1 - '@rollup/plugin-node-resolve@16.0.0(rollup@4.30.1)': + '@rollup/plugin-node-resolve@16.0.0(rollup@4.40.1)': dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.30.1) + '@rollup/pluginutils': 5.1.3(rollup@4.40.1) '@types/resolve': 1.20.2 deepmerge: 4.3.1 is-module: 1.0.0 resolve: 1.22.8 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.1 - '@rollup/pluginutils@5.1.3(rollup@4.30.1)': + '@rollup/pluginutils@5.1.3(rollup@4.40.1)': dependencies: '@types/estree': 1.0.7 estree-walker: 2.0.2 picomatch: 4.0.2 optionalDependencies: - rollup: 4.30.1 + rollup: 4.40.1 + + '@rollup/rollup-android-arm-eabi@4.40.1': + optional: true - '@rollup/rollup-android-arm-eabi@4.30.1': + '@rollup/rollup-android-arm64@4.40.1': optional: true - '@rollup/rollup-android-arm64@4.30.1': + '@rollup/rollup-darwin-arm64@4.40.1': optional: true - '@rollup/rollup-darwin-arm64@4.30.1': + '@rollup/rollup-darwin-x64@4.40.1': optional: true - '@rollup/rollup-darwin-x64@4.30.1': + '@rollup/rollup-freebsd-arm64@4.40.1': optional: true - '@rollup/rollup-freebsd-arm64@4.30.1': + '@rollup/rollup-freebsd-x64@4.40.1': optional: true - '@rollup/rollup-freebsd-x64@4.30.1': + '@rollup/rollup-linux-arm-gnueabihf@4.40.1': optional: true - '@rollup/rollup-linux-arm-gnueabihf@4.30.1': + '@rollup/rollup-linux-arm-musleabihf@4.40.1': optional: true - '@rollup/rollup-linux-arm-musleabihf@4.30.1': + '@rollup/rollup-linux-arm64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-arm64-gnu@4.30.1': + '@rollup/rollup-linux-arm64-musl@4.40.1': optional: true - '@rollup/rollup-linux-arm64-musl@4.30.1': + '@rollup/rollup-linux-loongarch64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-loongarch64-gnu@4.30.1': + '@rollup/rollup-linux-powerpc64le-gnu@4.40.1': optional: true - '@rollup/rollup-linux-powerpc64le-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-riscv64-gnu@4.30.1': + '@rollup/rollup-linux-riscv64-musl@4.40.1': optional: true - '@rollup/rollup-linux-s390x-gnu@4.30.1': + '@rollup/rollup-linux-s390x-gnu@4.40.1': optional: true - '@rollup/rollup-linux-x64-gnu@4.30.1': + '@rollup/rollup-linux-x64-gnu@4.40.1': optional: true - '@rollup/rollup-linux-x64-musl@4.30.1': + '@rollup/rollup-linux-x64-musl@4.40.1': optional: true - '@rollup/rollup-win32-arm64-msvc@4.30.1': + '@rollup/rollup-win32-arm64-msvc@4.40.1': optional: true - '@rollup/rollup-win32-ia32-msvc@4.30.1': + '@rollup/rollup-win32-ia32-msvc@4.40.1': optional: true - '@rollup/rollup-win32-x64-msvc@4.30.1': + '@rollup/rollup-win32-x64-msvc@4.40.1': optional: true '@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0)': @@ -4192,47 +4401,25 @@ snapshots: typescript: 5.6.3 typescript-eslint: 8.26.0(eslint@9.6.0)(typescript@5.6.3) - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 svelte: 5.23.1 - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - supports-color - '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: - '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.4.0 - svelte: 5.23.1 - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.1(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) - debug: 4.4.0 - deepmerge: 4.3.1 - kleur: 4.1.5 - magic-string: 0.30.17 - svelte: 5.23.1 - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 1.0.4(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) - transitivePeerDependencies: - - supports-color - - '@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': - dependencies: - '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@sveltejs/vite-plugin-svelte-inspector': 4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) debug: 4.4.0 deepmerge: 4.3.1 kleur: 4.1.5 magic-string: 0.30.17 svelte: 5.23.1 - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) - vitefu: 1.0.6(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) + vitefu: 1.0.6(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) transitivePeerDependencies: - supports-color @@ -4254,8 +4441,6 @@ snapshots: '@types/estree': 1.0.7 '@types/json-schema': 7.0.15 - '@types/estree@1.0.6': {} - '@types/estree@1.0.7': {} '@types/json-schema@7.0.15': {} @@ -4358,7 +4543,7 @@ snapshots: '@typescript-eslint/utils@8.26.0(eslint@9.6.0)(typescript@5.6.3)': dependencies: - '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) '@typescript-eslint/scope-manager': 8.26.0 '@typescript-eslint/types': 8.26.0 '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.6.3) @@ -4388,10 +4573,10 @@ snapshots: '@typescript-eslint/types': 8.31.1 eslint-visitor-keys: 4.2.0 - '@vercel/nft@0.29.2(rollup@4.30.1)': + '@vercel/nft@0.29.2(rollup@4.40.1)': dependencies: '@mapbox/node-pre-gyp': 2.0.0 - '@rollup/pluginutils': 5.1.3(rollup@4.30.1) + '@rollup/pluginutils': 5.1.3(rollup@4.40.1) acorn: 8.14.1 acorn-import-attributes: 1.9.5(acorn@8.14.1) async-sema: 3.1.1 @@ -4414,13 +4599,13 @@ snapshots: chai: 5.2.0 tinyrainbow: 2.0.0 - '@vitest/mocker@3.1.1(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1))': + '@vitest/mocker@3.1.1(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: '@vitest/spy': 3.1.1 estree-walker: 3.0.3 magic-string: 0.30.17 optionalDependencies: - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) '@vitest/pretty-format@3.1.1': dependencies: @@ -4699,6 +4884,34 @@ snapshots: '@esbuild/win32-ia32': 0.25.2 '@esbuild/win32-x64': 0.25.2 + esbuild@0.25.3: + optionalDependencies: + '@esbuild/aix-ppc64': 0.25.3 + '@esbuild/android-arm': 0.25.3 + '@esbuild/android-arm64': 0.25.3 + '@esbuild/android-x64': 0.25.3 + '@esbuild/darwin-arm64': 0.25.3 + '@esbuild/darwin-x64': 0.25.3 + '@esbuild/freebsd-arm64': 0.25.3 + '@esbuild/freebsd-x64': 0.25.3 + '@esbuild/linux-arm': 0.25.3 + '@esbuild/linux-arm64': 0.25.3 + '@esbuild/linux-ia32': 0.25.3 + '@esbuild/linux-loong64': 0.25.3 + '@esbuild/linux-mips64el': 0.25.3 + '@esbuild/linux-ppc64': 0.25.3 + '@esbuild/linux-riscv64': 0.25.3 + '@esbuild/linux-s390x': 0.25.3 + '@esbuild/linux-x64': 0.25.3 + '@esbuild/netbsd-arm64': 0.25.3 + '@esbuild/netbsd-x64': 0.25.3 + '@esbuild/openbsd-arm64': 0.25.3 + '@esbuild/openbsd-x64': 0.25.3 + '@esbuild/sunos-x64': 0.25.3 + '@esbuild/win32-arm64': 0.25.3 + '@esbuild/win32-ia32': 0.25.3 + '@esbuild/win32-x64': 0.25.3 + escape-string-regexp@4.0.0: {} eslint-compat-utils@0.5.1(eslint@9.6.0): @@ -4769,7 +4982,7 @@ snapshots: eslint@9.6.0: dependencies: - '@eslint-community/eslint-utils': 4.6.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) '@eslint-community/regexpp': 4.12.1 '@eslint/config-array': 0.17.0 '@eslint/eslintrc': 3.1.0 @@ -5211,7 +5424,7 @@ snapshots: mustache@4.2.0: {} - nanoid@3.3.8: {} + nanoid@3.3.11: {} natural-compare@1.4.0: {} @@ -5344,7 +5557,7 @@ snapshots: postcss@8.5.3: dependencies: - nanoid: 3.3.8 + nanoid: 3.3.11 picocolors: 1.1.1 source-map-js: 1.2.1 @@ -5399,29 +5612,30 @@ snapshots: reusify@1.0.4: {} - rollup@4.30.1: + rollup@4.40.1: dependencies: - '@types/estree': 1.0.6 + '@types/estree': 1.0.7 optionalDependencies: - '@rollup/rollup-android-arm-eabi': 4.30.1 - '@rollup/rollup-android-arm64': 4.30.1 - '@rollup/rollup-darwin-arm64': 4.30.1 - '@rollup/rollup-darwin-x64': 4.30.1 - '@rollup/rollup-freebsd-arm64': 4.30.1 - '@rollup/rollup-freebsd-x64': 4.30.1 - '@rollup/rollup-linux-arm-gnueabihf': 4.30.1 - '@rollup/rollup-linux-arm-musleabihf': 4.30.1 - '@rollup/rollup-linux-arm64-gnu': 4.30.1 - '@rollup/rollup-linux-arm64-musl': 4.30.1 - '@rollup/rollup-linux-loongarch64-gnu': 4.30.1 - '@rollup/rollup-linux-powerpc64le-gnu': 4.30.1 - '@rollup/rollup-linux-riscv64-gnu': 4.30.1 - '@rollup/rollup-linux-s390x-gnu': 4.30.1 - '@rollup/rollup-linux-x64-gnu': 4.30.1 - '@rollup/rollup-linux-x64-musl': 4.30.1 - '@rollup/rollup-win32-arm64-msvc': 4.30.1 - '@rollup/rollup-win32-ia32-msvc': 4.30.1 - '@rollup/rollup-win32-x64-msvc': 4.30.1 + '@rollup/rollup-android-arm-eabi': 4.40.1 + '@rollup/rollup-android-arm64': 4.40.1 + '@rollup/rollup-darwin-arm64': 4.40.1 + '@rollup/rollup-darwin-x64': 4.40.1 + '@rollup/rollup-freebsd-arm64': 4.40.1 + '@rollup/rollup-freebsd-x64': 4.40.1 + '@rollup/rollup-linux-arm-gnueabihf': 4.40.1 + '@rollup/rollup-linux-arm-musleabihf': 4.40.1 + '@rollup/rollup-linux-arm64-gnu': 4.40.1 + '@rollup/rollup-linux-arm64-musl': 4.40.1 + '@rollup/rollup-linux-loongarch64-gnu': 4.40.1 + '@rollup/rollup-linux-powerpc64le-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-gnu': 4.40.1 + '@rollup/rollup-linux-riscv64-musl': 4.40.1 + '@rollup/rollup-linux-s390x-gnu': 4.40.1 + '@rollup/rollup-linux-x64-gnu': 4.40.1 + '@rollup/rollup-linux-x64-musl': 4.40.1 + '@rollup/rollup-win32-arm64-msvc': 4.40.1 + '@rollup/rollup-win32-ia32-msvc': 4.40.1 + '@rollup/rollup-win32-x64-msvc': 4.40.1 fsevents: 2.3.3 run-parallel@1.2.0: @@ -5731,9 +5945,9 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 - vite-imagetools@7.0.1(rollup@4.30.1): + vite-imagetools@7.0.1(rollup@4.40.1): dependencies: - '@rollup/pluginutils': 5.1.3(rollup@4.30.1) + '@rollup/pluginutils': 5.1.3(rollup@4.40.1) imagetools-core: 7.0.0 transitivePeerDependencies: - rollup @@ -5744,7 +5958,7 @@ snapshots: debug: 4.4.0 es-module-lexer: 1.6.0 pathe: 2.0.3 - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) transitivePeerDependencies: - '@types/node' - jiti @@ -5759,28 +5973,24 @@ snapshots: - tsx - yaml - vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1): + vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: - esbuild: 0.25.2 + esbuild: 0.25.3 postcss: 8.5.3 - rollup: 4.30.1 + rollup: 4.40.1 optionalDependencies: '@types/node': 18.19.50 fsevents: 2.3.3 lightningcss: 1.24.1 - vitefu@1.0.4(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)): - optionalDependencies: - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) - - vitefu@1.0.6(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)): + vitefu@1.0.6(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)): optionalDependencies: - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) vitest@3.1.1(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: '@vitest/expect': 3.1.1 - '@vitest/mocker': 3.1.1(vite@6.2.6(@types/node@18.19.50)(lightningcss@1.24.1)) + '@vitest/mocker': 3.1.1(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) '@vitest/pretty-format': 3.1.1 '@vitest/runner': 3.1.1 '@vitest/snapshot': 3.1.1 @@ -5796,7 +6006,7 @@ snapshots: tinyexec: 0.3.2 tinypool: 1.0.2 tinyrainbow: 2.0.0 - vite: 6.2.6(@types/node@18.19.50)(lightningcss@1.24.1) + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) vite-node: 3.1.1(@types/node@18.19.50)(lightningcss@1.24.1) why-is-node-running: 2.3.0 optionalDependencies: From 08660a76295a6646a34478d16fddebcc83376892 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Tue, 6 May 2025 16:49:34 -0700 Subject: [PATCH 1063/1135] chore(deps): update all non-major dependencies (#13611) Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/yellow-goats-cry.md | 5 + package.json | 2 +- packages/enhanced-img/package.json | 4 +- packages/kit/package.json | 2 +- pnpm-lock.yaml | 265 ++++++++++++++++++++++++++--- 5 files changed, 251 insertions(+), 27 deletions(-) create mode 100644 .changeset/yellow-goats-cry.md diff --git a/.changeset/yellow-goats-cry.md b/.changeset/yellow-goats-cry.md new file mode 100644 index 000000000000..d401873be58c --- /dev/null +++ b/.changeset/yellow-goats-cry.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': patch +--- + +chore(deps): upgrade sharp to 0.34.1 diff --git a/package.json b/package.json index 121bb214891d..153c9acd9abb 100644 --- a/package.json +++ b/package.json @@ -31,7 +31,7 @@ "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.24.0" }, - "packageManager": "pnpm@10.6.4", + "packageManager": "pnpm@10.10.0", "engines": { "pnpm": ">=9.0.0" }, diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 65eb84410e2b..6a139b1572d7 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -37,9 +37,9 @@ "types": "types/index.d.ts", "dependencies": { "magic-string": "^0.30.5", - "sharp": "^0.33.5", + "sharp": "^0.34.1", "svelte-parse-markup": "^0.1.5", - "vite-imagetools": "^7.0.1", + "vite-imagetools": "^7.1.0", "zimmerframe": "^1.1.2" }, "devDependencies": { diff --git a/packages/kit/package.json b/packages/kit/package.json index f59a31aa54dd..efce2f5b5351 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -36,7 +36,7 @@ "@types/connect": "^3.4.38", "@types/node": "^18.19.48", "@types/set-cookie-parser": "^2.4.7", - "dts-buddy": "^0.5.5", + "dts-buddy": "^0.6.0", "rollup": "^4.14.2", "svelte": "^5.23.1", "svelte-preprocess": "^6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 133c7b67ebf3..22586d107e08 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -326,14 +326,14 @@ importers: specifier: ^0.30.5 version: 0.30.17 sharp: - specifier: ^0.33.5 - version: 0.33.5 + specifier: ^0.34.1 + version: 0.34.1 svelte-parse-markup: specifier: ^0.1.5 version: 0.1.5(svelte@5.23.1) vite-imagetools: - specifier: ^7.0.1 - version: 7.0.1(rollup@4.40.1) + specifier: ^7.1.0 + version: 7.1.0(rollup@4.40.1) zimmerframe: specifier: ^1.1.2 version: 1.1.2 @@ -415,8 +415,8 @@ importers: specifier: ^2.4.7 version: 2.4.7 dts-buddy: - specifier: ^0.5.5 - version: 0.5.5(typescript@5.6.3) + specifier: ^0.6.0 + version: 0.6.1(typescript@5.6.3) rollup: specifier: ^4.14.2 version: 4.40.1 @@ -1324,8 +1324,8 @@ packages: resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} engines: {node: '>=12'} - '@emnapi/runtime@1.2.0': - resolution: {integrity: sha512-bV21/9LQmcQeCPEg3BDFtvwL6cwiTMksYNWQQ4KOxCZikEGalWtenoZ0wCiukJINlGCIi2KXx01g4FoH/LxpzQ==} + '@emnapi/runtime@1.4.3': + resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} '@esbuild/aix-ppc64@0.25.2': resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} @@ -1677,105 +1677,215 @@ packages: cpu: [arm64] os: [darwin] + '@img/sharp-darwin-arm64@0.34.1': + resolution: {integrity: sha512-pn44xgBtgpEbZsu+lWf2KNb6OAf70X68k+yk69Ic2Xz11zHR/w24/U49XT7AeRwJ0Px+mhALhU5LPci1Aymk7A==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [darwin] + '@img/sharp-darwin-x64@0.33.5': resolution: {integrity: sha512-fyHac4jIc1ANYGRDxtiqelIbdWkIuQaI84Mv45KvGRRxSAa7o7d1ZKAOBaYbnepLC1WqxfpimdeWfvqqSGwR2Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [darwin] + '@img/sharp-darwin-x64@0.34.1': + resolution: {integrity: sha512-VfuYgG2r8BpYiOUN+BfYeFo69nP/MIwAtSJ7/Zpxc5QF3KS22z8Pvg3FkrSFJBPNQ7mmcUcYQFBmEQp7eu1F8Q==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.0.4': resolution: {integrity: sha512-XblONe153h0O2zuFfTAbQYAX2JhYmDHeWikp1LM9Hul9gVPjFY427k6dFEcOL72O01QxQsWi761svJ/ev9xEDg==} cpu: [arm64] os: [darwin] + '@img/sharp-libvips-darwin-arm64@1.1.0': + resolution: {integrity: sha512-HZ/JUmPwrJSoM4DIQPv/BfNh9yrOA8tlBbqbLz4JZ5uew2+o22Ik+tHQJcih7QJuSa0zo5coHTfD5J8inqj9DA==} + cpu: [arm64] + os: [darwin] + '@img/sharp-libvips-darwin-x64@1.0.4': resolution: {integrity: sha512-xnGR8YuZYfJGmWPvmlunFaWJsb9T/AO2ykoP3Fz/0X5XV2aoYBPkX6xqCQvUTKKiLddarLaxpzNe+b1hjeWHAQ==} cpu: [x64] os: [darwin] + '@img/sharp-libvips-darwin-x64@1.1.0': + resolution: {integrity: sha512-Xzc2ToEmHN+hfvsl9wja0RlnXEgpKNmftriQp6XzY/RaSfwD9th+MSh0WQKzUreLKKINb3afirxW7A0fz2YWuQ==} + cpu: [x64] + os: [darwin] + '@img/sharp-libvips-linux-arm64@1.0.4': resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linux-arm64@1.1.0': + resolution: {integrity: sha512-IVfGJa7gjChDET1dK9SekxFFdflarnUB8PwW8aGwEoF3oAsSDuNUTYS+SKDOyOJxQyDC1aPFMuRYLoDInyV9Ew==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + '@img/sharp-libvips-linux-arm@1.1.0': + resolution: {integrity: sha512-s8BAd0lwUIvYCJyRdFqvsj+BJIpDBSxs6ivrOPm/R7piTs5UIwY5OjXrP2bqXC9/moGsyRa37eYWYCOGVXxVrA==} + cpu: [arm] + os: [linux] + + '@img/sharp-libvips-linux-ppc64@1.1.0': + resolution: {integrity: sha512-tiXxFZFbhnkWE2LA8oQj7KYR+bWBkiV2nilRldT7bqoEZ4HiDOcePr9wVDAZPi/Id5fT1oY9iGnDq20cwUz8lQ==} + cpu: [ppc64] + os: [linux] + '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + '@img/sharp-libvips-linux-s390x@1.1.0': + resolution: {integrity: sha512-xukSwvhguw7COyzvmjydRb3x/09+21HykyapcZchiCUkTThEQEOMtBj9UhkaBRLuBrgLFzQ2wbxdeCCJW/jgJA==} + cpu: [s390x] + os: [linux] + '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linux-x64@1.1.0': + resolution: {integrity: sha512-yRj2+reB8iMg9W5sULM3S74jVS7zqSzHG3Ol/twnAAkAhnGQnpjj6e4ayUz7V+FpKypwgs82xbRdYtchTTUB+Q==} + cpu: [x64] + os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + resolution: {integrity: sha512-jYZdG+whg0MDK+q2COKbYidaqW/WTz0cc1E+tMAusiDygrM4ypmSCjOJPmFTvHHJ8j/6cAGyeDWZOsK06tP33w==} + cpu: [arm64] + os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + resolution: {integrity: sha512-wK7SBdwrAiycjXdkPnGCPLjYb9lD4l6Ze2gSdAGVZrEL05AOUJESWU2lhlC+Ffn5/G+VKuSm6zzbQSzFX/P65A==} + cpu: [x64] + os: [linux] + '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linux-arm64@0.34.1': + resolution: {integrity: sha512-kX2c+vbvaXC6vly1RDf/IWNXxrlxLNpBVWkdpRq5Ka7OOKj6nr66etKy2IENf6FtOgklkg9ZdGpEu9kwdlcwOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + '@img/sharp-linux-arm@0.34.1': + resolution: {integrity: sha512-anKiszvACti2sGy9CirTlNyk7BjjZPiML1jt2ZkTdcvpLU1YH6CXwRAZCA2UmRXnhiIftXQ7+Oh62Ji25W72jA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm] + os: [linux] + '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + '@img/sharp-linux-s390x@0.34.1': + resolution: {integrity: sha512-7s0KX2tI9mZI2buRipKIw2X1ufdTeaRgwmRabt5bi9chYfhur+/C1OXg3TKg/eag1W+6CCWLVmSauV1owmRPxA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [s390x] + os: [linux] + '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linux-x64@0.34.1': + resolution: {integrity: sha512-wExv7SH9nmoBW3Wr2gvQopX1k8q2g5V5Iag8Zk6AVENsjwd+3adjwxtp3Dcu2QhOXr8W9NusBU6XcQUohBZ5MA==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + '@img/sharp-linuxmusl-arm64@0.34.1': + resolution: {integrity: sha512-DfvyxzHxw4WGdPiTF0SOHnm11Xv4aQexvqhRDAoD00MzHekAj9a/jADXeXYCDFH/DzYruwHbXU7uz+H+nWmSOQ==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [arm64] + os: [linux] + '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + '@img/sharp-linuxmusl-x64@0.34.1': + resolution: {integrity: sha512-pax/kTR407vNb9qaSIiWVnQplPcGU8LRIJpDT5o8PdAx5aAA7AS3X9PS8Isw1/WfqgQorPotjrZL3Pqh6C5EBg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [linux] + '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [wasm32] + '@img/sharp-wasm32@0.34.1': + resolution: {integrity: sha512-YDybQnYrLQfEpzGOQe7OKcyLUCML4YOXl428gOOzBgN6Gw0rv8dpsJ7PqTHxBnXnwXr8S1mYFSLSa727tpz0xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [wasm32] + '@img/sharp-win32-ia32@0.33.5': resolution: {integrity: sha512-T36PblLaTwuVJ/zw/LaH0PdZkRz5rd3SmMHX8GSmR7vtNSP5Z6bQkExdSK7xGWyxLw4sUknBuugTelgw2faBbQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [ia32] os: [win32] + '@img/sharp-win32-ia32@0.34.1': + resolution: {integrity: sha512-WKf/NAZITnonBf3U1LfdjoMgNO5JYRSlhovhRhMxXVdvWYveM4kM3L8m35onYIdh75cOMCo1BexgVQcCDzyoWw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [ia32] + os: [win32] + '@img/sharp-win32-x64@0.33.5': resolution: {integrity: sha512-MpY/o8/8kj+EcnxwvrP4aTJSWw/aZ7JIGR4aBeZkZw5B7/Jn+tY9/VNwtcoGmdT7GfggGIU4kygOMSbYnOrAbg==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [win32] + '@img/sharp-win32-x64@0.34.1': + resolution: {integrity: sha512-hw1iIAHpNE8q3uMIRCgGOeDoz9KtFNarFLQclLxr/LK1VBkj8nby18RjFvr6aP7USRYAjTZW6yisnBWMX571Tw==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + cpu: [x64] + os: [win32] + '@isaacs/cliui@8.0.2': resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==} engines: {node: '>=12'} @@ -2434,11 +2544,11 @@ packages: dropcss@1.0.16: resolution: {integrity: sha512-QgA6BUh2SoBYE/dSuMmeGhNdoGtGewt3Rn66xKyXoGNyjrKRXf163wuM+xeQ83p87l/3ALoB6Il1dgKyGS5pEw==} - dts-buddy@0.5.5: - resolution: {integrity: sha512-Mu5PJuP7C+EqZIwDtW/bG1tVli1UFhRIyW/dERBVBYk28OviTkribu9S2LpDQ0HF2MbkqnjQIkbbE6HnepdNTQ==} + dts-buddy@0.6.1: + resolution: {integrity: sha512-orWBhQBo542LCSm1KS0isZ+uyB/yRVoSwcgRY+mmWZrXcbf8HrDiqUk9x1qUbiQbqdK41NSCIAHLb26eXz0z3w==} hasBin: true peerDependencies: - typescript: '>=5.0.4 <5.8' + typescript: '>=5.0.4 <5.9' e2e-test-dep-cjs-only@file:packages/kit/test/apps/dev-only/_test_dependencies/cjs-only: resolution: {directory: packages/kit/test/apps/dev-only/_test_dependencies/cjs-only, type: directory} @@ -2732,8 +2842,8 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} - imagetools-core@7.0.0: - resolution: {integrity: sha512-6fYbD7u4VIOt6fqKrOlbF77JXgUVyUmEJIPlfYVTuR/S2Ig9cX3gukGiLEU0aSetcfE7CYnhLTPtTEu4mLwhCw==} + imagetools-core@7.1.0: + resolution: {integrity: sha512-8Aa4NecBBGmTkaAUjcuRYgTPKHCsBEWYmCnvKCL6/bxedehtVVFyZPdXe8DD0Nevd6UWBq85ifUaJ8498lgqNQ==} engines: {node: '>=18.0.0'} import-fresh@3.3.0: @@ -3262,6 +3372,10 @@ packages: resolution: {integrity: sha512-haPVm1EkS9pgvHrQ/F3Xy+hgcuMV0Wm9vfIBSiwZ05k+xgb0PkBQpGsAA/oWdDobNaZTH5ppvHtzCFbnSEwHVw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + sharp@0.34.1: + resolution: {integrity: sha512-1j0w61+eVxu7DawFJtnfYcvSv6qPFvfTaqzTQ2BLknVhHTwGS8sc63ZBF4rzkWMBVKybo4S5OBtDdZahh2A1xg==} + engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} + shebang-command@2.0.0: resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} engines: {node: '>=8'} @@ -3552,8 +3666,8 @@ packages: engines: {node: '>=8'} hasBin: true - vite-imagetools@7.0.1: - resolution: {integrity: sha512-23jnLhkTH0HR9Vd9LxMYnajOLeo0RJNEAHhtlsQP6kfPuOBoTzt54rWbEWB9jmhEXAOflLQpM+FrmilVPAoyGA==} + vite-imagetools@7.1.0: + resolution: {integrity: sha512-Mqh1uUY2DEMuBOogFz5Rd7cAs70VP6wsdQh2IShrJ+qGk5f7yQa4pN8w0YMLlGIKYW1JfM8oXrznUwVkhG+qxg==} engines: {node: '>=18.0.0'} vite-node@3.1.1: @@ -3906,7 +4020,7 @@ snapshots: dependencies: '@jridgewell/trace-mapping': 0.3.9 - '@emnapi/runtime@1.2.0': + '@emnapi/runtime@1.4.3': dependencies: tslib: 2.6.2 optional: true @@ -4109,76 +4223,154 @@ snapshots: '@img/sharp-libvips-darwin-arm64': 1.0.4 optional: true + '@img/sharp-darwin-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-arm64': 1.1.0 + optional: true + '@img/sharp-darwin-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-darwin-x64': 1.0.4 optional: true + '@img/sharp-darwin-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-darwin-x64': 1.1.0 + optional: true + '@img/sharp-libvips-darwin-arm64@1.0.4': optional: true + '@img/sharp-libvips-darwin-arm64@1.1.0': + optional: true + '@img/sharp-libvips-darwin-x64@1.0.4': optional: true + '@img/sharp-libvips-darwin-x64@1.1.0': + optional: true + '@img/sharp-libvips-linux-arm64@1.0.4': optional: true + '@img/sharp-libvips-linux-arm64@1.1.0': + optional: true + '@img/sharp-libvips-linux-arm@1.0.5': optional: true + '@img/sharp-libvips-linux-arm@1.1.0': + optional: true + + '@img/sharp-libvips-linux-ppc64@1.1.0': + optional: true + '@img/sharp-libvips-linux-s390x@1.0.4': optional: true + '@img/sharp-libvips-linux-s390x@1.1.0': + optional: true + '@img/sharp-libvips-linux-x64@1.0.4': optional: true + '@img/sharp-libvips-linux-x64@1.1.0': + optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-arm64@1.1.0': + optional: true + '@img/sharp-libvips-linuxmusl-x64@1.0.4': optional: true + '@img/sharp-libvips-linuxmusl-x64@1.1.0': + optional: true + '@img/sharp-linux-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm64': 1.0.4 optional: true + '@img/sharp-linux-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm64': 1.1.0 + optional: true + '@img/sharp-linux-arm@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-arm': 1.0.5 optional: true + '@img/sharp-linux-arm@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-arm': 1.1.0 + optional: true + '@img/sharp-linux-s390x@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-s390x': 1.0.4 optional: true + '@img/sharp-linux-s390x@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-s390x': 1.1.0 + optional: true + '@img/sharp-linux-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linux-x64': 1.0.4 optional: true + '@img/sharp-linux-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linux-x64': 1.1.0 + optional: true + '@img/sharp-linuxmusl-arm64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-arm64': 1.0.4 optional: true + '@img/sharp-linuxmusl-arm64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + optional: true + '@img/sharp-linuxmusl-x64@0.33.5': optionalDependencies: '@img/sharp-libvips-linuxmusl-x64': 1.0.4 optional: true + '@img/sharp-linuxmusl-x64@0.34.1': + optionalDependencies: + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + optional: true + '@img/sharp-wasm32@0.33.5': dependencies: - '@emnapi/runtime': 1.2.0 + '@emnapi/runtime': 1.4.3 + optional: true + + '@img/sharp-wasm32@0.34.1': + dependencies: + '@emnapi/runtime': 1.4.3 optional: true '@img/sharp-win32-ia32@0.33.5': optional: true + '@img/sharp-win32-ia32@0.34.1': + optional: true + '@img/sharp-win32-x64@0.33.5': optional: true + '@img/sharp-win32-x64@0.34.1': + optional: true + '@isaacs/cliui@8.0.2': dependencies: string-width: 5.1.2 @@ -4824,7 +5016,7 @@ snapshots: dropcss@1.0.16: {} - dts-buddy@0.5.5(typescript@5.6.3): + dts-buddy@0.6.1(typescript@5.6.3): dependencies: '@jridgewell/source-map': 0.3.6 '@jridgewell/sourcemap-codec': 1.5.0 @@ -5213,9 +5405,7 @@ snapshots: ignore@5.3.2: {} - imagetools-core@7.0.0: - dependencies: - sharp: 0.33.5 + imagetools-core@7.1.0: {} import-fresh@3.3.0: dependencies: @@ -5683,6 +5873,34 @@ snapshots: '@img/sharp-wasm32': 0.33.5 '@img/sharp-win32-ia32': 0.33.5 '@img/sharp-win32-x64': 0.33.5 + optional: true + + sharp@0.34.1: + dependencies: + color: 4.2.3 + detect-libc: 2.0.3 + semver: 7.7.1 + optionalDependencies: + '@img/sharp-darwin-arm64': 0.34.1 + '@img/sharp-darwin-x64': 0.34.1 + '@img/sharp-libvips-darwin-arm64': 1.1.0 + '@img/sharp-libvips-darwin-x64': 1.1.0 + '@img/sharp-libvips-linux-arm': 1.1.0 + '@img/sharp-libvips-linux-arm64': 1.1.0 + '@img/sharp-libvips-linux-ppc64': 1.1.0 + '@img/sharp-libvips-linux-s390x': 1.1.0 + '@img/sharp-libvips-linux-x64': 1.1.0 + '@img/sharp-libvips-linuxmusl-arm64': 1.1.0 + '@img/sharp-libvips-linuxmusl-x64': 1.1.0 + '@img/sharp-linux-arm': 0.34.1 + '@img/sharp-linux-arm64': 0.34.1 + '@img/sharp-linux-s390x': 0.34.1 + '@img/sharp-linux-x64': 0.34.1 + '@img/sharp-linuxmusl-arm64': 0.34.1 + '@img/sharp-linuxmusl-x64': 0.34.1 + '@img/sharp-wasm32': 0.34.1 + '@img/sharp-win32-ia32': 0.34.1 + '@img/sharp-win32-x64': 0.34.1 shebang-command@2.0.0: dependencies: @@ -5945,10 +6163,11 @@ snapshots: kleur: 4.1.5 sade: 1.8.1 - vite-imagetools@7.0.1(rollup@4.40.1): + vite-imagetools@7.1.0(rollup@4.40.1): dependencies: '@rollup/pluginutils': 5.1.3(rollup@4.40.1) - imagetools-core: 7.0.0 + imagetools-core: 7.1.0 + sharp: 0.34.1 transitivePeerDependencies: - rollup From 259a2f3840055dbaf4f4c24d388c620b20a1cbe9 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 7 May 2025 11:21:12 -0700 Subject: [PATCH 1064/1135] chore: update wrangler (#13773) --- .changeset/heavy-roses-grab.md | 2 +- .changeset/odd-ants-sneeze.md | 5 + packages/adapter-cloudflare/package.json | 4 +- .../test/apps/pages/package.json | 2 +- .../test/apps/workers/package.json | 2 +- packages/adapter-netlify/package.json | 2 +- packages/adapter-vercel/package.json | 2 +- pnpm-lock.yaml | 574 +++++------------- 8 files changed, 170 insertions(+), 423 deletions(-) create mode 100644 .changeset/odd-ants-sneeze.md diff --git a/.changeset/heavy-roses-grab.md b/.changeset/heavy-roses-grab.md index d895d3acb509..0ea639f591c3 100644 --- a/.changeset/heavy-roses-grab.md +++ b/.changeset/heavy-roses-grab.md @@ -3,4 +3,4 @@ '@sveltejs/adapter-vercel': patch --- -chore(deps): upgrade to esbuild 0.25.3 +chore(deps): upgrade to esbuild 0.25.4 diff --git a/.changeset/odd-ants-sneeze.md b/.changeset/odd-ants-sneeze.md new file mode 100644 index 000000000000..9e876a183bf8 --- /dev/null +++ b/.changeset/odd-ants-sneeze.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +chore(deps): upgrade @cloudflare/workers-types to 4.20250507.0 diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index ddbd8f9817b2..f6af1ae55bc0 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -41,14 +41,14 @@ "test": "pnpm build && pnpm -r --workspace-concurrency 1 --filter=\"./test/**\" test" }, "dependencies": { - "@cloudflare/workers-types": "^4.20250415.0", + "@cloudflare/workers-types": "^4.20250507.0", "worktop": "0.8.0-next.18" }, "devDependencies": { "@playwright/test": "catalog:", "@sveltejs/kit": "workspace:^", "@types/node": "^18.19.48", - "esbuild": "^0.25.3", + "esbuild": "^0.25.4", "typescript": "^5.3.3" }, "peerDependencies": { diff --git a/packages/adapter-cloudflare/test/apps/pages/package.json b/packages/adapter-cloudflare/test/apps/pages/package.json index 051c727d2cd5..8cce449f3334 100644 --- a/packages/adapter-cloudflare/test/apps/pages/package.json +++ b/packages/adapter-cloudflare/test/apps/pages/package.json @@ -15,7 +15,7 @@ "server-side-dep": "file:server-side-dep", "svelte": "^5.23.1", "vite": "^6.2.7", - "wrangler": "^4.11.0" + "wrangler": "^4.14.3" }, "type": "module" } diff --git a/packages/adapter-cloudflare/test/apps/workers/package.json b/packages/adapter-cloudflare/test/apps/workers/package.json index a776dab0f2c4..289888436f92 100644 --- a/packages/adapter-cloudflare/test/apps/workers/package.json +++ b/packages/adapter-cloudflare/test/apps/workers/package.json @@ -15,7 +15,7 @@ "server-side-dep": "file:server-side-dep", "svelte": "^5.23.1", "vite": "^6.2.7", - "wrangler": "^4.11.0" + "wrangler": "^4.14.3" }, "type": "module" } diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index 34701bbbdfa8..dacad679dd05 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -42,7 +42,7 @@ }, "dependencies": { "@iarna/toml": "^2.2.5", - "esbuild": "^0.25.3", + "esbuild": "^0.25.4", "set-cookie-parser": "^2.6.0" }, "devDependencies": { diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 235311573e64..66d866723e69 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -41,7 +41,7 @@ }, "dependencies": { "@vercel/nft": "^0.29.2", - "esbuild": "^0.25.3" + "esbuild": "^0.25.4" }, "devDependencies": { "@sveltejs/kit": "workspace:^", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 22586d107e08..66b2ee320fb1 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -64,14 +64,14 @@ importers: packages/adapter-cloudflare: dependencies: '@cloudflare/workers-types': - specifier: ^4.20250415.0 - version: 4.20250415.0 + specifier: ^4.20250507.0 + version: 4.20250507.0 worktop: specifier: 0.8.0-next.18 version: 0.8.0-next.18 wrangler: specifier: ^4.0.0 - version: 4.11.0(@cloudflare/workers-types@4.20250415.0) + version: 4.14.3(@cloudflare/workers-types@4.20250507.0) devDependencies: '@playwright/test': specifier: 'catalog:' @@ -83,8 +83,8 @@ importers: specifier: ^18.19.48 version: 18.19.50 esbuild: - specifier: ^0.25.3 - version: 0.25.3 + specifier: ^0.25.4 + version: 0.25.4 typescript: specifier: ^5.3.3 version: 5.6.3 @@ -107,8 +107,8 @@ importers: specifier: ^6.2.7 version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) wrangler: - specifier: ^4.11.0 - version: 4.11.0(@cloudflare/workers-types@4.20250415.0) + specifier: ^4.14.3 + version: 4.14.3(@cloudflare/workers-types@4.20250507.0) packages/adapter-cloudflare/test/apps/workers: devDependencies: @@ -128,8 +128,8 @@ importers: specifier: ^6.2.7 version: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) wrangler: - specifier: ^4.11.0 - version: 4.11.0(@cloudflare/workers-types@4.20250415.0) + specifier: ^4.14.3 + version: 4.14.3(@cloudflare/workers-types@4.20250507.0) packages/adapter-netlify: dependencies: @@ -137,8 +137,8 @@ importers: specifier: ^2.2.5 version: 2.2.5 esbuild: - specifier: ^0.25.3 - version: 0.25.3 + specifier: ^0.25.4 + version: 0.25.4 set-cookie-parser: specifier: ^2.6.0 version: 2.6.0 @@ -289,8 +289,8 @@ importers: specifier: ^0.29.2 version: 0.29.2(rollup@4.40.1) esbuild: - specifier: ^0.25.3 - version: 0.25.3 + specifier: ^0.25.4 + version: 0.25.4 devDependencies: '@sveltejs/kit': specifier: workspace:^ @@ -1287,38 +1287,38 @@ packages: workerd: optional: true - '@cloudflare/workerd-darwin-64@1.20250410.0': - resolution: {integrity: sha512-U3Pb+pr6DYeESXGiDAS/SKTVBoDA/BbFyiTTi4BJSdk2I703vaDJGH4k1jFsOJmb/S+Gy7w5xVJwHgZA7w6Kaw==} + '@cloudflare/workerd-darwin-64@1.20250507.0': + resolution: {integrity: sha512-xC+8hmQuOUUNCVT9DWpLMfxhR4Xs4kI8v7Bkybh4pzGC85moH6fMfCBNaP0YQCNAA/BR56aL/AwfvMVGskTK/A==} engines: {node: '>=16'} cpu: [x64] os: [darwin] - '@cloudflare/workerd-darwin-arm64@1.20250410.0': - resolution: {integrity: sha512-stvgUOVDXGBdV1HTEdgcQ/d/c9T4Vrmg+8OJK4HXn6uM1spMediyQXed64greG0I5rNJ0pTPq0uZsfCjn9T7cA==} + '@cloudflare/workerd-darwin-arm64@1.20250507.0': + resolution: {integrity: sha512-Oynff5H8yM4trfUFaKdkOvPV3jac8mg7QC19ILZluCVgLx/JGEVLEJ7do1Na9rLqV8CK4gmUXPrUMX7uerhQgg==} engines: {node: '>=16'} cpu: [arm64] os: [darwin] - '@cloudflare/workerd-linux-64@1.20250410.0': - resolution: {integrity: sha512-n7BRelPUc7+UNVKlS7z/uhI6xqsoyoZayjrezLcZ54IY4o9XASt4oc4kFDrc5ow9YNW94sq2tBG8z/ZQ9wBjLA==} + '@cloudflare/workerd-linux-64@1.20250507.0': + resolution: {integrity: sha512-/HAA+Zg/R7Q/Smyl835FUFKjotZN1UzN9j/BHBd0xKmKov97QkXAX8gsyGnyKqRReIOinp8x/8+UebTICR7VJw==} engines: {node: '>=16'} cpu: [x64] os: [linux] - '@cloudflare/workerd-linux-arm64@1.20250410.0': - resolution: {integrity: sha512-R9zE5LhVQCgIPIB/LWSt+XqFjzkPRfkLk4pqae8OYhMg0Dr3G7xO/xNxIabCVNPHhF7dj2yXfMyLGX603Y8/LQ==} + '@cloudflare/workerd-linux-arm64@1.20250507.0': + resolution: {integrity: sha512-NMPibSdOYeycU0IrKkgOESFJQy7dEpHvuatZxQxlT+mIQK0INzI3irp2kKxhF99s25kPC4p+xg9bU3ugTrs3VQ==} engines: {node: '>=16'} cpu: [arm64] os: [linux] - '@cloudflare/workerd-windows-64@1.20250410.0': - resolution: {integrity: sha512-UcoQ2u+TQcKNEQUXBRsoqfXibOCklCilukN5xxz7svuAi1f2P0/lR29iuq6DBEwDu/GqQd6H5WLrczXwfPLZsQ==} + '@cloudflare/workerd-windows-64@1.20250507.0': + resolution: {integrity: sha512-c91fhNP8ufycdIDqjVyKTqeb4ewkbAYXFQbLreMVgh4LLQQPDDEte8wCdmaFy5bIL0M9d85PpdCq51RCzq/FaQ==} engines: {node: '>=16'} cpu: [x64] os: [win32] - '@cloudflare/workers-types@4.20250415.0': - resolution: {integrity: sha512-6N3N7yZEBVhztPUcloHSMm5+kSY0/e1OtoPjNrI5Jw8dyFTNSf875u0D76YFiYCV8WVwbp3RtdEAb6TWdAwoEw==} + '@cloudflare/workers-types@4.20250507.0': + resolution: {integrity: sha512-fkrq7A6XWgPEmXJDwu9TS/Zw7qho3eGlrOlicKue32Bdul0Ma4Mym4sh7ZeGbayBXxkOx/fHpm5GfhVEtngRWQ==} '@cspotcode/source-map-support@0.8.1': resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} @@ -1327,302 +1327,152 @@ packages: '@emnapi/runtime@1.4.3': resolution: {integrity: sha512-pBPWdu6MLKROBX05wSNKcNb++m5Er+KQ9QkB+WVM+pW2Kx9hoSrVTnu3BdkI5eBLZoKu/J6mW/B6i6bJB2ytXQ==} - '@esbuild/aix-ppc64@0.25.2': - resolution: {integrity: sha512-wCIboOL2yXZym2cgm6mlA742s9QeJ8DjGVaL39dLN4rRwrOgOyYSnOaFPhKZGLb2ngj4EyfAFjsNJwPXZvseag==} + '@esbuild/aix-ppc64@0.25.4': + resolution: {integrity: sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==} engines: {node: '>=18'} cpu: [ppc64] os: [aix] - '@esbuild/aix-ppc64@0.25.3': - resolution: {integrity: sha512-W8bFfPA8DowP8l//sxjJLSLkD8iEjMc7cBVyP+u4cEv9sM7mdUCkgsj+t0n/BWPFtv7WWCN5Yzj0N6FJNUUqBQ==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [aix] - - '@esbuild/android-arm64@0.25.2': - resolution: {integrity: sha512-5ZAX5xOmTligeBaeNEPnPaeEuah53Id2tX4c2CVP3JaROTH+j4fnfHCkr1PjXMd78hMst+TlkfKcW/DlTq0i4w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [android] - - '@esbuild/android-arm64@0.25.3': - resolution: {integrity: sha512-XelR6MzjlZuBM4f5z2IQHK6LkK34Cvv6Rj2EntER3lwCBFdg6h2lKbtRjpTTsdEjD/WSe1q8UyPBXP1x3i/wYQ==} + '@esbuild/android-arm64@0.25.4': + resolution: {integrity: sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==} engines: {node: '>=18'} cpu: [arm64] os: [android] - '@esbuild/android-arm@0.25.2': - resolution: {integrity: sha512-NQhH7jFstVY5x8CKbcfa166GoV0EFkaPkCKBQkdPJFvo5u+nGXLEH/ooniLb3QI8Fk58YAx7nsPLozUWfCBOJA==} - engines: {node: '>=18'} - cpu: [arm] - os: [android] - - '@esbuild/android-arm@0.25.3': - resolution: {integrity: sha512-PuwVXbnP87Tcff5I9ngV0lmiSu40xw1At6i3GsU77U7cjDDB4s0X2cyFuBiDa1SBk9DnvWwnGvVaGBqoFWPb7A==} + '@esbuild/android-arm@0.25.4': + resolution: {integrity: sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==} engines: {node: '>=18'} cpu: [arm] os: [android] - '@esbuild/android-x64@0.25.2': - resolution: {integrity: sha512-Ffcx+nnma8Sge4jzddPHCZVRvIfQ0kMsUsCMcJRHkGJ1cDmhe4SsrYIjLUKn1xpHZybmOqCWwB0zQvsjdEHtkg==} - engines: {node: '>=18'} - cpu: [x64] - os: [android] - - '@esbuild/android-x64@0.25.3': - resolution: {integrity: sha512-ogtTpYHT/g1GWS/zKM0cc/tIebFjm1F9Aw1boQ2Y0eUQ+J89d0jFY//s9ei9jVIlkYi8AfOjiixcLJSGNSOAdQ==} + '@esbuild/android-x64@0.25.4': + resolution: {integrity: sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==} engines: {node: '>=18'} cpu: [x64] os: [android] - '@esbuild/darwin-arm64@0.25.2': - resolution: {integrity: sha512-MpM6LUVTXAzOvN4KbjzU/q5smzryuoNjlriAIx+06RpecwCkL9JpenNzpKd2YMzLJFOdPqBpuub6eVRP5IgiSA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [darwin] - - '@esbuild/darwin-arm64@0.25.3': - resolution: {integrity: sha512-eESK5yfPNTqpAmDfFWNsOhmIOaQA59tAcF/EfYvo5/QWQCzXn5iUSOnqt3ra3UdzBv073ykTtmeLJZGt3HhA+w==} + '@esbuild/darwin-arm64@0.25.4': + resolution: {integrity: sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==} engines: {node: '>=18'} cpu: [arm64] os: [darwin] - '@esbuild/darwin-x64@0.25.2': - resolution: {integrity: sha512-5eRPrTX7wFyuWe8FqEFPG2cU0+butQQVNcT4sVipqjLYQjjh8a8+vUTfgBKM88ObB85ahsnTwF7PSIt6PG+QkA==} + '@esbuild/darwin-x64@0.25.4': + resolution: {integrity: sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==} engines: {node: '>=18'} cpu: [x64] os: [darwin] - '@esbuild/darwin-x64@0.25.3': - resolution: {integrity: sha512-Kd8glo7sIZtwOLcPbW0yLpKmBNWMANZhrC1r6K++uDR2zyzb6AeOYtI6udbtabmQpFaxJ8uduXMAo1gs5ozz8A==} - engines: {node: '>=18'} - cpu: [x64] - os: [darwin] - - '@esbuild/freebsd-arm64@0.25.2': - resolution: {integrity: sha512-mLwm4vXKiQ2UTSX4+ImyiPdiHjiZhIaE9QvC7sw0tZ6HoNMjYAqQpGyui5VRIi5sGd+uWq940gdCbY3VLvsO1w==} - engines: {node: '>=18'} - cpu: [arm64] - os: [freebsd] - - '@esbuild/freebsd-arm64@0.25.3': - resolution: {integrity: sha512-EJiyS70BYybOBpJth3M0KLOus0n+RRMKTYzhYhFeMwp7e/RaajXvP+BWlmEXNk6uk+KAu46j/kaQzr6au+JcIw==} + '@esbuild/freebsd-arm64@0.25.4': + resolution: {integrity: sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==} engines: {node: '>=18'} cpu: [arm64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.2': - resolution: {integrity: sha512-6qyyn6TjayJSwGpm8J9QYYGQcRgc90nmfdUb0O7pp1s4lTY+9D0H9O02v5JqGApUyiHOtkz6+1hZNvNtEhbwRQ==} + '@esbuild/freebsd-x64@0.25.4': + resolution: {integrity: sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==} engines: {node: '>=18'} cpu: [x64] os: [freebsd] - '@esbuild/freebsd-x64@0.25.3': - resolution: {integrity: sha512-Q+wSjaLpGxYf7zC0kL0nDlhsfuFkoN+EXrx2KSB33RhinWzejOd6AvgmP5JbkgXKmjhmpfgKZq24pneodYqE8Q==} - engines: {node: '>=18'} - cpu: [x64] - os: [freebsd] - - '@esbuild/linux-arm64@0.25.2': - resolution: {integrity: sha512-gq/sjLsOyMT19I8obBISvhoYiZIAaGF8JpeXu1u8yPv8BE5HlWYobmlsfijFIZ9hIVGYkbdFhEqC0NvM4kNO0g==} + '@esbuild/linux-arm64@0.25.4': + resolution: {integrity: sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==} engines: {node: '>=18'} cpu: [arm64] os: [linux] - '@esbuild/linux-arm64@0.25.3': - resolution: {integrity: sha512-xCUgnNYhRD5bb1C1nqrDV1PfkwgbswTTBRbAd8aH5PhYzikdf/ddtsYyMXFfGSsb/6t6QaPSzxtbfAZr9uox4A==} - engines: {node: '>=18'} - cpu: [arm64] - os: [linux] - - '@esbuild/linux-arm@0.25.2': - resolution: {integrity: sha512-UHBRgJcmjJv5oeQF8EpTRZs/1knq6loLxTsjc3nxO9eXAPDLcWW55flrMVc97qFPbmZP31ta1AZVUKQzKTzb0g==} + '@esbuild/linux-arm@0.25.4': + resolution: {integrity: sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==} engines: {node: '>=18'} cpu: [arm] os: [linux] - '@esbuild/linux-arm@0.25.3': - resolution: {integrity: sha512-dUOVmAUzuHy2ZOKIHIKHCm58HKzFqd+puLaS424h6I85GlSDRZIA5ycBixb3mFgM0Jdh+ZOSB6KptX30DD8YOQ==} - engines: {node: '>=18'} - cpu: [arm] - os: [linux] - - '@esbuild/linux-ia32@0.25.2': - resolution: {integrity: sha512-bBYCv9obgW2cBP+2ZWfjYTU+f5cxRoGGQ5SeDbYdFCAZpYWrfjjfYwvUpP8MlKbP0nwZ5gyOU/0aUzZ5HWPuvQ==} - engines: {node: '>=18'} - cpu: [ia32] - os: [linux] - - '@esbuild/linux-ia32@0.25.3': - resolution: {integrity: sha512-yplPOpczHOO4jTYKmuYuANI3WhvIPSVANGcNUeMlxH4twz/TeXuzEP41tGKNGWJjuMhotpGabeFYGAOU2ummBw==} + '@esbuild/linux-ia32@0.25.4': + resolution: {integrity: sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==} engines: {node: '>=18'} cpu: [ia32] os: [linux] - '@esbuild/linux-loong64@0.25.2': - resolution: {integrity: sha512-SHNGiKtvnU2dBlM5D8CXRFdd+6etgZ9dXfaPCeJtz+37PIUlixvlIhI23L5khKXs3DIzAn9V8v+qb1TRKrgT5w==} + '@esbuild/linux-loong64@0.25.4': + resolution: {integrity: sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==} engines: {node: '>=18'} cpu: [loong64] os: [linux] - '@esbuild/linux-loong64@0.25.3': - resolution: {integrity: sha512-P4BLP5/fjyihmXCELRGrLd793q/lBtKMQl8ARGpDxgzgIKJDRJ/u4r1A/HgpBpKpKZelGct2PGI4T+axcedf6g==} - engines: {node: '>=18'} - cpu: [loong64] - os: [linux] - - '@esbuild/linux-mips64el@0.25.2': - resolution: {integrity: sha512-hDDRlzE6rPeoj+5fsADqdUZl1OzqDYow4TB4Y/3PlKBD0ph1e6uPHzIQcv2Z65u2K0kpeByIyAjCmjn1hJgG0Q==} + '@esbuild/linux-mips64el@0.25.4': + resolution: {integrity: sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==} engines: {node: '>=18'} cpu: [mips64el] os: [linux] - '@esbuild/linux-mips64el@0.25.3': - resolution: {integrity: sha512-eRAOV2ODpu6P5divMEMa26RRqb2yUoYsuQQOuFUexUoQndm4MdpXXDBbUoKIc0iPa4aCO7gIhtnYomkn2x+bag==} - engines: {node: '>=18'} - cpu: [mips64el] - os: [linux] - - '@esbuild/linux-ppc64@0.25.2': - resolution: {integrity: sha512-tsHu2RRSWzipmUi9UBDEzc0nLc4HtpZEI5Ba+Omms5456x5WaNuiG3u7xh5AO6sipnJ9r4cRWQB2tUjPyIkc6g==} + '@esbuild/linux-ppc64@0.25.4': + resolution: {integrity: sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==} engines: {node: '>=18'} cpu: [ppc64] os: [linux] - '@esbuild/linux-ppc64@0.25.3': - resolution: {integrity: sha512-ZC4jV2p7VbzTlnl8nZKLcBkfzIf4Yad1SJM4ZMKYnJqZFD4rTI+pBG65u8ev4jk3/MPwY9DvGn50wi3uhdaghg==} - engines: {node: '>=18'} - cpu: [ppc64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.2': - resolution: {integrity: sha512-k4LtpgV7NJQOml/10uPU0s4SAXGnowi5qBSjaLWMojNCUICNu7TshqHLAEbkBdAszL5TabfvQ48kK84hyFzjnw==} - engines: {node: '>=18'} - cpu: [riscv64] - os: [linux] - - '@esbuild/linux-riscv64@0.25.3': - resolution: {integrity: sha512-LDDODcFzNtECTrUUbVCs6j9/bDVqy7DDRsuIXJg6so+mFksgwG7ZVnTruYi5V+z3eE5y+BJZw7VvUadkbfg7QA==} + '@esbuild/linux-riscv64@0.25.4': + resolution: {integrity: sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==} engines: {node: '>=18'} cpu: [riscv64] os: [linux] - '@esbuild/linux-s390x@0.25.2': - resolution: {integrity: sha512-GRa4IshOdvKY7M/rDpRR3gkiTNp34M0eLTaC1a08gNrh4u488aPhuZOCpkF6+2wl3zAN7L7XIpOFBhnaE3/Q8Q==} - engines: {node: '>=18'} - cpu: [s390x] - os: [linux] - - '@esbuild/linux-s390x@0.25.3': - resolution: {integrity: sha512-s+w/NOY2k0yC2p9SLen+ymflgcpRkvwwa02fqmAwhBRI3SC12uiS10edHHXlVWwfAagYSY5UpmT/zISXPMW3tQ==} + '@esbuild/linux-s390x@0.25.4': + resolution: {integrity: sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==} engines: {node: '>=18'} cpu: [s390x] os: [linux] - '@esbuild/linux-x64@0.25.2': - resolution: {integrity: sha512-QInHERlqpTTZ4FRB0fROQWXcYRD64lAoiegezDunLpalZMjcUcld3YzZmVJ2H/Cp0wJRZ8Xtjtj0cEHhYc/uUg==} - engines: {node: '>=18'} - cpu: [x64] - os: [linux] - - '@esbuild/linux-x64@0.25.3': - resolution: {integrity: sha512-nQHDz4pXjSDC6UfOE1Fw9Q8d6GCAd9KdvMZpfVGWSJztYCarRgSDfOVBY5xwhQXseiyxapkiSJi/5/ja8mRFFA==} + '@esbuild/linux-x64@0.25.4': + resolution: {integrity: sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==} engines: {node: '>=18'} cpu: [x64] os: [linux] - '@esbuild/netbsd-arm64@0.25.2': - resolution: {integrity: sha512-talAIBoY5M8vHc6EeI2WW9d/CkiO9MQJ0IOWX8hrLhxGbro/vBXJvaQXefW2cP0z0nQVTdQ/eNyGFV1GSKrxfw==} + '@esbuild/netbsd-arm64@0.25.4': + resolution: {integrity: sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==} engines: {node: '>=18'} cpu: [arm64] os: [netbsd] - '@esbuild/netbsd-arm64@0.25.3': - resolution: {integrity: sha512-1QaLtOWq0mzK6tzzp0jRN3eccmN3hezey7mhLnzC6oNlJoUJz4nym5ZD7mDnS/LZQgkrhEbEiTn515lPeLpgWA==} - engines: {node: '>=18'} - cpu: [arm64] - os: [netbsd] - - '@esbuild/netbsd-x64@0.25.2': - resolution: {integrity: sha512-voZT9Z+tpOxrvfKFyfDYPc4DO4rk06qamv1a/fkuzHpiVBMOhpjK+vBmWM8J1eiB3OLSMFYNaOaBNLXGChf5tg==} + '@esbuild/netbsd-x64@0.25.4': + resolution: {integrity: sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==} engines: {node: '>=18'} cpu: [x64] os: [netbsd] - '@esbuild/netbsd-x64@0.25.3': - resolution: {integrity: sha512-i5Hm68HXHdgv8wkrt+10Bc50zM0/eonPb/a/OFVfB6Qvpiirco5gBA5bz7S2SHuU+Y4LWn/zehzNX14Sp4r27g==} - engines: {node: '>=18'} - cpu: [x64] - os: [netbsd] - - '@esbuild/openbsd-arm64@0.25.2': - resolution: {integrity: sha512-dcXYOC6NXOqcykeDlwId9kB6OkPUxOEqU+rkrYVqJbK2hagWOMrsTGsMr8+rW02M+d5Op5NNlgMmjzecaRf7Tg==} - engines: {node: '>=18'} - cpu: [arm64] - os: [openbsd] - - '@esbuild/openbsd-arm64@0.25.3': - resolution: {integrity: sha512-zGAVApJEYTbOC6H/3QBr2mq3upG/LBEXr85/pTtKiv2IXcgKV0RT0QA/hSXZqSvLEpXeIxah7LczB4lkiYhTAQ==} + '@esbuild/openbsd-arm64@0.25.4': + resolution: {integrity: sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==} engines: {node: '>=18'} cpu: [arm64] os: [openbsd] - '@esbuild/openbsd-x64@0.25.2': - resolution: {integrity: sha512-t/TkWwahkH0Tsgoq1Ju7QfgGhArkGLkF1uYz8nQS/PPFlXbP5YgRpqQR3ARRiC2iXoLTWFxc6DJMSK10dVXluw==} - engines: {node: '>=18'} - cpu: [x64] - os: [openbsd] - - '@esbuild/openbsd-x64@0.25.3': - resolution: {integrity: sha512-fpqctI45NnCIDKBH5AXQBsD0NDPbEFczK98hk/aa6HJxbl+UtLkJV2+Bvy5hLSLk3LHmqt0NTkKNso1A9y1a4w==} + '@esbuild/openbsd-x64@0.25.4': + resolution: {integrity: sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==} engines: {node: '>=18'} cpu: [x64] os: [openbsd] - '@esbuild/sunos-x64@0.25.2': - resolution: {integrity: sha512-cfZH1co2+imVdWCjd+D1gf9NjkchVhhdpgb1q5y6Hcv9TP6Zi9ZG/beI3ig8TvwT9lH9dlxLq5MQBBgwuj4xvA==} - engines: {node: '>=18'} - cpu: [x64] - os: [sunos] - - '@esbuild/sunos-x64@0.25.3': - resolution: {integrity: sha512-ROJhm7d8bk9dMCUZjkS8fgzsPAZEjtRJqCAmVgB0gMrvG7hfmPmz9k1rwO4jSiblFjYmNvbECL9uhaPzONMfgA==} + '@esbuild/sunos-x64@0.25.4': + resolution: {integrity: sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==} engines: {node: '>=18'} cpu: [x64] os: [sunos] - '@esbuild/win32-arm64@0.25.2': - resolution: {integrity: sha512-7Loyjh+D/Nx/sOTzV8vfbB3GJuHdOQyrOryFdZvPHLf42Tk9ivBU5Aedi7iyX+x6rbn2Mh68T4qq1SDqJBQO5Q==} - engines: {node: '>=18'} - cpu: [arm64] - os: [win32] - - '@esbuild/win32-arm64@0.25.3': - resolution: {integrity: sha512-YWcow8peiHpNBiIXHwaswPnAXLsLVygFwCB3A7Bh5jRkIBFWHGmNQ48AlX4xDvQNoMZlPYzjVOQDYEzWCqufMQ==} + '@esbuild/win32-arm64@0.25.4': + resolution: {integrity: sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==} engines: {node: '>=18'} cpu: [arm64] os: [win32] - '@esbuild/win32-ia32@0.25.2': - resolution: {integrity: sha512-WRJgsz9un0nqZJ4MfhabxaD9Ft8KioqU3JMinOTvobbX6MOSUigSBlogP8QB3uxpJDsFS6yN+3FDBdqE5lg9kg==} + '@esbuild/win32-ia32@0.25.4': + resolution: {integrity: sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==} engines: {node: '>=18'} cpu: [ia32] os: [win32] - '@esbuild/win32-ia32@0.25.3': - resolution: {integrity: sha512-qspTZOIGoXVS4DpNqUYUs9UxVb04khS1Degaw/MnfMe7goQ3lTfQ13Vw4qY/Nj0979BGvMRpAYbs/BAxEvU8ew==} - engines: {node: '>=18'} - cpu: [ia32] - os: [win32] - - '@esbuild/win32-x64@0.25.2': - resolution: {integrity: sha512-kM3HKb16VIXZyIeVrM1ygYmZBKybX8N4p754bw390wGO3Tf2j4L2/WYL+4suWujpgf6GBYs3jv7TyUivdd05JA==} - engines: {node: '>=18'} - cpu: [x64] - os: [win32] - - '@esbuild/win32-x64@0.25.3': - resolution: {integrity: sha512-ICgUR+kPimx0vvRzf+N/7L7tVSQeE3BYY+NhHRHXS1kBuPO7z2+7ea2HbhDyZdTephgvNvKrlDDKUexuCVBVvg==} + '@esbuild/win32-x64@0.25.4': + resolution: {integrity: sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==} engines: {node: '>=18'} cpu: [x64] os: [win32] @@ -2573,13 +2423,8 @@ packages: es-module-lexer@1.6.0: resolution: {integrity: sha512-qqnD1yMU6tk/jnaMosogGySTZP8YtUgAffA9nMN+E/rjxcfRQ6IEk7IiozUjgxKoFHBGjTLnrHB/YC45r/59EQ==} - esbuild@0.25.2: - resolution: {integrity: sha512-16854zccKPnC+toMywC+uKNeYSv+/eXkevRAfwRD/G9Cleq66m8XFIrigkbvauLLlCfDL45Q2cWegSg53gGBnQ==} - engines: {node: '>=18'} - hasBin: true - - esbuild@0.25.3: - resolution: {integrity: sha512-qKA6Pvai73+M2FtftpNKRxJ78GIjmFXFxd/1DVBqGo/qNhLSfv+G12n9pNoWdytJC8U00TrViOwpjT0zgqQS8Q==} + esbuild@0.25.4: + resolution: {integrity: sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==} engines: {node: '>=18'} hasBin: true @@ -3052,8 +2897,8 @@ packages: resolution: {integrity: sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==} engines: {node: '>=4'} - miniflare@4.20250410.0: - resolution: {integrity: sha512-vvbVssljSZathZ0gYQknXW4g/Oye/jAYlQStnbW+8Sa3BnF0u+vhP3MaCGea/OlC9+FsD/2HUwVnb56Tof9UZA==} + miniflare@4.20250507.0: + resolution: {integrity: sha512-EgbQRt/Hnr8HCmW2J/4LRNE3yOzJTdNd98XJ8gnGXFKcimXxUFPiWP3k1df+ZPCtEHp6cXxi8+jP7v9vuIbIsg==} engines: {node: '>=18.0.0'} hasBin: true @@ -3767,8 +3612,8 @@ packages: engines: {node: '>=8'} hasBin: true - workerd@1.20250410.0: - resolution: {integrity: sha512-W7vy1+Z3+jpLr68nmda3VFapn284VwIb22TZlI1LbCvThAiNABIa/t06bTE9mohSjUudFou9rc9de49fUvrUDQ==} + workerd@1.20250507.0: + resolution: {integrity: sha512-OXaGjEh5THT9iblwWIyPrYBoaPe/d4zN03Go7/w8CmS8sma7//O9hjbk43sboWkc89taGPmU0/LNyZUUiUlHeQ==} engines: {node: '>=16'} hasBin: true @@ -3776,12 +3621,12 @@ packages: resolution: {integrity: sha512-+TvsA6VAVoMC3XDKR5MoC/qlLqDixEfOBysDEKnPIPou/NvoPWCAuXHXMsswwlvmEuvX56lQjvELLyLuzTKvRw==} engines: {node: '>=12'} - wrangler@4.11.0: - resolution: {integrity: sha512-P9jyp1wDUmspi9sRMQG16TyeiN8IP7pLkfeknRkqm/3AwkD8L32AvgqDYqk/jZhI+eIGAzue5h1JX6jILX2qBQ==} + wrangler@4.14.3: + resolution: {integrity: sha512-gY2n3cC8yb8VyaM0aY9fXX5AIah+VkGefmAHltUBgVpJaM4QXun6O85BydtTEljLL67JTyFyBDn/UPyg2WhESQ==} engines: {node: '>=18.0.0'} hasBin: true peerDependencies: - '@cloudflare/workers-types': ^4.20250410.0 + '@cloudflare/workers-types': ^4.20250507.0 peerDependenciesMeta: '@cloudflare/workers-types': optional: true @@ -3993,28 +3838,28 @@ snapshots: dependencies: mime: 3.0.0 - '@cloudflare/unenv-preset@2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250410.0)': + '@cloudflare/unenv-preset@2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250507.0)': dependencies: unenv: 2.0.0-rc.15 optionalDependencies: - workerd: 1.20250410.0 + workerd: 1.20250507.0 - '@cloudflare/workerd-darwin-64@1.20250410.0': + '@cloudflare/workerd-darwin-64@1.20250507.0': optional: true - '@cloudflare/workerd-darwin-arm64@1.20250410.0': + '@cloudflare/workerd-darwin-arm64@1.20250507.0': optional: true - '@cloudflare/workerd-linux-64@1.20250410.0': + '@cloudflare/workerd-linux-64@1.20250507.0': optional: true - '@cloudflare/workerd-linux-arm64@1.20250410.0': + '@cloudflare/workerd-linux-arm64@1.20250507.0': optional: true - '@cloudflare/workerd-windows-64@1.20250410.0': + '@cloudflare/workerd-windows-64@1.20250507.0': optional: true - '@cloudflare/workers-types@4.20250415.0': {} + '@cloudflare/workers-types@4.20250507.0': {} '@cspotcode/source-map-support@0.8.1': dependencies: @@ -4025,154 +3870,79 @@ snapshots: tslib: 2.6.2 optional: true - '@esbuild/aix-ppc64@0.25.2': - optional: true - - '@esbuild/aix-ppc64@0.25.3': - optional: true - - '@esbuild/android-arm64@0.25.2': + '@esbuild/aix-ppc64@0.25.4': optional: true - '@esbuild/android-arm64@0.25.3': + '@esbuild/android-arm64@0.25.4': optional: true - '@esbuild/android-arm@0.25.2': + '@esbuild/android-arm@0.25.4': optional: true - '@esbuild/android-arm@0.25.3': + '@esbuild/android-x64@0.25.4': optional: true - '@esbuild/android-x64@0.25.2': + '@esbuild/darwin-arm64@0.25.4': optional: true - '@esbuild/android-x64@0.25.3': + '@esbuild/darwin-x64@0.25.4': optional: true - '@esbuild/darwin-arm64@0.25.2': + '@esbuild/freebsd-arm64@0.25.4': optional: true - '@esbuild/darwin-arm64@0.25.3': + '@esbuild/freebsd-x64@0.25.4': optional: true - '@esbuild/darwin-x64@0.25.2': + '@esbuild/linux-arm64@0.25.4': optional: true - '@esbuild/darwin-x64@0.25.3': + '@esbuild/linux-arm@0.25.4': optional: true - '@esbuild/freebsd-arm64@0.25.2': + '@esbuild/linux-ia32@0.25.4': optional: true - '@esbuild/freebsd-arm64@0.25.3': + '@esbuild/linux-loong64@0.25.4': optional: true - '@esbuild/freebsd-x64@0.25.2': + '@esbuild/linux-mips64el@0.25.4': optional: true - '@esbuild/freebsd-x64@0.25.3': + '@esbuild/linux-ppc64@0.25.4': optional: true - '@esbuild/linux-arm64@0.25.2': + '@esbuild/linux-riscv64@0.25.4': optional: true - '@esbuild/linux-arm64@0.25.3': + '@esbuild/linux-s390x@0.25.4': optional: true - '@esbuild/linux-arm@0.25.2': + '@esbuild/linux-x64@0.25.4': optional: true - '@esbuild/linux-arm@0.25.3': + '@esbuild/netbsd-arm64@0.25.4': optional: true - '@esbuild/linux-ia32@0.25.2': + '@esbuild/netbsd-x64@0.25.4': optional: true - '@esbuild/linux-ia32@0.25.3': + '@esbuild/openbsd-arm64@0.25.4': optional: true - '@esbuild/linux-loong64@0.25.2': + '@esbuild/openbsd-x64@0.25.4': optional: true - '@esbuild/linux-loong64@0.25.3': + '@esbuild/sunos-x64@0.25.4': optional: true - '@esbuild/linux-mips64el@0.25.2': + '@esbuild/win32-arm64@0.25.4': optional: true - '@esbuild/linux-mips64el@0.25.3': + '@esbuild/win32-ia32@0.25.4': optional: true - '@esbuild/linux-ppc64@0.25.2': - optional: true - - '@esbuild/linux-ppc64@0.25.3': - optional: true - - '@esbuild/linux-riscv64@0.25.2': - optional: true - - '@esbuild/linux-riscv64@0.25.3': - optional: true - - '@esbuild/linux-s390x@0.25.2': - optional: true - - '@esbuild/linux-s390x@0.25.3': - optional: true - - '@esbuild/linux-x64@0.25.2': - optional: true - - '@esbuild/linux-x64@0.25.3': - optional: true - - '@esbuild/netbsd-arm64@0.25.2': - optional: true - - '@esbuild/netbsd-arm64@0.25.3': - optional: true - - '@esbuild/netbsd-x64@0.25.2': - optional: true - - '@esbuild/netbsd-x64@0.25.3': - optional: true - - '@esbuild/openbsd-arm64@0.25.2': - optional: true - - '@esbuild/openbsd-arm64@0.25.3': - optional: true - - '@esbuild/openbsd-x64@0.25.2': - optional: true - - '@esbuild/openbsd-x64@0.25.3': - optional: true - - '@esbuild/sunos-x64@0.25.2': - optional: true - - '@esbuild/sunos-x64@0.25.3': - optional: true - - '@esbuild/win32-arm64@0.25.2': - optional: true - - '@esbuild/win32-arm64@0.25.3': - optional: true - - '@esbuild/win32-ia32@0.25.2': - optional: true - - '@esbuild/win32-ia32@0.25.3': - optional: true - - '@esbuild/win32-x64@0.25.2': - optional: true - - '@esbuild/win32-x64@0.25.3': + '@esbuild/win32-x64@0.25.4': optional: true '@eslint-community/eslint-utils@4.7.0(eslint@9.6.0)': @@ -5048,61 +4818,33 @@ snapshots: es-module-lexer@1.6.0: {} - esbuild@0.25.2: - optionalDependencies: - '@esbuild/aix-ppc64': 0.25.2 - '@esbuild/android-arm': 0.25.2 - '@esbuild/android-arm64': 0.25.2 - '@esbuild/android-x64': 0.25.2 - '@esbuild/darwin-arm64': 0.25.2 - '@esbuild/darwin-x64': 0.25.2 - '@esbuild/freebsd-arm64': 0.25.2 - '@esbuild/freebsd-x64': 0.25.2 - '@esbuild/linux-arm': 0.25.2 - '@esbuild/linux-arm64': 0.25.2 - '@esbuild/linux-ia32': 0.25.2 - '@esbuild/linux-loong64': 0.25.2 - '@esbuild/linux-mips64el': 0.25.2 - '@esbuild/linux-ppc64': 0.25.2 - '@esbuild/linux-riscv64': 0.25.2 - '@esbuild/linux-s390x': 0.25.2 - '@esbuild/linux-x64': 0.25.2 - '@esbuild/netbsd-arm64': 0.25.2 - '@esbuild/netbsd-x64': 0.25.2 - '@esbuild/openbsd-arm64': 0.25.2 - '@esbuild/openbsd-x64': 0.25.2 - '@esbuild/sunos-x64': 0.25.2 - '@esbuild/win32-arm64': 0.25.2 - '@esbuild/win32-ia32': 0.25.2 - '@esbuild/win32-x64': 0.25.2 - - esbuild@0.25.3: + esbuild@0.25.4: optionalDependencies: - '@esbuild/aix-ppc64': 0.25.3 - '@esbuild/android-arm': 0.25.3 - '@esbuild/android-arm64': 0.25.3 - '@esbuild/android-x64': 0.25.3 - '@esbuild/darwin-arm64': 0.25.3 - '@esbuild/darwin-x64': 0.25.3 - '@esbuild/freebsd-arm64': 0.25.3 - '@esbuild/freebsd-x64': 0.25.3 - '@esbuild/linux-arm': 0.25.3 - '@esbuild/linux-arm64': 0.25.3 - '@esbuild/linux-ia32': 0.25.3 - '@esbuild/linux-loong64': 0.25.3 - '@esbuild/linux-mips64el': 0.25.3 - '@esbuild/linux-ppc64': 0.25.3 - '@esbuild/linux-riscv64': 0.25.3 - '@esbuild/linux-s390x': 0.25.3 - '@esbuild/linux-x64': 0.25.3 - '@esbuild/netbsd-arm64': 0.25.3 - '@esbuild/netbsd-x64': 0.25.3 - '@esbuild/openbsd-arm64': 0.25.3 - '@esbuild/openbsd-x64': 0.25.3 - '@esbuild/sunos-x64': 0.25.3 - '@esbuild/win32-arm64': 0.25.3 - '@esbuild/win32-ia32': 0.25.3 - '@esbuild/win32-x64': 0.25.3 + '@esbuild/aix-ppc64': 0.25.4 + '@esbuild/android-arm': 0.25.4 + '@esbuild/android-arm64': 0.25.4 + '@esbuild/android-x64': 0.25.4 + '@esbuild/darwin-arm64': 0.25.4 + '@esbuild/darwin-x64': 0.25.4 + '@esbuild/freebsd-arm64': 0.25.4 + '@esbuild/freebsd-x64': 0.25.4 + '@esbuild/linux-arm': 0.25.4 + '@esbuild/linux-arm64': 0.25.4 + '@esbuild/linux-ia32': 0.25.4 + '@esbuild/linux-loong64': 0.25.4 + '@esbuild/linux-mips64el': 0.25.4 + '@esbuild/linux-ppc64': 0.25.4 + '@esbuild/linux-riscv64': 0.25.4 + '@esbuild/linux-s390x': 0.25.4 + '@esbuild/linux-x64': 0.25.4 + '@esbuild/netbsd-arm64': 0.25.4 + '@esbuild/netbsd-x64': 0.25.4 + '@esbuild/openbsd-arm64': 0.25.4 + '@esbuild/openbsd-x64': 0.25.4 + '@esbuild/sunos-x64': 0.25.4 + '@esbuild/win32-arm64': 0.25.4 + '@esbuild/win32-ia32': 0.25.4 + '@esbuild/win32-x64': 0.25.4 escape-string-regexp@4.0.0: {} @@ -5573,7 +5315,7 @@ snapshots: min-indent@1.0.1: {} - miniflare@4.20250410.0: + miniflare@4.20250507.0: dependencies: '@cspotcode/source-map-support': 0.8.1 acorn: 8.14.0 @@ -5582,7 +5324,7 @@ snapshots: glob-to-regexp: 0.4.1 stoppable: 1.1.0 undici: 5.29.0 - workerd: 1.20250410.0 + workerd: 1.20250507.0 ws: 8.18.0 youch: 3.3.4 zod: 3.22.3 @@ -6194,7 +5936,7 @@ snapshots: vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1): dependencies: - esbuild: 0.25.3 + esbuild: 0.25.4 postcss: 8.5.3 rollup: 4.40.1 optionalDependencies: @@ -6260,31 +6002,31 @@ snapshots: siginfo: 2.0.0 stackback: 0.0.2 - workerd@1.20250410.0: + workerd@1.20250507.0: optionalDependencies: - '@cloudflare/workerd-darwin-64': 1.20250410.0 - '@cloudflare/workerd-darwin-arm64': 1.20250410.0 - '@cloudflare/workerd-linux-64': 1.20250410.0 - '@cloudflare/workerd-linux-arm64': 1.20250410.0 - '@cloudflare/workerd-windows-64': 1.20250410.0 + '@cloudflare/workerd-darwin-64': 1.20250507.0 + '@cloudflare/workerd-darwin-arm64': 1.20250507.0 + '@cloudflare/workerd-linux-64': 1.20250507.0 + '@cloudflare/workerd-linux-arm64': 1.20250507.0 + '@cloudflare/workerd-windows-64': 1.20250507.0 worktop@0.8.0-next.18: dependencies: mrmime: 2.0.0 regexparam: 3.0.0 - wrangler@4.11.0(@cloudflare/workers-types@4.20250415.0): + wrangler@4.14.3(@cloudflare/workers-types@4.20250507.0): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 - '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250410.0) + '@cloudflare/unenv-preset': 2.3.1(unenv@2.0.0-rc.15)(workerd@1.20250507.0) blake3-wasm: 2.1.5 - esbuild: 0.25.2 - miniflare: 4.20250410.0 + esbuild: 0.25.4 + miniflare: 4.20250507.0 path-to-regexp: 6.3.0 unenv: 2.0.0-rc.15 - workerd: 1.20250410.0 + workerd: 1.20250507.0 optionalDependencies: - '@cloudflare/workers-types': 4.20250415.0 + '@cloudflare/workers-types': 4.20250507.0 fsevents: 2.3.3 sharp: 0.33.5 transitivePeerDependencies: From 6ad02896374a5cee34ce1ec3dfa3c60121ed6445 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Wed, 7 May 2025 11:24:38 -0700 Subject: [PATCH 1065/1135] Version Packages (#13771) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/heavy-roses-grab.md | 6 ------ .changeset/odd-ants-sneeze.md | 5 ----- .changeset/yellow-goats-cry.md | 5 ----- packages/adapter-cloudflare/CHANGELOG.md | 6 ++++++ packages/adapter-cloudflare/package.json | 2 +- packages/adapter-netlify/CHANGELOG.md | 6 ++++++ packages/adapter-netlify/package.json | 2 +- packages/adapter-vercel/CHANGELOG.md | 6 ++++++ packages/adapter-vercel/package.json | 2 +- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- 11 files changed, 28 insertions(+), 20 deletions(-) delete mode 100644 .changeset/heavy-roses-grab.md delete mode 100644 .changeset/odd-ants-sneeze.md delete mode 100644 .changeset/yellow-goats-cry.md diff --git a/.changeset/heavy-roses-grab.md b/.changeset/heavy-roses-grab.md deleted file mode 100644 index 0ea639f591c3..000000000000 --- a/.changeset/heavy-roses-grab.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@sveltejs/adapter-netlify': patch -'@sveltejs/adapter-vercel': patch ---- - -chore(deps): upgrade to esbuild 0.25.4 diff --git a/.changeset/odd-ants-sneeze.md b/.changeset/odd-ants-sneeze.md deleted file mode 100644 index 9e876a183bf8..000000000000 --- a/.changeset/odd-ants-sneeze.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/adapter-cloudflare': patch ---- - -chore(deps): upgrade @cloudflare/workers-types to 4.20250507.0 diff --git a/.changeset/yellow-goats-cry.md b/.changeset/yellow-goats-cry.md deleted file mode 100644 index d401873be58c..000000000000 --- a/.changeset/yellow-goats-cry.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': patch ---- - -chore(deps): upgrade sharp to 0.34.1 diff --git a/packages/adapter-cloudflare/CHANGELOG.md b/packages/adapter-cloudflare/CHANGELOG.md index d3eb4e954595..bb77f8781159 100644 --- a/packages/adapter-cloudflare/CHANGELOG.md +++ b/packages/adapter-cloudflare/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-cloudflare +## 7.0.3 +### Patch Changes + + +- chore(deps): upgrade @cloudflare/workers-types to 4.20250507.0 ([#13773](https://github.com/sveltejs/kit/pull/13773)) + ## 7.0.2 ### Patch Changes diff --git a/packages/adapter-cloudflare/package.json b/packages/adapter-cloudflare/package.json index f6af1ae55bc0..411d947b62b6 100644 --- a/packages/adapter-cloudflare/package.json +++ b/packages/adapter-cloudflare/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-cloudflare", - "version": "7.0.2", + "version": "7.0.3", "description": "Adapter for building SvelteKit applications on Cloudflare Pages with Workers integration", "keywords": [ "adapter", diff --git a/packages/adapter-netlify/CHANGELOG.md b/packages/adapter-netlify/CHANGELOG.md index 6b0b375d524a..f817f79cf49f 100644 --- a/packages/adapter-netlify/CHANGELOG.md +++ b/packages/adapter-netlify/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-netlify +## 5.0.2 +### Patch Changes + + +- chore(deps): upgrade to esbuild 0.25.4 ([#13770](https://github.com/sveltejs/kit/pull/13770)) + ## 5.0.1 ### Patch Changes diff --git a/packages/adapter-netlify/package.json b/packages/adapter-netlify/package.json index dacad679dd05..2d4fb1d19c33 100644 --- a/packages/adapter-netlify/package.json +++ b/packages/adapter-netlify/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-netlify", - "version": "5.0.1", + "version": "5.0.2", "description": "A SvelteKit adapter that creates a Netlify app", "keywords": [ "adapter", diff --git a/packages/adapter-vercel/CHANGELOG.md b/packages/adapter-vercel/CHANGELOG.md index afd5caa8c8a1..aa022f8732f9 100644 --- a/packages/adapter-vercel/CHANGELOG.md +++ b/packages/adapter-vercel/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/adapter-vercel +## 5.7.2 +### Patch Changes + + +- chore(deps): upgrade to esbuild 0.25.4 ([#13770](https://github.com/sveltejs/kit/pull/13770)) + ## 5.7.1 ### Patch Changes diff --git a/packages/adapter-vercel/package.json b/packages/adapter-vercel/package.json index 66d866723e69..bcf9038636ff 100644 --- a/packages/adapter-vercel/package.json +++ b/packages/adapter-vercel/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-vercel", - "version": "5.7.1", + "version": "5.7.2", "description": "A SvelteKit adapter that creates a Vercel app", "keywords": [ "adapter", diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index 508e85bdda39..ea30ed157639 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.5.1 +### Patch Changes + + +- chore(deps): upgrade sharp to 0.34.1 ([#13611](https://github.com/sveltejs/kit/pull/13611)) + ## 0.5.0 ### Minor Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index 6a139b1572d7..a56f590b7827 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.5.0", + "version": "0.5.1", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", From 1c3f36dc10265fb79c64643c3d7a91469d34e697 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 10 May 2025 08:21:12 -0700 Subject: [PATCH 1066/1135] feat: add validation to ensure plugin occurs in correct order --- .changeset/afraid-scissors-own.md | 5 +++++ packages/enhanced-img/src/vite-plugin.js | 8 ++++++++ 2 files changed, 13 insertions(+) create mode 100644 .changeset/afraid-scissors-own.md diff --git a/.changeset/afraid-scissors-own.md b/.changeset/afraid-scissors-own.md new file mode 100644 index 000000000000..2e821e292516 --- /dev/null +++ b/.changeset/afraid-scissors-own.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/enhanced-img': minor +--- + +feat: add validation to ensure plugin occurs in correct order diff --git a/packages/enhanced-img/src/vite-plugin.js b/packages/enhanced-img/src/vite-plugin.js index 8a326c4155fc..eb940005c3fb 100644 --- a/packages/enhanced-img/src/vite-plugin.js +++ b/packages/enhanced-img/src/vite-plugin.js @@ -35,6 +35,14 @@ export function image_plugin(imagetools_plugin) { enforce: 'pre', async configResolved(config) { vite_config = config; + for (const plugin of (config.plugins || [])) { + if (plugin.name === name) { + break; + } + if (plugin.name === 'vite-plugin-svelte') { + throw new Error('@sveltejs/enhanced-img must come before the Svelte or SvelteKit plugins'); + } + } svelte_config = await loadSvelteConfig(); if (!svelte_config) throw new Error('Could not load Svelte config file'); }, From 6f223970609280c458b16e9594938f419295655c Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 10 May 2025 08:33:07 -0700 Subject: [PATCH 1067/1135] chore: format --- packages/enhanced-img/src/vite-plugin.js | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/packages/enhanced-img/src/vite-plugin.js b/packages/enhanced-img/src/vite-plugin.js index eb940005c3fb..2eab65b44f16 100644 --- a/packages/enhanced-img/src/vite-plugin.js +++ b/packages/enhanced-img/src/vite-plugin.js @@ -35,12 +35,14 @@ export function image_plugin(imagetools_plugin) { enforce: 'pre', async configResolved(config) { vite_config = config; - for (const plugin of (config.plugins || [])) { + for (const plugin of config.plugins || []) { if (plugin.name === name) { break; } if (plugin.name === 'vite-plugin-svelte') { - throw new Error('@sveltejs/enhanced-img must come before the Svelte or SvelteKit plugins'); + throw new Error( + '@sveltejs/enhanced-img must come before the Svelte or SvelteKit plugins' + ); } } svelte_config = await loadSvelteConfig(); From dfb4b9e6f9f243a77c872fea4aa5c364602ca846 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Sat, 10 May 2025 08:48:38 -0700 Subject: [PATCH 1068/1135] fix: add missing part of diff --- packages/enhanced-img/src/vite-plugin.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/enhanced-img/src/vite-plugin.js b/packages/enhanced-img/src/vite-plugin.js index 2eab65b44f16..cbfb7b3a1ca7 100644 --- a/packages/enhanced-img/src/vite-plugin.js +++ b/packages/enhanced-img/src/vite-plugin.js @@ -30,8 +30,10 @@ export function image_plugin(imagetools_plugin) { /** @type {Partial} */ let svelte_config; + const name = 'vite-plugin-enhanced-img-markup'; + return { - name: 'vite-plugin-enhanced-img-markup', + name, enforce: 'pre', async configResolved(config) { vite_config = config; From bd1c04662332cbafa843c35a2e783486116af3d5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 12 May 2025 16:08:07 -0400 Subject: [PATCH 1069/1135] chore: remove import-meta-resolve (#13629) * remove import-meta-resolve * changeset --- .changeset/famous-points-switch.md | 6 ++ packages/adapter-auto/index.js | 125 +++++++++++++++---------- packages/adapter-auto/package.json | 3 - packages/kit/package.json | 1 - packages/kit/src/core/sync/utils.js | 4 +- packages/kit/src/exports/vite/index.js | 6 +- packages/kit/src/utils/import.js | 55 ++++++++--- pnpm-lock.yaml | 12 --- 8 files changed, 127 insertions(+), 85 deletions(-) create mode 100644 .changeset/famous-points-switch.md diff --git a/.changeset/famous-points-switch.md b/.changeset/famous-points-switch.md new file mode 100644 index 000000000000..1ea3c3ba3d40 --- /dev/null +++ b/.changeset/famous-points-switch.md @@ -0,0 +1,6 @@ +--- +'@sveltejs/adapter-auto': patch +'@sveltejs/kit': patch +--- + +chore: remove `import-meta-resolve` dependency diff --git a/packages/adapter-auto/index.js b/packages/adapter-auto/index.js index ccd20f600e56..0a2c0030e643 100644 --- a/packages/adapter-auto/index.js +++ b/packages/adapter-auto/index.js @@ -1,9 +1,7 @@ import { execSync } from 'node:child_process'; -import { pathToFileURL } from 'node:url'; -import { resolve } from 'import-meta-resolve'; import { adapters } from './adapters.js'; -import { dirname, join } from 'node:path'; -import { existsSync } from 'node:fs'; +import path from 'node:path'; +import fs from 'node:fs'; import process from 'node:process'; /** @type {Record string>} */ @@ -17,12 +15,15 @@ const commands = { function detect_lockfile() { let dir = process.cwd(); + /** @param {string} file */ + const exists = (file) => fs.existsSync(path.join(dir, file)); + do { - if (existsSync(join(dir, 'pnpm-lock.yaml'))) return 'pnpm'; - if (existsSync(join(dir, 'yarn.lock'))) return 'yarn'; - if (existsSync(join(dir, 'package-lock.json'))) return 'npm'; - if (existsSync(join(dir, 'bun.lockb')) || existsSync(join(dir, 'bun.lock'))) return 'bun'; - } while (dir !== (dir = dirname(dir))); + if (exists('pnpm-lock.yaml')) return 'pnpm'; + if (exists('yarn.lock')) return 'yarn'; + if (exists('package-lock.json')) return 'npm'; + if (exists('bun.lockb') || exists('bun.lock')) return 'bun'; + } while (dir !== (dir = path.dirname(dir))); return 'npm'; } @@ -38,12 +39,40 @@ function detect_package_manager() { } } -/** @param {string} name */ -function import_from_cwd(name) { - const cwd = pathToFileURL(process.cwd()).href; - const url = resolve(name, cwd + '/x.js'); +/** + * Resolves a peer dependency relative to the current CWD. Duplicated with `packages/kit` + * @param {string} dependency + */ +function resolve_peer(dependency) { + let [name, ...parts] = dependency.split('/'); + if (name[0] === '@') name += `/${parts.shift()}`; + + let dir = process.cwd(); + + while (!fs.existsSync(`${dir}/node_modules/${name}/package.json`)) { + if (dir === (dir = path.dirname(dir))) { + throw new Error( + `Could not resolve peer dependency "${name}" relative to your project — please install it and try again.` + ); + } + } + + const pkg_dir = `${dir}/node_modules/${name}`; + const pkg = JSON.parse(fs.readFileSync(`${pkg_dir}/package.json`, 'utf-8')); + + const subpackage = ['.', ...parts].join('/'); + + let exported = pkg.exports[subpackage]; + + while (typeof exported !== 'string') { + if (!exported) { + throw new Error(`Could not find valid "${subpackage}" export in ${name}/package.json`); + } + + exported = exported['import'] ?? exported['default']; + } - return import(url); + return path.resolve(pkg_dir, exported); } /** @typedef {import('@sveltejs/kit').Adapter} Adapter */ @@ -56,47 +85,43 @@ async function get_adapter() { if (!match) return; - /** @type {{ default: () => Adapter }} */ - let module; + /** @type {string} */ + let resolved; try { - module = await import_from_cwd(match.module); - } catch (error) { - if ( - error.code === 'ERR_MODULE_NOT_FOUND' && - error.message.startsWith(`Cannot find package '${match.module}'`) - ) { - const package_manager = detect_package_manager(); - const command = commands[package_manager](match.module, match.version); - - try { - console.log(`Installing ${match.module}...`); - - execSync(command, { - stdio: 'inherit', - env: { - ...process.env, - NODE_ENV: undefined - } - }); - - module = await import_from_cwd(match.module); - - console.log(`Successfully installed ${match.module}.`); - console.warn( - `\nIf you plan on staying on this deployment platform, consider replacing @sveltejs/adapter-auto with ${match.module}. This will give you faster and more robust installs, and more control over deployment configuration.\n` - ); - } catch (e) { - throw new Error( - `Could not install ${match.module}. Please install it yourself by adding it to your package.json's devDependencies and try building your project again.`, - { cause: e } - ); - } - } else { - throw error; + resolved = resolve_peer(match.module); + } catch { + const package_manager = detect_package_manager(); + const command = commands[package_manager](match.module, match.version); + + try { + console.log(`Installing ${match.module}...`); + + execSync(command, { + stdio: 'inherit', + env: { + ...process.env, + NODE_ENV: undefined + } + }); + + resolved = resolve_peer(match.module); + + console.log(`Successfully installed ${match.module}.`); + console.warn( + `\nIf you plan on staying on this deployment platform, consider replacing @sveltejs/adapter-auto with ${match.module}. This will give you faster and more robust installs, and more control over deployment configuration.\n` + ); + } catch (e) { + throw new Error( + `Could not install ${match.module}. Please install it yourself by adding it to your package.json's devDependencies and try building your project again.`, + { cause: e } + ); } } + /** @type {{ default: () => Adapter }} */ + const module = await import(resolved); + const adapter = module.default(); return { diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index 8237696d05a9..e9567286fbd5 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -46,9 +46,6 @@ "typescript": "^5.3.3", "vitest": "^3.1.1" }, - "dependencies": { - "import-meta-resolve": "^4.1.0" - }, "peerDependencies": { "@sveltejs/kit": "^2.0.0" } diff --git a/packages/kit/package.json b/packages/kit/package.json index efce2f5b5351..3142d84f9770 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -22,7 +22,6 @@ "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.2", - "import-meta-resolve": "^4.1.0", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", diff --git a/packages/kit/src/core/sync/utils.js b/packages/kit/src/core/sync/utils.js index 304e9180a77b..be3ecc22b347 100644 --- a/packages/kit/src/core/sync/utils.js +++ b/packages/kit/src/core/sync/utils.js @@ -1,10 +1,10 @@ import fs from 'node:fs'; import path from 'node:path'; import { mkdirp } from '../../utils/filesystem.js'; -import { resolve_peer_dependency } from '../../utils/import.js'; +import { import_peer } from '../../utils/import.js'; /** @type {{ VERSION: string }} */ -const { VERSION } = await resolve_peer_dependency('svelte/compiler'); +const { VERSION } = await import_peer('svelte/compiler'); /** @type {Map} */ const previous_contents = new Map(); diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index c2e445e865d2..bdb08f409949 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -34,7 +34,7 @@ import { sveltekit_paths, sveltekit_server } from './module_ids.js'; -import { resolve_peer_dependency } from '../../utils/import.js'; +import { import_peer } from '../../utils/import.js'; import { compact } from '../../utils/array.js'; const cwd = process.cwd(); @@ -155,7 +155,7 @@ export async function sveltekit() { ...svelte_config.vitePlugin }; - const { svelte } = await resolve_peer_dependency('@sveltejs/vite-plugin-svelte'); + const { svelte } = await import_peer('@sveltejs/vite-plugin-svelte'); return [...svelte(vite_plugin_svelte_options), ...(await kit({ svelte_config }))]; } @@ -181,7 +181,7 @@ let manifest_data; * @return {Promise} */ async function kit({ svelte_config }) { - const vite = await resolve_peer_dependency('vite'); + const vite = await import_peer('vite'); const { kit } = svelte_config; const out = `${kit.outDir}/output`; diff --git a/packages/kit/src/utils/import.js b/packages/kit/src/utils/import.js index 4a8e92971f16..3ed96fa46484 100644 --- a/packages/kit/src/utils/import.js +++ b/packages/kit/src/utils/import.js @@ -1,25 +1,52 @@ -import * as imr from 'import-meta-resolve'; import process from 'node:process'; -import { pathToFileURL } from 'node:url'; +import fs from 'node:fs'; +import path from 'node:path'; + +/** + * Resolves a peer dependency relative to the current CWD. Duplicated with `packages/adapter-auto` + * @param {string} dependency + */ +function resolve_peer(dependency) { + let [name, ...parts] = dependency.split('/'); + if (name[0] === '@') name += `/${parts.shift()}`; + + let dir = process.cwd(); + + while (!fs.existsSync(`${dir}/node_modules/${name}/package.json`)) { + if (dir === (dir = path.dirname(dir))) { + throw new Error( + `Could not resolve peer dependency "${name}" relative to your project — please install it and try again.` + ); + } + } + + const pkg_dir = `${dir}/node_modules/${name}`; + const pkg = JSON.parse(fs.readFileSync(`${pkg_dir}/package.json`, 'utf-8')); + + const subpackage = ['.', ...parts].join('/'); + + let exported = pkg.exports[subpackage]; + + while (typeof exported !== 'string') { + if (!exported) { + throw new Error(`Could not find valid "${subpackage}" export in ${name}/package.json`); + } + + exported = exported['import'] ?? exported['default']; + } + + return path.resolve(pkg_dir, exported); +} /** * Resolve a dependency relative to the current working directory, * rather than relative to this package (but falls back to trying that, if necessary) * @param {string} dependency */ -export async function resolve_peer_dependency(dependency) { +export async function import_peer(dependency) { try { - // @ts-expect-error the types are wrong - const resolved = imr.resolve(dependency, pathToFileURL(process.cwd() + '/dummy.js')); - return await import(resolved); + return await import(resolve_peer(dependency)); } catch { - try { - // both imr.resolve and await import above can throw, which is why we can't just do import(resolved).catch(...) above - return await import(dependency); - } catch { - throw new Error( - `Could not resolve peer dependency "${dependency}" relative to your project — please install it and try again.` - ); - } + return await import(dependency); } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 66b2ee320fb1..dcb3218bc964 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -40,10 +40,6 @@ importers: version: 8.26.0(eslint@9.6.0)(typescript@5.6.3) packages/adapter-auto: - dependencies: - import-meta-resolve: - specifier: ^4.1.0 - version: 4.1.0 devDependencies: '@sveltejs/kit': specifier: workspace:^ @@ -377,9 +373,6 @@ importers: esm-env: specifier: ^1.2.2 version: 1.2.2 - import-meta-resolve: - specifier: ^4.1.0 - version: 4.1.0 kleur: specifier: ^4.1.5 version: 4.1.5 @@ -2695,9 +2688,6 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} - import-meta-resolve@4.1.0: - resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} - imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -5154,8 +5144,6 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 - import-meta-resolve@4.1.0: {} - imurmurhash@0.1.4: {} is-arrayish@0.3.2: {} From 09f61ec2a14573e27769edb403c58aea5433a39f Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 12 May 2025 22:10:05 +0200 Subject: [PATCH 1070/1135] feat: statically analyse universal pages and layouts v3 (#13684) * wip * try lazily loading the universal module * generate types * identify csr only nodes * remove unused options * better name * analyse once * format * generate types * windows * add test * fix root layout not being considered * changeset * named import * add todo * docs * lazily compute page options during dev * format * remove server component removal * Update documentation/docs/20-core-concepts/40-page-options.md Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * correctly skip parsing * format * save * todos * allow let exports * format * name tests * format * Update documentation/docs/20-core-concepts/40-page-options.md * add todos * Update packages/kit/src/exports/vite/static_analysis/index.spec.js Co-authored-by: Rich Harris * Update packages/kit/src/exports/vite/static_analysis/index.spec.js Co-authored-by: Rich Harris * remove reassignment cases and fix dev change not reevaluating page options * remove zimmerframe dep from kit * add test for file updates * run prettier * done! * format --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> Co-authored-by: Rich Harris --- .changeset/forty-weeks-arrive.md | 5 + .changeset/weak-snails-decide.md | 5 + .../docs/20-core-concepts/40-page-options.md | 2 +- packages/kit/package.json | 2 + .../src/exports/vite/build/build_server.js | 32 ++- packages/kit/src/exports/vite/dev/index.js | 23 +- packages/kit/src/exports/vite/index.js | 4 +- .../src/exports/vite/static_analysis/index.js | 259 ++++++++++++++++++ .../vite/static_analysis/index.spec.js | 190 +++++++++++++ .../kit/src/runtime/server/page/load_data.js | 1 + packages/kit/src/runtime/server/respond.js | 2 +- packages/kit/src/types/internal.d.ts | 2 +- packages/kit/src/utils/page_nodes.js | 10 +- .../src/routes/browser-globals/+page.js | 11 + .../src/routes/browser-globals/+page.svelte | 5 + packages/kit/test/apps/no-ssr/test/test.js | 7 +- .../apps/writes/src/routes/universal/+page.js | 3 + .../writes/src/routes/universal/+page.svelte | 1 + packages/kit/test/apps/writes/test/test.js | 27 ++ packages/kit/types/index.d.ts | 2 +- pnpm-lock.yaml | 34 ++- 21 files changed, 600 insertions(+), 27 deletions(-) create mode 100644 .changeset/forty-weeks-arrive.md create mode 100644 .changeset/weak-snails-decide.md create mode 100644 packages/kit/src/exports/vite/static_analysis/index.js create mode 100644 packages/kit/src/exports/vite/static_analysis/index.spec.js create mode 100644 packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.js create mode 100644 packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.svelte create mode 100644 packages/kit/test/apps/writes/src/routes/universal/+page.js create mode 100644 packages/kit/test/apps/writes/src/routes/universal/+page.svelte diff --git a/.changeset/forty-weeks-arrive.md b/.changeset/forty-weeks-arrive.md new file mode 100644 index 000000000000..f9be0b1552ca --- /dev/null +++ b/.changeset/forty-weeks-arrive.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': minor +--- + +feat: allow running client-side code at the top-level of universal pages/layouts when SSR is disabled and page options are only boolean or string literals diff --git a/.changeset/weak-snails-decide.md b/.changeset/weak-snails-decide.md new file mode 100644 index 000000000000..c3b814f97b07 --- /dev/null +++ b/.changeset/weak-snails-decide.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: remove component code from server nodes that are never used for SSR diff --git a/documentation/docs/20-core-concepts/40-page-options.md b/documentation/docs/20-core-concepts/40-page-options.md index 5cc39027c358..ff64aa7416c2 100644 --- a/documentation/docs/20-core-concepts/40-page-options.md +++ b/documentation/docs/20-core-concepts/40-page-options.md @@ -127,7 +127,7 @@ export const ssr = false; If you add `export const ssr = false` to your root `+layout.js`, your entire app will only be rendered on the client — which essentially means you turn your app into an SPA. -> [!NOTE] Even with `ssr` set to `false`, code that relies on browser APIs should be imported in your `+page.svelte` or `+layout.svelte` file instead. This is because page options can be overriden and need to be evaluated by importing your `+page.js` or `+layout.js` file on the server (if you have a runtime) or at build time (in case of prerendering). +> [!NOTE] If all your page options are boolean or string literal values, SvelteKit will evaluate them statically. If not, it will import your `+page.js` or `+layout.js` file on the server (both at build time, and at runtime if your app isn't fully static) so it can evaluate the options. In the second case, browser-only code must not run when the module is loaded. In practice, this means you should import browser-only code in your `+page.svelte` or `+layout.svelte` file instead. ## csr diff --git a/packages/kit/package.json b/packages/kit/package.json index 3142d84f9770..4166a5068147 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -18,7 +18,9 @@ "homepage": "https://svelte.dev", "type": "module", "dependencies": { + "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", + "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.1.0", "esm-env": "^1.2.2", diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index ca3eedc18cb3..e9aafe75b505 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -3,7 +3,8 @@ import { mkdirp } from '../../../utils/filesystem.js'; import { filter_fonts, find_deps, resolve_symlinks } from './utils.js'; import { s } from '../../../utils/misc.js'; import { normalizePath } from 'vite'; -import { basename } from 'node:path'; +import { basename, join } from 'node:path'; +import { create_static_analyser } from '../static_analysis/index.js'; /** * @param {string} out @@ -14,7 +15,7 @@ import { basename } from 'node:path'; * @param {import('vite').Rollup.OutputAsset[] | null} css * @param {import('types').RecursiveRequired} output_config */ -export function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, css, output_config) { +export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, css, output_config) { mkdirp(`${out}/server/nodes`); mkdirp(`${out}/server/stylesheets`); @@ -73,7 +74,14 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli } } - manifest_data.nodes.forEach((node, i) => { + const { get_page_options } = create_static_analyser(async (server_node) => { + // Windows needs the file:// protocol for absolute path dynamic imports + return import(`file://${join(out, 'server', resolve_symlinks(server_manifest, server_node).chunk.file)}`); + }); + + for (let i = 0; i < manifest_data.nodes.length; i++) { + const node = manifest_data.nodes[i]; + /** @type {string[]} */ const imports = []; @@ -101,12 +109,16 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli } if (node.universal) { - imports.push( - `import * as universal from '../${ - resolve_symlinks(server_manifest, node.universal).chunk.file - }';` - ); - exports.push('export { universal };'); + const page_options = await get_page_options(node); + if (!!page_options && page_options.ssr === false) { + exports.push(`export const universal = ${s(page_options, null, 2)};`) + } else { + imports.push( + `import * as universal from '../${resolve_symlinks(server_manifest, node.universal).chunk.file}';` + ); + // TODO: when building for analysis, explain why the file was loaded on the server if we fail to load it + exports.push('export { universal };'); + } exports.push(`export const universal_id = ${s(node.universal)};`); } @@ -186,5 +198,5 @@ export function build_server_nodes(out, kit, manifest_data, server_manifest, cli `${out}/server/nodes/${i}.js`, `${imports.join('\n')}\n\n${exports.join('\n')}\n` ); - }); + } } diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index ded4685f527c..9ed6dd17c4af 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -19,6 +19,7 @@ import { not_found } from '../utils.js'; import { SCHEME } from '../../../utils/url.js'; import { check_feature } from '../../../utils/features.js'; import { escape_html } from '../../../utils/escape.js'; +import { create_static_analyser } from '../static_analysis/index.js'; const cwd = process.cwd(); // vite-specifc queries that we should skip handling for css urls @@ -101,6 +102,9 @@ export async function dev(vite, vite_config, svelte_config) { return { module, module_node, url }; } + /** @type {(file: string) => void} */ + let invalidate_page_options; + function update_manifest() { try { ({ manifest_data } = sync.create(svelte_config)); @@ -124,6 +128,12 @@ export async function dev(vite, vite_config, svelte_config) { return; } + const static_analyser = create_static_analyser(async (server_node) => { + const { module } = await resolve(server_node); + return module; + }); + invalidate_page_options = static_analyser.invalidate_page_options; + manifest = { appDir: svelte_config.kit.appDir, appPath: svelte_config.kit.appDir, @@ -202,9 +212,15 @@ export async function dev(vite, vite_config, svelte_config) { } if (node.universal) { - const { module, module_node } = await resolve(node.universal); - module_nodes.push(module_node); - result.universal = module; + const page_options = await static_analyser.get_page_options(node); + if (page_options?.ssr === false) { + result.universal = page_options; + } else { + // TODO: explain why the file was loaded on the server if we fail to load it + const { module, module_node } = await resolve(node.universal); + module_nodes.push(module_node); + result.universal = module; + } } if (node.server) { @@ -344,6 +360,7 @@ export async function dev(vite, vite_config, svelte_config) { if (timeout || restarting) return; sync.update(svelte_config, manifest_data, file); + invalidate_page_options(path.relative(cwd, file)); }); const { appTemplate, errorTemplate, serviceWorker, hooks } = svelte_config.kit.files; diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index bdb08f409949..8f1f7fe00254 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -821,7 +821,7 @@ Tips: // first, build server nodes without the client manifest so we can analyse it log.info('Analysing routes'); - build_server_nodes( + await build_server_nodes( out, kit, manifest_data, @@ -983,7 +983,7 @@ Tips: ); // regenerate nodes with the client manifest... - build_server_nodes( + await build_server_nodes( out, kit, manifest_data, diff --git a/packages/kit/src/exports/vite/static_analysis/index.js b/packages/kit/src/exports/vite/static_analysis/index.js new file mode 100644 index 000000000000..125319e1c0de --- /dev/null +++ b/packages/kit/src/exports/vite/static_analysis/index.js @@ -0,0 +1,259 @@ +import { tsPlugin } from '@sveltejs/acorn-typescript'; +import { Parser } from 'acorn'; +import { read } from '../../../utils/filesystem.js'; + +const inheritable_page_options = new Set(['ssr', 'prerender', 'csr', 'trailingSlash', 'config']); + +const page_options = new Set([...inheritable_page_options, 'entries']); + +const skip_parsing_regex = new RegExp( + `${Array.from(page_options).join('|')}|(?:export[\\s\\n]+\\*[\\s\\n]+from)` +); + +const parser = Parser.extend(tsPlugin()); + +/** + * Collects exported page options from a +page.js/+layout.js file. + * We ignore reassignments and use the declared value. + * Returns `null` if any export is too difficult to analyse. + * @param {string} filename + * @param {string} input + * @returns {Record | null} + */ +export function statically_analyse_exports(filename, input) { + // if there's a chance there are no page exports or export all declaration, + // then we can skip the AST parsing which is expensive + if (!skip_parsing_regex.test(input)) { + return {}; + } + + try { + const source = parser.parse(input, { + sourceType: 'module', + ecmaVersion: 'latest' + }); + + /** @type {Map} */ + const static_exports = new Map(); + + for (const statement of source.body) { + // ignore export all declarations with aliases that are not page options + if ( + statement.type === 'ExportAllDeclaration' && + statement.exported && + !page_options.has(get_name(statement.exported)) + ) { + continue; + } + + if ( + statement.type === 'ExportDefaultDeclaration' || + statement.type === 'ExportAllDeclaration' + ) { + return null; + } else if (statement.type !== 'ExportNamedDeclaration') { + continue; + } + + if (statement.specifiers.length) { + /** @type {Map} */ + const export_specifiers = new Map(); + for (const specifier of statement.specifiers) { + const exported_name = get_name(specifier.exported); + if (!page_options.has(exported_name)) { + continue; + } + + if (statement.source) { + return null; + } + + export_specifiers.set(get_name(specifier.local), exported_name); + } + + for (const statement of source.body) { + switch (statement.type) { + case 'ImportDeclaration': { + for (const import_specifier of statement.specifiers) { + if (export_specifiers.has(import_specifier.local.name)) { + return null; + } + } + break; + } + case 'ExportNamedDeclaration': + case 'VariableDeclaration': + case 'FunctionDeclaration': + case 'ClassDeclaration': { + const declaration = + statement.type === 'ExportNamedDeclaration' ? statement.declaration : statement; + + if (!declaration) { + break; + } + + // class and function declarations + if (declaration.type !== 'VariableDeclaration') { + if (export_specifiers.has(declaration.id.name)) { + return null; + } + break; + } + + for (const variable_declarator of declaration.declarations) { + if ( + variable_declarator.id.type !== 'Identifier' || + !export_specifiers.has(variable_declarator.id.name) + ) { + continue; + } + + if (variable_declarator.init?.type === 'Literal') { + static_exports.set( + /** @type {string} */ (export_specifiers.get(variable_declarator.id.name)), + variable_declarator.init.value + ); + export_specifiers.delete(variable_declarator.id.name); + continue; + } + + // references a declaration we can't easily evaluate statically + return null; + } + break; + } + } + } + + // there were some export specifiers that we couldn't resolve + if (export_specifiers.size) { + return null; + } + continue; + } + + if (!statement.declaration) { + continue; + } + + // class and function declarations + if (statement.declaration.type !== 'VariableDeclaration') { + if (page_options.has(statement.declaration.id.name)) { + return null; + } + continue; + } + + for (const declaration of statement.declaration.declarations) { + if (declaration.id.type !== 'Identifier') { + return null; + } + + if (!page_options.has(declaration.id.name)) { + continue; + } + + if (declaration.init?.type === 'Literal') { + static_exports.set(declaration.id.name, declaration.init.value); + continue; + } + + // references a declaration we can't easily evaluate statically + return null; + } + } + + return Object.fromEntries(static_exports); + } catch (error) { + if (error instanceof Error) { + error.message = `Failed to statically analyse ${filename}. ${error.message}`; + } + throw error; + } +} + +/** + * @param {import('acorn').Identifier | import('acorn').Literal} node + * @returns {string} + */ +export function get_name(node) { + return node.type === 'Identifier' ? node.name : /** @type {string} */ (node.value); +} + +/** + * @param {(server_node: string) => Promise>} resolve + */ +export function create_static_analyser(resolve) { + /** @type {Map | null>} */ + const static_exports = new Map(); + + /** + * Computes the final page options for a node (if possible). Otherwise, returns `null`. + * @param {import('types').PageNode} node + * @returns {Promise} + */ + const get_page_options = async (node) => { + if (node.universal && static_exports.has(node.universal)) { + return /** @type {import('types').UniversalNode | null} */ ( + static_exports.get(node.universal) + ); + } + + /** @type {Record | null} */ + let page_options = {}; + + if (node.server) { + const module = await resolve(node.server); + for (const key in inheritable_page_options) { + if (key in module) { + page_options[key] = module[key]; + } + } + } + + if (node.universal) { + let universal_exports = static_exports.get(node.universal); + if (universal_exports === undefined) { + const input = read(node.universal); + universal_exports = statically_analyse_exports(node.universal, input); + } + + if (universal_exports === null) { + static_exports.set(node.universal, null); + return null; + } + + page_options = { ...page_options, ...universal_exports }; + } + + if (node.parent) { + const parent_options = await get_page_options(node.parent); + if (parent_options === null) { + // if the parent cannot be statically analysed, we can't know what + // page options the current node inherits, so we invalidate it too + if (node.universal) { + static_exports.set(node.universal, null); + } + return null; + } + + page_options = { ...parent_options, ...page_options }; + } + + if (node.universal) { + static_exports.set(node.universal, page_options); + } + + return page_options; + }; + + /** + * @param {string} file + * @returns {void} + */ + const invalidate_page_options = (file) => { + static_exports.delete(file); + }; + + return { get_page_options, invalidate_page_options }; +} diff --git a/packages/kit/src/exports/vite/static_analysis/index.spec.js b/packages/kit/src/exports/vite/static_analysis/index.spec.js new file mode 100644 index 000000000000..2514555d3033 --- /dev/null +++ b/packages/kit/src/exports/vite/static_analysis/index.spec.js @@ -0,0 +1,190 @@ +import { expect, test } from 'vitest'; +import { statically_analyse_exports } from './index.js'; + +test.each([ + [ + 'multi-line declarations', + ` + export const ssr = false; + export const csr = true; + export const prerender = 'auto'; + export const trailingSlash = 'always'; + ` + ], + [ + 'single-line declarations', + ` + export const ssr = false, csr = true, prerender = 'auto', trailingSlash = 'always'; + ` + ] +])('page option is assigned a literal value: %s', (_, input) => { + const exports = statically_analyse_exports('', input); + expect(exports).toEqual({ ssr: false, csr: true, prerender: 'auto', trailingSlash: 'always' }); +}); + +test.each([ + [ + 'runtime value', + ` + export const ssr = process.env.SSR; + export const prerender = true; + ` + ], + [ + 'object', + ` + export const ssr = false; + export const config = { + runtime: 'edge' + } + ` + ], + [ + 'arrow function', + ` + export const prerender = true; + export const entries = () => { + return [ + { slug: 'foo' } + ] + } + ` + ], + ['export all declaration alias', "export * as ssr from './foo'"] +])('fails when page option is assigned a dynamic value: %s', (_, input) => { + const exports = statically_analyse_exports('', input); + expect(exports).toEqual(null); +}); + +test.each([ + ['load function', 'export async function load () { return {} }'], + ['private export', "export let _foo = 'bar'"], + ['export all declaration alias', 'export * as bar from "./foo"'], + ['non-page option export', "export const foo = 'bar'"] +])('ignores %s', (_, input) => { + const exports = statically_analyse_exports('', input); + expect(exports).toEqual({}); +}); + +test.each([ + ['single line', "export * from './foo';"], + ['multiple lines', "export\n*\nfrom\n'./foo'"], + ['whitespace', 'export * from "./foo";'], + ['multiple lines and whitespace', "export \n *\n from 'abc'; "] +])('fails when export all declaration is used: %s', (_, input) => { + const exports = statically_analyse_exports('', input); + expect(exports).toEqual(null); +}); + +test.each([ + [ + 'let', + ` + export let ssr = true; + export const prerender = true; + ` + ], + [ + 'block scoped assignment', + ` + export let ssr = true; + export const prerender = true; + function foo() { + let ssr = true; + ssr = false; + } + ` + ], + [ + 'switch case scoped assignment', + ` + export let ssr = true; + export const prerender = true; + switch (ssr) { + case true: + let ssr = true; + ssr = false; + break; + } + ` + ], + [ + 'nested block scope assignment', + ` + export let ssr = true; + export const prerender = true; + function foo() { + let ssr = true; + { + ssr = false; + } + } + ` + ], + [ + 'used as assignment value', + ` + export let ssr = true; + export const prerender = true; + let csr; + csr = ssr; + ` + ] +])('non-reassigned page options: %s', (_, input) => { + const exports = statically_analyse_exports('', input); + expect(exports).toEqual({ ssr: true, prerender: true }); +}); + +test.each([ + [ + 'declaration', + ` + let ssr = false; + export { ssr }; + ` + ], + [ + 'export named declaration', + ` + export let foo = false; + export { foo as ssr }; + ` + ] +])('export specifier references: %s', (_, input) => { + const exports = statically_analyse_exports('', input); + expect(exports).toEqual({ ssr: false }); +}); + +test.each([ + [ + 'import specifier', + ` + import { ssr } from './foo'; + export { ssr }; + ` + ], + [ + 'import default specifier', + ` + import ssr from './foo'; + export { ssr }; + ` + ], + [ + 'import namespace specifier', + ` + import * as ssr from './foo'; + export { ssr }; + ` + ], + [ + 'array destructured declaration', + ` + let { ssr } = { ssr: false }; + export { ssr }; + ` + ] +])('fails when export specifier references: %s', (_, input) => { + const exports = statically_analyse_exports('', input); + expect(exports).toEqual(null); +}); diff --git a/packages/kit/src/runtime/server/page/load_data.js b/packages/kit/src/runtime/server/page/load_data.js index 2ada2b6ecde6..74bd7444af4f 100644 --- a/packages/kit/src/runtime/server/page/load_data.js +++ b/packages/kit/src/runtime/server/page/load_data.js @@ -29,6 +29,7 @@ export async function load_server_data({ event, state, node, parent }) { }; const load = node.server.load; + // TODO: shouldn't this be calculated using PageNodes? there could be a trailingSlash option on a layout const slash = node.server.trailingSlash; if (!load) { diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index 81b30e0756a5..ad945974ef58 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -288,7 +288,7 @@ export async function respond(request, options, manifest, state) { let trailing_slash = 'never'; try { - /** @type {PageNodes|undefined} */ + /** @type {PageNodes | undefined} */ const page_nodes = route?.page ? new PageNodes(await load_page_nodes(route.page, manifest)) : undefined; diff --git a/packages/kit/src/types/internal.d.ts b/packages/kit/src/types/internal.d.ts index 2d54b37ac145..17e2425e3c17 100644 --- a/packages/kit/src/types/internal.d.ts +++ b/packages/kit/src/types/internal.d.ts @@ -401,7 +401,7 @@ export interface SSRNode { universal_id?: string; server_id?: string; - /** inlined styles. */ + /** inlined styles */ inline_styles?(): MaybePromise>; /** Svelte component */ component?: SSRComponentLoader; diff --git a/packages/kit/src/utils/page_nodes.js b/packages/kit/src/utils/page_nodes.js index f68f1aac0ac9..5a185b22a93a 100644 --- a/packages/kit/src/utils/page_nodes.js +++ b/packages/kit/src/utils/page_nodes.js @@ -39,16 +39,15 @@ export class PageNodes { } /** - * @template {'prerender' | 'ssr' | 'csr' | 'trailingSlash' | 'entries'} Option - * @template {(import('types').UniversalNode | import('types').ServerNode)[Option]} Value + * @template {'prerender' | 'ssr' | 'csr' | 'trailingSlash'} Option * @param {Option} option * @returns {Value | undefined} */ #get_option(option) { + /** @typedef {(import('types').UniversalNode | import('types').ServerNode)[Option]} Value */ + return this.data.reduce((value, node) => { - return /** @type {Value} TypeScript's too dumb to understand this */ ( - node?.universal?.[option] ?? node?.server?.[option] ?? value - ); + return node?.universal?.[option] ?? node?.server?.[option] ?? value; }, /** @type {Value | undefined} */ (undefined)); } @@ -77,6 +76,7 @@ export class PageNodes { current = { ...current, + // TODO: should we override the server config value with the universal value similar to other page options? ...node?.universal?.config, ...node?.server?.config }; diff --git a/packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.js b/packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.js new file mode 100644 index 000000000000..7857a47382f1 --- /dev/null +++ b/packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.js @@ -0,0 +1,11 @@ +// `document` is only available in the browser and should cause the test to fail +// if this file is imported on the server +const pathname = document.location.pathname; + +export function load() { + return { + pathname + }; +} + +export const ssr = false; diff --git a/packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.svelte b/packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.svelte new file mode 100644 index 000000000000..378328d35703 --- /dev/null +++ b/packages/kit/test/apps/no-ssr/src/routes/browser-globals/+page.svelte @@ -0,0 +1,5 @@ + + +

pathname: {data.pathname}

diff --git a/packages/kit/test/apps/no-ssr/test/test.js b/packages/kit/test/apps/no-ssr/test/test.js index f4a61d76bf3f..7b8c859a9e37 100644 --- a/packages/kit/test/apps/no-ssr/test/test.js +++ b/packages/kit/test/apps/no-ssr/test/test.js @@ -1,8 +1,6 @@ import { expect } from '@playwright/test'; import { test } from '../../../utils.js'; -/** @typedef {import('@playwright/test').Response} Response */ - test.skip(({ javaScriptEnabled }) => !javaScriptEnabled); test.describe.configure({ mode: 'parallel' }); @@ -18,3 +16,8 @@ test('navigating to a non-existent route redirects if redirect in the root layou await page.goto('/redirect'); expect(await page.textContent('h1')).toBe('home'); }); + +test('universal pages/layouts are not executed on the server', async ({ page }) => { + await page.goto('/browser-globals'); + await expect(page.locator('p')).toHaveText('pathname: /browser-globals'); +}); diff --git a/packages/kit/test/apps/writes/src/routes/universal/+page.js b/packages/kit/test/apps/writes/src/routes/universal/+page.js new file mode 100644 index 000000000000..34f05382928b --- /dev/null +++ b/packages/kit/test/apps/writes/src/routes/universal/+page.js @@ -0,0 +1,3 @@ +document.body.style.backgroundColor = 'red'; + +export const ssr = false; diff --git a/packages/kit/test/apps/writes/src/routes/universal/+page.svelte b/packages/kit/test/apps/writes/src/routes/universal/+page.svelte new file mode 100644 index 000000000000..48aa4cb69f99 --- /dev/null +++ b/packages/kit/test/apps/writes/src/routes/universal/+page.svelte @@ -0,0 +1 @@ +

hello world

diff --git a/packages/kit/test/apps/writes/test/test.js b/packages/kit/test/apps/writes/test/test.js index 7e4362012a0a..5ebc88f92e75 100644 --- a/packages/kit/test/apps/writes/test/test.js +++ b/packages/kit/test/apps/writes/test/test.js @@ -53,4 +53,31 @@ test.describe('Filesystem updates', () => { fs.writeFileSync(file, contents.replace(/PLACEHOLDER:\d+/, 'PLACEHOLDER:0')); } }); + + test('Universal node is updated when page options change', async ({ + page, + javaScriptEnabled, + get_computed_style + }) => { + test.skip(!process.env.DEV || !javaScriptEnabled); + + const file = fileURLToPath(new URL('../src/routes/universal/+page.js', import.meta.url)); + const contents = fs.readFileSync(file, 'utf-8'); + + await page.goto('/universal'); + + expect(await get_computed_style('body', 'background-color')).toBe('rgb(255, 0, 0)'); + + try { + fs.writeFileSync(file, contents.replace(/export const ssr = .*;/, 'export const ssr = !1;')); + await page.waitForTimeout(500); // this is the rare time we actually need waitForTimeout; we have no visibility into whether the module graph has been invalidated + expect(await get_computed_style('body', 'background-color')).not.toBe('rgb(255, 0, 0)'); + await expect(page.locator('h1')).toHaveText('Internal Error'); + } finally { + fs.writeFileSync( + file, + contents.replace(/export const ssr = .*;/, 'export const ssr = false;') + ); + } + }); }); diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 4dfb901cda11..b87d7007cc98 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -1881,7 +1881,7 @@ declare module '@sveltejs/kit' { universal_id?: string; server_id?: string; - /** inlined styles. */ + /** inlined styles */ inline_styles?(): MaybePromise>; /** Svelte component */ component?: SSRComponentLoader; diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index dcb3218bc964..7ef5d42b060f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -308,7 +308,7 @@ importers: dependencies: '@sveltejs/kit': specifier: ^1.0.0 || ^2.0.0 - version: link:../kit + version: 2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) devDependencies: typescript: specifier: ^5.3.3 @@ -361,9 +361,15 @@ importers: packages/kit: dependencies: + '@sveltejs/acorn-typescript': + specifier: ^1.0.5 + version: 1.0.5(acorn@8.14.1) '@types/cookie': specifier: ^0.6.0 version: 0.6.0 + acorn: + specifier: ^8.14.1 + version: 8.14.1 cookie: specifier: ^0.6.0 version: 0.6.0 @@ -1970,6 +1976,15 @@ packages: typescript: '>= 5' typescript-eslint: '>= 7.5' + '@sveltejs/kit@2.20.8': + resolution: {integrity: sha512-ep9qTxL7WALhfm0kFecL3VHeuNew8IccbYGqv5TqL/KSqWRKzEgDG8blNlIu1CkLTTua/kHjI+f5T8eCmWIxKw==} + engines: {node: '>=18.13'} + hasBin: true + peerDependencies: + '@sveltejs/vite-plugin-svelte': ^3.0.0 || ^4.0.0-next.1 || ^5.0.0 + svelte: ^4.0.0 || ^5.0.0-next.0 + vite: ^5.0.3 || ^6.0.0 + '@sveltejs/vite-plugin-svelte-inspector@4.0.1': resolution: {integrity: sha512-J/Nmb2Q2y7mck2hyCX4ckVHcR5tu2J+MtBEQqpDrrgELZ2uvraQcK/ioCV61AqkdXFgriksOKIceDcQmqnGhVw==} engines: {node: ^18.0.0 || ^20.0.0 || >=22} @@ -4353,6 +4368,23 @@ snapshots: typescript: 5.6.3 typescript-eslint: 8.26.0(eslint@9.6.0)(typescript@5.6.3) + '@sveltejs/kit@2.20.8(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1))': + dependencies: + '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) + '@types/cookie': 0.6.0 + cookie: 0.6.0 + devalue: 5.1.0 + esm-env: 1.2.2 + import-meta-resolve: 4.1.0 + kleur: 4.1.5 + magic-string: 0.30.17 + mrmime: 2.0.0 + sade: 1.8.1 + set-cookie-parser: 2.6.0 + sirv: 3.0.0 + svelte: 5.23.1 + vite: 6.2.7(@types/node@18.19.50)(lightningcss@1.24.1) + '@sveltejs/vite-plugin-svelte-inspector@4.0.1(@sveltejs/vite-plugin-svelte@5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)))(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1))': dependencies: '@sveltejs/vite-plugin-svelte': 5.0.3(svelte@5.23.1)(vite@6.2.7(@types/node@18.19.50)(lightningcss@1.24.1)) From 6c51062eb2df22aad18643d90be3bc08776b0c07 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Mon, 12 May 2025 16:24:41 -0400 Subject: [PATCH 1071/1135] fix lockfile --- pnpm-lock.yaml | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 7ef5d42b060f..9b646b37feab 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -2703,6 +2703,9 @@ packages: resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} engines: {node: '>=6'} + import-meta-resolve@4.1.0: + resolution: {integrity: sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==} + imurmurhash@0.1.4: resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} engines: {node: '>=0.8.19'} @@ -5176,6 +5179,8 @@ snapshots: parent-module: 1.0.1 resolve-from: 4.0.0 + import-meta-resolve@4.1.0: {} + imurmurhash@0.1.4: {} is-arrayish@0.3.2: {} From d0f2d7b8cbb0d2f469141349ac168f54299f1683 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Mon, 12 May 2025 16:27:43 -0400 Subject: [PATCH 1072/1135] Version Packages (#13783) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/afraid-scissors-own.md | 5 ----- .changeset/famous-points-switch.md | 6 ------ .changeset/forty-weeks-arrive.md | 5 ----- .changeset/weak-snails-decide.md | 5 ----- packages/adapter-auto/CHANGELOG.md | 9 +++++++++ packages/adapter-auto/package.json | 2 +- packages/enhanced-img/CHANGELOG.md | 6 ++++++ packages/enhanced-img/package.json | 2 +- packages/kit/CHANGELOG.md | 15 +++++++++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 11 files changed, 34 insertions(+), 25 deletions(-) delete mode 100644 .changeset/afraid-scissors-own.md delete mode 100644 .changeset/famous-points-switch.md delete mode 100644 .changeset/forty-weeks-arrive.md delete mode 100644 .changeset/weak-snails-decide.md diff --git a/.changeset/afraid-scissors-own.md b/.changeset/afraid-scissors-own.md deleted file mode 100644 index 2e821e292516..000000000000 --- a/.changeset/afraid-scissors-own.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/enhanced-img': minor ---- - -feat: add validation to ensure plugin occurs in correct order diff --git a/.changeset/famous-points-switch.md b/.changeset/famous-points-switch.md deleted file mode 100644 index 1ea3c3ba3d40..000000000000 --- a/.changeset/famous-points-switch.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -'@sveltejs/adapter-auto': patch -'@sveltejs/kit': patch ---- - -chore: remove `import-meta-resolve` dependency diff --git a/.changeset/forty-weeks-arrive.md b/.changeset/forty-weeks-arrive.md deleted file mode 100644 index f9be0b1552ca..000000000000 --- a/.changeset/forty-weeks-arrive.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': minor ---- - -feat: allow running client-side code at the top-level of universal pages/layouts when SSR is disabled and page options are only boolean or string literals diff --git a/.changeset/weak-snails-decide.md b/.changeset/weak-snails-decide.md deleted file mode 100644 index c3b814f97b07..000000000000 --- a/.changeset/weak-snails-decide.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: remove component code from server nodes that are never used for SSR diff --git a/packages/adapter-auto/CHANGELOG.md b/packages/adapter-auto/CHANGELOG.md index d530b435e833..c0373fa2e695 100644 --- a/packages/adapter-auto/CHANGELOG.md +++ b/packages/adapter-auto/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/adapter-auto +## 6.0.1 +### Patch Changes + + +- chore: remove `import-meta-resolve` dependency ([#13629](https://github.com/sveltejs/kit/pull/13629)) + +- Updated dependencies [[`bd1c04662332cbafa843c35a2e783486116af3d5`](https://github.com/sveltejs/kit/commit/bd1c04662332cbafa843c35a2e783486116af3d5), [`09f61ec2a14573e27769edb403c58aea5433a39f`](https://github.com/sveltejs/kit/commit/09f61ec2a14573e27769edb403c58aea5433a39f), [`09f61ec2a14573e27769edb403c58aea5433a39f`](https://github.com/sveltejs/kit/commit/09f61ec2a14573e27769edb403c58aea5433a39f)]: + - @sveltejs/kit@2.21.0 + ## 6.0.0 ### Major Changes diff --git a/packages/adapter-auto/package.json b/packages/adapter-auto/package.json index e9567286fbd5..f42ac51e9680 100644 --- a/packages/adapter-auto/package.json +++ b/packages/adapter-auto/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/adapter-auto", - "version": "6.0.0", + "version": "6.0.1", "description": "Automatically chooses the SvelteKit adapter for your current environment, if possible.", "keywords": [ "adapter", diff --git a/packages/enhanced-img/CHANGELOG.md b/packages/enhanced-img/CHANGELOG.md index ea30ed157639..53e813bfc9cb 100644 --- a/packages/enhanced-img/CHANGELOG.md +++ b/packages/enhanced-img/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/enhanced-img +## 0.6.0 +### Minor Changes + + +- feat: add validation to ensure plugin occurs in correct order ([`1c3f36dc10265fb79c64643c3d7a91469d34e697`](https://github.com/sveltejs/kit/commit/1c3f36dc10265fb79c64643c3d7a91469d34e697)) + ## 0.5.1 ### Patch Changes diff --git a/packages/enhanced-img/package.json b/packages/enhanced-img/package.json index a56f590b7827..db2058f7d190 100644 --- a/packages/enhanced-img/package.json +++ b/packages/enhanced-img/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/enhanced-img", - "version": "0.5.1", + "version": "0.6.0", "description": "Image optimization for your Svelte apps", "repository": { "type": "git", diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 6d348fa64b52..3ccdbd2263c0 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,20 @@ # @sveltejs/kit +## 2.21.0 +### Minor Changes + + +- feat: allow running client-side code at the top-level of universal pages/layouts when SSR is disabled and page options are only boolean or string literals ([#13684](https://github.com/sveltejs/kit/pull/13684)) + + +### Patch Changes + + +- chore: remove `import-meta-resolve` dependency ([#13629](https://github.com/sveltejs/kit/pull/13629)) + + +- fix: remove component code from server nodes that are never used for SSR ([#13684](https://github.com/sveltejs/kit/pull/13684)) + ## 2.20.8 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 4166a5068147..e1b56ca53922 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.20.8", + "version": "2.21.0", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 576661e8272f..d864399c2488 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.20.8'; +export const VERSION = '2.21.0'; From 39f7b735fbe89b547059bfb6b0105502c00a4f5a Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 14 May 2025 08:15:47 -0700 Subject: [PATCH 1073/1135] docs: expand docs for fail method (#13789) --- packages/kit/src/exports/index.js | 6 +++--- packages/kit/types/index.d.ts | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/packages/kit/src/exports/index.js b/packages/kit/src/exports/index.js index 4d2bb75223f3..e587ede88581 100644 --- a/packages/kit/src/exports/index.js +++ b/packages/kit/src/exports/index.js @@ -180,14 +180,14 @@ export function text(body, init) { } /** - * Create an `ActionFailure` object. + * Create an `ActionFailure` object. Call when form submission fails. * @param {number} status The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses). Must be in the range 400-599. * @overload * @param {number} status * @returns {import('./public.js').ActionFailure} */ /** - * Create an `ActionFailure` object. + * Create an `ActionFailure` object. Call when form submission fails. * @template {Record | undefined} [T=undefined] * @param {number} status The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses). Must be in the range 400-599. * @param {T} data Data associated with the failure (e.g. validation errors) @@ -197,7 +197,7 @@ export function text(body, init) { * @returns {import('./public.js').ActionFailure} */ /** - * Create an `ActionFailure` object. + * Create an `ActionFailure` object. Call when form submission fails. * @param {number} status * @param {any} [data] * @returns {import('./public.js').ActionFailure} diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index b87d7007cc98..30ac9392314e 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -2001,12 +2001,12 @@ declare module '@sveltejs/kit' { */ export function text(body: string, init?: ResponseInit | undefined): Response; /** - * Create an `ActionFailure` object. + * Create an `ActionFailure` object. Call when form submission fails. * @param status The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses). Must be in the range 400-599. * */ export function fail(status: number): ActionFailure; /** - * Create an `ActionFailure` object. + * Create an `ActionFailure` object. Call when form submission fails. * @param status The [HTTP status code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status#client_error_responses). Must be in the range 400-599. * @param data Data associated with the failure (e.g. validation errors) * */ From b666e15ba3f25b04644f699282ed324c141f91c7 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Wed, 14 May 2025 08:36:09 -0700 Subject: [PATCH 1074/1135] chore: minor dependency updates --- package.json | 4 ++-- packages/kit/package.json | 2 +- pnpm-lock.yaml | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/package.json b/package.json index 153c9acd9abb..61e205354863 100644 --- a/package.json +++ b/package.json @@ -23,15 +23,15 @@ }, "devDependencies": { "@changesets/cli": "^2.27.11", + "@playwright/test": "catalog:", "@sveltejs/eslint-config": "^8.1.0", "@svitejs/changesets-changelog-github-compact": "^1.1.0", "eslint": "^9.6.0", - "@playwright/test": "catalog:", "prettier": "^3.1.1", "prettier-plugin-svelte": "^3.1.2", "typescript-eslint": "^8.24.0" }, - "packageManager": "pnpm@10.10.0", + "packageManager": "pnpm@10.11.0", "engines": { "pnpm": ">=9.0.0" }, diff --git a/packages/kit/package.json b/packages/kit/package.json index e1b56ca53922..84c858417b13 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -37,7 +37,7 @@ "@types/connect": "^3.4.38", "@types/node": "^18.19.48", "@types/set-cookie-parser": "^2.4.7", - "dts-buddy": "^0.6.0", + "dts-buddy": "^0.6.1", "rollup": "^4.14.2", "svelte": "^5.23.1", "svelte-preprocess": "^6.0.0", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 9b646b37feab..6cfbfe6d8d90 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -414,7 +414,7 @@ importers: specifier: ^2.4.7 version: 2.4.7 dts-buddy: - specifier: ^0.6.0 + specifier: ^0.6.1 version: 0.6.1(typescript@5.6.3) rollup: specifier: ^4.14.2 From a14027c340479d3f4a7b81dd40754d8a89374912 Mon Sep 17 00:00:00 2001 From: Tristan <62366897+TitanCmd@users.noreply.github.com> Date: Fri, 16 May 2025 02:38:54 +1000 Subject: [PATCH 1075/1135] docs: fix link for sst adapter 30-adapter-auto.md (#13792) --- documentation/docs/25-build-and-deploy/30-adapter-auto.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/25-build-and-deploy/30-adapter-auto.md b/documentation/docs/25-build-and-deploy/30-adapter-auto.md index be55193b0fdc..0e60deae69e1 100644 --- a/documentation/docs/25-build-and-deploy/30-adapter-auto.md +++ b/documentation/docs/25-build-and-deploy/30-adapter-auto.md @@ -8,7 +8,7 @@ When you create a new SvelteKit project with `npx sv create`, it installs [`adap - [`@sveltejs/adapter-netlify`](adapter-netlify) for [Netlify](https://netlify.com/) - [`@sveltejs/adapter-vercel`](adapter-vercel) for [Vercel](https://vercel.com/) - [`svelte-adapter-azure-swa`](https://github.com/geoffrich/svelte-adapter-azure-swa) for [Azure Static Web Apps](https://docs.microsoft.com/en-us/azure/static-web-apps/) -- [`svelte-kit-sst`](https://github.com/sst/sst/tree/master/packages/svelte-kit-sst) for [AWS via SST](https://sst.dev/docs/start/aws/svelte) +- [`svelte-kit-sst`](https://github.com/sst/v2/tree/master/packages/svelte-kit-sst) for [AWS via SST](https://sst.dev/docs/start/aws/svelte) - [`@sveltejs/adapter-node`](adapter-node) for [Google Cloud Run](https://cloud.google.com/run) It's recommended to install the appropriate adapter to your `devDependencies` once you've settled on a target environment, since this will add the adapter to your lockfile and slightly improve install times on CI. From df163d2cb1701069d16fe7bd69876d887d8e25dd Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 19 May 2025 00:42:42 +0800 Subject: [PATCH 1076/1135] fix: set `$env` and `$app/environment` variables before analysing server nodes (#13790) * fix, test, and changeset * format * fix test * avoid analysing twice when building nodes * return cache and reuse it since analyse is a forked process --- .changeset/smooth-rockets-complain.md | 5 ++++ packages/kit/src/core/postbuild/analyse.js | 25 ++++++++++++++++--- .../src/exports/vite/build/build_server.js | 15 +++++++---- packages/kit/src/exports/vite/dev/index.js | 14 ++++++----- packages/kit/src/exports/vite/index.js | 20 +++++---------- .../src/exports/vite/static_analysis/index.js | 10 ++++---- .../basics/src/routes/node-analysis/+page.js | 1 + .../src/routes/node-analysis/+page.server.js | 9 +++++++ .../src/routes/node-analysis/+page.svelte | 0 9 files changed, 66 insertions(+), 33 deletions(-) create mode 100644 .changeset/smooth-rockets-complain.md create mode 100644 packages/kit/test/apps/basics/src/routes/node-analysis/+page.js create mode 100644 packages/kit/test/apps/basics/src/routes/node-analysis/+page.server.js create mode 100644 packages/kit/test/apps/basics/src/routes/node-analysis/+page.svelte diff --git a/.changeset/smooth-rockets-complain.md b/.changeset/smooth-rockets-complain.md new file mode 100644 index 000000000000..bef17f43b517 --- /dev/null +++ b/.changeset/smooth-rockets-complain.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: ensure `$env` and `$app/environment` are correctly set while analysing server nodes diff --git a/packages/kit/src/core/postbuild/analyse.js b/packages/kit/src/core/postbuild/analyse.js index 25bd403f1eb8..713f4ea66141 100644 --- a/packages/kit/src/core/postbuild/analyse.js +++ b/packages/kit/src/core/postbuild/analyse.js @@ -10,6 +10,7 @@ import { has_server_load, resolve_route } from '../../utils/routing.js'; import { check_feature } from '../../utils/features.js'; import { createReadableStream } from '@sveltejs/kit/node'; import { PageNodes } from '../../utils/page_nodes.js'; +import { build_server_nodes } from '../../exports/vite/build/build_server.js'; export default forked(import.meta.url, analyse); @@ -20,7 +21,9 @@ export default forked(import.meta.url, analyse); * manifest_data: import('types').ManifestData; * server_manifest: import('vite').Manifest; * tracked_features: Record; - * env: Record + * env: Record; + * out: string; + * output_config: import('types').RecursiveRequired; * }} opts */ async function analyse({ @@ -29,7 +32,9 @@ async function analyse({ manifest_data, server_manifest, tracked_features, - env + env, + out, + output_config }) { /** @type {import('@sveltejs/kit').SSRManifest} */ const manifest = (await import(pathToFileURL(manifest_path).href)).manifest; @@ -58,6 +63,20 @@ async function analyse({ internal.set_manifest(manifest); internal.set_read_implementation((file) => createReadableStream(`${server_root}/server/${file}`)); + const static_exports = new Map(); + + // first, build server nodes without the client manifest so we can analyse it + await build_server_nodes( + out, + config, + manifest_data, + server_manifest, + null, + null, + output_config, + static_exports + ); + /** @type {import('types').ServerMetadata} */ const metadata = { nodes: [], @@ -143,7 +162,7 @@ async function analyse({ }); } - return metadata; + return { metadata, static_exports }; } /** diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index e9aafe75b505..9332322aa572 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -4,7 +4,8 @@ import { filter_fonts, find_deps, resolve_symlinks } from './utils.js'; import { s } from '../../../utils/misc.js'; import { normalizePath } from 'vite'; import { basename, join } from 'node:path'; -import { create_static_analyser } from '../static_analysis/index.js'; +import { create_node_analyser } from '../static_analysis/index.js'; + /** * @param {string} out @@ -14,8 +15,9 @@ import { create_static_analyser } from '../static_analysis/index.js'; * @param {import('vite').Manifest | null} client_manifest * @param {import('vite').Rollup.OutputAsset[] | null} css * @param {import('types').RecursiveRequired} output_config + * @param {Map | null>} static_exports */ -export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, css, output_config) { +export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, css, output_config, static_exports) { mkdirp(`${out}/server/nodes`); mkdirp(`${out}/server/stylesheets`); @@ -74,9 +76,12 @@ export async function build_server_nodes(out, kit, manifest_data, server_manifes } } - const { get_page_options } = create_static_analyser(async (server_node) => { - // Windows needs the file:// protocol for absolute path dynamic imports - return import(`file://${join(out, 'server', resolve_symlinks(server_manifest, server_node).chunk.file)}`); + const { get_page_options } = create_node_analyser({ + resolve: (server_node) => { + // Windows needs the file:// protocol for absolute path dynamic imports + return import(`file://${join(out, 'server', resolve_symlinks(server_manifest, server_node).chunk.file)}`); + }, + static_exports }); for (let i = 0; i < manifest_data.nodes.length; i++) { diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 9ed6dd17c4af..28beac7603b2 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -19,7 +19,7 @@ import { not_found } from '../utils.js'; import { SCHEME } from '../../../utils/url.js'; import { check_feature } from '../../../utils/features.js'; import { escape_html } from '../../../utils/escape.js'; -import { create_static_analyser } from '../static_analysis/index.js'; +import { create_node_analyser } from '../static_analysis/index.js'; const cwd = process.cwd(); // vite-specifc queries that we should skip handling for css urls @@ -128,11 +128,13 @@ export async function dev(vite, vite_config, svelte_config) { return; } - const static_analyser = create_static_analyser(async (server_node) => { - const { module } = await resolve(server_node); - return module; + const node_analyser = create_node_analyser({ + resolve: async (server_node) => { + const { module } = await resolve(server_node); + return module; + } }); - invalidate_page_options = static_analyser.invalidate_page_options; + invalidate_page_options = node_analyser.invalidate_page_options; manifest = { appDir: svelte_config.kit.appDir, @@ -212,7 +214,7 @@ export async function dev(vite, vite_config, svelte_config) { } if (node.universal) { - const page_options = await static_analyser.get_page_options(node); + const page_options = await node_analyser.get_page_options(node); if (page_options?.ssr === false) { result.universal = page_options; } else { diff --git a/packages/kit/src/exports/vite/index.js b/packages/kit/src/exports/vite/index.js index 8f1f7fe00254..e23cf2b833fc 100644 --- a/packages/kit/src/exports/vite/index.js +++ b/packages/kit/src/exports/vite/index.js @@ -818,26 +818,17 @@ Tips: })};\n` ); - // first, build server nodes without the client manifest so we can analyse it log.info('Analysing routes'); - await build_server_nodes( - out, - kit, - manifest_data, - server_manifest, - null, - null, - svelte_config.output - ); - - const metadata = await analyse({ + const { metadata, static_exports } = await analyse({ hash: kit.router.type === 'hash', manifest_path, manifest_data, server_manifest, tracked_features, - env: { ...env.private, ...env.public } + env: { ...env.private, ...env.public }, + out, + output_config: svelte_config.output }); log.info('Building app'); @@ -990,7 +981,8 @@ Tips: server_manifest, client_manifest, css, - svelte_config.kit.output + svelte_config.kit.output, + static_exports ); // ...and prerender diff --git a/packages/kit/src/exports/vite/static_analysis/index.js b/packages/kit/src/exports/vite/static_analysis/index.js index 125319e1c0de..94600d19e574 100644 --- a/packages/kit/src/exports/vite/static_analysis/index.js +++ b/packages/kit/src/exports/vite/static_analysis/index.js @@ -181,12 +181,12 @@ export function get_name(node) { } /** - * @param {(server_node: string) => Promise>} resolve + * @param {{ + * resolve: (file: string) => Promise>; + * static_exports?: Map | null>; + * }} opts */ -export function create_static_analyser(resolve) { - /** @type {Map | null>} */ - const static_exports = new Map(); - +export function create_node_analyser({ resolve, static_exports = new Map() }) { /** * Computes the final page options for a node (if possible). Otherwise, returns `null`. * @param {import('types').PageNode} node diff --git a/packages/kit/test/apps/basics/src/routes/node-analysis/+page.js b/packages/kit/test/apps/basics/src/routes/node-analysis/+page.js new file mode 100644 index 000000000000..762bb7a35d33 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/node-analysis/+page.js @@ -0,0 +1 @@ +// this universal file causes the server node to be evaluated during static analysis diff --git a/packages/kit/test/apps/basics/src/routes/node-analysis/+page.server.js b/packages/kit/test/apps/basics/src/routes/node-analysis/+page.server.js new file mode 100644 index 000000000000..0ce3a99eff92 --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/node-analysis/+page.server.js @@ -0,0 +1,9 @@ +// this module is evaluated when building the server nodes to determine its page options +// Therefore, we need to ensure $env, etc. still works during this process so that it doesn't throw errors +// when it's evaluated as `undefined` + +import { env } from '$env/dynamic/public'; + +if (!env.PUBLIC_DYNAMIC) { + throw Error('this should not happen'); +} diff --git a/packages/kit/test/apps/basics/src/routes/node-analysis/+page.svelte b/packages/kit/test/apps/basics/src/routes/node-analysis/+page.svelte new file mode 100644 index 000000000000..e69de29bb2d1 From 5ab5762d026ed9683e11b9a0b0ec700bc9fea7a4 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 19 May 2025 01:11:27 +0800 Subject: [PATCH 1077/1135] docs: clarify what `handleFetch` affects (#13788) * clarify what handleFetch affects * edit function message too * changeset * tweak wording * reword to avoid the subhed --------- Co-authored-by: Rich Harris --- .changeset/old-kangaroos-jog.md | 5 +++++ documentation/docs/30-advanced/20-hooks.md | 10 +++------- packages/kit/src/exports/public.d.ts | 2 +- packages/kit/types/index.d.ts | 2 +- 4 files changed, 10 insertions(+), 9 deletions(-) create mode 100644 .changeset/old-kangaroos-jog.md diff --git a/.changeset/old-kangaroos-jog.md b/.changeset/old-kangaroos-jog.md new file mode 100644 index 000000000000..6ae48a114c53 --- /dev/null +++ b/.changeset/old-kangaroos-jog.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +chore: clarify which functions `handleFetch` affects diff --git a/documentation/docs/30-advanced/20-hooks.md b/documentation/docs/30-advanced/20-hooks.md index f924b83ad075..fffd0f1aea2e 100644 --- a/documentation/docs/30-advanced/20-hooks.md +++ b/documentation/docs/30-advanced/20-hooks.md @@ -106,7 +106,7 @@ Note that `resolve(...)` will never throw an error, it will always return a `Pro ### handleFetch -This function allows you to modify (or replace) a `fetch` request that happens inside a `load`, `action` or `handle` function that runs on the server (or during prerendering). +This function allows you to modify (or replace) the result of an [`event.fetch`](load#Making-fetch-requests) call that runs on the server (or during prerendering) inside an endpoint, `load`, `action`, `handle`, `handleError` or `reroute`. For example, your `load` function might make a request to a public URL like `https://api.yourapp.com` when the user performs a client-side navigation to the respective page, but during SSR it might make sense to hit the API directly (bypassing whatever proxies and load balancers sit between it and the public internet). @@ -126,13 +126,9 @@ export async function handleFetch({ request, fetch }) { } ``` -**Credentials** +Requests made with `event.fetch` follow the browser's credentials model — for same-origin requests, `cookie` and `authorization` headers are forwarded unless the `credentials` option is set to `"omit"`. For cross-origin requests, `cookie` will be included if the request URL belongs to a subdomain of the app — for example if your app is on `my-domain.com`, and your API is on `api.my-domain.com`, cookies will be included in the request. -For same-origin requests, SvelteKit's `fetch` implementation will forward `cookie` and `authorization` headers unless the `credentials` option is set to `"omit"`. - -For cross-origin requests, `cookie` will be included if the request URL belongs to a subdomain of the app — for example if your app is on `my-domain.com`, and your API is on `api.my-domain.com`, cookies will be included in the request. - -If your app and your API are on sibling subdomains — `www.my-domain.com` and `api.my-domain.com` for example — then a cookie belonging to a common parent domain like `my-domain.com` will _not_ be included, because SvelteKit has no way to know which domain the cookie belongs to. In these cases you will need to manually include the cookie using `handleFetch`: +There is one caveat: if your app and your API are on sibling subdomains — `www.my-domain.com` and `api.my-domain.com` for example — then a cookie belonging to a common parent domain like `my-domain.com` will _not_ be included, because SvelteKit has no way to know which domain the cookie belongs to. In these cases you will need to manually include the cookie using `handleFetch`: ```js /// file: src/hooks.server.js diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 684f18981610..66374dd5fdd1 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -790,7 +790,7 @@ export type HandleClientError = (input: { }) => MaybePromise; /** - * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during prerendering). + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) the result of an [`event.fetch`](https://svelte.dev/docs/kit/load#Making-fetch-requests) call that runs on the server (or during prerendering) inside an endpoint, `load`, `action`, `handle`, `handleError` or `reroute`. */ export type HandleFetch = (input: { event: RequestEvent; diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 30ac9392314e..300a6f726ebb 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -772,7 +772,7 @@ declare module '@sveltejs/kit' { }) => MaybePromise; /** - * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) a `fetch` request that happens inside a `load` function that runs on the server (or during prerendering). + * The [`handleFetch`](https://svelte.dev/docs/kit/hooks#Server-hooks-handleFetch) hook allows you to modify (or replace) the result of an [`event.fetch`](https://svelte.dev/docs/kit/load#Making-fetch-requests) call that runs on the server (or during prerendering) inside an endpoint, `load`, `action`, `handle`, `handleError` or `reroute`. */ export type HandleFetch = (input: { event: RequestEvent; From ee2ea0d5c6c9c8a06a73f9c7b0dc762d6bc9b1f5 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 18 May 2025 13:16:05 -0400 Subject: [PATCH 1078/1135] docs: remove unused bolding (#13801) --- documentation/docs/20-core-concepts/40-page-options.md | 2 +- .../docs/25-build-and-deploy/60-adapter-cloudflare.md | 8 ++++---- .../25-build-and-deploy/70-adapter-cloudflare-workers.md | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/documentation/docs/20-core-concepts/40-page-options.md b/documentation/docs/20-core-concepts/40-page-options.md index ff64aa7416c2..aa4068b7a8b5 100644 --- a/documentation/docs/20-core-concepts/40-page-options.md +++ b/documentation/docs/20-core-concepts/40-page-options.md @@ -2,7 +2,7 @@ title: Page options --- -By default, SvelteKit will render (or [prerender](glossary#Prerendering)) any component first on the server and send it to the client as HTML. It will then render the component again in the browser to make it interactive in a process called [**hydration**](glossary#Hydration). For this reason, you need to ensure that components can run in both places. SvelteKit will then initialize a [**router**](routing) that takes over subsequent navigations. +By default, SvelteKit will render (or [prerender](glossary#Prerendering)) any component first on the server and send it to the client as HTML. It will then render the component again in the browser to make it interactive in a process called [_hydration_](glossary#Hydration). For this reason, you need to ensure that components can run in both places. SvelteKit will then initialize a [_router_](routing) that takes over subsequent navigations. You can control each of these on a page-by-page basis by exporting options from [`+page.js`](routing#page-page.js) or [`+page.server.js`](routing#page-page.server.js), or for groups of pages using a shared [`+layout.js`](routing#layout-layout.js) or [`+layout.server.js`](routing#layout-layout.server.js). To define an option for the whole app, export it from the root layout. Child layouts and pages override values set in parent layouts, so — for example — you can enable prerendering for your entire app then disable it for pages that need to be dynamically rendered. diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index b078b25ee4fa..665214fb718b 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -108,9 +108,9 @@ Please follow the [Get Started Guide](https://developers.cloudflare.com/pages/ge If you're using the [Git integration](https://developers.cloudflare.com/pages/get-started/git-integration/), your build settings should look like this: -- **Framework preset** – SvelteKit -- **Build command** – `npm run build` or `vite build` -- **Build output directory** – `.svelte-kit/cloudflare` +- Framework preset – SvelteKit +- Build command – `npm run build` or `vite build` +- Build output directory – `.svelte-kit/cloudflare` ### Further reading @@ -157,7 +157,7 @@ export {}; Cloudflare specific values in the `platform` property are emulated during dev and preview modes. Local [bindings](https://developers.cloudflare.com/workers/wrangler/configuration/#bindings) are created based on your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/) and are used to populate `platform.env` during development and preview. Use the adapter config [`platformProxy` option](#Options-platformProxy) to change your preferences for the bindings. -For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 4**. Once you have built your site, run `wrangler dev .svelte-kit/cloudflare` if you're testing for Cloudflare Workers or `wrangler pages dev .svelte-kit/cloudflare` for Cloudflare Pages. +For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) version 4. Once you have built your site, run `wrangler dev .svelte-kit/cloudflare` if you're testing for Cloudflare Workers or `wrangler pages dev .svelte-kit/cloudflare` for Cloudflare Pages. ## Headers and redirects diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index f346b1d83572..942f57fed034 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -112,7 +112,7 @@ export {}; Cloudflare Workers specific values in the `platform` property are emulated during dev and preview modes. Local [bindings](https://developers.cloudflare.com/workers/wrangler/configuration/#bindings) are created based on your [Wrangler configuration file](https://developers.cloudflare.com/workers/wrangler/) and are used to populate `platform.env` during development and preview. Use the adapter config [`platformProxy` option](#Options-platformProxy) to change your preferences for the bindings. -For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) **version 4**. Once you have built your site, run `wrangler dev`. +For testing the build, you should use [Wrangler](https://developers.cloudflare.com/workers/wrangler/) version 4. Once you have built your site, run `wrangler dev`. ## Troubleshooting From 44a7aae0daaa8fb5ff9086d8261c523a507e4ba1 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Sun, 18 May 2025 13:16:51 -0400 Subject: [PATCH 1079/1135] Version Packages (#13800) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/old-kangaroos-jog.md | 5 ----- .changeset/smooth-rockets-complain.md | 5 ----- packages/kit/CHANGELOG.md | 9 +++++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 5 files changed, 11 insertions(+), 12 deletions(-) delete mode 100644 .changeset/old-kangaroos-jog.md delete mode 100644 .changeset/smooth-rockets-complain.md diff --git a/.changeset/old-kangaroos-jog.md b/.changeset/old-kangaroos-jog.md deleted file mode 100644 index 6ae48a114c53..000000000000 --- a/.changeset/old-kangaroos-jog.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -chore: clarify which functions `handleFetch` affects diff --git a/.changeset/smooth-rockets-complain.md b/.changeset/smooth-rockets-complain.md deleted file mode 100644 index bef17f43b517..000000000000 --- a/.changeset/smooth-rockets-complain.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: ensure `$env` and `$app/environment` are correctly set while analysing server nodes diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 3ccdbd2263c0..e2d421fbd7ac 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,14 @@ # @sveltejs/kit +## 2.21.1 +### Patch Changes + + +- chore: clarify which functions `handleFetch` affects ([#13788](https://github.com/sveltejs/kit/pull/13788)) + + +- fix: ensure `$env` and `$app/environment` are correctly set while analysing server nodes ([#13790](https://github.com/sveltejs/kit/pull/13790)) + ## 2.21.0 ### Minor Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index 84c858417b13..fd6a3ec69d76 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.21.0", + "version": "2.21.1", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index d864399c2488..38129b528756 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.21.0'; +export const VERSION = '2.21.1'; From 969ec95c1baeb8a0b070fcbc7dae38d577242030 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Sun, 18 May 2025 13:22:02 -0400 Subject: [PATCH 1080/1135] docs: remove h4 (#13802) --- documentation/docs/60-appendix/10-faq.md | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/documentation/docs/60-appendix/10-faq.md b/documentation/docs/60-appendix/10-faq.md index 5b75f2cdba5f..5caa0f5b7b9f 100644 --- a/documentation/docs/60-appendix/10-faq.md +++ b/documentation/docs/60-appendix/10-faq.md @@ -193,9 +193,7 @@ Sort of. The Plug'n'Play feature, aka 'pnp', is broken (it deviates from the Nod Currently ESM Support within the latest Yarn (version 3) is considered [experimental](https://github.com/yarnpkg/berry/pull/2161). -The below seems to work although your results may vary. - -First create a new application: +The below seems to work although your results may vary. First create a new application: ```sh yarn create svelte myapp @@ -209,8 +207,6 @@ yarn set version berry yarn install ``` -#### Yarn 3 global cache - One of the more interesting features of Yarn Berry is the ability to have a single global cache for packages, instead of having multiple copies for each project on the disk. However, setting `enableGlobalCache` to true causes building to fail, so it is recommended to add the following to the `.yarnrc.yml` file: ```yaml From 2d7bb2d54b9c6904d60f1dc4c5c21af385b80ced Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Thu, 22 May 2025 07:55:48 -0700 Subject: [PATCH 1081/1135] docs: update link from deprecated docs --- documentation/docs/25-build-and-deploy/90-adapter-vercel.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index 43e237b80902..c7688ebb0b28 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -172,7 +172,7 @@ Since all of these variables are unchanged between build time and run time when ## Skew protection -When a new version of your app is deployed, assets belonging to the previous version may no longer be accessible. If a user is actively using your app when this happens, it can cause errors when they navigate — this is known as _version skew_. SvelteKit mitigates this by detecting errors resulting from version skew and causing a hard reload to get the latest version of the app, but this will cause any client-side state to be lost. (You can also proactively mitigate it by observing the [`updated`]($app-stores#updated) store value, which tells clients when a new version has been deployed.) +When a new version of your app is deployed, assets belonging to the previous version may no longer be accessible. If a user is actively using your app when this happens, it can cause errors when they navigate — this is known as _version skew_. SvelteKit mitigates this by detecting errors resulting from version skew and causing a hard reload to get the latest version of the app, but this will cause any client-side state to be lost. (You can also proactively mitigate it by observing the [`updated`]($app-state#updated) value in the app state, which tells clients when a new version has been deployed.) [Skew protection](https://vercel.com/docs/deployments/skew-protection) is a Vercel feature that routes client requests to their original deployment. When a user visits your app, a cookie is set with the deployment ID, and any subsequent requests will be routed to that deployment for as long as skew protection is active. When they reload the page, they will get the newest deployment. (The `updated` store is exempted from this behaviour, and so will continue to report new deployments.) To enable it, visit the Advanced section of your project settings on Vercel. From b45cd46471c28e5948706e41c99d5db4236a40f9 Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Fri, 23 May 2025 10:06:13 -0400 Subject: [PATCH 1082/1135] docs: tweak adapter-vercel skew protection docs (#13817) * make reference a bit clearer * missed a spot --- documentation/docs/25-build-and-deploy/90-adapter-vercel.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index c7688ebb0b28..58e8079cda27 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -172,9 +172,9 @@ Since all of these variables are unchanged between build time and run time when ## Skew protection -When a new version of your app is deployed, assets belonging to the previous version may no longer be accessible. If a user is actively using your app when this happens, it can cause errors when they navigate — this is known as _version skew_. SvelteKit mitigates this by detecting errors resulting from version skew and causing a hard reload to get the latest version of the app, but this will cause any client-side state to be lost. (You can also proactively mitigate it by observing the [`updated`]($app-state#updated) value in the app state, which tells clients when a new version has been deployed.) +When a new version of your app is deployed, assets belonging to the previous version may no longer be accessible. If a user is actively using your app when this happens, it can cause errors when they navigate — this is known as _version skew_. SvelteKit mitigates this by detecting errors resulting from version skew and causing a hard reload to get the latest version of the app, but this will cause any client-side state to be lost. (You can also proactively mitigate it by observing [`updated.current`]($app-state#updated) from `$app/state`, which tells clients when a new version has been deployed.) -[Skew protection](https://vercel.com/docs/deployments/skew-protection) is a Vercel feature that routes client requests to their original deployment. When a user visits your app, a cookie is set with the deployment ID, and any subsequent requests will be routed to that deployment for as long as skew protection is active. When they reload the page, they will get the newest deployment. (The `updated` store is exempted from this behaviour, and so will continue to report new deployments.) To enable it, visit the Advanced section of your project settings on Vercel. +[Skew protection](https://vercel.com/docs/deployments/skew-protection) is a Vercel feature that routes client requests to their original deployment. When a user visits your app, a cookie is set with the deployment ID, and any subsequent requests will be routed to that deployment for as long as skew protection is active. When they reload the page, they will get the newest deployment. (`updated.current` is exempted from this behaviour, and so will continue to report new deployments.) To enable it, visit the Advanced section of your project settings on Vercel. Cookie-based skew protection comes with one caveat: if a user has multiple versions of your app open in multiple tabs, requests from older versions will be routed to the newer one, meaning they will fall back to SvelteKit's built-in skew protection. From f48cd60681821644dc734e3d2a72b8f94b1c55b5 Mon Sep 17 00:00:00 2001 From: Christophe Benz Date: Sun, 25 May 2025 15:43:47 +0200 Subject: [PATCH 1083/1135] docs: fix typo (#13820) --- documentation/docs/10-getting-started/25-project-types.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/documentation/docs/10-getting-started/25-project-types.md b/documentation/docs/10-getting-started/25-project-types.md index 848c6af71d39..51a32deae4a8 100644 --- a/documentation/docs/10-getting-started/25-project-types.md +++ b/documentation/docs/10-getting-started/25-project-types.md @@ -48,7 +48,7 @@ You can create a library to be used by other Svelte apps with the [`@sveltejs/pa ## Offline app -SvelteKit has full suppport for [service workers](service-workers) allowing you to build many types of applications such as offline apps and [progressive web apps](glossary#PWA). +SvelteKit has full support for [service workers](service-workers) allowing you to build many types of applications such as offline apps and [progressive web apps](glossary#PWA). ## Mobile app From 65de90f548592fd9d7ad86444d81ca783d4042c4 Mon Sep 17 00:00:00 2001 From: 1muen <49640488+1muen@users.noreply.github.com> Date: Wed, 28 May 2025 21:07:27 +0200 Subject: [PATCH 1084/1135] fix: correct typo in warning (#13837) --- packages/package/src/validate.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/package/src/validate.js b/packages/package/src/validate.js index 16b818e7ddb5..24fedf37c401 100644 --- a/packages/package/src/validate.js +++ b/packages/package/src/validate.js @@ -85,7 +85,7 @@ export function _create_validator(options) { [...imports].filter((i) => i.startsWith('$app/')).length === 1 ) { warnings.push( - 'Avoid usage of `$app/environment` in your code, if you want to library to work for people not using SvelteKit (only regular Svelte, for example). ' + + 'Avoid usage of `$app/environment` in your code, if you want the library to work for people not using SvelteKit (only regular Svelte, for example). ' + 'Consider using packages like `esm-env` instead which provide cross-bundler-compatible environment variables.' ); } From 23f59af0ed7d727bdfa8a1ae2ae7ea65ad0de543 Mon Sep 17 00:00:00 2001 From: Ben McCann <322311+benmccann@users.noreply.github.com> Date: Tue, 3 Jun 2025 07:40:09 -0700 Subject: [PATCH 1085/1135] chore: switch to typescript-eslint projectService setting (#13839) --- eslint.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eslint.config.js b/eslint.config.js index 8444424cd723..9bb8dd2a7156 100644 --- a/eslint.config.js +++ b/eslint.config.js @@ -20,7 +20,7 @@ export default [ { languageOptions: { parserOptions: { - project: true + projectService: true } }, rules: { From e16b7e672a3a3329fdb28f835257b72338c89e0b Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Tue, 3 Jun 2025 10:44:18 -0400 Subject: [PATCH 1086/1135] fix: omit stack when logging 404 errors in dev (#13848) * fix: omit stack when logging 404 errors in dev * Update .changeset/dull-pants-glow.md --- .changeset/dull-pants-glow.md | 5 +++++ packages/kit/src/runtime/server/index.js | 5 ++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 .changeset/dull-pants-glow.md diff --git a/.changeset/dull-pants-glow.md b/.changeset/dull-pants-glow.md new file mode 100644 index 000000000000..4cdd338f5e4b --- /dev/null +++ b/.changeset/dull-pants-glow.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: omit stack when logging 404 errors diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index a2740a8e6aa4..8f4f44304632 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -74,7 +74,10 @@ export class Server { this.#options.hooks = { handle: module.handle || (({ event, resolve }) => resolve(event)), - handleError: module.handleError || (({ error }) => console.error(error)), + handleError: + module.handleError || + (({ status, error }) => + console.error((status === 404 && /** @type {Error} */ (error)?.message) || error)), handleFetch: module.handleFetch || (({ request, fetch }) => fetch(request)), reroute: module.reroute || (() => {}), transport: module.transport || {} From 46fac30ec2b4e63bd48d8f2c01a60b077f22203a Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" <41898282+github-actions[bot]@users.noreply.github.com> Date: Tue, 3 Jun 2025 10:49:26 -0400 Subject: [PATCH 1087/1135] Version Packages (#13852) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> --- .changeset/dull-pants-glow.md | 5 ----- packages/kit/CHANGELOG.md | 6 ++++++ packages/kit/package.json | 2 +- packages/kit/src/version.js | 2 +- 4 files changed, 8 insertions(+), 7 deletions(-) delete mode 100644 .changeset/dull-pants-glow.md diff --git a/.changeset/dull-pants-glow.md b/.changeset/dull-pants-glow.md deleted file mode 100644 index 4cdd338f5e4b..000000000000 --- a/.changeset/dull-pants-glow.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -'@sveltejs/kit': patch ---- - -fix: omit stack when logging 404 errors diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index e2d421fbd7ac..ee5c4b1409ae 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -1,5 +1,11 @@ # @sveltejs/kit +## 2.21.2 +### Patch Changes + + +- fix: omit stack when logging 404 errors ([#13848](https://github.com/sveltejs/kit/pull/13848)) + ## 2.21.1 ### Patch Changes diff --git a/packages/kit/package.json b/packages/kit/package.json index fd6a3ec69d76..1689f92728fc 100644 --- a/packages/kit/package.json +++ b/packages/kit/package.json @@ -1,6 +1,6 @@ { "name": "@sveltejs/kit", - "version": "2.21.1", + "version": "2.21.2", "description": "SvelteKit is the fastest way to build Svelte apps", "keywords": [ "framework", diff --git a/packages/kit/src/version.js b/packages/kit/src/version.js index 38129b528756..e170c688a0d1 100644 --- a/packages/kit/src/version.js +++ b/packages/kit/src/version.js @@ -1,4 +1,4 @@ // generated during release, do not modify /** @type {string} */ -export const VERSION = '2.21.1'; +export const VERSION = '2.21.2'; From f4d7643f0a8b578b82ea98f80c242a296f0a37f4 Mon Sep 17 00:00:00 2001 From: Amod Malviya Date: Tue, 3 Jun 2025 23:25:08 +0530 Subject: [PATCH 1088/1135] fix: build failure using adapter-cloudflare with paths.base (#13769) (#13846) * fix: build failure using adapter-cloudflare with paths.base (#13769) * Update .changeset/dull-toys-work.md --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/dull-toys-work.md | 5 +++++ packages/adapter-cloudflare/index.js | 1 + 2 files changed, 6 insertions(+) create mode 100644 .changeset/dull-toys-work.md diff --git a/.changeset/dull-toys-work.md b/.changeset/dull-toys-work.md new file mode 100644 index 000000000000..63802e8600a1 --- /dev/null +++ b/.changeset/dull-toys-work.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: address build failure when using `paths.base` (#13769) diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index af99452ef8fd..5bb705f6a6ae 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -62,6 +62,7 @@ export default function (options = {}) { // client assets and prerendered pages const assets_dest = `${dest}${builder.config.kit.paths.base}`; + builder.mkdirp(assets_dest); if ( building_for_cloudflare_pages || wrangler_config.assets?.not_found_handling === '404-page' From 881d1337c025e856b3be703a5125afb655b8d117 Mon Sep 17 00:00:00 2001 From: Elliott Johnson Date: Tue, 3 Jun 2025 12:31:11 -0600 Subject: [PATCH 1089/1135] chore: Update Windows CI to latest (#13853) * chore: Update Windows CI version * oops --- .github/workflows/ci.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bd2a21cb257c..515930f7a528 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -95,7 +95,7 @@ jobs: matrix: include: - node-version: 18 - os: windows-2019 # slowness reported on newer versions https://github.com/actions/runner-images/issues/5166 + os: windows-latest e2e-browser: 'chromium' mode: 'dev' - node-version: 18 @@ -107,7 +107,7 @@ jobs: e2e-browser: 'webkit' mode: 'dev' - node-version: 18 - os: windows-2019 # slowness reported on newer versions https://github.com/actions/runner-images/issues/5166 + os: windows-latest e2e-browser: 'chromium' mode: 'build' - node-version: 18 From ea2ac9b99361c9a8dc5ccc0cefb0b43d7a148b79 Mon Sep 17 00:00:00 2001 From: Tim Hallmann Date: Tue, 3 Jun 2025 23:48:33 +0200 Subject: [PATCH 1090/1135] fix: recover scroll position on reload of SPAs (#13821) --- packages/kit/src/runtime/client/client.js | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/packages/kit/src/runtime/client/client.js b/packages/kit/src/runtime/client/client.js index f831afa5db34..0cd7d8a0ab66 100644 --- a/packages/kit/src/runtime/client/client.js +++ b/packages/kit/src/runtime/client/client.js @@ -312,12 +312,16 @@ export async function start(_app, _target, hydrate) { // if we reload the page, or Cmd-Shift-T back to it, // recover scroll position const scroll = scroll_positions[current_history_index]; - if (scroll) { - history.scrollRestoration = 'manual'; - scrollTo(scroll.x, scroll.y); + function restore_scroll() { + if (scroll) { + history.scrollRestoration = 'manual'; + scrollTo(scroll.x, scroll.y); + } } if (hydrate) { + restore_scroll(); + await _hydrate(target, hydrate); } else { await navigate({ @@ -325,6 +329,8 @@ export async function start(_app, _target, hydrate) { url: resolve_url(app.hash ? decode_hash(new URL(location.href)) : location.href), replace_state: true }); + + restore_scroll(); } _start_router(); From 7f995dc218be4f62534bcbfcb27316633132b250 Mon Sep 17 00:00:00 2001 From: Kendell R Date: Tue, 3 Jun 2025 15:01:33 -0700 Subject: [PATCH 1091/1135] Attempt to clarify use:enhance docs (#13819) * attempt to clarify use:enhance docs * Update documentation/docs/20-core-concepts/30-form-actions.md --------- Co-authored-by: Elliott Johnson --- documentation/docs/20-core-concepts/30-form-actions.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/documentation/docs/20-core-concepts/30-form-actions.md b/documentation/docs/20-core-concepts/30-form-actions.md index 86c3b02233a5..8dc852b985c0 100644 --- a/documentation/docs/20-core-concepts/30-form-actions.md +++ b/documentation/docs/20-core-concepts/30-form-actions.md @@ -368,7 +368,7 @@ Without an argument, `use:enhance` will emulate the browser-native behaviour, ju ### Customising use:enhance -To customise the behaviour, you can provide a `SubmitFunction` that runs immediately before the form is submitted, and (optionally) returns a callback that runs with the `ActionResult`. Note that if you return a callback, the default behavior mentioned above is not triggered. To get it back, call `update`. +To customise the behaviour, you can provide a `SubmitFunction` that runs immediately before the form is submitted, and (optionally) returns a callback that runs with the `ActionResult`. ```svelte Date: Wed, 4 Jun 2025 11:24:58 +0200 Subject: [PATCH 1092/1135] fix: handle non-semver-style dependency versions (#13850) Fixes #13836 --- .changeset/smooth-trains-applaude.md | 5 +++++ packages/package/src/typescript.js | 8 +++++++- 2 files changed, 12 insertions(+), 1 deletion(-) create mode 100644 .changeset/smooth-trains-applaude.md diff --git a/.changeset/smooth-trains-applaude.md b/.changeset/smooth-trains-applaude.md new file mode 100644 index 000000000000..f5b9ab2bf48b --- /dev/null +++ b/.changeset/smooth-trains-applaude.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: handle non-semver-style dependency versions diff --git a/packages/package/src/typescript.js b/packages/package/src/typescript.js index 12d1c32d710f..81c0f348e635 100644 --- a/packages/package/src/typescript.js +++ b/packages/package/src/typescript.js @@ -28,7 +28,13 @@ export async function emit_dts(input, output, final_output, cwd, alias, files, t const require = createRequire(import.meta.url); const pkg = load_pkg_json(cwd); const svelte_dep = pkg.peerDependencies?.svelte || pkg.dependencies?.svelte || '3.0'; - const no_svelte_3 = !semver.intersects(svelte_dep, '^3.0.0'); + let no_svelte_3; + try { + no_svelte_3 = !semver.intersects(svelte_dep, '^3.0.0'); + } catch { + // Not all version specs are valid semver, e.g. "latest" or "next" or catalog references + no_svelte_3 = true; + } await emitDts({ libRoot: input, svelteShimsPath: no_svelte_3 From c6cd8c3a5ed96d423a65af5cb5468e3e963cfb54 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Wed, 4 Jun 2025 17:44:39 +0800 Subject: [PATCH 1093/1135] fix: correctly deserialize on the server (#13686) fixes #13675 This PR adds an optional chain for when deserialize tries to access app.decoders since app is always undefined on the server and is only initialised on the client. --- .changeset/silly-berries-repair.md | 5 +++++ packages/kit/src/runtime/app/forms.js | 9 ++++++--- packages/kit/src/runtime/server/app.js | 9 +++++++++ packages/kit/src/runtime/server/index.js | 11 ++++++++++ .../routes/serialization-form/+page.svelte | 2 +- .../server-deserialize/+server.js | 20 +++++++++++++++++++ .../routes/serialization-form2/+page.svelte | 2 +- .../kit/test/apps/basics/test/server.test.js | 11 ++++++++-- 8 files changed, 62 insertions(+), 7 deletions(-) create mode 100644 .changeset/silly-berries-repair.md create mode 100644 packages/kit/src/runtime/server/app.js create mode 100644 packages/kit/test/apps/basics/src/routes/serialization-form/server-deserialize/+server.js diff --git a/.changeset/silly-berries-repair.md b/.changeset/silly-berries-repair.md new file mode 100644 index 000000000000..9797a0ae187b --- /dev/null +++ b/.changeset/silly-berries-repair.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly run `deserialize` on the server diff --git a/packages/kit/src/runtime/app/forms.js b/packages/kit/src/runtime/app/forms.js index 51a126e4e22f..d9bbd573990e 100644 --- a/packages/kit/src/runtime/app/forms.js +++ b/packages/kit/src/runtime/app/forms.js @@ -1,10 +1,13 @@ import * as devalue from 'devalue'; -import { DEV } from 'esm-env'; +import { BROWSER, DEV } from 'esm-env'; import { invalidateAll } from './navigation.js'; -import { app, applyAction } from '../client/client.js'; +import { app as client_app, applyAction } from '../client/client.js'; +import { app as server_app } from '../server/app.js'; export { applyAction }; +const decoders = BROWSER ? client_app.decoders : server_app?.decoders; + /** * Use this function to deserialize the response from a form submission. * Usage: @@ -31,7 +34,7 @@ export function deserialize(result) { const parsed = JSON.parse(result); if (parsed.data) { - parsed.data = devalue.parse(parsed.data, app.decoders); + parsed.data = devalue.parse(parsed.data, decoders); } return parsed; diff --git a/packages/kit/src/runtime/server/app.js b/packages/kit/src/runtime/server/app.js new file mode 100644 index 000000000000..b5788f204f01 --- /dev/null +++ b/packages/kit/src/runtime/server/app.js @@ -0,0 +1,9 @@ +/** @type {{ decoders: Record any> }} */ +export let app; + +/** + * @param {{ decoders: Record any> }} value + */ +export function set_app(value) { + app = value; +} diff --git a/packages/kit/src/runtime/server/index.js b/packages/kit/src/runtime/server/index.js index 8f4f44304632..738da671f8ca 100644 --- a/packages/kit/src/runtime/server/index.js +++ b/packages/kit/src/runtime/server/index.js @@ -5,6 +5,7 @@ import { DEV } from 'esm-env'; import { filter_private_env, filter_public_env } from '../../utils/env.js'; import { prerendering } from '__sveltekit/environment'; import { set_read_implementation, set_manifest } from '__sveltekit/server'; +import { set_app } from './app.js'; /** @type {ProxyHandler<{ type: 'public' | 'private' }>} */ const prerender_env_handler = { @@ -83,6 +84,12 @@ export class Server { transport: module.transport || {} }; + set_app({ + decoders: module.transport + ? Object.fromEntries(Object.entries(module.transport).map(([k, v]) => [k, v.decode])) + : {} + }); + if (module.init) { await module.init(); } @@ -97,6 +104,10 @@ export class Server { reroute: () => {}, transport: {} }; + + set_app({ + decoders: {} + }); } else { throw error; } diff --git a/packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte b/packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte index 4797a1b1a4cb..98202a8a4f5d 100644 --- a/packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/serialization-form/+page.svelte @@ -1,5 +1,5 @@ diff --git a/packages/kit/test/apps/basics/src/routes/serialization-form/server-deserialize/+server.js b/packages/kit/test/apps/basics/src/routes/serialization-form/server-deserialize/+server.js new file mode 100644 index 000000000000..143b1f1ebb4c --- /dev/null +++ b/packages/kit/test/apps/basics/src/routes/serialization-form/server-deserialize/+server.js @@ -0,0 +1,20 @@ +import { deserialize } from '$app/forms'; + +export async function GET({ fetch }) { + const response = await fetch('/serialization-form', { + method: 'POST', + body: new FormData(), + headers: { + 'x-sveltekit-action': 'true' + } + }); + const result = deserialize(await response.text()); + + if (result.type === 'success' && result.data) { + return Response.json({ + data: /** @type {import('../../../lib').Foo} */ (result.data.foo).bar() + }); + } + + return Response.json({}); +} diff --git a/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte b/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte index 4549aab48155..41b68084e816 100644 --- a/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte +++ b/packages/kit/test/apps/basics/src/routes/serialization-form2/+page.svelte @@ -1,7 +1,7 @@ diff --git a/packages/kit/test/apps/basics/test/server.test.js b/packages/kit/test/apps/basics/test/server.test.js index 1a6f709bf535..9211e93a3809 100644 --- a/packages/kit/test/apps/basics/test/server.test.js +++ b/packages/kit/test/apps/basics/test/server.test.js @@ -639,7 +639,7 @@ test.describe('Static files', () => { test.describe('setHeaders', () => { test('allows multiple set-cookie headers with different values', async ({ page }) => { const response = await page.goto('/headers/set-cookie/sub'); - const cookies = (await response.allHeaders())['set-cookie']; + const cookies = response ? (await response.allHeaders())['set-cookie'] : ''; expect(cookies).toMatch('cookie1=value1'); expect(cookies).toMatch('cookie2=value2'); @@ -649,7 +649,7 @@ test.describe('setHeaders', () => { test.describe('cookies', () => { test('cookie.serialize created correct cookie header string', async ({ page }) => { const response = await page.goto('/cookies/serialize'); - const cookies = await response.headerValue('set-cookie'); + const cookies = response ? await response.headerValue('set-cookie') : ''; expect(cookies).toMatch('before=before'); expect(cookies).toMatch('after=after'); @@ -729,3 +729,10 @@ test.describe('getRequestEvent', () => { expect(await response.text()).toBe('hello from hooks.server.js'); }); }); + +test.describe('$app/forms', () => { + test('deserialize works on the server', async ({ request }) => { + const response = await request.get('/serialization-form/server-deserialize'); + expect(await response.json()).toEqual({ data: 'It works!' }); + }); +}); From e7b57e74bdea976ae070562bda76d4bb78cdb6da Mon Sep 17 00:00:00 2001 From: Rich Harris Date: Thu, 5 Jun 2025 11:29:34 -0400 Subject: [PATCH 1094/1135] fix: suppress console spam for chrome devtools requests (#13830) * fix: suppress console spam for chrome devtools requests * add link to documentation * Update packages/kit/src/runtime/server/respond.js Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> * print link to vite plugin --------- Co-authored-by: Ben McCann <322311+benmccann@users.noreply.github.com> --- .changeset/calm-dragons-visit.md | 5 +++++ packages/kit/src/runtime/server/respond.js | 17 +++++++++++++++++ 2 files changed, 22 insertions(+) create mode 100644 .changeset/calm-dragons-visit.md diff --git a/.changeset/calm-dragons-visit.md b/.changeset/calm-dragons-visit.md new file mode 100644 index 000000000000..d025ab17dbf7 --- /dev/null +++ b/.changeset/calm-dragons-visit.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: suppress console spam for chrome devtools requests diff --git a/packages/kit/src/runtime/server/respond.js b/packages/kit/src/runtime/server/respond.js index ad945974ef58..783c7d0ee65a 100644 --- a/packages/kit/src/runtime/server/respond.js +++ b/packages/kit/src/runtime/server/respond.js @@ -51,6 +51,8 @@ const page_methods = new Set(['GET', 'HEAD', 'POST']); const allowed_page_methods = new Set(['GET', 'HEAD', 'OPTIONS']); +let warned_on_devtools_json_request = false; + /** * @param {Request} request * @param {import('types').SSROptions} options @@ -573,6 +575,21 @@ export async function respond(request, options, manifest, state) { // if this request came direct from the user, rather than // via our own `fetch`, render a 404 page if (state.depth === 0) { + // In local development, Chrome requests this file for its 'automatic workspace folders' feature, + // causing console spam. If users want to serve this file they can install + // https://github.com/ChromeDevTools/vite-plugin-devtools-json + if (DEV && event.url.pathname === '/.well-known/appspecific/com.chrome.devtools.json') { + if (!warned_on_devtools_json_request) { + console.warn( + `\nGoogle Chrome is requesting ${event.url.pathname} to automatically configure devtools project settings. To serve this file, add this plugin to your Vite config:\n\nhttps://github.com/ChromeDevTools/vite-plugin-devtools-json\n` + ); + + warned_on_devtools_json_request = true; + } + + return new Response(undefined, { status: 404 }); + } + return await respond_with_error({ event, options, From 6a6538c4bd937667a56ef5f6673cdef3f2ea7a77 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 6 Jun 2025 01:27:25 +0800 Subject: [PATCH 1095/1135] fix: correctly invalidate static analysis cache of child nodes during dev (#13793) * don't cache during dev * changeset * ok we can cache * Update .changeset/big-eels-watch.md * fix universal file check * add correct test * format * cleanup * fix * ensure nodes are analysed sequentially * correctly invalidate child nodes when universal node is updated * windows path separators :)))) * we'll come back to this later * lint --- .changeset/big-eels-watch.md | 5 + packages/kit/src/core/postbuild/analyse.js | 1 + .../src/exports/vite/build/build_server.js | 2 +- packages/kit/src/exports/vite/dev/index.js | 12 +- .../src/exports/vite/static_analysis/index.js | 106 +++++++++--------- .../vite/static_analysis/index.spec.js | 16 +-- .../universal/parent-changed/+layout.js | 1 + .../routes/universal/parent-changed/+page.js | 1 + .../universal/parent-changed/+page.svelte | 1 + packages/kit/test/apps/writes/test/test.js | 42 ++++++- 10 files changed, 118 insertions(+), 69 deletions(-) create mode 100644 .changeset/big-eels-watch.md create mode 100644 packages/kit/test/apps/writes/src/routes/universal/parent-changed/+layout.js create mode 100644 packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.js create mode 100644 packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.svelte diff --git a/.changeset/big-eels-watch.md b/.changeset/big-eels-watch.md new file mode 100644 index 000000000000..f2eed653a812 --- /dev/null +++ b/.changeset/big-eels-watch.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly invalidate static analysis cache of child nodes when modifying a universal `+layout` file during dev diff --git a/packages/kit/src/core/postbuild/analyse.js b/packages/kit/src/core/postbuild/analyse.js index 713f4ea66141..ba8a013b32f0 100644 --- a/packages/kit/src/core/postbuild/analyse.js +++ b/packages/kit/src/core/postbuild/analyse.js @@ -63,6 +63,7 @@ async function analyse({ internal.set_manifest(manifest); internal.set_read_implementation((file) => createReadableStream(`${server_root}/server/${file}`)); + /** @type {Map | null, children: string[] }>} */ const static_exports = new Map(); // first, build server nodes without the client manifest so we can analyse it diff --git a/packages/kit/src/exports/vite/build/build_server.js b/packages/kit/src/exports/vite/build/build_server.js index 9332322aa572..20f7bf683842 100644 --- a/packages/kit/src/exports/vite/build/build_server.js +++ b/packages/kit/src/exports/vite/build/build_server.js @@ -15,7 +15,7 @@ import { create_node_analyser } from '../static_analysis/index.js'; * @param {import('vite').Manifest | null} client_manifest * @param {import('vite').Rollup.OutputAsset[] | null} css * @param {import('types').RecursiveRequired} output_config - * @param {Map | null>} static_exports + * @param {Map | null, children: string[] }>} static_exports */ export async function build_server_nodes(out, kit, manifest_data, server_manifest, client_manifest, css, output_config, static_exports) { mkdirp(`${out}/server/nodes`); diff --git a/packages/kit/src/exports/vite/dev/index.js b/packages/kit/src/exports/vite/dev/index.js index 28beac7603b2..818cc09096ef 100644 --- a/packages/kit/src/exports/vite/dev/index.js +++ b/packages/kit/src/exports/vite/dev/index.js @@ -355,14 +355,18 @@ export async function dev(vite, vite_config, svelte_config) { // Debounce add/unlink events because in case of folder deletion or moves // they fire in rapid succession, causing needless invocations. + // These watchers only run for routes, param matchers, and client hooks. watch('add', () => debounce(update_manifest)); watch('unlink', () => debounce(update_manifest)); watch('change', (file) => { // Don't run for a single file if the whole manifest is about to get updated if (timeout || restarting) return; + if (/\+(page|layout).*$/.test(file)) { + invalidate_page_options(path.relative(cwd, file)); + } + sync.update(svelte_config, manifest_data, file); - invalidate_page_options(path.relative(cwd, file)); }); const { appTemplate, errorTemplate, serviceWorker, hooks } = svelte_config.kit.files; @@ -389,10 +393,10 @@ export async function dev(vite, vite_config, svelte_config) { } }); - // changing the svelte config requires restarting the dev server - // the config is only read on start and passed on to vite-plugin-svelte - // which needs up-to-date values to operate correctly vite.watcher.on('change', async (file) => { + // changing the svelte config requires restarting the dev server + // the config is only read on start and passed on to vite-plugin-svelte + // which needs up-to-date values to operate correctly if (path.basename(file) === 'svelte.config.js') { console.log(`svelte config changed, restarting vite dev-server. changed file: ${file}`); restarting = true; diff --git a/packages/kit/src/exports/vite/static_analysis/index.js b/packages/kit/src/exports/vite/static_analysis/index.js index 94600d19e574..e6e56df7b8e9 100644 --- a/packages/kit/src/exports/vite/static_analysis/index.js +++ b/packages/kit/src/exports/vite/static_analysis/index.js @@ -4,23 +4,22 @@ import { read } from '../../../utils/filesystem.js'; const inheritable_page_options = new Set(['ssr', 'prerender', 'csr', 'trailingSlash', 'config']); -const page_options = new Set([...inheritable_page_options, 'entries']); +const valid_page_options = new Set([...inheritable_page_options, 'entries']); const skip_parsing_regex = new RegExp( - `${Array.from(page_options).join('|')}|(?:export[\\s\\n]+\\*[\\s\\n]+from)` + `${Array.from(valid_page_options).join('|')}|(?:export[\\s\\n]+\\*[\\s\\n]+from)` ); const parser = Parser.extend(tsPlugin()); /** - * Collects exported page options from a +page.js/+layout.js file. - * We ignore reassignments and use the declared value. - * Returns `null` if any export is too difficult to analyse. - * @param {string} filename + * Collects page options from a +page.js/+layout.js file, ignoring reassignments + * and using the declared value. Returns `null` if any export is too difficult to analyse. + * @param {string} filename The name of the file to report when an error occurs * @param {string} input * @returns {Record | null} */ -export function statically_analyse_exports(filename, input) { +export function statically_analyse_page_options(filename, input) { // if there's a chance there are no page exports or export all declaration, // then we can skip the AST parsing which is expensive if (!skip_parsing_regex.test(input)) { @@ -34,14 +33,14 @@ export function statically_analyse_exports(filename, input) { }); /** @type {Map} */ - const static_exports = new Map(); + const page_options = new Map(); for (const statement of source.body) { // ignore export all declarations with aliases that are not page options if ( statement.type === 'ExportAllDeclaration' && statement.exported && - !page_options.has(get_name(statement.exported)) + !valid_page_options.has(get_name(statement.exported)) ) { continue; } @@ -60,7 +59,7 @@ export function statically_analyse_exports(filename, input) { const export_specifiers = new Map(); for (const specifier of statement.specifiers) { const exported_name = get_name(specifier.exported); - if (!page_options.has(exported_name)) { + if (!valid_page_options.has(exported_name)) { continue; } @@ -109,7 +108,7 @@ export function statically_analyse_exports(filename, input) { } if (variable_declarator.init?.type === 'Literal') { - static_exports.set( + page_options.set( /** @type {string} */ (export_specifiers.get(variable_declarator.id.name)), variable_declarator.init.value ); @@ -138,7 +137,7 @@ export function statically_analyse_exports(filename, input) { // class and function declarations if (statement.declaration.type !== 'VariableDeclaration') { - if (page_options.has(statement.declaration.id.name)) { + if (valid_page_options.has(statement.declaration.id.name)) { return null; } continue; @@ -149,12 +148,12 @@ export function statically_analyse_exports(filename, input) { return null; } - if (!page_options.has(declaration.id.name)) { + if (!valid_page_options.has(declaration.id.name)) { continue; } if (declaration.init?.type === 'Literal') { - static_exports.set(declaration.id.name, declaration.init.value); + page_options.set(declaration.id.name, declaration.init.value); continue; } @@ -163,10 +162,10 @@ export function statically_analyse_exports(filename, input) { } } - return Object.fromEntries(static_exports); + return Object.fromEntries(page_options); } catch (error) { if (error instanceof Error) { - error.message = `Failed to statically analyse ${filename}. ${error.message}`; + error.message = `Failed to statically analyse page options for ${filename}. ${error.message}`; } throw error; } @@ -183,65 +182,67 @@ export function get_name(node) { /** * @param {{ * resolve: (file: string) => Promise>; - * static_exports?: Map | null>; + * static_exports?: Map | null, children: string[] }>; * }} opts */ export function create_node_analyser({ resolve, static_exports = new Map() }) { /** * Computes the final page options for a node (if possible). Otherwise, returns `null`. * @param {import('types').PageNode} node - * @returns {Promise} + * @returns {Promise | null>} */ const get_page_options = async (node) => { - if (node.universal && static_exports.has(node.universal)) { - return /** @type {import('types').UniversalNode | null} */ ( - static_exports.get(node.universal) - ); + const key = node.universal || node.server; + if (key && static_exports.has(key)) { + return { ...static_exports.get(key)?.page_options }; } - /** @type {Record | null} */ + /** @type {Record} */ let page_options = {}; - if (node.server) { - const module = await resolve(node.server); - for (const key in inheritable_page_options) { - if (key in module) { - page_options[key] = module[key]; - } - } - } + if (node.parent) { + const parent_options = await get_page_options(node.parent); - if (node.universal) { - let universal_exports = static_exports.get(node.universal); - if (universal_exports === undefined) { - const input = read(node.universal); - universal_exports = statically_analyse_exports(node.universal, input); + const parent_key = node.parent.universal || node.parent.server; + if (key && parent_key) { + static_exports.get(parent_key)?.children.push(key); } - if (universal_exports === null) { - static_exports.set(node.universal, null); + if (parent_options === null) { + // if the parent cannot be analysed, we can't know what page options + // the child node inherits, so we also mark it as unanalysable + if (key) { + static_exports.set(key, { page_options: null, children: [] }); + } return null; } - page_options = { ...page_options, ...universal_exports }; + page_options = { ...parent_options }; } - if (node.parent) { - const parent_options = await get_page_options(node.parent); - if (parent_options === null) { - // if the parent cannot be statically analysed, we can't know what - // page options the current node inherits, so we invalidate it too - if (node.universal) { - static_exports.set(node.universal, null); + if (node.server) { + const module = await resolve(node.server); + for (const page_option in inheritable_page_options) { + if (page_option in module) { + page_options[page_option] = module[page_option]; } + } + } + + if (node.universal) { + const input = read(node.universal); + const universal_page_options = statically_analyse_page_options(node.universal, input); + + if (universal_page_options === null) { + static_exports.set(node.universal, { page_options: null, children: [] }); return null; } - page_options = { ...parent_options, ...page_options }; + page_options = { ...page_options, ...universal_page_options }; } - if (node.universal) { - static_exports.set(node.universal, page_options); + if (key) { + static_exports.set(key, { page_options, children: [] }); } return page_options; @@ -249,11 +250,14 @@ export function create_node_analyser({ resolve, static_exports = new Map() }) { /** * @param {string} file - * @returns {void} */ const invalidate_page_options = (file) => { + static_exports.get(file)?.children.forEach((child) => static_exports.delete(child)); static_exports.delete(file); }; - return { get_page_options, invalidate_page_options }; + return { + get_page_options, + invalidate_page_options + }; } diff --git a/packages/kit/src/exports/vite/static_analysis/index.spec.js b/packages/kit/src/exports/vite/static_analysis/index.spec.js index 2514555d3033..6c94431b6fb6 100644 --- a/packages/kit/src/exports/vite/static_analysis/index.spec.js +++ b/packages/kit/src/exports/vite/static_analysis/index.spec.js @@ -1,5 +1,5 @@ import { expect, test } from 'vitest'; -import { statically_analyse_exports } from './index.js'; +import { statically_analyse_page_options } from './index.js'; test.each([ [ @@ -18,7 +18,7 @@ test.each([ ` ] ])('page option is assigned a literal value: %s', (_, input) => { - const exports = statically_analyse_exports('', input); + const exports = statically_analyse_page_options('', input); expect(exports).toEqual({ ssr: false, csr: true, prerender: 'auto', trailingSlash: 'always' }); }); @@ -52,7 +52,7 @@ test.each([ ], ['export all declaration alias', "export * as ssr from './foo'"] ])('fails when page option is assigned a dynamic value: %s', (_, input) => { - const exports = statically_analyse_exports('', input); + const exports = statically_analyse_page_options('', input); expect(exports).toEqual(null); }); @@ -62,7 +62,7 @@ test.each([ ['export all declaration alias', 'export * as bar from "./foo"'], ['non-page option export', "export const foo = 'bar'"] ])('ignores %s', (_, input) => { - const exports = statically_analyse_exports('', input); + const exports = statically_analyse_page_options('', input); expect(exports).toEqual({}); }); @@ -72,7 +72,7 @@ test.each([ ['whitespace', 'export * from "./foo";'], ['multiple lines and whitespace', "export \n *\n from 'abc'; "] ])('fails when export all declaration is used: %s', (_, input) => { - const exports = statically_analyse_exports('', input); + const exports = statically_analyse_page_options('', input); expect(exports).toEqual(null); }); @@ -131,7 +131,7 @@ test.each([ ` ] ])('non-reassigned page options: %s', (_, input) => { - const exports = statically_analyse_exports('', input); + const exports = statically_analyse_page_options('', input); expect(exports).toEqual({ ssr: true, prerender: true }); }); @@ -151,7 +151,7 @@ test.each([ ` ] ])('export specifier references: %s', (_, input) => { - const exports = statically_analyse_exports('', input); + const exports = statically_analyse_page_options('', input); expect(exports).toEqual({ ssr: false }); }); @@ -185,6 +185,6 @@ test.each([ ` ] ])('fails when export specifier references: %s', (_, input) => { - const exports = statically_analyse_exports('', input); + const exports = statically_analyse_page_options('', input); expect(exports).toEqual(null); }); diff --git a/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+layout.js b/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+layout.js new file mode 100644 index 000000000000..a3d15781a772 --- /dev/null +++ b/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+layout.js @@ -0,0 +1 @@ +export const ssr = false; diff --git a/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.js b/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.js new file mode 100644 index 000000000000..b01f93ba591a --- /dev/null +++ b/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.js @@ -0,0 +1 @@ +document.body.style.backgroundColor = 'red'; diff --git a/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.svelte b/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.svelte new file mode 100644 index 000000000000..48aa4cb69f99 --- /dev/null +++ b/packages/kit/test/apps/writes/src/routes/universal/parent-changed/+page.svelte @@ -0,0 +1 @@ +

hello world

diff --git a/packages/kit/test/apps/writes/test/test.js b/packages/kit/test/apps/writes/test/test.js index 5ebc88f92e75..e513c647f37d 100644 --- a/packages/kit/test/apps/writes/test/test.js +++ b/packages/kit/test/apps/writes/test/test.js @@ -64,8 +64,18 @@ test.describe('Filesystem updates', () => { const file = fileURLToPath(new URL('../src/routes/universal/+page.js', import.meta.url)); const contents = fs.readFileSync(file, 'utf-8'); - await page.goto('/universal'); + try { + fs.writeFileSync(file, contents.replace(/export const ssr = false;\n/, '')); + await page.goto('/universal', { wait_for_started: false }); + expect(await get_computed_style('body', 'background-color')).not.toBe('rgb(255, 0, 0)'); + await expect(page.locator('h1')).toHaveText('Internal Error'); + } finally { + fs.writeFileSync(file, contents); + } + await page.waitForTimeout(500); // this is the rare time we actually need waitForTimeout; we have no visibility into whether the module graph has been invalidated + // a reload is required because Vite HMR doesn't trigger if the page has never loaded successfully + await page.reload(); expect(await get_computed_style('body', 'background-color')).toBe('rgb(255, 0, 0)'); try { @@ -74,10 +84,32 @@ test.describe('Filesystem updates', () => { expect(await get_computed_style('body', 'background-color')).not.toBe('rgb(255, 0, 0)'); await expect(page.locator('h1')).toHaveText('Internal Error'); } finally { - fs.writeFileSync( - file, - contents.replace(/export const ssr = .*;/, 'export const ssr = false;') - ); + fs.writeFileSync(file, contents.replace(/\\nexport const ssr = false;\\n/, '')); + } + }); + + test('Universal node is updated when parent page options change', async ({ + page, + javaScriptEnabled, + get_computed_style + }) => { + test.skip(!process.env.DEV || !javaScriptEnabled); + + const file = fileURLToPath( + new URL('../src/routes/universal/parent-changed/+layout.js', import.meta.url) + ); + const contents = fs.readFileSync(file, 'utf-8'); + + try { + await page.goto('/universal/parent-changed'); + expect(await get_computed_style('body', 'background-color')).toBe('rgb(255, 0, 0)'); + + fs.writeFileSync(file, contents.replace(/export const ssr = false;/, '')); + await page.waitForTimeout(500); // this is the rare time we actually need waitForTimeout; we have no visibility into whether the module graph has been invalidated + expect(await get_computed_style('body', 'background-color')).not.toBe('rgb(255, 0, 0)'); + await expect(page.locator('h1')).toHaveText('Internal Error'); + } finally { + fs.writeFileSync(file, contents); } }); }); From 6c442395a8e6656ff49ecd4041d8e12ed65e80dd Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Fri, 6 Jun 2025 01:29:53 +0800 Subject: [PATCH 1096/1135] fix: include components dynamically imported in the universal load function when inlining CSS (#13723) * add test * map client to server stylesheets using rollup bundle data * changeset * avoid duplicate filenames * skip bundle mapping if inline style threshold is not enabled * optimise mapping and skip if no inline threshold --- .changeset/spicy-cougars-wave.md | 5 + packages/kit/src/core/postbuild/analyse.js | 1 + packages/kit/src/exports/public.d.ts | 2 +- .../src/exports/vite/build/build_server.js | 163 ++++++++++-------- packages/kit/src/exports/vite/index.js | 18 +- .../inline-assets/dynamic-import/+page.js | 5 + .../inline-assets/dynamic-import/+page.svelte | 5 + .../inline-assets/dynamic-import/Thing.svelte | 8 + packages/kit/test/apps/options/test/test.js | 27 ++- packages/kit/types/index.d.ts | 2 +- 10 files changed, 147 insertions(+), 89 deletions(-) create mode 100644 .changeset/spicy-cougars-wave.md create mode 100644 packages/kit/test/apps/options/source/pages/inline-assets/dynamic-import/+page.js create mode 100644 packages/kit/test/apps/options/source/pages/inline-assets/dynamic-import/+page.svelte create mode 100644 packages/kit/test/apps/options/source/pages/inline-assets/dynamic-import/Thing.svelte diff --git a/.changeset/spicy-cougars-wave.md b/.changeset/spicy-cougars-wave.md new file mode 100644 index 000000000000..d65ca6f9e120 --- /dev/null +++ b/.changeset/spicy-cougars-wave.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/kit': patch +--- + +fix: correctly inline stylesheets of components dynamically imported in a universal load function if they are below the configured inlineStyleThreshold diff --git a/packages/kit/src/core/postbuild/analyse.js b/packages/kit/src/core/postbuild/analyse.js index ba8a013b32f0..39164feac688 100644 --- a/packages/kit/src/core/postbuild/analyse.js +++ b/packages/kit/src/core/postbuild/analyse.js @@ -74,6 +74,7 @@ async function analyse({ server_manifest, null, null, + null, output_config, static_exports ); diff --git a/packages/kit/src/exports/public.d.ts b/packages/kit/src/exports/public.d.ts index 66374dd5fdd1..ec930b7d073a 100644 --- a/packages/kit/src/exports/public.d.ts +++ b/packages/kit/src/exports/public.d.ts @@ -468,7 +468,7 @@ export interface KitConfig { errorTemplate?: string; }; /** - * Inline CSS inside a ` diff --git a/packages/kit/test/apps/options/test/test.js b/packages/kit/test/apps/options/test/test.js index 3ce6b482e092..82a30b34f159 100644 --- a/packages/kit/test/apps/options/test/test.js +++ b/packages/kit/test/apps/options/test/test.js @@ -107,7 +107,7 @@ test.describe('assets path', () => { await page.goto('/path-base/'); const href = await page.locator('link[rel="icon"]').getAttribute('href'); - const response = await request.get(href); + const response = await request.get(href ?? ''); expect(response.status()).toBe(200); }); }); @@ -133,7 +133,7 @@ test.describe('CSP', () => { test('ensure CSP header in stream response', async ({ page, javaScriptEnabled }) => { if (!javaScriptEnabled) return; const response = await page.goto('/path-base/csp-with-stream'); - expect(response.headers()['content-security-policy']).toMatch( + expect(response?.headers()['content-security-policy']).toMatch( /require-trusted-types-for 'script'/ ); expect(await page.textContent('h2')).toBe('Moo Deng!'); @@ -141,7 +141,7 @@ test.describe('CSP', () => { test("quotes 'script'", async ({ page }) => { const response = await page.goto('/path-base'); - expect(response.headers()['content-security-policy']).toMatch( + expect(response?.headers()['content-security-policy']).toMatch( /require-trusted-types-for 'script'/ ); }); @@ -305,19 +305,32 @@ if (!process.env.DEV) { }); test.describe('inlineStyleThreshold', () => { - test('loads asset', async ({ page }) => { + test('loads assets', async ({ page }) => { let fontLoaded = false; - page.on('response', (response) => { if (response.url().endsWith('.woff2') || response.url().endsWith('.woff')) { fontLoaded = response.ok(); } }); - await page.goto('/path-base/inline-assets'); - expect(fontLoaded).toBeTruthy(); }); + + test('includes components dynamically imported in universal load', async ({ + page, + get_computed_style + }) => { + let loaded_css = false; + page.on('response', (response) => { + if (response.url().endsWith('.css')) { + loaded_css = true; + } + }); + await page.goto('/path-base/inline-assets/dynamic-import'); + await expect(page.locator('p')).toHaveText("I'm dynamically imported"); + expect(loaded_css).toBe(false); + expect(await get_computed_style('p', 'color')).toEqual('rgb(0, 0, 255)'); + }); }); } diff --git a/packages/kit/types/index.d.ts b/packages/kit/types/index.d.ts index 300a6f726ebb..74d438a6f5cc 100644 --- a/packages/kit/types/index.d.ts +++ b/packages/kit/types/index.d.ts @@ -450,7 +450,7 @@ declare module '@sveltejs/kit' { errorTemplate?: string; }; /** - * Inline CSS inside a ` ([#578](https://github.com/sveltejs/kit/pull/578)) +- 8805c6d: Pass adapters directly to svelte.config.cjs ([#579](https://github.com/sveltejs/kit/pull/579)) + +## 1.0.0-next.53 + +### Patch Changes + +- 9cf2f21: Only require page components to export prerender ([#577](https://github.com/sveltejs/kit/pull/577)) +- e860de0: Invalidate page when query changes ([#575](https://github.com/sveltejs/kit/pull/575)) +- 7bb1cf0: Disable vite-plugin-svelte transform cache ([#576](https://github.com/sveltejs/kit/pull/576)) + +## 1.0.0-next.52 + +### Patch Changes + +- ac3669e: Move Vite config into svelte.config.cjs ([#569](https://github.com/sveltejs/kit/pull/569)) + +## 1.0.0-next.51 + +### Patch Changes + +- 34a00f9: Bypass router on hydration ([#563](https://github.com/sveltejs/kit/pull/563)) + +## 1.0.0-next.50 + +### Patch Changes + +- 0512fd1: Remove startGlobal option ([#559](https://github.com/sveltejs/kit/pull/559)) +- 9212aa5: Add options to adapter-node, and add adapter types ([#531](https://github.com/sveltejs/kit/pull/531)) +- 0512fd1: Fire custom events for start, and navigation start/end ([#559](https://github.com/sveltejs/kit/pull/559)) + +## 1.0.0-next.49 + +### Patch Changes + +- ab28c0a: kit: include missing types.d.ts ([#538](https://github.com/sveltejs/kit/pull/538)) +- c76c9bf: Upgrade Vite ([#544](https://github.com/sveltejs/kit/pull/544)) + +## 1.0.0-next.48 + +### Patch Changes + +- e37a302: Make getSession future-proof ([#524](https://github.com/sveltejs/kit/pull/524)) + +## 1.0.0-next.47 + +### Patch Changes + +- 5554acc: Add \$lib alias ([#511](https://github.com/sveltejs/kit/pull/511)) +- 5cd6f11: bump vite-plugin-svelte to 0.11.0 ([#513](https://github.com/sveltejs/kit/pull/513)) + +## 1.0.0-next.46 + +### Patch Changes + +- f35a5cd: Change adapter signature ([#505](https://github.com/sveltejs/kit/pull/505)) + +## 1.0.0-next.45 + +### Patch Changes + +- 925638a: Remove endpoints from the files built for the client ([#490](https://github.com/sveltejs/kit/pull/490)) +- c3cf3f3: Bump deps ([#492](https://github.com/sveltejs/kit/pull/492)) +- 625747d: kit: bundle @sveltejs/kit into built application ([#486](https://github.com/sveltejs/kit/pull/486)) +- Updated dependencies [c3cf3f3] + - @sveltejs/vite-plugin-svelte@1.0.0-next.3 + +## 1.0.0-next.44 + +### Patch Changes + +- e6449d2: Fix AMP styles for real ([#494](https://github.com/sveltejs/kit/pull/494)) + +## 1.0.0-next.43 + +### Patch Changes + +- 672e9be: Fix AMP styles, again ([#491](https://github.com/sveltejs/kit/pull/491)) + +## 1.0.0-next.42 + +### Patch Changes + +- 0f54ebc: Fix AMP styles ([#488](https://github.com/sveltejs/kit/pull/488)) + +## 1.0.0-next.41 + +### Patch Changes + +- 4aa5a73: Future-proof prepare argument ([#471](https://github.com/sveltejs/kit/pull/471)) +- 58dc400: Call correct set_paths function ([#487](https://github.com/sveltejs/kit/pull/487)) +- 2322291: Update to node-fetch@3 + +## 1.0.0-next.40 + +### Patch Changes + +- 4c5fd3c: Include layout/error styles in SSR ([#472](https://github.com/sveltejs/kit/pull/472)) + +## 1.0.0-next.39 + +### Patch Changes + +- b7fdb0d: Skip pre-bundling ([#468](https://github.com/sveltejs/kit/pull/468)) + +## 1.0.0-next.38 + +### Patch Changes + +- 15402b1: Add service worker support ([#463](https://github.com/sveltejs/kit/pull/463)) +- 0c630b5: Ignore dynamically imported components when constructing styles in dev mode ([#443](https://github.com/sveltejs/kit/pull/443)) +- ac06af5: Fix svelte-kit adapt for Windows ([#435](https://github.com/sveltejs/kit/pull/435)) +- 061fa46: Implement improved redirect API +- b800049: Include type declarations ([#442](https://github.com/sveltejs/kit/pull/442)) +- 07c6de4: Use posix paths in manifest even on Windows ([#436](https://github.com/sveltejs/kit/pull/436)) +- 27ba872: Error if preload function exists ([#455](https://github.com/sveltejs/kit/pull/455)) +- 0c630b5: Add default paths in case singletons module is invalidated ([#443](https://github.com/sveltejs/kit/pull/443)) +- 73dd998: Allow custom extensions ([#411](https://github.com/sveltejs/kit/pull/411)) + +## 1.0.0-next.37 + +### Patch Changes + +- 230c6d9: Indicate which request failed, if fetch fails inside load function ([#427](https://github.com/sveltejs/kit/pull/427)) +- f1bc218: Run adapt via svelte-kit build ([#430](https://github.com/sveltejs/kit/pull/430)) +- 6850ddc: Fix svelte-kit start for Windows ([#425](https://github.com/sveltejs/kit/pull/425)) + +## 1.0.0-next.36 + +### Patch Changes + +- 7b70a33: Force version bump so that Kit uses updated vite-plugin-svelte ([#419](https://github.com/sveltejs/kit/pull/419)) + +## 1.0.0-next.35 + +### Patch Changes + +- Use Vite +- Fix Windows issues +- Preserve load context during navigation +- Return error from load + +## 1.0.0-next.34 + +### Patch Changes + +- Fix adapters and convert to ES modules + +## 1.0.0-next.33 + +### Patch Changes + +- 474070e: Better errors when modules cannot be found ([#381](https://github.com/sveltejs/kit/pull/381)) + +## 1.0.0-next.32 + +### Patch Changes + +- Convert everything to ESM + +## 1.0.0-next.31 + +### Patch Changes + +- b6c2434: app.js -> app.cjs ([#362](https://github.com/sveltejs/kit/pull/362)) + +## 1.0.0-next.30 + +### Patch Changes + +- 00cbaf6: Rename `_.config.js` to `_.config.cjs` ([#356](https://github.com/sveltejs/kit/pull/356)) + +## 1.0.0-next.29 + +### Patch Changes + +- 4c0edce: Use addEventListener instead of onload ([#347](https://github.com/sveltejs/kit/pull/347)) + +## 1.0.0-next.28 + +### Patch Changes + +- 4353025: Prevent infinite loop when fetching bad URLs inside error responses ([#340](https://github.com/sveltejs/kit/pull/340)) +- 2860065: Handle assets path when prerendering ([#341](https://github.com/sveltejs/kit/pull/341)) + +## 1.0.0-next.27 + +### Patch Changes + +- Fail build if prerender errors +- Hide logging behind --verbose option + +## 1.0.0-next.26 + +### Patch Changes + +- Fix svelte-announcer CSS + +## 1.0.0-next.25 + +### Patch Changes + +- Surface stack traces for endpoint/page rendering errors + +## 1.0.0-next.24 + +### Patch Changes + +- 26643df: Account for config.paths when prerendering ([#322](https://github.com/sveltejs/kit/pull/322)) + +## 1.0.0-next.23 + +### Patch Changes + +- 9b758aa: Upgrade to Snowpack 3 ([#321](https://github.com/sveltejs/kit/pull/321)) + +## 1.0.0-next.22 + +### Patch Changes + +- bb68595: use readFileSync instead of createReadStream ([#320](https://github.com/sveltejs/kit/pull/320)) + +## 1.0.0-next.21 + +### Patch Changes + +- 217e4cc: Set paths to empty string before prerender ([#317](https://github.com/sveltejs/kit/pull/317)) + +## 1.0.0-next.20 + +### Patch Changes + +- ccf4aa7: Implement prerender config ([#315](https://github.com/sveltejs/kit/pull/315)) + +## 1.0.0-next.19 + +### Patch Changes + +- deda984: Make navigating store contain from and to properties ([#313](https://github.com/sveltejs/kit/pull/313)) + +## 1.0.0-next.18 + +### Patch Changes + +- c29b61e: Announce page changes ([#311](https://github.com/sveltejs/kit/pull/311)) +- 72da270: Reset focus properly ([#309](https://github.com/sveltejs/kit/pull/309)) + +## 1.0.0-next.17 + +### Patch Changes + +- f7dea55: Set process.env.NODE_ENV when invoking via the CLI ([#304](https://github.com/sveltejs/kit/pull/304)) + +## 1.0.0-next.16 + +### Patch Changes + +- Remove temporary logging +- Add sveltekit:prefetch and sveltekit:noscroll + +## 1.0.0-next.15 + +### Patch Changes + +- 6d1bb11: Fix AMP CSS ([#286](https://github.com/sveltejs/kit/pull/286)) +- d8b53af: Ignore $layout and $error files when finding static paths +- Better scroll tracking + +## 1.0.0-next.14 + +### Patch Changes + +- Fix dev loader + +## 1.0.0-next.13 + +### Patch Changes + +- 1ea4d6b: More robust CSS extraction ([#279](https://github.com/sveltejs/kit/pull/279)) + +## 1.0.0-next.12 + +### Patch Changes + +- e7c88dd: Tweak AMP validation screen + +## 1.0.0-next.11 + +### Patch Changes + +- a31f218: Fix SSR loader invalidation ([#277](https://github.com/sveltejs/kit/pull/277)) + +## 1.0.0-next.10 + +### Patch Changes + +- 8b14d29: Omit svelte-data scripts from AMP pages ([#276](https://github.com/sveltejs/kit/pull/276)) + +## 1.0.0-next.9 + +### Patch Changes + +- f5fa223: AMP support ([#274](https://github.com/sveltejs/kit/pull/274)) +- 47f2ee1: Always remove trailing slashes ([#267](https://github.com/sveltejs/kit/pull/267)) +- 1becb94: Replace preload with load + +## 1.0.0-next.8 + +### Patch Changes + +- 15dd751: Use meta http-equiv=refresh ([#256](https://github.com/sveltejs/kit/pull/256)) +- be7e031: Fix handling of static files ([#258](https://github.com/sveltejs/kit/pull/258)) +- ed6b8fd: Implement \$app/env ([#251](https://github.com/sveltejs/kit/pull/251)) + +## 1.0.0-next.7 + +### Patch Changes + +- 76705b0: make HMR work outside localhost ([#246](https://github.com/sveltejs/kit/pull/246)) + +## 1.0.0-next.6 + +### Patch Changes + +- 0e45255: Move options behind kit namespace, change paths -> kit.files ([#236](https://github.com/sveltejs/kit/pull/236)) +- fa7f2b2: Implement live bindings for SSR code ([#245](https://github.com/sveltejs/kit/pull/245)) + +## 1.0.0-next.5 + +### Patch Changes + +- Return dependencies from render + +## 1.0.0-next.4 + +### Patch Changes + +- af01b0d: Move renderer out of app assets folder + +## 1.0.0-next.3 + +### Patch Changes + +- Add paths to manifest, for static prerendering + +## 1.0.0-next.2 + +### Patch Changes + +- Fix typo causing misnamed assets folder + +## 1.0.0-next.1 + +### Patch Changes + +- a4bc090: Transform exported functions correctly ([#225](https://github.com/sveltejs/kit/pull/225)) +- 00bbf98: Fix nested layouts ([#227](https://github.com/sveltejs/kit/pull/227)) + +## 0.0.31-next.0 + +### Patch Changes + +- ffd7bba: Fix SSR cache invalidation ([#217](https://github.com/sveltejs/kit/pull/217)) + +## 0.0.30 + +### Patch Changes + +- Add back stores(), but with deprecation warning +- Rename stores.preloading to stores.navigating +- Rewrite routing logic + +## 0.0.29 + +### Patch Changes + +- 10872cc: Normalize request.query ([#196](https://github.com/sveltejs/kit/pull/196)) + +## 0.0.28 + +### Patch Changes + +- Add svelte-kit start command + +## 0.0.27 + +### Patch Changes + +- rename CLI to svelte-kit +- 0904e22: rename svelte CLI to svelte-kit ([#186](https://github.com/sveltejs/kit/pull/186)) +- Validate route responses +- Make paths and target configurable + +## 0.0.26 + +### Patch Changes + +- b475ed4: Overhaul adapter API - fixes #166 ([#180](https://github.com/sveltejs/kit/pull/180)) +- Updated dependencies [b475ed4] + - @sveltejs/app-utils@0.0.18 + +## 0.0.25 + +### Patch Changes + +- Updated dependencies [3bdf33b] + - @sveltejs/app-utils@0.0.17 + +## 0.0.24 + +### Patch Changes + +- 67eaeea: Move app-utils stuff into subpackages +- 7f8df30: Move kit runtime code, expose via \$app aliases +- Updated dependencies [67eaeea] + - @sveltejs/app-utils@0.0.16 + +## 0.0.23 + +### Patch Changes + +- a163000: Parse body on incoming requests +- a346eab: Copy over latest Sapper router code ([#6](https://github.com/sveltejs/kit/pull/6)) +- Updated dependencies [a163000] + - @sveltejs/app-utils@0.0.15 + +## 0.0.22 + +### Patch Changes + +- Force bump version + +## 0.0.21 + +### Patch Changes + +- Build setup entry point +- Work around pkg.exports constraint +- Respond with 500s if render fails +- Updated dependencies [undefined] +- Updated dependencies [undefined] +- Updated dependencies [undefined] + - @sveltejs/app-utils@0.0.14 + +## 0.0.20 + +### Patch Changes + +- Pass setup module to renderer +- Bump Snowpack version +- Updated dependencies [undefined] +- Updated dependencies [96c06d8] + - @sveltejs/app-utils@0.0.13 + +## 0.0.19 + +### Patch Changes + +- fa9d7ce: Handle import.meta in SSR module loader +- 0320208: Rename 'server route' to 'endpoint' +- b9444d2: Update to Snowpack 2.15 +- 5ca907c: Use shared mkdirp helper +- Updated dependencies [0320208] +- Updated dependencies [5ca907c] + - @sveltejs/app-utils@0.0.12 + +## 0.0.18 + +### Patch Changes + +- Updated dependencies [undefined] + - @sveltejs/app-utils@0.0.11 + +## 0.0.17 + +### Patch Changes + +- 19323e9: Update Snowpack +- Updated dependencies [19323e9] + - @sveltejs/app-utils@0.0.10 + +## 0.0.16 + +### Patch Changes + +- Updated dependencies [90a98ae] + - @sveltejs/app-utils@0.0.9 + +## 0.0.15 + +### Patch Changes + +- Updated dependencies [undefined] + - @sveltejs/app-utils@0.0.8 + +## 0.0.14 + +### Patch Changes + +- various +- Updated dependencies [undefined] + - @sveltejs/app-utils@0.0.7 diff --git a/packages/kit/CHANGELOG.md b/packages/kit/CHANGELOG.md index 2c00cae41b20..7f2eedf37955 100644 --- a/packages/kit/CHANGELOG.md +++ b/packages/kit/CHANGELOG.md @@ -2288,4268 +2288,5 @@ ### Major Changes -First major release, see below for the history of changes that lead up to this. +First major release, see [CHANGELOG-pre-1.md](CHANGELOG-pre-1.md) for the history of changes that lead up to this. Starting from now all releases follow semver and changes will be listed as Major/Minor/Patch - -## 1.0.0-next.589 - -### Patch Changes - -- breaking: remove warnings/errors about removed/changed APIs ([#8019](https://github.com/sveltejs/kit/pull/8019)) - -## 1.0.0-next.588 - -### Patch Changes - -- fix: remove obsolete generated types correctly ([#8149](https://github.com/sveltejs/kit/pull/8149)) - -## 1.0.0-next.587 - -### Patch Changes - -- breaking: prerender shells when ssr false and prerender not false ([#8131](https://github.com/sveltejs/kit/pull/8131)) - -## 1.0.0-next.586 - -### Patch Changes - -- fix: don't de/encode initial and explicit string headers ([#8113](https://github.com/sveltejs/kit/pull/8113)) - -## 1.0.0-next.585 - -### Patch Changes - -- fix: remove unused elements from default error component ([#8110](https://github.com/sveltejs/kit/pull/8110)) - -## 1.0.0-next.584 - -### Patch Changes - -- fix: load errorTemplate from correct location ([#8096](https://github.com/sveltejs/kit/pull/8096)) -- More robust manifest error recovery ([#8095](https://github.com/sveltejs/kit/pull/8095)) - -## 1.0.0-next.583 - -### Patch Changes - -- restart vite dev-server on svelte config change ([#8087](https://github.com/sveltejs/kit/pull/8087)) -- Set correct `$page.status` when using `enhance` and result is of type `'error'` ([#8073](https://github.com/sveltejs/kit/pull/8073)) -- fix: ensure export conditions are resolve through Vite ([#8092](https://github.com/sveltejs/kit/pull/8092)) -- fix: don't crash Vite dev server on manifest error ([#8093](https://github.com/sveltejs/kit/pull/8093)) - -## 1.0.0-next.582 - -### Patch Changes - -- fix: improve split between Vite plugins ([#8055](https://github.com/sveltejs/kit/pull/8055)) -- fix: set Vite base URL ([#8046](https://github.com/sveltejs/kit/pull/8046)) -- add declaration for vitePreprocess reexport ([#8053](https://github.com/sveltejs/kit/pull/8053)) - -## 1.0.0-next.581 - -### Patch Changes - -- feat: vitePreprocess ([#8036](https://github.com/sveltejs/kit/pull/8036)) - -## 1.0.0-next.580 - -### Patch Changes - -- breaking: throw an error on invalid load response ([#8003](https://github.com/sveltejs/kit/pull/8003)) -- fix: allow SvelteKit to be used without bundling ([#7950](https://github.com/sveltejs/kit/pull/7950)) - -## 1.0.0-next.579 - -### Patch Changes - -- breaking: update svelte peerDependency to ^3.54.0 ([#7543](https://github.com/sveltejs/kit/pull/7543)) -- update esbuild to ^0.16.3 ([#7543](https://github.com/sveltejs/kit/pull/7543)) -- breaking: upgrade to Vite 4 ([#7543](https://github.com/sveltejs/kit/pull/7543)) - -## 1.0.0-next.578 - -### Patch Changes - -- fix: respect fetch cache option ([#8024](https://github.com/sveltejs/kit/pull/8024)) -- breaking: rename invalid() to fail() and ValidationError to ActionFailure ([#8012](https://github.com/sveltejs/kit/pull/8012)) -- breaking: replace automatic fallback generation with `builder.generateFallback(fallback)` ([#8013](https://github.com/sveltejs/kit/pull/8013)) - -## 1.0.0-next.577 - -### Patch Changes - -- breaking: add embedded option, turned off by default ([#7969](https://github.com/sveltejs/kit/pull/7969)) - -## 1.0.0-next.576 - -### Patch Changes - -- breaking: make `sveltekit()` return a promise of array of Vite plugins ([#7994](https://github.com/sveltejs/kit/pull/7994)) - -## 1.0.0-next.575 - -### Patch Changes - -- fix: throw error when using enhance on GET forms ([#7948](https://github.com/sveltejs/kit/pull/7948)) -- breaking: strip `__data.json` from url ([#7979](https://github.com/sveltejs/kit/pull/7979)) - -## 1.0.0-next.574 - -### Patch Changes - -- feat: split Vite plugin in two ([#7990](https://github.com/sveltejs/kit/pull/7990)) - -## 1.0.0-next.573 - -### Patch Changes - -- fix: adjust ActionData type ([#7962](https://github.com/sveltejs/kit/pull/7962)) -- breaking: disallow unknown exports (except when starting with an underscore) from `+(layout|page)(.server)?.js` and `+server.js` files ([#7878](https://github.com/sveltejs/kit/pull/7878)) -- fix: continuous optionals should not throw conflict error ([#7939](https://github.com/sveltejs/kit/pull/7939)) -- fix `enhance` error message when form action doesn't exist or csrf is enabled ([#7958](https://github.com/sveltejs/kit/pull/7958)) - -## 1.0.0-next.572 - -### Minor Changes - -- Checks that element is not null before reading getAttribute ([#7930](https://github.com/sveltejs/kit/pull/7930)) - -### Patch Changes - -- chore: update `magic-string` ([#7931](https://github.com/sveltejs/kit/pull/7931)) -- add $app and $env to optimizeDeps.exclude so that libraries using these work correctly when prebundled ([#7933](https://github.com/sveltejs/kit/pull/7933)) -- reload dev page on change of app.html ([#7944](https://github.com/sveltejs/kit/pull/7944)) - -## 1.0.0-next.571 - -### Patch Changes - -- fix: use searchParams for x-sveltekit-invalidated ([#7912](https://github.com/sveltejs/kit/pull/7912)) -- fix: correct Vite config merging with force option ([#7911](https://github.com/sveltejs/kit/pull/7911)) -- fix: rebuild manifest when client hooks or param matcher file is added/removed ([#7915](https://github.com/sveltejs/kit/pull/7915)) - -## 1.0.0-next.570 - -### Patch Changes - -- Remove prepublishOnly script ([#7893](https://github.com/sveltejs/kit/pull/7893)) - -## 1.0.0-next.569 - -### Patch Changes - -- Ignore elements that are no longer in the document ([#7881](https://github.com/sveltejs/kit/pull/7881)) -- breaking: Use client-side routing for `` ([#7828](https://github.com/sveltejs/kit/pull/7828)) - -## 1.0.0-next.568 - -### Patch Changes - -- fix: add migration hint for renamed methods ([#7874](https://github.com/sveltejs/kit/pull/7874)) - -## 1.0.0-next.567 - -### Patch Changes - -- Co-locate synthetic types with other Kit types ([#7864](https://github.com/sveltejs/kit/pull/7864)) - -## 1.0.0-next.566 - -### Patch Changes - -- Add more type documentation ([#7003](https://github.com/sveltejs/kit/pull/7003)) -- breaking: move SubmitFunction into @sveltejs/kit ([#7003](https://github.com/sveltejs/kit/pull/7003)) - -## 1.0.0-next.565 - -### Patch Changes - -- breaking: Replace `data-sveltekit-prefetch` with `-preload-code` and `-preload-data` ([#7776](https://github.com/sveltejs/kit/pull/7776)) -- breaking: Rename `prefetch` to `preloadData` and `prefetchRoutes` to `preloadCode` ([#7776](https://github.com/sveltejs/kit/pull/7776)) - -## 1.0.0-next.564 - -### Patch Changes - -- chore: upgrade undici ([#7830](https://github.com/sveltejs/kit/pull/7830)) -- Make `$page.url` resilient against mutations ([#7827](https://github.com/sveltejs/kit/pull/7827)) - -## 1.0.0-next.563 - -### Patch Changes - -- feat: allow handleError to return a promise ([#7780](https://github.com/sveltejs/kit/pull/7780)) -- breaking: remove `format` option from `generateManifest(...)` ([#7820](https://github.com/sveltejs/kit/pull/7820)) - -## 1.0.0-next.562 - -### Patch Changes - -- fix: handle redirects in handle hook while processing data request ([#7797](https://github.com/sveltejs/kit/pull/7797)) -- Make touchstart listener passive ([#7818](https://github.com/sveltejs/kit/pull/7818)) -- breaking: remove `getStaticDirectory()` from builder API ([#7809](https://github.com/sveltejs/kit/pull/7809)) -- Make console.warn wrapper named rather than anonymous ([#7811](https://github.com/sveltejs/kit/pull/7811)) - -## 1.0.0-next.561 - -### Patch Changes - -- Upgrade vite-plugin-svelte to ^1.3.1 ([#7760](https://github.com/sveltejs/kit/pull/7760)) - -## 1.0.0-next.560 - -### Patch Changes - -- breaking: Rename `prerendering` to `building`, remove `config.kit.prerender.enabled` ([#7762](https://github.com/sveltejs/kit/pull/7762)) - -## 1.0.0-next.559 - -### Patch Changes - -- Roll over non-matching optional parameters instead of 404ing ([#7753](https://github.com/sveltejs/kit/pull/7753)) -- fix: enable Vite's modulePreload.polyfill ([#7770](https://github.com/sveltejs/kit/pull/7770)) - -## 1.0.0-next.558 - -### Patch Changes - -- breaking: Disallow error status codes outside 400-599 ([#7767](https://github.com/sveltejs/kit/pull/7767)) -- breaking: Make client-side router ignore links outside %sveltekit.body% ([#7766](https://github.com/sveltejs/kit/pull/7766)) - -## 1.0.0-next.557 - -### Patch Changes - -- external fetch calls: ensure serialized cookie values are url-encoded [#7736] ([#7736](https://github.com/sveltejs/kit/pull/7736)) - -## 1.0.0-next.556 - -### Patch Changes - -- fix: preserve Vite CLI opts ([#7749](https://github.com/sveltejs/kit/pull/7749)) - -## 1.0.0-next.555 - -### Patch Changes - -- Made `config.kit.outDir` able to be located in `node_modules` ([#7707](https://github.com/sveltejs/kit/pull/7707)) - -## 1.0.0-next.554 - -### Patch Changes - -- create stronger types for dynamically generated env modules ([#7735](https://github.com/sveltejs/kit/pull/7735)) -- breaking: Make `trailingSlash` a page option, rather than configuration ([#7719](https://github.com/sveltejs/kit/pull/7719)) -- Handle hash links with non-ASCII characters when prerendering ([#7729](https://github.com/sveltejs/kit/pull/7729)) -- Ignore popstate events from outside the router ([#7721](https://github.com/sveltejs/kit/pull/7721)) - -## 1.0.0-next.553 - -### Patch Changes - -- Prevent Vite from nuking logs on startup ([#7724](https://github.com/sveltejs/kit/pull/7724)) - -## 1.0.0-next.552 - -### Patch Changes - -- Don't hardcode version in client bundle ([#7694](https://github.com/sveltejs/kit/pull/7694)) -- Allow .d.ts files to have a + prefix ([#7682](https://github.com/sveltejs/kit/pull/7682)) -- Expose version from `$app/environment` ([#7689](https://github.com/sveltejs/kit/pull/7689)) -- fix: export HttpError/Redirect interface ([#7701](https://github.com/sveltejs/kit/pull/7701)) -- fix: don't preload fonts by default ([#7704](https://github.com/sveltejs/kit/pull/7704)) -- Always set `Accept` and `Accept-Language` headers when making a self-request ([#7722](https://github.com/sveltejs/kit/pull/7722)) -- fix: adjust interfaces to fix type errors ([#7718](https://github.com/sveltejs/kit/pull/7718)) - -## 1.0.0-next.551 - -### Patch Changes - -- Add `Access-Control-Allow-Origin: *` to static assets in dev ([#7688](https://github.com/sveltejs/kit/pull/7688)) -- Ignore presence of `keepfocus` and `noscroll` in `goto` options if correctly-cased options are also present ([#7678](https://github.com/sveltejs/kit/pull/7678)) - -## 1.0.0-next.550 - -### Patch Changes - -- feat: preload fonts and add preload customization ([#4963](https://github.com/sveltejs/kit/pull/4963)) - -## 1.0.0-next.549 - -### Patch Changes - -- Always apply Node polyfills ([#7675](https://github.com/sveltejs/kit/pull/7675)) - -## 1.0.0-next.548 - -### Patch Changes - -- Only apply polyfills where necessary ([#7668](https://github.com/sveltejs/kit/pull/7668)) - -## 1.0.0-next.547 - -### Patch Changes - -- fix: safely join url segments in manifest ([#7653](https://github.com/sveltejs/kit/pull/7653)) -- breaking: use devalue to (de)serialize action data ([#7494](https://github.com/sveltejs/kit/pull/7494)) -- Warn if `%sveltekit.body%` is direct child of `` ([#7652](https://github.com/sveltejs/kit/pull/7652)) - -## 1.0.0-next.546 - -### Patch Changes - -- fix outdated config error ([#7649](https://github.com/sveltejs/kit/pull/7649)) -- breaking: use hex/unicode escape sequences for encoding special characters in route directory names ([#7644](https://github.com/sveltejs/kit/pull/7644)) -- fix `beforeNavigate` description — `routeId` -> `route.id` ([#7643](https://github.com/sveltejs/kit/pull/7643)) - -## 1.0.0-next.545 - -### Patch Changes - -- fix: prerendering path and layout fixes ([#7639](https://github.com/sveltejs/kit/pull/7639)) -- fix: add Promise return type to the `enhance` action ([#7629](https://github.com/sveltejs/kit/pull/7629)) - -## 1.0.0-next.544 - -### Patch Changes - -- breaking: narrow down possible status codes for redirects to 300-308 ([#7615](https://github.com/sveltejs/kit/pull/7615)) -- feat: add fallback component for layouts without one ([#7619](https://github.com/sveltejs/kit/pull/7619)) - -## 1.0.0-next.543 - -### Patch Changes - -- Don't print search params error when prerendering fallback page ([#7598](https://github.com/sveltejs/kit/pull/7598)) -- allow async function for `enhance` action parameter ([#7608](https://github.com/sveltejs/kit/pull/7608)) -- Run service worker during development ([#7597](https://github.com/sveltejs/kit/pull/7597)) -- feat: support throwing redirect in handle ([#7612](https://github.com/sveltejs/kit/pull/7612)) -- Workaround for the DOM clobbering for use:enhance ([#7599](https://github.com/sveltejs/kit/pull/7599)) -- fix: don't cache prefetch errors ([#7610](https://github.com/sveltejs/kit/pull/7610)) - -## 1.0.0-next.542 - -### Patch Changes - -- Add support for linking to tags ([#7596](https://github.com/sveltejs/kit/pull/7596)) -- breaking: don't run beforeNavigate during redirects ([#7588](https://github.com/sveltejs/kit/pull/7588)) -- fix: respect autofocus following navigation or enhanced form submit ([#6643](https://github.com/sveltejs/kit/pull/6643)) - -## 1.0.0-next.541 - -### Minor Changes - -- fix: don't clean build and output directories when using `--watch` ([#7516](https://github.com/sveltejs/kit/pull/7516)) - -### Patch Changes - -- fix: handle expected errors thrown in handle hook correctly ([#7566](https://github.com/sveltejs/kit/pull/7566)) - -## 1.0.0-next.540 - -### Patch Changes - -- Serve prerendered non-page files when running preview ([#7576](https://github.com/sveltejs/kit/pull/7576)) -- fix: caching takes now into account the body payload ([#7546](https://github.com/sveltejs/kit/pull/7546)) -- fix: handle locked readable stream when reading body ([#7565](https://github.com/sveltejs/kit/pull/7565)) -- fix: prefetch should ignore links ignored by the router ([#7580](https://github.com/sveltejs/kit/pull/7580)) -- fix: migration error when using $page.routeId ([#7574](https://github.com/sveltejs/kit/pull/7574)) -- prevent loading of illegal modules in the browser, rather than during SSR ([#7507](https://github.com/sveltejs/kit/pull/7507)) -- fix: prevent double decoding of path segment ([#7550](https://github.com/sveltejs/kit/pull/7550)) - -## 1.0.0-next.539 - -### Patch Changes - -- Omit prerendered routes from server manifest ([#7541](https://github.com/sveltejs/kit/pull/7541)) - -## 1.0.0-next.538 - -### Patch Changes - -- feat: enable caching for `__data.json` requests ([#7532](https://github.com/sveltejs/kit/pull/7532)) -- fix: prevent double decoding of params ([#7521](https://github.com/sveltejs/kit/pull/7521)) -- fix: take into account Request input when serializing fetch data ([#7531](https://github.com/sveltejs/kit/pull/7531)) -- fix: better cookie warning checks ([#7528](https://github.com/sveltejs/kit/pull/7528)) - -## 1.0.0-next.537 - -### Patch Changes - -- feat: better navigation interfaces ([#7529](https://github.com/sveltejs/kit/pull/7529)) - -## 1.0.0-next.536 - -### Patch Changes - -- custom aliases resolved in service worker builds ([#7500](https://github.com/sveltejs/kit/pull/7500)) - -## 1.0.0-next.535 - -### Patch Changes - -- breaking: call beforeNavigate once with type unload on external navigation, rename type 'load' to 'enter' and type 'unload' to 'leave', add 'willUnload' property ([#6813](https://github.com/sveltejs/kit/pull/6813)) - -## 1.0.0-next.534 - -### Patch Changes - -- breaking: more consistent casing for goto options ([#7502](https://github.com/sveltejs/kit/pull/7502)) -- breaking: replace routeId with route.id ([#7450](https://github.com/sveltejs/kit/pull/7450)) -- Fix nullish data node reference ([#7503](https://github.com/sveltejs/kit/pull/7503)) - -## 1.0.0-next.533 - -### Patch Changes - -- fix: bump required Vite version and address warning ([#7491](https://github.com/sveltejs/kit/pull/7491)) - -## 1.0.0-next.532 - -### Patch Changes - -- Bump devalue version ([#7466](https://github.com/sveltejs/kit/pull/7466)) - -## 1.0.0-next.531 - -### Patch Changes - -- breaking: change `config.kit.prerender.onError` to `handleHttpError`, and check for invalid fragment links ([#7375](https://github.com/sveltejs/kit/pull/7375)) -- fix escaping bug in crawler ([#7375](https://github.com/sveltejs/kit/pull/7375)) - -## 1.0.0-next.530 - -### Patch Changes - -- fix: fetch erroring on Cloudflare ([#7453](https://github.com/sveltejs/kit/pull/7453)) -- Only simulate CORS errors for shared load functions ([#7454](https://github.com/sveltejs/kit/pull/7454)) - -## 1.0.0-next.529 - -### Patch Changes - -- fix: better type generation for load functions with different return values ([#7425](https://github.com/sveltejs/kit/pull/7425)) -- fix: correctly strip data suffix at root page ([#7445](https://github.com/sveltejs/kit/pull/7445)) -- update dependencies ([#7355](https://github.com/sveltejs/kit/pull/7355)) - -## 1.0.0-next.528 - -### Patch Changes - -- Restore `req.url` to `req.originalUrl` in dev and preview ([#7343](https://github.com/sveltejs/kit/pull/7343)) - -## 1.0.0-next.527 - -### Patch Changes - -- fix: harmonize cookie path and add dev time warnings ([#7416](https://github.com/sveltejs/kit/pull/7416)) -- feat: add invalidateAll option to goto ([#7407](https://github.com/sveltejs/kit/pull/7407)) - -## 1.0.0-next.526 - -### Patch Changes - -- declare function type with named syntax ([#7396](https://github.com/sveltejs/kit/pull/7396)) -- fix: optional params can be undefined ([#7379](https://github.com/sveltejs/kit/pull/7379)) -- fix: support undici 5.12.0 and pin it ([#7412](https://github.com/sveltejs/kit/pull/7412)) -- chore: upgrade to vite-plugin-svelte 1.1.0 and enable prebundleSvelteLibraries ([#7388](https://github.com/sveltejs/kit/pull/7388)) -- Show more descriptive error if data returned from `load` is a non-POJO ([#7386](https://github.com/sveltejs/kit/pull/7386)) - -## 1.0.0-next.525 - -### Patch Changes - -- Always avoid caching form submission on enhanced forms ([#7350](https://github.com/sveltejs/kit/pull/7350)) - -## 1.0.0-next.524 - -### Patch Changes - -- fix: get type gen working again ([#7370](https://github.com/sveltejs/kit/pull/7370)) -- fix: don't run matchers for empty optional params ([#7346](https://github.com/sveltejs/kit/pull/7346)) - -## 1.0.0-next.523 - -### Patch Changes - -- fix: split route ids into correct segments ([#7367](https://github.com/sveltejs/kit/pull/7367)) - -## 1.0.0-next.522 - -### Patch Changes - -- docs: rewrite load docs ([#7174](https://github.com/sveltejs/kit/pull/7174)) -- breaking: Prefix all route IDs with / ([#7338](https://github.com/sveltejs/kit/pull/7338)) - -## 1.0.0-next.521 - -### Patch Changes - -- feat: add reset option to update method of enhance ([#7326](https://github.com/sveltejs/kit/pull/7326)) -- breaking: remove global fetch override when prerendering ([#7318](https://github.com/sveltejs/kit/pull/7318)) -- Improve error message when prefetching fails ([#7314](https://github.com/sveltejs/kit/pull/7314)) - -## 1.0.0-next.520 - -### Patch Changes - -- fix: ensure serialized headers check is always applied ([#7221](https://github.com/sveltejs/kit/pull/7221)) - -## 1.0.0-next.519 - -### Patch Changes - -- breaking: throw error when routes conflict ([#7051](https://github.com/sveltejs/kit/pull/7051)) -- feat: implement optional route params ([#7051](https://github.com/sveltejs/kit/pull/7051)) - -## 1.0.0-next.518 - -### Patch Changes - -- Enable removal of non-browser code from client builds ([#7296](https://github.com/sveltejs/kit/pull/7296)) -- feat: more info about prerendering errors, add strict option to adapter-static ([#7264](https://github.com/sveltejs/kit/pull/7264)) - -## 1.0.0-next.517 - -### Patch Changes - -- fix: more informative serialization error messages ([#7303](https://github.com/sveltejs/kit/pull/7303)) -- fix: add `$types` to includes for better DX ([#7301](https://github.com/sveltejs/kit/pull/7301)) - -## 1.0.0-next.516 - -### Patch Changes - -- fix: better navigation protocol check ([#7067](https://github.com/sveltejs/kit/pull/7067)) -- fix: forward cookie headers on etag response ([#7256](https://github.com/sveltejs/kit/pull/7256)) -- Properly resolve absolute paths to relative on server build ([#7252](https://github.com/sveltejs/kit/pull/7252)) - -## 1.0.0-next.515 - -### Patch Changes - -- Account for relative path to routes in `config.kit.files.routes` ([#7223](https://github.com/sveltejs/kit/pull/7223)) -- Use config.kit.paths.base prefix for static assets ([#4448](https://github.com/sveltejs/kit/pull/4448)) - -## 1.0.0-next.514 - -### Patch Changes - -- add helpful error message for `throw invalid()` in form actions ([#7225](https://github.com/sveltejs/kit/pull/7225)) - -## 1.0.0-next.513 - -### Patch Changes - -- Transfer server data as devalue-encoded JSON ([#7177](https://github.com/sveltejs/kit/pull/7177)) -- fix: remove groups from segments for adapters ([#7222](https://github.com/sveltejs/kit/pull/7222)) - -## 1.0.0-next.512 - -### Patch Changes - -- Fix parsing content-type header for actions ([#7195](https://github.com/sveltejs/kit/pull/7195)) -- fix: reset form in use:enhance after successful submit ([#7207](https://github.com/sveltejs/kit/pull/7207)) -- fix: auto-update commented PageError ([#7189](https://github.com/sveltejs/kit/pull/7189)) - -## 1.0.0-next.511 - -### Patch Changes - -- perf: render head links before other content ([#7160](https://github.com/sveltejs/kit/pull/7160)) - -## 1.0.0-next.510 - -### Patch Changes - -- Add `fetch` to `RequestEvent` ([#7113](https://github.com/sveltejs/kit/pull/7113)) - -## 1.0.0-next.509 - -### Patch Changes - -- Apply define config to service worker ([#7140](https://github.com/sveltejs/kit/pull/7140)) -- chore: Skip removing HTTP/2 pseudo-headers, which is no longer necessary with undici ([#7142](https://github.com/sveltejs/kit/pull/7142)) -- bump devalue to version 4 ([#7147](https://github.com/sveltejs/kit/pull/7147)) - -## 1.0.0-next.508 - -### Patch Changes - -- chore: Upgrade undici so that we can use its multipart form data parsing instead of node-fetch's ([#7131](https://github.com/sveltejs/kit/pull/7131)) - -## 1.0.0-next.507 - -### Patch Changes - -- Allow TypedArray request bodies in `fetch` in `load` ([#7065](https://github.com/sveltejs/kit/pull/7065)) -- Use `FormData` polyfill from `undici` rather than `node-fetch` ([#7065](https://github.com/sveltejs/kit/pull/7065)) - -## 1.0.0-next.506 - -### Patch Changes - -- Default to insecure cookies when serving on http://localhost ([#7090](https://github.com/sveltejs/kit/pull/7090)) -- docs: explain ramifications of base path ([#7095](https://github.com/sveltejs/kit/pull/7095)) -- fix: decode routeIds in headers for prerendering ([#7097](https://github.com/sveltejs/kit/pull/7097)) -- feat: provide `update` to `use:enhance` callback ([#7083](https://github.com/sveltejs/kit/pull/7083)) - -## 1.0.0-next.505 - -### Patch Changes - -- fix: handle form action returning nothing; handle page.(server).js without load functions ([#7050](https://github.com/sveltejs/kit/pull/7050)) -- fix: add `RequestEvent` to `$types` when `+layout.server.js` present ([#7063](https://github.com/sveltejs/kit/pull/7063)) - -## 1.0.0-next.504 - -### Patch Changes - -- Add the submitter value with name to formData for use:enhance ([#7012](https://github.com/sveltejs/kit/pull/7012)) - -## 1.0.0-next.503 - -### Patch Changes - -- Added form property to \$page store ([#6986](https://github.com/sveltejs/kit/pull/6986)) -- Throw an error if prerenderable routes are not prerendered ([#6974](https://github.com/sveltejs/kit/pull/6974)) - -## 1.0.0-next.502 - -### Patch Changes - -- fix: prevent data types from becoming type `never`, notice moved/deleted files ([#7002](https://github.com/sveltejs/kit/pull/7002)) -- Allow ActionData to be undefined ([#6994](https://github.com/sveltejs/kit/pull/6994)) -- Respect `config.kit.env.dir` when running `vite preview` ([#7001](https://github.com/sveltejs/kit/pull/7001)) -- Only run postinstall script if package.json exists ([#6998](https://github.com/sveltejs/kit/pull/6998)) -- Use custom x-sveltekit-action header to route enhanced form submissions to +page.server.js over +server.js ([#6997](https://github.com/sveltejs/kit/pull/6997)) - -## 1.0.0-next.501 - -### Patch Changes - -- fix: unwrap promises for load function data on the client ([#6972](https://github.com/sveltejs/kit/pull/6972)) - -## 1.0.0-next.500 - -### Patch Changes - -- Allow prerendered pages to link to non-prerenderable endpoints ([#6977](https://github.com/sveltejs/kit/pull/6977)) -- fix: handle SPA root data loading error ([#6918](https://github.com/sveltejs/kit/pull/6918)) - -## 1.0.0-next.499 - -### Patch Changes - -- breaking: rename App.PageError to App.Error ([#6963](https://github.com/sveltejs/kit/pull/6963)) - -## 1.0.0-next.498 - -### Patch Changes - -- chdir before attempting postinstall ([#6969](https://github.com/sveltejs/kit/pull/6969)) - -## 1.0.0-next.497 - -### Patch Changes - -- Add origin header for non-GET and external requests made with server-side fetch ([#6901](https://github.com/sveltejs/kit/pull/6901)) - -## 1.0.0-next.496 - -### Patch Changes - -- fix: update page status when applying action ([#6942](https://github.com/sveltejs/kit/pull/6942)) -- fix: apply redirect/error logic for `use:enhance` ([#6828](https://github.com/sveltejs/kit/pull/6828)) - -## 1.0.0-next.495 - -### Patch Changes - -- Run `svelte-kit sync` in all workspace directories during postinstall ([#6949](https://github.com/sveltejs/kit/pull/6949)) - -## 1.0.0-next.494 - -### Patch Changes - -- Fix fetch type ([#6955](https://github.com/sveltejs/kit/pull/6955)) -- Add csp wasm-unsafe-eval keyword ([#6958](https://github.com/sveltejs/kit/pull/6958)) -- Register service worker with relative URL ([#6954](https://github.com/sveltejs/kit/pull/6954)) - -## 1.0.0-next.493 - -### Patch Changes - -- fix: allow missing routes folder ([#6944](https://github.com/sveltejs/kit/pull/6944)) -- Only forward set-cookie headers for internal fetches ([#6923](https://github.com/sveltejs/kit/pull/6923)) - -## 1.0.0-next.492 - -### Patch Changes - -- fix: add missing depends function to ServerLoadEvent type ([#6935](https://github.com/sveltejs/kit/pull/6935)) -- Redact error message if `getRequest` fails ([#6936](https://github.com/sveltejs/kit/pull/6936)) -- Add cookies.serialize method ([#6925](https://github.com/sveltejs/kit/pull/6925)) -- Always apply cookies, not just for matched routes ([#6925](https://github.com/sveltejs/kit/pull/6925)) -- fix: tighten up navigation and invalidation logic ([#6924](https://github.com/sveltejs/kit/pull/6924)) -- Respond with 413 if request body is too large ([#6936](https://github.com/sveltejs/kit/pull/6936)) - -## 1.0.0-next.491 - -### Patch Changes - -- fix: symlink routes ([#6796](https://github.com/sveltejs/kit/pull/6796)) - -## 1.0.0-next.490 - -### Patch Changes - -- fix `write_types` on windows using posixify() ([#6913](https://github.com/sveltejs/kit/pull/6913)) -- Prevent caching of `__data.js` files ([#6904](https://github.com/sveltejs/kit/pull/6904)) -- Make url property getters non-enumerable ([#6909](https://github.com/sveltejs/kit/pull/6909)) - -## 1.0.0-next.489 - -### Patch Changes - -- fix: tighten up handling and documentation around 404 ([#6897](https://github.com/sveltejs/kit/pull/6897)) - -## 1.0.0-next.488 - -### Patch Changes - -- Decode HTML entities in `href` attributes when crawling ([#6891](https://github.com/sveltejs/kit/pull/6891)) - -## 1.0.0-next.487 - -### Patch Changes - -- feat: allow +server.js files next to +page files ([#6773](https://github.com/sveltejs/kit/pull/6773)) - -## 1.0.0-next.486 - -### Patch Changes - -- fix: handle jsdoc without tags while generating proxy types ([#6884](https://github.com/sveltejs/kit/pull/6884)) - -## 1.0.0-next.485 - -### Patch Changes - -- fix to ActionData type generation ([#6869](https://github.com/sveltejs/kit/pull/6869)) -- The return type of cookies.get is string|undefined #6865 ([#6867](https://github.com/sveltejs/kit/pull/6867)) - -## 1.0.0-next.484 - -### Patch Changes - -- fix: forward cookies from fetch on redirect response ([#6833](https://github.com/sveltejs/kit/pull/6833)) -- adding missing `@types/cookie` dependency ([#6818](https://github.com/sveltejs/kit/pull/6818)) -- fix `write_types` on windows ([#6843](https://github.com/sveltejs/kit/pull/6843)) - -## 1.0.0-next.483 - -### Patch Changes - -- fix: various `cookies` fixes and improvements ([#6811](https://github.com/sveltejs/kit/pull/6811)) - -## 1.0.0-next.482 - -### Patch Changes - -- fix: ActionData type ([#6748](https://github.com/sveltejs/kit/pull/6748)) -- fix: reuse server data while not reusing client load ([#6778](https://github.com/sveltejs/kit/pull/6778)) -- fix: update current.url on hashchange ([#6802](https://github.com/sveltejs/kit/pull/6802)) -- Change illegal import message to reference public-facing code rather than client-side code ([#6646](https://github.com/sveltejs/kit/pull/6646)) -- fix: silence prop warnings ([#6798](https://github.com/sveltejs/kit/pull/6798)) -- chore: Refactor graph analysis for better unit tests ([#6727](https://github.com/sveltejs/kit/pull/6727)) -- fix: error when using `paths.base` and `import` assets ([#6769](https://github.com/sveltejs/kit/pull/6769)) - -## 1.0.0-next.481 - -### Patch Changes - -- fix: docs links in generated and published types ([#6741](https://github.com/sveltejs/kit/pull/6741)) - -## 1.0.0-next.480 - -### Patch Changes - -- breaking: make action passed to enhance function a URL instead of a string ([#6678](https://github.com/sveltejs/kit/pull/6678)) - -## 1.0.0-next.479 - -### Patch Changes - -- breaking: request creation cleanup ([#6681](https://github.com/sveltejs/kit/pull/6681)) -- breaking: limit adapter-node request size ([#6684](https://github.com/sveltejs/kit/pull/6684)) - -## 1.0.0-next.478 - -### Patch Changes - -- breaking: hooks file renames; error shape defined through handleError ([#6675](https://github.com/sveltejs/kit/pull/6675)) -- breaking: remove element property; enhance can only be used on form elements ([#6662](https://github.com/sveltejs/kit/pull/6662)) - -## 1.0.0-next.477 - -### Patch Changes - -- breaking: prevent import of `$lib/server` modules in client-facing code ([#6623](https://github.com/sveltejs/kit/pull/6623)) -- breaking: change sveltekit.message to sveltekit.error.message ([#6659](https://github.com/sveltejs/kit/pull/6659)) -- breaking: apply 304 logic after handle, so handle receives original response from resolve ([#6639](https://github.com/sveltejs/kit/pull/6639)) - -## 1.0.0-next.476 - -### Patch Changes - -- breaking: change use:enhance signature to support `load component diff --git a/packages/package/test/fixtures/tsconfig-specified/tsconfig.json b/packages/package/test/fixtures/tsconfig-specified/tsconfig.json index b7f8a03f204e..46297297311d 100644 --- a/packages/package/test/fixtures/tsconfig-specified/tsconfig.json +++ b/packages/package/test/fixtures/tsconfig-specified/tsconfig.json @@ -1,6 +1,8 @@ { "compilerOptions": { "target": "ESNext", - "module": "ESNext" + "module": "ESNext", + "checkJs": true, + "noEmit": true } } diff --git a/packages/package/test/fixtures/typescript-esnext/tsconfig.json b/packages/package/test/fixtures/typescript-esnext/tsconfig.json index 0c0c7b104885..44bbdb067a8e 100644 --- a/packages/package/test/fixtures/typescript-esnext/tsconfig.json +++ b/packages/package/test/fixtures/typescript-esnext/tsconfig.json @@ -2,6 +2,8 @@ "compilerOptions": { "target": "ESNext", "module": "ESNext", - "verbatimModuleSyntax": true + "verbatimModuleSyntax": true, + "checkJs": true, + "noEmit": true } } diff --git a/packages/package/test/fixtures/typescript-nodenext/tsconfig.json b/packages/package/test/fixtures/typescript-nodenext/tsconfig.json index 544497c63f70..fb38035e3a30 100644 --- a/packages/package/test/fixtures/typescript-nodenext/tsconfig.json +++ b/packages/package/test/fixtures/typescript-nodenext/tsconfig.json @@ -3,6 +3,8 @@ "target": "ESNext", "module": "NodeNext", "verbatimModuleSyntax": true, - "moduleResolution": "NodeNext" + "moduleResolution": "NodeNext", + "checkJs": true, + "noEmit": true } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 484df1fd429e..6eaf659de68f 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -24,29 +24,29 @@ importers: .: devDependencies: '@changesets/cli': - specifier: ^2.27.11 - version: 2.27.11 + specifier: ^2.29.5 + version: 2.29.5 '@playwright/test': specifier: 'catalog:' version: 1.51.1 '@sveltejs/eslint-config': - specifier: ^8.1.0 - version: 8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.8.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.8.3))(typescript@5.8.3) + specifier: ^8.2.0 + version: 8.2.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.29.0))(eslint-config-prettier@9.1.0(eslint@9.29.0))(eslint-plugin-n@17.16.1(eslint@9.29.0)(typescript@5.8.3))(eslint-plugin-svelte@3.9.3(eslint@9.29.0)(svelte@5.23.1))(eslint@9.29.0)(typescript-eslint@8.35.0(eslint@9.29.0)(typescript@5.8.3))(typescript@5.8.3) '@svitejs/changesets-changelog-github-compact': - specifier: ^1.1.0 - version: 1.1.0 + specifier: ^1.2.0 + version: 1.2.0 eslint: - specifier: ^9.6.0 - version: 9.6.0 + specifier: ^9.29.0 + version: 9.29.0 prettier: - specifier: ^3.1.1 - version: 3.3.3 + specifier: ^3.6.0 + version: 3.6.0 prettier-plugin-svelte: - specifier: ^3.1.2 - version: 3.2.7(prettier@3.3.3)(svelte@5.23.1) + specifier: ^3.4.0 + version: 3.4.0(prettier@3.6.0)(svelte@5.23.1) typescript-eslint: - specifier: ^8.24.0 - version: 8.26.0(eslint@9.6.0)(typescript@5.8.3) + specifier: ^8.35.0 + version: 8.35.0(eslint@9.29.0)(typescript@5.8.3) packages/adapter-auto: devDependencies: @@ -1257,63 +1257,63 @@ packages: resolution: {integrity: sha512-ETyHEk2VHHvl9b9jZP5IHPavHYk57EhanlRRuae9XCpb/j5bDCbPPMOBfCWhnl/7EDJz0jEMCi/RhccCE8r1+Q==} engines: {node: '>=6.9.0'} - '@changesets/apply-release-plan@7.0.7': - resolution: {integrity: sha512-qnPOcmmmnD0MfMg9DjU1/onORFyRpDXkMMl2IJg9mECY6RnxL3wN0TCCc92b2sXt1jt8DgjAUUsZYGUGTdYIXA==} + '@changesets/apply-release-plan@7.0.12': + resolution: {integrity: sha512-EaET7As5CeuhTzvXTQCRZeBUcisoYPDDcXvgTE/2jmmypKp0RC7LxKj/yzqeh/1qFTZI7oDGFcL1PHRuQuketQ==} - '@changesets/assemble-release-plan@6.0.5': - resolution: {integrity: sha512-IgvBWLNKZd6k4t72MBTBK3nkygi0j3t3zdC1zrfusYo0KpdsvnDjrMM9vPnTCLCMlfNs55jRL4gIMybxa64FCQ==} + '@changesets/assemble-release-plan@6.0.9': + resolution: {integrity: sha512-tPgeeqCHIwNo8sypKlS3gOPmsS3wP0zHt67JDuL20P4QcXiw/O4Hl7oXiuLnP9yg+rXLQ2sScdV1Kkzde61iSQ==} - '@changesets/changelog-git@0.2.0': - resolution: {integrity: sha512-bHOx97iFI4OClIT35Lok3sJAwM31VbUM++gnMBV16fdbtBhgYu4dxsphBF/0AZZsyAHMrnM0yFcj5gZM1py6uQ==} + '@changesets/changelog-git@0.2.1': + resolution: {integrity: sha512-x/xEleCFLH28c3bQeQIyeZf8lFXyDFVn1SgcBiR2Tw/r4IAWlk1fzxCEZ6NxQAjF2Nwtczoen3OA2qR+UawQ8Q==} - '@changesets/cli@2.27.11': - resolution: {integrity: sha512-1QislpE+nvJgSZZo9+Lj3Lno5pKBgN46dAV8IVxKJy9wX8AOrs9nn5pYVZuDpoxWJJCALmbfOsHkyxujgetQSg==} + '@changesets/cli@2.29.5': + resolution: {integrity: sha512-0j0cPq3fgxt2dPdFsg4XvO+6L66RC0pZybT9F4dG5TBrLA3jA/1pNkdTXH9IBBVHkgsKrNKenI3n1mPyPlIydg==} hasBin: true - '@changesets/config@3.0.5': - resolution: {integrity: sha512-QyXLSSd10GquX7hY0Mt4yQFMEeqnO5z/XLpbIr4PAkNNoQNKwDyiSrx4yd749WddusH1v3OSiA0NRAYmH/APpQ==} + '@changesets/config@3.1.1': + resolution: {integrity: sha512-bd+3Ap2TKXxljCggI0mKPfzCQKeV/TU4yO2h2C6vAihIo8tzseAn2e7klSuiyYYXvgu53zMN1OeYMIQkaQoWnA==} '@changesets/errors@0.2.0': resolution: {integrity: sha512-6BLOQUscTpZeGljvyQXlWOItQyU71kCdGz7Pi8H8zdw6BI0g3m43iL4xKUVPWtG+qrrL9DTjpdn8eYuCQSRpow==} - '@changesets/get-dependents-graph@2.1.2': - resolution: {integrity: sha512-sgcHRkiBY9i4zWYBwlVyAjEM9sAzs4wYVwJUdnbDLnVG3QwAaia1Mk5P8M7kraTOZN+vBET7n8KyB0YXCbFRLQ==} + '@changesets/get-dependents-graph@2.1.3': + resolution: {integrity: sha512-gphr+v0mv2I3Oxt19VdWRRUxq3sseyUpX9DaHpTUmLj92Y10AGy+XOtV+kbM6L/fDcpx7/ISDFK6T8A/P3lOdQ==} - '@changesets/get-github-info@0.5.2': - resolution: {integrity: sha512-JppheLu7S114aEs157fOZDjFqUDpm7eHdq5E8SSR0gUBTEK0cNSHsrSR5a66xs0z3RWuo46QvA3vawp8BxDHvg==} + '@changesets/get-github-info@0.6.0': + resolution: {integrity: sha512-v/TSnFVXI8vzX9/w3DU2Ol+UlTZcu3m0kXTjTT4KlAdwSvwutcByYwyYn9hwerPWfPkT2JfpoX0KgvCEi8Q/SA==} - '@changesets/get-release-plan@4.0.6': - resolution: {integrity: sha512-FHRwBkY7Eili04Y5YMOZb0ezQzKikTka4wL753vfUA5COSebt7KThqiuCN9BewE4/qFGgF/5t3AuzXx1/UAY4w==} + '@changesets/get-release-plan@4.0.13': + resolution: {integrity: sha512-DWG1pus72FcNeXkM12tx+xtExyH/c9I1z+2aXlObH3i9YA7+WZEVaiHzHl03thpvAgWTRaH64MpfHxozfF7Dvg==} '@changesets/get-version-range-type@0.4.0': resolution: {integrity: sha512-hwawtob9DryoGTpixy1D3ZXbGgJu1Rhr+ySH2PvTLHvkZuQ7sRT4oQwMh0hbqZH1weAooedEjRsbrWcGLCeyVQ==} - '@changesets/git@3.0.2': - resolution: {integrity: sha512-r1/Kju9Y8OxRRdvna+nxpQIsMsRQn9dhhAZt94FLDeu0Hij2hnOozW8iqnHBgvu+KdnJppCveQwK4odwfw/aWQ==} + '@changesets/git@3.0.4': + resolution: {integrity: sha512-BXANzRFkX+XcC1q/d27NKvlJ1yf7PSAgi8JG6dt8EfbHFHi4neau7mufcSca5zRhwOL8j9s6EqsxmT+s+/E6Sw==} '@changesets/logger@0.1.1': resolution: {integrity: sha512-OQtR36ZlnuTxKqoW4Sv6x5YIhOmClRd5pWsjZsddYxpWs517R0HkyiefQPIytCVh4ZcC5x9XaG8KTdd5iRQUfg==} - '@changesets/parse@0.4.0': - resolution: {integrity: sha512-TS/9KG2CdGXS27S+QxbZXgr8uPsP4yNJYb4BC2/NeFUj80Rni3TeD2qwWmabymxmrLo7JEsytXH1FbpKTbvivw==} + '@changesets/parse@0.4.1': + resolution: {integrity: sha512-iwksMs5Bf/wUItfcg+OXrEpravm5rEd9Bf4oyIPL4kVTmJQ7PNDSd6MDYkpSJR1pn7tz/k8Zf2DhTCqX08Ou+Q==} - '@changesets/pre@2.0.1': - resolution: {integrity: sha512-vvBJ/If4jKM4tPz9JdY2kGOgWmCowUYOi5Ycv8dyLnEE8FgpYYUo1mgJZxcdtGGP3aG8rAQulGLyyXGSLkIMTQ==} + '@changesets/pre@2.0.2': + resolution: {integrity: sha512-HaL/gEyFVvkf9KFg6484wR9s0qjAXlZ8qWPDkTyKF6+zqjBe/I2mygg3MbpZ++hdi0ToqNUF8cjj7fBy0dg8Ug==} - '@changesets/read@0.6.2': - resolution: {integrity: sha512-wjfQpJvryY3zD61p8jR87mJdyx2FIhEcdXhKUqkja87toMrP/3jtg/Yg29upN+N4Ckf525/uvV7a4tzBlpk6gg==} + '@changesets/read@0.6.5': + resolution: {integrity: sha512-UPzNGhsSjHD3Veb0xO/MwvasGe8eMyNrR/sT9gR8Q3DhOQZirgKhhXv/8hVsI0QpPjR004Z9iFxoJU6in3uGMg==} - '@changesets/should-skip-package@0.1.1': - resolution: {integrity: sha512-H9LjLbF6mMHLtJIc/eHR9Na+MifJ3VxtgP/Y+XLn4BF7tDTEN1HNYtH6QMcjP1uxp9sjaFYmW8xqloaCi/ckTg==} + '@changesets/should-skip-package@0.1.2': + resolution: {integrity: sha512-qAK/WrqWLNCP22UDdBTMPH5f41elVDlsNyat180A33dWxuUDyNpg6fPi/FyTZwRriVjg0L8gnjJn2F9XAoF0qw==} '@changesets/types@4.1.0': resolution: {integrity: sha512-LDQvVDv5Kb50ny2s25Fhm3d9QSZimsoUGBsUioj6MC3qbMUCuC8GPIvk/M6IvXx3lYhAs0lwWUQLb+VIEUCECw==} - '@changesets/types@6.0.0': - resolution: {integrity: sha512-b1UkfNulgKoWfqyHtzKS5fOZYSJO+77adgL7DLRDr+/7jhChN+QcHnbjiQVOz/U+Ts3PGNySq7diAItzDgugfQ==} + '@changesets/types@6.1.0': + resolution: {integrity: sha512-rKQcJ+o1nKNgeoYRHKOS07tAMNd3YSN0uHaJOZYjBAgxfV7TUE7JE+z4BzZdQwb5hKaYbayKN5KrYV7ODb2rAA==} - '@changesets/write@0.3.2': - resolution: {integrity: sha512-kDxDrPNpUgsjDbWBvUo27PzKX4gqeKOlhibaOXDJA6kuBisGqNHv/HwGJrAu8U/dSf8ZEFIeHIPtvSlZI1kULw==} + '@changesets/write@0.4.0': + resolution: {integrity: sha512-CdTLvIOPiCNuH71pyDu3rA+Q0n65cmAbXnwWH84rKGiFumFzkmHNT8KHTMEchcxN+Kl8I54xGUhJ7l3E7X396Q==} '@cloudflare/kv-asset-handler@0.4.0': resolution: {integrity: sha512-+tv3z+SPp+gqTIcImN9o0hqE9xyfQjI1XD9pL6NuKjua9B1y7mNYv0S9cP+QEbA4ppVgGZEmKOvHX5G5Ei1CVA==} @@ -1693,20 +1693,36 @@ packages: resolution: {integrity: sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} - '@eslint/config-array@0.17.0': - resolution: {integrity: sha512-A68TBu6/1mHHuc5YJL0U0VVeGNiklLAL6rRmhTCP2B5XjWLMnrX+HkO+IAXyHvks5cyyY1jjK5ITPQ1HGS2EVA==} + '@eslint/config-array@0.20.1': + resolution: {integrity: sha512-OL0RJzC/CBzli0DrrR31qzj6d6i6Mm3HByuhflhl4LOBiWxN+3i6/t/ZQQNii4tjksXi8r2CRW1wMpWA2ULUEw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/config-helpers@0.2.3': + resolution: {integrity: sha512-u180qk2Um1le4yf0ruXH3PYFeEZeYC3p/4wCTKrr2U1CmGdzGi3KtY0nuPDH48UJxlKCC5RDzbcbh4X0XlqgHg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.14.0': + resolution: {integrity: sha512-qIbV0/JZr7iSDjqAc60IqbLdsj9GDt16xQtWD+B78d/HAlvysGdZZ6rpJHGAc2T0FQx1X6thsSPdnoiGKdNtdg==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/core@0.15.0': + resolution: {integrity: sha512-b7ePw78tEWWkpgZCDYkbqDOP8dmM6qe+AOC6iuJqlq1R/0ahMAeH3qynpnqKFGkMltrp44ohV4ubGyvLX28tzw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/eslintrc@3.1.0': - resolution: {integrity: sha512-4Bfj15dVJdoy3RfZmmo86RK1Fwzn6SstsvK9JS+BaVKqC6QQQQyXekNaC+g+LKNgkQ+2VhGAzm6hO40AhMR3zQ==} + '@eslint/eslintrc@3.3.1': + resolution: {integrity: sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/js@9.6.0': - resolution: {integrity: sha512-D9B0/3vNg44ZeWbYMpBoXqNP4j6eQD5vNwIlGAuFRRzK/WtT/jvDQW3Bi9kkf3PMDMlM7Yi+73VLUsn5bJcl8A==} + '@eslint/js@9.29.0': + resolution: {integrity: sha512-3PIF4cBw/y+1u2EazflInpV+lYsSG0aByVIQzAgb1m1MhHFSbqTyNqtBKHgWf/9Ykud+DhILS9EGkmekVhbKoQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@eslint/object-schema@2.1.4': - resolution: {integrity: sha512-BsWiH1yFGjXXS2yvrf5LyuoSIIbPrGUWob917o+BTKuZ7qJdxX8aJLRxs1fS9n6r7vESrq1OUqb68dANcFXuQQ==} + '@eslint/object-schema@2.1.6': + resolution: {integrity: sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + '@eslint/plugin-kit@0.3.2': + resolution: {integrity: sha512-4SaFZCNfJqvk/kenHpI8xvN42DMaoycy4PzKc5otHxRswww1kAt82OlBuwRVLofCACCTZEcla2Ydxv8scMXaTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} '@fastify/busboy@2.1.1': @@ -1719,6 +1735,14 @@ packages: '@fontsource/libre-barcode-128-text@5.1.0': resolution: {integrity: sha512-MC7foQFRT0NDcsqBWQua2T3gs/fh/uTowTxfoPqGQWjqroiMxRZhQh7jerjnpcI+Xi3yR5bwCo6W2uwCza1FRw==} + '@humanfs/core@0.19.1': + resolution: {integrity: sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==} + engines: {node: '>=18.18.0'} + + '@humanfs/node@0.16.6': + resolution: {integrity: sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==} + engines: {node: '>=18.18.0'} + '@humanwhocodes/module-importer@1.0.1': resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} engines: {node: '>=12.22'} @@ -1727,6 +1751,10 @@ packages: resolution: {integrity: sha512-d2CGZR2o7fS6sWB7DG/3a95bGKQyHMACZ5aW8qGkkqQpUoZV6C0X7Pc7l4ZNMZkfNBf4VWNe9E1jRsf0G146Ew==} engines: {node: '>=18.18'} + '@humanwhocodes/retry@0.4.3': + resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==} + engines: {node: '>=18.18'} + '@iarna/toml@2.2.5': resolution: {integrity: sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==} @@ -2191,16 +2219,16 @@ packages: peerDependencies: acorn: ^8.9.0 - '@sveltejs/eslint-config@8.1.0': - resolution: {integrity: sha512-cfgp4lPREYBjNd4ZzaP/jA85ufm7vfXiaV7h9vILXNogne80IbZRNhRCQ8XoOqTAOY/pChIzWTBuR8aDNMbAEA==} + '@sveltejs/eslint-config@8.2.0': + resolution: {integrity: sha512-5ab8AXjLoY+H0dsYTGB+9L8AnOvOzd9NZkECj40VAk6Uh9u7+5d8jVk+YYW6NGsEQ+HwHBUi19yij+q+5Pm+aQ==} peerDependencies: '@stylistic/eslint-plugin-js': '>= 1' eslint: '>= 9' eslint-config-prettier: '>= 9' eslint-plugin-n: '>= 17' - eslint-plugin-svelte: '>= 2.36' + eslint-plugin-svelte: '>= 3' typescript: '>= 5' - typescript-eslint: '>= 7.5' + typescript-eslint: '>= 8' '@sveltejs/vite-plugin-svelte-inspector@5.0.0-next.0': resolution: {integrity: sha512-G++kR34xZSd3cT6VVOB781Pa2KOS756/ZKK7urSyXmrhK/D/mPiUvjZwWKNVTDOXkwrvVt/Y3cLecbR6Qm66Kw==} @@ -2217,8 +2245,8 @@ packages: svelte: ^5.0.0 vite: ^6.3.0 || ^7.0.0-beta.0 - '@svitejs/changesets-changelog-github-compact@1.1.0': - resolution: {integrity: sha512-qhUGGDHcpbY2zpjW3SwqchuW8J/5EzlPFud7xNntHKA7f3a/mx5+g+ruJKFHSAiVZYo30PALt+AyhmPUNKH/Og==} + '@svitejs/changesets-changelog-github-compact@1.2.0': + resolution: {integrity: sha512-08eKiDAjj4zLug1taXSIJ0kGL5cawjVCyJkBb6EWSg5fEPX6L+Wtr0CH2If4j5KYylz85iaZiFlUItvgJvll5g==} engines: {node: ^14.13.1 || ^16.0.0 || >=18} '@types/chai@5.2.2': @@ -2266,49 +2294,51 @@ packages: '@types/yauzl@2.10.3': resolution: {integrity: sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==} - '@typescript-eslint/eslint-plugin@8.26.0': - resolution: {integrity: sha512-cLr1J6pe56zjKYajK6SSSre6nl1Gj6xDp1TY0trpgPzjVbgDwd09v2Ws37LABxzkicmUjhEeg/fAUjPJJB1v5Q==} + '@typescript-eslint/eslint-plugin@8.35.0': + resolution: {integrity: sha512-ijItUYaiWuce0N1SoSMrEd0b6b6lYkYt99pqCPfybd+HKVXtEvYhICfLdwp42MhiI5mp0oq7PKEL+g1cNiz/Eg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - '@typescript-eslint/parser': ^8.0.0 || ^8.0.0-alpha.0 + '@typescript-eslint/parser': ^8.35.0 eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/parser@8.26.0': - resolution: {integrity: sha512-mNtXP9LTVBy14ZF3o7JG69gRPBK/2QWtQd0j0oH26HcY/foyJJau6pNUez7QrM5UHnSvwlQcJXKsk0I99B9pOA==} + '@typescript-eslint/parser@8.35.0': + resolution: {integrity: sha512-6sMvZePQrnZH2/cJkwRpkT7DxoAWh+g6+GFRK6bV3YQo7ogi3SX5rgF6099r5Q53Ma5qeT7LGmOmuIutF4t3lA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.26.0': - resolution: {integrity: sha512-E0ntLvsfPqnPwng8b8y4OGuzh/iIOm2z8U3S9zic2TeMLW61u5IH2Q1wu0oSTkfrSzwbDJIB/Lm8O3//8BWMPA==} + '@typescript-eslint/project-service@8.35.0': + resolution: {integrity: sha512-41xatqRwWZuhUMF/aZm2fcUsOFKNcG28xqRSS6ZVr9BVJtGExosLAm5A1OxTjRMagx8nJqva+P5zNIGt8RIgbQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/scope-manager@8.31.1': - resolution: {integrity: sha512-BMNLOElPxrtNQMIsFHE+3P0Yf1z0dJqV9zLdDxN/xLlWMlXK/ApEsVEKzpizg9oal8bAT5Sc7+ocal7AC1HCVw==} + '@typescript-eslint/scope-manager@8.35.0': + resolution: {integrity: sha512-+AgL5+mcoLxl1vGjwNfiWq5fLDZM1TmTPYs2UkyHfFhgERxBbqHlNjRzhThJqz+ktBqTChRYY6zwbMwy0591AA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/type-utils@8.26.0': - resolution: {integrity: sha512-ruk0RNChLKz3zKGn2LwXuVoeBcUMh+jaqzN461uMMdxy5H9epZqIBtYj7UiPXRuOpaALXGbmRuZQhmwHhaS04Q==} + '@typescript-eslint/tsconfig-utils@8.35.0': + resolution: {integrity: sha512-04k/7247kZzFraweuEirmvUj+W3bJLI9fX6fbo1Qm2YykuBvEhRTPl8tcxlYO8kZZW+HIXfkZNoasVb8EV4jpA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/types@8.26.0': - resolution: {integrity: sha512-89B1eP3tnpr9A8L6PZlSjBvnJhWXtYfZhECqlBl1D9Lme9mHO6iWlsprBtVenQvY1HMhax1mWOjhtL3fh/u+pA==} + '@typescript-eslint/type-utils@8.35.0': + resolution: {integrity: sha512-ceNNttjfmSEoM9PW87bWLDEIaLAyR+E6BoYJQ5PfaDau37UGca9Nyq3lBk8Bw2ad0AKvYabz6wxc7DMTO2jnNA==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + peerDependencies: + eslint: ^8.57.0 || ^9.0.0 + typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/types@8.31.1': resolution: {integrity: sha512-SfepaEFUDQYRoA70DD9GtytljBePSj17qPxFHA/h3eg6lPTqGJ5mWOtbXCk1YrVU1cTJRd14nhaXWFu0l2troQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/typescript-estree@8.26.0': - resolution: {integrity: sha512-tiJ1Hvy/V/oMVRTbEOIeemA2XoylimlDQ03CgPPNaHYZbpsc78Hmngnt+WXZfJX1pjQ711V7g0H7cSJThGYfPQ==} + '@typescript-eslint/types@8.35.0': + resolution: {integrity: sha512-0mYH3emanku0vHw2aRLNGqe7EXh9WHEhi7kZzscrMDf6IIRUQ5Jk4wp1QrledE/36KtdZrVfKnE32eZCf/vaVQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - peerDependencies: - typescript: '>=4.8.4 <5.9.0' '@typescript-eslint/typescript-estree@8.31.1': resolution: {integrity: sha512-kaA0ueLe2v7KunYOyWYtlf/QhhZb7+qh4Yw6Ni5kgukMIG+iP773tjgBiLWIXYumWCwEq3nLW+TUywEp8uEeag==} @@ -2316,28 +2346,27 @@ packages: peerDependencies: typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.26.0': - resolution: {integrity: sha512-2L2tU3FVwhvU14LndnQCA2frYC8JnPDVKyQtWFPf8IYFMt/ykEN1bPolNhNbCVgOmdzTlWdusCTKA/9nKrf8Ig==} + '@typescript-eslint/typescript-estree@8.35.0': + resolution: {integrity: sha512-F+BhnaBemgu1Qf8oHrxyw14wq6vbL8xwWKKMwTMwYIRmFFY/1n/9T/jpbobZL8vp7QyEUcC6xGrnAO4ua8Kp7w==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/utils@8.31.1': - resolution: {integrity: sha512-2DSI4SNfF5T4oRveQ4nUrSjUqjMND0nLq9rEkz0gfGr3tg0S5KB6DhwR+WZPCjzkZl3cH+4x2ce3EsL50FubjQ==} + '@typescript-eslint/utils@8.35.0': + resolution: {integrity: sha512-nqoMu7WWM7ki5tPgLVsmPM8CkqtoPUG6xXGeefM5t4x3XumOEKMoUZPdi+7F+/EotukN4R9OWdmDxN80fqoZeg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 typescript: '>=4.8.4 <5.9.0' - '@typescript-eslint/visitor-keys@8.26.0': - resolution: {integrity: sha512-2z8JQJWAzPdDd51dRQ/oqIJxe99/hoLIqmf8RMCAJQtYDc535W/Jt2+RTP4bP0aKeBG1F65yjIZuczOXCmbWwg==} - engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - '@typescript-eslint/visitor-keys@8.31.1': resolution: {integrity: sha512-I+/rgqOVBn6f0o7NDTmAPWWC6NuqhV174lfYvAm9fUaWeiefLdux9/YI3/nLugEn9L8fcSi0XmpKi/r5u0nmpw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@typescript-eslint/visitor-keys@8.35.0': + resolution: {integrity: sha512-zTh2+1Y8ZpmeQaQVIc/ZZxsx8UzgKJyNg1PTvjzC7WMhPSVS8bfDX34k1SrwOf016qd5RU3az2UxUNue3IfQ5g==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + '@vercel/nft@0.29.4': resolution: {integrity: sha512-6lLqMNX3TuycBPABycx7A9F1bHQR7kiQln6abjFbPrf5C/05qHM9M5E4PeTE59c7z8g6vHnx1Ioihb2AQl7BTA==} engines: {node: '>=18'} @@ -2439,6 +2468,11 @@ packages: engines: {node: '>=0.4.0'} hasBin: true + acorn@8.15.0: + resolution: {integrity: sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==} + engines: {node: '>=0.4.0'} + hasBin: true + agent-base@7.1.3: resolution: {integrity: sha512-jRR5wdylq8CkOe6hei19GGZnxM6rBGwFl3Bg0YItGDimvjGtAvdZk4Pu6Cl4u4Igsws4a1fd1Vq3ezrhn4KmFw==} engines: {node: '>= 14'} @@ -2907,22 +2941,18 @@ packages: peerDependencies: eslint: '>=8.23.0' - eslint-plugin-svelte@2.41.0: - resolution: {integrity: sha512-gjU9Q/psxbWG1VNwYbEb0Q6U4W5PBGaDpYmO2zlQ+zlAMVS3Qt0luAK0ACi/tMSwRK6JENiySvMyJbO0YWmXSg==} - engines: {node: ^14.17.0 || >=16.0.0} + eslint-plugin-svelte@3.9.3: + resolution: {integrity: sha512-PlcyK80sqAZ43IITeZkgl3zPFWJytx/Joup9iKGqIOsXM2m3pWfPbWuXPr5PN3loXFEypqTY/JyZwNqlSpSvRw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - eslint: ^7.0.0 || ^8.0.0-0 || ^9.0.0-0 - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.155 + eslint: ^8.57.1 || ^9.0.0 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: 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==} + eslint-scope@8.4.0: + resolution: {integrity: sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} eslint-visitor-keys@3.4.3: @@ -2933,22 +2963,27 @@ packages: resolution: {integrity: sha512-UyLnSehNt62FFhSwjZlHmeokpRK59rcz29j+F1/aDgbkbRTk7wIc9XzdoasMUbRNKDM0qQt/+BJ4BrpFeABemw==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - eslint@9.6.0: - resolution: {integrity: sha512-ElQkdLMEEqQNM9Njff+2Y4q2afHk7JpkPvrd7Xh7xefwgQynqPxwf55J7di9+MEibWUGdNjFF9ITG9Pck5M84w==} + eslint-visitor-keys@4.2.1: + resolution: {integrity: sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} + + eslint@9.29.0: + resolution: {integrity: sha512-GsGizj2Y1rCWDu6XoEekL3RLilp0voSePurjZIkxL3wlm5o5EC9VpgaP7lrCvjnkuLvzFBQWB3vWB3K5KQTveQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} hasBin: true + peerDependencies: + jiti: '*' + peerDependenciesMeta: + jiti: + optional: true esm-env@1.2.2: resolution: {integrity: sha512-Epxrv+Nr/CaL4ZcFGPJIYLWFom+YeV1DqMLHJoEd9SYRxNbaFruBwfEX/kkHUJf55j2+TUbmDcmuilbP1TmXHA==} - espree@10.3.0: - resolution: {integrity: sha512-0QYC8b24HWY8zjRnDTL6RiHfDbAWn63qb4LMj1Z4b076A4une81+z03Kg7l7mn/48PUTqoLptSXez8oknU8Clg==} + espree@10.4.0: + resolution: {integrity: sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} - espree@9.6.1: - resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} - esprima@4.0.1: resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} engines: {node: '>=4'} @@ -3162,6 +3197,10 @@ packages: resolution: {integrity: sha512-7ACyT3wmyp3I61S4fG682L0VA2RGD9otkqGJIwNUMF1SWUombIIk+af1unuDYgMm082aHYwD+mzJvv9Iu8dsgg==} engines: {node: '>=18'} + globals@16.2.0: + resolution: {integrity: sha512-O+7l9tPdHCU320IigZZPj5zmRCFG9xHmx9cU8FqU2Rp+JN714seHV+2S9+JslCpY4gJwU2vOGox0wzgae/MCEg==} + engines: {node: '>=18'} + globby@11.1.0: resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} engines: {node: '>=10'} @@ -3193,8 +3232,9 @@ packages: resolution: {integrity: sha512-vK9P5/iUfdl95AI+JVyUuIcVtd4ofvtrOr3HNtM2yxC9bnMbEdp3x01OhQNnjb8IJYi38VlTE3mBXwcfvywuSw==} engines: {node: '>= 14'} - human-id@1.0.2: - resolution: {integrity: sha512-UNopramDEhHJD+VR+ehk8rOslwSfByxPIZyJRfV739NDhN5LF1fa1MqnzKm2lGTQRjNrjK19Q5fhkgIfjlVUKw==} + human-id@4.1.1: + resolution: {integrity: sha512-3gKm/gCSUipeLsRYZbbdA1BD83lBoWUkZ7G9VFrhWPAU76KwYo5KR8V28bpoPm/ygy0x5/GCbpRQdY7VLYCoIg==} + hasBin: true human-signals@5.0.0: resolution: {integrity: sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==} @@ -3211,6 +3251,10 @@ packages: resolution: {integrity: sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==} engines: {node: '>= 4'} + ignore@7.0.5: + resolution: {integrity: sha512-Hs59xBNfUIunMFgWAbGX5cq6893IbWg4KnrjbYwX3tx0ztorVgTDA6B2sxf8ejHJ4wz8BqGUMYlnzNBer5NvGg==} + engines: {node: '>= 4'} + image-size@2.0.2: resolution: {integrity: sha512-IRqXKlaXwgSMAMtpNzZa1ZAe8m+Sa1770Dhk8VkSsP9LS+iHD62Zd8FQKs8fbPiagBE7BzoFX23cxFnwshpV6w==} engines: {node: '>=16.x'} @@ -3264,10 +3308,6 @@ packages: resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} engines: {node: '>=0.12.0'} - is-path-inside@3.0.3: - resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} - engines: {node: '>=8'} - is-path-inside@4.0.0: resolution: {integrity: sha512-lJJV/5dYS+RcL8uQdBDW9c9uWFLLBNRyFhnAKXw5tVqLlKZ4RMGZKv+YQ/IA3OhD+RpbJa1LLFM1FQPGyIXvOA==} engines: {node: '>=12'} @@ -3365,8 +3405,8 @@ packages: resolution: {integrity: sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==} engines: {node: '>=6'} - known-css-properties@0.34.0: - resolution: {integrity: sha512-tBECoUqNFbyAY4RrbqsBQqDFpGXAEbdD5QKr8kACx3+rnArmuuR22nKQWKazvp07N9yjTyDZaw/20UIH8tL9DQ==} + known-css-properties@0.37.0: + resolution: {integrity: sha512-JCDrsP4Z1Sb9JwG0aJ8Eo2r7k4Ou5MwmThS/6lcIe1ICyb7UBJKGRIUUdqc2ASdE/42lgz6zFUnzAIhtXnBVrQ==} kuler@2.0.0: resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} @@ -3806,11 +3846,11 @@ packages: ts-node: optional: true - postcss-safe-parser@6.0.0: - resolution: {integrity: sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==} - engines: {node: '>=12.0'} + postcss-safe-parser@7.0.1: + resolution: {integrity: sha512-0AioNCJZ2DPYz5ABT6bddIqlhgwhpHZ/l65YAYo0BCIn0xiDpsnTHz0gnoTGk0OXZW0JRs+cDwL8u/teRdz+8A==} + engines: {node: '>=18.0'} peerDependencies: - postcss: ^8.3.3 + postcss: ^8.4.31 postcss-scss@4.0.9: resolution: {integrity: sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==} @@ -3818,8 +3858,8 @@ packages: peerDependencies: postcss: ^8.4.29 - postcss-selector-parser@6.1.2: - resolution: {integrity: sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==} + postcss-selector-parser@7.1.0: + resolution: {integrity: sha512-8sLjZwK0R+JlxlYcTuVnyT2v+htpdrjDOKuMcOVdYjt52Lh8hWRYpxBPoKx/Zg+bcjc3wx6fmQevMmUztS/ccA==} engines: {node: '>=4'} postcss-values-parser@6.0.2: @@ -3847,6 +3887,12 @@ packages: prettier: ^3.0.0 svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier-plugin-svelte@3.4.0: + resolution: {integrity: sha512-pn1ra/0mPObzqoIQn/vUTR3ZZI6UuZ0sHqMK5x2jMLGrs53h0sXhkVuDcrlssHwIMk7FYrMjHBPoUSyyEEDlBQ==} + peerDependencies: + prettier: ^3.0.0 + svelte: ^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0 + prettier@2.8.8: resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} engines: {node: '>=10.13.0'} @@ -3857,6 +3903,11 @@ packages: engines: {node: '>=14'} hasBin: true + prettier@3.6.0: + resolution: {integrity: sha512-ujSB9uXHJKzM/2GBuE0hBOUgC77CN3Bnpqa+g80bkv3T3A93wL/xlzDATHhnhkzifz/UE2SNOvmbTz5hSkDlHw==} + engines: {node: '>=14'} + hasBin: true + printable-characters@1.0.42: resolution: {integrity: sha512-dKp+C4iXWK4vVYZmYSd0KBH5F/h1HoZRsbJ82AVKRO3PEo8L4lBS/vLwhVtpwwuYcoIsVY+1JYKR268yn480uQ==} @@ -4147,11 +4198,11 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 typescript: '>=5.0.0' - svelte-eslint-parser@0.39.2: - resolution: {integrity: sha512-87UwLuWTtDIuzWOhOi1zBL5wYVd07M5BK1qZ57YmXJB5/UmjUNJqGy3XSOhPqjckY1dATNV9y+mx+nI0WH6HPA==} - engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + svelte-eslint-parser@1.2.0: + resolution: {integrity: sha512-mbPtajIeuiyU80BEyGvwAktBeTX7KCr5/0l+uRGLq1dafwRNrjfM5kHGJScEBlPG3ipu6dJqfW/k0/fujvIEVw==} + engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: - svelte: ^3.37.0 || ^4.0.0 || ^5.0.0-next.115 + svelte: ^3.37.0 || ^4.0.0 || ^5.0.0 peerDependenciesMeta: svelte: optional: true @@ -4229,9 +4280,6 @@ packages: text-hex@1.0.0: resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} - text-table@0.2.0: - resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} - tinybench@2.9.0: resolution: {integrity: sha512-0+DUvqWMValLmha6lr4kD8iAMK1HzV0/aKnCtWb9v9641TnP/MFb7Pc2bxoxQjTXAErryXVgUOfv2YqNllqGeg==} @@ -4319,8 +4367,8 @@ packages: resolution: {integrity: sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==} engines: {node: '>=16'} - typescript-eslint@8.26.0: - resolution: {integrity: sha512-PtVz9nAnuNJuAVeUFvwztjuUgSnJInODAUx47VDwWPXzd5vismPOtPtt83tzNXyOjVQbPRp786D6WFW/M2koIA==} + typescript-eslint@8.35.0: + resolution: {integrity: sha512-uEnz70b7kBz6eg/j0Czy6K5NivaYopgxRjsnAJ2Fx5oTLo3wefTHIbL7AkQr1+7tJCRVpTs/wiM8JR/11Loq9A==} engines: {node: ^18.18.0 || ^20.9.0 || >=21.1.0} peerDependencies: eslint: ^8.57.0 || ^9.0.0 @@ -4619,13 +4667,13 @@ snapshots: '@babel/helper-string-parser': 7.27.1 '@babel/helper-validator-identifier': 7.27.1 - '@changesets/apply-release-plan@7.0.7': + '@changesets/apply-release-plan@7.0.12': dependencies: - '@changesets/config': 3.0.5 + '@changesets/config': 3.1.1 '@changesets/get-version-range-type': 0.4.0 - '@changesets/git': 3.0.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/git': 3.0.4 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 detect-indent: 6.1.0 fs-extra: 7.0.1 @@ -4635,35 +4683,35 @@ snapshots: resolve-from: 5.0.0 semver: 7.7.1 - '@changesets/assemble-release-plan@6.0.5': + '@changesets/assemble-release-plan@6.0.9': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 semver: 7.7.1 - '@changesets/changelog-git@0.2.0': + '@changesets/changelog-git@0.2.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 - '@changesets/cli@2.27.11': + '@changesets/cli@2.29.5': dependencies: - '@changesets/apply-release-plan': 7.0.7 - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/changelog-git': 0.2.0 - '@changesets/config': 3.0.5 + '@changesets/apply-release-plan': 7.0.12 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/changelog-git': 0.2.1 + '@changesets/config': 3.1.1 '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 - '@changesets/get-release-plan': 4.0.6 - '@changesets/git': 3.0.2 + '@changesets/get-dependents-graph': 2.1.3 + '@changesets/get-release-plan': 4.0.13 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/should-skip-package': 0.1.1 - '@changesets/types': 6.0.0 - '@changesets/write': 0.3.2 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/should-skip-package': 0.1.2 + '@changesets/types': 6.1.0 + '@changesets/write': 0.4.0 '@manypkg/get-packages': 1.1.3 ansi-colors: 4.1.3 ci-info: 3.9.0 @@ -4679,12 +4727,12 @@ snapshots: spawndamnit: 3.0.1 term-size: 2.2.1 - '@changesets/config@3.0.5': + '@changesets/config@3.1.1': dependencies: '@changesets/errors': 0.2.0 - '@changesets/get-dependents-graph': 2.1.2 + '@changesets/get-dependents-graph': 2.1.3 '@changesets/logger': 0.1.1 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 micromatch: 4.0.8 @@ -4693,32 +4741,32 @@ snapshots: dependencies: extendable-error: 0.1.7 - '@changesets/get-dependents-graph@2.1.2': + '@changesets/get-dependents-graph@2.1.3': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 picocolors: 1.1.1 semver: 7.7.1 - '@changesets/get-github-info@0.5.2': + '@changesets/get-github-info@0.6.0': dependencies: dataloader: 1.4.0 node-fetch: 2.7.0 transitivePeerDependencies: - encoding - '@changesets/get-release-plan@4.0.6': + '@changesets/get-release-plan@4.0.13': dependencies: - '@changesets/assemble-release-plan': 6.0.5 - '@changesets/config': 3.0.5 - '@changesets/pre': 2.0.1 - '@changesets/read': 0.6.2 - '@changesets/types': 6.0.0 + '@changesets/assemble-release-plan': 6.0.9 + '@changesets/config': 3.1.1 + '@changesets/pre': 2.0.2 + '@changesets/read': 0.6.5 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/get-version-range-type@0.4.0': {} - '@changesets/git@3.0.2': + '@changesets/git@3.0.4': dependencies: '@changesets/errors': 0.2.0 '@manypkg/get-packages': 1.1.3 @@ -4730,42 +4778,42 @@ snapshots: dependencies: picocolors: 1.1.1 - '@changesets/parse@0.4.0': + '@changesets/parse@0.4.1': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 js-yaml: 3.14.1 - '@changesets/pre@2.0.1': + '@changesets/pre@2.0.2': dependencies: '@changesets/errors': 0.2.0 - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 fs-extra: 7.0.1 - '@changesets/read@0.6.2': + '@changesets/read@0.6.5': dependencies: - '@changesets/git': 3.0.2 + '@changesets/git': 3.0.4 '@changesets/logger': 0.1.1 - '@changesets/parse': 0.4.0 - '@changesets/types': 6.0.0 + '@changesets/parse': 0.4.1 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 p-filter: 2.1.0 picocolors: 1.1.1 - '@changesets/should-skip-package@0.1.1': + '@changesets/should-skip-package@0.1.2': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 '@manypkg/get-packages': 1.1.3 '@changesets/types@4.1.0': {} - '@changesets/types@6.0.0': {} + '@changesets/types@6.1.0': {} - '@changesets/write@0.3.2': + '@changesets/write@0.4.0': dependencies: - '@changesets/types': 6.0.0 + '@changesets/types': 6.1.0 fs-extra: 7.0.1 - human-id: 1.0.2 + human-id: 4.1.1 prettier: 2.8.8 '@cloudflare/kv-asset-handler@0.4.0': @@ -4972,26 +5020,36 @@ snapshots: '@esbuild/win32-x64@0.25.5': optional: true - '@eslint-community/eslint-utils@4.7.0(eslint@9.6.0)': + '@eslint-community/eslint-utils@4.7.0(eslint@9.29.0)': dependencies: - eslint: 9.6.0 + eslint: 9.29.0 eslint-visitor-keys: 3.4.3 '@eslint-community/regexpp@4.12.1': {} - '@eslint/config-array@0.17.0': + '@eslint/config-array@0.20.1': dependencies: - '@eslint/object-schema': 2.1.4 + '@eslint/object-schema': 2.1.6 debug: 4.4.1 minimatch: 3.1.2 transitivePeerDependencies: - supports-color - '@eslint/eslintrc@3.1.0': + '@eslint/config-helpers@0.2.3': {} + + '@eslint/core@0.14.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/core@0.15.0': + dependencies: + '@types/json-schema': 7.0.15 + + '@eslint/eslintrc@3.3.1': dependencies: ajv: 6.12.6 debug: 4.4.1 - espree: 10.3.0 + espree: 10.4.0 globals: 14.0.0 ignore: 5.3.2 import-fresh: 3.3.0 @@ -5001,9 +5059,14 @@ snapshots: transitivePeerDependencies: - supports-color - '@eslint/js@9.6.0': {} + '@eslint/js@9.29.0': {} - '@eslint/object-schema@2.1.4': {} + '@eslint/object-schema@2.1.6': {} + + '@eslint/plugin-kit@0.3.2': + dependencies: + '@eslint/core': 0.15.0 + levn: 0.4.1 '@fastify/busboy@2.1.1': {} @@ -5011,10 +5074,19 @@ snapshots: '@fontsource/libre-barcode-128-text@5.1.0': {} + '@humanfs/core@0.19.1': {} + + '@humanfs/node@0.16.6': + dependencies: + '@humanfs/core': 0.19.1 + '@humanwhocodes/retry': 0.3.0 + '@humanwhocodes/module-importer@1.0.1': {} '@humanwhocodes/retry@0.3.0': {} + '@humanwhocodes/retry@0.4.3': {} + '@iarna/toml@2.2.5': {} '@img/sharp-darwin-arm64@0.33.5': @@ -5444,28 +5516,28 @@ snapshots: '@rollup/rollup-win32-x64-msvc@4.40.1': optional: true - '@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0)': + '@stylistic/eslint-plugin-js@2.1.0(eslint@9.29.0)': dependencies: '@types/eslint': 8.56.12 - acorn: 8.14.1 - eslint: 9.6.0 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + acorn: 8.15.0 + eslint: 9.29.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 '@sveltejs/acorn-typescript@1.0.5(acorn@8.14.1)': dependencies: acorn: 8.14.1 - '@sveltejs/eslint-config@8.1.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.6.0))(eslint-config-prettier@9.1.0(eslint@9.6.0))(eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.8.3))(eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1))(eslint@9.6.0)(typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.8.3))(typescript@5.8.3)': + '@sveltejs/eslint-config@8.2.0(@stylistic/eslint-plugin-js@2.1.0(eslint@9.29.0))(eslint-config-prettier@9.1.0(eslint@9.29.0))(eslint-plugin-n@17.16.1(eslint@9.29.0)(typescript@5.8.3))(eslint-plugin-svelte@3.9.3(eslint@9.29.0)(svelte@5.23.1))(eslint@9.29.0)(typescript-eslint@8.35.0(eslint@9.29.0)(typescript@5.8.3))(typescript@5.8.3)': dependencies: - '@stylistic/eslint-plugin-js': 2.1.0(eslint@9.6.0) - eslint: 9.6.0 - eslint-config-prettier: 9.1.0(eslint@9.6.0) - eslint-plugin-n: 17.16.1(eslint@9.6.0)(typescript@5.8.3) - eslint-plugin-svelte: 2.41.0(eslint@9.6.0)(svelte@5.23.1) + '@stylistic/eslint-plugin-js': 2.1.0(eslint@9.29.0) + eslint: 9.29.0 + eslint-config-prettier: 9.1.0(eslint@9.29.0) + eslint-plugin-n: 17.16.1(eslint@9.29.0)(typescript@5.8.3) + eslint-plugin-svelte: 3.9.3(eslint@9.29.0)(svelte@5.23.1) globals: 15.15.0 typescript: 5.8.3 - typescript-eslint: 8.26.0(eslint@9.6.0)(typescript@5.8.3) + typescript-eslint: 8.35.0(eslint@9.29.0)(typescript@5.8.3) '@sveltejs/vite-plugin-svelte-inspector@5.0.0-next.0(@sveltejs/vite-plugin-svelte@6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)))(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1))': dependencies: @@ -5489,9 +5561,9 @@ snapshots: transitivePeerDependencies: - supports-color - '@svitejs/changesets-changelog-github-compact@1.1.0': + '@svitejs/changesets-changelog-github-compact@1.2.0': dependencies: - '@changesets/get-github-info': 0.5.2 + '@changesets/get-github-info': 0.6.0 dotenv: 16.4.5 transitivePeerDependencies: - encoding @@ -5540,64 +5612,72 @@ snapshots: '@types/node': 18.19.50 optional: true - '@typescript-eslint/eslint-plugin@8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.6.0)(typescript@5.8.3))(eslint@9.6.0)(typescript@5.8.3)': + '@typescript-eslint/eslint-plugin@8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3)': dependencies: '@eslint-community/regexpp': 4.12.1 - '@typescript-eslint/parser': 8.26.0(eslint@9.6.0)(typescript@5.8.3) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/type-utils': 8.26.0(eslint@9.6.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.26.0 - eslint: 9.6.0 + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/type-utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.0 + eslint: 9.29.0 graphemer: 1.4.0 - ignore: 5.3.2 + ignore: 7.0.5 natural-compare: 1.4.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/parser@8.26.0(eslint@9.6.0)(typescript@5.8.3)': + '@typescript-eslint/parser@8.35.0(eslint@9.29.0)(typescript@5.8.3)': dependencies: - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.3) - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + '@typescript-eslint/visitor-keys': 8.35.0 debug: 4.4.1 - eslint: 9.6.0 + eslint: 9.29.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/scope-manager@8.26.0': + '@typescript-eslint/project-service@8.35.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) + '@typescript-eslint/types': 8.35.0 + debug: 4.4.1 + typescript: 5.8.3 + transitivePeerDependencies: + - supports-color - '@typescript-eslint/scope-manager@8.31.1': + '@typescript-eslint/scope-manager@8.35.0': dependencies: - '@typescript-eslint/types': 8.31.1 - '@typescript-eslint/visitor-keys': 8.31.1 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/visitor-keys': 8.35.0 - '@typescript-eslint/type-utils@8.26.0(eslint@9.6.0)(typescript@5.8.3)': + '@typescript-eslint/tsconfig-utils@8.35.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.3) - '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.8.3) + typescript: 5.8.3 + + '@typescript-eslint/type-utils@8.35.0(eslint@9.29.0)(typescript@5.8.3)': + dependencies: + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) debug: 4.4.1 - eslint: 9.6.0 + eslint: 9.29.0 ts-api-utils: 2.1.0(typescript@5.8.3) typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/types@8.26.0': {} - '@typescript-eslint/types@8.31.1': {} - '@typescript-eslint/typescript-estree@8.26.0(typescript@5.8.3)': + '@typescript-eslint/types@8.35.0': {} + + '@typescript-eslint/typescript-estree@8.31.1(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/visitor-keys': 8.26.0 + '@typescript-eslint/types': 8.31.1 + '@typescript-eslint/visitor-keys': 8.31.1 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -5608,10 +5688,12 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/typescript-estree@8.31.1(typescript@5.8.3)': + '@typescript-eslint/typescript-estree@8.35.0(typescript@5.8.3)': dependencies: - '@typescript-eslint/types': 8.31.1 - '@typescript-eslint/visitor-keys': 8.31.1 + '@typescript-eslint/project-service': 8.35.0(typescript@5.8.3) + '@typescript-eslint/tsconfig-utils': 8.35.0(typescript@5.8.3) + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/visitor-keys': 8.35.0 debug: 4.4.1 fast-glob: 3.3.3 is-glob: 4.0.3 @@ -5622,37 +5704,26 @@ snapshots: transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.26.0(eslint@9.6.0)(typescript@5.8.3)': + '@typescript-eslint/utils@8.35.0(eslint@9.29.0)(typescript@5.8.3)': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.26.0 - '@typescript-eslint/types': 8.26.0 - '@typescript-eslint/typescript-estree': 8.26.0(typescript@5.8.3) - eslint: 9.6.0 + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) + '@typescript-eslint/scope-manager': 8.35.0 + '@typescript-eslint/types': 8.35.0 + '@typescript-eslint/typescript-estree': 8.35.0(typescript@5.8.3) + eslint: 9.29.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color - '@typescript-eslint/utils@8.31.1(eslint@9.6.0)(typescript@5.8.3)': + '@typescript-eslint/visitor-keys@8.31.1': dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) - '@typescript-eslint/scope-manager': 8.31.1 '@typescript-eslint/types': 8.31.1 - '@typescript-eslint/typescript-estree': 8.31.1(typescript@5.8.3) - eslint: 9.6.0 - typescript: 5.8.3 - transitivePeerDependencies: - - supports-color - - '@typescript-eslint/visitor-keys@8.26.0': - dependencies: - '@typescript-eslint/types': 8.26.0 eslint-visitor-keys: 4.2.0 - '@typescript-eslint/visitor-keys@8.31.1': + '@typescript-eslint/visitor-keys@8.35.0': dependencies: - '@typescript-eslint/types': 8.31.1 - eslint-visitor-keys: 4.2.0 + '@typescript-eslint/types': 8.35.0 + eslint-visitor-keys: 4.2.1 '@vercel/nft@0.29.4(rollup@4.40.1)': dependencies: @@ -5786,9 +5857,9 @@ snapshots: dependencies: acorn: 8.14.1 - acorn-jsx@5.3.2(acorn@8.14.1): + acorn-jsx@5.3.2(acorn@8.15.0): dependencies: - acorn: 8.14.1 + acorn: 8.15.0 acorn-walk@8.3.2: {} @@ -5796,6 +5867,8 @@ snapshots: acorn@8.14.1: {} + acorn@8.15.0: {} + agent-base@7.1.3: {} ajv@6.12.6: @@ -6245,29 +6318,29 @@ snapshots: optionalDependencies: source-map: 0.6.1 - eslint-compat-utils@0.5.1(eslint@9.6.0): + eslint-compat-utils@0.5.1(eslint@9.29.0): dependencies: - eslint: 9.6.0 + eslint: 9.29.0 semver: 7.7.1 - eslint-config-prettier@9.1.0(eslint@9.6.0): + eslint-config-prettier@9.1.0(eslint@9.29.0): dependencies: - eslint: 9.6.0 + eslint: 9.29.0 - eslint-plugin-es-x@7.8.0(eslint@9.6.0): + eslint-plugin-es-x@7.8.0(eslint@9.29.0): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) '@eslint-community/regexpp': 4.12.1 - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + eslint: 9.29.0 + eslint-compat-utils: 0.5.1(eslint@9.29.0) - eslint-plugin-n@17.16.1(eslint@9.6.0)(typescript@5.8.3): + eslint-plugin-n@17.16.1(eslint@9.29.0)(typescript@5.8.3): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) - '@typescript-eslint/utils': 8.31.1(eslint@9.6.0)(typescript@5.8.3) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) enhanced-resolve: 5.18.1 - eslint: 9.6.0 - eslint-plugin-es-x: 7.8.0(eslint@9.6.0) + eslint: 9.29.0 + eslint-plugin-es-x: 7.8.0(eslint@9.29.0) get-tsconfig: 4.10.0 globals: 15.15.0 ignore: 5.3.2 @@ -6278,31 +6351,25 @@ snapshots: - supports-color - typescript - eslint-plugin-svelte@2.41.0(eslint@9.6.0)(svelte@5.23.1): + eslint-plugin-svelte@3.9.3(eslint@9.29.0)(svelte@5.23.1): dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) '@jridgewell/sourcemap-codec': 1.5.0 - eslint: 9.6.0 - eslint-compat-utils: 0.5.1(eslint@9.6.0) + eslint: 9.29.0 esutils: 2.0.3 - known-css-properties: 0.34.0 + globals: 16.2.0 + known-css-properties: 0.37.0 postcss: 8.5.6 postcss-load-config: 3.1.4(postcss@8.5.6) - postcss-safe-parser: 6.0.0(postcss@8.5.6) - postcss-selector-parser: 6.1.2 + postcss-safe-parser: 7.0.1(postcss@8.5.6) semver: 7.7.1 - svelte-eslint-parser: 0.39.2(svelte@5.23.1) + svelte-eslint-parser: 1.2.0(svelte@5.23.1) optionalDependencies: svelte: 5.23.1 transitivePeerDependencies: - ts-node - eslint-scope@7.2.2: - dependencies: - esrecurse: 4.3.0 - estraverse: 5.3.0 - - eslint-scope@8.0.1: + eslint-scope@8.4.0: dependencies: esrecurse: 4.3.0 estraverse: 5.3.0 @@ -6311,24 +6378,31 @@ snapshots: eslint-visitor-keys@4.2.0: {} - eslint@9.6.0: + eslint-visitor-keys@4.2.1: {} + + eslint@9.29.0: dependencies: - '@eslint-community/eslint-utils': 4.7.0(eslint@9.6.0) + '@eslint-community/eslint-utils': 4.7.0(eslint@9.29.0) '@eslint-community/regexpp': 4.12.1 - '@eslint/config-array': 0.17.0 - '@eslint/eslintrc': 3.1.0 - '@eslint/js': 9.6.0 + '@eslint/config-array': 0.20.1 + '@eslint/config-helpers': 0.2.3 + '@eslint/core': 0.14.0 + '@eslint/eslintrc': 3.3.1 + '@eslint/js': 9.29.0 + '@eslint/plugin-kit': 0.3.2 + '@humanfs/node': 0.16.6 '@humanwhocodes/module-importer': 1.0.1 - '@humanwhocodes/retry': 0.3.0 - '@nodelib/fs.walk': 1.2.8 + '@humanwhocodes/retry': 0.4.3 + '@types/estree': 1.0.7 + '@types/json-schema': 7.0.15 ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 debug: 4.4.1 escape-string-regexp: 4.0.0 - eslint-scope: 8.0.1 - eslint-visitor-keys: 4.2.0 - espree: 10.3.0 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 esquery: 1.5.0 esutils: 2.0.3 fast-deep-equal: 3.1.3 @@ -6338,31 +6412,21 @@ snapshots: ignore: 5.3.2 imurmurhash: 0.1.4 is-glob: 4.0.3 - is-path-inside: 3.0.3 json-stable-stringify-without-jsonify: 1.0.1 - levn: 0.4.1 lodash.merge: 4.6.2 minimatch: 3.1.2 natural-compare: 1.4.0 optionator: 0.9.3 - strip-ansi: 6.0.1 - text-table: 0.2.0 transitivePeerDependencies: - supports-color esm-env@1.2.2: {} - espree@10.3.0: - dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 4.2.0 - - espree@9.6.1: + espree@10.4.0: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) - eslint-visitor-keys: 3.4.3 + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) + eslint-visitor-keys: 4.2.1 esprima@4.0.1: {} @@ -6569,6 +6633,8 @@ snapshots: globals@15.15.0: {} + globals@16.2.0: {} + globby@11.1.0: dependencies: array-union: 2.1.0 @@ -6603,7 +6669,7 @@ snapshots: transitivePeerDependencies: - supports-color - human-id@1.0.2: {} + human-id@4.1.1: {} human-signals@5.0.0: {} @@ -6615,6 +6681,8 @@ snapshots: ignore@5.3.2: {} + ignore@7.0.5: {} + image-size@2.0.2: {} imagetools-core@7.1.0: {} @@ -6652,8 +6720,6 @@ snapshots: is-number@7.0.0: {} - is-path-inside@3.0.3: {} - is-path-inside@4.0.0: {} is-plain-obj@2.1.0: {} @@ -6731,7 +6797,7 @@ snapshots: kleur@4.1.5: {} - known-css-properties@0.34.0: {} + known-css-properties@0.37.0: {} kuler@2.0.0: {} @@ -7096,7 +7162,7 @@ snapshots: optionalDependencies: postcss: 8.5.6 - postcss-safe-parser@6.0.0(postcss@8.5.6): + postcss-safe-parser@7.0.1(postcss@8.5.6): dependencies: postcss: 8.5.6 @@ -7104,7 +7170,7 @@ snapshots: dependencies: postcss: 8.5.6 - postcss-selector-parser@6.1.2: + postcss-selector-parser@7.1.0: dependencies: cssesc: 3.0.0 util-deprecate: 1.0.2 @@ -7149,10 +7215,17 @@ snapshots: prettier: 3.3.3 svelte: 5.23.1 + prettier-plugin-svelte@3.4.0(prettier@3.6.0)(svelte@5.23.1): + dependencies: + prettier: 3.6.0 + svelte: 5.23.1 + prettier@2.8.8: {} prettier@3.3.3: {} + prettier@3.6.0: {} + printable-characters@1.0.42: {} process-nextick-args@2.0.1: {} @@ -7511,13 +7584,14 @@ snapshots: transitivePeerDependencies: - picomatch - svelte-eslint-parser@0.39.2(svelte@5.23.1): + svelte-eslint-parser@1.2.0(svelte@5.23.1): dependencies: - eslint-scope: 7.2.2 - eslint-visitor-keys: 3.4.3 - espree: 9.6.1 + eslint-scope: 8.4.0 + eslint-visitor-keys: 4.2.1 + espree: 10.4.0 postcss: 8.5.6 postcss-scss: 4.0.9(postcss@8.5.6) + postcss-selector-parser: 7.1.0 optionalDependencies: svelte: 5.23.1 @@ -7584,8 +7658,6 @@ snapshots: text-hex@1.0.0: {} - text-table@0.2.0: {} - tinybench@2.9.0: {} tinydate@1.3.0: {} @@ -7650,12 +7722,12 @@ snapshots: type-fest@4.41.0: {} - typescript-eslint@8.26.0(eslint@9.6.0)(typescript@5.8.3): + typescript-eslint@8.35.0(eslint@9.29.0)(typescript@5.8.3): dependencies: - '@typescript-eslint/eslint-plugin': 8.26.0(@typescript-eslint/parser@8.26.0(eslint@9.6.0)(typescript@5.8.3))(eslint@9.6.0)(typescript@5.8.3) - '@typescript-eslint/parser': 8.26.0(eslint@9.6.0)(typescript@5.8.3) - '@typescript-eslint/utils': 8.26.0(eslint@9.6.0)(typescript@5.8.3) - eslint: 9.6.0 + '@typescript-eslint/eslint-plugin': 8.35.0(@typescript-eslint/parser@8.35.0(eslint@9.29.0)(typescript@5.8.3))(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/parser': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + '@typescript-eslint/utils': 8.35.0(eslint@9.29.0)(typescript@5.8.3) + eslint: 9.29.0 typescript: 5.8.3 transitivePeerDependencies: - supports-color diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 000000000000..8f262e2da415 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,7 @@ +{ + "compilerOptions": { + "checkJs": true, + "noEmit": true + }, + "include": ["eslint.config.js"] +} From fb88ff7f2eeeec850130808e79e40191f9b273cb Mon Sep 17 00:00:00 2001 From: Quang Phan Date: Mon, 30 Jun 2025 11:01:41 +0700 Subject: [PATCH 1133/1135] fix: deprecate cloudflare platform.context in favor for platform.ctx (#13856) * fix: deprecate cloudflare platform.context in favor for platform.ctx (#13851) * add test * format * don't format cloudflare test apps --------- Co-authored-by: Chew Tee Ming --- .changeset/moody-baboons-drum.md | 5 ++++ .prettierrc | 4 ++- .../60-adapter-cloudflare.md | 2 +- .../70-adapter-cloudflare-workers.md | 2 +- packages/adapter-cloudflare/ambient.d.ts | 2 ++ packages/adapter-cloudflare/index.js | 3 +- packages/adapter-cloudflare/src/worker.js | 9 +++--- .../apps/pages/src/routes/+page.server.js | 1 + .../test/apps/pages/test/test.js | 2 +- .../test/apps/workers/package.json | 5 +++- .../test/apps/workers/src/app.d.ts | 3 ++ .../apps/workers/src/routes/+page.server.js | 1 + .../apps/workers/src/routes/ctx/+server.js | 3 ++ .../test/apps/workers/test/test.js | 7 ++++- packages/adapter-cloudflare/test/utils.js | 4 +-- packages/kit/test/apps/amp/package.json | 2 +- packages/kit/test/apps/basics/package.json | 2 +- packages/kit/test/apps/dev-only/package.json | 2 +- packages/kit/test/apps/embed/package.json | 2 +- .../test/apps/hash-based-routing/package.json | 2 +- packages/kit/test/apps/no-ssr/package.json | 2 +- packages/kit/test/apps/options-2/package.json | 2 +- packages/kit/test/apps/options/package.json | 2 +- .../prerendered-app-error-pages/package.json | 2 +- packages/kit/test/apps/writes/package.json | 2 +- .../apps/private-static-env/package.json | 2 +- pnpm-lock.yaml | 28 +++++++++++-------- pnpm-workspace.yaml | 1 + 28 files changed, 69 insertions(+), 35 deletions(-) create mode 100644 .changeset/moody-baboons-drum.md create mode 100644 packages/adapter-cloudflare/test/apps/workers/src/app.d.ts create mode 100644 packages/adapter-cloudflare/test/apps/workers/src/routes/ctx/+server.js diff --git a/.changeset/moody-baboons-drum.md b/.changeset/moody-baboons-drum.md new file mode 100644 index 000000000000..b224830500b6 --- /dev/null +++ b/.changeset/moody-baboons-drum.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-cloudflare': patch +--- + +fix: deprecate `platform.context` in favor of `platform.ctx` to align with Cloudflare's naming convention diff --git a/.prettierrc b/.prettierrc index 0fd4cd0a2cc1..fc699c71d960 100644 --- a/.prettierrc +++ b/.prettierrc @@ -26,11 +26,13 @@ "**/.custom-out-dir/**", "**/build/**", "**/test-results/**", + "**/.wrangler/**", "documentation/**/*.md", "packages/package/test/fixtures/**/expected/**/*", "packages/package/test/watch/expected/**/*", "packages/package/test/watch/package/**/*", - "packages/kit/src/core/postbuild/fixtures/**/*" + "packages/kit/src/core/postbuild/fixtures/**/*", + "packages/adapter-cloudflare/test/apps/workers/dist/**/*" ], "options": { "rangeEnd": 0 diff --git a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md index 665214fb718b..0e438e5b0f12 100644 --- a/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md +++ b/documentation/docs/25-build-and-deploy/60-adapter-cloudflare.md @@ -122,7 +122,7 @@ Functions contained in the [`/functions` directory](https://developers.cloudflar ## Runtime APIs -The [`env`](https://developers.cloudflare.com/workers/runtime-apis/fetch-event#parameters) object contains your project's [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/), which consist of KV/DO namespaces, etc. It is passed to SvelteKit via the `platform` property, along with [`context`](https://developers.cloudflare.com/workers/runtime-apis/context/), [`caches`](https://developers.cloudflare.com/workers/runtime-apis/cache/), and [`cf`](https://developers.cloudflare.com/workers/runtime-apis/request/#incomingrequestcfproperties), meaning that you can access it in hooks and endpoints: +The [`env`](https://developers.cloudflare.com/workers/runtime-apis/fetch-event#parameters) object contains your project's [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/), which consist of KV/DO namespaces, etc. It is passed to SvelteKit via the `platform` property, along with [`ctx`](https://developers.cloudflare.com/workers/runtime-apis/context/), [`caches`](https://developers.cloudflare.com/workers/runtime-apis/cache/), and [`cf`](https://developers.cloudflare.com/workers/runtime-apis/request/#incomingrequestcfproperties), meaning that you can access it in hooks and endpoints: ```js // @errors: 7031 diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index 942f57fed034..12042800d5e5 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -77,7 +77,7 @@ wrangler deploy ## Runtime APIs -The [`env`](https://developers.cloudflare.com/workers/runtime-apis/fetch-event#parameters) object contains your project's [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/), which consist of KV/DO namespaces, etc. It is passed to SvelteKit via the `platform` property, along with [`context`](https://developers.cloudflare.com/workers/runtime-apis/context/), [`caches`](https://developers.cloudflare.com/workers/runtime-apis/cache/), and [`cf`](https://developers.cloudflare.com/workers/runtime-apis/request/#incomingrequestcfproperties), meaning that you can access it in hooks and endpoints: +The [`env`](https://developers.cloudflare.com/workers/runtime-apis/fetch-event#parameters) object contains your project's [bindings](https://developers.cloudflare.com/workers/runtime-apis/bindings/), which consist of KV/DO namespaces, etc. It is passed to SvelteKit via the `platform` property, along with [`ctx`](https://developers.cloudflare.com/workers/runtime-apis/context/), [`caches`](https://developers.cloudflare.com/workers/runtime-apis/cache/), and [`cf`](https://developers.cloudflare.com/workers/runtime-apis/request/#incomingrequestcfproperties), meaning that you can access it in hooks and endpoints: ```js // @errors: 7031 diff --git a/packages/adapter-cloudflare/ambient.d.ts b/packages/adapter-cloudflare/ambient.d.ts index 9bee6700f8ac..d99dd15ab6cc 100644 --- a/packages/adapter-cloudflare/ambient.d.ts +++ b/packages/adapter-cloudflare/ambient.d.ts @@ -8,6 +8,8 @@ declare global { namespace App { export interface Platform { env: unknown; + ctx: ExecutionContext; + /** @deprecated Use `ctx` instead */ context: ExecutionContext; caches: CacheStorage; cf?: IncomingRequestCfProperties; diff --git a/packages/adapter-cloudflare/index.js b/packages/adapter-cloudflare/index.js index 5bb705f6a6ae..266265556369 100644 --- a/packages/adapter-cloudflare/index.js +++ b/packages/adapter-cloudflare/index.js @@ -135,7 +135,8 @@ export default function (options = {}) { const proxy = await getPlatformProxy(options.platformProxy); const platform = /** @type {App.Platform} */ ({ env: proxy.env, - context: proxy.ctx, + ctx: proxy.ctx, + context: proxy.ctx, // deprecated in favor of ctx caches: proxy.caches, cf: proxy.cf }); diff --git a/packages/adapter-cloudflare/src/worker.js b/packages/adapter-cloudflare/src/worker.js index a2ea423c1653..7a89657b3997 100644 --- a/packages/adapter-cloudflare/src/worker.js +++ b/packages/adapter-cloudflare/src/worker.js @@ -13,10 +13,10 @@ export default { /** * @param {Request} req * @param {{ ASSETS: { fetch: typeof fetch } }} env - * @param {ExecutionContext} context + * @param {ExecutionContext} ctx * @returns {Promise} */ - async fetch(req, env, context) { + async fetch(req, env, ctx) { await server.init({ // @ts-expect-error env contains environment variables and bindings env @@ -70,7 +70,8 @@ export default { res = await server.respond(req, { platform: { env, - context, + ctx, + context: ctx, // deprecated in favor of ctx // @ts-expect-error webworker types from worktop are not compatible with Cloudflare Workers types caches, // @ts-expect-error the type is correct but ts is confused because platform.cf uses the type from index.ts while req.cf uses the type from index.d.ts @@ -85,6 +86,6 @@ export default { // write to `Cache` only if response is not an error, // let `Cache.save` handle the Cache-Control and Vary headers pragma = res.headers.get('cache-control') || ''; - return pragma && res.status < 400 ? Cache.save(req, res, context) : res; + return pragma && res.status < 400 ? Cache.save(req, res, ctx) : res; } }; diff --git a/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js b/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js index 2e1aac593126..0eeb7d398ffd 100644 --- a/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js +++ b/packages/adapter-cloudflare/test/apps/pages/src/routes/+page.server.js @@ -1,3 +1,4 @@ +// this tests that Wrangler can correctly resolve and bundle server-side dependencies import { sum } from 'server-side-dep'; export function load() { diff --git a/packages/adapter-cloudflare/test/apps/pages/test/test.js b/packages/adapter-cloudflare/test/apps/pages/test/test.js index aab7cbca568a..0619c030bbc2 100644 --- a/packages/adapter-cloudflare/test/apps/pages/test/test.js +++ b/packages/adapter-cloudflare/test/apps/pages/test/test.js @@ -1,6 +1,6 @@ import { expect, test } from '@playwright/test'; -test('worker works', async ({ page }) => { +test('worker', async ({ page }) => { await page.goto('/'); await expect(page.locator('h1')).toContainText('Sum: 3'); }); diff --git a/packages/adapter-cloudflare/test/apps/workers/package.json b/packages/adapter-cloudflare/test/apps/workers/package.json index b32f21342585..35398cb300a4 100644 --- a/packages/adapter-cloudflare/test/apps/workers/package.json +++ b/packages/adapter-cloudflare/test/apps/workers/package.json @@ -7,11 +7,14 @@ "build": "vite build", "preview": "wrangler dev dist/index.js", "prepare": "svelte-kit sync || echo ''", - "test": "playwright test" + "test:dev": "cross-env DEV=true playwright test", + "test:build": "playwright test", + "test": "pnpm test:dev && pnpm test:build" }, "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", + "cross-env": "catalog:", "server-side-dep": "file:server-side-dep", "svelte": "^5.23.1", "vite": "catalog:", diff --git a/packages/adapter-cloudflare/test/apps/workers/src/app.d.ts b/packages/adapter-cloudflare/test/apps/workers/src/app.d.ts new file mode 100644 index 000000000000..101a9db0b8bf --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/src/app.d.ts @@ -0,0 +1,3 @@ +// TODO: remove this in 3.0 once svelte.config.js is included by the generated tsconfig.json +// this ensures we get the ambient types from the adapter +import '../../../../index.js'; diff --git a/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js b/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js index 2e1aac593126..0eeb7d398ffd 100644 --- a/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js +++ b/packages/adapter-cloudflare/test/apps/workers/src/routes/+page.server.js @@ -1,3 +1,4 @@ +// this tests that Wrangler can correctly resolve and bundle server-side dependencies import { sum } from 'server-side-dep'; export function load() { diff --git a/packages/adapter-cloudflare/test/apps/workers/src/routes/ctx/+server.js b/packages/adapter-cloudflare/test/apps/workers/src/routes/ctx/+server.js new file mode 100644 index 000000000000..e26ae2cbbd71 --- /dev/null +++ b/packages/adapter-cloudflare/test/apps/workers/src/routes/ctx/+server.js @@ -0,0 +1,3 @@ +export function GET({ platform }) { + return new Response(platform?.ctx.waitUntil ? 'ctx works' : 'ctx does not work'); +} diff --git a/packages/adapter-cloudflare/test/apps/workers/test/test.js b/packages/adapter-cloudflare/test/apps/workers/test/test.js index aab7cbca568a..f938d3cf5bf2 100644 --- a/packages/adapter-cloudflare/test/apps/workers/test/test.js +++ b/packages/adapter-cloudflare/test/apps/workers/test/test.js @@ -1,6 +1,11 @@ import { expect, test } from '@playwright/test'; -test('worker works', async ({ page }) => { +test('worker', async ({ page }) => { await page.goto('/'); await expect(page.locator('h1')).toContainText('Sum: 3'); }); + +test('ctx', async ({ request }) => { + const res = await request.get('/ctx'); + expect(await res.text()).toBe('ctx works'); +}); diff --git a/packages/adapter-cloudflare/test/utils.js b/packages/adapter-cloudflare/test/utils.js index 719822d7aa53..3b15f891cf0a 100644 --- a/packages/adapter-cloudflare/test/utils.js +++ b/packages/adapter-cloudflare/test/utils.js @@ -7,8 +7,8 @@ export const config = { // generous timeouts on CI timeout: process.env.CI ? 45000 : 15000, webServer: { - command: 'pnpm build && pnpm preview', - port: 8787 + command: process.env.DEV ? 'pnpm dev' : 'pnpm build && pnpm preview', + port: process.env.DEV ? 5173 : 8787 }, retries: process.env.CI ? 2 : 0, projects: [ diff --git a/packages/kit/test/apps/amp/package.json b/packages/kit/test/apps/amp/package.json index c83e16224c82..5d1004241cb5 100644 --- a/packages/kit/test/apps/amp/package.json +++ b/packages/kit/test/apps/amp/package.json @@ -16,7 +16,7 @@ "@sveltejs/amp": "workspace:^", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "dropcss": "^1.0.16", "svelte": "^5.23.1", "svelte-check": "^4.1.1", diff --git a/packages/kit/test/apps/basics/package.json b/packages/kit/test/apps/basics/package.json index dac246c3e953..4bcdd9c87f1b 100644 --- a/packages/kit/test/apps/basics/package.json +++ b/packages/kit/test/apps/basics/package.json @@ -19,7 +19,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "redirect-pkg": "file:./_test_dependencies/redirect-pkg", diff --git a/packages/kit/test/apps/dev-only/package.json b/packages/kit/test/apps/dev-only/package.json index 47a595c06089..4de5b18df866 100644 --- a/packages/kit/test/apps/dev-only/package.json +++ b/packages/kit/test/apps/dev-only/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "e2e-test-dep-error": "file:./_test_dependencies/cjs-only", "e2e-test-dep-hooks": "file:./_test_dependencies/cjs-only", "e2e-test-dep-hooks-client": "file:./_test_dependencies/cjs-only", diff --git a/packages/kit/test/apps/embed/package.json b/packages/kit/test/apps/embed/package.json index abb145d2e0f0..f7b23562acc5 100644 --- a/packages/kit/test/apps/embed/package.json +++ b/packages/kit/test/apps/embed/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/packages/kit/test/apps/hash-based-routing/package.json b/packages/kit/test/apps/hash-based-routing/package.json index b5a261cd2bf4..95d2828cc90e 100644 --- a/packages/kit/test/apps/hash-based-routing/package.json +++ b/packages/kit/test/apps/hash-based-routing/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/packages/kit/test/apps/no-ssr/package.json b/packages/kit/test/apps/no-ssr/package.json index c9eac729dc8b..75ba8628c753 100644 --- a/packages/kit/test/apps/no-ssr/package.json +++ b/packages/kit/test/apps/no-ssr/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/packages/kit/test/apps/options-2/package.json b/packages/kit/test/apps/options-2/package.json index ecbe6f9ed672..9a875ac5163c 100644 --- a/packages/kit/test/apps/options-2/package.json +++ b/packages/kit/test/apps/options-2/package.json @@ -16,7 +16,7 @@ "@sveltejs/adapter-node": "workspace:^", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/packages/kit/test/apps/options/package.json b/packages/kit/test/apps/options/package.json index 7d160dc0ce43..df1618f6b07f 100644 --- a/packages/kit/test/apps/options/package.json +++ b/packages/kit/test/apps/options/package.json @@ -18,7 +18,7 @@ "@fontsource/libre-barcode-128-text": "^5.1.0", "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/packages/kit/test/apps/prerendered-app-error-pages/package.json b/packages/kit/test/apps/prerendered-app-error-pages/package.json index 5ace86cb671d..832d0316979e 100644 --- a/packages/kit/test/apps/prerendered-app-error-pages/package.json +++ b/packages/kit/test/apps/prerendered-app-error-pages/package.json @@ -17,7 +17,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/packages/kit/test/apps/writes/package.json b/packages/kit/test/apps/writes/package.json index d101e1a44de7..0019074f72f7 100644 --- a/packages/kit/test/apps/writes/package.json +++ b/packages/kit/test/apps/writes/package.json @@ -15,7 +15,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/packages/kit/test/build-errors/apps/private-static-env/package.json b/packages/kit/test/build-errors/apps/private-static-env/package.json index 5fa56f19c9e8..41f544cc045d 100644 --- a/packages/kit/test/build-errors/apps/private-static-env/package.json +++ b/packages/kit/test/build-errors/apps/private-static-env/package.json @@ -13,7 +13,7 @@ "devDependencies": { "@sveltejs/kit": "workspace:^", "@sveltejs/vite-plugin-svelte": "catalog:", - "cross-env": "^7.0.3", + "cross-env": "catalog:", "svelte": "^5.23.1", "svelte-check": "^4.1.1", "typescript": "^5.5.4", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 6eaf659de68f..79fbf1aab031 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -12,6 +12,9 @@ catalogs: '@sveltejs/vite-plugin-svelte': specifier: ^6.0.0-next.0 version: 6.0.0-next.0 + cross-env: + specifier: ^7.0.3 + version: 7.0.3 vite: specifier: ^6.3.5 version: 6.3.5 @@ -123,6 +126,9 @@ importers: '@sveltejs/vite-plugin-svelte': specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) + cross-env: + specifier: 'catalog:' + version: 7.0.3 server-side-dep: specifier: file:server-side-dep version: file:packages/adapter-cloudflare/test/apps/workers/server-side-dep @@ -459,7 +465,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 dropcss: specifier: ^1.0.16 @@ -486,7 +492,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 redirect-pkg: specifier: file:./_test_dependencies/redirect-pkg @@ -519,7 +525,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 e2e-test-dep-error: specifier: file:./_test_dependencies/cjs-only @@ -573,7 +579,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 @@ -597,7 +603,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 @@ -621,7 +627,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 @@ -648,7 +654,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 @@ -675,7 +681,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 @@ -699,7 +705,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 @@ -723,7 +729,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 @@ -867,7 +873,7 @@ importers: specifier: 'catalog:' version: 6.0.0-next.0(svelte@5.23.1)(vite@6.3.5(@types/node@18.19.50)(lightningcss@1.30.1)) cross-env: - specifier: ^7.0.3 + specifier: 'catalog:' version: 7.0.3 svelte: specifier: ^5.23.1 diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index 54880d83fa33..22100cc6619e 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -14,5 +14,6 @@ packages: catalog: '@playwright/test': '^1.51.1' '@sveltejs/vite-plugin-svelte': '^6.0.0-next.0' + 'cross-env': '^7.0.3' 'vitest': '^3.2.3' 'vite': '^6.3.5' \ No newline at end of file From 217fc24f2d86eb0b29ab0565d89a4ef620ef5338 Mon Sep 17 00:00:00 2001 From: Tee Ming Date: Mon, 30 Jun 2025 13:24:26 +0800 Subject: [PATCH 1134/1135] use the correct markdown syntax language (#13945) --- .../docs/10-getting-started/30-project-structure.md | 2 +- .../docs/25-build-and-deploy/40-adapter-node.md | 12 ++++++------ .../70-adapter-cloudflare-workers.md | 4 ++-- .../docs/25-build-and-deploy/90-adapter-vercel.md | 2 +- documentation/docs/30-advanced/70-packaging.md | 2 +- documentation/docs/60-appendix/10-faq.md | 4 ++-- 6 files changed, 13 insertions(+), 13 deletions(-) diff --git a/documentation/docs/10-getting-started/30-project-structure.md b/documentation/docs/10-getting-started/30-project-structure.md index 0d9e64141723..64bae0a695c1 100644 --- a/documentation/docs/10-getting-started/30-project-structure.md +++ b/documentation/docs/10-getting-started/30-project-structure.md @@ -4,7 +4,7 @@ title: Project structure A typical SvelteKit project looks like this: -```bash +```tree my-project/ ├ src/ │ ├ lib/ diff --git a/documentation/docs/25-build-and-deploy/40-adapter-node.md b/documentation/docs/25-build-and-deploy/40-adapter-node.md index ce0a5bccf95f..c67db0714efa 100644 --- a/documentation/docs/25-build-and-deploy/40-adapter-node.md +++ b/documentation/docs/25-build-and-deploy/40-adapter-node.md @@ -64,13 +64,13 @@ node +++--env-file=.env+++ build By default, the server will accept connections on `0.0.0.0` using port 3000. These can be customised with the `PORT` and `HOST` environment variables: -``` +```bash HOST=127.0.0.1 PORT=4000 node build ``` Alternatively, the server can be configured to accept connections on a specified socket path. When this is done using the `SOCKET_PATH` environment variable, the `HOST` and `PORT` environment variables will be disregarded. -``` +```bash SOCKET_PATH=/tmp/socket node build ``` @@ -78,7 +78,7 @@ SOCKET_PATH=/tmp/socket node build HTTP doesn't give SvelteKit a reliable way to know the URL that is currently being requested. The simplest way to tell SvelteKit where the app is being served is to set the `ORIGIN` environment variable: -``` +```bash ORIGIN=https://my.site node build # or e.g. for local previewing and testing @@ -87,7 +87,7 @@ ORIGIN=http://localhost:3000 node build With this, a request for the `/stuff` pathname will correctly resolve to `https://my.site/stuff`. Alternatively, you can specify headers that tell SvelteKit about the request protocol and host, from which it can construct the origin URL: -``` +```bash PROTOCOL_HEADER=x-forwarded-proto HOST_HEADER=x-forwarded-host node build ``` @@ -103,7 +103,7 @@ If `adapter-node` can't correctly determine the URL of your deployment, you may The [`RequestEvent`](@sveltejs-kit#RequestEvent) object passed to hooks and endpoints includes an `event.getClientAddress()` function that returns the client's IP address. By default this is the connecting `remoteAddress`. If your server is behind one or more proxies (such as a load balancer), this value will contain the innermost proxy's IP address rather than the client's, so we need to specify an `ADDRESS_HEADER` to read the address from: -``` +```bash ADDRESS_HEADER=True-Client-IP node build ``` @@ -174,7 +174,7 @@ If you need to change the name of the environment variables used to configure th envPrefix: 'MY_CUSTOM_'; ``` -```sh +```bash MY_CUSTOM_HOST=127.0.0.1 \ MY_CUSTOM_PORT=4000 \ MY_CUSTOM_ORIGIN=https://my.site \ diff --git a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md index 12042800d5e5..73a771459543 100644 --- a/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md +++ b/documentation/docs/25-build-and-deploy/70-adapter-cloudflare-workers.md @@ -64,14 +64,14 @@ https://dash.cloudflare.com//home You will need to install [Wrangler](https://developers.cloudflare.com/workers/wrangler/install-and-update/) and log in, if you haven't already: -```sh +```bash npm i -D wrangler wrangler login ``` Then, you can build your app and deploy it: -```sh +```bash wrangler deploy ``` diff --git a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md index 58e8079cda27..d15ae0f3aca3 100644 --- a/documentation/docs/25-build-and-deploy/90-adapter-vercel.md +++ b/documentation/docs/25-build-and-deploy/90-adapter-vercel.md @@ -131,7 +131,7 @@ Set this string as an environment variable on Vercel by logging in and going to To get this key known about for local development, you can use the [Vercel CLI](https://vercel.com/docs/cli/env) by running the `vercel env pull` command locally like so: -```sh +```bash vercel env pull .env.development.local ``` diff --git a/documentation/docs/30-advanced/70-packaging.md b/documentation/docs/30-advanced/70-packaging.md index 93294e3f2616..285094390c94 100644 --- a/documentation/docs/30-advanced/70-packaging.md +++ b/documentation/docs/30-advanced/70-packaging.md @@ -249,7 +249,7 @@ You can create so-called declaration maps (`d.ts.map` files) by setting `"declar To publish the generated package: -```sh +```bash npm publish ``` diff --git a/documentation/docs/60-appendix/10-faq.md b/documentation/docs/60-appendix/10-faq.md index 5caa0f5b7b9f..94ebe4950cec 100644 --- a/documentation/docs/60-appendix/10-faq.md +++ b/documentation/docs/60-appendix/10-faq.md @@ -195,14 +195,14 @@ Currently ESM Support within the latest Yarn (version 3) is considered [experime The below seems to work although your results may vary. First create a new application: -```sh +```bash yarn create svelte myapp cd myapp ``` And enable Yarn Berry: -```sh +```bash yarn set version berry yarn install ``` From 96ce0f9735c4d1a1d467c1f9641e91b5858eea93 Mon Sep 17 00:00:00 2001 From: Kendell R Date: Thu, 3 Jul 2025 13:45:34 -0700 Subject: [PATCH 1135/1135] fix: remove unnecessary static directory serving middleware (#13953) --- .changeset/spotty-ideas-clap.md | 5 +++++ packages/adapter-node/src/handler.js | 7 +------ 2 files changed, 6 insertions(+), 6 deletions(-) create mode 100644 .changeset/spotty-ideas-clap.md diff --git a/.changeset/spotty-ideas-clap.md b/.changeset/spotty-ideas-clap.md new file mode 100644 index 000000000000..38b3f28cd9c8 --- /dev/null +++ b/.changeset/spotty-ideas-clap.md @@ -0,0 +1,5 @@ +--- +'@sveltejs/adapter-node': patch +--- + +fix: remove unnecessary static directory serving middleware diff --git a/packages/adapter-node/src/handler.js b/packages/adapter-node/src/handler.js index 37827e64042c..aec40af5566d 100644 --- a/packages/adapter-node/src/handler.js +++ b/packages/adapter-node/src/handler.js @@ -193,10 +193,5 @@ function get_origin(headers) { } export const handler = sequence( - [ - serve(path.join(dir, 'client'), true), - serve(path.join(dir, 'static')), - serve_prerendered(), - ssr - ].filter(Boolean) + [serve(path.join(dir, 'client'), true), serve_prerendered(), ssr].filter(Boolean) );

^6St1d297cB*k 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