diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index fd196612f..cd3ad2ccb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -153,7 +153,7 @@ jobs: - run: pnpm install --frozen-lockfile - id: set-matrix working-directory: test-packages/test-scenarios - run: echo "matrix=$(npm run --silent test:list -- --matrix 'npm run test -- --filter %s:')" >> $GITHUB_OUTPUT + run: echo "matrix=$(npm run --silent test:list -- --matrix 'pnpm test --filter %s:')" >> $GITHUB_OUTPUT scenario-tester: needs: discover_matrix diff --git a/packages/ember-cli-fastboot/addon/locations/none.js b/packages/ember-cli-fastboot/addon/locations/none.js index 85868266c..707da3724 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 */ 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/packages/ember-cli-fastboot/index.js b/packages/ember-cli-fastboot/index.js index 7eaa7b14b..a0d6bb737 100644 --- a/packages/ember-cli-fastboot/index.js +++ b/packages/ember-cli-fastboot/index.js @@ -21,6 +21,8 @@ const p = require('ember-cli-preprocess-registry/preprocessors'); const fastbootTransform = require('fastboot-transform'); const existsSync = fs.existsSync; +const ServiceImportReplacer = require('./lib/broccoli/service-import'); + let checker; function getVersionChecker(context) { if (!checker) { @@ -150,6 +152,17 @@ module.exports = { return tree; }, + treeForAddon(tree) { + if (this._getEmberVersion().lt('4.1.0')) { + return this._super.treeForAddon.call( + this, + new ServiceImportReplacer(tree), + ); + } + + return this._super.treeForAddon.call(this, tree); + }, + _processAddons(addons, fastbootTrees) { addons.forEach((addon) => { this._processAddon(addon, fastbootTrees); @@ -382,13 +395,13 @@ module.exports = { }, _getEmberCliVersion() { - const checker = getVersionChecker(this); + const checker = getVersionChecker(this.project); return checker.for('ember-cli', 'npm'); }, _getEmberVersion() { - const checker = getVersionChecker(this); + const checker = getVersionChecker(this.project); const emberVersionChecker = checker.for('ember-source', 'npm'); if (emberVersionChecker.version) { diff --git a/packages/ember-cli-fastboot/lib/broccoli/service-import.js b/packages/ember-cli-fastboot/lib/broccoli/service-import.js new file mode 100644 index 000000000..0a768e9c9 --- /dev/null +++ b/packages/ember-cli-fastboot/lib/broccoli/service-import.js @@ -0,0 +1,17 @@ +const Filter = require('broccoli-persistent-filter'); + +module.exports = class ServiceImportReplacer extends Filter { + constructor(inputNode, search, replace, options = {}) { + super(inputNode, { + annotation: options.annotation, + }); + this.extensions = ['js']; + this.targetExtension = 'js'; + } + processString(content) { + return content.replace( + `import { service } from '@ember/service';`, + `import { inject as service } from '@ember/service';`, + ); + } +}; diff --git a/packages/ember-cli-fastboot/package.json b/packages/ember-cli-fastboot/package.json index f74f1961a..9b4315cf0 100644 --- a/packages/ember-cli-fastboot/package.json +++ b/packages/ember-cli-fastboot/package.json @@ -28,7 +28,7 @@ "test": "concurrently \"pnpm:lint\" \"pnpm:test:*\" --names \"lint,test:\" --prefixColors auto", "test:mocha": "mocha", "test:ember": "ember test", - "test:ember-compatibility": "ember try:each" + "test-ember-compatibility": "ember try:each" }, "dependencies": { "@babel/core": "^7.29.0", @@ -36,6 +36,7 @@ "broccoli-file-creator": "^2.1.1", "broccoli-funnel": "^3.0.8", "broccoli-merge-trees": "^4.2.0", + "broccoli-persistent-filter": "^3.1.3", "broccoli-plugin": "^4.0.7", "chalk": "^4.1.2", "ember-cli-babel": "^8.3.1", diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 27a0cf620..dc4b00f35 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -46,6 +46,9 @@ importers: broccoli-merge-trees: specifier: ^4.2.0 version: 4.2.0 + broccoli-persistent-filter: + specifier: ^3.1.3 + version: 3.1.3 broccoli-plugin: specifier: ^4.0.7 version: 4.0.7 @@ -788,6 +791,9 @@ importers: ember-cli-head: specifier: ^2.0.0 version: 2.0.0 + ember-service-import-polyfill: + specifier: ^1.0.0 + version: 1.0.0(ember-source@6.12.0(@glimmer/component@2.1.1)(rsvp@4.8.5)) eslint: specifier: ^8.48.0 version: 8.57.1 @@ -5574,6 +5580,12 @@ packages: resolution: {integrity: sha512-89oVHVJwmLDvGvAUWgS87KpBoRhy3aZ6U0Ql6HOmU4TrPkyaa8pM0W81wj9cIwjYprcQtN9EwzZMHnq46+oUyw==} engines: {node: 8.* || 10.* || >= 12} + ember-service-import-polyfill@1.0.0: + resolution: {integrity: sha512-aCfmHv+d6NQ7po9qUHhfDHEFYoUAj1Lw58j4fKyzMz5DR2qVk9BpE4n66AucC9VH5JHwZygAv+EoGN8LUiEi3A==} + engines: {node: '>= 20.19'} + peerDependencies: + ember-source: '>= 4.0.0' + ember-source-channel-url@2.0.1: resolution: {integrity: sha512-YlLUHW9gNvxEaohIj5exykoTZb4xj9ZRTcR4J3svv9S8rjAHJUnHmqC5Fd9onCs+NGxHo7KwR/fDwsfadbDu5Q==} engines: {node: 8.* || >= 10.*} @@ -14941,7 +14953,7 @@ snapshots: async@2.6.4: dependencies: - lodash: 4.17.21 + lodash: 4.18.1 async@3.2.6: {} @@ -15039,7 +15051,7 @@ snapshots: babel-helper-function-name: 6.24.1 babel-runtime: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.18.1 transitivePeerDependencies: - supports-color @@ -15080,7 +15092,7 @@ snapshots: dependencies: babel-runtime: 6.26.0 babel-types: 6.26.0 - lodash: 4.17.21 + lodash: 4.18.1 babel-helper-remap-async-to-generator@6.24.1: dependencies: @@ -18723,6 +18735,15 @@ snapshots: transitivePeerDependencies: - supports-color + ember-service-import-polyfill@1.0.0(ember-source@6.12.0(@glimmer/component@2.1.1)(rsvp@4.8.5)): + dependencies: + '@babel/core': 7.29.7 + ember-cli-babel: 8.3.1(@babel/core@7.29.7) + ember-cli-version-checker: 5.1.2 + ember-source: 6.12.0(@glimmer/component@2.1.1)(rsvp@4.8.5) + transitivePeerDependencies: + - supports-color + ember-source-channel-url@2.0.1: dependencies: got: 8.3.2 @@ -20938,7 +20959,7 @@ snapshots: heimdalljs: 0.2.6 heimdalljs-logger: 0.1.10 path-root: 0.1.1 - resolve: 1.22.10 + resolve: 1.22.12 resolve-package-path: 1.2.7 transitivePeerDependencies: - supports-color diff --git a/test-packages/test-scenarios/fastboot-config-location-test.mjs b/test-packages/test-scenarios/fastboot-config-location-test.mjs index 0ca92a8d5..8039f7c9d 100644 --- a/test-packages/test-scenarios/fastboot-config-location-test.mjs +++ b/test-packages/test-scenarios/fastboot-config-location-test.mjs @@ -9,12 +9,14 @@ const { module: Qmodule, test } = qunit; appScenarios .map('fastboot-config-location', (project) => { + // this test app has the service import itself so we need the polyfill to do its work + project.linkDevDependency('ember-service-import-polyfill', { baseDir: '.' }); merge(project.files, { app: { 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 3ffb46da8..be42dccdf 100644 --- a/test-packages/test-scenarios/fastboot-express-middleware-test.mjs +++ b/test-packages/test-scenarios/fastboot-express-middleware-test.mjs @@ -23,11 +23,13 @@ Object.assign(qunit.assert, { appScenarios .map('fastboot-express-middleware', (project) => { + // this test app has the service import itself so we need the polyfill to do its work + project.linkDevDependency('ember-service-import-polyfill', { baseDir: '.' }); merge(project.files, { 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 +48,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 87cd1b930..52e3d4790 100644 --- a/test-packages/test-scenarios/fastboot-shoebox-test.mjs +++ b/test-packages/test-scenarios/fastboot-shoebox-test.mjs @@ -9,11 +9,13 @@ const { module: Qmodule, test } = qunit; appScenarios .map('fastboot-shoebox-test', (project) => { + // this test app has the service import itself so we need the polyfill to do its work + project.linkDevDependency('ember-service-import-polyfill', { baseDir: '.' }); merge(project.files, { 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 078c21065..665147dbe 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 535359afa..030b7cfd1 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 063e07aa2..6fc90f7d1 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 a92dbe9ee..5b68c009c 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 4f0983abf..98e64446e 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 3aea43919..830b1ca03 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; diff --git a/test-packages/test-scenarios/integration-tests-test.mjs b/test-packages/test-scenarios/integration-tests-test.mjs index bcf93d680..42fdae855 100644 --- a/test-packages/test-scenarios/integration-tests-test.mjs +++ b/test-packages/test-scenarios/integration-tests-test.mjs @@ -15,6 +15,8 @@ appScenarios project.linkDependency('fake-addon', { baseDir: './' }); project.linkDependency('fake-addon-2', { baseDir: './' }); project.linkDependency('ember-cli-head', { baseDir: './' }); + // this test app has the service import itself so we need the polyfill to do its work + project.linkDevDependency('ember-service-import-polyfill', { baseDir: '.' }); }) .forEachScenario((scenario) => { Qmodule(scenario.name, function (hooks) { diff --git a/test-packages/test-scenarios/package.json b/test-packages/test-scenarios/package.json index f5c607f24..70b59faaf 100644 --- a/test-packages/test-scenarios/package.json +++ b/test-packages/test-scenarios/package.json @@ -12,6 +12,7 @@ "body-parser": "^1.18.3", "chai": "^4.3.7", "ember-cli-head": "^2.0.0", + "ember-service-import-polyfill": "^1.0.0", "eslint": "^8.48.0", "eslint-config-prettier": "^9.0.0", "eslint-plugin-n": "^16.0.1",