i18n: Upgrade translations from crowdin (253f51dd). (docs)
[ProtonMail-WebClient.git] / packages / eslint-plugin-custom-rules / no-template-in-translator-context.js
blobd166c26837149f1b97d461544fb07f26826fee69
1 /* eslint-env es6 */
3 const isValidTranslatorNode = (node) => {
4     return node.callee && node.callee.type === 'Identifier' && node.callee.name === 'c' && node.arguments.length === 1;
5 };
7 module.exports = {
8     meta: {
9         type: 'problem',
10         fixable: 'code',
11         docs: {
12             description: 'Forbid template literals in translator contexts.',
13             url: 'https://ttag.js.org/docs/context.html',
14         },
15     },
16     create: (context) => {
17         return {
18             CallExpression: function (node) {
19                 if (!isValidTranslatorNode(node)) {
20                     return;
21                 }
23                 const argument = node.arguments[0];
24                 const argType = argument.type;
26                 if (argType === 'TemplateLiteral') {
27                     context.report({
28                         node: node,
29                         message: "Don't use template literals in translator contexts.",
30                         fix(fixer) {
31                             // 1. Check that we have no expressions in the template literal
32                             const isFixable = argument.quasis.length === 1 && argument.expressions.length === 0;
34                             if (!isFixable) {
35                                 return [];
36                             }
38                             // 2. Check that we can safely fix quotes
39                             const text = context.sourceCode.getText(argument);
41                             let quote = "'";
43                             if (text.indexOf(quote) !== -1) {
44                                 quote = '"';
45                             }
47                             if (text.indexOf(quote) !== -1) {
48                                 return [];
49                             }
51                             // 3. Replace backticks with quotes
52                             const innerText = text.slice(1, -1);
53                             const result = `${quote}${innerText}${quote}`;
55                             return [fixer.replaceText(argument, result)];
56                         },
57                     });
58                 }
59             },
60         };
61     },