Skip to content
Permalink

Comparing changes

Choose two branches to see what’s changed or to start a new pull request. If you need to, you can also or learn more about diff comparisons.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also . Learn more about diff comparisons here.
base repository: sveltejs/kit
Failed to load repositories. Confirm that selected base ref is valid, then try again.
Loading
base: @sveltejs/adapter-cloudflare@5.0.1
Choose a base ref
...
head repository: sveltejs/kit
Failed to load repositories. Confirm that selected head ref is valid, then try again.
Loading
compare: @sveltejs/adapter-cloudflare@5.0.2
Choose a head ref
Loading
Showing with 2,996 additions and 1,234 deletions.
  1. +35 −0 .github/workflows/ci.yml
  2. +0 −26 .github/workflows/docs-preview-create-request.yml
  3. +0 −27 .github/workflows/docs-preview-delete-request.yml
  4. +0 −22 .github/workflows/sync-request.yml
  5. +30 −8 documentation/docs/20-core-concepts/10-routing.md
  6. +22 −7 documentation/docs/20-core-concepts/20-load.md
  7. +13 −6 documentation/docs/20-core-concepts/30-form-actions.md
  8. +3 −3 documentation/docs/20-core-concepts/50-state-management.md
  9. +35 −14 documentation/docs/25-build-and-deploy/90-adapter-vercel.md
  10. +7 −0 documentation/docs/30-advanced/20-hooks.md
  11. +17 −0 documentation/docs/30-advanced/70-packaging.md
  12. +1 −1 documentation/docs/40-best-practices/03-auth.md
  13. +1 −1 documentation/docs/60-appendix/30-migrating-to-sveltekit-2.md
  14. +60 −12 documentation/docs/98-reference/54-types.md
  15. +2 −0 package.json
  16. +1 −1 packages/adapter-auto/package.json
  17. +9 −0 packages/adapter-cloudflare-workers/CHANGELOG.md
  18. +7 −6 packages/adapter-cloudflare-workers/index.js
  19. 0 packages/adapter-cloudflare-workers/{placeholders.d.ts → internal.d.ts}
  20. +1 −1 packages/adapter-cloudflare-workers/package.json
  21. +1 −1 packages/adapter-cloudflare-workers/tsconfig.json
  22. +9 −0 packages/adapter-cloudflare/CHANGELOG.md
  23. +7 −6 packages/adapter-cloudflare/index.js
  24. 0 packages/adapter-cloudflare/{placeholders.d.ts → internal.d.ts}
  25. +1 −1 packages/adapter-cloudflare/package.json
  26. +1 −1 packages/adapter-cloudflare/tsconfig.json
  27. +6 −0 packages/adapter-netlify/CHANGELOG.md
  28. +0 −1 packages/adapter-netlify/index.d.ts
  29. +41 −23 packages/adapter-netlify/index.js
  30. +0 −1 packages/adapter-netlify/{ambient.d.ts → internal.d.ts}
  31. +2 −2 packages/adapter-netlify/package.json
  32. +1 −38 packages/adapter-netlify/src/edge.js
  33. +1 −1 packages/adapter-netlify/tsconfig.json
  34. +9 −0 packages/adapter-node/CHANGELOG.md
  35. +10 −26 packages/adapter-node/ambient.d.ts
  36. +19 −0 packages/adapter-node/internal.d.ts
  37. +4 −3 packages/adapter-node/package.json
  38. +1 −1 packages/adapter-node/tsconfig.json
  39. +1 −1 packages/adapter-static/package.json
  40. +1 −1 packages/adapter-static/test/apps/prerendered/package.json
  41. +1 −1 packages/adapter-static/test/apps/spa/package.json
  42. +21 −0 packages/adapter-vercel/CHANGELOG.md
  43. +20 −0 packages/adapter-vercel/index.js
  44. +4 −3 packages/adapter-vercel/package.json
  45. +2 −2 packages/enhanced-img/package.json
  46. +98 −0 packages/kit/CHANGELOG.md
  47. +4 −0 packages/kit/kit.vitest.config.js
  48. +7 −8 packages/kit/package.json
  49. +0 −55 packages/kit/postinstall.js
  50. +2 −0 packages/kit/src/core/adapt/builder.js
  51. +16 −1 packages/kit/src/core/config/index.js
  52. +2 −1 packages/kit/src/core/config/index.spec.js
  53. +2 −1 packages/kit/src/core/config/options.js
  54. +14 −5 packages/kit/src/core/generate_manifest/index.js
  55. +2 −2 packages/kit/src/core/postbuild/analyse.js
  56. +2 −9 packages/kit/src/core/sync/utils.js
  57. +33 −17 packages/kit/src/core/sync/write_client_manifest.js
  58. +2 −1 packages/kit/src/core/sync/write_server.js
  59. +10 −0 packages/kit/src/core/sync/write_types/index.js
  60. +1 −1 packages/kit/src/core/sync/write_types/index.spec.js
  61. +8 −0 packages/kit/src/exports/index.js
  62. +73 −50 packages/kit/src/exports/public.d.ts
  63. +49 −8 packages/kit/src/exports/vite/build/build_server.js
  64. +30 −2 packages/kit/src/exports/vite/dev/index.js
  65. +53 −7 packages/kit/src/exports/vite/index.js
  66. +3 −0 packages/kit/src/runtime/app/forms.js
  67. +11 −0 packages/kit/src/runtime/app/state/index.js
  68. +144 −64 packages/kit/src/runtime/client/client.js
  69. +2 −2 packages/kit/src/runtime/client/fetcher.js
  70. +20 −0 packages/kit/src/runtime/client/parse.js
  71. +16 −1 packages/kit/src/runtime/client/types.d.ts
  72. +7 −1 packages/kit/src/runtime/client/utils.js
  73. +54 −0 packages/kit/src/runtime/pathname.js
  74. +4 −3 packages/kit/src/runtime/server/cookie.js
  75. +12 −0 packages/kit/src/runtime/server/fetch.js
  76. +1 −1 packages/kit/src/runtime/server/page/index.js
  77. +2 −2 packages/kit/src/runtime/server/page/load_data.spec.js
  78. +25 −3 packages/kit/src/runtime/server/page/render.js
  79. +110 −0 packages/kit/src/runtime/server/page/server_routing.js
  80. +58 −40 packages/kit/src/runtime/server/respond.js
  81. +64 −0 packages/kit/src/runtime/server/validate-headers.js
  82. +99 −0 packages/kit/src/runtime/server/validate-headers.spec.js
  83. +21 −0 packages/kit/src/runtime/utils.js
  84. +1 −0 packages/kit/src/types/ambient-private.d.ts
  85. +2 −0 packages/kit/src/types/global-private.d.ts
  86. +47 −9 packages/kit/src/types/internal.d.ts
  87. +4 −3 packages/kit/src/utils/filesystem.js
  88. +17 −9 packages/kit/src/utils/filesystem.spec.js
  89. +11 −6 packages/kit/src/utils/import.js
  90. +8 −0 packages/kit/src/utils/routing.js
  91. +0 −23 packages/kit/src/utils/url.js
  92. +1 −1 packages/kit/src/version.js
  93. +1 −1 packages/kit/test/ambient.d.ts
  94. +2 −1 packages/kit/test/apps/amp/package.json
  95. +5 −2 packages/kit/test/apps/basics/package.json
  96. +2 −2 packages/kit/test/apps/basics/playwright.config.js
  97. +2 −1 packages/kit/test/apps/basics/src/hooks.js
  98. +10 −0 packages/kit/test/apps/basics/src/hooks.server.js
  99. +11 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/+page.svelte
  100. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.js
  101. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/eager/+page.svelte
  102. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.js
  103. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/hover/+page.svelte
  104. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.js
  105. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/tap/+page.svelte
  106. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.js
  107. +5 −0 packages/kit/test/apps/basics/src/routes/data-sveltekit/preload-code/target/viewport/+page.svelte
  108. +7 −0 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+layout.js
  109. +8 −0 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.js
  110. +7 −0 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.server.js
  111. +49 −0 packages/kit/test/apps/basics/src/routes/load/invalidation/depends-goto/+page.svelte
  112. +3 −0 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.server.js
  113. +10 −0 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load-ii/+page.svelte
  114. +3 −0 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.server.js
  115. +18 −0 packages/kit/test/apps/basics/src/routes/load/window-fetch/patching-server-load/+page.svelte
  116. +23 −0 .../test/apps/basics/src/routes/prerendering/prerendered-endpoint/api-with-param/[option]/+server.js
  117. +5 −1 packages/kit/test/apps/basics/src/routes/prerendering/prerendered-endpoint/proxy/+server.js
  118. +5 −0 packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.server.js
  119. +11 −0 packages/kit/test/apps/basics/src/routes/reroute/invalidate/+page.svelte
  120. +5 −0 packages/kit/test/apps/basics/svelte.config.js
  121. +134 −3 packages/kit/test/apps/basics/test/client.test.js
  122. +36 −2 packages/kit/test/apps/basics/test/cross-platform/client.test.js
  123. +21 −0 packages/kit/test/apps/basics/test/server.test.js
  124. +2 −1 packages/kit/test/apps/dev-only/package.json
  125. +9 −0 packages/kit/test/apps/dev-only/src/routes/headers/invalid/+server.js
  126. +52 −24 packages/kit/test/apps/dev-only/test/test.js
  127. +2 −1 packages/kit/test/apps/embed/package.json
  128. +2 −1 packages/kit/test/apps/hash-based-routing/package.json
  129. +3 −0 packages/kit/test/apps/hash-based-routing/src/routes/anchor/+page.svelte
  130. +18 −0 packages/kit/test/apps/hash-based-routing/test/test.js
  131. +2 −1 packages/kit/test/apps/no-ssr/package.json
  132. +2 −1 packages/kit/test/apps/options-2/package.json
  133. +14 −1 packages/kit/test/apps/options-2/test/test.js
  134. +6 −2 packages/kit/test/apps/options/package.json
  135. +12 −1 packages/kit/test/apps/options/playwright.config.js
  136. +9 −0 packages/kit/test/apps/options/source/components/SharedCSS.svelte
  137. +16 −0 packages/kit/test/apps/options/source/pages/inline-assets/+page.svelte
  138. +2 −0 packages/kit/test/apps/options/source/pages/resolve-route/+page.svelte
  139. +5 −0 packages/kit/test/apps/options/svelte.config.js
  140. +16 −0 packages/kit/test/apps/options/test/test.js
  141. +2 −1 packages/kit/test/apps/writes/package.json
  142. +2 −1 packages/kit/test/build-errors/apps/prerender-entry-generator-mismatch/package.json
  143. +2 −1 packages/kit/test/build-errors/apps/prerenderable-incorrect-fragment/package.json
  144. +2 −1 packages/kit/test/build-errors/apps/prerenderable-not-prerendered/package.json
  145. +2 −1 packages/kit/test/build-errors/apps/private-dynamic-env-dynamic-import/package.json
  146. +2 −1 packages/kit/test/build-errors/apps/private-dynamic-env/package.json
  147. +2 −1 packages/kit/test/build-errors/apps/private-static-env-dynamic-import/package.json
  148. +2 −1 packages/kit/test/build-errors/apps/private-static-env/package.json
  149. +2 −1 packages/kit/test/build-errors/apps/server-only-folder-dynamic-import/package.json
  150. +2 −1 packages/kit/test/build-errors/apps/server-only-folder/package.json
  151. +2 −1 packages/kit/test/build-errors/apps/server-only-module-dynamic-import/package.json
  152. +2 −1 packages/kit/test/build-errors/apps/server-only-module/package.json
  153. +2 −1 packages/kit/test/build-errors/apps/service-worker-dynamic-public-env/package.json
  154. +2 −1 packages/kit/test/build-errors/apps/service-worker-private-env/package.json
  155. +3 −2 packages/kit/test/build-errors/apps/syntax-error/package.json
  156. +13 −11 packages/kit/test/build-errors/env.spec.js
  157. +1 −1 packages/kit/test/build-errors/package.json
  158. +6 −4 packages/kit/test/build-errors/prerender.spec.js
  159. +10 −8 packages/kit/test/build-errors/server-only.spec.js
  160. +4 −2 packages/kit/test/build-errors/syntax-error.spec.js
  161. +3 −0 packages/kit/test/mocks/path.js
  162. +2 −2 packages/kit/test/prerendering/basics/package.json
  163. +2 −2 packages/kit/test/prerendering/options/package.json
  164. +2 −2 packages/kit/test/prerendering/paths-base/package.json
  165. +1 −1 packages/kit/test/utils.d.ts
  166. +2 −2 packages/kit/test/utils.js
  167. +128 −57 packages/kit/types/index.d.ts
  168. +21 −0 packages/package/CHANGELOG.md
  169. +3 −3 packages/package/package.json
  170. +3 −2 packages/package/src/index.js
  171. +24 −3 packages/package/src/typescript.js
  172. +21 −4 packages/package/src/utils.js
  173. +1 −0 packages/package/test/fixtures/resolve-alias/expected/not.d.ts
  174. +1 −0 packages/package/test/fixtures/resolve-alias/expected/not.js
  175. +1 −0 packages/package/test/fixtures/resolve-alias/expected/sub/bar.d.ts
  176. +1 −0 packages/package/test/fixtures/resolve-alias/expected/sub/bar.js
  177. +1 −0 packages/package/test/fixtures/resolve-alias/src/lib/not.ts
  178. +1 −0 packages/package/test/fixtures/resolve-alias/src/lib/sub/bar.ts
  179. +5 −0 packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte
  180. +7 −0 packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts
  181. +1 −0 packages/package/test/fixtures/typescript-declaration-map/expected/Test.svelte.d.ts.map
  182. +2 −0 packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts
  183. +1 −0 packages/package/test/fixtures/typescript-declaration-map/expected/index.d.ts.map
  184. +1 −0 packages/package/test/fixtures/typescript-declaration-map/expected/index.js
  185. +16 −0 packages/package/test/fixtures/typescript-declaration-map/package.json
  186. +5 −0 packages/package/test/fixtures/typescript-declaration-map/src/lib/Test.svelte
  187. +1 −0 packages/package/test/fixtures/typescript-declaration-map/src/lib/index.ts
  188. +5 −0 packages/package/test/fixtures/typescript-declaration-map/svelte.config.js
  189. +8 −0 packages/package/test/fixtures/typescript-declaration-map/tsconfig.json
  190. +9 −1 packages/package/test/index.js
  191. +2 −1 playgrounds/basic/package.json
  192. +501 −482 pnpm-lock.yaml
