Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
138 commits
Select commit Hold shift + click to select a range
b7128a1
Implement the Route Manager API (RFC #1169)
evoactivity Jun 9, 2026
68781db
fix typescript problem
evoactivity Jun 10, 2026
7582a9f
moves the route manager types up a level to avoid the nonsense the ty…
evoactivity Jun 15, 2026
07c5731
update tree shakability snapshots
evoactivity Jun 15, 2026
67fbf1d
add a few missing public exports
evoactivity Jun 15, 2026
347cefd
ensure classic substate lookups only run for classic manager routes
evoactivity Jun 15, 2026
c3b21ec
remove wrapper from base RouteStateBucket interface
evoactivity Jun 15, 2026
20fcd21
remove name from classic route wrapper
evoactivity Jun 15, 2026
72c3303
remove lookup intercept
evoactivity Jun 24, 2026
d84de44
add a getRenderState to the manager contract
evoactivity Jun 24, 2026
da6320d
change classic route manager wrapper to use context instead of model
evoactivity Jun 24, 2026
a71f713
fix broken getAncestorContext
evoactivity Jun 25, 2026
02aea99
EmberRouter.getRoute now returns unknown
evoactivity Jun 25, 2026
edb1ebf
Merge branch 'main' into rfc-1169-route-manager
evoactivity Jun 25, 2026
2fc7e31
try to fix tree-shakability test
evoactivity Jun 25, 2026
c088ca8
update tree-shakability snapshot
evoactivity Jun 25, 2026
985d3c6
remove intercept
evoactivity Jun 25, 2026
1663f21
refactor: add manager.getRoute(bucket)
BobrImperator Jun 25, 2026
6be29bb
remove isBaseRoute
evoactivity Jun 25, 2026
f487008
Merge pull request #2 from mainmatter/bart/rfc-1169-route-manager
evoactivity Jun 29, 2026
2cd2a65
remove fallback path for legacy templates and upgrade templates passe…
evoactivity Jun 29, 2026
5cc6e62
keep `getRoute` as returning `unknown`
evoactivity Jun 29, 2026
dd3d59a
uses the bucket to pass in the controller to the wrapper component
evoactivity Jun 29, 2026
83ce52e
ensure RouteStateBucket is fully opaque
evoactivity Jun 29, 2026
ac6c449
remove knowledge of controller's from the route-template component ma…
evoactivity Jun 30, 2026
68f01b8
move const ref args from outlet helper to route manager
evoactivity Jun 30, 2026
3cc6787
add comment explaining why we need to await the enter promise to back…
evoactivity Jun 30, 2026
5a344c4
pass enterPromise directly to resolved route info
evoactivity Jun 30, 2026
ffa1b8e
undo route info passthrough
evoactivity Jul 1, 2026
b040925
add getRoute to route manager contract
evoactivity Jul 1, 2026
29d6bdc
- fable found dead code, remove it
evoactivity Jul 2, 2026
81f9dab
fable improved how manager and bucket are accessed in the framework: …
evoactivity Jul 2, 2026
ccb71e4
remove classic lifecycle duplication and route substate handling thro…
evoactivity Jul 2, 2026
6d32e47
simplify the outlet render path
evoactivity Jul 2, 2026
c815301
restore two classic behaviors dropped by the manager extraction, with…
evoactivity Jul 2, 2026
0377177
small cleanups across the route lookup and ancestor-context paths
evoactivity Jul 2, 2026
0b7fe86
keep the getRouteWrapper module-stable, make the wrapper optional, an…
evoactivity Jul 2, 2026
796dc96
deliver all outlet args via the curried render target
evoactivity Jul 2, 2026
d5da652
Merge remote-tracking branch 'upstream/main' into rfc-1169-route-manager
evoactivity Jul 2, 2026
166f902
rename managed route functions to route management
evoactivity Jul 2, 2026
945b6bf
fix lints
evoactivity Jul 3, 2026
a93e6cf
remove removed barrel file from renamed-modules
evoactivity Jul 3, 2026
0f6de0d
feat: add a produeContext callback to routeManager
BobrImperator Jul 6, 2026
e51fee2
Merge branch 'main' into rfc-1169-route-manager
BobrImperator Jul 16, 2026
68fc807
small experiment with a new @outlet
mansona Jul 8, 2026
c0522c5
fix: invoke outlet helper before passing it as named arg
BobrImperator Jul 8, 2026
4b0f767
feat: transform {{outlet}} to <@outlet />
BobrImperator Jul 9, 2026
b9663d8
WIP: fix debug render tree?
mansona Jul 9, 2026
eb25131
try to use renderComponent for toplevel
mansona Jul 13, 2026
4ce9867
fix: error while rendering outlet without dynamicScope
BobrImperator Jul 13, 2026
e942972
feat: creat a root-outlet.ts to replace the -outlet view
BobrImperator Jul 13, 2026
7b90594
refactor: cleanup OutletView and OutletTemplate
BobrImperator Jul 13, 2026
eb11aa1
fix: pass renderer to resolve {{mount}}. Fix rootElement on boot
BobrImperator Jul 14, 2026
9d626c1
wip: bulk AI test fixes
BobrImperator Jul 14, 2026
809cbc4
fix: avoid circular dependency cycle
BobrImperator Jul 15, 2026
6382317
refactor: uncomment debug-render-tree tests
BobrImperator Jul 16, 2026
523d52e
run format
BobrImperator Jul 16, 2026
91ba5f6
refactor: move outlet beside route-manager
BobrImperator Jul 20, 2026
2f5eac9
chore: use @ember-test-helpers patch emberjs/ember-test-helpers#1573
BobrImperator Jul 20, 2026
9c6f170
fix: change the node-tests harness to align with emberjs/ember-test-h…
BobrImperator Jul 20, 2026
e9541dc
Merge pull request #4 from mainmatter/test-new-outlet
BobrImperator Jul 20, 2026
9944b17
test: scenario funky route manager
BobrImperator Jul 21, 2026
89fad30
Merge pull request #5 from mainmatter/rfc-1169-scenario-funky-route-m…
BobrImperator Jul 22, 2026
6479e4b
feat: re-export makeRouteTemplate for pioneer-manager
BobrImperator Jul 27, 2026
4ce8cc8
wip: remove OutletComponent construction from outlet
BobrImperator Jul 28, 2026
cf6abee
wip: cache outlet renders again
BobrImperator Jul 28, 2026
5f6b811
wip: probes
BobrImperator Jul 27, 2026
4531356
fix: wrapper doesn't need to double call helper
BobrImperator Jul 28, 2026
e8d4faf
refactor: move outlet component caching into OutletComponent
BobrImperator Jul 28, 2026
a18167b
perf: build @outlet in prepareArgs instead of calling (outlet)
BobrImperator Jul 28, 2026
d72e0ac
perf: select the outlet layout via getDynamicLayout
BobrImperator Jul 29, 2026
1c7ddd8
refactor: move producing the context value to the OutletComponent
BobrImperator Jul 28, 2026
156c47c
refactor: drop unread controller from OutletDefinitionState
BobrImperator Jul 28, 2026
b4db280
refactor: add getRenderInvokable to manager
BobrImperator Jul 29, 2026
be50cad
refactor: remove outletState channel and outletHelper
BobrImperator Jul 29, 2026
f2ace86
feat: kill wrapper manager
BobrImperator Aug 4, 2026
7dbd25a
feat: encapsulate classic in OutletComponent
BobrImperator Aug 4, 2026
3e05dd1
refactor: remove manager specific fields from renderState
BobrImperator Aug 4, 2026
2d7c98a
feat: remove wrapper -> outlet is the wrapper now
BobrImperator Aug 4, 2026
8d77b14
cleanup: remove probes
BobrImperator Aug 5, 2026
4d64588
chore: cleanup comments
BobrImperator Aug 5, 2026
3cbdaa1
refactor: reactivity via BucketRenderState
BobrImperator Aug 5, 2026
7d4fb50
refactor: make renderstate tracked
BobrImperator Aug 5, 2026
1f8d011
refactor: remove unnecessary static method
BobrImperator Aug 5, 2026
582dda2
refactor: remove getRenderContext, cleanup unused owner
BobrImperator Aug 5, 2026
66cc2e7
refactor: merge outlet-template with manager
BobrImperator Aug 5, 2026
9cf90fc
Collapse route rendering layers into manager and outlet-component
BobrImperator Aug 5, 2026
2364c8e
Merge remote-tracking branch 'mm/main' into rfc-1169-route-manager
BobrImperator Aug 5, 2026
a9ab0d3
spike: better outlet authoring
BobrImperator Aug 11, 2026
fcb7291
Merge remote-tracking branch 'mm/main' into rfc-1169-route-manager
BobrImperator Aug 11, 2026
d52e39b
refactor: move to an arg provider
BobrImperator Aug 13, 2026
c1133ea
feat: provide @context via outletState
BobrImperator Aug 18, 2026
0c91449
Merge pull request #9 from mainmatter/rfc-1169-route-manager-drop-spike
BobrImperator Aug 18, 2026
c5d5895
Merge remote-tracking branch 'mm/main' into rfc-1169-route-manager
BobrImperator Aug 18, 2026
7d9fbb8
wip: remove getRenderState
BobrImperator Aug 18, 2026
d0af721
refactor: remove enterPromise. non-async getInvokable. invokable cach…
BobrImperator Aug 19, 2026
62f492b
feat: bring back async getInvokable
BobrImperator Aug 24, 2026
3994233
refactor: unify tests and align them with current impl
BobrImperator Aug 24, 2026
6855656
feat: remove _internalName from BaseRoute
BobrImperator Aug 24, 2026
294c00f
feat: remove accessibleByURL from BaseRoute
BobrImperator Aug 24, 2026
8ba671f
refactor: rename getAncestorContext to getAncestorPromise
BobrImperator Aug 25, 2026
c85fe05
feat: add trigger/handle method pairs for Loadign and Error substates
BobrImperator Aug 25, 2026
5f301bb
wip: always await enter before resolving route info
BobrImperator Aug 25, 2026
1f307f1
wip: keep original test titles for non-gating module
BobrImperator Aug 26, 2026
bb036e4
wip: launch non-classic enters eagerly without committing early
BobrImperator Aug 26, 2026
4756ae1
refactor: fold eager launch into existing params loop
BobrImperator Aug 26, 2026
a0edf37
test: drop early-render tests, cover parallel loading and classic order
BobrImperator Aug 26, 2026
92cd1f2
test: assert modelFor reads the ancestor model
BobrImperator Aug 26, 2026
d9bddfb
test: split classic and pioneer route timing scenarios
BobrImperator Aug 26, 2026
ac79b58
refactor: cache classic invokable per bucket, prime in willEnter
BobrImperator Aug 27, 2026
f3bc166
Merge pull request #13 from mainmatter/rfc-1169-always-await-enter
BobrImperator Aug 31, 2026
b8df467
fix: replace Invokable promise with resolved value
BobrImperator Aug 31, 2026
84d82e5
Merge pull request #11 from mainmatter/rfc-1169-route-manager-async-i…
BobrImperator Aug 31, 2026
469f8ef
fix: resolve routes only after enter and invokable have settled
BobrImperator Sep 1, 2026
47bbfce
test: transition is aborted when getInvokable rejects
BobrImperator Sep 1, 2026
fe49aee
Merge branch 'main' into rfc-1169-route-manager
BobrImperator Sep 2, 2026
ec94086
refactor(tests): split test setup and add helpers
BobrImperator Sep 7, 2026
0fdd03d
refactor: remove BaseRoute and route generic from router
BobrImperator Sep 7, 2026
ee221fa
feat: bubble route actions through manager invokeAction
BobrImperator Sep 7, 2026
2bb3f1a
refactor: remove ClassicRoute interface
BobrImperator Sep 7, 2026
a52c4b3
refactor: remove pivotHandler
BobrImperator Sep 7, 2026
d819465
refactor: substates reach routes through the bucket
BobrImperator Sep 8, 2026
6634943
refactor: substate origin identified by bucket
BobrImperator Sep 8, 2026
fb5d471
refactor: remove getRoute from route manager
BobrImperator Sep 8, 2026
ba21734
refactor: route info holds manager and bucket
BobrImperator Sep 8, 2026
7666e65
refactor: transitions no longer resolve with a route
BobrImperator Sep 8, 2026
285a95f
refactor: query params carry management not route
BobrImperator Sep 8, 2026
bfd31dd
test: cover query-params and custom actions dispatch on route
BobrImperator Sep 8, 2026
57fcf26
feat: renderRootComponent via Cursor
BobrImperator Sep 9, 2026
aad2b26
Merge remote-tracking branch 'mm/main' into rfc-1169-route-manager
BobrImperator Sep 9, 2026
c42eb83
types: restore router_js typings after BaseRoute removal
BobrImperator Sep 9, 2026
4ed25cb
test(refactor): remove bucket.invokable. fetch in getInvokable
BobrImperator Sep 14, 2026
d00dfe1
fix: classic should await all its ancestors
BobrImperator Sep 16, 2026
0a23974
fix: remove dynamicLayout: true from route-template
BobrImperator Sep 16, 2026
6bd55a8
fix: currentRouteName=null. updatePaths before router._setOutlets call.
BobrImperator Sep 16, 2026
12f0892
fix: remove hasSubOwner: true from route-template
BobrImperator Sep 16, 2026
5480d57
feat: remove ember-test-helpers patch in favor of emberjs/ember-test-…
BobrImperator Sep 21, 2026
e3e21da
chore: update @ember/test-helpers to 5.5.0
BobrImperator Sep 22, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ test/version_tmp
test_*.html
/tests/ember-tests.js
/smoke-tests/scenarios/output/
/smoke-tests/scenarios/output-*/
tmp
tmp*.gem
tmp.bpm
Expand Down
10 changes: 10 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -205,6 +205,16 @@
"@ember/-internals/metal/index.js": "ember-source/@ember/-internals/metal/index.js",
"@ember/-internals/owner/index.js": "ember-source/@ember/-internals/owner/index.js",
"@ember/-internals/routing/index.js": "ember-source/@ember/-internals/routing/index.js",
"@ember/-internals/routing/route-managers/api.js": "ember-source/@ember/-internals/routing/route-managers/api.js",
"@ember/-internals/routing/route-managers/classic/bucket.js": "ember-source/@ember/-internals/routing/route-managers/classic/bucket.js",
"@ember/-internals/routing/route-managers/classic/manager.js": "ember-source/@ember/-internals/routing/route-managers/classic/manager.js",
"@ember/-internals/routing/route-managers/classic/outlet-component.js": "ember-source/@ember/-internals/routing/route-managers/classic/outlet-component.js",
"@ember/-internals/routing/route-managers/classic/query-params.js": "ember-source/@ember/-internals/routing/route-managers/classic/query-params.js",
"@ember/-internals/routing/route-managers/classic/substates.js": "ember-source/@ember/-internals/routing/route-managers/classic/substates.js",
"@ember/-internals/routing/route-managers/management.js": "ember-source/@ember/-internals/routing/route-managers/management.js",
"@ember/-internals/routing/route-managers/outlet-state.js": "ember-source/@ember/-internals/routing/route-managers/outlet-state.js",
"@ember/-internals/routing/route-managers/registry.js": "ember-source/@ember/-internals/routing/route-managers/registry.js",
"@ember/-internals/routing/route-managers/root-outlet.js": "ember-source/@ember/-internals/routing/route-managers/root-outlet.js",
"@ember/-internals/runtime/index.js": "ember-source/@ember/-internals/runtime/index.js",
"@ember/-internals/runtime/lib/ext/rsvp.js": "ember-source/@ember/-internals/runtime/lib/ext/rsvp.js",
"@ember/-internals/runtime/lib/mixins/-proxy.js": "ember-source/@ember/-internals/runtime/lib/mixins/-proxy.js",
Expand Down
7 changes: 4 additions & 3 deletions packages/@ember/-internals/glimmer/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@
The documentation for `@ember/component` still refers to the older authoring format. To read about
the new authoring format, see the
[Glimmer Component API documentation](/ember/release/modules/@glimmer%2Fcomponent).

### Showing a property

Templates manage the flow of an application's UI, and display state (through
Expand Down Expand Up @@ -118,6 +118,7 @@ export { default as Input } from './lib/components/input';
export { default as LinkTo } from './lib/components/link-to';
export { default as Textarea } from './lib/components/textarea';
export { default as Component } from './lib/component';
export { makeRouteTemplate } from './lib/component-managers/route-template';
export {
default as Helper,
helper,
Expand All @@ -139,6 +140,7 @@ export {
_resetRenderers,
renderSettled,
renderComponent,
setRenderer,
type View,
} from './lib/renderer';
export {
Expand All @@ -156,8 +158,7 @@ export { DOMChanges, NodeDOMTreeConstruction, DOMTreeConstruction } from './lib/
// TODO just test these through public API
// a lot of these are testing how a problem was solved
// rather than the problem was solved
export { default as OutletView, type BootEnvironment } from './lib/views/outlet';
export type { OutletState, RenderState } from './lib/utils/outlet';
export type { BootEnvironment } from '@ember/engine/instance';
export {
componentCapabilities,
modifierCapabilities,
Expand Down
35 changes: 28 additions & 7 deletions packages/@ember/-internals/glimmer/lib/base-renderer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -426,6 +426,15 @@ interface RenderCacheEntry {
glimmerResult: GlimmerRenderResult | undefined;
}

// Cursor descriptor isn't a stable enough reference.
// Cursor fails during application teardown
type RendererCacheKey = Element | SimpleElement;

const isDOMElement = (into: IntoTarget): into is Element => 'innerHTML' in into;

const cacheKey = (into: IntoTarget): RendererCacheKey =>
'element' in into ? (into as Cursor).element : (into as RendererCacheKey);

function intoTarget(into: IntoTarget): Cursor {
if ('element' in into) {
return into;
Expand Down Expand Up @@ -527,14 +536,15 @@ export function renderComponent(
*
* NOTE: destruction is async
*/
let existing = RENDER_CACHE.get(into);
let key = cacheKey(into);
let existing = RENDER_CACHE.get(key);
existing?.result.destroy();
/**
* We can only replace the inner HTML the first time.
* Because destruction is async, it won't be safe to
* do this again, and we'll have to rely on the above destroy.
*/
if (!existing && into instanceof Element) {
if (!existing && isDOMElement(into)) {
into.innerHTML = '';
}

Expand All @@ -552,16 +562,19 @@ export function renderComponent(
*/
let renderTarget: IntoTarget = into;
if (existing?.glimmerResult) {
let parentElement =
into instanceof Element ? (into as unknown as SimpleElement) : (into as Cursor).element;
let firstNode = existing.glimmerResult.firstNode();
renderTarget = { element: parentElement, nextSibling: firstNode };
renderTarget = { element: key as SimpleElement, nextSibling: firstNode };
}

let innerResult = renderer.render(component, { into: renderTarget, args }).result;

if (innerResult) {
associateDestroyableChild(owner, innerResult);
registerDestructor(innerResult, () => {
if (RENDER_CACHE.get(key)?.glimmerResult === innerResult) {
RENDER_CACHE.delete(key);
}
});
}

let result: RenderResult = {
Expand All @@ -572,14 +585,22 @@ export function renderComponent(
},
};

RENDER_CACHE.set(into, { result, glimmerResult: innerResult });
RENDER_CACHE.set(key, { result, glimmerResult: innerResult });

return result;
}

const RENDER_CACHE = new WeakMap<IntoTarget, RenderCacheEntry>();
const RENDER_CACHE = new WeakMap<RendererCacheKey, RenderCacheEntry>();
const RENDERER_CACHE = new WeakMap<object, BaseRenderer>();

/**
* The application seeds its `renderer:-dom` service which allows for
* router-aware resolver to resolve {{mount}}
*/
export function setRenderer(owner: object, renderer: BaseRenderer): void {
RENDERER_CACHE.set(owner, renderer);
}

export class BaseRenderer {
static strict(
owner: object,
Expand Down
201 changes: 0 additions & 201 deletions packages/@ember/-internals/glimmer/lib/component-managers/outlet.ts

This file was deleted.

Loading
Loading