1
- import { isBoolean , isString } from '@intlify/shared'
1
+ import { isString } from '@intlify/shared'
2
2
import { SourceMapGenerator , RawSourceMap } from 'source-map'
3
3
import {
4
4
ResourceNode ,
@@ -30,6 +30,8 @@ type CodeGenContext = {
30
30
indentLevel : number
31
31
filename : string
32
32
line : number
33
+ breakLineCode : string
34
+ needIndent : boolean
33
35
column : number
34
36
offset : number
35
37
map ?: SourceMapGenerator
@@ -46,17 +48,23 @@ type CodeGenNode =
46
48
type CodeGenerator = {
47
49
context ( ) : CodeGenContext
48
50
push ( code : string , node ?: CodeGenNode ) : void
49
- indent ( ) : void
50
- deindent ( withoutNewLine ?: boolean ) : void
51
+ indent ( withNewLine ?: boolean ) : void
52
+ deindent ( withNewLine ?: boolean ) : void
51
53
newline ( ) : void
52
54
helper ( key : string ) : string
55
+ needIndent ( ) : boolean
53
56
}
54
57
55
58
function createCodeGenerator (
56
59
ast : ResourceNode ,
57
60
options : CodeGenOptions
58
61
) : CodeGenerator {
59
- const { sourceMap, filename } = options
62
+ const {
63
+ sourceMap,
64
+ filename,
65
+ breakLineCode,
66
+ needIndent : _needIndent
67
+ } = options
60
68
const _context = {
61
69
source : ast . loc ! . source ,
62
70
filename,
@@ -65,6 +73,8 @@ function createCodeGenerator(
65
73
line : 1 ,
66
74
offset : 0 ,
67
75
map : undefined ,
76
+ breakLineCode,
77
+ needIndent : _needIndent ,
68
78
indentLevel : 0
69
79
} as CodeGenContext
70
80
@@ -80,27 +90,27 @@ function createCodeGenerator(
80
90
}
81
91
}
82
92
83
- function _newline ( n : number ) : void {
84
- push ( '\n' + ` ` . repeat ( n ) )
93
+ function _newline ( n : number , withBreakLine = true ) : void {
94
+ const _breakLineCode = withBreakLine ? breakLineCode : ''
95
+ push ( _needIndent ? _breakLineCode ! + ` ` . repeat ( n ) : _breakLineCode ! )
85
96
}
86
97
87
- function indent ( ) : void {
88
- _newline ( ++ _context . indentLevel )
98
+ function indent ( withNewLine = true ) : void {
99
+ const level = ++ _context . indentLevel
100
+ withNewLine && _newline ( level )
89
101
}
90
102
91
- function deindent ( withoutNewLine ?: boolean ) : void {
92
- if ( withoutNewLine ) {
93
- -- _context . indentLevel
94
- } else {
95
- _newline ( -- _context . indentLevel )
96
- }
103
+ function deindent ( withNewLine = true ) : void {
104
+ const level = -- _context . indentLevel
105
+ withNewLine && _newline ( level )
97
106
}
98
107
99
108
function newline ( ) : void {
100
109
_newline ( _context . indentLevel )
101
110
}
102
111
103
112
const helper = ( key : string ) : string => `_${ key } `
113
+ const needIndent = ( ) : boolean => _context . needIndent
104
114
105
115
function addMapping ( loc : Position , name ?: string ) {
106
116
_context . map ! . addMapping ( {
@@ -128,7 +138,8 @@ function createCodeGenerator(
128
138
indent,
129
139
deindent,
130
140
newline,
131
- helper
141
+ helper,
142
+ needIndent
132
143
}
133
144
}
134
145
@@ -147,9 +158,9 @@ function generateMessageNode(
147
158
generator : CodeGenerator ,
148
159
node : MessageNode
149
160
) : void {
150
- const { helper } = generator
161
+ const { helper, needIndent } = generator
151
162
generator . push ( `${ helper ( HelperNameMap . NORMALIZE ) } ([` )
152
- generator . indent ( )
163
+ generator . indent ( needIndent ( ) )
153
164
const length = node . items . length
154
165
for ( let i = 0 ; i < length ; i ++ ) {
155
166
generateNode ( generator , node . items [ i ] )
@@ -158,15 +169,15 @@ function generateMessageNode(
158
169
}
159
170
generator . push ( ', ' )
160
171
}
161
- generator . deindent ( )
172
+ generator . deindent ( needIndent ( ) )
162
173
generator . push ( '])' )
163
174
}
164
175
165
176
function generatePluralNode ( generator : CodeGenerator , node : PluralNode ) : void {
166
- const { helper } = generator
177
+ const { helper, needIndent } = generator
167
178
if ( node . cases . length > 1 ) {
168
179
generator . push ( `${ helper ( HelperNameMap . PLURAL ) } ([` )
169
- generator . indent ( )
180
+ generator . indent ( needIndent ( ) )
170
181
const length = node . cases . length
171
182
for ( let i = 0 ; i < length ; i ++ ) {
172
183
generateNode ( generator , node . cases [ i ] )
@@ -175,7 +186,7 @@ function generatePluralNode(generator: CodeGenerator, node: PluralNode): void {
175
186
}
176
187
generator . push ( ', ' )
177
188
}
178
- generator . deindent ( )
189
+ generator . deindent ( needIndent ( ) )
179
190
generator . push ( `])` )
180
191
}
181
192
}
@@ -256,12 +267,25 @@ export const generate = (
256
267
const filename = isString ( options . filename )
257
268
? options . filename
258
269
: 'message.intl'
259
- const sourceMap = isBoolean ( options . sourceMap ) ? options . sourceMap : false
270
+ const sourceMap = ! ! options . sourceMap
271
+ // prettier-ignore
272
+ const breakLineCode = options . breakLineCode != null
273
+ ? options . breakLineCode
274
+ : mode === 'arrow'
275
+ ? ';'
276
+ : '\n'
277
+ const needIndent = options . needIndent ? options . needIndent : mode !== 'arrow'
260
278
const helpers = ast . helpers || [ ]
261
- const generator = createCodeGenerator ( ast , { mode, filename, sourceMap } )
279
+ const generator = createCodeGenerator ( ast , {
280
+ mode,
281
+ filename,
282
+ sourceMap,
283
+ breakLineCode,
284
+ needIndent
285
+ } )
262
286
263
287
generator . push ( mode === 'normal' ? `function __msg__ (ctx) {` : `(ctx) => {` )
264
- generator . indent ( )
288
+ generator . indent ( needIndent )
265
289
266
290
if ( helpers . length > 0 ) {
267
291
generator . push (
@@ -272,7 +296,7 @@ export const generate = (
272
296
273
297
generator . push ( `return ` )
274
298
generateNode ( generator , ast )
275
- generator . deindent ( )
299
+ generator . deindent ( needIndent )
276
300
generator . push ( `}` )
277
301
278
302
const { code, map } = generator . context ( )
0 commit comments