35 changes: 35 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
@@ -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
@@ -144,6 +145,40 @@ jobs:
retention-days: 3
name: test-failure-cross-platform-${{ matrix.mode }}-${{ github.run_id }}-${{ matrix.os }}-${{ matrix.node-version }}-${{ matrix.e2e-browser }}
path: test-results-cross-platform-${{ matrix.mode }}.tar.gz
test-kit-server-side-route-resolution:
runs-on: ubuntu-latest
timeout-minutes: 30
strategy:
fail-fast: false
matrix:
include:
- mode: 'dev'
- mode: 'build'
steps:
- run: git config --global core.autocrlf false
- 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: pnpm playwright install chromium
- run: pnpm run sync-all
- run: pnpm test:server-side-route-resolution:${{ matrix.mode }}
- name: Print flaky test report
run: node scripts/print-flaky-test-report.js
- name: Archive test results
if: failure()
shell: bash
run: find packages -type d -name test-results -not -empty | tar -czf test-results-server-side-route-resolution-${{ matrix.mode }}.tar.gz --files-from=-
- name: Upload test results
if: failure()
uses: actions/upload-artifact@v4
with:
retention-days: 3
name: test-failure-server-side-route-resolution-${{ matrix.mode }}-${{ github.run_id }}
path: test-results-server-side-route-resolution-${{ matrix.mode }}.tar.gz
test-others:
runs-on: ubuntu-latest
steps:
26 changes: 0 additions & 26 deletions .github/workflows/docs-preview-create-request.yml

