Skip to content
Open
Show file tree
Hide file tree
Changes from 6 commits
Commits
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
28 changes: 28 additions & 0 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -46,3 +46,31 @@ jobs:

- run: pnpm install
- run: pnpm test:coverage

eslint-versions:
runs-on: ubuntu-latest
strategy:
matrix:
eslint-version: [8, 9, 10]

steps:
- uses: actions/checkout@v6
- uses: pnpm/action-setup@v4
with:
run_install: false
- uses: actions/setup-node@v6
with:
node-version: 22.x
cache: 'pnpm'

- run: pnpm install
- name: Install ESLint ${{ matrix.eslint-version }}
run: pnpm add -D eslint@${{ matrix.eslint-version }} --ignore-workspace-root-check
- name: Install Babel 8 for ESLint 10
if: matrix.eslint-version == 10
run: |
pnpm add -D @babel/[email protected] @babel/[email protected] @babel/[email protected] @babel/plugin-transform-class-properties --ignore-workspace-root-check
# Update .babelrc for Babel 8
echo '{"plugins": ["@babel/plugin-transform-class-properties", ["@babel/plugin-proposal-decorators", {"version": "2023-11"}]]}' > .babelrc
- name: Test with ESLint ${{ matrix.eslint-version }}
run: pnpm test
Empty file added PR_UPDATE.md
Empty file.
2 changes: 1 addition & 1 deletion lib/rules/alias-model-in-controller.js
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ module.exports = {
context.report({ node, message });
};

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

