diff --git a/.changeset/short-feet-admire.md b/.changeset/short-feet-admire.md new file mode 100644 index 000000000000..48062bd053ca --- /dev/null +++ b/.changeset/short-feet-admire.md @@ -0,0 +1,5 @@ +--- +'svelte': minor +--- + +feat: add has function to createContext diff --git a/documentation/docs/06-runtime/02-context.md b/documentation/docs/06-runtime/02-context.md index 439272df8fac..20ebe3489301 100644 --- a/documentation/docs/06-runtime/02-context.md +++ b/documentation/docs/06-runtime/02-context.md @@ -4,7 +4,7 @@ title: Context Context allows components to access values owned by parent components without passing them down as props (potentially through many layers of intermediate components, known as 'prop-drilling'). -By creating a `[get, set]` pair of functions with `createContext`, you can set the context in a parent component and get it in a child component: +By creating a `[get, set, has]` triplet of functions with `createContext`, you can set the context in a parent component and get it in a child component: ```svelte @@ -51,6 +51,7 @@ interface User { name: string; } +// hasUserContext isn't needed here so it's not defined export const [getUserContext, setUserContext] = createContext(); ``` 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/messages/shared-errors/errors.md b/packages/svelte/messages/shared-errors/errors.md index 3ff474768ef3..2b878d195897 100644 --- a/packages/svelte/messages/shared-errors/errors.md +++ b/packages/svelte/messages/shared-errors/errors.md @@ -64,7 +64,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/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 };