Skip to content

Commit 16749dd

Browse files
authored
improvement: inline code generation (#235)
1 parent ff5662b commit 16749dd

File tree

11 files changed

+241
-117
lines changed

11 files changed

+241
-117
lines changed

packages/core-base/package.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
"bugs": {
2424
"url": "https://github.com/intlify/vue-i18n-next/issues"
2525
},
26-
"files": ["index.js", "dist"],
26+
"files": [
27+
"index.js",
28+
"dist"
29+
],
2730
"main": "index.js",
2831
"module": "dist/core-base.esm-bundler.js",
2932
"unpkg": "dist/core-base.global.js",
@@ -40,7 +43,12 @@
4043
},
4144
"buildOptions": {
4245
"name": "IntlifyCoreBase",
43-
"formats": ["esm-bundler", "esm-browser", "cjs", "global"]
46+
"formats": [
47+
"esm-bundler",
48+
"esm-browser",
49+
"cjs",
50+
"global"
51+
]
4452
},
4553
"sideEffects": false
4654
}

packages/core/package.json

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
"bugs": {
2424
"url": "https://github.com/intlify/vue-i18n-next/issues"
2525
},
26-
"files": ["index.js", "dist"],
26+
"files": [
27+
"index.js",
28+
"dist"
29+
],
2730
"main": "index.js",
2831
"module": "dist/core.esm-bundler.js",
2932
"unpkg": "dist/core.global.js",

packages/message-compiler/package.json

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@
2323
"bugs": {
2424
"url": "https://github.com/intlify/vue-i18n-next/issues"
2525
},
26-
"files": ["index.js", "dist"],
26+
"files": [
27+
"index.js",
28+
"dist"
29+
],
2730
"main": "index.js",
2831
"module": "dist/message-compiler.esm-bundler.js",
2932
"unpkg": "dist/message-compiler.global.js",
@@ -39,7 +42,12 @@
3942
},
4043
"buildOptions": {
4144
"name": "IntlifyMessageCompiler",
42-
"formats": ["esm-bundler", "esm-browser", "cjs", "global"]
45+
"formats": [
46+
"esm-bundler",
47+
"esm-browser",
48+
"cjs",
49+
"global"
50+
]
4351
},
4452
"sideEffects": false
4553
}

packages/message-compiler/src/generator.ts

Lines changed: 49 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { isBoolean, isString } from '@intlify/shared'
1+
import { isString } from '@intlify/shared'
22
import { SourceMapGenerator, RawSourceMap } from 'source-map'
33
import {
44
ResourceNode,
@@ -30,6 +30,8 @@ type CodeGenContext = {
3030
indentLevel: number
3131
filename: string
3232
line: number
33+
breakLineCode: string
34+
needIndent: boolean
3335
column: number
3436
offset: number
3537
map?: SourceMapGenerator
@@ -46,17 +48,23 @@ type CodeGenNode =
4648
type CodeGenerator = {
4749
context(): CodeGenContext
4850
push(code: string, node?: CodeGenNode): void
49-
indent(): void
50-
deindent(withoutNewLine?: boolean): void
51+
indent(withNewLine?: boolean): void
52+
deindent(withNewLine?: boolean): void
5153
newline(): void
5254
helper(key: string): string
55+
needIndent(): boolean
5356
}
5457

5558
function createCodeGenerator(
5659
ast: ResourceNode,
5760
options: CodeGenOptions
5861
): CodeGenerator {
59-
const { sourceMap, filename } = options
62+
const {
63+
sourceMap,
64+
filename,
65+
breakLineCode,
66+
needIndent: _needIndent
67+
} = options
6068
const _context = {
6169
source: ast.loc!.source,
6270
filename,
@@ -65,6 +73,8 @@ function createCodeGenerator(
6573
line: 1,
6674
offset: 0,
6775
map: undefined,
76+
breakLineCode,
77+
needIndent: _needIndent,
6878
indentLevel: 0
6979
} as CodeGenContext
7080

@@ -80,27 +90,27 @@ function createCodeGenerator(
8090
}
8191
}
8292

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!)
8596
}
8697

87-
function indent(): void {
88-
_newline(++_context.indentLevel)
98+
function indent(withNewLine = true): void {
99+
const level = ++_context.indentLevel
100+
withNewLine && _newline(level)
89101
}
90102

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)
97106
}
98107

99108
function newline(): void {
100109
_newline(_context.indentLevel)
101110
}
102111

103112
const helper = (key: string): string => `_${key}`
113+
const needIndent = (): boolean => _context.needIndent
104114

