123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113 |
- "use strict";
- Object.defineProperty(exports, "__esModule", { value: true });
- exports.RULE_NAME = void 0;
- const utils_1 = require("@typescript-eslint/utils");
- const create_testing_library_rule_1 = require("../create-testing-library-rule");
- const node_utils_1 = require("../node-utils");
- const USER_EVENT_ASYNC_EXCEPTIONS = ['type', 'keyboard'];
- const VALID_EVENT_MODULES = ['fire-event', 'user-event'];
- exports.RULE_NAME = 'no-await-sync-events';
- exports.default = (0, create_testing_library_rule_1.createTestingLibraryRule)({
- name: exports.RULE_NAME,
- meta: {
- type: 'problem',
- docs: {
- description: 'Disallow unnecessary `await` for sync events',
- recommendedConfig: {
- dom: false,
- angular: false,
- react: false,
- vue: false,
- marko: false,
- },
- },
- messages: {
- noAwaitSyncEvents: '`{{ name }}` is sync and does not need `await` operator',
- },
- schema: [
- {
- type: 'object',
- properties: {
- eventModules: {
- type: 'array',
- minItems: 1,
- items: {
- enum: VALID_EVENT_MODULES,
- },
- },
- },
- additionalProperties: false,
- },
- ],
- },
- defaultOptions: [{ eventModules: VALID_EVENT_MODULES }],
- create(context, [options], helpers) {
- const { eventModules = VALID_EVENT_MODULES } = options;
- let hasDelayDeclarationOrAssignmentGTZero;
- return {
- VariableDeclaration(node) {
- hasDelayDeclarationOrAssignmentGTZero = node.declarations.some((property) => utils_1.ASTUtils.isIdentifier(property.id) &&
- property.id.name === 'delay' &&
- (0, node_utils_1.isLiteral)(property.init) &&
- property.init.value &&
- property.init.value > 0);
- },
- AssignmentExpression(node) {
- if (utils_1.ASTUtils.isIdentifier(node.left) &&
- node.left.name === 'delay' &&
- (0, node_utils_1.isLiteral)(node.right) &&
- node.right.value !== null) {
- hasDelayDeclarationOrAssignmentGTZero = node.right.value > 0;
- }
- },
- 'AwaitExpression > CallExpression'(node) {
- var _a;
- const simulateEventFunctionIdentifier = (0, node_utils_1.getDeepestIdentifierNode)(node);
- if (!simulateEventFunctionIdentifier) {
- return;
- }
- const isUserEventMethod = helpers.isUserEventMethod(simulateEventFunctionIdentifier);
- const isFireEventMethod = helpers.isFireEventMethod(simulateEventFunctionIdentifier);
- const isSimulateEventMethod = isUserEventMethod || isFireEventMethod;
- if (!isSimulateEventMethod) {
- return;
- }
- if (isFireEventMethod && !eventModules.includes('fire-event')) {
- return;
- }
- if (isUserEventMethod && !eventModules.includes('user-event')) {
- return;
- }
- const lastArg = node.arguments[node.arguments.length - 1];
- const hasDelayProperty = (0, node_utils_1.isObjectExpression)(lastArg) &&
- lastArg.properties.some((property) => (0, node_utils_1.isProperty)(property) &&
- utils_1.ASTUtils.isIdentifier(property.key) &&
- property.key.name === 'delay');
- const hasDelayLiteralGTZero = (0, node_utils_1.isObjectExpression)(lastArg) &&
- lastArg.properties.some((property) => (0, node_utils_1.isProperty)(property) &&
- utils_1.ASTUtils.isIdentifier(property.key) &&
- property.key.name === 'delay' &&
- (0, node_utils_1.isLiteral)(property.value) &&
- !!property.value.value &&
- property.value.value > 0);
- const simulateEventFunctionName = simulateEventFunctionIdentifier.name;
- if (USER_EVENT_ASYNC_EXCEPTIONS.includes(simulateEventFunctionName) &&
- hasDelayProperty &&
- (hasDelayDeclarationOrAssignmentGTZero || hasDelayLiteralGTZero)) {
- return;
- }
- const eventModuleName = (_a = (0, node_utils_1.getPropertyIdentifierNode)(node)) === null || _a === void 0 ? void 0 : _a.name;
- const eventFullName = eventModuleName
- ? `${eventModuleName}.${simulateEventFunctionName}`
- : simulateEventFunctionName;
- context.report({
- node,
- messageId: 'noAwaitSyncEvents',
- data: {
- name: eventFullName,
- },
- });
- },
- };
- },
- });
|