Skip to content

Commit baaa5fe

Browse files
renovate[bot]ota-meshi
andauthoredDec 9, 2024··
fix(deps): update dependency @intlify/message-compiler to v10 (#557)
* fix(deps): update dependency @intlify/message-compiler to v10 * fix: support v10 * Create new-ligers-tan.md --------- Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> Co-authored-by: ota-meshi <otameshiyo23@gmail.com>
1 parent 60c3aa6 commit baaa5fe

15 files changed

+186
-124
lines changed
 

‎.changeset/new-ligers-tan.md

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"@intlify/eslint-plugin-vue-i18n": major
3+
---
4+
5+
fix(deps): update dependency @intlify/message-compiler to v10

‎lib/rules/no-deprecated-modulo-syntax.ts

+1-3
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import {
1313
getMessageSyntaxVersions,
1414
NodeTypes
1515
} from '../utils/message-compiler/utils'
16-
import { parse } from '../utils/message-compiler/parser'
16+
import { parse } from '../utils/message-compiler/parser-v9'
1717
import { traverseNode } from '../utils/message-compiler/traverser'
1818
import {
1919
createRule,
@@ -75,8 +75,6 @@ function create(context: RuleContext): RuleListener {
7575
}
7676
if (messageSyntaxVersions.v9) {
7777
verifyForV9(message, reportNode, getReportOffset)
78-
} else if (messageSyntaxVersions.v8) {
79-
return
8078
}
8179
}
8280

‎lib/rules/prefer-linked-key-with-paren.ts

+7-5
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ function create(context: RuleContext): RuleListener {
4242
const sourceCode = getSourceCode(context)
4343
const messageSyntaxVersions = getMessageSyntaxVersions(context)
4444

45-
function verifyForV9(
45+
function verifyForNewSyntax(
4646
message: string,
4747
reportNode: JSONAST.JSONStringLiteral | YAMLAST.YAMLScalar,
4848
getReportOffset: GetReportOffset
@@ -134,14 +134,16 @@ function create(context: RuleContext): RuleListener {
134134
if (messageSyntaxVersions.reportIfMissingSetting()) {
135135
return
136136
}
137-
if (messageSyntaxVersions.v9 && messageSyntaxVersions.v8) {
137+
const newSyntax = messageSyntaxVersions.v9 || messageSyntaxVersions.v10
138+
const v8Syntax = messageSyntaxVersions.v8
139+
if (newSyntax && v8Syntax) {
138140
// This rule cannot support two versions in the same project.
139141
return
140142
}
141143

142-
if (messageSyntaxVersions.v9) {
143-
verifyForV9(message, reportNode, getReportOffset)
144-
} else if (messageSyntaxVersions.v8) {
144+
if (newSyntax) {
145+
verifyForNewSyntax(message, reportNode, getReportOffset)
146+
} else if (v8Syntax) {
145147
verifyForV8(message, reportNode, getReportOffset)
146148
}
147149
}

‎lib/rules/valid-message-syntax.ts

+10-2
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import {
1414
getReportIndex
1515
} from '../utils/message-compiler/utils'
1616
import { parse } from '../utils/message-compiler/parser'
17+
import { parse as parseForV9 } from '../utils/message-compiler/parser-v9'
1718
import { parse as parseForV8 } from '../utils/message-compiler/parser-v8'
1819
import type { CompileError } from '@intlify/message-compiler'
1920
import { createRule } from '../utils/rule'
@@ -27,9 +28,16 @@ function create(context: RuleContext): RuleListener {
2728
const messageSyntaxVersions = getMessageSyntaxVersions(context)
2829

2930
function* extractMessageErrors(message: string) {
30-
if (messageSyntaxVersions.v9) {
31-
yield* parse(message).errors
31+
// v10 and v9 generate nearly identical errors so only one of them will be returned.
32+
const errorsForV10OrV9: CompileError[] = []
33+
if (messageSyntaxVersions.v10) {
34+
errorsForV10OrV9.push(...parse(message).errors)
3235
}
36+
if (messageSyntaxVersions.v9 && !errorsForV10OrV9.length) {
37+
errorsForV10OrV9.push(...parseForV9(message).errors)
38+
}
39+
yield* errorsForV10OrV9
40+
3341
if (messageSyntaxVersions.v8) {
3442
yield* parseForV8(message).errors
3543
}

‎lib/utils/collect-linked-keys.ts

+5-1
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import type { ResourceNode } from '@intlify/message-compiler'
66
import { traverseNode } from './message-compiler/traverser'
77
import type { I18nLocaleMessageDictionary, RuleContext } from '../types'
88
import { parse } from './message-compiler/parser'
9+
import { parse as parseForV9 } from './message-compiler/parser-v9'
910
import { parse as parseForV8 } from './message-compiler/parser-v8'
1011
import type { MessageSyntaxVersions } from './message-compiler/utils'
1112
import { NodeTypes } from './message-compiler/utils'
@@ -27,9 +28,12 @@ function* extractUsedKeysFromLinks(
2728
if (typeof value === 'object') {
2829
yield* extractUsedKeysFromLinks(value, messageSyntaxVersions)
2930
} else if (typeof value === 'string') {
30-
if (messageSyntaxVersions.v9) {
31+
if (messageSyntaxVersions.v10) {
3132
yield* extractUsedKeysFromAST(parse(value).ast)
3233
}
34+
if (messageSyntaxVersions.v9) {
35+
yield* extractUsedKeysFromAST(parseForV9(value).ast)
36+
}
3337
if (messageSyntaxVersions.v8) {
3438
yield* extractUsedKeysFromAST(parseForV8(value).ast)
3539
}

‎lib/utils/message-compiler/parser-v8.ts

+2-1
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import type {
1717
} from '@intlify/message-compiler'
1818
import { sortedLastIndex } from 'lodash'
1919
import { NodeTypes } from './utils'
20+
import type { ModuloNamedNode } from './parser-v9'
2021

2122
export function parse(code: string): {
2223
ast: ResourceNode
@@ -207,7 +208,7 @@ function parseAST(code: string, errors: CompileError[]): ResourceNode {
207208
node = listNode
208209
}
209210
if (!node) {
210-
const namedNode: NamedNode = {
211+
const namedNode: ModuloNamedNode = {
211212
type: NodeTypes.Named,
212213
key: trimmedKeyValue,
213214
...ctx.getNodeLoc(endOffset - 1, placeholderEndOffset)
+59
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
/**
2+
* A simplified version of the message parser that handles messages like vue-i18n v8.
3+
* This parser probably has poor performance.
4+
*/
5+
import type {
6+
CompileError,
7+
NamedNode,
8+
ResourceNode
9+
} from '@intlify/message-compiler'
10+
import { NodeTypes } from './utils'
11+
import { parse as baseParse } from './parser'
12+
import type { MessageElementNode } from './traverser'
13+
import { traverseNode } from './traverser'
14+
15+
// The deprecated Rails i18n format.
16+
export type ModuloNamedNode = NamedNode & { modulo?: boolean }
17+
18+
export function parse(code: string): {
19+
ast: ResourceNode
20+
errors: CompileError[]
21+
} {
22+
const { ast, errors } = baseParse(code)
23+
24+
traverseNode(ast, node => {
25+
if (node.type === NodeTypes.Message) {
26+
transformModuloNamedNode(node.items)
27+
}
28+
})
29+
return {
30+
ast,
31+
errors
32+
}
33+
34+
function transformModuloNamedNode(nodes: MessageElementNode[]) {
35+
// Converts nodes with a '%' before the brackets into modulo nodes.
36+
for (let index = nodes.length - 1; index >= 1; index--) {
37+
const node = nodes[index]
38+
if (
39+
node.type !== NodeTypes.Named ||
40+
code[node.loc!.start.offset - 1] !== '%'
41+
)
42+
continue
43+
44+
const prev = nodes[index - 1]
45+
if (prev.type !== NodeTypes.Text || !prev.value?.endsWith('%')) continue
46+
47+
node.modulo = true
48+
49+
prev.loc!.end.offset -= 1
50+
prev.loc!.end.column -= 1
51+
prev.end! -= 1
52+
prev.value = prev.value!.slice(0, -1)
53+
if (prev.start === prev.end) {
54+
nodes.splice(index - 1, 1)
55+
index--
56+
}
57+
}
58+
}
59+
}

‎lib/utils/message-compiler/traverser.ts

+3-1
Original file line numberDiff line numberDiff line change
@@ -11,13 +11,15 @@ import type {
1111
TextNode
1212
} from '@intlify/message-compiler'
1313
import { NodeTypes } from './utils'
14+
import type { ModuloNamedNode } from './parser-v9'
1415

15-
type MessageElementNode =
16+
export type MessageElementNode =
1617
| TextNode
1718
| NamedNode
1819
| ListNode
1920
| LiteralNode
2021
| LinkedNode
22+
| ModuloNamedNode
2123
type MessageASTNode =
2224
| ResourceNode
2325
| PluralNode

‎lib/utils/message-compiler/utils.ts

+4-1
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ export const NodeTypes = {
1919
export type MessageSyntaxVersions = {
2020
v8: boolean
2121
v9: boolean
22+
v10: boolean
2223
isNotSet: boolean
2324
reportIfMissingSetting: () => boolean
2425
}
@@ -37,6 +38,7 @@ export function getMessageSyntaxVersions(
3738
return {
3839
v8: true,
3940
v9: true,
41+
v10: true,
4042
isNotSet: true,
4143
reportIfMissingSetting: () => {
4244
if (!puttedSettingsError.has(context)) {
@@ -54,7 +56,8 @@ export function getMessageSyntaxVersions(
5456
const range = new Range(messageSyntaxVersion)
5557
return {
5658
v8: intersects(range, '^8.0.0 || <=8.0.0'),
57-
v9: intersects(range, '>=9.0.0-0'),
59+
v9: intersects(range, '^9.0.0-0'),
60+
v10: intersects(range, '>=10.0.0-0'),
5861
isNotSet: false,
5962
reportIfMissingSetting: () => false
6063
}

‎package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@
6161
"dependencies": {
6262
"@eslint/eslintrc": "^3.0.0",
6363
"@intlify/core-base": "^10.0.0",
64-
"@intlify/message-compiler": "^9.12.0",
64+
"@intlify/message-compiler": "^10.0.5",
6565
"debug": "^4.3.4",
6666
"eslint-compat-utils": "^0.6.0",
6767
"glob": "^10.3.3",

‎pnpm-lock.yaml

+2-23
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎tests/lib/rules/no-deprecated-modulo-syntax.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ const tester = new RuleTester({
1818
languageOptions: { parser: vueParser, ecmaVersion: 2015 }
1919
})
2020

21-
tester.run('no-deprecated-module-syntax', rule as never, {
21+
tester.run('no-deprecated-modulo-syntax', rule as never, {
2222
valid: [
2323
// text only
2424
{

‎tests/lib/rules/valid-message-syntax.ts

+78-83
Original file line numberDiff line numberDiff line change
@@ -223,24 +223,25 @@ tester.run('valid-message-syntax', rule as never, {
223223
}
224224
]
225225
},
226-
{
227-
code: `
228-
key: message @:(v8)
229-
`,
230-
...options.yaml.default,
231-
errors: [
232-
{
233-
message: `If you want to use '${TEST_RULE_ID_PREFIX}valid-message-syntax' rule, you need to set 'messageSyntaxVersion' at 'settings'. See the 'eslint-plugin-vue-i18n' documentation`,
234-
line: 1,
235-
column: 1
236-
},
237-
{
238-
message: 'Unexpected empty linked key',
239-
line: 2,
240-
column: 21
241-
}
242-
]
243-
},
226+
// {
227+
// // The syntax is now allowed.
228+
// code: `
229+
// key: message @:(v8)
230+
// `,
231+
// ...options.yaml.default,
232+
// errors: [
233+
// {
234+
// message: `If you want to use '${TEST_RULE_ID_PREFIX}valid-message-syntax' rule, you need to set 'messageSyntaxVersion' at 'settings'. See the 'eslint-plugin-vue-i18n' documentation`,
235+
// line: 1,
236+
// column: 1
237+
// },
238+
// {
239+
// message: 'Unexpected empty linked key',
240+
// line: 2,
241+
// column: 21
242+
// }
243+
// ]
244+
// },
244245
{
245246
code: `
246247
key: message { v9 }
@@ -272,61 +273,65 @@ tester.run('valid-message-syntax', rule as never, {
272273
}
273274
]
274275
},
275-
{
276-
code: `
277-
key: message @:(v8)
278-
`,
279-
...options.yaml.v9,
280-
errors: [
281-
{
282-
message: 'Unexpected empty linked key',
283-
line: 2,
284-
column: 21
285-
}
286-
]
287-
},
288-
{
289-
code: `
290-
key: message new line
291-
@:(v8)
292-
`,
293-
...options.yaml.v9,
294-
errors: [
295-
{
296-
message: 'Unexpected empty linked key',
297-
line: 3,
298-
column: 10
299-
}
300-
]
301-
},
302-
{
303-
code: `
304-
key: "message new line
305-
@:(v8)"
306-
`,
307-
...options.yaml.v9,
308-
errors: [
309-
{
310-
message: 'Unexpected empty linked key',
311-
line: 3,
312-
column: 10
313-
}
314-
]
315-
},
316-
{
317-
code: `
318-
key: 'message new line
319-
@:(v8)'
320-
`,
321-
...options.yaml.v9,
322-
errors: [
323-
{
324-
message: 'Unexpected empty linked key',
325-
line: 3,
326-
column: 10
327-
}
328-
]
329-
},
276+
// {
277+
// // The syntax is now allowed.
278+
// code: `
279+
// key: message @:(v8)
280+
// `,
281+
// ...options.yaml.v9,
282+
// errors: [
283+
// {
284+
// message: 'Unexpected empty linked key',
285+
// line: 2,
286+
// column: 21
287+
// }
288+
// ]
289+
// },
290+
// {
291+
// // The syntax is now allowed.
292+
// code: `
293+
// key: message new line
294+
// @:(v8)
295+
// `,
296+
// ...options.yaml.v9,
297+
// errors: [
298+
// {
299+
// message: 'Unexpected empty linked key',
300+
// line: 3,
301+
// column: 10
302+
// }
303+
// ]
304+
// },
305+
// {
306+
// // The syntax is now allowed.
307+
// code: `
308+
// key: "message new line
309+
// @:(v8)"
310+
// `,
311+
// ...options.yaml.v9,
312+
// errors: [
313+
// {
314+
// message: 'Unexpected empty linked key',
315+
// line: 3,
316+
// column: 10
317+
// }
318+
// ]
319+
// },
320+
// {
321+
// // The syntax is now allowed.
322+
// code: `
323+
// key: 'message new line
324+
// @:(v8)'
325+
// `,
326+
// ...options.yaml.v9,
327+
// errors: [
328+
// {
329+
// message: 'Unexpected empty linked key',
330+
// line: 3,
331+
// column: 10
332+
// }
333+
// ]
334+
// },
330335
{
331336
code: `
332337
<i18n lang="yaml">
@@ -476,16 +481,6 @@ tester.run('valid-message-syntax', rule as never, {
476481
line: 3,
477482
column: 22
478483
},
479-
{
480-
message: 'Unterminated closing brace',
481-
line: 4,
482-
column: 27
483-
},
484-
{
485-
message: 'Unbalanced closing brace',
486-
line: 4,
487-
column: 34
488-
},
489484
{
490485
message: "Unexpected 'null' message",
491486
line: 5,

‎tests/lib/utils/message-compiler/parser-v8.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
*/
44
import { deepStrictEqual } from 'assert'
55
import { parse } from '../../../../lib/utils/message-compiler/parser-v8'
6-
import { parse as parseForV9 } from '../../../../lib/utils/message-compiler/parser'
6+
import { parse as parseForV9 } from '../../../../lib/utils/message-compiler/parser-v9'
77
import { errorsFixtures } from './parser-v8-data'
88

99
describe('parser-v8', () => {

‎tests/lib/utils/message-compiler/utils.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -21,31 +21,37 @@ describe('message-compiler utils', () => {
2121
deepStrictEqual(get('^8.0.0'), {
2222
v8: true,
2323
v9: false,
24+
v10: false,
2425
isNotSet: false
2526
})
2627
deepStrictEqual(get('^9.0.0'), {
2728
v8: false,
2829
v9: true,
30+
v10: false,
2931
isNotSet: false
3032
})
3133
deepStrictEqual(get('^7.0.0'), {
3234
v8: true,
3335
v9: false,
36+
v10: false,
3437
isNotSet: false
3538
})
3639
deepStrictEqual(get('^10.0.0'), {
3740
v8: false,
38-
v9: true,
41+
v9: false,
42+
v10: true,
3943
isNotSet: false
4044
})
4145
deepStrictEqual(get('>=5.0.0'), {
4246
v8: true,
4347
v9: true,
48+
v10: true,
4449
isNotSet: false
4550
})
4651
deepStrictEqual(get('^9.0.0-beta.8'), {
4752
v8: false,
4853
v9: true,
54+
v10: false,
4955
isNotSet: false
5056
})
5157
})

0 commit comments

Comments
 (0)
Please sign in to comment.