eslint-plugin-formatjs 6.4.3 → 6.4.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.d.ts +15 -12
- package/index.js +4603 -54
- package/index.js.map +1 -0
- package/package.json +3 -3
- package/util.d.ts +654 -29
- package/util.js +62 -134
- package/util.js.map +1 -0
- package/emoji-data.generated.d.ts +0 -27
- package/emoji-data.generated.js +0 -2564
- package/emoji-utils.d.ts +0 -43
- package/emoji-utils.js +0 -145
- package/messages.d.ts +0 -2
- package/messages.js +0 -1
- package/rules/blocklist-elements.d.ts +0 -14
- package/rules/blocklist-elements.js +0 -129
- package/rules/enforce-default-message.d.ts +0 -7
- package/rules/enforce-default-message.js +0 -57
- package/rules/enforce-description.d.ts +0 -11
- package/rules/enforce-description.js +0 -97
- package/rules/enforce-id.d.ts +0 -8
- package/rules/enforce-id.js +0 -135
- package/rules/enforce-placeholders.d.ts +0 -3
- package/rules/enforce-placeholders.js +0 -128
- package/rules/enforce-plural-rules.d.ts +0 -14
- package/rules/enforce-plural-rules.js +0 -108
- package/rules/no-camel-case.d.ts +0 -3
- package/rules/no-camel-case.js +0 -85
- package/rules/no-complex-selectors.d.ts +0 -3
- package/rules/no-complex-selectors.js +0 -119
- package/rules/no-emoji.d.ts +0 -8
- package/rules/no-emoji.js +0 -88
- package/rules/no-id.d.ts +0 -3
- package/rules/no-id.js +0 -48
- package/rules/no-invalid-icu.d.ts +0 -3
- package/rules/no-invalid-icu.js +0 -56
- package/rules/no-literal-string-in-jsx.d.ts +0 -3
- package/rules/no-literal-string-in-jsx.js +0 -161
- package/rules/no-literal-string-in-object.d.ts +0 -3
- package/rules/no-literal-string-in-object.js +0 -59
- package/rules/no-missing-icu-plural-one-placeholders.d.ts +0 -5
- package/rules/no-missing-icu-plural-one-placeholders.js +0 -94
- package/rules/no-multiple-plurals.d.ts +0 -3
- package/rules/no-multiple-plurals.js +0 -76
- package/rules/no-multiple-whitespaces.d.ts +0 -3
- package/rules/no-multiple-whitespaces.js +0 -126
- package/rules/no-offset.d.ts +0 -3
- package/rules/no-offset.js +0 -75
- package/rules/no-useless-message.d.ts +0 -3
- package/rules/no-useless-message.js +0 -69
- package/rules/prefer-formatted-message.d.ts +0 -3
- package/rules/prefer-formatted-message.js +0 -26
- package/rules/prefer-full-sentence.d.ts +0 -3
- package/rules/prefer-full-sentence.js +0 -111
- package/rules/prefer-pound-in-plural.d.ts +0 -3
- package/rules/prefer-pound-in-plural.js +0 -163
package/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["name","verifyAst","checkNode","rule","Option","name","checkNode","rule","checkNode","name","rule","checkNode","name","rule","checkNode","name","rule","verifyAst","checkNode","name","rule","name","verifyAst","checkNode","rule","checkNode","name","rule","name","checkNode","rule","name","checkNode","rule","name","checkNode","rule","name","rule","name","verifyAst","checkNode","rule","verifyAst","checkNode","name","rule","checkNode","name","rule","verifyAst","checkNode","name","rule","verifyAst","checkNode","name","rule","name","rule","checkNode","name","rule","name","rule","name","(packageJsonNs as any).default","packageJsonNs","blocklistElementRuleName","blocklistElements","enforceDefaultMessageName","enforceDefaultMessage","enforceDescriptionName","enforceDescription","enforceIdName","enforceId","enforcePlaceholdersName","enforcePlaceholders","enforcePluralRulesName","enforcePluralRules","noCamelCaseName","noCamelCase","noComplexSelectorsName","noComplexSelectors","noEmojiName","noEmoji","noIdName","noId","noInvalidICUName","noInvalidICU","noLiteralStringInJsxName","noLiteralStringInJsx","noMultiplePluralsName","noMultiplePlurals","noMultipleWhitespacesName","noMultipleWhitespaces","noOffsetName","noOffset","noUselessMessageName","noUselessMessage","preferFormattedMessageName","preferFormattedMessage","preferPoundInPluralName","preferPoundInPlural","noMissingIcuPluralOnePlaceholdersName","noMissingIcuPluralOnePlaceholders","noLiteralStringInObjectName","noLiteralStringInObject","preferFullSentenceName","preferFullSentence"],"sources":["../util.ts","../messages.ts","../rules/blocklist-elements.ts","../rules/enforce-default-message.ts","../rules/enforce-description.ts","../rules/enforce-id.ts","../rules/enforce-placeholders.ts","../rules/enforce-plural-rules.ts","../rules/no-camel-case.ts","../rules/no-complex-selectors.ts","../emoji-data.generated.ts","../emoji-utils.ts","../rules/no-emoji.ts","../rules/no-id.ts","../rules/no-invalid-icu.ts","../rules/no-literal-string-in-jsx.ts","../rules/no-missing-icu-plural-one-placeholders.ts","../rules/no-multiple-plurals.ts","../rules/no-multiple-whitespaces.ts","../rules/no-offset.ts","../rules/no-useless-message.ts","../rules/prefer-formatted-message.ts","../rules/prefer-pound-in-plural.ts","../rules/no-literal-string-in-object.ts","../rules/prefer-full-sentence.ts","../package.json","../index.ts"],"sourcesContent":["import type {MessageFormatElement} from '@formatjs/icu-messageformat-parser'\nimport type {Rule} from 'eslint'\nimport type {\n BinaryExpression,\n Expression,\n Literal,\n Node,\n ObjectExpression,\n Property,\n TemplateLiteral,\n} from 'estree-jsx'\nimport type {JSXAttribute, JSXOpeningElement} from 'estree-jsx'\n\nexport interface MessageDescriptor {\n id?: string\n defaultMessage?: string\n description?: string | object\n}\n\nconst FORMAT_FUNCTION_NAMES = new Set(['$formatMessage', 'formatMessage', '$t'])\nconst COMPONENT_NAMES = new Set(['FormattedMessage'])\nconst DECLARATION_FUNCTION_NAMES = new Set(['defineMessage'])\n\nexport interface Settings {\n excludeMessageDeclCalls?: boolean\n additionalFunctionNames?: string[]\n additionalComponentNames?: string[]\n ignoreTag?: boolean\n}\nexport interface MessageDescriptorNodeInfo {\n message: MessageDescriptor\n messageDescriptorNode: ObjectExpression | JSXOpeningElement\n messageNode?: Property['value'] | JSXAttribute['value']\n messagePropNode?: Property | JSXAttribute\n descriptionNode?: Property['value'] | JSXAttribute['value']\n idValueNode?: Property['value'] | JSXAttribute['value']\n idPropNode?: Property | JSXAttribute\n}\n\nexport function getSettings({settings}: Rule.RuleContext): Settings {\n return settings.formatjs ?? settings\n}\n\nfunction isStringLiteral(node: Node): node is Literal & {value: string} {\n return node.type === 'Literal' && typeof node.value === 'string'\n}\n\nfunction isTemplateLiteralWithoutVar(node: Node): node is TemplateLiteral {\n return node.type === 'TemplateLiteral' && node.quasis.length === 1\n}\n\nfunction staticallyEvaluateStringConcat(\n node: BinaryExpression\n): [result: string, isStaticallyEvaluatable: boolean] {\n const right = node.right as Node\n const left = node.left as Node\n if (!isStringLiteral(right)) {\n return ['', false]\n }\n if (isStringLiteral(left)) {\n return [left.value + right.value, true]\n }\n if (node.left.type === 'BinaryExpression') {\n const [result, isStaticallyEvaluatable] = staticallyEvaluateStringConcat(\n node.left\n )\n return [result + right.value, isStaticallyEvaluatable]\n }\n return ['', false]\n}\n\nexport function isIntlFormatMessageCall(node: Node): boolean {\n // GH #4890: Check for both MemberExpression (intl.formatMessage) and Identifier (formatMessage) patterns\n if (node.type !== 'CallExpression') {\n return false\n }\n\n // Check if call has at least one argument that is an object expression\n if (\n node.arguments.length < 1 ||\n node.arguments[0].type !== 'ObjectExpression'\n ) {\n return false\n }\n\n // Pattern 1: intl.formatMessage() or something.intl.formatMessage()\n if (node.callee.type === 'MemberExpression') {\n return (\n ((node.callee.object.type === 'Identifier' &&\n node.callee.object.name === 'intl') ||\n (node.callee.object.type === 'MemberExpression' &&\n node.callee.object.property.type === 'Identifier' &&\n node.callee.object.property.name === 'intl')) &&\n node.callee.property.type === 'Identifier' &&\n (node.callee.property.name === 'formatMessage' ||\n node.callee.property.name === '$t')\n )\n }\n\n // Pattern 2: formatMessage() (destructured from useIntl)\n if (node.callee.type === 'Identifier') {\n return FORMAT_FUNCTION_NAMES.has(node.callee.name)\n }\n\n return false\n}\n\nfunction isSingleMessageDescriptorDeclaration(\n node: Node,\n functionNames: Set<string>\n) {\n return (\n node.type === 'CallExpression' &&\n node.callee.type === 'Identifier' &&\n functionNames.has(node.callee.name)\n )\n}\n\nfunction isMultipleMessageDescriptorDeclaration(node: Node) {\n return (\n node.type === 'CallExpression' &&\n node.callee.type === 'Identifier' &&\n node.callee.name === 'defineMessages'\n )\n}\n\nexport function extractMessageDescriptor(\n node?: Expression\n): MessageDescriptorNodeInfo | undefined {\n if (!node || node.type !== 'ObjectExpression') {\n return\n }\n const result: MessageDescriptorNodeInfo = {\n messageDescriptorNode: node,\n message: {},\n messageNode: undefined,\n messagePropNode: undefined,\n descriptionNode: undefined,\n idValueNode: undefined,\n }\n for (const prop of node.properties) {\n if (prop.type !== 'Property' || prop.key.type !== 'Identifier') {\n continue\n }\n\n // Only extract values for message-related props\n // GH #5069: Don't process other props like tagName, values, etc.\n const propName = prop.key.name\n if (\n propName !== 'id' &&\n propName !== 'defaultMessage' &&\n propName !== 'description'\n ) {\n continue\n }\n\n const valueNode = prop.value\n let value: string | undefined = undefined\n if (isStringLiteral(valueNode as Node)) {\n value = (valueNode as Literal & {value: string}).value\n }\n // like \"`asd`\"\n else if (isTemplateLiteralWithoutVar(valueNode as Node)) {\n value = (valueNode as TemplateLiteral).quasis[0].value.cooked ?? undefined\n }\n // like \"dedent`asd`\"\n else if (valueNode.type === 'TaggedTemplateExpression') {\n const {quasi} = valueNode\n if (!isTemplateLiteralWithoutVar(quasi as Node)) {\n throw new Error('Tagged template expression must be no substitution')\n }\n value = quasi.quasis[0].value.cooked ?? undefined\n }\n // like \"`asd` + `asd`\"\n else if (valueNode.type === 'BinaryExpression') {\n const [result, isStatic] = staticallyEvaluateStringConcat(valueNode)\n if (isStatic) {\n value = result\n }\n }\n\n switch (propName) {\n case 'defaultMessage':\n result.messagePropNode = prop\n result.messageNode = valueNode\n result.message.defaultMessage = value\n break\n case 'description':\n result.descriptionNode = valueNode\n result.message.description = value\n break\n case 'id':\n result.message.id = value\n result.idValueNode = valueNode\n result.idPropNode = prop\n break\n }\n }\n return result\n}\n\nfunction extractMessageDescriptorFromJSXElement(\n node?: JSXOpeningElement\n): [MessageDescriptorNodeInfo, ObjectExpression | undefined] | undefined {\n if (!node || !node.attributes) {\n return\n }\n let values: ObjectExpression | undefined\n const result: MessageDescriptorNodeInfo = {\n messageDescriptorNode: node,\n message: {},\n messageNode: undefined,\n messagePropNode: undefined,\n descriptionNode: undefined,\n idValueNode: undefined,\n idPropNode: undefined,\n }\n let hasSpreadAttribute = false\n for (const prop of node.attributes) {\n // We can't analyze spread attr\n if (prop.type === 'JSXSpreadAttribute') {\n hasSpreadAttribute = true\n }\n if (prop.type !== 'JSXAttribute' || prop.name.type !== 'JSXIdentifier') {\n continue\n }\n const key = prop.name\n const keyName = key.name\n\n // Only extract values for message-related props\n // GH #5069: Don't process other props like tagName, values, etc.\n // Allow them to have tagged templates with substitutions\n const isMessageProp =\n keyName === 'id' ||\n keyName === 'defaultMessage' ||\n keyName === 'description'\n\n let valueNode = prop.value\n let value: string | undefined = undefined\n if (valueNode && isMessageProp) {\n if (isStringLiteral(valueNode as Node)) {\n value = (valueNode as Literal & {value: string}).value\n } else if (valueNode?.type === 'JSXExpressionContainer') {\n const {expression} = valueNode\n if (expression.type === 'BinaryExpression') {\n const [result, isStatic] = staticallyEvaluateStringConcat(expression)\n if (isStatic) {\n value = result\n }\n }\n // like \"`asd`\"\n else if (isTemplateLiteralWithoutVar(expression as Node)) {\n value =\n (expression as TemplateLiteral).quasis[0].value.cooked ?? undefined\n }\n // like \"dedent`asd`\"\n else if (expression.type === 'TaggedTemplateExpression') {\n const {quasi} = expression\n if (!isTemplateLiteralWithoutVar(quasi as Node)) {\n throw new Error(\n 'Tagged template expression must be no substitution'\n )\n }\n value = quasi.quasis[0].value.cooked ?? undefined\n }\n }\n }\n\n switch (keyName) {\n case 'defaultMessage':\n result.messagePropNode = prop\n result.messageNode = valueNode\n if (value) {\n result.message.defaultMessage = value\n }\n break\n case 'description':\n result.descriptionNode = valueNode\n if (value) {\n result.message.description = value\n }\n break\n case 'id':\n result.idValueNode = valueNode\n result.idPropNode = prop\n if (value) {\n result.message.id = value\n }\n break\n case 'values':\n if (\n valueNode?.type === 'JSXExpressionContainer' &&\n valueNode.expression.type === 'ObjectExpression'\n ) {\n values = valueNode.expression\n }\n break\n }\n }\n if (\n !result.messagePropNode &&\n !result.descriptionNode &&\n !result.idPropNode &&\n hasSpreadAttribute\n ) {\n return\n }\n return [result, values]\n}\n\nfunction extractMessageDescriptors(node?: Expression) {\n if (!node || node.type !== 'ObjectExpression' || !node.properties.length) {\n return []\n }\n const msgs = []\n for (const prop of node.properties) {\n if (prop.type !== 'Property') {\n continue\n }\n const msg = prop.value\n if (msg.type !== 'ObjectExpression') {\n continue\n }\n const nodeInfo = extractMessageDescriptor(msg as Expression)\n if (nodeInfo) {\n msgs.push(nodeInfo)\n }\n }\n return msgs\n}\n\nexport function extractMessages(\n node: Node,\n {\n additionalComponentNames,\n additionalFunctionNames,\n excludeMessageDeclCalls,\n }: Settings = {}\n): Array<[MessageDescriptorNodeInfo, Expression | undefined]> {\n const allFormatFunctionNames = Array.isArray(additionalFunctionNames)\n ? new Set([\n ...Array.from(FORMAT_FUNCTION_NAMES),\n ...additionalFunctionNames,\n ])\n : FORMAT_FUNCTION_NAMES\n const allComponentNames = Array.isArray(additionalComponentNames)\n ? new Set([...Array.from(COMPONENT_NAMES), ...additionalComponentNames])\n : COMPONENT_NAMES\n if (node.type === 'CallExpression') {\n const args0 = node.arguments[0]\n const args1 = node.arguments[1]\n // We can't really analyze spread element\n if (!args0 || args0.type === 'SpreadElement') {\n return []\n }\n if (\n (!excludeMessageDeclCalls &&\n isSingleMessageDescriptorDeclaration(\n node,\n DECLARATION_FUNCTION_NAMES\n )) ||\n isIntlFormatMessageCall(node) ||\n isSingleMessageDescriptorDeclaration(node, allFormatFunctionNames)\n ) {\n const msgDescriptorNodeInfo = extractMessageDescriptor(args0)\n if (msgDescriptorNodeInfo && (!args1 || args1.type !== 'SpreadElement')) {\n return [[msgDescriptorNodeInfo, args1 as Expression]]\n }\n } else if (\n !excludeMessageDeclCalls &&\n isMultipleMessageDescriptorDeclaration(node)\n ) {\n return extractMessageDescriptors(args0).map(msg => [msg, undefined])\n }\n } else if (\n node.type === 'JSXOpeningElement' &&\n node.name &&\n node.name.type === 'JSXIdentifier' &&\n allComponentNames.has(node.name.name)\n ) {\n const msgDescriptorNodeInfo = extractMessageDescriptorFromJSXElement(node)\n if (msgDescriptorNodeInfo) {\n return [msgDescriptorNodeInfo]\n }\n }\n return []\n}\n\n/**\n * Apply changes to the ICU message in code. The return value can be used in\n * `fixer.replaceText(messageNode, <return value>)`. If the return value is null,\n * it means that the patch cannot be applied.\n */\nexport function patchMessage(\n messageNode: Node,\n ast: MessageFormatElement[],\n patcher: (messageContent: string, ast: MessageFormatElement[]) => string\n): string | null {\n if (\n messageNode.type === 'Literal' &&\n messageNode.value &&\n typeof messageNode.value === 'string'\n ) {\n return (\n '\"' + patcher(messageNode.value as string, ast).replace('\"', '\\\\\"') + '\"'\n )\n } else if (\n messageNode.type === 'TemplateLiteral' &&\n messageNode.quasis.length === 1 &&\n messageNode.expressions.length === 0\n ) {\n return (\n '`' +\n patcher(messageNode.quasis[0].value.cooked!, ast)\n .replace(/\\\\/g, '\\\\\\\\')\n .replace(/`/g, '\\\\`') +\n '`'\n )\n }\n\n return null\n}\n","export type CoreMessageIds = 'parseError'\n\nexport const CORE_MESSAGES: Record<CoreMessageIds, string> = {\n parseError: `Failed to parse message string {{error}}`,\n}\n","import {\n type MessageFormatElement,\n isArgumentElement,\n isDateElement,\n isLiteralElement,\n isNumberElement,\n isPluralElement,\n isSelectElement,\n isTagElement,\n isTimeElement,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {\n type CoreMessageIds,\n CORE_MESSAGES,\n} from '#packages/eslint-plugin-formatjs/messages.js'\n\ntype MessageIds = 'blocklist' | CoreMessageIds\n\nexport const name = 'blocklist-elements'\n\nfunction getMessage(type: Element): {\n messageId: MessageIds\n data: Record<string, Element>\n} {\n return {\n messageId: 'blocklist',\n data: {type},\n }\n}\n\nexport enum Element {\n literal = 'literal',\n argument = 'argument',\n number = 'number',\n date = 'date',\n time = 'time',\n select = 'select',\n selectordinal = 'selectordinal',\n plural = 'plural',\n tag = 'tag',\n}\n\nfunction verifyAst(blocklist: Element[], ast: MessageFormatElement[]) {\n const errors: ReturnType<typeof getMessage>[] = []\n for (const el of ast) {\n if (isLiteralElement(el) && blocklist.includes(Element.literal)) {\n errors.push(getMessage(Element.literal))\n }\n if (isArgumentElement(el) && blocklist.includes(Element.argument)) {\n errors.push(getMessage(Element.argument))\n }\n if (isNumberElement(el) && blocklist.includes(Element.number)) {\n errors.push(getMessage(Element.number))\n }\n if (isDateElement(el) && blocklist.includes(Element.date)) {\n errors.push(getMessage(Element.date))\n }\n if (isTimeElement(el) && blocklist.includes(Element.time)) {\n errors.push(getMessage(Element.time))\n }\n if (isSelectElement(el) && blocklist.includes(Element.select)) {\n errors.push(getMessage(Element.select))\n }\n if (isTagElement(el) && blocklist.includes(Element.tag)) {\n errors.push(getMessage(Element.tag))\n }\n if (isPluralElement(el)) {\n if (blocklist.includes(Element.plural)) {\n errors.push(getMessage(Element.argument))\n }\n if (\n el.pluralType === 'ordinal' &&\n blocklist.includes(Element.selectordinal)\n ) {\n errors.push(getMessage(Element.selectordinal))\n }\n }\n if (isSelectElement(el) || isPluralElement(el)) {\n const {options} = el\n for (const selector of Object.keys(options)) {\n verifyAst(blocklist, options[selector].value)\n }\n }\n }\n\n return errors\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, settings)\n if (!msgs.length) {\n return\n }\n\n const blocklist = context.options[0]\n if (!Array.isArray(blocklist) || !blocklist.length) {\n return\n }\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n continue\n }\n const errors = verifyAst(blocklist, ast)\n for (const error of errors) {\n context.report({\n node: messageNode,\n ...error,\n })\n }\n }\n}\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Disallow specific elements in ICU message format',\n url: 'https://formatjs.github.io/docs/tooling/linter#blocklist-elements',\n },\n fixable: 'code',\n schema: [\n {\n type: 'array',\n items: {\n type: 'string',\n enum: Object.keys(Element),\n },\n },\n ],\n messages: {\n ...CORE_MESSAGES,\n blocklist: `{{type}} element is blocklisted`,\n },\n },\n create(context) {\n const callExpressionVisitor: Rule.RuleListener['CallExpression'] = node =>\n checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: node => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\n\nexport enum Option {\n literal = 'literal',\n anything = 'anything',\n}\n\nexport const name = 'enforce-default-message'\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node, getSettings(context))\n const {\n options: [type],\n } = context\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n messageDescriptorNode,\n },\n ] of msgs) {\n if (!defaultMessage) {\n if (type === 'literal' && messageNode) {\n context.report({\n node: messageNode,\n messageId: 'defaultMessageLiteral',\n })\n } else if (!messageNode) {\n context.report({\n node: messageDescriptorNode,\n messageId: 'defaultMessage',\n })\n }\n }\n }\n}\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Enforce defaultMessage in message descriptor',\n url: 'https://formatjs.github.io/docs/tooling/linter#enforce-default-message',\n },\n fixable: 'code',\n schema: [\n {\n type: 'string',\n enum: Object.keys(Option),\n },\n ],\n messages: {\n defaultMessageLiteral: `\"defaultMessage\" must be:\n- a string literal or\n- template literal without variable`,\n defaultMessage:\n '`defaultMessage` has to be specified in message descriptor',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\n\nexport enum Option {\n literal = 'literal',\n anything = 'anything',\n}\n\nexport type ObjectOption = {\n mode?: Option\n minLength?: number\n}\n\ntype NormalizedOption = {\n mode: Option | undefined\n minLength: number | undefined\n}\n\nfunction normalizeOptions(\n raw: string | ObjectOption | undefined\n): NormalizedOption {\n if (typeof raw === 'string') {\n return {mode: raw as Option, minLength: undefined}\n }\n if (typeof raw === 'object' && raw !== null) {\n return {mode: raw.mode, minLength: raw.minLength}\n }\n return {mode: undefined, minLength: undefined}\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node, getSettings(context))\n const {mode: type, minLength} = normalizeOptions(context.options[0])\n for (const [\n {\n message: {description},\n descriptionNode,\n messageDescriptorNode,\n },\n ] of msgs) {\n if (!description) {\n if (type === 'literal' && descriptionNode) {\n context.report({\n node: descriptionNode,\n messageId: 'enforceDescriptionLiteral',\n })\n } else if (!descriptionNode) {\n context.report({\n node: messageDescriptorNode,\n messageId: 'enforceDescription',\n })\n }\n } else if (\n typeof minLength === 'number' &&\n typeof description === 'string' &&\n description.length < minLength\n ) {\n context.report({\n node: descriptionNode ?? messageDescriptorNode,\n messageId: 'enforceDescriptionMinLength',\n data: {\n minLength: String(minLength),\n length: String(description.length),\n },\n })\n }\n }\n}\n\nexport const name = 'enforce-description'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Enforce description in message descriptor',\n url: 'https://formatjs.github.io/docs/tooling/linter#enforce-description',\n },\n fixable: 'code',\n schema: [\n {\n oneOf: [\n {\n type: 'string',\n enum: Object.keys(Option),\n },\n {\n type: 'object',\n properties: {\n mode: {\n type: 'string',\n enum: Object.keys(Option),\n },\n minLength: {\n type: 'integer',\n minimum: 1,\n },\n },\n additionalProperties: false,\n minProperties: 1,\n },\n ],\n },\n ],\n messages: {\n enforceDescription:\n '`description` has to be specified in message descriptor',\n enforceDescriptionLiteral:\n '`description` has to be a string literal (not function call or variable)',\n enforceDescriptionMinLength:\n '`description` must be at least {{minLength}} characters long (currently {{length}})',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {interpolateName} from '@formatjs/ts-transformer'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\n\nexport type Option = {\n idInterpolationPattern: string\n idWhitelist?: string[]\n quoteStyle?: 'single' | 'double'\n}\n\ntype MessageIds =\n | 'enforceId'\n | 'enforceIdDefaultMessage'\n | 'enforceIdDescription'\n | 'enforceIdMatching'\n | 'enforceIdMatchingAllowlisted'\n\ntype MatchingMessageData = {\n idInterpolationPattern: string\n expected: string\n actual: string | undefined\n idWhitelist?: string\n}\n\nfunction checkNode(\n context: Rule.RuleContext,\n node: Node,\n {\n idInterpolationPattern,\n idWhitelistRegexps,\n quoteStyle,\n }: {\n idInterpolationPattern: string\n idWhitelistRegexps?: RegExp[]\n quoteStyle: 'single' | 'double'\n }\n) {\n const msgs = extractMessages(node, getSettings(context))\n for (const [\n {\n message: {defaultMessage, description, id},\n idPropNode,\n descriptionNode,\n messagePropNode,\n messageDescriptorNode,\n },\n ] of msgs) {\n if (!idInterpolationPattern && !idPropNode) {\n context.report({\n node: messageDescriptorNode ?? node,\n messageId: 'enforceId',\n })\n return\n }\n\n if (idInterpolationPattern) {\n if (!defaultMessage) {\n context.report({\n node: messageDescriptorNode ?? node,\n messageId: 'enforceIdDefaultMessage',\n })\n } else if (!description && descriptionNode) {\n context.report({\n node: messageDescriptorNode ?? node,\n messageId: 'enforceIdDescription',\n })\n } else {\n if (\n idWhitelistRegexps &&\n id &&\n idWhitelistRegexps.some((r: RegExp) => r.test(id))\n ) {\n // messageId is allowlisted so skip interpolation id check\n continue\n }\n\n const correctId = interpolateName(\n {\n resourcePath: context.filename,\n },\n idInterpolationPattern,\n {\n content: description\n ? `${defaultMessage}#${description}`\n : defaultMessage,\n }\n )\n if (id !== correctId) {\n let messageId: MessageIds = 'enforceIdMatching'\n let messageData: MatchingMessageData = {\n idInterpolationPattern,\n expected: correctId,\n actual: id,\n }\n if (idWhitelistRegexps) {\n messageId = 'enforceIdMatchingAllowlisted'\n messageData = {\n ...messageData,\n idWhitelist: idWhitelistRegexps\n .map(r => `\"${r.toString()}\"`)\n .join(', '),\n }\n }\n\n const quote = quoteStyle === 'double' ? '\"' : \"'\"\n context.report({\n node: idPropNode ?? messageDescriptorNode ?? node,\n messageId,\n data: messageData,\n fix(fixer) {\n if (idPropNode) {\n if (idPropNode.type === 'JSXAttribute') {\n // Always use double quotes for JSX attributes\n return fixer.replaceText(idPropNode, `id=\"${correctId}\"`)\n }\n return fixer.replaceText(\n idPropNode,\n `id: ${quote}${correctId}${quote}`\n )\n }\n\n if (messagePropNode) {\n // Insert after default message node\n if (messagePropNode.type === 'JSXAttribute') {\n // Always use double quotes for JSX attributes\n return fixer.insertTextAfter(\n messagePropNode,\n ` id=\"${correctId}\"`\n )\n }\n return fixer.insertTextAfter(\n messagePropNode,\n `, id: ${quote}${correctId}${quote}`\n )\n }\n return null\n },\n })\n }\n }\n }\n }\n}\n\nexport const name = 'enforce-id'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Enforce (generated) ID in message descriptor',\n url: 'https://formatjs.github.io/docs/tooling/linter#enforce-id',\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {\n idInterpolationPattern: {\n type: 'string',\n description:\n 'Pattern to verify ID against. Recommended value: [sha512:contenthash:base64:6]',\n },\n idWhitelist: {\n type: 'array',\n description:\n \"An array of strings with regular expressions. This array allows allowlist custom ids for messages. For example '`\\\\\\\\.`' allows any id which has dot; `'^payment_.*'` - allows any custom id which has prefix `payment_`. Be aware that any backslash \\\\ provided via string must be escaped with an additional backslash.\",\n items: {\n type: 'string',\n },\n },\n quoteStyle: {\n type: 'string',\n enum: ['single', 'double'],\n description:\n 'Quote style for generated IDs. Defaults to single quotes.',\n },\n },\n required: ['idInterpolationPattern'],\n additionalProperties: false,\n },\n ],\n messages: {\n enforceId: `id must be specified`,\n enforceIdDefaultMessage: `defaultMessage must be a string literal to calculate generated IDs`,\n enforceIdDescription: `description must be a string literal to calculate generated IDs`,\n enforceIdMatching: `\"id\" does not match with hash pattern {{idInterpolationPattern}}.\nExpected: {{expected}}\nActual: {{actual}}`,\n enforceIdMatchingAllowlisted: `\"id\" does not match with hash pattern {{idInterpolationPattern}} or allowlisted patterns {{idWhitelist}}.\nExpected: {{expected}}\nActual: {{actual}}`,\n },\n },\n create(context) {\n const tmp = context.options[0]\n let opts: {\n idInterpolationPattern: string\n idWhitelistRegexps?: RegExp[]\n quoteStyle: 'single' | 'double'\n } = {\n idInterpolationPattern: tmp?.idInterpolationPattern,\n quoteStyle: tmp?.quoteStyle || 'single',\n }\n if (Array.isArray(tmp?.idWhitelist)) {\n const {idWhitelist} = tmp\n opts.idWhitelistRegexps = idWhitelist.map(\n (str: string) => new RegExp(str, 'i')\n )\n }\n\n const callExpressionVisitor = (node: Node) => checkNode(context, node, opts)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node, opts),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type MessageFormatElement,\n TYPE,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Literal, Node, Property, SpreadElement} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {CORE_MESSAGES} from '#packages/eslint-plugin-formatjs/messages.js'\n\nfunction collectPlaceholderNames(ast: MessageFormatElement[]): Set<string> {\n const placeholderNames = new Set<string>()\n _traverse(ast)\n return placeholderNames\n\n function _traverse(ast: MessageFormatElement[]) {\n for (const element of ast) {\n switch (element.type) {\n case TYPE.literal:\n case TYPE.pound:\n break\n case TYPE.tag:\n placeholderNames.add(element.value)\n _traverse(element.children)\n break\n case TYPE.plural:\n case TYPE.select:\n placeholderNames.add(element.value)\n for (const {value} of Object.values(element.options)) {\n _traverse(value)\n }\n break\n default:\n placeholderNames.add(element.value)\n break\n }\n }\n }\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, {\n excludeMessageDeclCalls: true,\n ...settings,\n })\n const {\n options: [opt],\n } = context\n const ignoreList = new Set<string>(opt?.ignoreList || [])\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n values,\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n\n if (values && values.type !== 'ObjectExpression') {\n // cannot evaluate this\n continue\n }\n\n if (values?.properties.find(prop => prop.type === 'SpreadElement')) {\n // cannot evaluate the spread element\n continue\n }\n\n const literalElementByLiteralKey = new Map<\n string,\n Property | SpreadElement\n >()\n\n if (values) {\n for (const prop of values.properties) {\n if (prop.type === 'Property' && !prop.computed) {\n const name =\n prop.key.type === 'Identifier'\n ? prop.key.name\n : String((prop.key as Literal).value)\n literalElementByLiteralKey.set(name, prop)\n }\n }\n }\n\n let ast: MessageFormatElement[]\n\n try {\n ast = parse(defaultMessage, {ignoreTag: settings.ignoreTag})\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {error: e instanceof Error ? e.message : String(e)},\n })\n continue\n }\n\n const placeholderNames = collectPlaceholderNames(ast)\n\n const missingPlaceholders: string[] = []\n placeholderNames.forEach(name => {\n if (!ignoreList.has(name) && !literalElementByLiteralKey.has(name)) {\n missingPlaceholders.push(name)\n }\n })\n\n if (missingPlaceholders.length > 0) {\n context.report({\n node: messageNode,\n messageId: 'missingValue',\n data: {\n list: missingPlaceholders.join(', '),\n },\n })\n }\n\n literalElementByLiteralKey.forEach((element, key) => {\n if (!ignoreList.has(key) && !placeholderNames.has(key)) {\n context.report({\n node: element,\n messageId: 'unusedValue',\n })\n }\n })\n }\n}\n\nexport const name = 'enforce-placeholders'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Enforce that all messages with placeholders have enough passed-in values',\n url: 'https://formatjs.github.io/docs/tooling/linter#enforce-placeholders',\n },\n schema: [\n {\n type: 'object',\n properties: {\n ignoreList: {\n type: 'array',\n items: {\n type: 'string',\n },\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n ...CORE_MESSAGES,\n missingValue:\n 'Missing value(s) for the following placeholder(s): {{list}}.',\n unusedValue: 'Value not used by the message.',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type MessageFormatElement,\n isPluralElement,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {\n CORE_MESSAGES,\n type CoreMessageIds,\n} from '#packages/eslint-plugin-formatjs/messages.js'\n\nenum LDML {\n zero = 'zero',\n one = 'one',\n two = 'two',\n few = 'few',\n many = 'many',\n other = 'other',\n}\n\ntype PluralConfig = {[key in LDML]?: boolean}\nexport type Options = [PluralConfig?]\n\ntype MessageIds = 'missingPlural' | 'forbidden' | CoreMessageIds\n\nfunction verifyAst(plConfig: PluralConfig, ast: MessageFormatElement[]) {\n const errors: {messageId: MessageIds; data: Record<string, string>}[] = []\n for (const el of ast) {\n if (isPluralElement(el)) {\n const rules = Object.keys(plConfig) as Array<LDML>\n for (const rule of rules) {\n if (plConfig[rule] && !el.options[rule]) {\n errors.push({messageId: 'missingPlural', data: {rule}})\n }\n if (!plConfig[rule] && el.options[rule]) {\n errors.push({messageId: 'forbidden', data: {rule}})\n }\n }\n const {options} = el\n for (const selector of Object.keys(options)) {\n errors.push(...verifyAst(plConfig, options[selector].value))\n }\n }\n }\n\n return errors\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, settings)\n if (!msgs.length) {\n return\n }\n\n const plConfig = context.options[0]\n if (!plConfig) {\n return\n }\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n continue\n }\n const errors = verifyAst(plConfig, ast)\n for (const error of errors) {\n context.report({\n node: messageNode,\n ...error,\n })\n }\n }\n}\n\nexport const name = 'enforce-plural-rules'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Enforce plural rules to always specify certain categories like `one`/`other`',\n url: 'https://formatjs.github.io/docs/tooling/linter#enforce-plural-rules',\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: Object.keys(LDML).reduce(\n (schema: Record<string, {type: 'boolean'}>, k) => {\n schema[k] = {\n type: 'boolean',\n }\n return schema\n },\n {}\n ),\n additionalProperties: false,\n },\n ],\n messages: {\n ...CORE_MESSAGES,\n missingPlural: `Missing plural rule \"{{rule}}\"`,\n forbidden: `Plural rule \"{{rule}}\" is forbidden`,\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type MessageFormatElement,\n isArgumentElement,\n isPluralElement,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {\n CORE_MESSAGES,\n type CoreMessageIds,\n} from '#packages/eslint-plugin-formatjs/messages.js'\ntype MessageIds = 'camelcase' | CoreMessageIds\n\nexport const name = 'no-camel-case'\n\nconst CAMEL_CASE_REGEX = /[A-Z]/\n\nfunction verifyAst(ast: MessageFormatElement[]) {\n const errors: {messageId: MessageIds; data: Record<string, string>}[] = []\n for (const el of ast) {\n if (isArgumentElement(el)) {\n if (CAMEL_CASE_REGEX.test(el.value)) {\n errors.push({messageId: 'camelcase', data: {}})\n }\n continue\n }\n if (isPluralElement(el)) {\n if (CAMEL_CASE_REGEX.test(el.value)) {\n errors.push({messageId: 'camelcase', data: {}})\n }\n const {options} = el\n for (const selector of Object.keys(options)) {\n errors.push(...verifyAst(options[selector].value))\n }\n }\n }\n\n return errors\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, settings)\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n continue\n }\n const errors = verifyAst(ast)\n for (const error of errors) {\n context.report({\n node: messageNode,\n ...error,\n })\n }\n }\n}\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Disallow camel case placeholders in message',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-camel-case',\n },\n fixable: 'code',\n schema: [],\n messages: {\n ...CORE_MESSAGES,\n camelcase: 'Camel case arguments are not allowed',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type MessageFormatElement,\n TYPE,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {CORE_MESSAGES} from '#packages/eslint-plugin-formatjs/messages.js'\n\ninterface Config {\n limit: number\n}\n\nfunction calculateComplexity(ast: MessageFormatElement[]): number {\n // Dynamic programming: define a complexity function f, where:\n // f(plural | select) = sum(f(option) for each option) * f(next element),\n // f(tag) = f(first element of children) * f(next element),\n // f(other) = f(next element),\n // f(out of bound) = 1.\n const complexityByNode = new Map<MessageFormatElement, number>()\n return _calculate(ast, 0)\n\n function _calculate(ast: MessageFormatElement[], index: number): number {\n const element: MessageFormatElement | undefined = ast[index]\n if (!element) {\n return 1\n }\n\n const cachedComplexity = complexityByNode.get(element)\n if (cachedComplexity !== undefined) {\n return cachedComplexity\n }\n\n let complexity: number\n\n switch (element.type) {\n case TYPE.plural:\n case TYPE.select: {\n let sumOfOptions = 0\n for (const {value} of Object.values(element.options)) {\n sumOfOptions += _calculate(value, 0)\n }\n complexity = sumOfOptions * _calculate(ast, index + 1)\n break\n }\n case TYPE.tag:\n complexity =\n _calculate(element.children, 0) * _calculate(ast, index + 1)\n break\n default:\n complexity = _calculate(ast, index + 1)\n break\n }\n\n complexityByNode.set(element, complexity)\n return complexity\n }\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, settings)\n if (!msgs.length) {\n return\n }\n\n const config: Config = {\n limit: 20,\n ...context.options[0],\n }\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {error: e instanceof Error ? e.message : String(e)},\n })\n return\n }\n\n const complexity = calculateComplexity(ast)\n\n if (complexity > config.limit) {\n context.report({\n node: messageNode,\n messageId: 'tooComplex',\n data: {\n complexity,\n limit: config.limit,\n },\n })\n }\n }\n}\n\nexport const name = 'no-complex-selectors'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: `Make sure a sentence is not too complex.\nComplexity is determined by how many strings are produced when we try to\nflatten the sentence given its selectors. For example:\n\"I have {count, plural, one{a dog} other{many dogs}}\"\nhas the complexity of 2 because flattening the plural selector\nresults in 2 sentences: \"I have a dog\" & \"I have many dogs\".\nDefault complexity limit is 20\n(using Smartling as a reference: https://help.smartling.com/hc/en-us/articles/360008030994-ICU-MessageFormat)\n`,\n url: 'https://formatjs.github.io/docs/tooling/linter#no-complex-selectors',\n },\n schema: [\n {\n type: 'object',\n properties: {\n limit: {\n type: 'number',\n },\n },\n additionalProperties: false,\n },\n ],\n fixable: 'code',\n messages: {\n ...CORE_MESSAGES,\n tooComplex: `Message complexity is too high ({{complexity}} vs limit at {{limit}})`,\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","/**\n * Auto-generated emoji version data from Unicode emoji-data.txt\n * DO NOT EDIT MANUALLY - Generated by scripts/generate-emoji-data.ts\n *\n * Unicode Version: 17.0.0\n * Ranges: 418 emoji codepoint ranges\n */\n\nexport type EmojiVersion =\n | '0.0'\n | '0.6'\n | '0.7'\n | '1.0'\n | '2.0'\n | '3.0'\n | '4.0'\n | '5.0'\n | '11.0'\n | '12.0'\n | '13.0'\n | '14.0'\n | '15.0'\n | '16.0'\n | '17.0'\n\nexport const EMOJI_VERSIONS: EmojiVersion[] = [\n '0.0',\n '0.6',\n '0.7',\n '1.0',\n '2.0',\n '3.0',\n '4.0',\n '5.0',\n '11.0',\n '12.0',\n '13.0',\n '14.0',\n '15.0',\n '16.0',\n '17.0',\n]\n\nexport interface EmojiRange {\n /** Start codepoint (decimal) */\n start: number\n /** End codepoint (decimal), same as start for single codepoint */\n end: number\n /** Unicode emoji version */\n version: EmojiVersion\n /** Description */\n name: string\n}\n\n/**\n * Emoji codepoint ranges with their Unicode versions\n * Total ranges: 418\n *\n * To check if a codepoint belongs to a version, iterate through ranges\n * and check if codepoint >= start && codepoint <= end\n */\nexport const EMOJI_RANGES: readonly EmojiRange[] = [\n // Version 0.0 (4 ranges)\n {start: 0x23, end: 0x23, version: '0.0', name: 'hash sign'},\n {start: 0x2a, end: 0x2a, version: '0.0', name: 'asterisk'},\n {start: 0x30, end: 0x39, version: '0.0', name: 'digit zero..digit nine'},\n {\n start: 0x1f1e6,\n end: 0x1f1ff,\n version: '0.0',\n name: 'regional indicator symbol letter a..regional indicator symbol letter z',\n },\n\n // Version 0.6 (153 ranges)\n {start: 0xa9, end: 0xa9, version: '0.6', name: 'copyright'},\n {start: 0xae, end: 0xae, version: '0.6', name: 'registered'},\n {start: 0x203c, end: 0x203c, version: '0.6', name: 'double exclamation mark'},\n {\n start: 0x2049,\n end: 0x2049,\n version: '0.6',\n name: 'exclamation question mark',\n },\n {start: 0x2122, end: 0x2122, version: '0.6', name: 'trade mark'},\n {start: 0x2139, end: 0x2139, version: '0.6', name: 'information'},\n {\n start: 0x2194,\n end: 0x2199,\n version: '0.6',\n name: 'left-right arrow..down-left arrow',\n },\n {\n start: 0x21a9,\n end: 0x21aa,\n version: '0.6',\n name: 'right arrow curving left..left arrow curving right',\n },\n {start: 0x231a, end: 0x231b, version: '0.6', name: 'watch..hourglass done'},\n {\n start: 0x23e9,\n end: 0x23ec,\n version: '0.6',\n name: 'fast-forward button..fast down button',\n },\n {start: 0x23f0, end: 0x23f0, version: '0.6', name: 'alarm clock'},\n {start: 0x23f3, end: 0x23f3, version: '0.6', name: 'hourglass not done'},\n {start: 0x24c2, end: 0x24c2, version: '0.6', name: 'circled M'},\n {\n start: 0x25aa,\n end: 0x25ab,\n version: '0.6',\n name: 'black small square..white small square',\n },\n {start: 0x25b6, end: 0x25b6, version: '0.6', name: 'play button'},\n {start: 0x25c0, end: 0x25c0, version: '0.6', name: 'reverse button'},\n {\n start: 0x25fb,\n end: 0x25fe,\n version: '0.6',\n name: 'white medium square..black medium-small square',\n },\n {start: 0x2600, end: 0x2601, version: '0.6', name: 'sun..cloud'},\n {start: 0x260e, end: 0x260e, version: '0.6', name: 'telephone'},\n {start: 0x2611, end: 0x2611, version: '0.6', name: 'check box with check'},\n {\n start: 0x2614,\n end: 0x2615,\n version: '0.6',\n name: 'umbrella with rain drops..hot beverage',\n },\n {start: 0x261d, end: 0x261d, version: '0.6', name: 'index pointing up'},\n {start: 0x263a, end: 0x263a, version: '0.6', name: 'smiling face'},\n {start: 0x2648, end: 0x2653, version: '0.6', name: 'Aries..Pisces'},\n {start: 0x2660, end: 0x2660, version: '0.6', name: 'spade suit'},\n {start: 0x2663, end: 0x2663, version: '0.6', name: 'club suit'},\n {\n start: 0x2665,\n end: 0x2666,\n version: '0.6',\n name: 'heart suit..diamond suit',\n },\n {start: 0x2668, end: 0x2668, version: '0.6', name: 'hot springs'},\n {start: 0x267b, end: 0x267b, version: '0.6', name: 'recycling symbol'},\n {start: 0x267f, end: 0x267f, version: '0.6', name: 'wheelchair symbol'},\n {start: 0x2693, end: 0x2693, version: '0.6', name: 'anchor'},\n {start: 0x26a0, end: 0x26a1, version: '0.6', name: 'warning..high voltage'},\n {\n start: 0x26aa,\n end: 0x26ab,\n version: '0.6',\n name: 'white circle..black circle',\n },\n {start: 0x26bd, end: 0x26be, version: '0.6', name: 'soccer ball..baseball'},\n {\n start: 0x26c4,\n end: 0x26c5,\n version: '0.6',\n name: 'snowman without snow..sun behind cloud',\n },\n {start: 0x26ce, end: 0x26ce, version: '0.6', name: 'Ophiuchus'},\n {start: 0x26d4, end: 0x26d4, version: '0.6', name: 'no entry'},\n {start: 0x26ea, end: 0x26ea, version: '0.6', name: 'church'},\n {start: 0x26f2, end: 0x26f3, version: '0.6', name: 'fountain..flag in hole'},\n {start: 0x26f5, end: 0x26f5, version: '0.6', name: 'sailboat'},\n {start: 0x26fa, end: 0x26fa, version: '0.6', name: 'tent'},\n {start: 0x26fd, end: 0x26fd, version: '0.6', name: 'fuel pump'},\n {start: 0x2702, end: 0x2702, version: '0.6', name: 'scissors'},\n {start: 0x2705, end: 0x2705, version: '0.6', name: 'check mark button'},\n {start: 0x2708, end: 0x270c, version: '0.6', name: 'airplane..victory hand'},\n {start: 0x270f, end: 0x270f, version: '0.6', name: 'pencil'},\n {start: 0x2712, end: 0x2712, version: '0.6', name: 'black nib'},\n {start: 0x2714, end: 0x2714, version: '0.6', name: 'check mark'},\n {start: 0x2716, end: 0x2716, version: '0.6', name: 'multiply'},\n {start: 0x2728, end: 0x2728, version: '0.6', name: 'sparkles'},\n {\n start: 0x2733,\n end: 0x2734,\n version: '0.6',\n name: 'eight-spoked asterisk..eight-pointed star',\n },\n {start: 0x2744, end: 0x2744, version: '0.6', name: 'snowflake'},\n {start: 0x2747, end: 0x2747, version: '0.6', name: 'sparkle'},\n {start: 0x274c, end: 0x274c, version: '0.6', name: 'cross mark'},\n {start: 0x274e, end: 0x274e, version: '0.6', name: 'cross mark button'},\n {\n start: 0x2753,\n end: 0x2755,\n version: '0.6',\n name: 'red question mark..white exclamation mark',\n },\n {start: 0x2757, end: 0x2757, version: '0.6', name: 'red exclamation mark'},\n {start: 0x2764, end: 0x2764, version: '0.6', name: 'red heart'},\n {start: 0x2795, end: 0x2797, version: '0.6', name: 'plus..divide'},\n {start: 0x27a1, end: 0x27a1, version: '0.6', name: 'right arrow'},\n {start: 0x27b0, end: 0x27b0, version: '0.6', name: 'curly loop'},\n {\n start: 0x2934,\n end: 0x2935,\n version: '0.6',\n name: 'right arrow curving up..right arrow curving down',\n },\n {start: 0x2b05, end: 0x2b07, version: '0.6', name: 'left arrow..down arrow'},\n {\n start: 0x2b1b,\n end: 0x2b1c,\n version: '0.6',\n name: 'black large square..white large square',\n },\n {start: 0x2b50, end: 0x2b50, version: '0.6', name: 'star'},\n {start: 0x2b55, end: 0x2b55, version: '0.6', name: 'hollow red circle'},\n {start: 0x3030, end: 0x3030, version: '0.6', name: 'wavy dash'},\n {start: 0x303d, end: 0x303d, version: '0.6', name: 'part alternation mark'},\n {\n start: 0x3297,\n end: 0x3297,\n version: '0.6',\n name: 'Japanese “congratulations” button',\n },\n {\n start: 0x3299,\n end: 0x3299,\n version: '0.6',\n name: 'Japanese “secret” button',\n },\n {start: 0x1f004, end: 0x1f004, version: '0.6', name: 'mahjong red dragon'},\n {start: 0x1f0cf, end: 0x1f0cf, version: '0.6', name: 'joker'},\n {\n start: 0x1f170,\n end: 0x1f171,\n version: '0.6',\n name: 'A button (blood type)..B button (blood type)',\n },\n {\n start: 0x1f17e,\n end: 0x1f17f,\n version: '0.6',\n name: 'O button (blood type)..P button',\n },\n {\n start: 0x1f18e,\n end: 0x1f18e,\n version: '0.6',\n name: 'AB button (blood type)',\n },\n {start: 0x1f191, end: 0x1f19a, version: '0.6', name: 'CL button..VS button'},\n {\n start: 0x1f201,\n end: 0x1f202,\n version: '0.6',\n name: 'Japanese “here” button..Japanese “service charge” button',\n },\n {\n start: 0x1f21a,\n end: 0x1f21a,\n version: '0.6',\n name: 'Japanese “free of charge” button',\n },\n {\n start: 0x1f22f,\n end: 0x1f22f,\n version: '0.6',\n name: 'Japanese “reserved” button',\n },\n {\n start: 0x1f232,\n end: 0x1f23a,\n version: '0.6',\n name: 'Japanese “prohibited” button..Japanese “open for business” button',\n },\n {\n start: 0x1f250,\n end: 0x1f251,\n version: '0.6',\n name: 'Japanese “bargain” button..Japanese “acceptable” button',\n },\n {start: 0x1f300, end: 0x1f30c, version: '0.6', name: 'cyclone..milky way'},\n {\n start: 0x1f30f,\n end: 0x1f30f,\n version: '0.6',\n name: 'globe showing Asia-Australia',\n },\n {start: 0x1f311, end: 0x1f311, version: '0.6', name: 'new moon'},\n {\n start: 0x1f313,\n end: 0x1f315,\n version: '0.6',\n name: 'first quarter moon..full moon',\n },\n {start: 0x1f319, end: 0x1f319, version: '0.6', name: 'crescent moon'},\n {\n start: 0x1f31b,\n end: 0x1f31b,\n version: '0.6',\n name: 'first quarter moon face',\n },\n {\n start: 0x1f31f,\n end: 0x1f320,\n version: '0.6',\n name: 'glowing star..shooting star',\n },\n {start: 0x1f330, end: 0x1f331, version: '0.6', name: 'chestnut..seedling'},\n {start: 0x1f334, end: 0x1f335, version: '0.6', name: 'palm tree..cactus'},\n {start: 0x1f337, end: 0x1f34a, version: '0.6', name: 'tulip..tangerine'},\n {start: 0x1f34c, end: 0x1f34f, version: '0.6', name: 'banana..green apple'},\n {\n start: 0x1f351,\n end: 0x1f37b,\n version: '0.6',\n name: 'peach..clinking beer mugs',\n },\n {\n start: 0x1f380,\n end: 0x1f393,\n version: '0.6',\n name: 'ribbon..graduation cap',\n },\n {\n start: 0x1f3a0,\n end: 0x1f3c4,\n version: '0.6',\n name: 'carousel horse..person surfing',\n },\n {start: 0x1f3c6, end: 0x1f3c6, version: '0.6', name: 'trophy'},\n {start: 0x1f3c8, end: 0x1f3c8, version: '0.6', name: 'american football'},\n {start: 0x1f3ca, end: 0x1f3ca, version: '0.6', name: 'person swimming'},\n {\n start: 0x1f3e0,\n end: 0x1f3e3,\n version: '0.6',\n name: 'house..Japanese post office',\n },\n {start: 0x1f3e5, end: 0x1f3f0, version: '0.6', name: 'hospital..castle'},\n {start: 0x1f40c, end: 0x1f40e, version: '0.6', name: 'snail..horse'},\n {start: 0x1f411, end: 0x1f412, version: '0.6', name: 'ewe..monkey'},\n {start: 0x1f414, end: 0x1f414, version: '0.6', name: 'chicken'},\n {start: 0x1f417, end: 0x1f429, version: '0.6', name: 'boar..poodle'},\n {\n start: 0x1f42b,\n end: 0x1f43e,\n version: '0.6',\n name: 'two-hump camel..paw prints',\n },\n {start: 0x1f440, end: 0x1f440, version: '0.6', name: 'eyes'},\n {\n start: 0x1f442,\n end: 0x1f464,\n version: '0.6',\n name: 'ear..bust in silhouette',\n },\n {\n start: 0x1f466,\n end: 0x1f46b,\n version: '0.6',\n name: 'boy..woman and man holding hands',\n },\n {\n start: 0x1f46e,\n end: 0x1f4ac,\n version: '0.6',\n name: 'police officer..speech balloon',\n },\n {\n start: 0x1f4ae,\n end: 0x1f4b5,\n version: '0.6',\n name: 'white flower..dollar banknote',\n },\n {\n start: 0x1f4b8,\n end: 0x1f4eb,\n version: '0.6',\n name: 'money with wings..closed mailbox with raised flag',\n },\n {start: 0x1f4ee, end: 0x1f4ee, version: '0.6', name: 'postbox'},\n {\n start: 0x1f4f0,\n end: 0x1f4f4,\n version: '0.6',\n name: 'newspaper..mobile phone off',\n },\n {start: 0x1f4f6, end: 0x1f4f7, version: '0.6', name: 'antenna bars..camera'},\n {\n start: 0x1f4f9,\n end: 0x1f4fc,\n version: '0.6',\n name: 'video camera..videocassette',\n },\n {\n start: 0x1f503,\n end: 0x1f503,\n version: '0.6',\n name: 'clockwise vertical arrows',\n },\n {\n start: 0x1f50a,\n end: 0x1f514,\n version: '0.6',\n name: 'speaker high volume..bell',\n },\n {\n start: 0x1f516,\n end: 0x1f52b,\n version: '0.6',\n name: 'bookmark..water pistol',\n },\n {\n start: 0x1f52e,\n end: 0x1f53d,\n version: '0.6',\n name: 'crystal ball..downwards button',\n },\n {\n start: 0x1f550,\n end: 0x1f55b,\n version: '0.6',\n name: 'one o’clock..twelve o’clock',\n },\n {start: 0x1f5fb, end: 0x1f5ff, version: '0.6', name: 'mount fuji..moai'},\n {\n start: 0x1f601,\n end: 0x1f606,\n version: '0.6',\n name: 'beaming face with smiling eyes..grinning squinting face',\n },\n {\n start: 0x1f609,\n end: 0x1f60d,\n version: '0.6',\n name: 'winking face..smiling face with heart-eyes',\n },\n {start: 0x1f60f, end: 0x1f60f, version: '0.6', name: 'smirking face'},\n {\n start: 0x1f612,\n end: 0x1f614,\n version: '0.6',\n name: 'unamused face..pensive face',\n },\n {start: 0x1f616, end: 0x1f616, version: '0.6', name: 'confounded face'},\n {start: 0x1f618, end: 0x1f618, version: '0.6', name: 'face blowing a kiss'},\n {\n start: 0x1f61a,\n end: 0x1f61a,\n version: '0.6',\n name: 'kissing face with closed eyes',\n },\n {\n start: 0x1f61c,\n end: 0x1f61e,\n version: '0.6',\n name: 'winking face with tongue..disappointed face',\n },\n {\n start: 0x1f620,\n end: 0x1f625,\n version: '0.6',\n name: 'angry face..sad but relieved face',\n },\n {\n start: 0x1f628,\n end: 0x1f62b,\n version: '0.6',\n name: 'fearful face..tired face',\n },\n {start: 0x1f62d, end: 0x1f62d, version: '0.6', name: 'loudly crying face'},\n {\n start: 0x1f630,\n end: 0x1f633,\n version: '0.6',\n name: 'anxious face with sweat..flushed face',\n },\n {\n start: 0x1f635,\n end: 0x1f635,\n version: '0.6',\n name: 'face with crossed-out eyes',\n },\n {\n start: 0x1f637,\n end: 0x1f640,\n version: '0.6',\n name: 'face with medical mask..weary cat',\n },\n {\n start: 0x1f645,\n end: 0x1f64f,\n version: '0.6',\n name: 'person gesturing NO..folded hands',\n },\n {start: 0x1f680, end: 0x1f680, version: '0.6', name: 'rocket'},\n {\n start: 0x1f683,\n end: 0x1f685,\n version: '0.6',\n name: 'railway car..bullet train',\n },\n {start: 0x1f687, end: 0x1f687, version: '0.6', name: 'metro'},\n {start: 0x1f689, end: 0x1f689, version: '0.6', name: 'station'},\n {start: 0x1f68c, end: 0x1f68c, version: '0.6', name: 'bus'},\n {start: 0x1f68f, end: 0x1f68f, version: '0.6', name: 'bus stop'},\n {start: 0x1f691, end: 0x1f693, version: '0.6', name: 'ambulance..police car'},\n {start: 0x1f695, end: 0x1f695, version: '0.6', name: 'taxi'},\n {start: 0x1f697, end: 0x1f697, version: '0.6', name: 'automobile'},\n {\n start: 0x1f699,\n end: 0x1f69a,\n version: '0.6',\n name: 'sport utility vehicle..delivery truck',\n },\n {start: 0x1f6a2, end: 0x1f6a2, version: '0.6', name: 'ship'},\n {\n start: 0x1f6a4,\n end: 0x1f6a5,\n version: '0.6',\n name: 'speedboat..horizontal traffic light',\n },\n {\n start: 0x1f6a7,\n end: 0x1f6ad,\n version: '0.6',\n name: 'construction..no smoking',\n },\n {start: 0x1f6b2, end: 0x1f6b2, version: '0.6', name: 'bicycle'},\n {start: 0x1f6b6, end: 0x1f6b6, version: '0.6', name: 'person walking'},\n {\n start: 0x1f6b9,\n end: 0x1f6be,\n version: '0.6',\n name: 'men’s room..water closet',\n },\n {start: 0x1f6c0, end: 0x1f6c0, version: '0.6', name: 'person taking bath'},\n\n // Version 0.7 (67 ranges)\n {\n start: 0x23ed,\n end: 0x23ee,\n version: '0.7',\n name: 'next track button..last track button',\n },\n {\n start: 0x23f8,\n end: 0x23fa,\n version: '0.7',\n name: 'pause button..record button',\n },\n {start: 0x2602, end: 0x2603, version: '0.7', name: 'umbrella..snowman'},\n {start: 0x262a, end: 0x262a, version: '0.7', name: 'star and crescent'},\n {start: 0x262f, end: 0x262f, version: '0.7', name: 'yin yang'},\n {\n start: 0x2638,\n end: 0x2639,\n version: '0.7',\n name: 'wheel of dharma..frowning face',\n },\n {\n start: 0x26c8,\n end: 0x26c8,\n version: '0.7',\n name: 'cloud with lightning and rain',\n },\n {start: 0x26cf, end: 0x26cf, version: '0.7', name: 'pick'},\n {start: 0x26d1, end: 0x26d1, version: '0.7', name: 'rescue worker’s helmet'},\n {start: 0x26d3, end: 0x26d3, version: '0.7', name: 'chains'},\n {start: 0x26e9, end: 0x26e9, version: '0.7', name: 'shinto shrine'},\n {\n start: 0x26f0,\n end: 0x26f1,\n version: '0.7',\n name: 'mountain..umbrella on ground',\n },\n {start: 0x26f4, end: 0x26f4, version: '0.7', name: 'ferry'},\n {\n start: 0x26f7,\n end: 0x26f9,\n version: '0.7',\n name: 'skier..person bouncing ball',\n },\n {start: 0x270d, end: 0x270d, version: '0.7', name: 'writing hand'},\n {start: 0x271d, end: 0x271d, version: '0.7', name: 'latin cross'},\n {start: 0x2721, end: 0x2721, version: '0.7', name: 'star of David'},\n {\n start: 0x1f30d,\n end: 0x1f30e,\n version: '0.7',\n name: 'globe showing Europe-Africa..globe showing Americas',\n },\n {\n start: 0x1f31c,\n end: 0x1f31c,\n version: '0.7',\n name: 'last quarter moon face',\n },\n {start: 0x1f321, end: 0x1f321, version: '0.7', name: 'thermometer'},\n {\n start: 0x1f324,\n end: 0x1f32c,\n version: '0.7',\n name: 'sun behind small cloud..wind face',\n },\n {start: 0x1f336, end: 0x1f336, version: '0.7', name: 'hot pepper'},\n {\n start: 0x1f37d,\n end: 0x1f37d,\n version: '0.7',\n name: 'fork and knife with plate',\n },\n {\n start: 0x1f396,\n end: 0x1f397,\n version: '0.7',\n name: 'military medal..reminder ribbon',\n },\n {\n start: 0x1f399,\n end: 0x1f39b,\n version: '0.7',\n name: 'studio microphone..control knobs',\n },\n {\n start: 0x1f39e,\n end: 0x1f39f,\n version: '0.7',\n name: 'film frames..admission tickets',\n },\n {\n start: 0x1f3cb,\n end: 0x1f3ce,\n version: '0.7',\n name: 'person lifting weights..racing car',\n },\n {\n start: 0x1f3d4,\n end: 0x1f3df,\n version: '0.7',\n name: 'snow-capped mountain..stadium',\n },\n {start: 0x1f3f3, end: 0x1f3f3, version: '0.7', name: 'white flag'},\n {start: 0x1f3f5, end: 0x1f3f5, version: '0.7', name: 'rosette'},\n {start: 0x1f3f7, end: 0x1f3f7, version: '0.7', name: 'label'},\n {start: 0x1f408, end: 0x1f408, version: '0.7', name: 'cat'},\n {start: 0x1f415, end: 0x1f415, version: '0.7', name: 'dog'},\n {start: 0x1f43f, end: 0x1f43f, version: '0.7', name: 'chipmunk'},\n {start: 0x1f441, end: 0x1f441, version: '0.7', name: 'eye'},\n {\n start: 0x1f4ec,\n end: 0x1f4ed,\n version: '0.7',\n name: 'open mailbox with raised flag..open mailbox with lowered flag',\n },\n {start: 0x1f4fd, end: 0x1f4fd, version: '0.7', name: 'film projector'},\n {start: 0x1f508, end: 0x1f508, version: '0.7', name: 'speaker low volume'},\n {start: 0x1f549, end: 0x1f54a, version: '0.7', name: 'om..dove'},\n {\n start: 0x1f55c,\n end: 0x1f567,\n version: '0.7',\n name: 'one-thirty..twelve-thirty',\n },\n {\n start: 0x1f56f,\n end: 0x1f570,\n version: '0.7',\n name: 'candle..mantelpiece clock',\n },\n {start: 0x1f573, end: 0x1f579, version: '0.7', name: 'hole..joystick'},\n {start: 0x1f587, end: 0x1f587, version: '0.7', name: 'linked paperclips'},\n {start: 0x1f58a, end: 0x1f58d, version: '0.7', name: 'pen..crayon'},\n {\n start: 0x1f590,\n end: 0x1f590,\n version: '0.7',\n name: 'hand with fingers splayed',\n },\n {start: 0x1f5a5, end: 0x1f5a5, version: '0.7', name: 'desktop computer'},\n {start: 0x1f5a8, end: 0x1f5a8, version: '0.7', name: 'printer'},\n {\n start: 0x1f5b1,\n end: 0x1f5b2,\n version: '0.7',\n name: 'computer mouse..trackball',\n },\n {start: 0x1f5bc, end: 0x1f5bc, version: '0.7', name: 'framed picture'},\n {\n start: 0x1f5c2,\n end: 0x1f5c4,\n version: '0.7',\n name: 'card index dividers..file cabinet',\n },\n {\n start: 0x1f5d1,\n end: 0x1f5d3,\n version: '0.7',\n name: 'wastebasket..spiral calendar',\n },\n {\n start: 0x1f5dc,\n end: 0x1f5de,\n version: '0.7',\n name: 'clamp..rolled-up newspaper',\n },\n {start: 0x1f5e1, end: 0x1f5e1, version: '0.7', name: 'dagger'},\n {start: 0x1f5e3, end: 0x1f5e3, version: '0.7', name: 'speaking head'},\n {start: 0x1f5ef, end: 0x1f5ef, version: '0.7', name: 'right anger bubble'},\n {\n start: 0x1f5f3,\n end: 0x1f5f3,\n version: '0.7',\n name: 'ballot box with ballot',\n },\n {start: 0x1f5fa, end: 0x1f5fa, version: '0.7', name: 'world map'},\n {start: 0x1f610, end: 0x1f610, version: '0.7', name: 'neutral face'},\n {start: 0x1f68d, end: 0x1f68d, version: '0.7', name: 'oncoming bus'},\n {start: 0x1f694, end: 0x1f694, version: '0.7', name: 'oncoming police car'},\n {start: 0x1f698, end: 0x1f698, version: '0.7', name: 'oncoming automobile'},\n {start: 0x1f6cb, end: 0x1f6cb, version: '0.7', name: 'couch and lamp'},\n {start: 0x1f6cd, end: 0x1f6cf, version: '0.7', name: 'shopping bags..bed'},\n {\n start: 0x1f6e0,\n end: 0x1f6e5,\n version: '0.7',\n name: 'hammer and wrench..motor boat',\n },\n {start: 0x1f6e9, end: 0x1f6e9, version: '0.7', name: 'small airplane'},\n {start: 0x1f6f0, end: 0x1f6f0, version: '0.7', name: 'satellite'},\n {start: 0x1f6f3, end: 0x1f6f3, version: '0.7', name: 'passenger ship'},\n\n // Version 1.0 (91 ranges)\n {start: 0x2328, end: 0x2328, version: '1.0', name: 'keyboard'},\n {start: 0x23cf, end: 0x23cf, version: '1.0', name: 'eject button'},\n {start: 0x23ef, end: 0x23ef, version: '1.0', name: 'play or pause button'},\n {start: 0x23f1, end: 0x23f2, version: '1.0', name: 'stopwatch..timer clock'},\n {start: 0x2604, end: 0x2604, version: '1.0', name: 'comet'},\n {start: 0x2618, end: 0x2618, version: '1.0', name: 'shamrock'},\n {start: 0x2620, end: 0x2620, version: '1.0', name: 'skull and crossbones'},\n {start: 0x2622, end: 0x2623, version: '1.0', name: 'radioactive..biohazard'},\n {start: 0x2626, end: 0x2626, version: '1.0', name: 'orthodox cross'},\n {start: 0x262e, end: 0x262e, version: '1.0', name: 'peace symbol'},\n {start: 0x2692, end: 0x2692, version: '1.0', name: 'hammer and pick'},\n {start: 0x2694, end: 0x2694, version: '1.0', name: 'crossed swords'},\n {start: 0x2696, end: 0x2697, version: '1.0', name: 'balance scale..alembic'},\n {start: 0x2699, end: 0x2699, version: '1.0', name: 'gear'},\n {\n start: 0x269b,\n end: 0x269c,\n version: '1.0',\n name: 'atom symbol..fleur-de-lis',\n },\n {start: 0x26b0, end: 0x26b1, version: '1.0', name: 'coffin..funeral urn'},\n {start: 0x2763, end: 0x2763, version: '1.0', name: 'heart exclamation'},\n {start: 0x27bf, end: 0x27bf, version: '1.0', name: 'double curly loop'},\n {start: 0x1f310, end: 0x1f310, version: '1.0', name: 'globe with meridians'},\n {start: 0x1f312, end: 0x1f312, version: '1.0', name: 'waxing crescent moon'},\n {\n start: 0x1f316,\n end: 0x1f318,\n version: '1.0',\n name: 'waning gibbous moon..waning crescent moon',\n },\n {start: 0x1f31a, end: 0x1f31a, version: '1.0', name: 'new moon face'},\n {\n start: 0x1f31d,\n end: 0x1f31e,\n version: '1.0',\n name: 'full moon face..sun with face',\n },\n {start: 0x1f32d, end: 0x1f32f, version: '1.0', name: 'hot dog..burrito'},\n {\n start: 0x1f332,\n end: 0x1f333,\n version: '1.0',\n name: 'evergreen tree..deciduous tree',\n },\n {start: 0x1f34b, end: 0x1f34b, version: '1.0', name: 'lemon'},\n {start: 0x1f350, end: 0x1f350, version: '1.0', name: 'pear'},\n {start: 0x1f37c, end: 0x1f37c, version: '1.0', name: 'baby bottle'},\n {\n start: 0x1f37e,\n end: 0x1f37f,\n version: '1.0',\n name: 'bottle with popping cork..popcorn',\n },\n {start: 0x1f3c5, end: 0x1f3c5, version: '1.0', name: 'sports medal'},\n {start: 0x1f3c7, end: 0x1f3c7, version: '1.0', name: 'horse racing'},\n {start: 0x1f3c9, end: 0x1f3c9, version: '1.0', name: 'rugby football'},\n {\n start: 0x1f3cf,\n end: 0x1f3d3,\n version: '1.0',\n name: 'cricket game..ping pong',\n },\n {start: 0x1f3e4, end: 0x1f3e4, version: '1.0', name: 'post office'},\n {start: 0x1f3f4, end: 0x1f3f4, version: '1.0', name: 'black flag'},\n {start: 0x1f3f8, end: 0x1f407, version: '1.0', name: 'badminton..rabbit'},\n {start: 0x1f409, end: 0x1f40b, version: '1.0', name: 'dragon..whale'},\n {start: 0x1f40f, end: 0x1f410, version: '1.0', name: 'ram..goat'},\n {start: 0x1f413, end: 0x1f413, version: '1.0', name: 'rooster'},\n {start: 0x1f416, end: 0x1f416, version: '1.0', name: 'pig'},\n {start: 0x1f42a, end: 0x1f42a, version: '1.0', name: 'camel'},\n {start: 0x1f465, end: 0x1f465, version: '1.0', name: 'busts in silhouette'},\n {\n start: 0x1f46c,\n end: 0x1f46d,\n version: '1.0',\n name: 'men holding hands..women holding hands',\n },\n {start: 0x1f4ad, end: 0x1f4ad, version: '1.0', name: 'thought balloon'},\n {\n start: 0x1f4b6,\n end: 0x1f4b7,\n version: '1.0',\n name: 'euro banknote..pound banknote',\n },\n {start: 0x1f4ef, end: 0x1f4ef, version: '1.0', name: 'postal horn'},\n {start: 0x1f4f5, end: 0x1f4f5, version: '1.0', name: 'no mobile phones'},\n {start: 0x1f4f8, end: 0x1f4f8, version: '1.0', name: 'camera with flash'},\n {\n start: 0x1f4ff,\n end: 0x1f502,\n version: '1.0',\n name: 'prayer beads..repeat single button',\n },\n {\n start: 0x1f504,\n end: 0x1f507,\n version: '1.0',\n name: 'counterclockwise arrows button..muted speaker',\n },\n {start: 0x1f509, end: 0x1f509, version: '1.0', name: 'speaker medium volume'},\n {start: 0x1f515, end: 0x1f515, version: '1.0', name: 'bell with slash'},\n {start: 0x1f52c, end: 0x1f52d, version: '1.0', name: 'microscope..telescope'},\n {start: 0x1f54b, end: 0x1f54e, version: '1.0', name: 'kaaba..menorah'},\n {\n start: 0x1f595,\n end: 0x1f596,\n version: '1.0',\n name: 'middle finger..vulcan salute',\n },\n {start: 0x1f600, end: 0x1f600, version: '1.0', name: 'grinning face'},\n {\n start: 0x1f607,\n end: 0x1f608,\n version: '1.0',\n name: 'smiling face with halo..smiling face with horns',\n },\n {\n start: 0x1f60e,\n end: 0x1f60e,\n version: '1.0',\n name: 'smiling face with sunglasses',\n },\n {start: 0x1f611, end: 0x1f611, version: '1.0', name: 'expressionless face'},\n {start: 0x1f615, end: 0x1f615, version: '1.0', name: 'confused face'},\n {start: 0x1f617, end: 0x1f617, version: '1.0', name: 'kissing face'},\n {\n start: 0x1f619,\n end: 0x1f619,\n version: '1.0',\n name: 'kissing face with smiling eyes',\n },\n {start: 0x1f61b, end: 0x1f61b, version: '1.0', name: 'face with tongue'},\n {start: 0x1f61f, end: 0x1f61f, version: '1.0', name: 'worried face'},\n {\n start: 0x1f626,\n end: 0x1f627,\n version: '1.0',\n name: 'frowning face with open mouth..anguished face',\n },\n {start: 0x1f62c, end: 0x1f62c, version: '1.0', name: 'grimacing face'},\n {\n start: 0x1f62e,\n end: 0x1f62f,\n version: '1.0',\n name: 'face with open mouth..hushed face',\n },\n {start: 0x1f634, end: 0x1f634, version: '1.0', name: 'sleeping face'},\n {start: 0x1f636, end: 0x1f636, version: '1.0', name: 'face without mouth'},\n {\n start: 0x1f641,\n end: 0x1f644,\n version: '1.0',\n name: 'slightly frowning face..face with rolling eyes',\n },\n {\n start: 0x1f681,\n end: 0x1f682,\n version: '1.0',\n name: 'helicopter..locomotive',\n },\n {start: 0x1f686, end: 0x1f686, version: '1.0', name: 'train'},\n {start: 0x1f688, end: 0x1f688, version: '1.0', name: 'light rail'},\n {start: 0x1f68a, end: 0x1f68b, version: '1.0', name: 'tram..tram car'},\n {start: 0x1f68e, end: 0x1f68e, version: '1.0', name: 'trolleybus'},\n {start: 0x1f690, end: 0x1f690, version: '1.0', name: 'minibus'},\n {start: 0x1f696, end: 0x1f696, version: '1.0', name: 'oncoming taxi'},\n {\n start: 0x1f69b,\n end: 0x1f6a1,\n version: '1.0',\n name: 'articulated lorry..aerial tramway',\n },\n {start: 0x1f6a3, end: 0x1f6a3, version: '1.0', name: 'person rowing boat'},\n {\n start: 0x1f6a6,\n end: 0x1f6a6,\n version: '1.0',\n name: 'vertical traffic light',\n },\n {\n start: 0x1f6ae,\n end: 0x1f6b1,\n version: '1.0',\n name: 'litter in bin sign..non-potable water',\n },\n {\n start: 0x1f6b3,\n end: 0x1f6b5,\n version: '1.0',\n name: 'no bicycles..person mountain biking',\n },\n {\n start: 0x1f6b7,\n end: 0x1f6b8,\n version: '1.0',\n name: 'no pedestrians..children crossing',\n },\n {start: 0x1f6bf, end: 0x1f6bf, version: '1.0', name: 'shower'},\n {start: 0x1f6c1, end: 0x1f6c5, version: '1.0', name: 'bathtub..left luggage'},\n {start: 0x1f6cc, end: 0x1f6cc, version: '1.0', name: 'person in bed'},\n {start: 0x1f6d0, end: 0x1f6d0, version: '1.0', name: 'place of worship'},\n {\n start: 0x1f6eb,\n end: 0x1f6ec,\n version: '1.0',\n name: 'airplane departure..airplane arrival',\n },\n {\n start: 0x1f910,\n end: 0x1f918,\n version: '1.0',\n name: 'zipper-mouth face..sign of the horns',\n },\n {start: 0x1f980, end: 0x1f984, version: '1.0', name: 'crab..unicorn'},\n {start: 0x1f9c0, end: 0x1f9c0, version: '1.0', name: 'cheese wedge'},\n\n // Version 2.0 (1 ranges)\n {start: 0x1f5e8, end: 0x1f5e8, version: '2.0', name: 'left speech bubble'},\n\n // Version 3.0 (13 ranges)\n {start: 0x1f57a, end: 0x1f57a, version: '3.0', name: 'man dancing'},\n {start: 0x1f5a4, end: 0x1f5a4, version: '3.0', name: 'black heart'},\n {\n start: 0x1f6d1,\n end: 0x1f6d2,\n version: '3.0',\n name: 'stop sign..shopping cart',\n },\n {start: 0x1f6f4, end: 0x1f6f6, version: '3.0', name: 'kick scooter..canoe'},\n {\n start: 0x1f919,\n end: 0x1f91e,\n version: '3.0',\n name: 'call me hand..crossed fingers',\n },\n {\n start: 0x1f920,\n end: 0x1f927,\n version: '3.0',\n name: 'cowboy hat face..sneezing face',\n },\n {start: 0x1f930, end: 0x1f930, version: '3.0', name: 'pregnant woman'},\n {\n start: 0x1f933,\n end: 0x1f93a,\n version: '3.0',\n name: 'selfie..person fencing',\n },\n {\n start: 0x1f93c,\n end: 0x1f93e,\n version: '3.0',\n name: 'people wrestling..person playing handball',\n },\n {\n start: 0x1f940,\n end: 0x1f945,\n version: '3.0',\n name: 'wilted flower..goal net',\n },\n {\n start: 0x1f947,\n end: 0x1f94b,\n version: '3.0',\n name: '1st place medal..martial arts uniform',\n },\n {start: 0x1f950, end: 0x1f95e, version: '3.0', name: 'croissant..pancakes'},\n {start: 0x1f985, end: 0x1f991, version: '3.0', name: 'eagle..squid'},\n\n // Version 4.0 (3 ranges)\n {start: 0x2640, end: 0x2640, version: '4.0', name: 'female sign'},\n {start: 0x2642, end: 0x2642, version: '4.0', name: 'male sign'},\n {start: 0x2695, end: 0x2695, version: '4.0', name: 'medical symbol'},\n\n // Version 5.0 (8 ranges)\n {start: 0x1f6f7, end: 0x1f6f8, version: '5.0', name: 'sled..flying saucer'},\n {start: 0x1f91f, end: 0x1f91f, version: '5.0', name: 'love-you gesture'},\n {\n start: 0x1f928,\n end: 0x1f92f,\n version: '5.0',\n name: 'face with raised eyebrow..exploding head',\n },\n {\n start: 0x1f931,\n end: 0x1f932,\n version: '5.0',\n name: 'breast-feeding..palms up together',\n },\n {start: 0x1f94c, end: 0x1f94c, version: '5.0', name: 'curling stone'},\n {start: 0x1f95f, end: 0x1f96b, version: '5.0', name: 'dumpling..canned food'},\n {start: 0x1f992, end: 0x1f997, version: '5.0', name: 'giraffe..cricket'},\n {\n start: 0x1f9d0,\n end: 0x1f9e6,\n version: '5.0',\n name: 'face with monocle..socks',\n },\n\n // Version 11.0 (12 ranges)\n {start: 0x265f, end: 0x265f, version: '11.0', name: 'chess pawn'},\n {start: 0x267e, end: 0x267e, version: '11.0', name: 'infinity'},\n {start: 0x1f6f9, end: 0x1f6f9, version: '11.0', name: 'skateboard'},\n {\n start: 0x1f94d,\n end: 0x1f94f,\n version: '11.0',\n name: 'lacrosse..flying disc',\n },\n {\n start: 0x1f96c,\n end: 0x1f970,\n version: '11.0',\n name: 'leafy green..smiling face with hearts',\n },\n {\n start: 0x1f973,\n end: 0x1f976,\n version: '11.0',\n name: 'partying face..cold face',\n },\n {start: 0x1f97a, end: 0x1f97a, version: '11.0', name: 'pleading face'},\n {start: 0x1f97c, end: 0x1f97f, version: '11.0', name: 'lab coat..flat shoe'},\n {start: 0x1f998, end: 0x1f9a2, version: '11.0', name: 'kangaroo..swan'},\n {\n start: 0x1f9b0,\n end: 0x1f9b9,\n version: '11.0',\n name: 'red hair..supervillain',\n },\n {start: 0x1f9c1, end: 0x1f9c2, version: '11.0', name: 'cupcake..salt'},\n {\n start: 0x1f9e7,\n end: 0x1f9ff,\n version: '11.0',\n name: 'red envelope..nazar amulet',\n },\n\n // Version 12.0 (16 ranges)\n {start: 0x1f6d5, end: 0x1f6d5, version: '12.0', name: 'hindu temple'},\n {start: 0x1f6fa, end: 0x1f6fa, version: '12.0', name: 'auto rickshaw'},\n {\n start: 0x1f7e0,\n end: 0x1f7eb,\n version: '12.0',\n name: 'orange circle..brown square',\n },\n {\n start: 0x1f90d,\n end: 0x1f90f,\n version: '12.0',\n name: 'white heart..pinching hand',\n },\n {start: 0x1f93f, end: 0x1f93f, version: '12.0', name: 'diving mask'},\n {start: 0x1f971, end: 0x1f971, version: '12.0', name: 'yawning face'},\n {start: 0x1f97b, end: 0x1f97b, version: '12.0', name: 'sari'},\n {start: 0x1f9a5, end: 0x1f9aa, version: '12.0', name: 'sloth..oyster'},\n {\n start: 0x1f9ae,\n end: 0x1f9af,\n version: '12.0',\n name: 'guide dog..white cane',\n },\n {\n start: 0x1f9ba,\n end: 0x1f9bf,\n version: '12.0',\n name: 'safety vest..mechanical leg',\n },\n {start: 0x1f9c3, end: 0x1f9ca, version: '12.0', name: 'beverage box..ice'},\n {\n start: 0x1f9cd,\n end: 0x1f9cf,\n version: '12.0',\n name: 'person standing..deaf person',\n },\n {start: 0x1fa70, end: 0x1fa73, version: '12.0', name: 'ballet shoes..shorts'},\n {\n start: 0x1fa78,\n end: 0x1fa7a,\n version: '12.0',\n name: 'drop of blood..stethoscope',\n },\n {start: 0x1fa80, end: 0x1fa82, version: '12.0', name: 'yo-yo..parachute'},\n {start: 0x1fa90, end: 0x1fa95, version: '12.0', name: 'ringed planet..banjo'},\n\n // Version 13.0 (15 ranges)\n {start: 0x26a7, end: 0x26a7, version: '13.0', name: 'transgender symbol'},\n {start: 0x1f6d6, end: 0x1f6d7, version: '13.0', name: 'hut..elevator'},\n {\n start: 0x1f6fb,\n end: 0x1f6fc,\n version: '13.0',\n name: 'pickup truck..roller skate',\n },\n {start: 0x1f90c, end: 0x1f90c, version: '13.0', name: 'pinched fingers'},\n {\n start: 0x1f972,\n end: 0x1f972,\n version: '13.0',\n name: 'smiling face with tear',\n },\n {\n start: 0x1f977,\n end: 0x1f978,\n version: '13.0',\n name: 'ninja..disguised face',\n },\n {start: 0x1f9a3, end: 0x1f9a4, version: '13.0', name: 'mammoth..dodo'},\n {start: 0x1f9ab, end: 0x1f9ad, version: '13.0', name: 'beaver..seal'},\n {start: 0x1f9cb, end: 0x1f9cb, version: '13.0', name: 'bubble tea'},\n {start: 0x1fa74, end: 0x1fa74, version: '13.0', name: 'thong sandal'},\n {\n start: 0x1fa83,\n end: 0x1fa86,\n version: '13.0',\n name: 'boomerang..nesting dolls',\n },\n {\n start: 0x1fa96,\n end: 0x1faa8,\n version: '13.0',\n name: 'military helmet..rock',\n },\n {start: 0x1fab0, end: 0x1fab6, version: '13.0', name: 'fly..feather'},\n {\n start: 0x1fac0,\n end: 0x1fac2,\n version: '13.0',\n name: 'anatomical heart..people hugging',\n },\n {start: 0x1fad0, end: 0x1fad6, version: '13.0', name: 'blueberries..teapot'},\n\n // Version 14.0 (11 ranges)\n {\n start: 0x1f6dd,\n end: 0x1f6df,\n version: '14.0',\n name: 'playground slide..ring buoy',\n },\n {start: 0x1f7f0, end: 0x1f7f0, version: '14.0', name: 'heavy equals sign'},\n {\n start: 0x1f979,\n end: 0x1f979,\n version: '14.0',\n name: 'face holding back tears',\n },\n {start: 0x1f9cc, end: 0x1f9cc, version: '14.0', name: 'troll'},\n {start: 0x1fa7b, end: 0x1fa7c, version: '14.0', name: 'x-ray..crutch'},\n {start: 0x1faa9, end: 0x1faac, version: '14.0', name: 'mirror ball..hamsa'},\n {\n start: 0x1fab7,\n end: 0x1faba,\n version: '14.0',\n name: 'lotus..nest with eggs',\n },\n {\n start: 0x1fac3,\n end: 0x1fac5,\n version: '14.0',\n name: 'pregnant man..person with crown',\n },\n {start: 0x1fad7, end: 0x1fad9, version: '14.0', name: 'pouring liquid..jar'},\n {\n start: 0x1fae0,\n end: 0x1fae7,\n version: '14.0',\n name: 'melting face..bubbles',\n },\n {\n start: 0x1faf0,\n end: 0x1faf6,\n version: '14.0',\n name: 'hand with index finger and thumb crossed..heart hands',\n },\n\n // Version 15.0 (10 ranges)\n {start: 0x1f6dc, end: 0x1f6dc, version: '15.0', name: 'wireless'},\n {\n start: 0x1fa75,\n end: 0x1fa77,\n version: '15.0',\n name: 'light blue heart..pink heart',\n },\n {start: 0x1fa87, end: 0x1fa88, version: '15.0', name: 'maracas..flute'},\n {\n start: 0x1faad,\n end: 0x1faaf,\n version: '15.0',\n name: 'folding hand fan..khanda',\n },\n {start: 0x1fabb, end: 0x1fabd, version: '15.0', name: 'hyacinth..wing'},\n {start: 0x1fabf, end: 0x1fabf, version: '15.0', name: 'goose'},\n {start: 0x1face, end: 0x1facf, version: '15.0', name: 'moose..donkey'},\n {start: 0x1fada, end: 0x1fadb, version: '15.0', name: 'ginger root..pea pod'},\n {start: 0x1fae8, end: 0x1fae8, version: '15.0', name: 'shaking face'},\n {\n start: 0x1faf7,\n end: 0x1faf8,\n version: '15.0',\n name: 'leftwards pushing hand..rightwards pushing hand',\n },\n\n // Version 16.0 (7 ranges)\n {start: 0x1fa89, end: 0x1fa89, version: '16.0', name: 'harp'},\n {start: 0x1fa8f, end: 0x1fa8f, version: '16.0', name: 'shovel'},\n {start: 0x1fabe, end: 0x1fabe, version: '16.0', name: 'leafless tree'},\n {start: 0x1fac6, end: 0x1fac6, version: '16.0', name: 'fingerprint'},\n {start: 0x1fadc, end: 0x1fadc, version: '16.0', name: 'root vegetable'},\n {start: 0x1fadf, end: 0x1fadf, version: '16.0', name: 'splatter'},\n {\n start: 0x1fae9,\n end: 0x1fae9,\n version: '16.0',\n name: 'face with bags under eyes',\n },\n\n // Version 17.0 (7 ranges)\n {start: 0x1f6d8, end: 0x1f6d8, version: '17.0', name: 'landslide'},\n {start: 0x1fa8a, end: 0x1fa8a, version: '17.0', name: 'trombone'},\n {start: 0x1fa8e, end: 0x1fa8e, version: '17.0', name: 'treasure chest'},\n {start: 0x1fac8, end: 0x1fac8, version: '17.0', name: 'hairy creature'},\n {start: 0x1facd, end: 0x1facd, version: '17.0', name: 'orca'},\n {start: 0x1faea, end: 0x1faea, version: '17.0', name: 'distorted face'},\n {start: 0x1faef, end: 0x1faef, version: '17.0', name: 'fight cloud'},\n] as const\n","/**\n * Emoji detection utilities using Intl.Segmenter\n */\n\nimport {\n EMOJI_VERSIONS,\n EMOJI_RANGES,\n type EmojiVersion,\n} from '#packages/eslint-plugin-formatjs/emoji-data.generated.js'\nimport * as emojiPresentationRegex from '@unicode/unicode-17.0.0/Binary_Property/Emoji_Presentation/regex.js'\nimport * as emojiPropertyRegex from '@unicode/unicode-17.0.0/Binary_Property/Emoji/regex.js'\n\nexport type {EmojiVersion} from '#packages/eslint-plugin-formatjs/emoji-data.generated.js'\n\n/**\n * Cached Intl.Segmenter instance for emoji extraction\n * Reused across all extractEmojis calls for better performance\n */\nconst graphemeSegmenter = new Intl.Segmenter('en', {granularity: 'grapheme'})\n\n/**\n * Regex for detecting emoji using Unicode 17.0.0 Emoji_Presentation data\n * Generated from @unicode/unicode-17.0.0/Binary_Property/Emoji_Presentation\n * This avoids false positives from #, *, digits, and text symbols like ©\n */\nconst emojiPresentationRegexCompiled =\n (emojiPresentationRegex as unknown as {default: RegExp}).default ??\n emojiPresentationRegex\n\n/**\n * Regex for detecting emoji-capable characters using Unicode 17.0.0 Emoji property\n * This includes characters that can have emoji presentation (like ❤, ☀)\n */\nconst emojiPropertyRegexCompiled =\n (emojiPropertyRegex as unknown as {default: RegExp}).default ??\n emojiPropertyRegex\n\n/**\n * Check if a string contains any emoji\n * Uses Unicode 17.0.0 Emoji_Presentation data and variation selector (U+FE0F)\n * to properly detect emoji while avoiding false positives from characters like\n * #, *, digits 0-9, and text symbols like © which have \\p{Emoji} but are not visual emoji\n */\nexport function hasEmoji(text: string): boolean {\n // First check for Emoji_Presentation characters (always displayed as emoji)\n if (emojiPresentationRegexCompiled.test(text)) {\n return true\n }\n\n // Check for variation selector (U+FE0F) which indicates emoji presentation\n // But only if it follows an emoji-capable character to avoid false positives\n // like \"Hello\\uFE0F\" or \"A\\uFE0F\"\n if (text.includes('\\uFE0F')) {\n const segments = graphemeSegmenter.segment(text)\n for (const {segment} of segments) {\n if (segment.includes('\\uFE0F')) {\n // Has VS, check if the character before it has the Emoji property\n const beforeVS = segment.replace(/\\uFE0F/g, '')\n if (emojiPropertyRegexCompiled.test(beforeVS)) {\n return true\n }\n }\n }\n }\n\n return false\n}\n\n/**\n * Extract all emoji from a string using Intl.Segmenter\n * Returns an array of emoji characters (including multi-codepoint sequences)\n *\n * Uses grapheme segmentation to properly handle:\n * - Emoji with skin tone modifiers (🙋🏻)\n * - ZWJ sequences (👨👩👧👦)\n * - Flag sequences (🇺🇸)\n * - Regional indicator sequences\n * - Any other complex emoji grapheme clusters\n */\nexport function extractEmojis(text: string): string[] {\n const segments = graphemeSegmenter.segment(text)\n const emojis: string[] = []\n\n for (const {segment} of segments) {\n // Check if this grapheme cluster contains emoji\n // First check for Emoji_Presentation (always displayed as emoji)\n if (emojiPresentationRegexCompiled.test(segment)) {\n emojis.push(segment)\n continue\n }\n\n // Check for variation selector (U+FE0F) which indicates emoji presentation\n // But only if it follows an emoji-capable character to avoid false positives\n if (segment.includes('\\uFE0F')) {\n const beforeVS = segment.replace(/\\uFE0F/g, '')\n if (emojiPropertyRegexCompiled.test(beforeVS)) {\n emojis.push(segment)\n }\n }\n }\n\n return emojis\n}\n\n/**\n * Check if a version string is a valid emoji version\n */\nexport function isValidEmojiVersion(version: string): boolean {\n return EMOJI_VERSIONS.includes(version as EmojiVersion)\n}\n\n/**\n * Get the Unicode version for a given emoji character\n * Returns undefined if the emoji is not found in our data\n */\nexport function getEmojiVersion(emoji: string): EmojiVersion | undefined {\n // Get the first codepoint from the emoji\n const codepoint = emoji.codePointAt(0)\n if (codepoint === undefined) {\n return undefined\n }\n\n // Check which range this codepoint falls into\n for (const range of EMOJI_RANGES) {\n if (codepoint >= range.start && codepoint <= range.end) {\n return range.version\n }\n }\n\n return undefined\n}\n\n/**\n * Filter function for emoji versions\n * Returns a filter function that checks if an emoji is from version or below\n */\nexport function filterEmojis(\n version: EmojiVersion\n): (emoji: string) => boolean {\n const maxVersion = parseVersion(version)\n return (emoji: string) => {\n const emojiVersion = getEmojiVersion(emoji)\n if (!emojiVersion) {\n // If we don't have version data, assume it's an older emoji\n // This is a conservative approach for unknown emoji\n return true\n }\n return parseVersion(emojiVersion) <= maxVersion\n }\n}\n\n/**\n * Get all emoji that match the filter\n * Generates emoji from codepoint ranges and filters them\n */\nexport function getAllEmojis(filter: (emoji: string) => boolean): string[] {\n const emojis: string[] = []\n\n for (const range of EMOJI_RANGES) {\n for (let codepoint = range.start; codepoint <= range.end; codepoint++) {\n const emoji = String.fromCodePoint(codepoint)\n if (filter(emoji)) {\n emojis.push(emoji)\n }\n }\n }\n\n return emojis\n}\n\n/**\n * Parse version string to comparable number\n * e.g., \"12.0\" -> 12.0, \"13.1\" -> 13.1\n */\nfunction parseVersion(version: string): number {\n return parseFloat(version)\n}\n","import type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractEmojis,\n filterEmojis,\n hasEmoji,\n isValidEmojiVersion,\n type EmojiVersion,\n} from '#packages/eslint-plugin-formatjs/emoji-utils.js'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\n\nexport const name = 'no-emoji'\n\ntype NoEmojiConfig = {versionAbove: string}\nexport type Options = [NoEmojiConfig?]\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node, getSettings(context))\n\n let versionAbove: EmojiVersion | undefined\n const [emojiConfig] = context.options\n\n if (\n emojiConfig?.versionAbove &&\n isValidEmojiVersion(emojiConfig.versionAbove)\n ) {\n versionAbove = emojiConfig.versionAbove as EmojiVersion\n }\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n if (hasEmoji(defaultMessage)) {\n if (versionAbove) {\n const filter = filterEmojis(versionAbove)\n for (const emoji of extractEmojis(defaultMessage)) {\n // Check if the emoji's version is allowed (filterEmojis returns true for allowed emojis)\n if (!filter(emoji)) {\n context.report({\n node: messageNode,\n messageId: 'notAllowedAboveVersion',\n data: {\n versionAbove,\n emoji,\n },\n })\n }\n }\n } else {\n context.report({\n node: messageNode,\n messageId: 'notAllowed',\n })\n }\n }\n }\n}\n\nconst versionAboveEnums: EmojiVersion[] = [\n '0.6',\n '0.7',\n '1.0',\n '2.0',\n '3.0',\n '4.0',\n '5.0',\n '11.0',\n '12.0',\n '13.0',\n '14.0',\n '15.0',\n '16.0',\n '17.0',\n]\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Disallow emojis in message',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-emoji',\n },\n fixable: 'code',\n schema: [\n {\n type: 'object',\n properties: {versionAbove: {type: 'string', enum: versionAboveEnums}},\n additionalProperties: false,\n },\n ],\n messages: {\n notAllowed: 'Emojis are not allowed',\n notAllowedAboveVersion:\n 'Emojis above version {{versionAbove}} are not allowed - Emoji: {{emoji}}',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import type {Comment, Node} from 'estree-jsx'\nimport type {Rule, SourceCode} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\n\nfunction isComment(\n token: ReturnType<SourceCode['getTokenAfter']>\n): token is Comment {\n return !!token && (token.type === 'Block' || token.type === 'Line')\n}\n\nexport const name = 'no-id'\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node, getSettings(context))\n for (const [{idPropNode}] of msgs) {\n if (idPropNode) {\n context.report({\n node: idPropNode,\n messageId: 'noId',\n fix(fixer) {\n const src = context.sourceCode\n const token = src.getTokenAfter(idPropNode)\n const fixes = [fixer.remove(idPropNode)]\n if (token && !isComment(token) && token?.value === ',') {\n fixes.push(fixer.remove(token))\n }\n return fixes\n },\n })\n }\n }\n}\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Ban explicit ID from MessageDescriptor',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-id',\n },\n fixable: 'code',\n schema: [],\n messages: {\n noId: 'Manual `id` are not allowed in message descriptor',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {parse} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {CORE_MESSAGES} from '#packages/eslint-plugin-formatjs/messages.js'\n\nexport const name = 'no-invalid-icu'\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n let msgs\n try {\n msgs = extractMessages(node, settings)\n } catch (e) {\n // GH #5069: Handle errors from extractMessages (e.g., tagged templates with substitutions)\n context.report({\n node,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n return\n }\n\n if (!msgs.length) {\n return\n }\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n\n try {\n parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n }\n }\n}\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: `Make sure ICU messages are formatted correctly with no bad select statements, plurals, etc.`,\n },\n fixable: 'code',\n schema: [],\n messages: CORE_MESSAGES,\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import type {\n Expression,\n JSXAttribute,\n JSXElement,\n JSXExpressionContainer,\n JSXFragment,\n JSXIdentifier,\n JSXMemberExpression,\n JSXNamespacedName,\n JSXText,\n Node,\n PrivateIdentifier,\n} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport * as picomatchNs from 'picomatch'\n\nconst picomatch = (picomatchNs as any).default ?? picomatchNs\n\ntype PropMatcher = readonly [TagNamePattern: string, PropNamePattern: string][]\n\ntype CompiledPropMatcher = readonly [\n TagNamePattern: RegExp,\n PropNamePattern: RegExp,\n][]\n\ntype Config = {\n props?: {\n include?: PropMatcher\n exclude?: PropMatcher\n }\n}\n\nconst propMatcherSchema = {\n type: 'array',\n items: {\n type: 'array',\n items: [{type: 'string'}, {type: 'string'}],\n },\n}\n\nconst defaultPropIncludePattern: PropMatcher = [\n ['*', 'aria-{label,description,details,errormessage}'],\n ['[a-z]*([a-z0-9])', '(placeholder|title)'],\n ['img', 'alt'],\n]\n\nconst defaultPropExcludePattern: PropMatcher = []\n\nfunction stringifyJsxTagName(\n tagName: JSXIdentifier | JSXMemberExpression | JSXNamespacedName\n): string {\n switch (tagName.type) {\n case 'JSXIdentifier':\n return tagName.name\n case 'JSXMemberExpression':\n return `${stringifyJsxTagName(tagName.object)}.${tagName.property.name}`\n case 'JSXNamespacedName':\n return `${tagName.namespace.name}:${tagName.name.name}`\n }\n}\n\nfunction compilePropMatcher(propMatcher: PropMatcher): CompiledPropMatcher {\n return propMatcher.map(([tagNamePattern, propNamePattern]) => {\n return [\n picomatch.makeRe(tagNamePattern, {contains: false}),\n picomatch.makeRe(propNamePattern, {contains: false}),\n ]\n })\n}\n\nexport const name = 'no-literal-string-in-jsx'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Disallow untranslated literal strings without translation.',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-literal-string-in-jsx',\n },\n schema: [\n {\n type: 'object',\n additionalProperties: false,\n properties: {\n props: {\n type: 'object',\n additionalProperties: false,\n properties: {\n include: {\n ...propMatcherSchema,\n },\n exclude: {\n ...propMatcherSchema,\n },\n },\n },\n },\n },\n ],\n messages: {\n noLiteralStringInJsx: 'Cannot have untranslated text in JSX',\n },\n },\n // TODO: Vue support\n create(context) {\n const userConfig: Config = context.options[0] || {}\n\n const propIncludePattern: CompiledPropMatcher = compilePropMatcher([\n ...defaultPropIncludePattern,\n ...(userConfig.props?.include ?? []),\n ])\n\n const propExcludePattern: CompiledPropMatcher = compilePropMatcher([\n ...defaultPropExcludePattern,\n ...(userConfig.props?.exclude ?? []),\n ])\n\n const lexicalJsxStack: (JSXElement | JSXFragment)[] = []\n\n const shouldSkipCurrentJsxElement = () => {\n const currentJsxNode = lexicalJsxStack[lexicalJsxStack.length - 1]!\n if (currentJsxNode.type === 'JSXFragment') {\n return false\n }\n\n const nameString = stringifyJsxTagName(currentJsxNode.openingElement.name)\n\n // Check if children should be excluded\n for (const [tagNamePattern, propNamePattern] of propExcludePattern) {\n if (\n tagNamePattern.test(nameString) &&\n propNamePattern.test('children')\n ) {\n return true\n }\n }\n\n return false\n }\n\n const shouldSkipCurrentJsxAttribute = (node: JSXAttribute) => {\n const currentJsxNode = lexicalJsxStack[lexicalJsxStack.length - 1]!\n if (currentJsxNode.type === 'JSXFragment') {\n return false\n }\n\n const nameString = stringifyJsxTagName(currentJsxNode.openingElement.name)\n const attributeName =\n typeof node.name.name === 'string'\n ? node.name.name\n : node.name.name.name\n\n // match exclude\n for (const [tagNamePattern, propNamePattern] of propExcludePattern) {\n if (\n tagNamePattern.test(nameString) &&\n propNamePattern.test(attributeName)\n ) {\n return true\n }\n }\n\n // match include\n for (const [tagNamePattern, propNamePattern] of propIncludePattern) {\n if (\n tagNamePattern.test(nameString) &&\n propNamePattern.test(attributeName)\n ) {\n return false\n }\n }\n\n return true\n }\n\n const checkJSXExpression = (node: Expression | PrivateIdentifier) => {\n // Check if this is either a string literal / template literal, or the concat of them.\n // It also ignores the empty string.\n if (\n (node.type === 'Literal' &&\n typeof node.value === 'string' &&\n node.value.length > 0) ||\n (node.type === 'TemplateLiteral' &&\n (node.quasis.length > 1 || node.quasis[0].value.raw.length > 0))\n ) {\n context.report({\n node,\n messageId: 'noLiteralStringInJsx',\n })\n } else if (node.type === 'BinaryExpression' && node.operator === '+') {\n checkJSXExpression(node.left)\n checkJSXExpression(node.right)\n } else if (node.type === 'ConditionalExpression') {\n checkJSXExpression(node.consequent)\n checkJSXExpression(node.alternate)\n } else if (node.type === 'LogicalExpression') {\n checkJSXExpression(node.left)\n checkJSXExpression(node.right)\n }\n }\n\n return {\n JSXElement: (node: Node) => {\n lexicalJsxStack.push(node as JSXElement)\n },\n 'JSXElement:exit': () => {\n lexicalJsxStack.pop()\n },\n\n JSXFragment: (node: Node) => {\n lexicalJsxStack.push(node as JSXFragment)\n },\n 'JSXFragment:exit': () => {\n lexicalJsxStack.pop()\n },\n\n JSXAttribute: (node: JSXAttribute) => {\n if (shouldSkipCurrentJsxAttribute(node)) {\n return\n }\n\n if (!node.value) {\n return\n }\n\n if (\n node.value.type === 'Literal' &&\n typeof node.value.value === 'string' &&\n node.value.value.length > 0\n ) {\n context.report({\n node: node,\n messageId: 'noLiteralStringInJsx',\n })\n } else if (\n node.value.type === 'JSXExpressionContainer' &&\n node.value.expression.type !== 'JSXEmptyExpression'\n ) {\n checkJSXExpression(node.value.expression)\n }\n },\n\n JSXText: (node: JSXText) => {\n // Ignore purely spacing fragments\n if (!node.value.replace(/\\s*/gm, '')) {\n return\n }\n\n if (shouldSkipCurrentJsxElement()) {\n return\n }\n\n context.report({\n node: node,\n messageId: 'noLiteralStringInJsx',\n })\n },\n\n // Children expression container\n 'JSXElement > JSXExpressionContainer': (node: JSXExpressionContainer) => {\n if (shouldSkipCurrentJsxElement()) {\n return\n }\n\n if (node.expression.type !== 'JSXEmptyExpression') {\n checkJSXExpression(node.expression)\n }\n },\n }\n },\n}\n","import {\n isLiteralElement,\n isPluralElement,\n isSelectElement,\n isTagElement,\n type MessageFormatElement,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport MagicString from 'magic-string'\nimport {\n extractMessages,\n patchMessage,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {\n CORE_MESSAGES,\n type CoreMessageIds,\n} from '#packages/eslint-plugin-formatjs/messages.js'\n\nexport const name = 'no-missing-icu-plural-one-placeholders'\n\nexport type MessageIds = 'noMissingIcuPluralOnePlaceholders' | CoreMessageIds\n\ntype MessagePatch =\n | {type: 'remove'; start: number; end: number}\n | {type: 'prependLeft'; index: number; content: string}\n | {type: 'update'; start: number; end: number; content: string}\n\nfunction verifyAst(\n context: Rule.RuleContext,\n messageNode: Node,\n ast: MessageFormatElement[]\n) {\n const patches: MessagePatch[] = []\n\n _verifyAstAndReplace(ast)\n\n if (patches.length > 0) {\n const patchedMessage = patchMessage(messageNode, ast, content => {\n return patches\n .reduce((magicString, patch) => {\n switch (patch.type) {\n case 'prependLeft':\n return magicString.prependLeft(patch.index, patch.content)\n case 'remove':\n return magicString.remove(patch.start, patch.end)\n case 'update':\n return magicString.update(patch.start, patch.end, patch.content)\n }\n }, new MagicString(content))\n .toString()\n })\n\n context.report({\n node: messageNode,\n messageId: 'noMissingIcuPluralOnePlaceholders',\n fix:\n patchedMessage !== null\n ? fixer => fixer.replaceText(messageNode, patchedMessage)\n : null,\n })\n }\n\n function _verifyAstAndReplace(\n ast: readonly MessageFormatElement[],\n root = true\n ) {\n for (const el of ast) {\n if (isPluralElement(el) && el.options['one']) {\n _verifyAstAndReplace(el.options['one'].value, false)\n } else if (isSelectElement(el)) {\n for (const {value} of Object.values(el.options)) {\n _verifyAstAndReplace(value, root)\n }\n } else if (isTagElement(el)) {\n _verifyAstAndReplace(el.children, root)\n } else if (!root && isLiteralElement(el)) {\n const match = el.value.match(/\\b1\\b/)\n if (match && el.location) {\n patches.push({\n type: 'update',\n start: el.location!.start.offset,\n end: el.location!.end.offset,\n content: el.value.replace(match[0], '#'),\n })\n }\n }\n }\n }\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node)\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {captureLocation: true})\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n continue\n }\n\n verifyAst(context, messageNode, ast)\n }\n}\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'We use `one {# item}` instead of `one {1 item}` in ICU messages as some locales use the `one` formatting for other similar numbers.',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-explicit-icu-plural',\n },\n fixable: 'code',\n messages: {\n ...CORE_MESSAGES,\n noMissingIcuPluralOnePlaceholders:\n 'Use `one {# item}` instead of `one {1 item}` in ICU messages.',\n },\n schema: [],\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type MessageFormatElement,\n isPluralElement,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {\n CORE_MESSAGES,\n type CoreMessageIds,\n} from '#packages/eslint-plugin-formatjs/messages.js'\n\ntype MessageIds = 'noMultiplePlurals' | CoreMessageIds\n\nfunction verifyAst(ast: MessageFormatElement[], pluralCount = {count: 0}) {\n const errors: {messageId: MessageIds; data: Record<string, string>}[] = []\n for (const el of ast) {\n if (isPluralElement(el)) {\n pluralCount.count++\n if (pluralCount.count > 1) {\n errors.push({messageId: 'noMultiplePlurals', data: {}})\n }\n const {options} = el\n for (const selector of Object.keys(options)) {\n errors.push(...verifyAst(options[selector].value, pluralCount))\n }\n }\n }\n\n return errors\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, settings)\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n continue\n }\n const errors = verifyAst(ast)\n for (const error of errors) {\n context.report({\n node,\n ...error,\n })\n }\n }\n}\n\nexport const name = 'no-multiple-plurals'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Disallow multiple plural rules in the same message',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-multiple-plurals',\n },\n fixable: 'code',\n schema: [],\n messages: {\n ...CORE_MESSAGES,\n noMultiplePlurals: 'Multiple plural rules in the same message',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type LiteralElement,\n type MessageFormatElement,\n parse,\n TYPE,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n patchMessage,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {CORE_MESSAGES} from '#packages/eslint-plugin-formatjs/messages.js'\n\nfunction isAstValid(ast: MessageFormatElement[]): boolean {\n for (const element of ast) {\n switch (element.type) {\n case TYPE.literal:\n if (/\\s{2,}/gm.test(element.value)) {\n return false\n }\n break\n case TYPE.argument:\n case TYPE.date:\n case TYPE.number:\n case TYPE.pound:\n case TYPE.time:\n break\n case TYPE.plural:\n case TYPE.select: {\n for (const option of Object.values(element.options)) {\n if (!isAstValid(option.value)) {\n return false\n }\n }\n break\n }\n case TYPE.tag:\n return isAstValid(element.children)\n }\n }\n return true\n}\n\nfunction trimMultiWhitespaces(\n message: string,\n ast: MessageFormatElement[]\n): string {\n const literalElements: LiteralElement[] = []\n\n const collectLiteralElements = (elements: MessageFormatElement[]) => {\n for (const element of elements) {\n switch (element.type) {\n case TYPE.literal:\n literalElements.push(element)\n break\n case TYPE.argument:\n case TYPE.date:\n case TYPE.number:\n case TYPE.pound:\n case TYPE.time:\n break\n case TYPE.plural:\n case TYPE.select: {\n for (const option of Object.values(element.options)) {\n collectLiteralElements(option.value)\n }\n break\n }\n case TYPE.tag:\n collectLiteralElements(element.children)\n break\n }\n }\n }\n collectLiteralElements(ast)\n\n // Surgically trim whitespaces in the literal element ranges.\n // This is to preserve the original whitespaces and newlines info that are lost to parsing.\n let trimmedFragments: string[] = []\n let currentOffset = 0\n\n for (const literal of literalElements) {\n const {start, end} = literal.location!\n const startOffset = start.offset\n const endOffset = end.offset\n\n trimmedFragments.push(message.slice(currentOffset, startOffset))\n trimmedFragments.push(\n message.slice(startOffset, endOffset).replace(/\\s{2,}/gm, ' ')\n )\n\n currentOffset = endOffset\n }\n\n trimmedFragments.push(message.slice(currentOffset))\n\n return trimmedFragments.join('')\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node, getSettings(context))\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {captureLocation: true})\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {error: e instanceof Error ? e.message : String(e)},\n })\n return\n }\n\n if (!isAstValid(ast)) {\n const newMessage = patchMessage(messageNode, ast, trimMultiWhitespaces)\n context.report({\n node: messageNode,\n messageId: 'noMultipleWhitespaces',\n fix:\n newMessage !== null\n ? fixer => fixer.replaceText(messageNode, newMessage)\n : null,\n })\n }\n }\n}\n\nexport const name = 'no-multiple-whitespaces'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description:\n 'Prevents usage of multiple consecutive whitespaces in message',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-multiple-whitespaces',\n },\n messages: {\n ...CORE_MESSAGES,\n noMultipleWhitespaces: 'Multiple consecutive whitespaces are not allowed',\n },\n fixable: 'code',\n schema: [],\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type MessageFormatElement,\n isPluralElement,\n parse,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {\n CORE_MESSAGES,\n type CoreMessageIds,\n} from '#packages/eslint-plugin-formatjs/messages.js'\n\ntype MessageIds = 'noOffset' | CoreMessageIds\n\nfunction verifyAst(ast: MessageFormatElement[]) {\n const errors: {messageId: MessageIds; data: Record<string, string>}[] = []\n for (const el of ast) {\n if (isPluralElement(el)) {\n if (el.offset) {\n errors.push({messageId: 'noOffset', data: {}})\n }\n const {options} = el\n for (const selector of Object.keys(options)) {\n errors.push(...verifyAst(options[selector].value))\n }\n }\n }\n\n return errors\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, settings)\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n continue\n }\n const errors = verifyAst(ast)\n for (const error of errors) {\n context.report({\n node: messageNode,\n ...error,\n })\n }\n }\n}\n\nexport const name = 'no-offset'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Disallow offset in plural rules',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-offset',\n },\n fixable: 'code',\n messages: {\n ...CORE_MESSAGES,\n noOffset: 'offset is not allowed',\n },\n schema: [],\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import {\n type MessageFormatElement,\n parse,\n TYPE,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {\n CORE_MESSAGES,\n type CoreMessageIds,\n} from '#packages/eslint-plugin-formatjs/messages.js'\ntype MessageIds =\n | 'unnecessaryFormat'\n | 'unnecessaryFormatNumber'\n | 'unnecessaryFormatDate'\n | 'unnecessaryFormatTime'\n | CoreMessageIds\n\nfunction verifyAst(ast: MessageFormatElement[]): MessageIds | undefined {\n if (ast.length !== 1) {\n return\n }\n\n switch (ast[0]!.type) {\n case TYPE.argument:\n return 'unnecessaryFormat'\n case TYPE.number:\n return 'unnecessaryFormatNumber'\n case TYPE.date:\n return 'unnecessaryFormatDate'\n case TYPE.time:\n return 'unnecessaryFormatTime'\n }\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const settings = getSettings(context)\n const msgs = extractMessages(node, settings)\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {\n ignoreTag: settings.ignoreTag,\n })\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {\n error: (e as Error).message,\n },\n })\n continue\n }\n const messageId = verifyAst(ast)\n\n if (messageId)\n context.report({\n node: messageNode,\n messageId,\n })\n }\n}\n\nexport const name = 'no-useless-message'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Disallow unnecessary formatted message',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-useless-message',\n },\n fixable: 'code',\n schema: [],\n messages: {\n ...CORE_MESSAGES,\n unnecessaryFormat: 'Unnecessary formatted message.',\n unnecessaryFormatNumber:\n 'Unnecessary formatted message: just use FormattedNumber or intl.formatNumber.',\n unnecessaryFormatDate:\n 'Unnecessary formatted message: just use FormattedDate or intl.formatDate.',\n unnecessaryFormatTime:\n 'Unnecessary formatted message: just use FormattedTime or intl.formatTime.',\n },\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import type {JSXElement} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {isIntlFormatMessageCall} from '#packages/eslint-plugin-formatjs/util.js'\n\nexport const name = 'prefer-formatted-message'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Prefer `FormattedMessage` component over `intl.formatMessage` if applicable.',\n url: 'https://formatjs.github.io/docs/tooling/linter#prefer-formatted-message',\n },\n messages: {\n jsxChildren:\n 'Prefer `FormattedMessage` over `intl.formatMessage` in the JSX children expression.',\n },\n schema: [],\n },\n // TODO: Vue support\n create(context) {\n return {\n JSXElement: (node: JSXElement) => {\n node.children.forEach(child => {\n if (\n child.type !== 'JSXExpressionContainer' ||\n !isIntlFormatMessageCall(child.expression)\n ) {\n return\n }\n context.report({\n node: child,\n messageId: 'jsxChildren',\n })\n })\n },\n }\n },\n}\n","import {\n type MessageFormatElement,\n parse,\n type PluralElement,\n TYPE,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport MagicString from 'magic-string'\nimport {\n extractMessages,\n getSettings,\n patchMessage,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {CORE_MESSAGES} from '#packages/eslint-plugin-formatjs/messages.js'\n\nfunction verifyAst(\n context: Rule.RuleContext,\n messageNode: Node,\n ast: MessageFormatElement[]\n): void {\n type MessagePatch =\n | {type: 'remove'; start: number; end: number}\n | {type: 'prependLeft'; index: number; content: string}\n | {type: 'update'; start: number; end: number; content: string}\n\n const patches: MessagePatch[] = []\n\n _verifyAst(ast)\n\n if (patches.length > 0) {\n const patchedMessage = patchMessage(messageNode, ast, content => {\n return patches\n .reduce((magicString, patch) => {\n switch (patch.type) {\n case 'prependLeft':\n return magicString.prependLeft(patch.index, patch.content)\n case 'remove':\n return magicString.remove(patch.start, patch.end)\n case 'update':\n return magicString.update(patch.start, patch.end, patch.content)\n }\n }, new MagicString(content))\n .toString()\n })\n\n context.report({\n node: messageNode,\n messageId: 'preferPoundInPlurals',\n fix:\n patchedMessage !== null\n ? fixer => fixer.replaceText(messageNode, patchedMessage)\n : null,\n })\n }\n\n function _verifyAst(ast: ReadonlyArray<MessageFormatElement>) {\n for (let i = 0; i < ast.length; i++) {\n const current = ast[i]\n switch (current.type) {\n case TYPE.argument:\n case TYPE.number: {\n // Applicable to only plain argument or number argument without any style\n if (current.type === TYPE.number && current.style) {\n break\n }\n\n const next = ast[i + 1] as MessageFormatElement | undefined\n const nextNext = ast[i + 2] as MessageFormatElement | undefined\n\n if (\n next &&\n nextNext &&\n next.type === TYPE.literal &&\n next.value === ' ' &&\n nextNext.type === TYPE.plural &&\n nextNext.value === current.value\n ) {\n // `{A} {A, plural, one {B} other {Bs}}` => `{A, plural, one {# B} other {# Bs}}`\n _removeRangeAndPrependPluralClauses(\n current.location!.start.offset,\n next.location!.end.offset,\n nextNext,\n '# '\n )\n } else if (\n next &&\n next.type === TYPE.plural &&\n next.value === current.value\n ) {\n // `{A}{A, plural, one {B} other {Bs}}` => `{A, plural, one {#B} other {#Bs}}`\n _removeRangeAndPrependPluralClauses(\n current.location!.start.offset,\n current.location!.end.offset,\n next,\n '#'\n )\n }\n break\n }\n case TYPE.plural: {\n // `{A, plural, one {{A} B} other {{A} Bs}}` => `{A, plural, one {# B} other {# Bs}}`\n const name = current.value\n for (const {value} of Object.values(current.options)) {\n _replacementArgumentWithPound(name, value)\n }\n break\n }\n case TYPE.select: {\n for (const {value} of Object.values(current.options)) {\n _verifyAst(value)\n }\n break\n }\n case TYPE.tag:\n _verifyAst(current.children)\n break\n default:\n break\n }\n }\n }\n\n // Replace plain argument of number argument w/o style option that matches\n // the name with a pound sign.\n function _replacementArgumentWithPound(\n name: string,\n ast: MessageFormatElement[]\n ) {\n for (const element of ast) {\n switch (element.type) {\n case TYPE.argument:\n case TYPE.number: {\n if (\n element.value === name &&\n // Either plain argument or number argument without any style\n (element.type !== TYPE.number || !element.style)\n ) {\n patches.push({\n type: 'update',\n start: element.location!.start.offset,\n end: element.location!.end.offset,\n content: '#',\n })\n }\n break\n }\n case TYPE.tag: {\n _replacementArgumentWithPound(name, element.children)\n break\n }\n case TYPE.select: {\n for (const {value} of Object.values(element.options)) {\n _replacementArgumentWithPound(name, value)\n }\n break\n }\n default:\n break\n }\n }\n }\n\n // Helper to remove a certain text range and then prepend the specified text to\n // each plural clause.\n function _removeRangeAndPrependPluralClauses(\n rangeToRemoveStart: number,\n rangeToRemoveEnd: number,\n pluralElement: PluralElement,\n prependText: string\n ) {\n // Delete both the `{A}` and ` `\n patches.push({\n type: 'remove',\n start: rangeToRemoveStart,\n end: rangeToRemoveEnd,\n })\n // Insert `# ` to the beginning of every option clause\n for (const {location} of Object.values(pluralElement.options)) {\n // location marks the entire clause with the surrounding braces\n patches.push({\n type: 'prependLeft',\n index: location!.start.offset + 1,\n content: prependText,\n })\n }\n }\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node, getSettings(context))\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage, {captureLocation: true})\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {error: e instanceof Error ? e.message : String(e)},\n })\n return\n }\n\n verifyAst(context, messageNode, ast)\n }\n}\n\nexport const name = 'prefer-pound-in-plural'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Prefer using # to reference the count in the plural argument.',\n url: 'https://formatjs.github.io/docs/tooling/linter#prefer-pound-in-plurals',\n },\n messages: {\n ...CORE_MESSAGES,\n preferPoundInPlurals:\n 'Prefer using # to reference the count in the plural argument instead of repeating the argument.',\n },\n fixable: 'code',\n schema: [],\n },\n // TODO: Vue support\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","import type {Property, PrivateIdentifier} from 'estree-jsx'\nimport type {Rule} from 'eslint'\n\ntype PropertyConfig = {\n include: string[]\n}\n\nexport const name = 'no-literal-string-in-object'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'problem',\n docs: {\n description: 'Enforce translation of specific object properties',\n url: 'https://formatjs.github.io/docs/tooling/linter#no-literal-string-in-object',\n },\n schema: [\n {\n type: 'object',\n properties: {\n include: {\n type: 'array',\n items: {type: 'string'},\n default: ['label'],\n },\n },\n additionalProperties: false,\n },\n ],\n messages: {\n untranslatedProperty:\n 'Object property: `{{propertyKey}}` might contain an untranslated literal string',\n },\n },\n create(context) {\n const propertyVisitor = (node: Property) => {\n checkProperty(context, node)\n }\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n Property: propertyVisitor,\n },\n {\n Property: propertyVisitor,\n }\n )\n }\n return {\n Property: propertyVisitor,\n }\n },\n}\n\nfunction checkProperty(context: Rule.RuleContext, node: Property) {\n const config: PropertyConfig = {\n include: ['label'],\n ...context.options[0],\n }\n\n const propertyKey =\n node.key.type === 'Identifier'\n ? node.key.name\n : node.key.type === 'Literal' && typeof node.key.value === 'string'\n ? node.key.value\n : null\n\n if (!propertyKey || !config.include.includes(propertyKey)) {\n return\n }\n\n checkPropertyValue(context, node.value, propertyKey)\n}\n\nfunction checkPropertyValue(\n context: Rule.RuleContext,\n node: Property['value'] | PrivateIdentifier,\n propertyKey: string\n) {\n if (\n (node.type === 'Literal' &&\n typeof node.value === 'string' &&\n node.value.length > 0) ||\n (node.type === 'TemplateLiteral' &&\n (node.quasis.length > 1 || node.quasis[0].value.raw.length > 0))\n ) {\n context.report({\n node,\n messageId: 'untranslatedProperty',\n data: {\n propertyKey: propertyKey,\n },\n })\n } else if (node.type === 'BinaryExpression' && node.operator === '+') {\n checkPropertyValue(context, node.left, propertyKey)\n checkPropertyValue(context, node.right, propertyKey)\n } else if (node.type === 'ConditionalExpression') {\n checkPropertyValue(context, node.consequent, propertyKey)\n checkPropertyValue(context, node.alternate, propertyKey)\n } else if (node.type === 'LogicalExpression') {\n checkPropertyValue(context, node.left, propertyKey)\n checkPropertyValue(context, node.right, propertyKey)\n }\n}\n","import {\n type MessageFormatElement,\n parse,\n TYPE,\n} from '@formatjs/icu-messageformat-parser'\nimport type {Node} from 'estree-jsx'\nimport type {Rule} from 'eslint'\nimport {\n extractMessages,\n getSettings,\n} from '#packages/eslint-plugin-formatjs/util.js'\nimport {CORE_MESSAGES} from '#packages/eslint-plugin-formatjs/messages.js'\n\ntype WhitespaceIssue = 'leadingWhitespace' | 'trailingWhitespace'\n\n/**\n * Get the first boundary element, recursing into tags since\n * <b>hello</b> starts with the literal \"hello\".\n */\nfunction getFirstBoundaryElement(\n ast: MessageFormatElement[]\n): MessageFormatElement | null {\n if (ast.length === 0) return null\n const first = ast[0]\n if (first.type === TYPE.tag) {\n return getFirstBoundaryElement(first.children)\n }\n return first\n}\n\n/**\n * Get the last boundary element, recursing into tags.\n */\nfunction getLastBoundaryElement(\n ast: MessageFormatElement[]\n): MessageFormatElement | null {\n if (ast.length === 0) return null\n const last = ast[ast.length - 1]\n if (last.type === TYPE.tag) {\n return getLastBoundaryElement(last.children)\n }\n return last\n}\n\nfunction findWhitespaceIssues(ast: MessageFormatElement[]): WhitespaceIssue[] {\n const issues: WhitespaceIssue[] = []\n\n const first = getFirstBoundaryElement(ast)\n const last = getLastBoundaryElement(ast)\n\n // Ignore messages that are only whitespace (edge case)\n if (\n first === last &&\n first?.type === TYPE.literal &&\n ast.length === 1 &&\n first.value.trim() === ''\n ) {\n return issues\n }\n\n if (first?.type === TYPE.literal && /^\\s/.test(first.value)) {\n issues.push('leadingWhitespace')\n }\n\n if (last?.type === TYPE.literal && /\\s$/.test(last.value)) {\n issues.push('trailingWhitespace')\n }\n\n // Check each plural/select option branch independently\n for (const element of ast) {\n switch (element.type) {\n case TYPE.plural:\n case TYPE.select: {\n for (const option of Object.values(element.options)) {\n issues.push(...findWhitespaceIssues(option.value))\n }\n break\n }\n }\n }\n\n return issues\n}\n\nfunction checkNode(context: Rule.RuleContext, node: Node) {\n const msgs = extractMessages(node, getSettings(context))\n\n for (const [\n {\n message: {defaultMessage},\n messageNode,\n },\n ] of msgs) {\n if (!defaultMessage || !messageNode) {\n continue\n }\n\n let ast: MessageFormatElement[]\n try {\n ast = parse(defaultMessage)\n } catch (e) {\n context.report({\n node: messageNode,\n messageId: 'parseError',\n data: {error: e instanceof Error ? e.message : String(e)},\n })\n return\n }\n\n const issues = findWhitespaceIssues(ast)\n\n // Deduplicate\n const seen = new Set<string>()\n for (const issue of issues) {\n if (seen.has(issue)) continue\n seen.add(issue)\n context.report({\n node: messageNode,\n messageId: issue,\n })\n }\n }\n}\n\nexport const name = 'prefer-full-sentence'\n\nexport const rule: Rule.RuleModule = {\n meta: {\n type: 'suggestion',\n docs: {\n description:\n 'Detects messages with leading/trailing whitespace, which suggests string concatenation instead of full sentences',\n url: 'https://formatjs.github.io/docs/tooling/linter#prefer-full-sentence',\n },\n messages: {\n ...CORE_MESSAGES,\n leadingWhitespace:\n 'Messages should be full sentences — leading whitespace suggests string concatenation',\n trailingWhitespace:\n 'Messages should be full sentences — trailing whitespace suggests string concatenation',\n },\n schema: [],\n },\n create(context) {\n const callExpressionVisitor = (node: Node) => checkNode(context, node)\n\n const parserServices = context.sourceCode.parserServices\n if (parserServices?.defineTemplateBodyVisitor) {\n return parserServices.defineTemplateBodyVisitor(\n {\n CallExpression: callExpressionVisitor,\n },\n {\n CallExpression: callExpressionVisitor,\n }\n )\n }\n return {\n JSXOpeningElement: (node: Node) => checkNode(context, node),\n CallExpression: callExpressionVisitor,\n }\n },\n}\n","","import type {Linter} from 'eslint'\nimport type {ESLint} from 'eslint'\nimport {\n name as blocklistElementRuleName,\n rule as blocklistElements,\n} from '#packages/eslint-plugin-formatjs/rules/blocklist-elements.js'\nimport {\n rule as enforceDefaultMessage,\n name as enforceDefaultMessageName,\n} from '#packages/eslint-plugin-formatjs/rules/enforce-default-message.js'\nimport {\n rule as enforceDescription,\n name as enforceDescriptionName,\n} from '#packages/eslint-plugin-formatjs/rules/enforce-description.js'\nimport {\n rule as enforceId,\n name as enforceIdName,\n} from '#packages/eslint-plugin-formatjs/rules/enforce-id.js'\nimport {\n rule as enforcePlaceholders,\n name as enforcePlaceholdersName,\n} from '#packages/eslint-plugin-formatjs/rules/enforce-placeholders.js'\nimport {\n rule as enforcePluralRules,\n name as enforcePluralRulesName,\n} from '#packages/eslint-plugin-formatjs/rules/enforce-plural-rules.js'\nimport {\n rule as noCamelCase,\n name as noCamelCaseName,\n} from '#packages/eslint-plugin-formatjs/rules/no-camel-case.js'\nimport {\n rule as noComplexSelectors,\n name as noComplexSelectorsName,\n} from '#packages/eslint-plugin-formatjs/rules/no-complex-selectors.js'\nimport {\n rule as noEmoji,\n name as noEmojiName,\n} from '#packages/eslint-plugin-formatjs/rules/no-emoji.js'\nimport {\n rule as noId,\n name as noIdName,\n} from '#packages/eslint-plugin-formatjs/rules/no-id.js'\nimport {\n rule as noInvalidICU,\n name as noInvalidICUName,\n} from '#packages/eslint-plugin-formatjs/rules/no-invalid-icu.js'\nimport {\n rule as noLiteralStringInJsx,\n name as noLiteralStringInJsxName,\n} from '#packages/eslint-plugin-formatjs/rules/no-literal-string-in-jsx.js'\nimport {\n rule as noMissingIcuPluralOnePlaceholders,\n name as noMissingIcuPluralOnePlaceholdersName,\n} from '#packages/eslint-plugin-formatjs/rules/no-missing-icu-plural-one-placeholders.js'\nimport {\n rule as noMultiplePlurals,\n name as noMultiplePluralsName,\n} from '#packages/eslint-plugin-formatjs/rules/no-multiple-plurals.js'\nimport {\n rule as noMultipleWhitespaces,\n name as noMultipleWhitespacesName,\n} from '#packages/eslint-plugin-formatjs/rules/no-multiple-whitespaces.js'\nimport {\n rule as noOffset,\n name as noOffsetName,\n} from '#packages/eslint-plugin-formatjs/rules/no-offset.js'\nimport {\n rule as noUselessMessage,\n name as noUselessMessageName,\n} from '#packages/eslint-plugin-formatjs/rules/no-useless-message.js'\nimport {\n rule as preferFormattedMessage,\n name as preferFormattedMessageName,\n} from '#packages/eslint-plugin-formatjs/rules/prefer-formatted-message.js'\nimport {\n rule as preferPoundInPlural,\n name as preferPoundInPluralName,\n} from '#packages/eslint-plugin-formatjs/rules/prefer-pound-in-plural.js'\nimport {\n rule as noLiteralStringInObject,\n name as noLiteralStringInObjectName,\n} from '#packages/eslint-plugin-formatjs/rules/no-literal-string-in-object.js'\nimport {\n rule as preferFullSentence,\n name as preferFullSentenceName,\n} from '#packages/eslint-plugin-formatjs/rules/prefer-full-sentence.js'\n\n// @ts-ignore - package.json only available in rolldown/typecheck builds, not vitest\nimport * as packageJsonNs from './package.json' with {type: 'json'}\n\nconst packageJson = (packageJsonNs as any).default ?? packageJsonNs\nconst {name, version} = packageJson\n\n// All rules\nconst rules: ESLint.Plugin['rules'] = {\n [blocklistElementRuleName]: blocklistElements,\n [enforceDefaultMessageName]: enforceDefaultMessage,\n [enforceDescriptionName]: enforceDescription,\n [enforceIdName]: enforceId,\n [enforcePlaceholdersName]: enforcePlaceholders,\n [enforcePluralRulesName]: enforcePluralRules,\n [noCamelCaseName]: noCamelCase,\n [noComplexSelectorsName]: noComplexSelectors,\n [noEmojiName]: noEmoji,\n [noIdName]: noId,\n [noInvalidICUName]: noInvalidICU,\n [noLiteralStringInJsxName]: noLiteralStringInJsx,\n [noMultiplePluralsName]: noMultiplePlurals,\n [noMultipleWhitespacesName]: noMultipleWhitespaces,\n [noOffsetName]: noOffset,\n [noUselessMessageName]: noUselessMessage,\n [preferFormattedMessageName]: preferFormattedMessage,\n [preferPoundInPluralName]: preferPoundInPlural,\n [noMissingIcuPluralOnePlaceholdersName]: noMissingIcuPluralOnePlaceholders,\n [noLiteralStringInObjectName]: noLiteralStringInObject,\n [preferFullSentenceName]: preferFullSentence,\n}\n\ntype Plugin = {\n meta: {\n name: string\n version: string\n }\n rules: ESLint.Plugin['rules']\n configs: {\n strict: Linter.Config\n recommended: Linter.Config\n }\n}\n\n// Base plugin\nconst plugin: Plugin = {\n meta: {name, version},\n rules,\n configs: {} as Plugin['configs'], // will be populated later\n}\n\n// Configs\nconst configs: Plugin['configs'] = {\n strict: {\n name: 'formatjs/strict',\n plugins: {formatjs: plugin},\n rules: {\n 'formatjs/no-offset': 'error',\n 'formatjs/enforce-default-message': ['error', 'literal'],\n 'formatjs/enforce-description': ['error', 'literal'],\n 'formatjs/enforce-placeholders': 'error',\n 'formatjs/no-emoji': 'error',\n 'formatjs/no-multiple-whitespaces': 'error',\n 'formatjs/no-multiple-plurals': 'error',\n 'formatjs/no-complex-selectors': ['error', {limit: 20}],\n 'formatjs/no-useless-message': 'error',\n 'formatjs/prefer-pound-in-plural': 'error',\n 'formatjs/no-missing-icu-plural-one-placeholders': 'error',\n 'formatjs/enforce-id': [\n 'error',\n {\n idInterpolationPattern: '[sha512:contenthash:base64:10]',\n },\n ],\n 'formatjs/enforce-plural-rules': [\n 'error',\n {\n one: true,\n other: true,\n },\n ],\n 'formatjs/no-literal-string-in-jsx': [\n 'error',\n {\n props: {\n include: [['*', '{label,placeholder,title}']],\n },\n },\n ],\n 'formatjs/blocklist-elements': ['error', ['selectordinal']],\n 'formatjs/prefer-full-sentence': 'error',\n },\n },\n recommended: {\n name: 'formatjs/recommended',\n plugins: {formatjs: plugin},\n rules: {\n 'formatjs/no-offset': 'error',\n 'formatjs/enforce-default-message': ['error', 'literal'],\n 'formatjs/enforce-description': ['error', 'literal'],\n 'formatjs/enforce-placeholders': 'error',\n 'formatjs/no-emoji': 'error',\n 'formatjs/no-multiple-whitespaces': 'error',\n 'formatjs/no-multiple-plurals': 'error',\n 'formatjs/no-complex-selectors': ['error', {limit: 20}],\n 'formatjs/no-useless-message': 'error',\n 'formatjs/prefer-pound-in-plural': 'error',\n 'formatjs/no-missing-icu-plural-one-placeholders': 'error',\n 'formatjs/enforce-plural-rules': [\n 'error',\n {\n one: true,\n other: true,\n },\n ],\n 'formatjs/no-literal-string-in-jsx': [\n 'warn',\n {\n props: {\n include: [['*', '{label,placeholder,title}']],\n },\n },\n ],\n 'formatjs/blocklist-elements': ['error', ['selectordinal']],\n 'formatjs/prefer-full-sentence': 'error',\n },\n },\n}\nplugin.configs = configs\n\nexport default plugin\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "eslint-plugin-formatjs",
|
|
3
3
|
"description": "ESLint plugin for formatjs",
|
|
4
|
-
"version": "6.4.
|
|
4
|
+
"version": "6.4.5",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Long Ho <holevietlong@gmail.com>",
|
|
7
7
|
"type": "module",
|
|
@@ -15,8 +15,8 @@
|
|
|
15
15
|
"@unicode/unicode-17.0.0": "^1.6.16",
|
|
16
16
|
"magic-string": "^0.30.0",
|
|
17
17
|
"picomatch": "2 || 3 || 4",
|
|
18
|
-
"@formatjs/icu-messageformat-parser": "3.5.
|
|
19
|
-
"@formatjs/ts-transformer": "4.4.
|
|
18
|
+
"@formatjs/icu-messageformat-parser": "3.5.4",
|
|
19
|
+
"@formatjs/ts-transformer": "4.4.4"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"eslint": "9 || 10"
|