Skip to content

Commit 994337c

Browse files
authored
fix(rendering): remove render instructions from slot expressions (#10747)
1 parent 12e34e3 commit 994337c

File tree

7 files changed

+45
-4
lines changed

7 files changed

+45
-4
lines changed

.changeset/calm-mails-check.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"astro": patch
3+
---
4+
5+
Fixes an issue where functions could not be used as named slots.

packages/astro/src/core/render/index.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import type { Pipeline } from '../base-pipeline.js';
33
export { Pipeline } from '../base-pipeline.js';
44
export { getParams, getProps } from './params-and-props.js';
55
export { loadRenderer } from './renderer.js';
6-
export { Slots } from './result.js';
6+
export { Slots } from './slots.js';
77

88
export interface SSROptions {
99
/** The pipeline instance */

packages/astro/src/core/render/result.ts renamed to packages/astro/src/core/render/slots.ts

+4-2
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,15 @@ import type { SSRResult } from '../../@types/astro.js';
22
import { type ComponentSlots, renderSlotToString } from '../../runtime/server/index.js';
33
import { renderJSX } from '../../runtime/server/jsx.js';
44
import { chunkToString } from '../../runtime/server/render/index.js';
5+
import { isRenderInstruction } from '../../runtime/server/render/instruction.js';
56
import { AstroError, AstroErrorData } from '../errors/index.js';
67
import type { Logger } from '../logger/core.js';
78

89
function getFunctionExpression(slot: any) {
910
if (!slot) return;
10-
if (slot.expressions?.length !== 1) return;
11-
return slot.expressions[0] as (...args: any[]) => any;
11+
const expressions = slot?.expressions?.filter((e: unknown) => isRenderInstruction(e) === false);
12+
if (expressions?.length !== 1) return
13+
return expressions[0] as (...args: any[]) => any;
1214
}
1315

1416
export class Slots {

packages/astro/src/runtime/server/render/astro/render-template.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ const renderTemplateResultSym = Symbol.for('astro.renderTemplateResult');
1111
export class RenderTemplateResult {
1212
public [renderTemplateResultSym] = true;
1313
private htmlParts: TemplateStringsArray;
14-
private expressions: any[];
14+
public expressions: any[];
1515
private error: Error | undefined;
1616
constructor(htmlParts: TemplateStringsArray, expressions: unknown[]) {
1717
this.htmlParts = htmlParts;

packages/astro/test/astro-slots.test.js

+11
Original file line numberDiff line numberDiff line change
@@ -170,4 +170,15 @@ describe('Slots', () => {
170170
assert.notEqual(third.children[0].data, first.children[0].data);
171171
}
172172
});
173+
174+
it("Arguments can be passed to named slots with Astro.slots.render()", async () => {
175+
const html = await fixture.readFile('/slotted-named-functions/index.html');
176+
const $ = cheerio.load(html);
177+
const befor = $("div#before");
178+
const [ beforeDiv ] = befor.children("div")
179+
assert.deepEqual(beforeDiv.firstChild.data, "Test Content BEFORE")
180+
const after = $("div#after");
181+
const [ afterDiv ] = after.children("div");
182+
assert.deepEqual(afterDiv.firstChild.data, "Test Content AFTER")
183+
});
173184
});
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
const content = 'Test Content';
3+
const beforeConent = await Astro.slots.render("before", [{content}])
4+
const afterConent = await Astro.slots.render("after", [{content}])
5+
---
6+
<div id="before">
7+
{beforeConent}
8+
</div>
9+
<div id="after">
10+
{afterConent}
11+
</div>
12+
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
---
2+
import Field from '../components/FunctionsToAPI.astro'
3+
---
4+
<Field>
5+
<div slot="before">
6+
{({content}) => <div>{content} BEFORE</div>}
7+
</div>
8+
<div slot="after">
9+
{({content}) => <div>{content} AFTER</div>}
10+
</div>
11+
</Field>

0 commit comments

Comments
 (0)