Skip to content

Commit baaa5fe

Browse files
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 <[email protected]>
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
{

0 commit comments

Comments
 (0)