58 lines
2.5 KiB
JavaScript
58 lines
2.5 KiB
JavaScript
import { TSESTree } from '@typescript-eslint/types';
|
|
import { isNodeTypeClass, findClassProperty, findObjectProperty, createRule, } from '../utils/index.js';
|
|
export const NodeUsableAsToolRule = createRule({
|
|
name: 'node-usable-as-tool',
|
|
meta: {
|
|
type: 'problem',
|
|
docs: {
|
|
description: 'Ensure node classes have usableAsTool property',
|
|
},
|
|
messages: {
|
|
missingUsableAsTool: 'Node class should have usableAsTool property. When in doubt, set it to true.',
|
|
},
|
|
fixable: 'code',
|
|
schema: [],
|
|
},
|
|
defaultOptions: [],
|
|
create(context) {
|
|
return {
|
|
ClassDeclaration(node) {
|
|
if (!isNodeTypeClass(node)) {
|
|
return;
|
|
}
|
|
const descriptionProperty = findClassProperty(node, 'description');
|
|
if (!descriptionProperty) {
|
|
return;
|
|
}
|
|
const descriptionValue = descriptionProperty.value;
|
|
if (descriptionValue?.type !== TSESTree.AST_NODE_TYPES.ObjectExpression) {
|
|
return;
|
|
}
|
|
const usableAsToolProperty = findObjectProperty(descriptionValue, 'usableAsTool');
|
|
if (!usableAsToolProperty) {
|
|
context.report({
|
|
node,
|
|
messageId: 'missingUsableAsTool',
|
|
fix(fixer) {
|
|
if (descriptionValue?.type === TSESTree.AST_NODE_TYPES.ObjectExpression) {
|
|
const properties = descriptionValue.properties;
|
|
if (properties.length === 0) {
|
|
const openBrace = descriptionValue.range[0] + 1;
|
|
return fixer.insertTextAfterRange([openBrace, openBrace], '\n\t\tusableAsTool: true,');
|
|
}
|
|
else {
|
|
const lastProperty = properties.at(-1);
|
|
if (lastProperty) {
|
|
return fixer.insertTextAfter(lastProperty, ',\n\t\tusableAsTool: true');
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
},
|
|
});
|
|
}
|
|
},
|
|
};
|
|
},
|
|
});
|
|
//# sourceMappingURL=node-usable-as-tool.js.map
|