eslint-plugin-formatjs 4.2.0 → 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/index.d.ts +22 -0
- package/index.d.ts.map +1 -0
- package/index.js +38 -0
- package/package.json +3 -3
- package/rules/blocklist-elements.d.ts +4 -0
- package/rules/blocklist-elements.d.ts.map +1 -0
- package/rules/blocklist-elements.js +127 -0
- package/rules/enforce-default-message.d.ts +4 -0
- package/rules/enforce-default-message.d.ts.map +1 -0
- package/rules/enforce-default-message.js +57 -0
- package/rules/enforce-description.d.ts +4 -0
- package/rules/enforce-description.d.ts.map +1 -0
- package/rules/enforce-description.js +54 -0
- package/rules/enforce-id.d.ts +4 -0
- package/rules/enforce-id.d.ts.map +1 -0
- package/rules/enforce-id.js +125 -0
- package/rules/enforce-placeholders.d.ts +4 -0
- package/rules/enforce-placeholders.d.ts.map +1 -0
- package/rules/enforce-placeholders.js +118 -0
- package/rules/enforce-plural-rules.d.ts +4 -0
- package/rules/enforce-plural-rules.d.ts.map +1 -0
- package/rules/enforce-plural-rules.js +104 -0
- package/rules/no-camel-case.d.ts +4 -0
- package/rules/no-camel-case.d.ts.map +1 -0
- package/rules/no-camel-case.js +77 -0
- package/rules/no-complex-selectors.d.ts +4 -0
- package/rules/no-complex-selectors.d.ts.map +1 -0
- package/rules/no-complex-selectors.js +99 -0
- package/rules/no-emoji.d.ts +4 -0
- package/rules/no-emoji.d.ts.map +1 -0
- package/rules/no-emoji.js +47 -0
- package/rules/no-id.d.ts +4 -0
- package/rules/no-id.d.ts.map +1 -0
- package/rules/no-id.js +52 -0
- 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 +4 -0
- package/rules/no-literal-string-in-jsx.d.ts.map +1 -0
- package/rules/no-literal-string-in-jsx.js +166 -0
- package/rules/no-multiple-plurals.d.ts +4 -0
- package/rules/no-multiple-plurals.d.ts.map +1 -0
- package/rules/no-multiple-plurals.js +71 -0
- package/rules/no-multiple-whitespaces.d.ts +4 -0
- package/rules/no-multiple-whitespaces.d.ts.map +1 -0
- package/rules/no-multiple-whitespaces.js +146 -0
- package/rules/no-offset.d.ts +4 -0
- package/rules/no-offset.d.ts.map +1 -0
- package/rules/no-offset.js +70 -0
- package/util.d.ts +24 -0
- package/util.d.ts.map +1 -0
- package/util.js +240 -0
- package/BUILD +0 -89
- package/CHANGELOG.md +0 -892
- package/index.ts +0 -38
- package/rules/blocklist-elements.ts +0 -159
- package/rules/enforce-default-message.ts +0 -71
- package/rules/enforce-description.ts +0 -68
- package/rules/enforce-id.ts +0 -171
- package/rules/enforce-placeholders.ts +0 -161
- package/rules/enforce-plural-rules.ts +0 -134
- package/rules/no-camel-case.ts +0 -97
- package/rules/no-complex-selectors.ts +0 -125
- package/rules/no-emoji.ts +0 -60
- package/rules/no-id.ts +0 -63
- package/rules/no-invalid-icu.ts +0 -69
- package/rules/no-literal-string-in-jsx.ts +0 -213
- package/rules/no-multiple-plurals.ts +0 -89
- package/rules/no-multiple-whitespaces.ts +0 -194
- package/rules/no-offset.ts +0 -88
- package/tests/blocklist-elements.test.ts +0 -120
- package/tests/enforce-default-message.test.ts +0 -260
- package/tests/enforce-description.test.ts +0 -117
- package/tests/enforce-id.test.ts +0 -209
- package/tests/enforce-placeholders.test.ts +0 -170
- package/tests/enforce-plural-rules.test.ts +0 -86
- package/tests/fixtures.ts +0 -15
- package/tests/no-camel-case.test.ts +0 -31
- package/tests/no-complex-selectors.test.ts +0 -125
- package/tests/no-id.test.ts +0 -151
- package/tests/no-invalid-icu.test.ts +0 -106
- package/tests/no-literal-string-in-jsx.test.ts +0 -213
- package/tests/no-multiple-plurals.test.ts +0 -42
- package/tests/no-multiple-whitespaces.test.ts +0 -100
- package/tests/no-offset.test.ts +0 -41
- package/tests/util.ts +0 -26
- package/tsconfig.json +0 -5
- package/util.ts +0 -307
|
@@ -1,260 +0,0 @@
|
|
|
1
|
-
import enforceDefaultMessage from '../rules/enforce-default-message'
|
|
2
|
-
import {noMatch, spreadJsx, emptyFnCall, dynamicMessage} from './fixtures'
|
|
3
|
-
import {ruleTester, vueRuleTester} from './util'
|
|
4
|
-
|
|
5
|
-
ruleTester.run('enforce-default-message', enforceDefaultMessage, {
|
|
6
|
-
valid: [
|
|
7
|
-
`import {defineMessage} from 'react-intl'
|
|
8
|
-
defineMessage({
|
|
9
|
-
defaultMessage: 'this is default message',
|
|
10
|
-
description: 'asd'
|
|
11
|
-
})`,
|
|
12
|
-
`intl.formatMessage({
|
|
13
|
-
defaultMessage: 'this is default message',
|
|
14
|
-
description: 'asd'
|
|
15
|
-
})`,
|
|
16
|
-
`intl.formatMessage({
|
|
17
|
-
defaultMessage: 'this is default message' + 'vvv',
|
|
18
|
-
description: 'asd'
|
|
19
|
-
})`,
|
|
20
|
-
`intl.formatMessage({
|
|
21
|
-
defaultMessage: \`a template
|
|
22
|
-
literal
|
|
23
|
-
\`,
|
|
24
|
-
description: 'asd'
|
|
25
|
-
})`,
|
|
26
|
-
`import {FormattedMessage} from 'react-intl'
|
|
27
|
-
const a = <FormattedMessage defaultMessage={'asf' + 'bar'}/>`,
|
|
28
|
-
dynamicMessage,
|
|
29
|
-
noMatch,
|
|
30
|
-
spreadJsx,
|
|
31
|
-
emptyFnCall,
|
|
32
|
-
],
|
|
33
|
-
invalid: [
|
|
34
|
-
{
|
|
35
|
-
code: `
|
|
36
|
-
import {defineMessage} from 'react-intl'
|
|
37
|
-
defineMessage({
|
|
38
|
-
description: 'this is default message'
|
|
39
|
-
})`,
|
|
40
|
-
errors: [
|
|
41
|
-
{
|
|
42
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
43
|
-
},
|
|
44
|
-
],
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
code: `
|
|
48
|
-
import {defineMessage} from 'react-intl'
|
|
49
|
-
defineMessage({
|
|
50
|
-
description: 'this is default message'
|
|
51
|
-
})`,
|
|
52
|
-
errors: [
|
|
53
|
-
{
|
|
54
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
55
|
-
},
|
|
56
|
-
],
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
code: `
|
|
60
|
-
import {defineMessage} from 'react-intl'
|
|
61
|
-
defineMessage({
|
|
62
|
-
defaultMessage,
|
|
63
|
-
description: 'this is default message'
|
|
64
|
-
})`,
|
|
65
|
-
errors: [
|
|
66
|
-
{
|
|
67
|
-
message: `"defaultMessage" must be:
|
|
68
|
-
- a string literal or
|
|
69
|
-
- template literal without variable`,
|
|
70
|
-
},
|
|
71
|
-
],
|
|
72
|
-
options: ['literal'],
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
code: `
|
|
76
|
-
intl.formatMessage({
|
|
77
|
-
defaultMessage,
|
|
78
|
-
description: 'this is default message'
|
|
79
|
-
})`,
|
|
80
|
-
errors: [
|
|
81
|
-
{
|
|
82
|
-
message: `"defaultMessage" must be:
|
|
83
|
-
- a string literal or
|
|
84
|
-
- template literal without variable`,
|
|
85
|
-
},
|
|
86
|
-
],
|
|
87
|
-
options: ['literal'],
|
|
88
|
-
},
|
|
89
|
-
{
|
|
90
|
-
code: `
|
|
91
|
-
import {defineMessage} from 'react-intl'
|
|
92
|
-
defineMessage({
|
|
93
|
-
defaultMessage: foo
|
|
94
|
-
})`,
|
|
95
|
-
errors: [
|
|
96
|
-
{
|
|
97
|
-
message: `"defaultMessage" must be:
|
|
98
|
-
- a string literal or
|
|
99
|
-
- template literal without variable`,
|
|
100
|
-
},
|
|
101
|
-
],
|
|
102
|
-
options: ['literal'],
|
|
103
|
-
},
|
|
104
|
-
{
|
|
105
|
-
code: `
|
|
106
|
-
intl.formatMessage({
|
|
107
|
-
description: 'this is description'
|
|
108
|
-
})`,
|
|
109
|
-
errors: [
|
|
110
|
-
{
|
|
111
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
112
|
-
},
|
|
113
|
-
],
|
|
114
|
-
},
|
|
115
|
-
{
|
|
116
|
-
code: `
|
|
117
|
-
import {defineMessages} from 'react-intl'
|
|
118
|
-
defineMessages({
|
|
119
|
-
foo: {
|
|
120
|
-
description: 'this is description'
|
|
121
|
-
}
|
|
122
|
-
})`,
|
|
123
|
-
errors: [
|
|
124
|
-
{
|
|
125
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
126
|
-
},
|
|
127
|
-
],
|
|
128
|
-
},
|
|
129
|
-
{
|
|
130
|
-
code: `
|
|
131
|
-
import {FormattedMessage} from 'react-intl'
|
|
132
|
-
const a = <FormattedMessage description="this is description"/>`,
|
|
133
|
-
errors: [
|
|
134
|
-
{
|
|
135
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
136
|
-
},
|
|
137
|
-
],
|
|
138
|
-
},
|
|
139
|
-
{
|
|
140
|
-
code: `
|
|
141
|
-
import {FormattedMessage} from 'react-intl'
|
|
142
|
-
const a = <FormattedMessage />`,
|
|
143
|
-
errors: [
|
|
144
|
-
{
|
|
145
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
146
|
-
},
|
|
147
|
-
],
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
code: `
|
|
151
|
-
import {FormattedMessage} from 'react-intl'
|
|
152
|
-
const a = <FormattedMessage description="this is description"></FormattedMessage>`,
|
|
153
|
-
errors: [
|
|
154
|
-
{
|
|
155
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
156
|
-
},
|
|
157
|
-
],
|
|
158
|
-
},
|
|
159
|
-
{
|
|
160
|
-
code: `
|
|
161
|
-
import {FormattedMessage} from 'react-intl'
|
|
162
|
-
const a = <FormattedMessage defaultMessage={defaultMessage} description="this is description"/>`,
|
|
163
|
-
errors: [
|
|
164
|
-
{
|
|
165
|
-
message: `"defaultMessage" must be:
|
|
166
|
-
- a string literal or
|
|
167
|
-
- template literal without variable`,
|
|
168
|
-
},
|
|
169
|
-
],
|
|
170
|
-
options: ['literal'],
|
|
171
|
-
},
|
|
172
|
-
{
|
|
173
|
-
code: `
|
|
174
|
-
import {FormattedMessage} from 'react-intl'
|
|
175
|
-
const a = <FormattedMessage defaultMessage={defaultMessage}/>`,
|
|
176
|
-
errors: [
|
|
177
|
-
{
|
|
178
|
-
message: `"defaultMessage" must be:
|
|
179
|
-
- a string literal or
|
|
180
|
-
- template literal without variable`,
|
|
181
|
-
},
|
|
182
|
-
],
|
|
183
|
-
options: ['literal'],
|
|
184
|
-
},
|
|
185
|
-
{
|
|
186
|
-
code: `
|
|
187
|
-
import {FormattedMessage} from 'react-intl'
|
|
188
|
-
const a = <FormattedMessage defaultMessage={\`asf \${foo}\`} description="this is description"></FormattedMessage>`,
|
|
189
|
-
errors: [
|
|
190
|
-
{
|
|
191
|
-
message: `"defaultMessage" must be:
|
|
192
|
-
- a string literal or
|
|
193
|
-
- template literal without variable`,
|
|
194
|
-
},
|
|
195
|
-
],
|
|
196
|
-
options: ['literal'],
|
|
197
|
-
},
|
|
198
|
-
{
|
|
199
|
-
code: `
|
|
200
|
-
import {FormattedMessage} from 'react-intl'
|
|
201
|
-
const a = <FormattedMessage defaultMessage={\`asf \${aas}\`}/>`,
|
|
202
|
-
errors: [
|
|
203
|
-
{
|
|
204
|
-
message: `"defaultMessage" must be:
|
|
205
|
-
- a string literal or
|
|
206
|
-
- template literal without variable`,
|
|
207
|
-
},
|
|
208
|
-
],
|
|
209
|
-
options: ['literal'],
|
|
210
|
-
},
|
|
211
|
-
],
|
|
212
|
-
})
|
|
213
|
-
|
|
214
|
-
vueRuleTester.run('vue/enforce-default-message', enforceDefaultMessage, {
|
|
215
|
-
valid: [
|
|
216
|
-
`<template>
|
|
217
|
-
<p>{{$formatMessage({
|
|
218
|
-
defaultMessage: 'this is default message',
|
|
219
|
-
description: 'asd'
|
|
220
|
-
})}}</p></template>`,
|
|
221
|
-
`<script>intl.formatMessage({
|
|
222
|
-
defaultMessage: 'this is default message',
|
|
223
|
-
description: 'asd'
|
|
224
|
-
})</script>`,
|
|
225
|
-
`<script>intl.formatMessage({
|
|
226
|
-
defaultMessage: 'this is default message' + 'vvv',
|
|
227
|
-
description: 'asd'
|
|
228
|
-
})</script>`,
|
|
229
|
-
],
|
|
230
|
-
invalid: [
|
|
231
|
-
{
|
|
232
|
-
code: `
|
|
233
|
-
<template>
|
|
234
|
-
<p>{{$formatMessage({
|
|
235
|
-
description: 'this is default message'
|
|
236
|
-
})}}</p></template>`,
|
|
237
|
-
errors: [
|
|
238
|
-
{
|
|
239
|
-
message: '`defaultMessage` has to be specified in message descriptor',
|
|
240
|
-
},
|
|
241
|
-
],
|
|
242
|
-
},
|
|
243
|
-
{
|
|
244
|
-
code: `
|
|
245
|
-
<template>
|
|
246
|
-
<p>{{$formatMessage({
|
|
247
|
-
defaultMessage,
|
|
248
|
-
description: 'this is default message'
|
|
249
|
-
})}}</p></template>`,
|
|
250
|
-
errors: [
|
|
251
|
-
{
|
|
252
|
-
message: `"defaultMessage" must be:
|
|
253
|
-
- a string literal or
|
|
254
|
-
- template literal without variable`,
|
|
255
|
-
},
|
|
256
|
-
],
|
|
257
|
-
options: ['literal'],
|
|
258
|
-
},
|
|
259
|
-
],
|
|
260
|
-
})
|
|
@@ -1,117 +0,0 @@
|
|
|
1
|
-
import enforceDescription from '../rules/enforce-description'
|
|
2
|
-
import {noMatch, spreadJsx, emptyFnCall, dynamicMessage} from './fixtures'
|
|
3
|
-
import {ruleTester} from './util'
|
|
4
|
-
|
|
5
|
-
ruleTester.run('enforce-description', enforceDescription, {
|
|
6
|
-
valid: [
|
|
7
|
-
`import {defineMessage} from 'react-intl'
|
|
8
|
-
defineMessage({
|
|
9
|
-
defaultMessage: '{count, plural, one {#} other {# more}}',
|
|
10
|
-
description: 'asd'
|
|
11
|
-
})`,
|
|
12
|
-
`intl.formatMessage({
|
|
13
|
-
defaultMessage: '{count, plural, one {#} other {# more}}',
|
|
14
|
-
description: 'asd'
|
|
15
|
-
})`,
|
|
16
|
-
`intl.formatMessage({
|
|
17
|
-
defaultMessage: '{count, plural, one {#} other {# more}}',
|
|
18
|
-
description: 'asd' + 'aaz'
|
|
19
|
-
})`,
|
|
20
|
-
`import {FormattedMessage} from 'react-intl'
|
|
21
|
-
const a = <FormattedMessage defaultMessage="{count2, plural, one {#} other {# more}}"
|
|
22
|
-
description={'asd' + 'azz'}
|
|
23
|
-
/>`,
|
|
24
|
-
dynamicMessage,
|
|
25
|
-
noMatch,
|
|
26
|
-
spreadJsx,
|
|
27
|
-
emptyFnCall,
|
|
28
|
-
],
|
|
29
|
-
invalid: [
|
|
30
|
-
{
|
|
31
|
-
code: `
|
|
32
|
-
import {defineMessage} from 'react-intl'
|
|
33
|
-
defineMessage({
|
|
34
|
-
defaultMessage: '{count, plural, one {#} other {# more}}'
|
|
35
|
-
})`,
|
|
36
|
-
errors: [
|
|
37
|
-
{
|
|
38
|
-
message: '`description` has to be specified in message descriptor',
|
|
39
|
-
},
|
|
40
|
-
],
|
|
41
|
-
},
|
|
42
|
-
{
|
|
43
|
-
code: `
|
|
44
|
-
import {defineMessage} from 'react-intl'
|
|
45
|
-
defineMessage({
|
|
46
|
-
defaultMessage: '{count, plural, one {#} other {# more}}',
|
|
47
|
-
description: foo
|
|
48
|
-
})`,
|
|
49
|
-
errors: [
|
|
50
|
-
{
|
|
51
|
-
message:
|
|
52
|
-
'`description` has to be a string literal (not function call or variable)',
|
|
53
|
-
},
|
|
54
|
-
],
|
|
55
|
-
options: ['literal'],
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
code: `
|
|
59
|
-
intl.formatMessage({
|
|
60
|
-
defaultMessage: '{count, plural, one {#} other {# more}}'
|
|
61
|
-
})`,
|
|
62
|
-
errors: [
|
|
63
|
-
{
|
|
64
|
-
message: '`description` has to be specified in message descriptor',
|
|
65
|
-
},
|
|
66
|
-
],
|
|
67
|
-
},
|
|
68
|
-
{
|
|
69
|
-
code: `
|
|
70
|
-
import {defineMessages} from 'react-intl'
|
|
71
|
-
defineMessages({
|
|
72
|
-
foo: {
|
|
73
|
-
defaultMessage: '{count2, plural, one {#} other {# more}}'
|
|
74
|
-
}
|
|
75
|
-
})`,
|
|
76
|
-
errors: [
|
|
77
|
-
{
|
|
78
|
-
message: '`description` has to be specified in message descriptor',
|
|
79
|
-
},
|
|
80
|
-
],
|
|
81
|
-
},
|
|
82
|
-
{
|
|
83
|
-
code: `
|
|
84
|
-
import {defineMessage} from 'react-intl'
|
|
85
|
-
defineMessage({
|
|
86
|
-
foo: {
|
|
87
|
-
defaultMessage: '{count2, plural, one {#} other {# more}}'
|
|
88
|
-
}
|
|
89
|
-
})`,
|
|
90
|
-
errors: [
|
|
91
|
-
{
|
|
92
|
-
message: '`description` has to be specified in message descriptor',
|
|
93
|
-
},
|
|
94
|
-
],
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
code: `
|
|
98
|
-
import {FormattedMessage} from 'react-intl'
|
|
99
|
-
const a = <FormattedMessage defaultMessage="{count2, plural, one {#} other {# more}}"/>`,
|
|
100
|
-
errors: [
|
|
101
|
-
{
|
|
102
|
-
message: '`description` has to be specified in message descriptor',
|
|
103
|
-
},
|
|
104
|
-
],
|
|
105
|
-
},
|
|
106
|
-
{
|
|
107
|
-
code: `
|
|
108
|
-
import {FormattedMessage} from 'react-intl'
|
|
109
|
-
const a = <FormattedMessage defaultMessage="{count2, plural, one {#} other {# more}}"></FormattedMessage>`,
|
|
110
|
-
errors: [
|
|
111
|
-
{
|
|
112
|
-
message: '`description` has to be specified in message descriptor',
|
|
113
|
-
},
|
|
114
|
-
],
|
|
115
|
-
},
|
|
116
|
-
],
|
|
117
|
-
})
|
package/tests/enforce-id.test.ts
DELETED
|
@@ -1,209 +0,0 @@
|
|
|
1
|
-
import enforceId from '../rules/enforce-id'
|
|
2
|
-
import {ruleTester} from './util'
|
|
3
|
-
import {noMatch, spreadJsx, emptyFnCall} from './fixtures'
|
|
4
|
-
const options = [{idInterpolationPattern: '[sha512:contenthash:base64:6]'}]
|
|
5
|
-
ruleTester.run('enforce-id', enforceId, {
|
|
6
|
-
valid: [
|
|
7
|
-
{
|
|
8
|
-
code: `intl.formatMessage({ id: 'j9qhn+', defaultMessage: '{count, plural, one {#} other {# more}}', description: 'asd'})`,
|
|
9
|
-
options,
|
|
10
|
-
},
|
|
11
|
-
{
|
|
12
|
-
code: `<FormattedMessage id="/e77jM" defaultMessage="{count, plural, one {#} other {# more}}" values={{foo: 1}} />`,
|
|
13
|
-
options,
|
|
14
|
-
},
|
|
15
|
-
`<FormattedMessage id="manual id" defaultMessage="{count, plural, one {#} other {# more}}" values={{foo: 1}} />`,
|
|
16
|
-
{code: noMatch, options},
|
|
17
|
-
{code: spreadJsx, options},
|
|
18
|
-
{code: emptyFnCall, options},
|
|
19
|
-
],
|
|
20
|
-
invalid: [
|
|
21
|
-
{
|
|
22
|
-
code: `
|
|
23
|
-
intl.formatMessage({ id: 'foo', defaultMessage: '{count, plural, one {#} other {# more}}', description: 'asd'})`,
|
|
24
|
-
errors: [
|
|
25
|
-
{
|
|
26
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
27
|
-
Expected: j9qhn+
|
|
28
|
-
Actual: foo`,
|
|
29
|
-
},
|
|
30
|
-
],
|
|
31
|
-
options,
|
|
32
|
-
output: `
|
|
33
|
-
intl.formatMessage({ id: 'j9qhn+', defaultMessage: '{count, plural, one {#} other {# more}}', description: 'asd'})`,
|
|
34
|
-
},
|
|
35
|
-
{
|
|
36
|
-
code: `
|
|
37
|
-
intl.formatMessage({defaultMessage: '{count, plural, one {#} other {# more}}', description: 'asd'})`,
|
|
38
|
-
errors: [
|
|
39
|
-
{
|
|
40
|
-
message: `id must be specified`,
|
|
41
|
-
},
|
|
42
|
-
],
|
|
43
|
-
},
|
|
44
|
-
{
|
|
45
|
-
code: `
|
|
46
|
-
intl.formatMessage({defaultMessage: '{count, plural, one {#} other {# more}}', description: 'asd'})`,
|
|
47
|
-
errors: [
|
|
48
|
-
{
|
|
49
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
50
|
-
Expected: j9qhn+
|
|
51
|
-
Actual: undefined`,
|
|
52
|
-
},
|
|
53
|
-
],
|
|
54
|
-
options,
|
|
55
|
-
output: `
|
|
56
|
-
intl.formatMessage({defaultMessage: '{count, plural, one {#} other {# more}}', id: 'j9qhn+', description: 'asd'})`,
|
|
57
|
-
},
|
|
58
|
-
{
|
|
59
|
-
code: `
|
|
60
|
-
intl.formatMessage({ id: 'bar', defaultMessage: '{aDifferentKey, plural, one {#} other {# more}}', description: 'asd'
|
|
61
|
-
}, {foo: 1})`,
|
|
62
|
-
errors: [
|
|
63
|
-
{
|
|
64
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
65
|
-
Expected: 73owpx
|
|
66
|
-
Actual: bar`,
|
|
67
|
-
},
|
|
68
|
-
],
|
|
69
|
-
options,
|
|
70
|
-
output: `
|
|
71
|
-
intl.formatMessage({ id: '73owpx', defaultMessage: '{aDifferentKey, plural, one {#} other {# more}}', description: 'asd'
|
|
72
|
-
}, {foo: 1})`,
|
|
73
|
-
},
|
|
74
|
-
{
|
|
75
|
-
code: `
|
|
76
|
-
import {FormattedMessage} from 'react-intl'
|
|
77
|
-
const a = <FormattedMessage
|
|
78
|
-
id={id}
|
|
79
|
-
defaultMessage="{count, plural, one {#} other {# more}}"
|
|
80
|
-
/>`,
|
|
81
|
-
errors: [
|
|
82
|
-
{
|
|
83
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
84
|
-
Expected: /e77jM
|
|
85
|
-
Actual: undefined`,
|
|
86
|
-
},
|
|
87
|
-
],
|
|
88
|
-
options,
|
|
89
|
-
output: `
|
|
90
|
-
import {FormattedMessage} from 'react-intl'
|
|
91
|
-
const a = <FormattedMessage
|
|
92
|
-
id="/e77jM"
|
|
93
|
-
defaultMessage="{count, plural, one {#} other {# more}}"
|
|
94
|
-
/>`,
|
|
95
|
-
},
|
|
96
|
-
{
|
|
97
|
-
code: `
|
|
98
|
-
import {FormattedMessage} from 'react-intl'
|
|
99
|
-
const a = (
|
|
100
|
-
<FormattedMessage id="bas" defaultMessage="{count, plural, one {#} other {# more}}" values={{foo: 1}} />
|
|
101
|
-
)`,
|
|
102
|
-
errors: [
|
|
103
|
-
{
|
|
104
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
105
|
-
Expected: /e77jM
|
|
106
|
-
Actual: bas`,
|
|
107
|
-
},
|
|
108
|
-
],
|
|
109
|
-
options,
|
|
110
|
-
output: `
|
|
111
|
-
import {FormattedMessage} from 'react-intl'
|
|
112
|
-
const a = (
|
|
113
|
-
<FormattedMessage id="/e77jM" defaultMessage="{count, plural, one {#} other {# more}}" values={{foo: 1}} />
|
|
114
|
-
)`,
|
|
115
|
-
},
|
|
116
|
-
{
|
|
117
|
-
code: `
|
|
118
|
-
import {FormattedMessage} from 'react-intl'
|
|
119
|
-
const a = (
|
|
120
|
-
<FormattedMessage defaultMessage="{count, plural, one {#} other {# more}}" values={{foo: 1}} />
|
|
121
|
-
)`,
|
|
122
|
-
errors: [
|
|
123
|
-
{
|
|
124
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
125
|
-
Expected: /e77jM
|
|
126
|
-
Actual: undefined`,
|
|
127
|
-
},
|
|
128
|
-
],
|
|
129
|
-
options,
|
|
130
|
-
output: `
|
|
131
|
-
import {FormattedMessage} from 'react-intl'
|
|
132
|
-
const a = (
|
|
133
|
-
<FormattedMessage defaultMessage="{count, plural, one {#} other {# more}}" id="/e77jM" values={{foo: 1}} />
|
|
134
|
-
)`,
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
code: `
|
|
138
|
-
intl.formatMessage({ id, defaultMessage: '{count, plural, one {<a>#</a>} other {# more}}', description: 'asd'
|
|
139
|
-
}, {
|
|
140
|
-
count: 1,
|
|
141
|
-
})`,
|
|
142
|
-
errors: [
|
|
143
|
-
{
|
|
144
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
145
|
-
Expected: UoHSIG
|
|
146
|
-
Actual: undefined`,
|
|
147
|
-
},
|
|
148
|
-
],
|
|
149
|
-
options,
|
|
150
|
-
output: `
|
|
151
|
-
intl.formatMessage({ id: 'UoHSIG', defaultMessage: '{count, plural, one {<a>#</a>} other {# more}}', description: 'asd'
|
|
152
|
-
}, {
|
|
153
|
-
count: 1,
|
|
154
|
-
})`,
|
|
155
|
-
},
|
|
156
|
-
{
|
|
157
|
-
code: `
|
|
158
|
-
import { defineMessages } from 'react-intl'
|
|
159
|
-
|
|
160
|
-
defineMessages({ example: { defaultMessage: 'example' } })`,
|
|
161
|
-
errors: [
|
|
162
|
-
{
|
|
163
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6].
|
|
164
|
-
Expected: O7Eu2j
|
|
165
|
-
Actual: undefined`,
|
|
166
|
-
},
|
|
167
|
-
],
|
|
168
|
-
options,
|
|
169
|
-
output: `
|
|
170
|
-
import { defineMessages } from 'react-intl'
|
|
171
|
-
|
|
172
|
-
defineMessages({ example: { defaultMessage: 'example', id: 'O7Eu2j' } })`,
|
|
173
|
-
},
|
|
174
|
-
],
|
|
175
|
-
})
|
|
176
|
-
|
|
177
|
-
const optionsWithWhitelist = [
|
|
178
|
-
{
|
|
179
|
-
idInterpolationPattern: '[sha512:contenthash:base64:6]',
|
|
180
|
-
idWhitelist: ['\\.', '^payment_.*'],
|
|
181
|
-
},
|
|
182
|
-
]
|
|
183
|
-
ruleTester.run('enforce-id', enforceId, {
|
|
184
|
-
valid: [
|
|
185
|
-
{
|
|
186
|
-
options: optionsWithWhitelist,
|
|
187
|
-
code: `
|
|
188
|
-
import { defineMessages } from 'react-intl'
|
|
189
|
-
defineMessages({ example: { defaultMessage: 'example1', id: 'my.custom.id' } })
|
|
190
|
-
defineMessages({ example: { defaultMessage: 'example2', id: 'payment_string' } })`,
|
|
191
|
-
},
|
|
192
|
-
],
|
|
193
|
-
invalid: [
|
|
194
|
-
{
|
|
195
|
-
code: `
|
|
196
|
-
intl.formatMessage({defaultMessage: '{count, plural, one {#} other {# more}}', description: 'asd'})`,
|
|
197
|
-
errors: [
|
|
198
|
-
{
|
|
199
|
-
message: `"id" does not match with hash pattern [sha512:contenthash:base64:6] or allowlisted patterns ["/\\./i", "/^payment_.*/i"].
|
|
200
|
-
Expected: j9qhn+
|
|
201
|
-
Actual: undefined`,
|
|
202
|
-
},
|
|
203
|
-
],
|
|
204
|
-
options: optionsWithWhitelist,
|
|
205
|
-
output: `
|
|
206
|
-
intl.formatMessage({defaultMessage: '{count, plural, one {#} other {# more}}', id: 'j9qhn+', description: 'asd'})`,
|
|
207
|
-
},
|
|
208
|
-
],
|
|
209
|
-
})
|