blob: 41777aed24b2648cafb3701a83bfef0e5ac2a3f1 [file]
// Copyright 2026 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @file Rule to ban usage of expect from chai and default/namespace imports from chai
*/
import {createRule} from './utils/ruleCreator.ts';
type MessageIds = 'noChaiExpect'|'noChaiDefault'|'noChaiNamespace';
export default createRule<[], MessageIds>({
name: 'prefer-chai-assert',
meta: {
type: 'problem',
docs: {
description: 'Disallow usage of expect from chai and default/namespace imports from chai',
category: 'Possible Errors',
},
messages: {
noChaiExpect: 'Using expect from chai is not allowed. Use assert instead.',
noChaiDefault: 'Default import from chai is not allowed. Import { assert } instead.',
noChaiNamespace: 'Namespace import from chai is not allowed. Import { assert } instead.',
},
schema: [],
},
defaultOptions: [],
create(context) {
return {
ImportDeclaration(node) {
if (node.source.value !== 'chai') {
return;
}
for (const specifier of node.specifiers) {
if (specifier.type === 'ImportDefaultSpecifier') {
context.report({
node: specifier,
messageId: 'noChaiDefault',
});
} else if (specifier.type === 'ImportNamespaceSpecifier') {
context.report({
node: specifier,
messageId: 'noChaiNamespace',
});
} else if (specifier.type === 'ImportSpecifier') {
const importedName =
specifier.imported.type === 'Identifier' ? specifier.imported.name : specifier.imported.value;
if (importedName === 'expect') {
context.report({
node: specifier,
messageId: 'noChaiExpect',
});
}
}
}
},
};
},
});