-
-
Notifications
You must be signed in to change notification settings - Fork 356
/
Copy pathoptimizer.ts
45 lines (42 loc) · 1.29 KB
/
optimizer.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import { join } from '@intlify/shared'
import { NodeTypes } from './nodes'
import type { MessageNode, ResourceNode } from './nodes'
export function optimize(ast: ResourceNode): ResourceNode {
const body = ast.body
if (body.type === NodeTypes.Message) {
optimizeMessageNode(body)
} else {
body.cases.forEach(c => optimizeMessageNode(c))
}
return ast
}
function optimizeMessageNode(message: MessageNode) {
if (message.items.length === 1) {
const item = message.items[0]
if (item.type === NodeTypes.Text || item.type === NodeTypes.Literal) {
message.static = item.value
delete item.value // optimization for size
}
} else {
const values: string[] = []
for (let i = 0; i < message.items.length; i++) {
const item = message.items[i]
if (!(item.type === NodeTypes.Text || item.type === NodeTypes.Literal)) {
break
}
if (item.value == null) {
break
}
values.push(item.value)
}
if (values.length === message.items.length) {
message.static = join(values)
for (let i = 0; i < message.items.length; i++) {
const item = message.items[i]
if (item.type === NodeTypes.Text || item.type === NodeTypes.Literal) {
delete item.value // optimization for size
}
}
}
}
}