@@ -13,8 +13,8 @@ import {
1313 LiteralNode
1414} from './parser'
1515import { 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'
1818
1919type CodeGenContext = {
2020 source ?: string
@@ -32,6 +32,7 @@ type CodeGenerator = Readonly<{
3232 indent : ( ) => void
3333 deindent : ( withoutNewLine ?: boolean ) => void
3434 newline : ( ) => void
35+ helper : ( key : string ) => string
3536} >
3637
3738function createCodeGenerator ( source ?: string ) : CodeGenerator {
@@ -67,34 +68,39 @@ function createCodeGenerator(source?: string): CodeGenerator {
6768 _newline ( _context . indentLevel )
6869 }
6970
71+ const helper = ( key : string ) : string => `_${ key } `
72+
7073 return {
7174 context,
7275 push,
7376 indent,
7477 deindent,
75- newline
78+ newline,
79+ helper
7680 }
7781}
7882
7983function generateLinkedNode ( generator : CodeGenerator , node : LinkedNode ) : void {
84+ const { helper } = generator
8085 if ( node . modifier ) {
81- generator . push ( 'ctx.modifier(' )
86+ generator . push ( ` ${ helper ( HelperNameMap . MODIFIER ) } (` )
8287 generateNode ( generator , node . modifier )
8388 generator . push ( ')(' )
8489 }
85- generator . push ( 'ctx.message(' )
90+ generator . push ( ` ${ helper ( HelperNameMap . MESSAGE ) } (` )
8691 generateNode ( generator , node . key )
8792 generator . push ( ')(ctx)' )
8893 if ( node . modifier ) {
89- generator . push ( ', ctx.type)' )
94+ generator . push ( `, ${ helper ( HelperNameMap . TYPE ) } )` )
9095 }
9196}
9297
9398function generateMessageNode (
9499 generator : CodeGenerator ,
95100 node : MessageNode
96101) : void {
97- generator . push ( 'ctx.normalize([' )
102+ const { helper } = generator
103+ generator . push ( `${ helper ( HelperNameMap . NORMALIZE ) } ([` )
98104 generator . indent ( )
99105 const length = node . items . length
100106 for ( let i = 0 ; i < length ; i ++ ) {
@@ -109,6 +115,7 @@ function generateMessageNode(
109115}
110116
111117function generatePluralNode ( generator : CodeGenerator , node : PluralNode ) : void {
118+ const { helper } = generator
112119 if ( node . cases . length > 1 ) {
113120 generator . push ( '[' )
114121 generator . indent ( )
@@ -122,7 +129,9 @@ function generatePluralNode(generator: CodeGenerator, node: PluralNode): void {
122129 }
123130 generator . deindent ( )
124131 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 ) } )]`
126135 )
127136 }
128137}
@@ -136,6 +145,7 @@ function generateResource(generator: CodeGenerator, node: ResourceNode): void {
136145}
137146
138147function generateNode ( generator : CodeGenerator , node : Node ) : void {
148+ const { helper } = generator
139149 switch ( node . type ) {
140150 case NodeTypes . Resource :
141151 generateResource ( generator , node as ResourceNode )
@@ -156,11 +166,17 @@ function generateNode(generator: CodeGenerator, node: Node): void {
156166 generator . push ( JSON . stringify ( ( node as LinkedKeyNode ) . value ) )
157167 break
158168 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+ )
160174 break
161175 case NodeTypes . Named :
162176 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 ) } ))`
164180 )
165181 break
166182 case NodeTypes . Literal :
@@ -181,12 +197,24 @@ export const generate = (
181197 ast : ResourceNode ,
182198 options : CodeGenOptions = { } // eslint-disable-line
183199) : string => {
200+ const mode = isString ( options . mode ) ? options . mode : 'normal'
201+ const helpers = ast . helpers || [ ]
184202 const generator = createCodeGenerator ( ast . loc && ast . loc . source )
185- generator . push ( `function __msg__ (ctx) {` )
203+
204+ generator . push ( mode === 'normal' ? `function __msg__ (ctx) {` : `(ctx) => {` )
186205 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+
187214 generator . push ( `return ` )
188215 generateNode ( generator , ast )
189216 generator . deindent ( )
190217 generator . push ( `}` )
218+
191219 return generator . context ( ) . code
192220}
0 commit comments