zhang-wei-jian's picture
:rocket:
7d73cf2
"use strict";
/**
* Code generator for i18n yaml resource
*/
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.generate = void 0;
const shared_1 = require("@intlify/shared");
const codegen_1 = require("./codegen");
const yaml_eslint_parser_1 = require("yaml-eslint-parser");
const legacy_1 = require("./legacy");
const magic_string_1 = __importDefault(require("magic-string"));
/**
* @internal
*/
function generate(targetSource, { type = 'plain', legacy = false, bridge = false, exportESM = false, useClassComponent = false, filename = 'vue-i18n-loader.yaml', inSourceMap = undefined, locale = '', isGlobal = false, sourceMap = false, env = 'development', forceStringify = false, onError = undefined, strictMessage = true, escapeHtml = false }, injector) {
const value = Buffer.isBuffer(targetSource)
? targetSource.toString()
: targetSource;
const options = {
type,
bridge,
exportESM,
source: value,
sourceMap,
locale,
isGlobal,
inSourceMap,
env,
filename,
forceStringify,
onError,
strictMessage,
escapeHtml,
useClassComponent
};
const generator = (0, codegen_1.createCodeGenerator)(options);
const ast = (0, yaml_eslint_parser_1.parseYAML)(value, { filePath: filename });
// for vue 2.x
if (legacy && type === 'sfc') {
const gen = () => (0, shared_1.friendlyJSONstringify)((0, yaml_eslint_parser_1.getStaticYAMLValue)(ast));
const code = (0, legacy_1.generateLegacyCode)(options, gen);
const s = new magic_string_1.default(code);
return {
ast,
code: s.toString(),
map: s.generateMap({
file: filename,
source: value,
includeContent: true
})
};
}
const codeMaps = generateNode(generator, ast, options, injector);
const { code, map } = generator.context();
// prettier-ignore
const newMap = map
? (0, codegen_1.mapLinesColumns)(map.toJSON(), codeMaps, inSourceMap) || null // eslint-disable-line @typescript-eslint/no-explicit-any
: null;
return {
ast,
code,
map: newMap != null ? newMap : undefined
};
}
exports.generate = generate;
function generateNode(generator, node, options, injector) {
const propsCountStack = [];
const pathStack = [];
const itemsCountStack = [];
const { forceStringify } = generator.context();
const codeMaps = new Map();
const { type, bridge, exportESM, sourceMap, isGlobal, locale, useClassComponent } = options;
const componentNamespace = '_Component';
(0, yaml_eslint_parser_1.traverseNodes)(node, {
enterNode(node, parent) {
switch (node.type) {
case 'Program':
if (type === 'plain') {
generator.push(`const resource = `);
}
else if (type === 'sfc') {
const variableName = type === 'sfc' ? (!isGlobal ? '__i18n' : '__i18nGlobal') : '';
const localeName = type === 'sfc' ? (locale != null ? locale : `""`) : '';
const exportSyntax = bridge
? exportESM
? `export default`
: `module.exports =`
: `export default`;
generator.push(`${exportSyntax} function (Component) {`);
generator.indent();
// prettier-ignore
const componentVariable = bridge
? `Component.options || Component`
: useClassComponent
? `Component.__o || Component`
: `Component`;
// prettier-ignore
generator.pushline(`const ${componentNamespace} = ${componentVariable}`);
generator.pushline(`${componentNamespace}.${variableName} = ${componentNamespace}.${variableName} || []`);
generator.push(`${componentNamespace}.${variableName}.push({`);
generator.indent();
generator.pushline(`"locale": ${JSON.stringify(localeName)},`);
generator.push(`"resource": `);
}
break;
case 'YAMLMapping':
generator.push(`{`);
generator.indent();
propsCountStack.push(node.pairs.length);
if (parent.type === 'YAMLSequence') {
const lastIndex = itemsCountStack.length - 1;
const currentCount = parent.entries.length - itemsCountStack[lastIndex];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
}
break;
case 'YAMLPair':
if (node.value &&
node.value.type === 'YAMLScalar' &&
node.key &&
node.key.type === 'YAMLScalar') {
const name = node.key.value;
const value = node.value.value;
if ((0, shared_1.isString)(value)) {
generator.push(`${JSON.stringify(name)}: `);
name && pathStack.push(name.toString());
const { code, map } = (0, codegen_1.generateMessageFunction)(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node.value, value);
}
else {
if (forceStringify) {
const strValue = JSON.stringify(value);
generator.push(`${JSON.stringify(name)}: `);
name && pathStack.push(name.toString());
const { code, map } = (0, codegen_1.generateMessageFunction)(strValue, options, pathStack);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node.value, strValue);
}
else {
generator.push(`${JSON.stringify(name)}: ${JSON.stringify(value)}`);
name && pathStack.push(name.toString());
}
}
}
else if (node.value &&
(node.value.type === 'YAMLMapping' ||
node.value.type === 'YAMLSequence') &&
node.key &&
node.key.type === 'YAMLScalar') {
const name = node.key.value;
generator.push(`${JSON.stringify(name)}: `);
name && pathStack.push(name.toString());
}
const lastIndex = propsCountStack.length - 1;
propsCountStack[lastIndex] = --propsCountStack[lastIndex];
break;
case 'YAMLSequence':
generator.push(`[`);
generator.indent();
if (parent.type === 'YAMLSequence') {
const lastIndex = itemsCountStack.length - 1;
const currentCount = parent.entries.length - itemsCountStack[lastIndex];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
}
itemsCountStack.push(node.entries.length);
break;
case 'YAMLScalar':
if (parent.type === 'YAMLSequence') {
const lastIndex = itemsCountStack.length - 1;
const currentCount = parent.entries.length - itemsCountStack[lastIndex];
pathStack.push(currentCount.toString());
if (node.type === 'YAMLScalar') {
const value = node.value;
if ((0, shared_1.isString)(value)) {
const { code, map } = (0, codegen_1.generateMessageFunction)(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node, value);
}
else {
if (forceStringify) {
const strValue = JSON.stringify(value);
const { code, map } = (0, codegen_1.generateMessageFunction)(strValue, options, pathStack);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node, strValue);
}
else {
generator.push(`${JSON.stringify(value)}`);
}
}
}
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
}
break;
default:
break;
}
},
leaveNode(node, parent) {
switch (node.type) {
case 'Program':
if (type === 'sfc') {
generator.deindent();
generator.push(`})`);
if (bridge && injector) {
generator.newline();
generator.pushline(`${componentNamespace}.__i18nBridge = ${componentNamespace}.__i18nBridge || []`);
generator.pushline(`${componentNamespace}.__i18nBridge.push('${injector()}')`);
generator.pushline(`delete ${componentNamespace}._Ctor`);
}
generator.deindent();
generator.push(`}`);
}
else if (type === 'plain') {
generator.push(`\n`);
generator.push('export default resource');
}
break;
case 'YAMLMapping':
if (propsCountStack[propsCountStack.length - 1] === 0) {
pathStack.pop();
propsCountStack.pop();
}
generator.deindent();
generator.push(`}`);
if (parent.type === 'YAMLSequence') {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
}
break;
case 'YAMLPair':
if (propsCountStack[propsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
break;
case 'YAMLSequence':
if (itemsCountStack[itemsCountStack.length - 1] === 0) {
pathStack.pop();
itemsCountStack.pop();
}
generator.deindent();
generator.push(`]`);
if (parent.type === 'YAMLSequence') {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
}
break;
case 'YAMLScalar':
if (parent.type === 'YAMLSequence') {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
else {
generator.pushline(`,`);
}
}
break;
default:
break;
}
}
});
return codeMaps;
}