From 211f50ea16c70731256116381613b907f7a6af24 Mon Sep 17 00:00:00 2001 From: Ryan Tablada Date: Thu, 29 Dec 2022 12:58:21 -0600 Subject: [PATCH] wip: address pr feedback --- ...no-deprecated-router-transition-methods.md | 3 +- ...no-deprecated-router-transition-methods.js | 5 - ...no-deprecated-router-transition-methods.js | 128 ++++++++++++++---- 3 files changed, 104 insertions(+), 32 deletions(-) diff --git a/docs/rules/no-deprecated-router-transition-methods.md b/docs/rules/no-deprecated-router-transition-methods.md index ee5c53d680..243455b262 100644 --- a/docs/rules/no-deprecated-router-transition-methods.md +++ b/docs/rules/no-deprecated-router-transition-methods.md @@ -84,8 +84,9 @@ export default class NewPostController extends Controller { ## Migration -The autofixer for this rule will update classes and add injections for the configured services. +The autofixer for this rule will update method calls to use the router service, and will inject the router service as needed. ## References - [Deprecation](https://deprecations.emberjs.com/v3.x/#toc_routing-transition-methods) +- [Router Service](https://api.emberjs.com/ember/release/classes/RouterService) diff --git a/lib/rules/no-deprecated-router-transition-methods.js b/lib/rules/no-deprecated-router-transition-methods.js index b4a47e1fcd..58e5172e8e 100644 --- a/lib/rules/no-deprecated-router-transition-methods.js +++ b/lib/rules/no-deprecated-router-transition-methods.js @@ -67,11 +67,6 @@ module.exports = { // State being tracked for the current class we're inside. const classStack = new Stack(); - // This rule does not apply to test files or non class modules - if (emberUtils.isTestFile(context.getFilename())) { - return {}; - } - return { ImportDeclaration(node) { if (node.source.value === '@ember/service') { diff --git a/tests/lib/rules/no-deprecated-router-transition-methods.js b/tests/lib/rules/no-deprecated-router-transition-methods.js index 6e883feed4..e19b0388ae 100644 --- a/tests/lib/rules/no-deprecated-router-transition-methods.js +++ b/tests/lib/rules/no-deprecated-router-transition-methods.js @@ -22,11 +22,13 @@ const ruleTester = new RuleTester({ ruleTester.run('no-deprecated-router-transition-methods', rule, { valid: [ + // Route Uses RouterService.transitionTo { filename: 'routes/index.js', code: ` import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; + export default class SettingsRoute extends Route { @service('router') router; @service session; @@ -37,11 +39,68 @@ ruleTester.run('no-deprecated-router-transition-methods', rule, { } }`, }, + // Route Uses RouterService.replaceWith { filename: 'routes/index.js', code: ` import Route from '@ember/routing/route'; import { inject as service } from '@ember/service'; + + export default class SettingsRoute extends Route { + @service('router') router; + @service session; + beforeModel() { + if (!this.session.isAuthenticated) { + this.router.replaceWith('login'); + } + } + }`, + }, + // Controller Uses RouterService.transitionTo + { + filename: 'controllers/index.js', + code: ` + import Controller from '@ember/controller'; + import { inject as service } from '@ember/service'; + import { action } from '@ember/object'; + + export default class NewPostController1 extends Controller { + @service('router') router; + + @action + async save({ title, text }) { + let post = this.store.createRecord('post', { title, text }); + await post.save(); + return this.router.transitionTo('post', post.id); + } + }`, + }, + // Controller Uses RouterService.replaceWith + { + filename: 'controllers/index.js', + code: ` + import Controller from '@ember/controller'; + import { inject as service } from '@ember/service'; + import { action } from '@ember/object'; + + export default class NewPostController1 extends Controller { + @service('router') router; + + @action + async save({ title, text }) { + let post = this.store.createRecord('post', { title, text }); + await post.save(); + return this.router.replaceWith('post', post.id); + } + }`, + }, + // Route Uses RouterService.transitionTo on service injected without serviceName + { + filename: 'routes/index.js', + code: ` + import Route from '@ember/routing/route'; + import { inject as service } from '@ember/service'; + export default class SettingsRoute extends Route { @service() router; @service session; @@ -55,32 +114,49 @@ ruleTester.run('no-deprecated-router-transition-methods', rule, { { filename: 'routes/index.js', code: ` -import Route from '@ember/routing/route'; -import { inject as service } from '@ember/service'; - -export class SettingsIndexRoute extends Route { - model() { - return []; - } -} - -export class SettingsDetailRoute extends Route { - @service('settings') settingsService; - - async model(id) { - return new Setting(await this.settingsService.find(id)); - } -} - -export class SettingsRoute extends Route { - @service() router; - @service session; - beforeModel() { - if (!this.session.isAuthenticated) { - this.router.transitionTo('login'); - } - } -}`, + import Route from '@ember/routing/route'; + import { inject as service } from '@ember/service'; + + export default class SettingsRoute extends Route { + @service router; + @service session; + beforeModel() { + if (!this.session.isAuthenticated) { + this.router.transitionTo('login'); + } + } + }`, + }, + // Test Multiple Classes in One File + { + filename: 'routes/index.js', + code: ` + import Route from '@ember/routing/route'; + import { inject as service } from '@ember/service'; + + export class SettingsIndexRoute extends Route { + model() { + return []; + } + } + + export class SettingsDetailRoute extends Route { + @service('settings') settingsService; + + async model(id) { + return new Setting(await this.settingsService.find(id)); + } + } + + export class SettingsRoute extends Route { + @service() router; + @service session; + beforeModel() { + if (!this.session.isAuthenticated) { + this.router.transitionTo('login'); + } + } + }`, }, ], invalid: [