From 5df9a41e3b2d1236391fa4dc8fbb67865b710d77 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Bu=CC=88nemann?= Date: Mon, 10 Nov 2025 12:03:41 +0100 Subject: [PATCH 1/5] Fix ember v6 deprecate-import-view-utils-from-ember deprecation --- .../vendor/experimental-render-mode-rehydrate.js | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js b/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js index 9dd3518f..aa7d4ba4 100644 --- a/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js +++ b/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js @@ -4,6 +4,7 @@ var current = document.getElementById('fastboot-body-start'); var _Ember = require.has('ember') ? require('ember').default : window.Ember; + var _ViewUtils = require.has('@ember/-internals/views') ? require('@ember/-internals/views') : _Ember.ViewUtils; if (current && !_Ember) { console.error(`Experimental render mode rehydrate isn't working because it couldn't find Ember via AMD or global. @@ -13,8 +14,8 @@ See https://github.com/ember-fastboot/ember-cli-fastboot/issues/938 for the curr if ( current && - typeof _Ember.ViewUtils.isSerializationFirstNode === 'function' && - _Ember.ViewUtils.isSerializationFirstNode(current.nextSibling) + typeof _ViewUtils.isSerializationFirstNode === 'function' && + _ViewUtils.isSerializationFirstNode(current.nextSibling) ) { _Ember.ApplicationInstance.reopen({ _bootSync: function(options) { From 26c165495c6df1694d7e33500125db631e4d8d8b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Bu=CC=88nemann?= Date: Mon, 10 Nov 2025 12:07:33 +0100 Subject: [PATCH 2/5] Fix ember v6 importing-inject-from-ember-service deprecation --- packages/ember-cli-fastboot/addon/locations/none.js | 2 +- .../test-scenarios/fastboot-config-location-test.mjs | 2 +- .../test-scenarios/fastboot-express-middleware-test.mjs | 4 ++-- test-packages/test-scenarios/fastboot-shoebox-test.mjs | 2 +- .../fixtures/basic-app/app/components/async-content.js | 2 +- .../fixtures/basic-app/app/routes/application.js | 2 +- .../fixtures/basic-app/app/routes/echo-request-headers.js | 2 +- .../fixtures/basic-app/app/routes/head-content.js | 2 +- .../test-scenarios/fixtures/basic-app/app/routes/metadata.js | 2 +- .../fixtures/basic-app/app/routes/return-status-code-418.js | 2 +- 10 files changed, 11 insertions(+), 11 deletions(-) diff --git a/packages/ember-cli-fastboot/addon/locations/none.js b/packages/ember-cli-fastboot/addon/locations/none.js index c21f2e9a..bd95aaea 100644 --- a/packages/ember-cli-fastboot/addon/locations/none.js +++ b/packages/ember-cli-fastboot/addon/locations/none.js @@ -1,7 +1,7 @@ /* eslint-disable ember/no-classic-classes, ember/no-get, ember/require-computed-property-dependencies, prettier/prettier */ import { computed, get } from '@ember/object'; import { bool, readOnly } from '@ember/object/computed'; -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; import { getOwner } from '@ember/application' import NoneLocation from '@ember/routing/none-location' diff --git a/test-packages/test-scenarios/fastboot-config-location-test.mjs b/test-packages/test-scenarios/fastboot-config-location-test.mjs index 0ca92a8d..36b40016 100644 --- a/test-packages/test-scenarios/fastboot-config-location-test.mjs +++ b/test-packages/test-scenarios/fastboot-config-location-test.mjs @@ -14,7 +14,7 @@ appScenarios routes: { 'redirect-on-transition-to.js': ` import Route from '@ember/routing/route'; - import { inject as service } from '@ember/service'; + import { service } from '@ember/service'; export default class MyRoute extends Route { @service diff --git a/test-packages/test-scenarios/fastboot-express-middleware-test.mjs b/test-packages/test-scenarios/fastboot-express-middleware-test.mjs index 3ffb46da..3d01e87f 100644 --- a/test-packages/test-scenarios/fastboot-express-middleware-test.mjs +++ b/test-packages/test-scenarios/fastboot-express-middleware-test.mjs @@ -27,7 +27,7 @@ appScenarios app: { routes: { 'index.js': `import Route from '@ember/routing/route'; - import { inject as service } from '@ember/service'; + import { service } from '@ember/service'; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && obj.constructor.name === 'Object'; @@ -46,7 +46,7 @@ appScenarios } }`, 'application.js': `import Route from '@ember/routing/route'; - import { inject as service } from '@ember/service'; + import { service } from '@ember/service'; export default class ApplicationRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fastboot-shoebox-test.mjs b/test-packages/test-scenarios/fastboot-shoebox-test.mjs index 87cd1b93..d5f7614f 100644 --- a/test-packages/test-scenarios/fastboot-shoebox-test.mjs +++ b/test-packages/test-scenarios/fastboot-shoebox-test.mjs @@ -13,7 +13,7 @@ appScenarios app: { routes: { 'application.js': `import Route from '@ember/routing/route'; - import { inject as service } from '@ember/service' + import { service } from '@ember/service' export default class ApplicationRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js b/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js index 078c2106..665147db 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js @@ -2,7 +2,7 @@ import { defer } from 'rsvp'; import { later } from '@ember/runloop'; import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; export default class AsyncContenComponent extends Component { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js index 535359af..030b7cfd 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; export default class ApplicationRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js index 063e07aa..6fc90f7d 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; export default class EchoRequestHeadersRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js index a92dbe9e..5b68c009 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js @@ -1,6 +1,6 @@ import { set } from '@ember/object'; import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; export default class HeadContentRoute extends Route { @service headData; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js index 4f0983ab..98e64446 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; export default Route.extend({ fastboot: service(), diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js index 3aea4391..830b1ca0 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js @@ -1,5 +1,5 @@ import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; +import { service } from '@ember/service'; export default class ReturnStatusCode418Route extends Route { @service fastboot; From 8a5fcc825ad5ade145c2cbc94447f0ec8461534b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Bu=CC=88nemann?= Date: Mon, 10 Nov 2025 12:16:41 +0100 Subject: [PATCH 3/5] Fix ember v6 deprecate-import-onerror-from-ember deprecation --- .../fastboot/initializers/error-handler.js | 8 ++++---- .../test-scenarios/oneerror-per-visit-test.mjs | 13 ++++++++----- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/ember-cli-fastboot/fastboot/initializers/error-handler.js b/packages/ember-cli-fastboot/fastboot/initializers/error-handler.js index 0d1a6979..5e8006a3 100644 --- a/packages/ember-cli-fastboot/fastboot/initializers/error-handler.js +++ b/packages/ember-cli-fastboot/fastboot/initializers/error-handler.js @@ -1,5 +1,5 @@ /* eslint-disable prettier/prettier */ -import Ember from 'ember'; +import { getOnerror, setOnerror } from '@ember/-internals/error-handling'; /** * Initializer to attach an `onError` hook to your app running in fastboot. It catches any run loop @@ -10,12 +10,12 @@ export default { name: 'error-handler', initialize: function() { - if (!Ember.onerror) { + if (!getOnerror()) { // if no onerror handler is defined, define one for fastboot environments - Ember.onerror = function(err) { + setOnerror(function(err) { const errorMessage = `There was an error running your app in fastboot. More info about the error: \n ${err.stack || err}`; console.error(errorMessage); - } + }); } } }; diff --git a/test-packages/test-scenarios/oneerror-per-visit-test.mjs b/test-packages/test-scenarios/oneerror-per-visit-test.mjs index a5e469df..06b5fdd4 100644 --- a/test-packages/test-scenarios/oneerror-per-visit-test.mjs +++ b/test-packages/test-scenarios/oneerror-per-visit-test.mjs @@ -24,7 +24,7 @@ appScenarios }); });`, 'instance-initializers': { - 'setup-onerror.js': `import Ember from 'ember'; + 'setup-onerror.js': `import { setOnerror } from '@ember/-internals/error-handling'; export function initialize(owner) { let isFastBoot = typeof 'FastBoot' !== 'undefined'; let fastbootRequestPath; @@ -36,12 +36,12 @@ appScenarios console.log('setting up error handler ' + fastbootRequestPath); - Ember.onerror = function (error) { + setOnerror(function (error) { if (isFastBoot) { error.fastbootRequestPath = fastbootRequestPath; throw error; } - }; + }); } export default { @@ -52,12 +52,15 @@ appScenarios routes: { 'application.js': `import Route from '@ember/routing/route'; import { action } from '@ember/object'; - import Ember from 'ember'; + import { getOnerror } from '@ember/-internals/error-handling'; export default class ApplicationRoute extends Route { @action error(err) { - Ember.onerror(err); + const onerror = getOnerror(); + if (onerror) { + onerror(err); + } } } `, From 879a1d84c77538636316fb35a32330266d5fbe39 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Bu=CC=88nemann?= Date: Mon, 17 Nov 2025 16:13:24 +0100 Subject: [PATCH 4/5] Add backward compatibility with inject as service import --- packages/ember-cli-fastboot/addon/locations/none.js | 3 ++- .../tests/dummy/app/routes/application.js | 3 ++- .../test-scenarios/fastboot-config-location-test.mjs | 3 ++- .../test-scenarios/fastboot-express-middleware-test.mjs | 6 ++++-- test-packages/test-scenarios/fastboot-shoebox-test.mjs | 3 ++- .../fixtures/basic-app/app/components/async-content.js | 3 ++- .../fixtures/basic-app/app/routes/application.js | 3 ++- .../fixtures/basic-app/app/routes/echo-request-headers.js | 3 ++- .../fixtures/basic-app/app/routes/head-content.js | 3 ++- .../fixtures/basic-app/app/routes/metadata.js | 3 ++- .../fixtures/basic-app/app/routes/return-status-code-418.js | 3 ++- 11 files changed, 24 insertions(+), 12 deletions(-) diff --git a/packages/ember-cli-fastboot/addon/locations/none.js b/packages/ember-cli-fastboot/addon/locations/none.js index bd95aaea..03f42cfc 100644 --- a/packages/ember-cli-fastboot/addon/locations/none.js +++ b/packages/ember-cli-fastboot/addon/locations/none.js @@ -1,7 +1,8 @@ /* eslint-disable ember/no-classic-classes, ember/no-get, ember/require-computed-property-dependencies, prettier/prettier */ import { computed, get } from '@ember/object'; import { bool, readOnly } from '@ember/object/computed'; -import { service } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const service = serviceModule.service || serviceModule.inject; import { getOwner } from '@ember/application' import NoneLocation from '@ember/routing/none-location' diff --git a/packages/ember-cli-fastboot/tests/dummy/app/routes/application.js b/packages/ember-cli-fastboot/tests/dummy/app/routes/application.js index 69045116..baa1b32b 100644 --- a/packages/ember-cli-fastboot/tests/dummy/app/routes/application.js +++ b/packages/ember-cli-fastboot/tests/dummy/app/routes/application.js @@ -1,6 +1,7 @@ /* eslint-disable ember/no-classic-classes, ember/no-get, prettier/prettier */ import Route from '@ember/routing/route'; -import { inject } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const inject = serviceModule.service || serviceModule.inject; import { readOnly } from '@ember/object/computed'; export default Route.extend({ diff --git a/test-packages/test-scenarios/fastboot-config-location-test.mjs b/test-packages/test-scenarios/fastboot-config-location-test.mjs index 36b40016..838a93e3 100644 --- a/test-packages/test-scenarios/fastboot-config-location-test.mjs +++ b/test-packages/test-scenarios/fastboot-config-location-test.mjs @@ -14,7 +14,8 @@ appScenarios routes: { 'redirect-on-transition-to.js': ` import Route from '@ember/routing/route'; - import { service } from '@ember/service'; + import * as serviceModule from '@ember/service'; + const service = serviceModule.service || serviceModule.inject; export default class MyRoute extends Route { @service diff --git a/test-packages/test-scenarios/fastboot-express-middleware-test.mjs b/test-packages/test-scenarios/fastboot-express-middleware-test.mjs index 3d01e87f..b3222a04 100644 --- a/test-packages/test-scenarios/fastboot-express-middleware-test.mjs +++ b/test-packages/test-scenarios/fastboot-express-middleware-test.mjs @@ -27,7 +27,8 @@ appScenarios app: { routes: { 'index.js': `import Route from '@ember/routing/route'; - import { service } from '@ember/service'; + import * as serviceModule from '@ember/service'; + const service = serviceModule.service || serviceModule.inject; function isEmptyObject(obj) { return Object.keys(obj).length === 0 && obj.constructor.name === 'Object'; @@ -46,7 +47,8 @@ appScenarios } }`, 'application.js': `import Route from '@ember/routing/route'; - import { service } from '@ember/service'; + import * as serviceModule from '@ember/service'; + const service = serviceModule.service || serviceModule.inject; export default class ApplicationRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fastboot-shoebox-test.mjs b/test-packages/test-scenarios/fastboot-shoebox-test.mjs index d5f7614f..99983968 100644 --- a/test-packages/test-scenarios/fastboot-shoebox-test.mjs +++ b/test-packages/test-scenarios/fastboot-shoebox-test.mjs @@ -13,7 +13,8 @@ appScenarios app: { routes: { 'application.js': `import Route from '@ember/routing/route'; - import { service } from '@ember/service' + import * as serviceModule from '@ember/service'; + const service = serviceModule.service || serviceModule.inject; export default class ApplicationRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js b/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js index 665147db..a9301828 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/components/async-content.js @@ -2,7 +2,8 @@ import { defer } from 'rsvp'; import { later } from '@ember/runloop'; import Component from '@glimmer/component'; import { tracked } from '@glimmer/tracking'; -import { service } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const service = serviceModule.service || serviceModule.inject; export default class AsyncContenComponent extends Component { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js index 030b7cfd..ee30823c 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/application.js @@ -1,5 +1,6 @@ import Route from '@ember/routing/route'; -import { service } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const service = serviceModule.service || serviceModule.inject; export default class ApplicationRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js index 6fc90f7d..aa3cf172 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/echo-request-headers.js @@ -1,5 +1,6 @@ import Route from '@ember/routing/route'; -import { service } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const service = serviceModule.service || serviceModule.inject; export default class EchoRequestHeadersRoute extends Route { @service fastboot; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js index 5b68c009..7b9c7b87 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/head-content.js @@ -1,6 +1,7 @@ import { set } from '@ember/object'; import Route from '@ember/routing/route'; -import { service } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const service = serviceModule.service || serviceModule.inject; export default class HeadContentRoute extends Route { @service headData; diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js index 98e64446..8d54f129 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/metadata.js @@ -1,5 +1,6 @@ import Route from '@ember/routing/route'; -import { service } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const service = serviceModule.service || serviceModule.inject; export default Route.extend({ fastboot: service(), diff --git a/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js b/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js index 830b1ca0..d8fe3005 100644 --- a/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js +++ b/test-packages/test-scenarios/fixtures/basic-app/app/routes/return-status-code-418.js @@ -1,5 +1,6 @@ import Route from '@ember/routing/route'; -import { service } from '@ember/service'; +import * as serviceModule from '@ember/service'; +const service = serviceModule.service || serviceModule.inject; export default class ReturnStatusCode418Route extends Route { @service fastboot; From 3b3ff475a7e541e678f89bfc99c1a4ff5bfd2550 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Felix=20Bu=CC=88nemann?= Date: Sat, 22 Nov 2025 20:01:56 +0100 Subject: [PATCH 5/5] Use backwards compatible requires for experimental-render-mode-rehydrate --- .../experimental-render-mode-rehydrate.js | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js b/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js index aa7d4ba4..a6d696b1 100644 --- a/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js +++ b/packages/ember-cli-fastboot/vendor/experimental-render-mode-rehydrate.js @@ -3,21 +3,36 @@ if (typeof FastBoot === 'undefined') { var current = document.getElementById('fastboot-body-start'); - var _Ember = require.has('ember') ? require('ember').default : window.Ember; - var _ViewUtils = require.has('@ember/-internals/views') ? require('@ember/-internals/views') : _Ember.ViewUtils; + if (!current) { + return; + } + + var isSerializationFirstNode; + var ApplicationInstance; + + if (require.has('@ember/-internals/glimmer') && require.has('@ember/application/instance')) { + isSerializationFirstNode = require('@ember/-internals/glimmer').isSerializationFirstNode; + ApplicationInstance = require('@ember/application/instance').default; + } else if (require.has('ember')) { + var _Ember = require('ember').default; + isSerializationFirstNode = _Ember.ViewUtils.isSerializationFirstNode; + ApplicationInstance = _Ember.ApplicationInstance; + } else if (window.Ember) { + isSerializationFirstNode = window.Ember.ViewUtils.isSerializationFirstNode; + ApplicationInstance = window.Ember.ApplicationInstance; + } - if (current && !_Ember) { + if (!isSerializationFirstNode || !ApplicationInstance) { console.error(`Experimental render mode rehydrate isn't working because it couldn't find Ember via AMD or global. See https://github.com/ember-fastboot/ember-cli-fastboot/issues/938 for the current state of the fix.`); return; } if ( - current && - typeof _ViewUtils.isSerializationFirstNode === 'function' && - _ViewUtils.isSerializationFirstNode(current.nextSibling) + typeof isSerializationFirstNode === 'function' && + isSerializationFirstNode(current.nextSibling) ) { - _Ember.ApplicationInstance.reopen({ + ApplicationInstance.reopen({ _bootSync: function(options) { if (options === undefined) { options = {