UNPKG

eslint-plugin-formatjs

Version:
72 lines (71 loc) 2.58 kB
import { parse, TYPE, } from '@formatjs/icu-messageformat-parser'; import { getParserServices } from '../context-compat'; import { extractMessages, getSettings } from '../util'; function verifyAst(ast) { if (ast.length !== 1) { return; } switch (ast[0].type) { case TYPE.argument: return 'unnecessaryFormat'; case TYPE.number: return 'unnecessaryFormatNumber'; case TYPE.date: return 'unnecessaryFormatDate'; case TYPE.time: return 'unnecessaryFormatTime'; } } function checkNode(context, node) { const settings = getSettings(context); const msgs = extractMessages(node, settings); for (const [{ message: { defaultMessage }, messageNode, },] of msgs) { if (!defaultMessage || !messageNode) { continue; } const messageId = verifyAst(parse(defaultMessage, { ignoreTag: settings.ignoreTag, })); if (messageId) context.report({ node: messageNode, messageId, }); } } export const name = 'no-useless-message'; export const rule = { meta: { type: 'problem', docs: { description: 'Disallow unnecessary formatted message', url: 'https://formatjs.github.io/docs/tooling/linter#no-useless-message', }, fixable: 'code', schema: [], messages: { unnecessaryFormat: 'Unnecessary formatted message.', unnecessaryFormatNumber: 'Unnecessary formatted message: just use FormattedNumber or intl.formatNumber.', unnecessaryFormatDate: 'Unnecessary formatted message: just use FormattedDate or intl.formatDate.', unnecessaryFormatTime: 'Unnecessary formatted message: just use FormattedTime or intl.formatTime.', }, }, defaultOptions: [], create(context) { const callExpressionVisitor = (node) => checkNode(context, node); const parserServices = getParserServices(context); //@ts-expect-error defineTemplateBodyVisitor exists in Vue parser if (parserServices?.defineTemplateBodyVisitor) { //@ts-expect-error return parserServices.defineTemplateBodyVisitor({ CallExpression: callExpressionVisitor, }, { CallExpression: callExpressionVisitor, }); } return { JSXOpeningElement: (node) => checkNode(context, node), CallExpression: callExpressionVisitor, }; }, };