Skip to content

Commit b29e1e3

Browse files
committed
basic attachments working
1 parent 531e75d commit b29e1e3

File tree

8 files changed

+48
-1
lines changed

8 files changed

+48
-1
lines changed

packages/svelte/src/compiler/phases/3-transform/client/transform-client.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@ import { TitleElement } from './visitors/TitleElement.js';
5656
import { TransitionDirective } from './visitors/TransitionDirective.js';
5757
import { UpdateExpression } from './visitors/UpdateExpression.js';
5858
import { UseDirective } from './visitors/UseDirective.js';
59+
import { UseTag } from './visitors/UseTag.js';
5960
import { VariableDeclaration } from './visitors/VariableDeclaration.js';
6061

6162
/** @type {Visitors} */
@@ -131,6 +132,7 @@ const visitors = {
131132
TransitionDirective,
132133
UpdateExpression,
133134
UseDirective,
135+
UseTag,
134136
VariableDeclaration
135137
};
136138

packages/svelte/src/compiler/phases/3-transform/client/visitors/RegularElement.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ export function RegularElement(node, context) {
8282
/** @type {AST.StyleDirective[]} */
8383
const style_directives = [];
8484

85-
/** @type {Array<AST.AnimateDirective | AST.BindDirective | AST.OnDirective | AST.TransitionDirective | AST.UseDirective>} */
85+
/** @type {Array<AST.AnimateDirective | AST.BindDirective | AST.OnDirective | AST.TransitionDirective | AST.UseDirective | AST.UseTag>} */
8686
const other_directives = [];
8787

8888
/** @type {ExpressionStatement[]} */
@@ -152,6 +152,10 @@ export function RegularElement(node, context) {
152152
has_use = true;
153153
other_directives.push(attribute);
154154
break;
155+
156+
case 'UseTag':
157+
other_directives.push(attribute);
158+
break;
155159
}
156160
}
157161

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
/** @import { Expression } from 'estree' */
2+
/** @import { AST } from '#compiler' */
3+
/** @import { ComponentContext } from '../types' */
4+
import * as b from '../../../../utils/builders.js';
5+
6+
/**
7+
* @param {AST.UseTag} node
8+
* @param {ComponentContext} context
9+
*/
10+
export function UseTag(node, context) {
11+
context.state.init.push(
12+
b.stmt(
13+
b.call(
14+
'$.attach',
15+
context.state.node,
16+
b.thunk(/** @type {Expression} */ (context.visit(node.expression)))
17+
)
18+
)
19+
);
20+
context.next();
21+
}

packages/svelte/src/compiler/types/template.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -553,6 +553,7 @@ export namespace AST {
553553
| AST.Attribute
554554
| AST.SpreadAttribute
555555
| Directive
556+
| AST.UseTag
556557
| AST.Comment
557558
| Block;
558559

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { effect } from '../../reactivity/effects.js';
2+
3+
/**
4+
* @param {Element} node
5+
* @param {() => (node: Element) => void} get_fn
6+
*/
7+
export function attach(node, get_fn) {
8+
effect(() => {
9+
get_fn()(node);
10+
});
11+
}

packages/svelte/src/internal/client/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ export { element } from './dom/blocks/svelte-element.js';
2727
export { head } from './dom/blocks/svelte-head.js';
2828
export { append_styles } from './dom/css.js';
2929
export { action } from './dom/elements/actions.js';
30+
export { attach } from './dom/elements/attachments.js';
3031
export {
3132
remove_input_defaults,
3233
set_attribute,
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
import { test } from '../../test';
2+
3+
export default test({
4+
ssrHtml: `<div></div>`,
5+
html: `<div>DIV</div>`
6+
});
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
<div {@use (node) => node.textContent = node.nodeName}></div>

0 commit comments

Comments
 (0)