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) {