@lwc/eslint-plugin-lwc
Version:
Official ESLint rules for LWC
75 lines (65 loc) • 2.58 kB
JavaScript
/*
* Copyright (c) 2018, salesforce.com, inc.
* All rights reserved.
* SPDX-License-Identifier: MIT
* For full license text, see the LICENSE file in the repo root or https://opensource.org/licenses/MIT
*/
;
const path = require('path');
const { docUrl } = require('../util/doc-url');
const { isComponent } = require('../util/component');
const { getSourceCode } = require('../util/context');
module.exports = {
meta: {
docs: {
description: 'ensure component class name matches file name',
category: 'LWC',
url: docUrl('consistent-component-name'),
},
messages: {
unexpectedName: 'Lightning component class should be named "{{ name }}".',
},
fixable: 'code',
schema: [],
},
create(context) {
const sourceCode = getSourceCode(context);
const fileName = context.filename ?? context.getFilename();
const fileBasename = path.basename(fileName, path.extname(fileName));
const expectComponentName = fileBasename.charAt(0).toUpperCase() + fileBasename.slice(1);
return {
ClassDeclaration(node) {
if (!isComponent(node, context)) {
return;
}
const { id } = node;
const reportUnexpectedName = (fix) => {
context.report({
node,
messageId: 'unexpectedName',
data: {
name: expectComponentName,
},
fix,
});
};
const isAnonymousClass = id === null;
if (isAnonymousClass) {
return reportUnexpectedName((fixer) => {
// Find the "class" token in the class declaration AST node and insert
// the component name after it.
const classToken = sourceCode.getFirstToken(node);
return fixer.insertTextAfter(classToken, ` ${expectComponentName}`);
});
}
const isNamingConsistent = id.name === expectComponentName;
if (!isNamingConsistent) {
return reportUnexpectedName((fixer) => {
// Replace the existing class name
return fixer.replaceText(id, expectComponentName);
});
}
},
};
},
};