Skip to content

Update no-missing-placeholders and no-unused-placeholders to handle messageIds #252

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jul 12, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion lib/rules/no-missing-message-ids.js
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ module.exports = {
values.forEach((val) => {
if (
val.type === 'Literal' &&
val.value !== null &&
typeof val.value === 'string' &&
val.value !== '' &&
!utils.getMessageIdNodeById(
val.value,
Expand Down
46 changes: 34 additions & 12 deletions lib/rules/no-missing-placeholders.js
Original file line number Diff line number Diff line change
Expand Up @@ -31,19 +31,17 @@ module.exports = {
},

create(context) {
const sourceCode = context.getSourceCode();
const { scopeManager } = sourceCode;

let contextIdentifiers;

// ----------------------------------------------------------------------
// Public
// ----------------------------------------------------------------------
const ruleInfo = utils.getRuleInfo(sourceCode);
const messagesNode = utils.getMessagesNode(ruleInfo, scopeManager);

return {
Program(ast) {
const sourceCode = context.getSourceCode();
contextIdentifiers = utils.getContextIdentifiers(
sourceCode.scopeManager,
ast
);
contextIdentifiers = utils.getContextIdentifiers(scopeManager, ast);
},
CallExpression(node) {
if (
Expand All @@ -57,10 +55,34 @@ module.exports = {
return;
}

const reportMessagesAndDataArray = utils
.collectReportViolationAndSuggestionData(reportInfo)
.filter((obj) => obj.message);
for (const { message, data } of reportMessagesAndDataArray) {
const reportMessagesAndDataArray =
utils.collectReportViolationAndSuggestionData(reportInfo);

if (messagesNode) {
// Check for any potential instances where we can use the messageId to fill in the message for convenience.
reportMessagesAndDataArray.forEach((obj) => {
if (
!obj.message &&
obj.messageId &&
obj.messageId.type === 'Literal' &&
typeof obj.messageId.value === 'string'
) {
const correspondingMessage = utils.getMessageIdNodeById(
obj.messageId.value,
ruleInfo,
scopeManager,
context.getScope()
);
if (correspondingMessage) {
obj.message = correspondingMessage.value;
}
}
});
}

for (const { message, data } of reportMessagesAndDataArray.filter(
(obj) => obj.message
)) {
const messageStaticValue = getStaticValue(
message,
context.getScope()
Expand Down
46 changes: 34 additions & 12 deletions lib/rules/no-unused-placeholders.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,19 +30,17 @@ module.exports = {
},

create(context) {
const sourceCode = context.getSourceCode();
const { scopeManager } = sourceCode;

let contextIdentifiers;

// ----------------------------------------------------------------------
// Public
// ----------------------------------------------------------------------
const ruleInfo = utils.getRuleInfo(sourceCode);
const messagesNode = utils.getMessagesNode(ruleInfo, scopeManager);

return {
Program(ast) {
const sourceCode = context.getSourceCode();
contextIdentifiers = utils.getContextIdentifiers(
sourceCode.scopeManager,
ast
);
contextIdentifiers = utils.getContextIdentifiers(scopeManager, ast);
},
CallExpression(node) {
if (
Expand All @@ -56,10 +54,34 @@ module.exports = {
return;
}

const reportMessagesAndDataArray = utils
.collectReportViolationAndSuggestionData(reportInfo)
.filter((obj) => obj.message);
for (const { message, data } of reportMessagesAndDataArray) {
const reportMessagesAndDataArray =
utils.collectReportViolationAndSuggestionData(reportInfo);

if (messagesNode) {
// Check for any potential instances where we can use the messageId to fill in the message for convenience.
reportMessagesAndDataArray.forEach((obj) => {
if (
!obj.message &&
obj.messageId &&
obj.messageId.type === 'Literal' &&
typeof obj.messageId.value === 'string'
) {
const correspondingMessage = utils.getMessageIdNodeById(
obj.messageId.value,
ruleInfo,
scopeManager,
context.getScope()
);
if (correspondingMessage) {
obj.message = correspondingMessage.value;
}
}
});
}

for (const { message, data } of reportMessagesAndDataArray.filter(
(obj) => obj.message
)) {
const messageStaticValue = getStaticValue(
message,
context.getScope()
Expand Down
107 changes: 107 additions & 0 deletions tests/lib/rules/no-missing-placeholders.js
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,60 @@ ruleTester.run('no-missing-placeholders', rule, {
}
};
`,
// messageId but no placeholder.
`
module.exports = {
meta: {
messages: { myMessageId: 'foo' }
},
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId but the message doesn't exist in `meta.messages`.
`
module.exports = {
meta: {
messages: { }
},
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId but no `meta.messages`.
`
module.exports = {
meta: { },
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId but no `meta`.
`
module.exports = {
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId with correctly-used placeholder.
`
module.exports = {
meta: {
messages: { myMessageId: 'foo {{bar}}' }
},
create(context) {
context.report({
node,
messageId: 'myMessageId',
data: { bar: 'baz' }
});
}
};
`,
// Message in variable.
`
const MESSAGE = 'foo {{bar}}';
Expand Down Expand Up @@ -145,6 +199,25 @@ ruleTester.run('no-missing-placeholders', rule, {
}
};
`,
// Suggestion with messageId
`
module.exports = {
meta: { messages: { myMessageId: 'Remove {{functionName}}' } },
create(context) {
context.report({
node,
suggest: [
{
messageId: 'myMessageId',
data: {
functionName: 'foo'
}
}
]
});
}
};
`,
],

invalid: [
Expand Down Expand Up @@ -269,6 +342,25 @@ ruleTester.run('no-missing-placeholders', rule, {
`,
errors: [error('bar')],
},
{
// Suggestion and messageId
code: `
module.exports = {
meta: { messages: { myMessageId: 'foo {{bar}}' } },
create(context) {
context.report({
node,
suggest: [
{
messageId: 'myMessageId',
}
]
});
}
};
`,
errors: [error('bar')],
},
{
// `create` in variable.
code: `
Expand All @@ -283,5 +375,20 @@ ruleTester.run('no-missing-placeholders', rule, {
`,
errors: [error('hasOwnProperty')],
},
{
// messageId.
code: `
module.exports = {
meta: { messages: { myMessageId: 'foo {{bar}}' } },
create(context) {
context.report({
node,
messageId: 'myMessageId'
});
}
};
`,
errors: [error('bar')],
},
],
});
107 changes: 107 additions & 0 deletions tests/lib/rules/no-unused-placeholders.js
Original file line number Diff line number Diff line change
Expand Up @@ -122,6 +122,77 @@ ruleTester.run('no-unused-placeholders', rule, {
}
};
`,
// Suggestion with messageId
`
module.exports = {
meta: { messages: { myMessageId: 'foo {{bar}}' } },
create(context) {
context.report({
node,
suggest: [
{
messageId: 'myMessageId',
data: { 'bar': 'baz' }
}
]
});
}
};
`,
// messageId but no placeholder.
`
module.exports = {
meta: {
messages: { myMessageId: 'foo' }
},
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId but the message property doesn't exist yet.
`
module.exports = {
meta: {
messages: { }
},
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId but no `meta.messages`.
`
module.exports = {
meta: {},
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId but no `meta`.
`
module.exports = {
create(context) {
context.report({ node, messageId: 'myMessageId' });
}
};
`,
// messageId with correctly-used placeholder.
`
module.exports = {
meta: {
messages: { myMessageId: 'foo {{bar}}' }
},
create(context) {
context.report({
node,
messageId: 'myMessageId',
data: { bar: 'baz' }
});
}
};
`,
],

invalid: [
Expand Down Expand Up @@ -197,6 +268,22 @@ ruleTester.run('no-unused-placeholders', rule, {
`,
errors: [error('baz')],
},
{
// messageId.
code: `
module.exports = {
meta: { messages: { myMessageId: 'foo' } },
create(context) {
context.report({
node,
messageId: 'myMessageId',
data: { bar }
});
}
};
`,
errors: [error('bar')],
},
{
// Suggestion
code: `
Expand All @@ -216,5 +303,25 @@ ruleTester.run('no-unused-placeholders', rule, {
`,
errors: [error('bar')],
},
{
// Suggestion and messageId
code: `
module.exports = {
meta: { messages: { myMessageId: 'foo' } },
create(context) {
context.report({
node,
suggest: [
{
messageId: 'myMessageId',
data: { bar }
}
]
});
}
};
`,
errors: [error('bar')],
},
],
});