Skip to content

Commit

Permalink
Support ESLint v8 by switching from ESLint's internal traverser to `e…
Browse files Browse the repository at this point in the history
…straverse` (#1333)
  • Loading branch information
bmish authored Oct 12, 2021
1 parent b2515e6 commit 0589719
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 72 deletions.
4 changes: 2 additions & 2 deletions lib/rules/no-side-effects.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ const types = require('../utils/types');
const computedPropertyUtils = require('../utils/computed-properties');
const propertySetterUtils = require('../utils/property-setter');
const emberUtils = require('../utils/ember');
const Traverser = require('../utils/traverser');
const estraverse = require('estraverse');
const { getImportIdentifier } = require('../utils/import');

//------------------------------------------------------------------------------
Expand Down Expand Up @@ -115,7 +115,7 @@ function findSideEffects(
) {
const results = [];

new Traverser().traverse(computedPropertyBody, {
estraverse.traverse(computedPropertyBody, {
enter(child) {
if (
isEmberSetThis(child, importedEmberName) || // Ember.set(this, 'foo', 123)
Expand Down
86 changes: 35 additions & 51 deletions lib/rules/require-computed-property-dependencies.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

const Traverser = require('../utils/traverser');
const estraverse = require('estraverse');
const emberUtils = require('../utils/ember');
const computedPropertyUtils = require('../utils/computed-properties');
const javascriptUtils = require('../utils/javascript');
Expand Down Expand Up @@ -110,7 +110,7 @@ function parseComputedDependencies(args) {
function findEmberGetCalls(node, importedNames) {
const results = [];

new Traverser().traverse(node, {
estraverse.traverse(node, {
enter(child) {
if (types.isCallExpression(child)) {
const dependency = extractEmberGetDependencies(child, importedNames);
Expand All @@ -125,48 +125,6 @@ function findEmberGetCalls(node, importedNames) {
return results;
}

/**
* Recursively finds the names of all injected services.
*
* In this example: `intl` would be one of the results:
* `Component.extend({ intl: service() });`
*
* @param {ASTNode} node
* @returns {Array<String>}
*/
function findInjectedServiceNames(node) {
const results = [];

let importedEmberName;
let importedInjectName;

new Traverser().traverse(node, {
enter(child) {
if (types.isImportDeclaration(child)) {
if (child.source.value === 'ember') {
importedEmberName = importedEmberName || getImportIdentifier(child, 'ember');
}
if (child.source.value === '@ember/service') {
importedInjectName =
importedInjectName || getImportIdentifier(child, '@ember/service', 'inject');
}
}
if (
(types.isProperty(child) || types.isClassProperty(child)) &&
emberUtils.isInjectedServiceProp(child, importedEmberName, importedInjectName)
) {
if (types.isIdentifier(child.key)) {
results.push(child.key.name);
} else if (types.isStringLiteral(child.key)) {
results.push(child.key.value);
}
}
},
});

return results;
}

/**
* Recursively finds all `this.property` usages.
*
Expand All @@ -176,7 +134,7 @@ function findInjectedServiceNames(node) {
function findThisGetCalls(node) {
const results = [];

new Traverser().traverse(node, {
estraverse.traverse(node, {
enter(child, parent) {
if (
(types.isOptionalMemberExpression(child) || types.isMemberExpression(child)) &&
Expand Down Expand Up @@ -321,13 +279,14 @@ module.exports = {
const requireServiceNames = context.options[0] && context.options[0].requireServiceNames;
const allowDynamicKeys = !context.options[0] || context.options[0].allowDynamicKeys;

let serviceNames = [];
const serviceNames = [];

let importedEmberName;
let importedComputedName;
let importedGetName;
let importedGetPropertiesName;
let importedGetWithDefaultName;
let importedInjectName;

function checkComputedDependencies(node, nodeArguments, importedNames) {
const declaredDependencies = parseComputedDependencies(nodeArguments);
Expand Down Expand Up @@ -460,12 +419,21 @@ module.exports = {
}
}

return {
Program(node) {
// If service names aren't required dependencies, then we need to keep track of them so that we can ignore them.
serviceNames = requireServiceNames ? [] : findInjectedServiceNames(node);
},
function collectServiceNames(node) {
// If service names aren't required dependencies, then we need to keep track of them so that we can ignore them.
if (
!requireServiceNames &&
emberUtils.isInjectedServiceProp(node, importedEmberName, importedInjectName)
) {
if (types.isIdentifier(node.key)) {
serviceNames.push(node.key.name);
} else if (types.isStringLiteral(node.key)) {
serviceNames.push(node.key.value);
}
}
}

return {
ImportDeclaration(node) {
if (node.source.value === 'ember') {
importedEmberName = importedEmberName || getImportIdentifier(node, 'ember');
Expand All @@ -481,6 +449,10 @@ module.exports = {
importedGetWithDefaultName ||
getImportIdentifier(node, '@ember/object', 'getWithDefault');
}
if (node.source.value === '@ember/service') {
importedInjectName =
importedInjectName || getImportIdentifier(node, '@ember/service', 'inject');
}
},

Identifier(node) {
Expand All @@ -504,6 +476,18 @@ module.exports = {
});
}
},

ClassBody(node) {
for (const bodyNode of node.body) {
collectServiceNames(bodyNode);
}
},

ObjectExpression(node) {
for (const property of node.properties) {
collectServiceNames(property);
}
},
};
},
};
4 changes: 2 additions & 2 deletions lib/rules/require-super-in-lifecycle-hooks.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,11 @@

const ember = require('../utils/ember');
const types = require('../utils/types');
const Traverser = require('../utils/traverser');
const estraverse = require('estraverse');

function hasMatchingNode(node, matcher) {
let foundMatch = false;
new Traverser().traverse(node, {
estraverse.traverse(node, {
enter(child) {
if (!foundMatch && matcher(child)) {
foundMatch = true;
Expand Down
4 changes: 2 additions & 2 deletions lib/utils/scope-references-this.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
'use strict';

const Traverser = require('../utils/traverser');
const estraverse = require('estraverse');

/**
* Determines whether this AST node uses the `this` of the surrounding context.
Expand All @@ -11,7 +11,7 @@ const Traverser = require('../utils/traverser');
function scopeReferencesThis(node) {
let result = false;

new Traverser().traverse(node, {
estraverse.traverse(node, {
enter(node) {
switch (node.type) {
case 'FunctionDeclaration':
Expand Down
15 changes: 0 additions & 15 deletions lib/utils/traverser.js

This file was deleted.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
"css-tree": "^1.0.0-alpha.39",
"ember-rfc176-data": "^0.3.15",
"eslint-utils": "^3.0.0",
"estraverse": "^5.2.0",
"lodash.kebabcase": "^4.1.1",
"requireindex": "^1.2.0",
"snake-case": "^3.0.3"
Expand Down

0 comments on commit 0589719

Please sign in to comment.