Skip to content

Commit

Permalink
feat!: Update no-missing-placeholders and no-unused-placeholders
Browse files Browse the repository at this point in the history
…to handle messageIds (#252)

* breaking: update no-missing-placeholders and no-unused-placeholders to handle messageIds

* use utils
  • Loading branch information
bmish committed Jul 12, 2022
1 parent 1c96c77 commit 047b0b5
Show file tree
Hide file tree
Showing 5 changed files with 283 additions and 25 deletions.
2 changes: 1 addition & 1 deletion lib/rules/no-missing-message-ids.js
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
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
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
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
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')],
},
],
});

0 comments on commit 047b0b5

Please sign in to comment.