@@ -13,8 +13,8 @@ import {
13
13
LiteralNode
14
14
} from './parser'
15
15
import { CodeGenOptions } from './options'
16
-
17
- export const INTERPOLATE_CODE = `const interpolate = val => { return val == null ? "" : Array.isArray(val) || ((Object.prototype.toString.call(val) === "[object Object]") && val.toString === Object.prototype.toString) ? JSON.stringify(val, null, 2) : String(val) }`
16
+ import { HelperNameMap } from './context'
17
+ import { isString } from '../utils'
18
18
19
19
type CodeGenContext = {
20
20
source ?: string
@@ -32,6 +32,7 @@ type CodeGenerator = Readonly<{
32
32
indent : ( ) => void
33
33
deindent : ( withoutNewLine ?: boolean ) => void
34
34
newline : ( ) => void
35
+ helper : ( key : string ) => string
35
36
} >
36
37
37
38
function createCodeGenerator ( source ?: string ) : CodeGenerator {
@@ -67,34 +68,39 @@ function createCodeGenerator(source?: string): CodeGenerator {
67
68
_newline ( _context . indentLevel )
68
69
}
69
70
71
+ const helper = ( key : string ) : string => `_${ key } `
72
+
70
73
return {
71
74
context,
72
75
push,
73
76
indent,
74
77
deindent,
75
- newline
78
+ newline,
79
+ helper
76
80
}
77
81
}
78
82
79
83
function generateLinkedNode ( generator : CodeGenerator , node : LinkedNode ) : void {
84
+ const { helper } = generator
80
85
if ( node . modifier ) {
81
- generator . push ( 'ctx.modifier(' )
86
+ generator . push ( ` ${ helper ( HelperNameMap . MODIFIER ) } (` )
82
87
generateNode ( generator , node . modifier )
83
88
generator . push ( ')(' )
84
89
}
85
- generator . push ( 'ctx.message(' )
90
+ generator . push ( ` ${ helper ( HelperNameMap . MESSAGE ) } (` )
86
91
generateNode ( generator , node . key )
87
92
generator . push ( ')(ctx)' )
88
93
if ( node . modifier ) {
89
- generator . push ( ', ctx.type)' )
94
+ generator . push ( `, ${ helper ( HelperNameMap . TYPE ) } )` )
90
95
}
91
96
}
92
97
93
98
function generateMessageNode (
94
99
generator : CodeGenerator ,
95
100
node : MessageNode
96
101
) : void {
97
- generator . push ( 'ctx.normalize([' )
102
+ const { helper } = generator
103
+ generator . push ( `${ helper ( HelperNameMap . NORMALIZE ) } ([` )
98
104
generator . indent ( )
99
105
const length = node . items . length
100
106
for ( let i = 0 ; i < length ; i ++ ) {
@@ -109,6 +115,7 @@ function generateMessageNode(
109
115
}
110
116
111
117
function generatePluralNode ( generator : CodeGenerator , node : PluralNode ) : void {
118
+ const { helper } = generator
112
119
if ( node . cases . length > 1 ) {
113
120
generator . push ( '[' )
114
121
generator . indent ( )
@@ -122,7 +129,9 @@ function generatePluralNode(generator: CodeGenerator, node: PluralNode): void {
122
129
}
123
130
generator . deindent ( )
124
131
generator . push (
125
- `][ctx.pluralRule(ctx.pluralIndex, ${ length } , ctx.orgPluralRule)]`
132
+ `][${ helper ( HelperNameMap . PLURAL_RULE ) } (${ helper (
133
+ HelperNameMap . PLURAL_INDEX
134
+ ) } , ${ length } , ${ helper ( HelperNameMap . ORG_PLURAL_RULE ) } )]`
126
135
)
127
136
}
128
137
}
@@ -136,6 +145,7 @@ function generateResource(generator: CodeGenerator, node: ResourceNode): void {
136
145
}
137
146
138
147
function generateNode ( generator : CodeGenerator , node : Node ) : void {
148
+ const { helper } = generator
139
149
switch ( node . type ) {
140
150
case NodeTypes . Resource :
141
151
generateResource ( generator , node as ResourceNode )
@@ -156,11 +166,17 @@ function generateNode(generator: CodeGenerator, node: Node): void {
156
166
generator . push ( JSON . stringify ( ( node as LinkedKeyNode ) . value ) )
157
167
break
158
168
case NodeTypes . List :
159
- generator . push ( `ctx.interpolate(ctx.list(${ ( node as ListNode ) . index } ))` )
169
+ generator . push (
170
+ `${ helper ( HelperNameMap . INTERPOLATE ) } (${ helper ( HelperNameMap . LIST ) } (${
171
+ ( node as ListNode ) . index
172
+ } ))`
173
+ )
160
174
break
161
175
case NodeTypes . Named :
162
176
generator . push (
163
- `ctx.interpolate(ctx.named(${ JSON . stringify ( ( node as NamedNode ) . key ) } ))`
177
+ `${ helper ( HelperNameMap . INTERPOLATE ) } (${ helper (
178
+ HelperNameMap . NAMED
179
+ ) } (${ JSON . stringify ( ( node as NamedNode ) . key ) } ))`
164
180
)
165
181
break
166
182
case NodeTypes . Literal :
@@ -181,12 +197,24 @@ export const generate = (
181
197
ast : ResourceNode ,
182
198
options : CodeGenOptions = { } // eslint-disable-line
183
199
) : string => {
200
+ const mode = isString ( options . mode ) ? options . mode : 'normal'
201
+ const helpers = ast . helpers || [ ]
184
202
const generator = createCodeGenerator ( ast . loc && ast . loc . source )
185
- generator . push ( `function __msg__ (ctx) {` )
203
+
204
+ generator . push ( mode === 'normal' ? `function __msg__ (ctx) {` : `(ctx) => {` )
186
205
generator . indent ( )
206
+
207
+ if ( helpers . length > 0 ) {
208
+ generator . push (
209
+ `const { ${ helpers . map ( s => `${ s } : _${ s } ` ) . join ( ', ' ) } } = ctx`
210
+ )
211
+ generator . newline ( )
212
+ }
213
+
187
214
generator . push ( `return ` )
188
215
generateNode ( generator , ast )
189
216
generator . deindent ( )
190
217
generator . push ( `}` )
218
+
191
219
return generator . context ( ) . code
192
220
}
0 commit comments