return {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/avoid-leaking-state-in-ember-objects.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ module.exports = {
context.report({ node, message });
};

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

return {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/avoid-using-needs-in-controllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ module.exports = {
context.report({ node, message });
};

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

return {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-actions-hash.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ module.exports = {
},

create: (context) => {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

function reportActionsProp(properties) {
Expand Down
4 changes: 2 additions & 2 deletions lib/rules/no-array-prototype-extensions.js
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,7 @@ function applyFix(callExpressionNode, fixer, context, options = {}) {
const propertyName = calleeProp.name;
const calleeObj = callExpressionNode.callee.object;
const callArgs = callExpressionNode.arguments;
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

// Get the open parenthesis immediately after the callee name
const openParenToken = sourceCode.getTokenAfter(calleeProp, {
Expand Down Expand Up @@ -644,7 +644,7 @@ module.exports = {
},

create(context) {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;
let importedGetName;
let importedSetName;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,7 @@ module.exports = {
ERROR_MESSAGE,

create(context) {
if (emberUtils.isTestFile(context.getFilename())) {
if (emberUtils.isTestFile(context.filename ?? context.getFilename())) {
// This rule does not apply to test files.
return {};
}
Expand Down Expand Up @@ -310,7 +310,7 @@ module.exports = {

const currentClass = classStack.peek();

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const nodeTextLeft = sourceCode.getText(node.left);
const nodeTextRight = sourceCode.getText(node.right);
const propertyName = nodeTextLeft.replace('this.', '');
Expand Down Expand Up @@ -348,7 +348,7 @@ module.exports = {
);
} else {
// Need to add an import statement for `set`.
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
return [
fixer.insertTextBefore(sourceCode.ast, "import { set } from '@ember/object';\n"),
fixer.replaceText(node, `set(this, '${propertyName}', ${nodeTextRight})`),
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-classic-classes.js
Original file line number Diff line number Diff line change
Expand Up @@ -69,7 +69,7 @@ module.exports = {
},

create(context) {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;
const options = context.options[0] || {};
const additionalClassImports = options.additionalClassImports || [];
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-controllers.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ module.exports = {
},

create: (context) => {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

return {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-deprecated-router-transition-methods.js
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ const decoratorUtils = require('../utils/decorators');

function getBaseFixSteps(fixer, context, currentClass) {
const fixSteps = [];
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
let serviceInjectImportName = currentClass.serviceInjectImportName;
let routerServicePropertyName = currentClass.routerServicePropertyName;

Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-duplicate-dependent-keys.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@ module.exports = {
node,
message: ERROR_MESSAGE,
fix(fixer) {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

const stringNodes = node.arguments.filter((arg) => types.isStringLiteral(arg));
const duplicateNodes = findDuplicateStringNodes(stringNodes);
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-ember-super-in-es-classes.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ module.exports = {
return fixer.replaceText(node, `super.${method.key.name}`);
}

const text = context.getSourceCode().getText(method.key);
const text = (context.sourceCode ?? context.getSourceCode()).getText(method.key);
return fixer.replaceText(node, `super[${text}]`);
},
});
Expand Down
4 changes: 2 additions & 2 deletions lib/rules/no-empty-attrs.js
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ module.exports = {

create(context) {
const message = 'Supply proper attribute type';
const filePath = context.getFilename();
const filePath = context.filename ?? context.getFilename();

const report = function (node) {
context.report({ node, message });
};

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

return {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-get-with-default.js
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ function fix({
isImported,
importedGetName,
}) {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

const nodeObjectSourceText = sourceCode.getText(nodeObject);
const nodePropertySourceText = sourceCode.getText(nodeProperty);
Expand Down
24 changes: 14 additions & 10 deletions lib/rules/no-get.js
Original file line number Diff line number Diff line change
Expand Up @@ -230,9 +230,9 @@ module.exports = {
let importedGetName;
let importedGetPropertiesName;

const filename = context.getFilename();
const filename = context.filename ?? context.getFilename();

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

// Skip mirage directory
Expand Down Expand Up @@ -309,7 +309,7 @@ module.exports = {
(!node.arguments[0].value.includes('.') || !ignoreNestedPaths)
) {
// Example: this.get('foo');
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
reportGet({
node,
context,
Expand All @@ -330,7 +330,7 @@ module.exports = {
(!node.arguments[1].value.includes('.') || !ignoreNestedPaths)
) {
// Example: get(this, 'foo');
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
reportGet({
node,
context,
Expand All @@ -352,7 +352,7 @@ module.exports = {
typeof node.arguments[0].value === 'number'
) {
// Example: this.get(5);
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
reportGet({
node,
context,
Expand All @@ -371,7 +371,7 @@ module.exports = {
typeof node.arguments[1].value === 'number'
) {
// Example: get(this, 5);
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
reportGet({
node,
context,
Expand All @@ -392,7 +392,7 @@ module.exports = {
types.isLiteral(node.arguments[0].alternate)
) {
// Example: this.get(foo ? 'bar' : 'baz');
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
reportGet({
node,
context,
Expand All @@ -414,7 +414,7 @@ module.exports = {
types.isLiteral(node.arguments[1].alternate)
) {
// Example: get(foo, bar ? 'baz' : 'biz');
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
reportGet({
node,
context,
Expand Down Expand Up @@ -442,7 +442,9 @@ module.exports = {
validateGetPropertiesArguments(node.arguments, ignoreNestedPaths)
) {
// Example: this.getProperties('foo', 'bar');
const objectText = context.getSourceCode().getText(node.callee.object);
const objectText = (context.sourceCode ?? context.getSourceCode()).getText(
node.callee.object
);
const properties = node.arguments;
reportGetProperties({ context, node, objectText, properties });
}
Expand All @@ -454,7 +456,9 @@ module.exports = {
validateGetPropertiesArguments(node.arguments.slice(1), ignoreNestedPaths)
) {
// Example: getProperties(this, 'foo', 'bar');
const objectText = context.getSourceCode().getText(node.arguments[0]);
const objectText = (context.sourceCode ?? context.getSourceCode()).getText(
node.arguments[0]
);
const properties = node.arguments.slice(1);
reportGetProperties({
context,
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-implicit-injections.js
Original file line number Diff line number Diff line change
Expand Up @@ -222,7 +222,7 @@ module.exports = {
serviceName: failedConfig.service,
},
fix(fixer) {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

// service inject is already declared
if (serviceInjectImportName) {
Expand Down
4 changes: 2 additions & 2 deletions lib/rules/no-implicit-service-injection-argument.js
Original file line number Diff line number Diff line change
Expand Up @@ -53,7 +53,7 @@ module.exports = {
node: node.decorators[0].expression,
message: ERROR_MESSAGE,
fix(fixer) {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

// Ideally, we want to match the service's filename, and kebab-case filenames are most common.
const serviceName = emberUtils.convertServiceNameToKebabCase(
Expand Down Expand Up @@ -100,7 +100,7 @@ module.exports = {
node: node.value,
message: ERROR_MESSAGE,
fix(fixer) {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

// Ideally, we want to match the service's filename, and kebab-case filenames are most common.
const serviceName = emberUtils.convertServiceNameToKebabCase(
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-incorrect-computed-macros.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ module.exports = {
if (importNameReadOnly) {
return fixer.replaceText(node.callee, importNameReadOnly);
} else {
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
return [
fixer.insertTextBefore(
sourceCode.ast,
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-invalid-dependent-keys.js
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,7 @@ module.exports = {
(arg) => types.isLiteral(arg) && typeof arg.value === 'string'
);

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

for (const node of stringArgs) {
if (hasTerminalAtEach(node.value)) {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-noop-setup-on-error-in-before.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ module.exports = {
let isInBeforeEachHook = false;
let isInBeforeHook = false;
let hooksName;
const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();

function reportErrorForNodeIfInBefore(node) {
const isInBeforeOrBeforeEach =
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-on-calls-in-components.js
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ module.exports = {
context.report({ node, message });
};

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

return {
Expand Down
2 changes: 1 addition & 1 deletion lib/rules/no-pause-test.js
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ module.exports = {
ERROR_MESSAGE,

create(context) {
if (!emberUtils.isTestFile(context.getFilename())) {
if (!emberUtils.isTestFile(context.filename ?? context.getFilename())) {
return {};
}

Expand Down
4 changes: 2 additions & 2 deletions lib/rules/no-replace-test-comments.js
Original file line number Diff line number Diff line change
Expand Up @@ -42,12 +42,12 @@ module.exports = {
// Public
//----------------------------------------------------------------------

if (!emberUtils.isTestFile(context.getFilename())) {
if (!emberUtils.isTestFile(context.filename ?? context.getFilename())) {
return {};
}
return {
Program(/* node */) {
const sourceCode = context.getSourceCode() || {};
const sourceCode = (context.sourceCode ?? context.getSourceCode()) || {};
const comments = sourceCode.getAllComments() || [];
for (const comment of comments) {
checkForRealTestsComment(comment);
Expand Down
4 changes: 3 additions & 1 deletion lib/rules/no-restricted-property-modifications.js
Original file line number Diff line number Diff line change
Expand Up @@ -97,7 +97,9 @@ module.exports = {
node,
messageId: 'useReadOnlyMacro',
fix(fixer) {
const argumentText0 = context.getSourceCode().getText(node.arguments[0]);
const argumentText0 = (context.sourceCode ?? context.getSourceCode()).getText(
node.arguments[0]
);
return node.callee.type === 'MemberExpression'
? fixer.replaceText(node, `${importedComputedName}.readOnly(${argumentText0})`)
: fixer.replaceText(node, `readOnly(${argumentText0})`);
Expand Down
3 changes: 2 additions & 1 deletion lib/rules/no-restricted-service-injections.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,8 +70,9 @@ module.exports = {
}

// Find matching denylist entries for this file path.
const filename = context.filename ?? context.getFilename();
const denylists = context.options.filter(
(option) => !option.paths || option.paths.some((path) => context.getFilename().match(path))
(option) => !option.paths || option.paths.some((path) => filename.match(path))
);

if (denylists.length === 0) {
Expand Down
5 changes: 3 additions & 2 deletions lib/rules/no-shadow-route-definition.js
Original file line number Diff line number Diff line change
Expand Up @@ -51,14 +51,15 @@ module.exports = {
buildErrorMessage,

create(context) {
if (ember.isTestFile(context.getFilename())) {
const filename = context.filename ?? context.getFilename();
if (ember.isTestFile(filename)) {
// This rule does not apply to test files.
return {};
}

const routeMap = new Map();

const sourceCode = context.getSourceCode();
const sourceCode = context.sourceCode ?? context.getSourceCode();
const { scopeManager } = sourceCode;

return {
Expand Down
Loading