105115
function addMapping(loc: Position, name?: string) {
106116
_context.map!.addMapping({
@@ -128,7 +138,8 @@ function createCodeGenerator(
128138
indent,
129139
deindent,
130140
newline,
131-
helper
141+
helper,
142+
needIndent
132143
}
133144
}
134145

@@ -147,9 +158,9 @@ function generateMessageNode(
147158
generator: CodeGenerator,
148159
node: MessageNode
149160
): void {
150-
const { helper } = generator
161+
const { helper, needIndent } = generator
151162
generator.push(`${helper(HelperNameMap.NORMALIZE)}([`)
152-
generator.indent()
163+
generator.indent(needIndent())
153164
const length = node.items.length
154165
for (let i = 0; i < length; i++) {
155166
generateNode(generator, node.items[i])
@@ -158,15 +169,15 @@ function generateMessageNode(
158169
}
159170
generator.push(', ')
160171
}
161-
generator.deindent()
172+
generator.deindent(needIndent())
162173
generator.push('])')
163174
}
164175

165176
function generatePluralNode(generator: CodeGenerator, node: PluralNode): void {
166-
const { helper } = generator
177+
const { helper, needIndent } = generator
167178
if (node.cases.length > 1) {
168179
generator.push(`${helper(HelperNameMap.PLURAL)}([`)
169-
generator.indent()
180+
generator.indent(needIndent())
170181
const length = node.cases.length
171182
for (let i = 0; i < length; i++) {
172183
generateNode(generator, node.cases[i])
@@ -175,7 +186,7 @@ function generatePluralNode(generator: CodeGenerator, node: PluralNode): void {
175186
}
176187
generator.push(', ')
177188
}
178-
generator.deindent()
189+
generator.deindent(needIndent())
179190
generator.push(`])`)
180191
}
181192
}
@@ -256,12 +267,25 @@ export const generate = (
256267
const filename = isString(options.filename)
257268
? options.filename
258269
: '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'
260278
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+
})
262286

263287
generator.push(mode === 'normal' ? `function __msg__ (ctx) {` : `(ctx) => {`)
264-
generator.indent()
288+
generator.indent(needIndent)
265289

266290
if (helpers.length > 0) {
267291
generator.push(
@@ -272,7 +296,7 @@ export const generate = (
272296

273297
generator.push(`return `)
274298
generateNode(generator, ast)
275-
generator.deindent()
299+
generator.deindent(needIndent)
276300
generator.push(`}`)
277301

278302
const { code, map } = generator.context()

packages/message-compiler/src/options.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@ export interface TransformOptions {
1919

2020
export interface CodeGenOptions {
2121
mode?: 'normal' | 'arrow' // default normal
22+
breakLineCode?: '\n' | ';' // default newline
23+
needIndent?: boolean // default true
2224
onError?: CompileErrorHandler
2325
// Generate source map?
2426
// - Default: false

packages/message-compiler/test/__snapshots__/compiler.test.ts.snap

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -247,6 +247,24 @@ exports[`@.caml:{'no apples'} | {0} apple | {n} apples: code 1`] = `
247247

248248
exports[`@.caml:{'no apples'} | {0} apple | {n} apples: map 1`] = `undefined`;
249249

250+
exports[`arrow mode | | | : code 1`] = `"(ctx) => {const { normalize: _normalize, plural: _plural } = ctx;return _plural([_normalize([]), _normalize([]), _normalize([]), _normalize([])])}"`;
251+
252+
exports[`arrow mode !#%^&*()-_+=[]:;?.<>"\`: code 1`] = `"(ctx) => {const { normalize: _normalize } = ctx;return _normalize([\\"hi \\", \\"!#%^&*()-_+=[]:;?.<>\\\\\\"\`\\", \\" !\\"])}"`;
253+
254+
exports[`arrow mode @.caml:{'no apples'} | {0} apple | {n} apples: code 1`] = `"(ctx) => {const { normalize: _normalize, linked: _linked, interpolate: _interpolate, list: _list, named: _named, plural: _plural } = ctx;return _plural([_normalize([_linked(\\"no apples\\", \\"caml\\")]), _normalize([_interpolate(_list(0)), \\" apple\\"]), _normalize([_interpolate(_named(\\"n\\")), \\" apples\\"])])}"`;
255+
256+
exports[`arrow mode hello world: code 1`] = `"(ctx) => {const { normalize: _normalize } = ctx;return _normalize([\\"hello world\\"])}"`;
257+
258+
exports[`arrow mode hello\\n world: code 1`] = `"(ctx) => {const { normalize: _normalize } = ctx;return _normalize([\\"hello\\\\n world\\"])}"`;
259+
260+
exports[`arrow mode hi @.upper:{'name'} !: code 1`] = `"(ctx) => {const { normalize: _normalize, linked: _linked } = ctx;return _normalize([\\"hi \\", _linked(\\"name\\", \\"upper\\"), \\" !\\"])}"`;
261+
262+
exports[`arrow mode hi { 'kazupon' }!: code 1`] = `"(ctx) => {const { normalize: _normalize } = ctx;return _normalize([\\"hi \\", \\"kazupon\\", \\"!\\"])}"`;
263+
264+
exports[`arrow mode hi {0}!: code 1`] = `"(ctx) => {const { normalize: _normalize, interpolate: _interpolate, list: _list } = ctx;return _normalize([\\"hi \\", _interpolate(_list(0)), \\"!\\"])}"`;
265+
266+
exports[`arrow mode hi {name}!: code 1`] = `"(ctx) => {const { normalize: _normalize, interpolate: _interpolate, named: _named } = ctx;return _normalize([\\"hi \\", _interpolate(_named(\\"name\\")), \\"!\\"])}"`;
267+
250268
exports[`edge cases | | | : code 1`] = `
251269
"function __msg__ (ctx) {
252270
const { normalize: _normalize, plural: _plural } = ctx

0 commit comments

Comments
 (0)