From 2925e5bae92225258201f5f370597604a42af816 Mon Sep 17 00:00:00 2001 From: soleuniverse Date: Sat, 27 Jun 2026 07:11:16 +0200 Subject: [PATCH 1/5] feat: add has to createContext return and update API types --- .../docs/98-reference/.generated/shared-errors.md | 2 +- packages/svelte/src/internal/client/context.js | 7 ++++--- packages/svelte/src/internal/server/context.js | 5 +++-- packages/svelte/types/index.d.ts | 4 ++-- 4 files changed, 10 insertions(+), 8 deletions(-) diff --git a/documentation/docs/98-reference/.generated/shared-errors.md b/documentation/docs/98-reference/.generated/shared-errors.md index 739bd58b35f5..9ab05262e74e 100644 --- a/documentation/docs/98-reference/.generated/shared-errors.md +++ b/documentation/docs/98-reference/.generated/shared-errors.md @@ -78,7 +78,7 @@ Certain lifecycle methods can only be used during component initialisation. To f Context was not set in a parent component ``` -The [`createContext()`](svelte#createContext) utility returns a `[get, set]` pair of functions. `get` will throw an error if `set` was not used to set the context in a parent component. +The [`createContext()`](svelte#createContext) utility returns a `[get, set, has]` triplet of functions. `get` will throw an error if `set` was not used to set the context in a parent component. ### snippet_without_render_tag diff --git a/packages/svelte/src/internal/client/context.js b/packages/svelte/src/internal/client/context.js index 0baef5c63e5c..524bd4cd06b7 100644 --- a/packages/svelte/src/internal/client/context.js +++ b/packages/svelte/src/internal/client/context.js @@ -70,12 +70,12 @@ export function set_dev_current_component_function(fn) { } /** - * Returns a `[get, set]` pair of functions for working with context in a type-safe way. + * Returns a `[get, set, has]` triplet of functions for working with context in a type-safe way. * * `get` will throw an error if no parent component called `set`. * * @template T - * @returns {[() => T, (context: T) => T]} + * @returns {[() => T, (context: T) => T, () => boolean]} * @since 5.40.0 */ export function createContext() { @@ -89,7 +89,8 @@ export function createContext() { return getContext(key); }, - (context) => setContext(key, context) + (context) => setContext(key, context), + () => hasContext(key) ]; } diff --git a/packages/svelte/src/internal/server/context.js b/packages/svelte/src/internal/server/context.js index 6a7dc1f88323..18d193478350 100644 --- a/packages/svelte/src/internal/server/context.js +++ b/packages/svelte/src/internal/server/context.js @@ -12,7 +12,7 @@ export function set_ssr_context(v) { /** * @template T - * @returns {[() => T, (context: T) => T]} + * @returns {[() => T, (context: T) => T, () => boolean]} * @since 5.40.0 */ export function createContext() { @@ -26,7 +26,8 @@ export function createContext() { return getContext(key); }, - (context) => setContext(key, context) + (context) => setContext(key, context), + () => hasContext(key) ]; } diff --git a/packages/svelte/types/index.d.ts b/packages/svelte/types/index.d.ts index 5f41fabf60cd..1cccb7b5f807 100644 --- a/packages/svelte/types/index.d.ts +++ b/packages/svelte/types/index.d.ts @@ -492,13 +492,13 @@ declare module 'svelte' { */ export function fork(fn: () => void): Fork; /** - * Returns a `[get, set]` pair of functions for working with context in a type-safe way. + * Returns a `[get, set, has]` triplet of functions for working with context in a type-safe way. * * `get` will throw an error if no parent component called `set`. * * @since 5.40.0 */ - export function createContext(): [() => T, (context: T) => T]; + export function createContext(): [() => T, (context: T) => T, () => boolean]; /** * Retrieves the context that belongs to the closest parent component with the specified `key`. * Must be called during component initialisation. From acfe39bcb1b26a2c4d574a073c9963989c935089 Mon Sep 17 00:00:00 2001 From: soleuniverse Date: Sat, 27 Jun 2026 07:12:31 +0200 Subject: [PATCH 2/5] test: has function in createContext test samples --- .../samples/create-context-programmatic/Child.svelte | 5 ++++- .../samples/create-context-programmatic/_config.js | 2 +- .../samples/create-context-programmatic/main.svelte | 12 +++++++----- .../samples/create-context/Child.svelte | 5 ++++- .../runtime-runes/samples/create-context/_config.js | 2 +- .../runtime-runes/samples/create-context/main.svelte | 4 ++-- 6 files changed, 19 insertions(+), 11 deletions(-) diff --git a/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/Child.svelte b/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/Child.svelte index 3e39d5043eff..97fae9ad7327 100644 --- a/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/Child.svelte +++ b/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/Child.svelte @@ -1,7 +1,10 @@

{message}

+{#if has()} +

it's me

+{/if} diff --git a/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/_config.js b/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/_config.js index f4374c8759db..e0f3ed68645e 100644 --- a/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/_config.js @@ -2,7 +2,7 @@ import { test } from '../../test'; export default test({ ssrHtml: `
`, - html: `

hello

`, + html: `

hello

it's me

`, test() {} }); diff --git a/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/main.svelte b/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/main.svelte index 3c42dbf1800e..327434aeca0d 100644 --- a/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/create-context-programmatic/main.svelte @@ -3,9 +3,9 @@ import Child from './Child.svelte'; /** @type {ReturnType>} */ - const [get, set] = createContext(); + const [get, set, has] = createContext(); - export { get }; + export { get, has }; function Wrapper(Component) { return (...args) => { @@ -15,6 +15,8 @@ } -
{ - mount(Wrapper(Child), { target }); -}}>
+
{ + mount(Wrapper(Child), { target }); + }} +>
diff --git a/packages/svelte/tests/runtime-runes/samples/create-context/Child.svelte b/packages/svelte/tests/runtime-runes/samples/create-context/Child.svelte index 3e39d5043eff..97fae9ad7327 100644 --- a/packages/svelte/tests/runtime-runes/samples/create-context/Child.svelte +++ b/packages/svelte/tests/runtime-runes/samples/create-context/Child.svelte @@ -1,7 +1,10 @@

{message}

+{#if has()} +

it's me

+{/if} diff --git a/packages/svelte/tests/runtime-runes/samples/create-context/_config.js b/packages/svelte/tests/runtime-runes/samples/create-context/_config.js index 4ae28e68bd05..4901788630fa 100644 --- a/packages/svelte/tests/runtime-runes/samples/create-context/_config.js +++ b/packages/svelte/tests/runtime-runes/samples/create-context/_config.js @@ -1,5 +1,5 @@ import { test } from '../../test'; export default test({ - html: `

hello

` + html: `

hello

it's me

` }); diff --git a/packages/svelte/tests/runtime-runes/samples/create-context/main.svelte b/packages/svelte/tests/runtime-runes/samples/create-context/main.svelte index 8d3c50ba5539..10b54eaa5c05 100644 --- a/packages/svelte/tests/runtime-runes/samples/create-context/main.svelte +++ b/packages/svelte/tests/runtime-runes/samples/create-context/main.svelte @@ -2,9 +2,9 @@ import { createContext } from 'svelte'; /** @type {ReturnType>} */ - const [get, set] = createContext(); + const [get, set, has] = createContext(); - export { get }; + export { get, has };