eslint-plugin-formatjs 4.0.2 → 4.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE.md +0 -0
- package/README.md +0 -0
- package/index.d.ts +1 -0
- package/index.d.ts.map +1 -1
- package/index.js +18 -16
- package/package.json +4 -4
- package/rules/blocklist-elements.d.ts +0 -0
- package/rules/blocklist-elements.d.ts.map +1 -1
- package/rules/blocklist-elements.js +19 -27
- package/rules/enforce-default-message.d.ts +0 -0
- package/rules/enforce-default-message.d.ts.map +1 -1
- package/rules/enforce-default-message.js +11 -12
- package/rules/enforce-description.d.ts +0 -0
- package/rules/enforce-description.d.ts.map +1 -1
- package/rules/enforce-description.js +7 -10
- package/rules/enforce-id.d.ts +0 -0
- package/rules/enforce-id.d.ts.map +1 -1
- package/rules/enforce-id.js +35 -44
- package/rules/enforce-placeholders.d.ts +0 -0
- package/rules/enforce-placeholders.d.ts.map +1 -1
- package/rules/enforce-placeholders.js +26 -31
- package/rules/enforce-plural-rules.d.ts +0 -0
- package/rules/enforce-plural-rules.d.ts.map +1 -1
- package/rules/enforce-plural-rules.js +26 -35
- package/rules/no-camel-case.d.ts +0 -0
- package/rules/no-camel-case.d.ts.map +1 -1
- package/rules/no-camel-case.js +19 -27
- package/rules/no-complex-selectors.d.ts +0 -0
- package/rules/no-complex-selectors.d.ts.map +1 -1
- package/rules/no-complex-selectors.js +32 -24
- package/rules/no-emoji.d.ts +0 -0
- package/rules/no-emoji.d.ts.map +1 -1
- package/rules/no-emoji.js +10 -13
- package/rules/no-id.d.ts +0 -0
- package/rules/no-id.d.ts.map +1 -1
- package/rules/no-id.js +11 -17
- package/rules/no-invalid-icu.d.ts +4 -0
- package/rules/no-invalid-icu.d.ts.map +1 -0
- package/rules/no-invalid-icu.js +54 -0
- package/rules/no-literal-string-in-jsx.d.ts +0 -0
- package/rules/no-literal-string-in-jsx.d.ts.map +1 -1
- package/rules/no-literal-string-in-jsx.js +41 -35
- package/rules/no-multiple-plurals.d.ts +0 -0
- package/rules/no-multiple-plurals.d.ts.map +1 -1
- package/rules/no-multiple-plurals.js +19 -28
- package/rules/no-multiple-whitespaces.d.ts +0 -0
- package/rules/no-multiple-whitespaces.d.ts.map +1 -1
- package/rules/no-multiple-whitespaces.js +24 -37
- package/rules/no-offset.d.ts +0 -0
- package/rules/no-offset.d.ts.map +1 -1
- package/rules/no-offset.js +18 -26
- package/util.d.ts +2 -0
- package/util.d.ts.map +1 -1
- package/util.js +45 -43
|
@@ -1,41 +1,40 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
const tslib_1 = require("tslib");
|
|
4
|
+
const picomatch_1 = tslib_1.__importDefault(require("picomatch"));
|
|
5
|
+
const typescript_estree_1 = require("@typescript-eslint/typescript-estree");
|
|
6
|
+
const propMatcherSchema = {
|
|
7
7
|
type: 'array',
|
|
8
8
|
items: {
|
|
9
9
|
type: 'array',
|
|
10
10
|
items: [{ type: 'string' }, { type: 'string' }],
|
|
11
11
|
},
|
|
12
12
|
};
|
|
13
|
-
|
|
13
|
+
const defaultPropIncludePattern = [
|
|
14
14
|
['*', 'aria-{label,description,details,errormessage}'],
|
|
15
15
|
['[a-z]*([a-z0-9])', '(placeholder|title)'],
|
|
16
16
|
['img', 'alt'],
|
|
17
17
|
];
|
|
18
|
-
|
|
18
|
+
const defaultPropExcludePattern = [];
|
|
19
19
|
function stringifyJsxTagName(tagName) {
|
|
20
20
|
switch (tagName.type) {
|
|
21
21
|
case typescript_estree_1.TSESTree.AST_NODE_TYPES.JSXIdentifier:
|
|
22
22
|
return tagName.name;
|
|
23
23
|
case typescript_estree_1.TSESTree.AST_NODE_TYPES.JSXMemberExpression:
|
|
24
|
-
return
|
|
24
|
+
return `${stringifyJsxTagName(tagName.object)}.${tagName.property.name}`;
|
|
25
25
|
case typescript_estree_1.TSESTree.AST_NODE_TYPES.JSXNamespacedName:
|
|
26
|
-
return
|
|
26
|
+
return `${tagName.namespace.name}:${tagName.name.name}`;
|
|
27
27
|
}
|
|
28
28
|
}
|
|
29
29
|
function compilePropMatcher(propMatcher) {
|
|
30
|
-
return propMatcher.map(
|
|
31
|
-
var tagNamePattern = _a[0], propNamePattern = _a[1];
|
|
30
|
+
return propMatcher.map(([tagNamePattern, propNamePattern]) => {
|
|
32
31
|
return [
|
|
33
32
|
picomatch_1.default.makeRe(tagNamePattern, { contains: false }),
|
|
34
33
|
picomatch_1.default.makeRe(propNamePattern, { contains: false }),
|
|
35
34
|
];
|
|
36
35
|
});
|
|
37
36
|
}
|
|
38
|
-
|
|
37
|
+
const rule = {
|
|
39
38
|
meta: {
|
|
40
39
|
type: 'problem',
|
|
41
40
|
docs: {
|
|
@@ -51,8 +50,12 @@ var rule = {
|
|
|
51
50
|
props: {
|
|
52
51
|
type: 'object',
|
|
53
52
|
properties: {
|
|
54
|
-
include:
|
|
55
|
-
|
|
53
|
+
include: {
|
|
54
|
+
...propMatcherSchema,
|
|
55
|
+
},
|
|
56
|
+
exclude: {
|
|
57
|
+
...propMatcherSchema,
|
|
58
|
+
},
|
|
56
59
|
},
|
|
57
60
|
},
|
|
58
61
|
},
|
|
@@ -60,32 +63,35 @@ var rule = {
|
|
|
60
63
|
],
|
|
61
64
|
},
|
|
62
65
|
// TODO: Vue support
|
|
63
|
-
create
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
66
|
+
create(context) {
|
|
67
|
+
const userConfig = context.options[0] || {};
|
|
68
|
+
const propIncludePattern = compilePropMatcher([
|
|
69
|
+
...defaultPropIncludePattern,
|
|
70
|
+
...(userConfig.props?.include ?? []),
|
|
71
|
+
]);
|
|
72
|
+
const propExcludePattern = compilePropMatcher([
|
|
73
|
+
...defaultPropExcludePattern,
|
|
74
|
+
...(userConfig.props?.exclude ?? []),
|
|
75
|
+
]);
|
|
76
|
+
const lexicalJsxStack = [];
|
|
77
|
+
const shouldSkipCurrentJsxAttribute = (node) => {
|
|
78
|
+
const currentJsxNode = lexicalJsxStack[lexicalJsxStack.length - 1];
|
|
71
79
|
if (currentJsxNode.type === 'JSXFragment') {
|
|
72
80
|
return false;
|
|
73
81
|
}
|
|
74
|
-
|
|
75
|
-
|
|
82
|
+
const nameString = stringifyJsxTagName(currentJsxNode.openingElement.name);
|
|
83
|
+
const attributeName = typeof node.name.name === 'string'
|
|
76
84
|
? node.name.name
|
|
77
85
|
: node.name.name.name;
|
|
78
86
|
// match exclude
|
|
79
|
-
for (
|
|
80
|
-
var _a = propExcludePattern_1[_i], tagNamePattern = _a[0], propNamePattern = _a[1];
|
|
87
|
+
for (const [tagNamePattern, propNamePattern] of propExcludePattern) {
|
|
81
88
|
if (tagNamePattern.test(nameString) &&
|
|
82
89
|
propNamePattern.test(attributeName)) {
|
|
83
90
|
return true;
|
|
84
91
|
}
|
|
85
92
|
}
|
|
86
93
|
// match include
|
|
87
|
-
for (
|
|
88
|
-
var _c = propIncludePattern_1[_b], tagNamePattern = _c[0], propNamePattern = _c[1];
|
|
94
|
+
for (const [tagNamePattern, propNamePattern] of propIncludePattern) {
|
|
89
95
|
if (tagNamePattern.test(nameString) &&
|
|
90
96
|
propNamePattern.test(attributeName)) {
|
|
91
97
|
return false;
|
|
@@ -93,7 +99,7 @@ var rule = {
|
|
|
93
99
|
}
|
|
94
100
|
return true;
|
|
95
101
|
};
|
|
96
|
-
|
|
102
|
+
const checkJSXExpression = (node) => {
|
|
97
103
|
// Check if this is either a string literal / template literal, or the concat of them.
|
|
98
104
|
if ((node.type === 'Literal' && typeof node.value === 'string') ||
|
|
99
105
|
node.type === 'TemplateLiteral') {
|
|
@@ -108,19 +114,19 @@ var rule = {
|
|
|
108
114
|
}
|
|
109
115
|
};
|
|
110
116
|
return {
|
|
111
|
-
JSXElement:
|
|
117
|
+
JSXElement: (node) => {
|
|
112
118
|
lexicalJsxStack.push(node);
|
|
113
119
|
},
|
|
114
|
-
'JSXElement:exit':
|
|
120
|
+
'JSXElement:exit': () => {
|
|
115
121
|
lexicalJsxStack.pop();
|
|
116
122
|
},
|
|
117
|
-
JSXFragment:
|
|
123
|
+
JSXFragment: (node) => {
|
|
118
124
|
lexicalJsxStack.push(node);
|
|
119
125
|
},
|
|
120
|
-
'JSXFragment:exit':
|
|
126
|
+
'JSXFragment:exit': () => {
|
|
121
127
|
lexicalJsxStack.pop();
|
|
122
128
|
},
|
|
123
|
-
JSXAttribute:
|
|
129
|
+
JSXAttribute: (node) => {
|
|
124
130
|
if (shouldSkipCurrentJsxAttribute(node)) {
|
|
125
131
|
return;
|
|
126
132
|
}
|
|
@@ -138,7 +144,7 @@ var rule = {
|
|
|
138
144
|
checkJSXExpression(node.value.expression);
|
|
139
145
|
}
|
|
140
146
|
},
|
|
141
|
-
JSXText:
|
|
147
|
+
JSXText: (node) => {
|
|
142
148
|
// Ignore purely spacing fragments
|
|
143
149
|
if (!node.value.replace(/\s*/gm, '')) {
|
|
144
150
|
return;
|
|
@@ -149,7 +155,7 @@ var rule = {
|
|
|
149
155
|
});
|
|
150
156
|
},
|
|
151
157
|
// Children expression container
|
|
152
|
-
'JSXElement > JSXExpressionContainer':
|
|
158
|
+
'JSXElement > JSXExpressionContainer': (node) => {
|
|
153
159
|
if (node.expression.type !== 'JSXEmptyExpression') {
|
|
154
160
|
checkJSXExpression(node.expression);
|
|
155
161
|
}
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-multiple-plurals.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"no-multiple-plurals.d.ts","sourceRoot":"","sources":["no-multiple-plurals.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAA;AAwD3B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA8BhB,CAAA;AAED,eAAe,IAAI,CAAA"}
|
|
@@ -1,44 +1,37 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
10
|
-
_this.message = 'Cannot specify more than 1 plural rules';
|
|
11
|
-
return _this;
|
|
3
|
+
const util_1 = require("../util");
|
|
4
|
+
const icu_messageformat_parser_1 = require("@formatjs/icu-messageformat-parser");
|
|
5
|
+
class MultiplePlurals extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.message = 'Cannot specify more than 1 plural rules';
|
|
12
9
|
}
|
|
13
|
-
|
|
14
|
-
}
|
|
15
|
-
|
|
16
|
-
if (pluralCount === void 0) { pluralCount = { count: 0 }; }
|
|
17
|
-
for (var _i = 0, ast_1 = ast; _i < ast_1.length; _i++) {
|
|
18
|
-
var el = ast_1[_i];
|
|
10
|
+
}
|
|
11
|
+
function verifyAst(ast, pluralCount = { count: 0 }) {
|
|
12
|
+
for (const el of ast) {
|
|
19
13
|
if ((0, icu_messageformat_parser_1.isPluralElement)(el)) {
|
|
20
14
|
pluralCount.count++;
|
|
21
15
|
if (pluralCount.count > 1) {
|
|
22
16
|
throw new MultiplePlurals();
|
|
23
17
|
}
|
|
24
|
-
|
|
25
|
-
for (
|
|
26
|
-
var selector = _b[_a];
|
|
18
|
+
const { options } = el;
|
|
19
|
+
for (const selector of Object.keys(options)) {
|
|
27
20
|
verifyAst(options[selector].value, pluralCount);
|
|
28
21
|
}
|
|
29
22
|
}
|
|
30
23
|
}
|
|
31
24
|
}
|
|
32
25
|
function checkNode(context, node) {
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
26
|
+
const settings = (0, util_1.getSettings)(context);
|
|
27
|
+
const msgs = (0, util_1.extractMessages)(node, settings);
|
|
28
|
+
for (const [{ message: { defaultMessage }, messageNode, },] of msgs) {
|
|
36
29
|
if (!defaultMessage || !messageNode) {
|
|
37
30
|
continue;
|
|
38
31
|
}
|
|
39
32
|
try {
|
|
40
33
|
verifyAst((0, icu_messageformat_parser_1.parse)(defaultMessage, {
|
|
41
|
-
ignoreTag:
|
|
34
|
+
ignoreTag: settings.ignoreTag,
|
|
42
35
|
}));
|
|
43
36
|
}
|
|
44
37
|
catch (e) {
|
|
@@ -49,7 +42,7 @@ function checkNode(context, node) {
|
|
|
49
42
|
}
|
|
50
43
|
}
|
|
51
44
|
}
|
|
52
|
-
|
|
45
|
+
const rule = {
|
|
53
46
|
meta: {
|
|
54
47
|
type: 'problem',
|
|
55
48
|
docs: {
|
|
@@ -60,10 +53,8 @@ var rule = {
|
|
|
60
53
|
},
|
|
61
54
|
fixable: 'code',
|
|
62
55
|
},
|
|
63
|
-
create
|
|
64
|
-
|
|
65
|
-
return checkNode(context, node);
|
|
66
|
-
};
|
|
56
|
+
create(context) {
|
|
57
|
+
const callExpressionVisitor = (node) => checkNode(context, node);
|
|
67
58
|
if (context.parserServices.defineTemplateBodyVisitor) {
|
|
68
59
|
return context.parserServices.defineTemplateBodyVisitor({
|
|
69
60
|
CallExpression: callExpressionVisitor,
|
|
@@ -72,7 +63,7 @@ var rule = {
|
|
|
72
63
|
});
|
|
73
64
|
}
|
|
74
65
|
return {
|
|
75
|
-
JSXOpeningElement:
|
|
66
|
+
JSXOpeningElement: (node) => checkNode(context, node),
|
|
76
67
|
CallExpression: callExpressionVisitor,
|
|
77
68
|
};
|
|
78
69
|
},
|
|
File without changes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-multiple-whitespaces.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"no-multiple-whitespaces.d.ts","sourceRoot":"","sources":["no-multiple-whitespaces.ts"],"names":[],"mappings":"AAOA,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAA;AAyJ3B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA+BhB,CAAA;AAED,eAAe,IAAI,CAAA"}
|
|
@@ -1,10 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
const icu_messageformat_parser_1 = require("@formatjs/icu-messageformat-parser");
|
|
4
|
+
const util_1 = require("../util");
|
|
5
5
|
function isAstValid(ast) {
|
|
6
|
-
for (
|
|
7
|
-
var element = ast_1[_i];
|
|
6
|
+
for (const element of ast) {
|
|
8
7
|
switch (element.type) {
|
|
9
8
|
case icu_messageformat_parser_1.TYPE.literal:
|
|
10
9
|
if (/\s{2,}/gm.test(element.value)) {
|
|
@@ -21,8 +20,7 @@ function isAstValid(ast) {
|
|
|
21
20
|
break;
|
|
22
21
|
case icu_messageformat_parser_1.TYPE.plural:
|
|
23
22
|
case icu_messageformat_parser_1.TYPE.select: {
|
|
24
|
-
for (
|
|
25
|
-
var option = _b[_a];
|
|
23
|
+
for (const option of Object.values(element.options)) {
|
|
26
24
|
if (!isAstValid(option.value)) {
|
|
27
25
|
return false;
|
|
28
26
|
}
|
|
@@ -34,10 +32,9 @@ function isAstValid(ast) {
|
|
|
34
32
|
return true;
|
|
35
33
|
}
|
|
36
34
|
function trimMultiWhitespaces(message, ast) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
for (
|
|
40
|
-
var element = elements_1[_i];
|
|
35
|
+
const literalElements = [];
|
|
36
|
+
const collectLiteralElements = (elements) => {
|
|
37
|
+
for (const element of elements) {
|
|
41
38
|
switch (element.type) {
|
|
42
39
|
case icu_messageformat_parser_1.TYPE.literal:
|
|
43
40
|
literalElements.push(element);
|
|
@@ -52,8 +49,7 @@ function trimMultiWhitespaces(message, ast) {
|
|
|
52
49
|
break;
|
|
53
50
|
case icu_messageformat_parser_1.TYPE.plural:
|
|
54
51
|
case icu_messageformat_parser_1.TYPE.select: {
|
|
55
|
-
for (
|
|
56
|
-
var option = _b[_a];
|
|
52
|
+
for (const option of Object.values(element.options)) {
|
|
57
53
|
collectLiteralElements(option.value);
|
|
58
54
|
}
|
|
59
55
|
break;
|
|
@@ -64,13 +60,12 @@ function trimMultiWhitespaces(message, ast) {
|
|
|
64
60
|
collectLiteralElements(ast);
|
|
65
61
|
// Surgically trim whitespaces in the literal element ranges.
|
|
66
62
|
// This is to preserve the original whitespaces and newlines info that are lost to parsing.
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
for (
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
var endOffset = end.offset;
|
|
63
|
+
let trimmedFragments = [];
|
|
64
|
+
let currentOffset = 0;
|
|
65
|
+
for (const literal of literalElements) {
|
|
66
|
+
const { start, end } = literal.location;
|
|
67
|
+
const startOffset = start.offset;
|
|
68
|
+
const endOffset = end.offset;
|
|
74
69
|
trimmedFragments.push(message.slice(currentOffset, startOffset));
|
|
75
70
|
trimmedFragments.push(message.slice(startOffset, endOffset).replace(/\s{2,}/gm, ' '));
|
|
76
71
|
currentOffset = endOffset;
|
|
@@ -79,12 +74,12 @@ function trimMultiWhitespaces(message, ast) {
|
|
|
79
74
|
return trimmedFragments.join('');
|
|
80
75
|
}
|
|
81
76
|
function checkNode(context, node) {
|
|
82
|
-
|
|
83
|
-
|
|
77
|
+
const msgs = (0, util_1.extractMessages)(node, (0, util_1.getSettings)(context));
|
|
78
|
+
for (const [{ message: { defaultMessage }, messageNode, },] of msgs) {
|
|
84
79
|
if (!defaultMessage || !messageNode) {
|
|
85
|
-
|
|
80
|
+
continue;
|
|
86
81
|
}
|
|
87
|
-
|
|
82
|
+
let ast;
|
|
88
83
|
try {
|
|
89
84
|
ast = (0, icu_messageformat_parser_1.parse)(defaultMessage, { captureLocation: true });
|
|
90
85
|
}
|
|
@@ -93,10 +88,10 @@ function checkNode(context, node) {
|
|
|
93
88
|
node: messageNode,
|
|
94
89
|
message: e instanceof Error ? e.message : String(e),
|
|
95
90
|
});
|
|
96
|
-
return
|
|
91
|
+
return;
|
|
97
92
|
}
|
|
98
93
|
if (!isAstValid(ast)) {
|
|
99
|
-
|
|
94
|
+
const reportObject = {
|
|
100
95
|
node: messageNode,
|
|
101
96
|
message: 'Multiple consecutive whitespaces are not allowed',
|
|
102
97
|
};
|
|
@@ -120,15 +115,9 @@ function checkNode(context, node) {
|
|
|
120
115
|
}
|
|
121
116
|
context.report(reportObject);
|
|
122
117
|
}
|
|
123
|
-
};
|
|
124
|
-
for (var _i = 0, msgs_1 = msgs; _i < msgs_1.length; _i++) {
|
|
125
|
-
var _a = msgs_1[_i][0], defaultMessage = _a.message.defaultMessage, messageNode = _a.messageNode;
|
|
126
|
-
var state_1 = _loop_1(defaultMessage, messageNode);
|
|
127
|
-
if (typeof state_1 === "object")
|
|
128
|
-
return state_1.value;
|
|
129
118
|
}
|
|
130
119
|
}
|
|
131
|
-
|
|
120
|
+
const rule = {
|
|
132
121
|
meta: {
|
|
133
122
|
type: 'problem',
|
|
134
123
|
docs: {
|
|
@@ -139,10 +128,8 @@ var rule = {
|
|
|
139
128
|
},
|
|
140
129
|
fixable: 'code',
|
|
141
130
|
},
|
|
142
|
-
create
|
|
143
|
-
|
|
144
|
-
return checkNode(context, node);
|
|
145
|
-
};
|
|
131
|
+
create(context) {
|
|
132
|
+
const callExpressionVisitor = (node) => checkNode(context, node);
|
|
146
133
|
if (context.parserServices.defineTemplateBodyVisitor) {
|
|
147
134
|
return context.parserServices.defineTemplateBodyVisitor({
|
|
148
135
|
CallExpression: callExpressionVisitor,
|
|
@@ -151,7 +138,7 @@ var rule = {
|
|
|
151
138
|
});
|
|
152
139
|
}
|
|
153
140
|
return {
|
|
154
|
-
JSXOpeningElement:
|
|
141
|
+
JSXOpeningElement: (node) => checkNode(context, node),
|
|
155
142
|
CallExpression: callExpressionVisitor,
|
|
156
143
|
};
|
|
157
144
|
},
|
package/rules/no-offset.d.ts
CHANGED
|
File without changes
|
package/rules/no-offset.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"no-offset.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"no-offset.d.ts","sourceRoot":"","sources":["no-offset.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAA;AAuD3B,QAAA,MAAM,IAAI,EAAE,IAAI,CAAC,UA8BhB,CAAA;AAED,eAAe,IAAI,CAAA"}
|
package/rules/no-offset.js
CHANGED
|
@@ -1,42 +1,36 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
var _this = _super !== null && _super.apply(this, arguments) || this;
|
|
10
|
-
_this.message = 'offset are not allowed in plural rules';
|
|
11
|
-
return _this;
|
|
3
|
+
const util_1 = require("../util");
|
|
4
|
+
const icu_messageformat_parser_1 = require("@formatjs/icu-messageformat-parser");
|
|
5
|
+
class NoOffsetError extends Error {
|
|
6
|
+
constructor() {
|
|
7
|
+
super(...arguments);
|
|
8
|
+
this.message = 'offset are not allowed in plural rules';
|
|
12
9
|
}
|
|
13
|
-
|
|
14
|
-
}(Error));
|
|
10
|
+
}
|
|
15
11
|
function verifyAst(ast) {
|
|
16
|
-
for (
|
|
17
|
-
var el = ast_1[_i];
|
|
12
|
+
for (const el of ast) {
|
|
18
13
|
if ((0, icu_messageformat_parser_1.isPluralElement)(el)) {
|
|
19
14
|
if (el.offset) {
|
|
20
15
|
throw new NoOffsetError();
|
|
21
16
|
}
|
|
22
|
-
|
|
23
|
-
for (
|
|
24
|
-
var selector = _b[_a];
|
|
17
|
+
const { options } = el;
|
|
18
|
+
for (const selector of Object.keys(options)) {
|
|
25
19
|
verifyAst(options[selector].value);
|
|
26
20
|
}
|
|
27
21
|
}
|
|
28
22
|
}
|
|
29
23
|
}
|
|
30
24
|
function checkNode(context, node) {
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
25
|
+
const settings = (0, util_1.getSettings)(context);
|
|
26
|
+
const msgs = (0, util_1.extractMessages)(node, settings);
|
|
27
|
+
for (const [{ message: { defaultMessage }, messageNode, },] of msgs) {
|
|
34
28
|
if (!defaultMessage || !messageNode) {
|
|
35
29
|
continue;
|
|
36
30
|
}
|
|
37
31
|
try {
|
|
38
32
|
verifyAst((0, icu_messageformat_parser_1.parse)(defaultMessage, {
|
|
39
|
-
ignoreTag:
|
|
33
|
+
ignoreTag: settings.ignoreTag,
|
|
40
34
|
}));
|
|
41
35
|
}
|
|
42
36
|
catch (e) {
|
|
@@ -47,7 +41,7 @@ function checkNode(context, node) {
|
|
|
47
41
|
}
|
|
48
42
|
}
|
|
49
43
|
}
|
|
50
|
-
|
|
44
|
+
const rule = {
|
|
51
45
|
meta: {
|
|
52
46
|
type: 'problem',
|
|
53
47
|
docs: {
|
|
@@ -58,10 +52,8 @@ var rule = {
|
|
|
58
52
|
},
|
|
59
53
|
fixable: 'code',
|
|
60
54
|
},
|
|
61
|
-
create
|
|
62
|
-
|
|
63
|
-
return checkNode(context, node);
|
|
64
|
-
};
|
|
55
|
+
create(context) {
|
|
56
|
+
const callExpressionVisitor = (node) => checkNode(context, node);
|
|
65
57
|
if (context.parserServices.defineTemplateBodyVisitor) {
|
|
66
58
|
return context.parserServices.defineTemplateBodyVisitor({
|
|
67
59
|
CallExpression: callExpressionVisitor,
|
|
@@ -70,7 +62,7 @@ var rule = {
|
|
|
70
62
|
});
|
|
71
63
|
}
|
|
72
64
|
return {
|
|
73
|
-
JSXOpeningElement:
|
|
65
|
+
JSXOpeningElement: (node) => checkNode(context, node),
|
|
74
66
|
CallExpression: callExpressionVisitor,
|
|
75
67
|
};
|
|
76
68
|
},
|
package/util.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Rule } from 'eslint';
|
|
1
2
|
import { TSESTree } from '@typescript-eslint/typescript-estree';
|
|
2
3
|
export interface MessageDescriptor {
|
|
3
4
|
id?: string;
|
|
@@ -18,5 +19,6 @@ export interface MessageDescriptorNodeInfo {
|
|
|
18
19
|
idValueNode?: TSESTree.Property['value'] | TSESTree.JSXAttribute['value'];
|
|
19
20
|
idPropNode?: TSESTree.Property | TSESTree.JSXAttribute;
|
|
20
21
|
}
|
|
22
|
+
export declare function getSettings({ settings }: Rule.RuleContext): Settings;
|
|
21
23
|
export declare function extractMessages(node: TSESTree.Node, { additionalComponentNames, additionalFunctionNames, excludeMessageDeclCalls, }?: Settings): Array<[MessageDescriptorNodeInfo, TSESTree.Expression | undefined]>;
|
|
22
24
|
//# sourceMappingURL=util.d.ts.map
|
package/util.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["util.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,IAAI,EAAC,MAAM,QAAQ,CAAA;AAC3B,OAAO,EAAC,QAAQ,EAAC,MAAM,sCAAsC,CAAA;AAE7D,MAAM,WAAW,iBAAiB;IAChC,EAAE,CAAC,EAAE,MAAM,CAAA;IACX,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAA;CAC9B;AAMD,MAAM,WAAW,QAAQ;IACvB,uBAAuB,CAAC,EAAE,OAAO,CAAA;IACjC,uBAAuB,CAAC,EAAE,MAAM,EAAE,CAAA;IAClC,wBAAwB,CAAC,EAAE,MAAM,EAAE,CAAA;IACnC,SAAS,CAAC,EAAE,OAAO,CAAA;CACpB;AACD,MAAM,WAAW,yBAAyB;IACxC,OAAO,EAAE,iBAAiB,CAAA;IAC1B,WAAW,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IACzE,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAA;IAC3D,eAAe,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IAC7E,WAAW,CAAC,EAAE,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,QAAQ,CAAC,YAAY,CAAC,OAAO,CAAC,CAAA;IACzE,UAAU,CAAC,EAAE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC,YAAY,CAAA;CACvD;AAED,wBAAgB,WAAW,CAAC,EAAC,QAAQ,EAAC,EAAE,IAAI,CAAC,WAAW,GAAG,QAAQ,CAElE;AA4ND,wBAAgB,eAAe,CAC7B,IAAI,EAAE,QAAQ,CAAC,IAAI,EACnB,EACE,wBAAwB,EACxB,uBAAuB,EACvB,uBAAuB,GACxB,GAAE,QAAa,GACf,KAAK,CAAC,CAAC,yBAAyB,EAAE,QAAQ,CAAC,UAAU,GAAG,SAAS,CAAC,CAAC,CAiDrE"}
|