Skip to content
This repository was archived by the owner on May 4, 2020. It is now read-only.

Commit 68acfaf

Browse files
author
Long Ho
committed
fix(eslint-plugin-formatjs): fix issues with spread element in
enforce-description
1 parent 39af19d commit 68acfaf

24 files changed

+829
-724
lines changed

packages/eslint-plugin-formatjs/src/rules/blacklist-elements.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ import {
1313
isSelectElement,
1414
isTagElement,
1515
} from 'intl-messageformat-parser';
16+
import {TSESTree} from '@typescript-eslint/typescript-estree';
1617

1718
class BlacklistElement extends Error {
1819
public message: string;
@@ -82,7 +83,7 @@ function checkNode(
8283
node: Node,
8384
importedMacroVars: Scope.Variable[]
8485
) {
85-
const msgs = extractMessages(node, importedMacroVars);
86+
const msgs = extractMessages(node as TSESTree.Node, importedMacroVars);
8687
if (!msgs.length) {
8788
return;
8889
}
@@ -104,7 +105,7 @@ function checkNode(
104105
verifyAst(context.options[0], parse(defaultMessage));
105106
} catch (e) {
106107
context.report({
107-
node: messageNode,
108+
node: messageNode as Node,
108109
message: e.message,
109110
});
110111
}

packages/eslint-plugin-formatjs/src/rules/enforce-default-message.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import {Rule, Scope} from 'eslint';
22
import {ImportDeclaration, Node} from 'estree';
33
import {extractMessages} from '../util';
4+
import {TSESTree} from '@typescript-eslint/typescript-estree';
45

56
function checkNode(
67
context: Rule.RuleContext,
78
node: Node,
89
importedMacroVars: Scope.Variable[]
910
) {
10-
const msgs = extractMessages(node, importedMacroVars);
11+
const msgs = extractMessages(node as TSESTree.Node, importedMacroVars);
1112
for (const [
1213
{
1314
message: {defaultMessage},

packages/eslint-plugin-formatjs/src/rules/enforce-description.ts

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import {Rule, Scope} from 'eslint';
22
import {ImportDeclaration, Node} from 'estree';
33
import {extractMessages} from '../util';
4+
import {TSESTree} from '@typescript-eslint/typescript-estree';
45

56
function checkNode(
67
context: Rule.RuleContext,
78
node: Node,
89
importedMacroVars: Scope.Variable[]
910
) {
10-
const msgs = extractMessages(node, importedMacroVars);
11+
const msgs = extractMessages(node as TSESTree.Node, importedMacroVars);
1112
for (const [
1213
{
1314
message: {description},
@@ -23,7 +24,7 @@ function checkNode(
2324
}
2425
}
2526

26-
const rule: Rule.RuleModule = {
27+
export default {
2728
meta: {
2829
type: 'problem',
2930
docs: {
@@ -49,6 +50,4 @@ const rule: Rule.RuleModule = {
4950
CallExpression: node => checkNode(context, node, importedMacroVars),
5051
};
5152
},
52-
};
53-
54-
export default rule;
53+
} as Rule.RuleModule;

packages/eslint-plugin-formatjs/src/rules/enforce-placeholders.ts

Lines changed: 18 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import {Rule, Scope} from 'eslint';
2-
import {ImportDeclaration, Node, Expression} from 'estree';
2+
import {TSESTree} from '@typescript-eslint/typescript-estree';
33
import {extractMessages} from '../util';
44
import {
55
parse,
@@ -9,6 +9,7 @@ import {
99
isSelectElement,
1010
isPoundElement,
1111
} from 'intl-messageformat-parser';
12+
import {ImportDeclaration, Node} from 'estree';
1213

1314
class PlaceholderEnforcement extends Error {
1415
public message: string;
@@ -18,14 +19,23 @@ class PlaceholderEnforcement extends Error {
1819
}
1920
}
2021

21-
function keyExistsInExpression(key: string, values: Expression | undefined) {
22+
function keyExistsInExpression(
23+
key: string,
24+
values: TSESTree.Expression | undefined
25+
) {
2226
if (!values) {
2327
return false;
2428
}
2529
if (values.type !== 'ObjectExpression') {
2630
return true; // True bc we cannot evaluate this
2731
}
32+
if (values.properties.find(prop => prop.type === 'SpreadElement')) {
33+
return true; // True bc there's a spread element
34+
}
2835
return !!values.properties.find(prop => {
36+
if (prop.type !== 'Property') {
37+
return false;
38+
}
2939
switch (prop.key.type) {
3040
case 'Identifier':
3141
return prop.key.name === key;
@@ -38,7 +48,7 @@ function keyExistsInExpression(key: string, values: Expression | undefined) {
3848

3949
function verifyAst(
4050
ast: MessageFormatElement[],
41-
values: Expression | undefined
51+
values: TSESTree.Expression | undefined
4252
) {
4353
for (const el of ast) {
4454
if (isLiteralElement(el) || isPoundElement(el)) {
@@ -60,7 +70,7 @@ function verifyAst(
6070

6171
function checkNode(
6272
context: Rule.RuleContext,
63-
node: Node,
73+
node: TSESTree.Node,
6474
importedMacroVars: Scope.Variable[]
6575
) {
6676
const msgs = extractMessages(node, importedMacroVars, true);
@@ -79,7 +89,7 @@ function checkNode(
7989
verifyAst(parse(defaultMessage), values);
8090
} catch (e) {
8191
context.report({
82-
node: messageNode,
92+
node: messageNode as Node,
8393
message: e.message,
8494
});
8595
}
@@ -109,8 +119,9 @@ const rule: Rule.RuleModule = {
109119
}
110120
},
111121
JSXOpeningElement: (node: Node) =>
112-
checkNode(context, node, importedMacroVars),
113-
CallExpression: node => checkNode(context, node, importedMacroVars),
122+
checkNode(context, node as TSESTree.Node, importedMacroVars),
123+
CallExpression: node =>
124+
checkNode(context, node as TSESTree.Node, importedMacroVars),
114125
};
115126
},
116127
};

packages/eslint-plugin-formatjs/src/rules/enforce-plural-rules.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {Rule, Scope} from 'eslint';
22
import {ImportDeclaration, Node} from 'estree';
3+
import {TSESTree} from '@typescript-eslint/typescript-estree';
34
import {extractMessages} from '../util';
45
import {
56
parse,
@@ -52,7 +53,7 @@ function verifyAst(
5253

5354
function checkNode(
5455
context: Rule.RuleContext,
55-
node: Node,
56+
node: TSESTree.Node,
5657
importedMacroVars: Scope.Variable[]
5758
) {
5859
const msgs = extractMessages(node, importedMacroVars);
@@ -77,7 +78,7 @@ function checkNode(
7778
verifyAst(context.options[0], parse(defaultMessage));
7879
} catch (e) {
7980
context.report({
80-
node: messageNode,
81+
node: messageNode as Node,
8182
message: e.message,
8283
});
8384
}
@@ -119,8 +120,9 @@ const rule: Rule.RuleModule = {
119120
}
120121
},
121122
JSXOpeningElement: (node: Node) =>
122-
checkNode(context, node, importedMacroVars),
123-
CallExpression: node => checkNode(context, node, importedMacroVars),
123+
checkNode(context, node as TSESTree.Node, importedMacroVars),
124+
CallExpression: node =>
125+
checkNode(context, node as TSESTree.Node, importedMacroVars),
124126
};
125127
},
126128
};

packages/eslint-plugin-formatjs/src/rules/no-camel-case.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {Rule, Scope} from 'eslint';
22
import {ImportDeclaration, Node} from 'estree';
3+
import {TSESTree} from '@typescript-eslint/typescript-estree';
34
import {
45
parse,
56
isPluralElement,
@@ -36,7 +37,7 @@ function verifyAst(ast: MessageFormatElement[]) {
3637

3738
function checkNode(
3839
context: Rule.RuleContext,
39-
node: Node,
40+
node: TSESTree.Node,
4041
importedMacroVars: Scope.Variable[]
4142
) {
4243
const msgs = extractMessages(node, importedMacroVars);
@@ -54,7 +55,7 @@ function checkNode(
5455
verifyAst(parse(defaultMessage));
5556
} catch (e) {
5657
context.report({
57-
node: messageNode,
58+
node: messageNode as Node,
5859
message: e.message,
5960
});
6061
}
@@ -83,8 +84,9 @@ const rule: Rule.RuleModule = {
8384
}
8485
},
8586
JSXOpeningElement: (node: Node) =>
86-
checkNode(context, node, importedMacroVars),
87-
CallExpression: node => checkNode(context, node, importedMacroVars),
87+
checkNode(context, node as TSESTree.Node, importedMacroVars),
88+
CallExpression: node =>
89+
checkNode(context, node as TSESTree.Node, importedMacroVars),
8890
};
8991
},
9092
};

packages/eslint-plugin-formatjs/src/rules/no-emoji.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
import {Rule, Scope} from 'eslint';
22
import {ImportDeclaration, Node} from 'estree';
3+
import {TSESTree} from '@typescript-eslint/typescript-estree';
34
import {extractMessages} from '../util';
45
import * as emojiRegex from 'emoji-regex';
56
const EMOJI_REGEX: RegExp = (emojiRegex as any)();
67

78
function checkNode(
89
context: Rule.RuleContext,
9-
node: Node,
10+
node: TSESTree.Node,
1011
importedMacroVars: Scope.Variable[]
1112
) {
1213
const msgs = extractMessages(node, importedMacroVars);
@@ -22,7 +23,7 @@ function checkNode(
2223
}
2324
if (EMOJI_REGEX.test(defaultMessage)) {
2425
context.report({
25-
node: messageNode,
26+
node: messageNode as Node,
2627
message: 'Emojis are not allowed',
2728
});
2829
}
@@ -51,8 +52,9 @@ const rule: Rule.RuleModule = {
5152
}
5253
},
5354
JSXOpeningElement: (node: Node) =>
54-
checkNode(context, node, importedMacroVars),
55-
CallExpression: node => checkNode(context, node, importedMacroVars),
55+
checkNode(context, node as TSESTree.Node, importedMacroVars),
56+
CallExpression: node =>
57+
checkNode(context, node as TSESTree.Node, importedMacroVars),
5658
};
5759
},
5860
};

packages/eslint-plugin-formatjs/src/rules/no-multiple-plurals.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {Rule, Scope} from 'eslint';
22
import {ImportDeclaration, Node} from 'estree';
3+
import {TSESTree} from '@typescript-eslint/typescript-estree';
34
import {extractMessages} from '../util';
45
import {
56
parse,
@@ -28,7 +29,7 @@ function verifyAst(ast: MessageFormatElement[], pluralCount = {count: 0}) {
2829

2930
function checkNode(
3031
context: Rule.RuleContext,
31-
node: Node,
32+
node: TSESTree.Node,
3233
importedMacroVars: Scope.Variable[]
3334
) {
3435
const msgs = extractMessages(node, importedMacroVars);
@@ -46,7 +47,7 @@ function checkNode(
4647
verifyAst(parse(defaultMessage));
4748
} catch (e) {
4849
context.report({
49-
node: messageNode,
50+
node: messageNode as Node,
5051
message: e.message,
5152
});
5253
}
@@ -75,8 +76,9 @@ const rule: Rule.RuleModule = {
7576
}
7677
},
7778
JSXOpeningElement: (node: Node) =>
78-
checkNode(context, node, importedMacroVars),
79-
CallExpression: node => checkNode(context, node, importedMacroVars),
79+
checkNode(context, node as TSESTree.Node, importedMacroVars),
80+
CallExpression: node =>
81+
checkNode(context, node as TSESTree.Node, importedMacroVars),
8082
};
8183
},
8284
};

packages/eslint-plugin-formatjs/src/rules/no-multiple-whitespaces.ts

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
import {Rule, Scope} from 'eslint';
22
import {ImportDeclaration, Node} from 'estree';
33
import {extractMessages} from '../util';
4+
import {TSESTree} from '@typescript-eslint/typescript-estree';
45
const MULTIPLE_SPACES = /\s{2,}/g;
56

67
function checkNode(
78
context: Rule.RuleContext,
8-
node: Node,
9+
node: TSESTree.Node,
910
importedMacroVars: Scope.Variable[]
1011
) {
1112
const msgs = extractMessages(node, importedMacroVars);
@@ -22,13 +23,13 @@ function checkNode(
2223
let reportObject: Parameters<typeof context['report']>[0] | undefined;
2324
if (MULTIPLE_SPACES.test(defaultMessage)) {
2425
reportObject = {
25-
node: messageNode,
26+
node: messageNode as Node,
2627
message: 'Multiple consecutive whitespaces are not allowed',
2728
};
2829
if (messageNode.type === 'Literal' && messageNode.raw) {
2930
reportObject.fix = function(fixer) {
3031
return fixer.replaceText(
31-
messageNode,
32+
messageNode as Node,
3233
messageNode.raw!.replace(MULTIPLE_SPACES, ' ')
3334
);
3435
};
@@ -62,8 +63,9 @@ const rule: Rule.RuleModule = {
6263
}
6364
},
6465
JSXOpeningElement: (node: Node) =>
65-
checkNode(context, node, importedMacroVars),
66-
CallExpression: node => checkNode(context, node, importedMacroVars),
66+
checkNode(context, node as TSESTree.Node, importedMacroVars),
67+
CallExpression: node =>
68+
checkNode(context, node as TSESTree.Node, importedMacroVars),
6769
};
6870
},
6971
};

packages/eslint-plugin-formatjs/src/rules/no-offset.ts

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import {Rule, Scope} from 'eslint';
2+
import {TSESTree} from '@typescript-eslint/typescript-estree';
23
import {extractMessages} from '../util';
34
import {
45
parse,
@@ -27,7 +28,7 @@ function verifyAst(ast: MessageFormatElement[]) {
2728

2829
function checkNode(
2930
context: Rule.RuleContext,
30-
node: Node,
31+
node: TSESTree.Node,
3132
importedMacroVars: Scope.Variable[]
3233
) {
3334
const msgs = extractMessages(node, importedMacroVars);
@@ -45,7 +46,7 @@ function checkNode(
4546
verifyAst(parse(defaultMessage));
4647
} catch (e) {
4748
context.report({
48-
node: messageNode,
49+
node: messageNode as Node,
4950
message: e.message,
5051
});
5152
}
@@ -74,8 +75,9 @@ const rule: Rule.RuleModule = {
7475
}
7576
},
7677
JSXOpeningElement: (node: Node) =>
77-
checkNode(context, node, importedMacroVars),
78-
CallExpression: node => checkNode(context, node, importedMacroVars),
78+
checkNode(context, node as TSESTree.Node, importedMacroVars),
79+
CallExpression: node =>
80+
checkNode(context, node as TSESTree.Node, importedMacroVars),
7981
};
8082
},
8183
};

0 commit comments

Comments
 (0)