diff --git a/.changeset/kind-clowns-melt.md b/.changeset/kind-clowns-melt.md
new file mode 100644
index 000000000..f6d8c3b52
--- /dev/null
+++ b/.changeset/kind-clowns-melt.md
@@ -0,0 +1,5 @@
+---
+"@marko/runtime-tags": patch
+---
+
+Fix issue where intersections were being added to an alias rather than the source binding.
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/.name-cache.json b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/.name-cache.json
new file mode 100644
index 000000000..db413faf9
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/.name-cache.json
@@ -0,0 +1,5 @@
+{
+ "vars": {
+ "props": {}
+ }
+}
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/csr-sanitized.expected.md b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/csr-sanitized.expected.md
new file mode 100644
index 000000000..f7754cfe1
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/csr-sanitized.expected.md
@@ -0,0 +1,7 @@
+# Render `{"a":"foo","b":"bar"}`
+
+```html
+
+ foofoobar
+
+```
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/csr.expected.md b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/csr.expected.md
new file mode 100644
index 000000000..b8cf1396d
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/csr.expected.md
@@ -0,0 +1,12 @@
+# Render `{"a":"foo","b":"bar"}`
+
+```html
+
+ foofoobar
+
+```
+
+# Mutations
+```
+INSERT div
+```
\ No newline at end of file
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/dom.expected/template.hydrate.js b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/dom.expected/template.hydrate.js
new file mode 100644
index 000000000..3eb9cd79d
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/dom.expected/template.hydrate.js
@@ -0,0 +1 @@
+// size: 0
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/dom.expected/template.js b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/dom.expected/template.js
new file mode 100644
index 000000000..db09a5615
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/dom.expected/template.js
@@ -0,0 +1,21 @@
+export const $template = "";
+export const $walks = /* next(1), replace, over(1), replace, out(1) */"D%b%l";
+export const $setup = () => {};
+import * as _$ from "@marko/runtime-tags/debug/dom";
+const $expr_a_b = /* @__PURE__ */_$.intersection(7, $scope => {
+ const {
+ input_a: a,
+ b
+ } = $scope;
+ _$.data($scope["#text/1"], a + b);
+});
+export const $input_a = /* @__PURE__ */_$.value("input_a", ($scope, input_a) => {
+ _$.data($scope["#text/0"], input_a);
+ $expr_a_b($scope);
+});
+export const $b = /* @__PURE__ */_$.value("b", $expr_a_b);
+export const $input = /* @__PURE__ */_$.value("input", ($scope, input) => {
+ $input_a($scope, input.a);
+ $b($scope, input.b);
+});
+export default /* @__PURE__ */_$.createTemplate("__tests__/template.marko", $template, $walks, $setup, $input);
\ No newline at end of file
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/html.expected/template.js b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/html.expected/template.js
new file mode 100644
index 000000000..6f8d79af9
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/html.expected/template.js
@@ -0,0 +1,16 @@
+import * as _$ from "@marko/runtime-tags/debug/html";
+export default _$.createTemplate("__tests__/template.marko", (input, $serialize) => {
+ const $scope0_id = _$.nextScopeId();
+ const {
+ a,
+ b
+ } = input;
+ _$.write(`${_$.escapeXML(input.a)}${_$.markResumeNode($scope0_id, "#text/0", _$.serializeGuard($serialize, /* input.a */2))}${_$.commentSeparator(_$.serializeGuard($serialize, /* a,b */0))}${_$.escapeXML(a + b)}${_$.markResumeNode($scope0_id, "#text/1", _$.serializeGuard($serialize, /* a,b */0))}
`);
+ _$.serializeGuard($serialize, /* input.a,a,b */1) && _$.writeScope($scope0_id, {
+ input_a: _$.serializeIf($serialize, /* input.b */4) && input.a,
+ b: _$.serializeIf($serialize, /* input.a */3) && b
+ }, "__tests__/template.marko", 0, {
+ input_a: "1:9",
+ b: "1:12"
+ });
+});
\ No newline at end of file
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/resume-sanitized.expected.md b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/resume-sanitized.expected.md
new file mode 100644
index 000000000..f7754cfe1
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/resume-sanitized.expected.md
@@ -0,0 +1,7 @@
+# Render `{"a":"foo","b":"bar"}`
+
+```html
+
+ foofoobar
+
+```
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/resume.expected.md b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/resume.expected.md
new file mode 100644
index 000000000..8518c5447
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/resume.expected.md
@@ -0,0 +1,12 @@
+# Render `{"a":"foo","b":"bar"}`
+
+```html
+
+
+
+ foofoobar
+
+
+
+```
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/ssr-sanitized.expected.md b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/ssr-sanitized.expected.md
new file mode 100644
index 000000000..b9e26fd01
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/ssr-sanitized.expected.md
@@ -0,0 +1,6 @@
+# Render End
+```html
+
+ foofoobar
+
+```
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/ssr.expected.md b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/ssr.expected.md
new file mode 100644
index 000000000..a78401498
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/__snapshots__/ssr.expected.md
@@ -0,0 +1,25 @@
+# Write
+```html
+ foofoobar
+```
+
+# Render End
+```html
+
+
+
+ foofoobar
+
+
+
+```
+
+# Mutations
+```
+INSERT html
+INSERT html/head
+INSERT html/body
+INSERT html/body/div
+INSERT html/body/div/#text
+```
\ No newline at end of file
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/template.marko b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/template.marko
new file mode 100644
index 000000000..26a7a9a1f
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/template.marko
@@ -0,0 +1,6 @@
+const/{ a, b }=input
+
+div
+ -- ${input.a}
+ -- ${a + b}
+
diff --git a/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/test.ts b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/test.ts
new file mode 100644
index 000000000..e989fe3af
--- /dev/null
+++ b/packages/runtime-tags/src/__tests__/fixtures/destructure-and-member-intersection/test.ts
@@ -0,0 +1 @@
+export const steps = [{ a: "foo", b: "bar" }];
diff --git a/packages/runtime-tags/src/translator/util/signals.ts b/packages/runtime-tags/src/translator/util/signals.ts
index 78a1e92c9..dabbb3264 100644
--- a/packages/runtime-tags/src/translator/util/signals.ts
+++ b/packages/runtime-tags/src/translator/util/signals.ts
@@ -520,13 +520,18 @@ function getTranslatedExtraArgs(signal: { extraArgs?: t.Expression[] }) {
return emptyExtraArgs;
}
-export function subscribe(provider: ReferencedBindings, subscriber: Signal) {
- if (Array.isArray(provider)) {
- provider.forEach((p) => subscribe(p, subscriber));
- return;
+export function subscribe(references: ReferencedBindings, subscriber: Signal) {
+ if (references) {
+ forEach(references, (binding) => {
+ const source =
+ (binding.property === undefined && binding.upstreamAlias) || binding;
+ const providerSignal = getSignal(subscriber.section, source);
+ providerSignal.intersection = push(
+ providerSignal.intersection,
+ subscriber,
+ );
+ });
}
- const providerSignal = getSignal(subscriber.section, provider);
- providerSignal.intersection = push(providerSignal.intersection, subscriber);
}
function generateSignalName(referencedBindings?: ReferencedBindings) {