"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; }