Skip to content

Add a test that verifies @model is stable between route transitions#20959

Closed
Windvis wants to merge 4 commits intoemberjs:mainfrom
Windvis:fix/unstable-@model-value-when-transitioning-between-routes
Closed

Add a test that verifies @model is stable between route transitions#20959
Windvis wants to merge 4 commits intoemberjs:mainfrom
Windvis:fix/unstable-@model-value-when-transitioning-between-routes

Conversation

@Windvis
Copy link
Contributor

@Windvis Windvis commented Aug 1, 2025

This adds a failing test for the issue mentioned in #18987 based on the StackBlitz reproduction and supersedes #19257.

I needed to do some changes to the Vite and CI setup to make the @glimmer/component imports working in the test files. Not sure if what I did is the best solution but it works for the reproduction at least.

This test doesn't actually reproduce the problem since a Glimmer component seems needed for that.
@github-actions
Copy link
Contributor

github-actions bot commented Aug 1, 2025

Estimated Asset Sizes

Diff

Details

This PRmain
╔═══════╤═══════════╤═══════════╗
║       │ Min       │ Gzip      ║
╟───────┼───────────┼───────────╢
║ Total │ 408.84 KB │ 228.88 KB ║
╚═══════╧═══════════╧═══════════╝

╔══════════════════════╤═══════════╤══════════╗
║ @ember/*             │ Min       │ Gzip     ║
╟──────────────────────┼───────────┼──────────╢
║ Total                │ 239.23 KB │ 147.2 KB ║
╟──────────────────────┼───────────┼──────────╢
║ -internals           │ 35.44 KB  │ 25.49 KB ║
║ application          │ 12.83 KB  │ 7.62 KB  ║
║ array                │ 12.66 KB  │ 7.32 KB  ║
║ canary-features      │ 304 B     │ 419 B    ║
║ component            │ 1.07 KB   │ 1004 B   ║
║ controller           │ 1.8 KB    │ 1.36 KB  ║
║ debug                │ 11.4 KB   │ 7.92 KB  ║
║ deprecated-features  │ 31 B      │ 77 B     ║
║ destroyable          │ 561 B     │ 383 B    ║
║ enumerable           │ 259 B     │ 387 B    ║
║ helper               │ 823 B     │ 570 B    ║
║ instrumentation      │ 2.43 KB   │ 1.78 KB  ║
║ modifier             │ 669 B     │ 614 B    ║
║ object               │ 33.78 KB  │ 20.79 KB ║
║ owner                │ 159 B     │ 178 B    ║
║ renderer             │ 385 B     │ 327 B    ║
║ routing              │ 58.05 KB  │ 33.43 KB ║
║ runloop              │ 2.2 KB    │ 1.33 KB  ║
║ service              │ 859 B     │ 741 B    ║
║ template             │ 430 B     │ 390 B    ║
║ template-compilation │ 429 B     │ 366 B    ║
║ template-compiler    │ 57.81 KB  │ 30.44 KB ║
║ template-factory     │ 94 B      │ 160 B    ║
║ test                 │ 923 B     │ 627 B    ║
║ utils                │ 3.93 KB   │ 3.5 KB   ║
║ version              │ 55 B      │ 131 B    ║
╚══════════════════════╧═══════════╧══════════╝

╔═════════════════╤═══════════╤══════════╗
║ @glimmer/*      │ Min       │ Gzip     ║
╟─────────────────┼───────────┼──────────╢
║ Total           │ 169.61 KB │ 81.68 KB ║
╟─────────────────┼───────────┼──────────╢
║ destroyable     │ 2.7 KB    │ 1.35 KB  ║
║ encoder         │ 596 B     │ 653 B    ║
║ env             │ 38 B      │ 87 B     ║
║ global-context  │ 886 B     │ 545 B    ║
║ manager         │ 12.19 KB  │ 5.44 KB  ║
║ node            │ 2.71 KB   │ 1.81 KB  ║
║ opcode-compiler │ 29.89 KB  │ 13.23 KB ║
║ owner           │ 159 B     │ 202 B    ║
║ program         │ 7.1 KB    │ 3.63 KB  ║
║ reference       │ 5.51 KB   │ 3.18 KB  ║
║ runtime         │ 95.26 KB  │ 42.51 KB ║
║ tracking        │ 989 B     │ 961 B    ║
║ util            │ 3.03 KB   │ 2.29 KB  ║
║ validator       │ 6 KB      │ 3.72 KB  ║
║ vm              │ 784 B     │ 798 B    ║
║ wire-format     │ 1.84 KB   │ 1.35 KB  ║
╚═════════════════╧═══════════╧══════════╝
╔═══════╤═══════════╤═══════════╗
║       │ Min       │ Gzip      ║
╟───────┼───────────┼───────────╢
║ Total │ 408.84 KB │ 228.88 KB ║
╚═══════╧═══════════╧═══════════╝

╔══════════════════════╤═══════════╤══════════╗
║ @ember/*             │ Min       │ Gzip     ║
╟──────────────────────┼───────────┼──────────╢
║ Total                │ 239.23 KB │ 147.2 KB ║
╟──────────────────────┼───────────┼──────────╢
║ -internals           │ 35.44 KB  │ 25.49 KB ║
║ application          │ 12.83 KB  │ 7.62 KB  ║
║ array                │ 12.66 KB  │ 7.32 KB  ║
║ canary-features      │ 304 B     │ 419 B    ║
║ component            │ 1.07 KB   │ 1004 B   ║
║ controller           │ 1.8 KB    │ 1.36 KB  ║
║ debug                │ 11.4 KB   │ 7.92 KB  ║
║ deprecated-features  │ 31 B      │ 77 B     ║
║ destroyable          │ 561 B     │ 383 B    ║
║ enumerable           │ 259 B     │ 387 B    ║
║ helper               │ 823 B     │ 570 B    ║
║ instrumentation      │ 2.43 KB   │ 1.78 KB  ║
║ modifier             │ 669 B     │ 614 B    ║
║ object               │ 33.78 KB  │ 20.79 KB ║
║ owner                │ 159 B     │ 178 B    ║
║ renderer             │ 385 B     │ 327 B    ║
║ routing              │ 58.05 KB  │ 33.43 KB ║
║ runloop              │ 2.2 KB    │ 1.33 KB  ║
║ service              │ 859 B     │ 741 B    ║
║ template             │ 430 B     │ 390 B    ║
║ template-compilation │ 429 B     │ 366 B    ║
║ template-compiler    │ 57.81 KB  │ 30.44 KB ║
║ template-factory     │ 94 B      │ 160 B    ║
║ test                 │ 923 B     │ 627 B    ║
║ utils                │ 3.93 KB   │ 3.5 KB   ║
║ version              │ 55 B      │ 131 B    ║
╚══════════════════════╧═══════════╧══════════╝

╔═════════════════╤═══════════╤══════════╗
║ @glimmer/*      │ Min       │ Gzip     ║
╟─────────────────┼───────────┼──────────╢
║ Total           │ 169.61 KB │ 81.68 KB ║
╟─────────────────┼───────────┼──────────╢
║ destroyable     │ 2.7 KB    │ 1.35 KB  ║
║ encoder         │ 596 B     │ 653 B    ║
║ env             │ 38 B      │ 87 B     ║
║ global-context  │ 886 B     │ 545 B    ║
║ manager         │ 12.19 KB  │ 5.44 KB  ║
║ node            │ 2.71 KB   │ 1.81 KB  ║
║ opcode-compiler │ 29.89 KB  │ 13.23 KB ║
║ owner           │ 159 B     │ 202 B    ║
║ program         │ 7.1 KB    │ 3.63 KB  ║
║ reference       │ 5.51 KB   │ 3.18 KB  ║
║ runtime         │ 95.26 KB  │ 42.51 KB ║
║ tracking        │ 989 B     │ 961 B    ║
║ util            │ 3.03 KB   │ 2.29 KB  ║
║ validator       │ 6 KB      │ 3.72 KB  ║
║ vm              │ 784 B     │ 798 B    ║
║ wire-format     │ 1.84 KB   │ 1.35 KB  ║
╚═════════════════╧═══════════╧══════════╝

@Windvis Windvis force-pushed the fix/unstable-@model-value-when-transitioning-between-routes branch from c96149a to e5ba618 Compare August 1, 2025 19:37
@Windvis Windvis force-pushed the fix/unstable-@model-value-when-transitioning-between-routes branch from 90cddad to 2622225 Compare August 1, 2025 19:52
We now import the `@glimmer/component` package in test files which requires it to be built before Vite runs.
@NullVoxPopuli
Copy link
Contributor

do you happen to know if this ever worked?

@Windvis
Copy link
Contributor Author

Windvis commented Aug 7, 2025

do you happen to know if this ever worked?

I don't think so, no. As far as I know it has been an issue since @model was introduced, which is why the template-lint rule exists.

It's just a tricky to reproduce issue so it seemed that it was "solved" at some point in time.

johanrd pushed a commit to johanrd/ember.js that referenced this pull request Mar 8, 2026
When transitioning between routes, the @model argument on a Glimmer
component becomes unstable during willDestroy - the model value changes
before the component is properly destroyed.

Requires @glimmer/component Vite alias to resolve in tests.

Based on PR emberjs#20959 by @Windvis.
@Windvis Windvis closed this Mar 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants