eslint-plugin-formatjs 6.4.14 → 6.4.16

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "eslint-plugin-formatjs",
3
- "version": "6.4.14",
3
+ "version": "6.4.16",
4
4
  "description": "ESLint plugin for formatjs",
5
5
  "keywords": [
6
6
  "eslint",
@@ -12,7 +12,10 @@
12
12
  "bugs": "https://github.com/formatjs/formatjs/issues",
13
13
  "license": "MIT",
14
14
  "author": "Long Ho <holevietlong@gmail.com>",
15
- "repository": "formatjs/formatjs.git",
15
+ "repository": {
16
+ "type": "git",
17
+ "url": "formatjs/formatjs.git"
18
+ },
16
19
  "type": "module",
17
20
  "main": "index.js",
18
21
  "types": "index.d.ts",
@@ -21,8 +24,8 @@
21
24
  "./util": "./util.js"
22
25
  },
23
26
  "dependencies": {
24
- "@formatjs/icu-messageformat-parser": "3.5.11",
25
- "@formatjs/ts-transformer": "4.4.12",
27
+ "@formatjs/icu-messageformat-parser": "3.5.12",
28
+ "@formatjs/ts-transformer": "4.4.14",
26
29
  "@types/estree-jsx": "^1.0.5",
27
30
  "@types/picomatch": "^4.0.0",
28
31
  "@unicode/unicode-17.0.0": "^1.6.16",
package/util.js CHANGED
@@ -1,11 +1,11 @@
1
1
  //#region packages/eslint-plugin-formatjs/util.ts
2
- const FORMAT_FUNCTION_NAMES = new Set([
2
+ const FORMAT_FUNCTION_NAMES = /* @__PURE__ */ new Set([
3
3
  "$formatMessage",
4
4
  "formatMessage",
5
5
  "$t"
6
6
  ]);
7
- const COMPONENT_NAMES = new Set(["FormattedMessage"]);
8
- const DECLARATION_FUNCTION_NAMES = new Set(["defineMessage"]);
7
+ const COMPONENT_NAMES = /* @__PURE__ */ new Set(["FormattedMessage"]);
8
+ const DECLARATION_FUNCTION_NAMES = /* @__PURE__ */ new Set(["defineMessage"]);
9
9
  function getSettings({ settings }) {
10
10
  return settings.formatjs ?? settings;
11
11
  }
@@ -169,8 +169,8 @@ function extractMessageDescriptors(node) {
169
169
  return msgs;
170
170
  }
171
171
  function extractMessages(node, { additionalComponentNames, additionalFunctionNames, excludeMessageDeclCalls } = {}) {
172
- const allFormatFunctionNames = Array.isArray(additionalFunctionNames) ? new Set([...Array.from(FORMAT_FUNCTION_NAMES), ...additionalFunctionNames]) : FORMAT_FUNCTION_NAMES;
173
- const allComponentNames = Array.isArray(additionalComponentNames) ? new Set([...Array.from(COMPONENT_NAMES), ...additionalComponentNames]) : COMPONENT_NAMES;
172
+ const allFormatFunctionNames = Array.isArray(additionalFunctionNames) ? /* @__PURE__ */ new Set([...Array.from(FORMAT_FUNCTION_NAMES), ...additionalFunctionNames]) : FORMAT_FUNCTION_NAMES;
173
+ const allComponentNames = Array.isArray(additionalComponentNames) ? /* @__PURE__ */ new Set([...Array.from(COMPONENT_NAMES), ...additionalComponentNames]) : COMPONENT_NAMES;
174
174
  if (node.type === "CallExpression") {
175
175
  const args0 = node.arguments[0];
176
176
  const args1 = node.arguments[1];
package/util.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"util.js","names":[],"sources":["../util.ts"],"sourcesContent":["import type {MessageFormatElement} from '@formatjs/icu-messageformat-parser'\nimport type {Rule} from 'eslint'\nimport type {\n BinaryExpression,\n Expression,\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\ntype BinaryExpressionOperand =\n | BinaryExpression['left']\n | BinaryExpression['right']\n\nfunction isTemplateLiteralWithoutVar(node: Node): node is TemplateLiteral {\n return node.type === 'TemplateLiteral' && node.quasis.length === 1\n}\n\ntype TransparentTypeScriptExpressionType =\n | 'TSAsExpression'\n | 'TSSatisfiesExpression'\n | 'TSNonNullExpression'\n | 'TSTypeAssertion'\n\ninterface TypeScriptExpressionWrapper {\n type: TransparentTypeScriptExpressionType\n expression: StaticMessageExpression\n}\n\ninterface TypeScriptBinaryExpressionOperandWrapper {\n type: TransparentTypeScriptExpressionType\n expression: StaticStringConcatOperand\n}\n\ntype StaticMessageExpression = Expression | TypeScriptExpressionWrapper\ntype MessagePropertyValue = Property['value'] | TypeScriptExpressionWrapper\ntype StaticStringConcatOperand =\n | BinaryExpressionOperand\n | TypeScriptBinaryExpressionOperandWrapper\n\nfunction getStaticStringFromTemplateLiteral(\n node: TemplateLiteral\n): string | undefined {\n return node.quasis.length === 1\n ? (node.quasis[0].value.cooked ?? undefined)\n : undefined\n}\n\nfunction isStaticMessageExpression(\n node: MessagePropertyValue\n): node is StaticMessageExpression {\n switch (node.type) {\n case 'ArrayPattern':\n case 'AssignmentPattern':\n case 'ObjectPattern':\n return false\n default:\n return true\n }\n}\n\nfunction getStaticStringFromMessageExpression(\n node: StaticMessageExpression\n): string | undefined {\n switch (node.type) {\n case 'TSAsExpression':\n case 'TSSatisfiesExpression':\n case 'TSNonNullExpression':\n case 'TSTypeAssertion':\n return getStaticStringFromMessageExpression(node.expression)\n case 'Literal':\n return typeof node.value === 'string' ? node.value : undefined\n case 'TemplateLiteral':\n return getStaticStringFromTemplateLiteral(node)\n case 'TaggedTemplateExpression':\n if (!isTemplateLiteralWithoutVar(node.quasi)) {\n throw new Error('Tagged template expression must be no substitution')\n }\n return getStaticStringFromTemplateLiteral(node.quasi)\n case 'BinaryExpression': {\n const [result, isStaticallyEvaluatable] =\n staticallyEvaluateStringConcat(node)\n return isStaticallyEvaluatable ? result : undefined\n }\n }\n}\n\nfunction getStaticStringFromBinaryExpressionOperand(\n node: StaticStringConcatOperand\n): string | undefined {\n switch (node.type) {\n case 'TSAsExpression':\n case 'TSSatisfiesExpression':\n case 'TSNonNullExpression':\n case 'TSTypeAssertion':\n return getStaticStringFromBinaryExpressionOperand(node.expression)\n case 'Literal':\n return typeof node.value === 'string' ? node.value : undefined\n case 'BinaryExpression': {\n const [result, isStaticallyEvaluatable] =\n staticallyEvaluateStringConcat(node)\n return isStaticallyEvaluatable ? result : undefined\n }\n }\n}\n\nfunction staticallyEvaluateStringConcat(\n node: BinaryExpression\n): [result: string, isStaticallyEvaluatable: boolean] {\n const right = getStaticStringFromBinaryExpressionOperand(node.right)\n const left = getStaticStringFromBinaryExpressionOperand(node.left)\n return left !== undefined && right !== undefined\n ? [left + right, true]\n : ['', 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: MessagePropertyValue = prop.value\n const value = isStaticMessageExpression(valueNode)\n ? getStaticStringFromMessageExpression(valueNode)\n : undefined\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 (valueNode.type === 'Literal' && typeof valueNode.value === 'string') {\n value = valueNode.value\n } else if (valueNode?.type === 'JSXExpressionContainer') {\n const {expression} = valueNode\n if (expression.type !== 'JSXEmptyExpression') {\n value = getStaticStringFromMessageExpression(expression)\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"],"mappings":"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"}
1
+ {"version":3,"file":"util.js","names":[],"sources":["../util.ts"],"sourcesContent":["import type {MessageFormatElement} from '@formatjs/icu-messageformat-parser'\nimport type {Rule} from 'eslint'\nimport type {\n BinaryExpression,\n Expression,\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\ntype BinaryExpressionOperand =\n | BinaryExpression['left']\n | BinaryExpression['right']\n\nfunction isTemplateLiteralWithoutVar(node: Node): node is TemplateLiteral {\n return node.type === 'TemplateLiteral' && node.quasis.length === 1\n}\n\ntype TransparentTypeScriptExpressionType =\n | 'TSAsExpression'\n | 'TSSatisfiesExpression'\n | 'TSNonNullExpression'\n | 'TSTypeAssertion'\n\ninterface TypeScriptExpressionWrapper {\n type: TransparentTypeScriptExpressionType\n expression: StaticMessageExpression\n}\n\ninterface TypeScriptBinaryExpressionOperandWrapper {\n type: TransparentTypeScriptExpressionType\n expression: StaticStringConcatOperand\n}\n\ntype StaticMessageExpression = Expression | TypeScriptExpressionWrapper\ntype MessagePropertyValue = Property['value'] | TypeScriptExpressionWrapper\ntype StaticStringConcatOperand =\n | BinaryExpressionOperand\n | TypeScriptBinaryExpressionOperandWrapper\n\nfunction getStaticStringFromTemplateLiteral(\n node: TemplateLiteral\n): string | undefined {\n return node.quasis.length === 1\n ? (node.quasis[0].value.cooked ?? undefined)\n : undefined\n}\n\nfunction isStaticMessageExpression(\n node: MessagePropertyValue\n): node is StaticMessageExpression {\n switch (node.type) {\n case 'ArrayPattern':\n case 'AssignmentPattern':\n case 'ObjectPattern':\n return false\n default:\n return true\n }\n}\n\nfunction getStaticStringFromMessageExpression(\n node: StaticMessageExpression\n): string | undefined {\n switch (node.type) {\n case 'TSAsExpression':\n case 'TSSatisfiesExpression':\n case 'TSNonNullExpression':\n case 'TSTypeAssertion':\n return getStaticStringFromMessageExpression(node.expression)\n case 'Literal':\n return typeof node.value === 'string' ? node.value : undefined\n case 'TemplateLiteral':\n return getStaticStringFromTemplateLiteral(node)\n case 'TaggedTemplateExpression':\n if (!isTemplateLiteralWithoutVar(node.quasi)) {\n throw new Error('Tagged template expression must be no substitution')\n }\n return getStaticStringFromTemplateLiteral(node.quasi)\n case 'BinaryExpression': {\n const [result, isStaticallyEvaluatable] =\n staticallyEvaluateStringConcat(node)\n return isStaticallyEvaluatable ? result : undefined\n }\n }\n}\n\nfunction getStaticStringFromBinaryExpressionOperand(\n node: StaticStringConcatOperand\n): string | undefined {\n switch (node.type) {\n case 'TSAsExpression':\n case 'TSSatisfiesExpression':\n case 'TSNonNullExpression':\n case 'TSTypeAssertion':\n return getStaticStringFromBinaryExpressionOperand(node.expression)\n case 'Literal':\n return typeof node.value === 'string' ? node.value : undefined\n case 'BinaryExpression': {\n const [result, isStaticallyEvaluatable] =\n staticallyEvaluateStringConcat(node)\n return isStaticallyEvaluatable ? result : undefined\n }\n }\n}\n\nfunction staticallyEvaluateStringConcat(\n node: BinaryExpression\n): [result: string, isStaticallyEvaluatable: boolean] {\n const right = getStaticStringFromBinaryExpressionOperand(node.right)\n const left = getStaticStringFromBinaryExpressionOperand(node.left)\n return left !== undefined && right !== undefined\n ? [left + right, true]\n : ['', 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: MessagePropertyValue = prop.value\n const value = isStaticMessageExpression(valueNode)\n ? getStaticStringFromMessageExpression(valueNode)\n : undefined\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 (valueNode.type === 'Literal' && typeof valueNode.value === 'string') {\n value = valueNode.value\n } else if (valueNode?.type === 'JSXExpressionContainer') {\n const {expression} = valueNode\n if (expression.type !== 'JSXEmptyExpression') {\n value = getStaticStringFromMessageExpression(expression)\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"],"mappings":"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"}