@intlify/bundle-utils 5.5.0 → 6.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/index.cjs +236 -75
- package/lib/index.d.ts +85 -5
- package/lib/index.mjs +238 -86
- package/package.json +11 -10
- package/index.mjs +0 -1
- package/lib/codegen.d.ts +0 -82
- package/lib/codegen.js +0 -226
- package/lib/deps.d.ts +0 -7
- package/lib/deps.js +0 -68
- package/lib/index.js +0 -13
- package/lib/js.d.ts +0 -10
- package/lib/js.js +0 -417
- package/lib/json.d.ts +0 -10
- package/lib/json.js +0 -283
- package/lib/legacy.d.ts +0 -2
- package/lib/legacy.js +0 -17
- package/lib/yaml.d.ts +0 -10
- package/lib/yaml.js +0 -274
package/lib/js.js
DELETED
|
@@ -1,417 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
/**
|
|
3
|
-
* Code generator for i18n js resource
|
|
4
|
-
*/
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.generate = void 0;
|
|
7
|
-
const shared_1 = require("@intlify/shared");
|
|
8
|
-
const acorn_1 = require("acorn");
|
|
9
|
-
const escodegen_1 = require("escodegen");
|
|
10
|
-
const estree_walker_1 = require("estree-walker");
|
|
11
|
-
const codegen_1 = require("./codegen");
|
|
12
|
-
/**
|
|
13
|
-
* @internal
|
|
14
|
-
*/
|
|
15
|
-
function generate(targetSource, { type = 'plain', bridge = false, exportESM = false, filename = 'vue-i18n-loader.js', inSourceMap = undefined, locale = '', isGlobal = false, sourceMap = false, env = 'development', forceStringify = false, onError = undefined, strictMessage = true, escapeHtml = false, useClassComponent = false, allowDynamic = false }, injector) {
|
|
16
|
-
const target = Buffer.isBuffer(targetSource)
|
|
17
|
-
? targetSource.toString()
|
|
18
|
-
: targetSource;
|
|
19
|
-
const value = target;
|
|
20
|
-
const options = {
|
|
21
|
-
type,
|
|
22
|
-
bridge,
|
|
23
|
-
exportESM,
|
|
24
|
-
source: value,
|
|
25
|
-
sourceMap,
|
|
26
|
-
locale,
|
|
27
|
-
isGlobal,
|
|
28
|
-
inSourceMap,
|
|
29
|
-
env,
|
|
30
|
-
filename,
|
|
31
|
-
forceStringify,
|
|
32
|
-
onError,
|
|
33
|
-
strictMessage,
|
|
34
|
-
escapeHtml,
|
|
35
|
-
useClassComponent
|
|
36
|
-
};
|
|
37
|
-
const generator = (0, codegen_1.createCodeGenerator)(options);
|
|
38
|
-
const ast = (0, acorn_1.parse)(value, {
|
|
39
|
-
ecmaVersion: 'latest',
|
|
40
|
-
sourceType: 'module',
|
|
41
|
-
sourceFile: filename,
|
|
42
|
-
allowImportExportEverywhere: true
|
|
43
|
-
});
|
|
44
|
-
const exportResult = scanAst(ast);
|
|
45
|
-
if (!allowDynamic) {
|
|
46
|
-
// if (!astExportDefaultWithObject.length) {
|
|
47
|
-
if (!exportResult || exportResult !== 'object') {
|
|
48
|
-
throw new Error(`You need to define an object as the locale message with 'export default'.`);
|
|
49
|
-
}
|
|
50
|
-
}
|
|
51
|
-
else {
|
|
52
|
-
if (!exportResult) {
|
|
53
|
-
throw new Error(`You need to define 'export default' that will return the locale messages.`);
|
|
54
|
-
}
|
|
55
|
-
if (exportResult !== 'object') {
|
|
56
|
-
/**
|
|
57
|
-
* NOTE:
|
|
58
|
-
* If `allowDynamic` is `true`, do not transform the code by this function, return it as is.
|
|
59
|
-
* This means that the user **must transform locale messages ownself**.
|
|
60
|
-
* Especially at the production, you need to do locale messages pre-compiling.
|
|
61
|
-
*/
|
|
62
|
-
return {
|
|
63
|
-
ast,
|
|
64
|
-
code: value,
|
|
65
|
-
map: inSourceMap
|
|
66
|
-
};
|
|
67
|
-
}
|
|
68
|
-
}
|
|
69
|
-
const codeMaps = generateNode(generator, ast, options, injector);
|
|
70
|
-
const { code, map } = generator.context();
|
|
71
|
-
// if (map) {
|
|
72
|
-
// const s = new SourceMapConsumer((map as any).toJSON())
|
|
73
|
-
// s.eachMapping(m => {
|
|
74
|
-
// console.log('sourcemap json', m)
|
|
75
|
-
// })
|
|
76
|
-
// }
|
|
77
|
-
// prettier-ignore
|
|
78
|
-
const newMap = map
|
|
79
|
-
? (0, codegen_1.mapLinesColumns)(map.toJSON(), codeMaps, inSourceMap) || null // eslint-disable-line @typescript-eslint/no-explicit-any
|
|
80
|
-
: null;
|
|
81
|
-
return {
|
|
82
|
-
ast,
|
|
83
|
-
code,
|
|
84
|
-
map: newMap != null ? newMap : undefined
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
exports.generate = generate;
|
|
88
|
-
function scanAst(ast) {
|
|
89
|
-
if (ast.type !== 'Program') {
|
|
90
|
-
throw new Error('Invalid AST: does not have Program node');
|
|
91
|
-
}
|
|
92
|
-
let ret = false;
|
|
93
|
-
for (const node of ast.body) {
|
|
94
|
-
if (node.type === 'ExportDefaultDeclaration') {
|
|
95
|
-
if (node.declaration.type === 'ObjectExpression') {
|
|
96
|
-
ret = 'object';
|
|
97
|
-
break;
|
|
98
|
-
}
|
|
99
|
-
else if (node.declaration.type === 'FunctionDeclaration') {
|
|
100
|
-
ret = 'function';
|
|
101
|
-
break;
|
|
102
|
-
}
|
|
103
|
-
else if (node.declaration.type === 'ArrowFunctionExpression') {
|
|
104
|
-
ret = 'arrow-function';
|
|
105
|
-
break;
|
|
106
|
-
}
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
return ret;
|
|
110
|
-
}
|
|
111
|
-
function generateNode(generator, node, options, injector) {
|
|
112
|
-
const propsCountStack = [];
|
|
113
|
-
const pathStack = [];
|
|
114
|
-
const itemsCountStack = [];
|
|
115
|
-
const skipStack = [];
|
|
116
|
-
const { forceStringify } = generator.context();
|
|
117
|
-
const codeMaps = new Map();
|
|
118
|
-
const { type, bridge, exportESM, sourceMap, isGlobal, locale, useClassComponent } = options;
|
|
119
|
-
const componentNamespace = '_Component';
|
|
120
|
-
(0, estree_walker_1.walk)(node, {
|
|
121
|
-
/**
|
|
122
|
-
* NOTE:
|
|
123
|
-
* force cast to Node of `estree-walker@3.x`,
|
|
124
|
-
* because `estree-walker@3.x` is not dual packages,
|
|
125
|
-
* so it's support only esm only ...
|
|
126
|
-
*/
|
|
127
|
-
// @ts-ignore
|
|
128
|
-
enter(node, parent) {
|
|
129
|
-
switch (node.type) {
|
|
130
|
-
case 'Program':
|
|
131
|
-
if (type === 'plain') {
|
|
132
|
-
generator.push(`const resource = `);
|
|
133
|
-
}
|
|
134
|
-
else if (type === 'sfc') {
|
|
135
|
-
// for 'sfc'
|
|
136
|
-
const variableName = type === 'sfc' ? (!isGlobal ? '__i18n' : '__i18nGlobal') : '';
|
|
137
|
-
const localeName = type === 'sfc' ? (locale != null ? locale : `""`) : '';
|
|
138
|
-
const exportSyntax = bridge
|
|
139
|
-
? exportESM
|
|
140
|
-
? `export default`
|
|
141
|
-
: `module.exports =`
|
|
142
|
-
: `export default`;
|
|
143
|
-
generator.push(`${exportSyntax} function (Component) {`);
|
|
144
|
-
generator.indent();
|
|
145
|
-
// prettier-ignore
|
|
146
|
-
const componentVariable = bridge
|
|
147
|
-
? `Component.options || Component`
|
|
148
|
-
: useClassComponent
|
|
149
|
-
? `Component.__o || Component`
|
|
150
|
-
: `Component`;
|
|
151
|
-
// prettier-ignore
|
|
152
|
-
generator.pushline(`const ${componentNamespace} = ${componentVariable}`);
|
|
153
|
-
generator.pushline(`${componentNamespace}.${variableName} = ${componentNamespace}.${variableName} || []`);
|
|
154
|
-
generator.push(`${componentNamespace}.${variableName}.push({`);
|
|
155
|
-
generator.indent();
|
|
156
|
-
generator.pushline(`"locale": ${JSON.stringify(localeName)},`);
|
|
157
|
-
generator.push(`"resource": `);
|
|
158
|
-
}
|
|
159
|
-
break;
|
|
160
|
-
case 'ObjectExpression':
|
|
161
|
-
generator.push(`{`);
|
|
162
|
-
generator.indent();
|
|
163
|
-
propsCountStack.push(node.properties.length);
|
|
164
|
-
if (parent != null && parent.type === 'ArrayExpression') {
|
|
165
|
-
const lastIndex = itemsCountStack.length - 1;
|
|
166
|
-
const currentCount = parent.elements.length - itemsCountStack[lastIndex];
|
|
167
|
-
pathStack.push(currentCount.toString());
|
|
168
|
-
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
|
|
169
|
-
}
|
|
170
|
-
break;
|
|
171
|
-
case 'Property':
|
|
172
|
-
if (parent != null && parent.type === 'ObjectExpression') {
|
|
173
|
-
if (node != null) {
|
|
174
|
-
if (isJSONablePrimitiveLiteral(node.value) &&
|
|
175
|
-
(node.key.type === 'Literal' || node.key.type === 'Identifier')) {
|
|
176
|
-
// prettier-ignore
|
|
177
|
-
const name = node.key.type === 'Literal'
|
|
178
|
-
? String(node.key.value)
|
|
179
|
-
: node.key.name;
|
|
180
|
-
if ((node.value.type === 'Literal' &&
|
|
181
|
-
(0, shared_1.isString)(node.value.value)) ||
|
|
182
|
-
node.value.type === 'TemplateLiteral') {
|
|
183
|
-
const value = getValue(node.value);
|
|
184
|
-
generator.push(`${JSON.stringify(name)}: `);
|
|
185
|
-
pathStack.push(name);
|
|
186
|
-
const { code, map } = (0, codegen_1.generateMessageFunction)(value, options, pathStack);
|
|
187
|
-
sourceMap && map != null && codeMaps.set(value, map);
|
|
188
|
-
generator.push(`${code}`, node.value, value);
|
|
189
|
-
skipStack.push(false);
|
|
190
|
-
}
|
|
191
|
-
else {
|
|
192
|
-
const value = getValue(node.value);
|
|
193
|
-
if (forceStringify) {
|
|
194
|
-
const strValue = JSON.stringify(value);
|
|
195
|
-
generator.push(`${JSON.stringify(name)}: `);
|
|
196
|
-
pathStack.push(name);
|
|
197
|
-
const { code, map } = (0, codegen_1.generateMessageFunction)(strValue, options, pathStack);
|
|
198
|
-
sourceMap && map != null && codeMaps.set(strValue, map);
|
|
199
|
-
generator.push(`${code}`, node.value, strValue);
|
|
200
|
-
}
|
|
201
|
-
else {
|
|
202
|
-
generator.push(`${JSON.stringify(name)}: ${JSON.stringify(value)}`);
|
|
203
|
-
pathStack.push(name);
|
|
204
|
-
}
|
|
205
|
-
skipStack.push(false);
|
|
206
|
-
}
|
|
207
|
-
}
|
|
208
|
-
else if ((node.value.type === 'FunctionExpression' ||
|
|
209
|
-
node.value.type === 'ArrowFunctionExpression') &&
|
|
210
|
-
(node.key.type === 'Literal' || node.key.type === 'Identifier')) {
|
|
211
|
-
// prettier-ignore
|
|
212
|
-
const name = node.key.type === 'Literal'
|
|
213
|
-
? String(node.key.value)
|
|
214
|
-
: node.key.name;
|
|
215
|
-
generator.push(`${JSON.stringify(name)}: `);
|
|
216
|
-
pathStack.push(name);
|
|
217
|
-
const code = (0, escodegen_1.generate)(node.value);
|
|
218
|
-
generator.push(`${code}`, node.value, code);
|
|
219
|
-
skipStack.push(false);
|
|
220
|
-
}
|
|
221
|
-
else if ((node.value.type === 'ObjectExpression' ||
|
|
222
|
-
node.value.type === 'ArrayExpression') &&
|
|
223
|
-
(node.key.type === 'Literal' || node.key.type === 'Identifier')) {
|
|
224
|
-
// prettier-ignore
|
|
225
|
-
const name = node.key.type === 'Literal'
|
|
226
|
-
? String(node.key.value)
|
|
227
|
-
: node.key.name;
|
|
228
|
-
generator.push(`${JSON.stringify(name)}: `);
|
|
229
|
-
pathStack.push(name);
|
|
230
|
-
}
|
|
231
|
-
else {
|
|
232
|
-
// for Regex, function, etc.
|
|
233
|
-
skipStack.push(true);
|
|
234
|
-
}
|
|
235
|
-
}
|
|
236
|
-
const lastIndex = propsCountStack.length - 1;
|
|
237
|
-
propsCountStack[lastIndex] = --propsCountStack[lastIndex];
|
|
238
|
-
}
|
|
239
|
-
break;
|
|
240
|
-
case 'ArrayExpression':
|
|
241
|
-
generator.push(`[`);
|
|
242
|
-
generator.indent();
|
|
243
|
-
if (parent != null && parent.type === 'ArrayExpression') {
|
|
244
|
-
const lastIndex = itemsCountStack.length - 1;
|
|
245
|
-
const currentCount = parent.elements.length - itemsCountStack[lastIndex];
|
|
246
|
-
pathStack.push(currentCount.toString());
|
|
247
|
-
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
|
|
248
|
-
}
|
|
249
|
-
itemsCountStack.push(node.elements.length);
|
|
250
|
-
break;
|
|
251
|
-
default:
|
|
252
|
-
if (node != null && parent != null) {
|
|
253
|
-
if (parent.type === 'ArrayExpression') {
|
|
254
|
-
const lastIndex = itemsCountStack.length - 1;
|
|
255
|
-
const currentCount = parent.elements.length - itemsCountStack[lastIndex];
|
|
256
|
-
pathStack.push(currentCount.toString());
|
|
257
|
-
if (isJSONablePrimitiveLiteral(node)) {
|
|
258
|
-
if ((node.type === 'Literal' && (0, shared_1.isString)(node.value)) ||
|
|
259
|
-
node.type === 'TemplateLiteral') {
|
|
260
|
-
const value = getValue(node);
|
|
261
|
-
const { code, map } = (0, codegen_1.generateMessageFunction)(value, options, pathStack);
|
|
262
|
-
sourceMap && map != null && codeMaps.set(value, map);
|
|
263
|
-
generator.push(`${code}`, node, value);
|
|
264
|
-
}
|
|
265
|
-
else {
|
|
266
|
-
const value = getValue(node);
|
|
267
|
-
if (forceStringify) {
|
|
268
|
-
const strValue = JSON.stringify(value);
|
|
269
|
-
const { code, map } = (0, codegen_1.generateMessageFunction)(strValue, options, pathStack);
|
|
270
|
-
sourceMap && map != null && codeMaps.set(strValue, map);
|
|
271
|
-
generator.push(`${code}`, node, strValue);
|
|
272
|
-
}
|
|
273
|
-
else {
|
|
274
|
-
generator.push(`${JSON.stringify(value)}`);
|
|
275
|
-
}
|
|
276
|
-
}
|
|
277
|
-
skipStack.push(false);
|
|
278
|
-
}
|
|
279
|
-
else {
|
|
280
|
-
// for Regex, function, etc.
|
|
281
|
-
skipStack.push(true);
|
|
282
|
-
}
|
|
283
|
-
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
|
|
284
|
-
}
|
|
285
|
-
}
|
|
286
|
-
else {
|
|
287
|
-
// ...
|
|
288
|
-
}
|
|
289
|
-
break;
|
|
290
|
-
}
|
|
291
|
-
},
|
|
292
|
-
/**
|
|
293
|
-
* NOTE:
|
|
294
|
-
* force cast to Node of `estree-walker@3.x`,
|
|
295
|
-
* because `estree-walker@3.x` is not dual packages,
|
|
296
|
-
* so it's support only esm only ...
|
|
297
|
-
*/
|
|
298
|
-
// @ts-ignore
|
|
299
|
-
leave(node, parent) {
|
|
300
|
-
switch (node.type) {
|
|
301
|
-
case 'Program':
|
|
302
|
-
if (type === 'sfc') {
|
|
303
|
-
generator.deindent();
|
|
304
|
-
generator.push(`})`);
|
|
305
|
-
if (bridge && injector) {
|
|
306
|
-
generator.newline();
|
|
307
|
-
generator.pushline(`${componentNamespace}.__i18nBridge = ${componentNamespace}.__i18nBridge || []`);
|
|
308
|
-
generator.pushline(`${componentNamespace}.__i18nBridge.push('${injector()}')`);
|
|
309
|
-
generator.pushline(`delete ${componentNamespace}._Ctor`);
|
|
310
|
-
}
|
|
311
|
-
generator.deindent();
|
|
312
|
-
generator.pushline(`}`);
|
|
313
|
-
}
|
|
314
|
-
else if (type === 'plain') {
|
|
315
|
-
generator.push(`\n`);
|
|
316
|
-
generator.push('export default resource');
|
|
317
|
-
}
|
|
318
|
-
break;
|
|
319
|
-
case 'ObjectExpression':
|
|
320
|
-
if (propsCountStack[propsCountStack.length - 1] === 0) {
|
|
321
|
-
pathStack.pop();
|
|
322
|
-
propsCountStack.pop();
|
|
323
|
-
}
|
|
324
|
-
generator.deindent();
|
|
325
|
-
generator.push(`}`);
|
|
326
|
-
if (parent != null && parent.type === 'ArrayExpression') {
|
|
327
|
-
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
|
|
328
|
-
pathStack.pop();
|
|
329
|
-
generator.pushline(`,`);
|
|
330
|
-
}
|
|
331
|
-
}
|
|
332
|
-
break;
|
|
333
|
-
case 'Property':
|
|
334
|
-
if (parent != null && parent.type === 'ObjectExpression') {
|
|
335
|
-
if (propsCountStack[propsCountStack.length - 1] !== 0) {
|
|
336
|
-
pathStack.pop();
|
|
337
|
-
if (!skipStack.pop()) {
|
|
338
|
-
generator.pushline(`,`);
|
|
339
|
-
}
|
|
340
|
-
}
|
|
341
|
-
}
|
|
342
|
-
break;
|
|
343
|
-
case 'ArrayExpression':
|
|
344
|
-
if (itemsCountStack[itemsCountStack.length - 1] === 0) {
|
|
345
|
-
pathStack.pop();
|
|
346
|
-
itemsCountStack.pop();
|
|
347
|
-
}
|
|
348
|
-
generator.deindent();
|
|
349
|
-
generator.push(`]`);
|
|
350
|
-
if (parent != null && parent.type === 'ArrayExpression') {
|
|
351
|
-
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
|
|
352
|
-
pathStack.pop();
|
|
353
|
-
if (!skipStack.pop()) {
|
|
354
|
-
generator.pushline(`,`);
|
|
355
|
-
}
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
break;
|
|
359
|
-
case 'Literal':
|
|
360
|
-
if (parent != null && parent.type === 'ArrayExpression') {
|
|
361
|
-
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
|
|
362
|
-
pathStack.pop();
|
|
363
|
-
if (!skipStack.pop()) {
|
|
364
|
-
generator.pushline(`,`);
|
|
365
|
-
}
|
|
366
|
-
}
|
|
367
|
-
else {
|
|
368
|
-
if (!skipStack.pop()) {
|
|
369
|
-
generator.pushline(`,`);
|
|
370
|
-
}
|
|
371
|
-
}
|
|
372
|
-
}
|
|
373
|
-
break;
|
|
374
|
-
default:
|
|
375
|
-
break;
|
|
376
|
-
}
|
|
377
|
-
}
|
|
378
|
-
});
|
|
379
|
-
return codeMaps;
|
|
380
|
-
}
|
|
381
|
-
function isJSONablePrimitiveLiteral(node) {
|
|
382
|
-
return ((node.type === 'Literal' &&
|
|
383
|
-
((0, shared_1.isString)(node.value) ||
|
|
384
|
-
(0, shared_1.isNumber)(node.value) ||
|
|
385
|
-
(0, shared_1.isBoolean)(node.value) ||
|
|
386
|
-
node.value === null)) ||
|
|
387
|
-
node.type === 'TemplateLiteral');
|
|
388
|
-
// NOTE: the following code is same the above code
|
|
389
|
-
/*
|
|
390
|
-
if (node.type === 'Literal') {
|
|
391
|
-
if (
|
|
392
|
-
isString(node.value) ||
|
|
393
|
-
isNumber(node.value) ||
|
|
394
|
-
isBoolean(node.value) ||
|
|
395
|
-
node.value === null
|
|
396
|
-
) {
|
|
397
|
-
return true
|
|
398
|
-
} else if (isRegExp(node.value)) {
|
|
399
|
-
return false
|
|
400
|
-
} else {
|
|
401
|
-
return false
|
|
402
|
-
}
|
|
403
|
-
} else if (node.type === 'TemplateLiteral') {
|
|
404
|
-
return true
|
|
405
|
-
} else {
|
|
406
|
-
return false
|
|
407
|
-
}
|
|
408
|
-
*/
|
|
409
|
-
}
|
|
410
|
-
function getValue(node) {
|
|
411
|
-
// prettier-ignore
|
|
412
|
-
return node.type === 'Literal'
|
|
413
|
-
? node.value
|
|
414
|
-
: node.type === 'TemplateLiteral'
|
|
415
|
-
? node.quasis.map(quasi => quasi.value.cooked).join('')
|
|
416
|
-
: undefined;
|
|
417
|
-
}
|
package/lib/json.d.ts
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Code generator for i18n json/json5 resource
|
|
3
|
-
*/
|
|
4
|
-
/// <reference types="node" />
|
|
5
|
-
import type { JSONProgram } from 'jsonc-eslint-parser/lib/parser/ast';
|
|
6
|
-
import type { CodeGenOptions, CodeGenResult } from './codegen';
|
|
7
|
-
/**
|
|
8
|
-
* @internal
|
|
9
|
-
*/
|
|
10
|
-
export declare function generate(targetSource: string | Buffer, { type, legacy, bridge, exportESM, filename, inSourceMap, locale, isGlobal, sourceMap, env, forceStringify, onError, strictMessage, escapeHtml, useClassComponent }: CodeGenOptions, injector?: () => string): CodeGenResult<JSONProgram>;
|