This file was deleted.

27 changes: 0 additions & 27 deletions .github/workflows/docs-preview-delete-request.yml

This file was deleted.

22 changes: 0 additions & 22 deletions .github/workflows/sync-request.yml

This file was deleted.

38 changes: 30 additions & 8 deletions documentation/docs/20-core-concepts/10-routing.md
Original file line number Diff line number Diff line change
@@ -37,12 +37,14 @@ A `+page.svelte` component defines a page of your app. By default, pages are ren
<a href="/">Home</a>
```

> [!NOTE] SvelteKit uses `<a>` elements to navigate between routes, rather than a framework-specific `<Link>` component.
Pages can receive data from `load` functions via the `data` prop.

```svelte
<!--- file: src/routes/blog/[slug]/+page.svelte --->
<script>
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
</script>
@@ -51,9 +53,9 @@ Pages can receive data from `load` functions via the `data` prop.
```

> [!LEGACY]
> In Svelte 4, you'd use `export let data` instead
> [!NOTE] SvelteKit uses `<a>` elements to navigate between routes, rather than a framework-specific `<Link>` component.
> `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.
### +page.js

@@ -212,7 +214,7 @@ We can create a layout that only applies to pages below `/settings` (while inher
```svelte
<!--- file: src/routes/settings/+layout.svelte --->
<script>
/** @type {{ data: import('./$types').LayoutData, children: import('svelte').Snippet }} */
/** @type {import('./$types').LayoutProps} */
let { data, children } = $props();
</script>
@@ -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
<!--- file: src/routes/settings/profile/+page.svelte --->
<script>
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
console.log(data.sections); // [{ slug: 'profile', title: 'Profile' }, ...]
@@ -388,16 +393,33 @@ 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 `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`:
For example, annotating `let { data } = $props()` with `PageProps` (or `LayoutProps`, 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 {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
</script>
```
> [!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`.
29 changes: 22 additions & 7 deletions documentation/docs/20-core-concepts/20-load.md
Original file line number Diff line number Diff line change
@@ -24,7 +24,7 @@ export function load({ params }) {
```svelte
<!--- file: src/routes/blog/[slug]/+page.svelte --->
<script>
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
</script>
@@ -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
<!--- file: src/routes/blog/[slug]/+layout.svelte --->
<script>
/** @type {{ data: import('./$types').LayoutData, children: Snippet }} */
/** @type {import('./$types').LayoutProps} */
let { data, children } = $props();
</script>
@@ -111,14 +118,22 @@ export async function load() {
</aside>
```

> [!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
/// file: src/routes/blog/[slug]/+page.svelte
<script>
+++import { page } from '$app/state';+++
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
+++ // we can access `data.posts` because it's returned from
@@ -372,7 +387,7 @@ export async function load({ parent }) {
```svelte
<!--- file: src/routes/abc/+page.svelte --->
<script>
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
</script>
@@ -511,7 +526,7 @@ This is useful for creating skeleton loading states, for example:
```svelte
<!--- file: src/routes/blog/[slug]/+page.svelte --->
<script>
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
</script>
@@ -652,7 +667,7 @@ export async function load({ fetch, depends }) {
<script>
import { invalidate, invalidateAll } from '$app/navigation';
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
function rerunLoadFunction() {
19 changes: 13 additions & 6 deletions documentation/docs/20-core-concepts/30-form-actions.md
Original file line number Diff line number Diff line change
@@ -140,7 +140,7 @@ export const actions = {
```svelte
<!--- file: src/routes/login/+page.svelte --->
<script>
/** @type {{ data: import('./$types').PageData, form: import('./$types').ActionData }} */
/** @type {import('./$types').PageProps} */
let { data, form } = $props();
</script>

@@ -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,14 +346,14 @@ The easiest way to progressively enhance a form is to add the `use:enhance` acti
<script>
+++import { enhance } from '$app/forms';+++

/** @type {{ form: import('./$types').ActionData }} */
/** @type {import('./$types').PageProps} */
let { form } = $props();
</script>

<form method="POST" +++use:enhance+++>
```
> [!NOTE] `use:enhance` can only be used with forms that have `method="POST"`. It will not work with `method="GET"`, which is the default for forms without a specified method. Attempting to use `use:enhance` on forms without `method="POST"` will result in an error.
> [!NOTE] `use:enhance` can only be used with forms that have `method="POST"` and point to actions defined in a `+page.server.js` file. It will not work with `method="GET"`, which is the default for forms without a specified method. Attempting to use `use:enhance` on forms without `method="POST"` or posting to a `+server.js` endpoint will result in an error.
> [!NOTE] Yes, it's a little confusing that the `enhance` action and `<form action>` are both called 'action'. These docs are action-packed. Sorry.
@@ -390,7 +397,7 @@ If you return a callback, you may need to reproduce part of the default `use:enh
<script>
import { enhance, +++applyAction+++ } from '$app/forms';

/** @type {{ form: import('./$types').ActionData }} */
/** @type {import('./$types').PageProps} */
let { form } = $props();
</script>

@@ -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 */
6 changes: 3 additions & 3 deletions documentation/docs/20-core-concepts/50-state-management.md
Original file line number Diff line number Diff line change
@@ -89,7 +89,7 @@ You might wonder how we're able to use `page.data` and other [app state]($app-st
<script>
import { setContext } from 'svelte';
/** @type {{ data: import('./$types').LayoutData }} */
/** @type {import('./$types').LayoutProps} */
let { data } = $props();
// Pass a function referencing our state
@@ -126,7 +126,7 @@ When you navigate around your application, SvelteKit reuses existing layout and
```svelte
<!--- file: src/routes/blog/[slug]/+page.svelte --->
<script>
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
// THIS CODE IS BUGGY!
@@ -149,7 +149,7 @@ Instead, we need to make the value [_reactive_](/tutorial/svelte/state):
```svelte
/// file: src/routes/blog/[slug]/+page.svelte
<script>
/** @type {{ data: import('./$types').PageData }} */
/** @type {import('./$types').PageProps} */
let { data } = $props();
+++ let wordCount = $derived(data.content.split(' ').length);
Loading