Fix i18n lint rule with emoji->emojify component

This commit is contained in:
Jamie Kyle
2023-06-14 17:57:04 -07:00
committed by GitHub
parent 35e07832a6
commit 5e8c22bf28
7 changed files with 48 additions and 21 deletions

View File

@@ -8,6 +8,7 @@ const globalMessages = require('../../_locales/en/messages.json');
const messageKeys = Object.keys(globalMessages).sort((a, b) => {
return a.localeCompare(b);
});
const allIcuParams = messageKeys
.filter(key => {
return isIcuMessageKey(globalMessages, key);
@@ -18,9 +19,12 @@ const allIcuParams = messageKeys
).join('\n');
});
const DEFAULT_RICH_TEXT_ELEMENT_NAMES = ['emojify'];
const hashSum = crypto.createHash('sha256');
hashSum.update(messageKeys.join('\n'));
hashSum.update(allIcuParams.join('\n'));
hashSum.update(DEFAULT_RICH_TEXT_ELEMENT_NAMES.join('\n'));
const messagesCacheKey = hashSum.digest('hex');
function isI18nCall(node) {
@@ -129,7 +133,7 @@ function isDeletedMessageKey(messages, key) {
return description?.toLowerCase().startsWith('(deleted ');
}
function getIcuMessageParams(message) {
function getIcuMessageParams(message, defaultRichTextElementNames = []) {
const params = new Set();
function visitOptions(options) {
@@ -177,6 +181,10 @@ function getIcuMessageParams(message) {
visit(icuParser.parse(message));
for (const defaultRichTextElementName of defaultRichTextElementNames) {
params.delete(defaultRichTextElementName);
}
return params;
}
@@ -286,7 +294,10 @@ module.exports = {
return;
}
const params = getIcuMessageParams(messages[key].messageformat);
const params = getIcuMessageParams(
messages[key].messageformat,
DEFAULT_RICH_TEXT_ELEMENT_NAMES
);
const components = getIntlElementComponents(node);
if (params.size === 0) {
@@ -389,7 +400,10 @@ module.exports = {
return;
}
const params = getIcuMessageParams(messages[key].messageformat);
const params = getIcuMessageParams(
messages[key].messageformat,
DEFAULT_RICH_TEXT_ELEMENT_NAMES
);
const values = getI18nCallValues(node);
if (params.size === 0) {

View File

@@ -23,6 +23,9 @@ const __mockMessages__ = {
'icu:nested': {
messageformat: '{one, select, other {{two, plural, other {{three}}}}}}',
},
'icu:emojify': {
messageformat: '<emojify>👩</emojify>',
},
};
// Need to load so mocha doesn't complain about polluting the global namespace
@@ -65,6 +68,14 @@ ruleTester.run('valid-i18n-keys', rule, {
code: `i18n("icu:nested", { one: "1", two: "2", three: "3" })`,
options: [{ messagesCacheKey, __mockMessages__ }],
},
{
code: `i18n("icu:emojify")`,
options: [{ messagesCacheKey, __mockMessages__ }],
},
{
code: `let jsx = <Intl id="icu:emojify"/>`,
options: [{ messagesCacheKey, __mockMessages__ }],
},
],
invalid: [
{