diff --git a/packages/svelte/src/internal/client/custom-renderer/index.js b/packages/svelte/src/internal/client/custom-renderer/index.js index b55dd707b7..f01f9b66d6 100644 --- a/packages/svelte/src/internal/client/custom-renderer/index.js +++ b/packages/svelte/src/internal/client/custom-renderer/index.js @@ -1,5 +1,7 @@ +/** @import { ComponentContext } from '#client' */ import { boundary } from '../dom/blocks/boundary.js'; import { branch, effect_root } from '../reactivity/effects.js'; +import { push, pop, component_context } from '../context.js'; import { push_renderer } from './state.js'; /** @@ -36,7 +38,7 @@ import { push_renderer } from './state.js'; * @template {object} [TTextNode=object] * @template {object} [TComment=object] * @param {Renderer} renderer - * @returns {Renderer & { render: (Component: any, options: { target: TFragment | TElement | TTextNode | TComment, props?: any }) => () => void }} + * @returns {Renderer & { render: (Component: any, options: { target: TFragment | TElement | TTextNode | TComment, props?: any, context?: Map }) => () => void }} */ export function createRenderer(renderer) { return { @@ -45,15 +47,19 @@ export function createRenderer(renderer) { * @param {*} Component * @param {*} options */ - render(Component, { target, props }) { + render(Component, { target, props, context }) { var cleanup = push_renderer(renderer); const unmount = effect_root(() => { var anchor = renderer.createComment(''); renderer.insert(target, anchor, null); boundary(/** @type {*} */ (anchor), { pending: () => {} }, (anchor) => { + push({}); + var ctx = /** @type {ComponentContext} */ (component_context); + if (context) ctx.c = context; branch(() => { Component(anchor, props); }); + pop(); }); }); cleanup(); diff --git a/packages/svelte/tests/custom-renderers/samples/context-from-render/_config.js b/packages/svelte/tests/custom-renderers/samples/context-from-render/_config.js new file mode 100644 index 0000000000..8a195e74c4 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/context-from-render/_config.js @@ -0,0 +1,6 @@ +import { test } from '../../test'; + +export default test({ + html: 'hello from render', + context: new Map([['message', 'hello from render']]) +}); diff --git a/packages/svelte/tests/custom-renderers/samples/context-from-render/main.svelte b/packages/svelte/tests/custom-renderers/samples/context-from-render/main.svelte new file mode 100644 index 0000000000..22ee36eaa6 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/context-from-render/main.svelte @@ -0,0 +1,7 @@ + + +{message} diff --git a/packages/svelte/tests/custom-renderers/samples/context/Child.svelte b/packages/svelte/tests/custom-renderers/samples/context/Child.svelte new file mode 100644 index 0000000000..22ee36eaa6 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/context/Child.svelte @@ -0,0 +1,7 @@ + + +{message} diff --git a/packages/svelte/tests/custom-renderers/samples/context/_config.js b/packages/svelte/tests/custom-renderers/samples/context/_config.js new file mode 100644 index 0000000000..1b24e41a08 --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/context/_config.js @@ -0,0 +1,5 @@ +import { test } from '../../test'; + +export default test({ + html: '
hello from context
' +}); diff --git a/packages/svelte/tests/custom-renderers/samples/context/main.svelte b/packages/svelte/tests/custom-renderers/samples/context/main.svelte new file mode 100644 index 0000000000..a8dfae24bf --- /dev/null +++ b/packages/svelte/tests/custom-renderers/samples/context/main.svelte @@ -0,0 +1,10 @@ + + +
+ +
diff --git a/packages/svelte/tests/custom-renderers/shared.ts b/packages/svelte/tests/custom-renderers/shared.ts index 0f496257aa..80461521cf 100644 --- a/packages/svelte/tests/custom-renderers/shared.ts +++ b/packages/svelte/tests/custom-renderers/shared.ts @@ -11,6 +11,7 @@ export interface CustomRendererTest extends BaseTest { html?: string; compileOptions?: Partial; props?: Record; + context?: Map; error?: string; compile_error?: string; runtime_error?: string; @@ -136,7 +137,8 @@ async function run_test(cwd: string, config: CustomRendererTest, compile_options try { unmount = renderer.render(mod.default, { target, - props: config.props ?? {} + props: config.props ?? {}, + context: config.context }); } catch (err) { if (config.error) {