2025-09-05 14:59:21 +08:00

1255 lines
44 KiB
JavaScript

'use strict';
const jsoncEslintParser = require('jsonc-eslint-parser');
const shared = require('@intlify/shared');
const sourceMapJs = require('source-map-js');
const messageCompiler = require('@intlify/message-compiler');
const MagicString = require('magic-string');
const yamlEslintParser = require('yaml-eslint-parser');
const acorn = require('acorn');
const escodegen = require('escodegen');
const estreeWalker = require('estree-walker');
const module$1 = require('node:module');
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e.default : e; }
const MagicString__default = /*#__PURE__*/_interopDefaultCompat(MagicString);
const module__default = /*#__PURE__*/_interopDefaultCompat(module$1);
function createCodeGenerator(options = {
filename: "bundle.json",
sourceMap: false,
env: "development",
forceStringify: false
}) {
const { sourceMap, source, filename } = options;
const _context = Object.assign(
{
code: "",
column: 1,
line: 1,
offset: 0,
map: void 0,
indentLevel: 0
},
options
);
const context = () => _context;
function push(code, node, name) {
_context.code += code;
if (_context.map && node) {
if (node.loc && node.loc !== messageCompiler.LOCATION_STUB) {
addMapping(node.loc.start, name);
}
advancePositionWithSource(_context, code);
}
}
function _newline(n) {
push("\n" + ` `.repeat(n));
}
function indent(withNewLine = true) {
const level = ++_context.indentLevel;
withNewLine && _newline(level);
}
function deindent(withNewLine = true) {
const level = --_context.indentLevel;
withNewLine && _newline(level);
}
function newline() {
_newline(_context.indentLevel);
}
function pushline(code, node, name) {
push(code, node, name);
newline();
}
function addMapping(loc, name) {
_context.map.addMapping({
name,
source: _context.filename,
original: {
line: loc.line,
column: loc.column - 1
},
generated: {
line: _context.line,
column: _context.column - 1
}
});
}
if (sourceMap && source) {
_context.map = new sourceMapJs.SourceMapGenerator();
_context.map.setSourceContent(filename, source);
}
return {
context,
push,
indent,
deindent,
newline,
pushline
};
}
function advancePositionWithSource(pos, source, numberOfCharacters = source.length) {
if (pos.offset == null) {
return pos;
}
let linesCount = 0;
let lastNewLinePos = -1;
for (let i = 0; i < numberOfCharacters; i++) {
if (source.charCodeAt(i) === 10) {
linesCount++;
lastNewLinePos = i;
}
}
pos.offset += numberOfCharacters;
pos.line += linesCount;
pos.column = lastNewLinePos === -1 ? pos.column + numberOfCharacters : numberOfCharacters - lastNewLinePos;
return pos;
}
const DETECT_MESSAGE = `Detected HTML in '{msg}' message.`;
const ON_ERROR_NOOP = () => {
};
function parsePath(path) {
return path ? path.join(".") : "";
}
function generateMessageFunction(msg, options = {}, path) {
const env = options.env != null ? options.env : "development";
const strictMessage = shared.isBoolean(options.strictMessage) ? options.strictMessage : true;
const escapeHtml = !!options.escapeHtml;
const onError = options.onError || ON_ERROR_NOOP;
const errors = [];
let detecteHtmlInMsg = false;
if (messageCompiler.detectHtmlTag(msg)) {
detecteHtmlInMsg = true;
if (strictMessage) {
const errMsg = shared.format(DETECT_MESSAGE, { msg });
onError(shared.format(errMsg), {
source: msg,
path: parsePath(path)
});
}
}
const _msg = detecteHtmlInMsg && escapeHtml ? shared.escapeHtml(msg) : msg;
const newOptions = Object.assign({ mode: "arrow" }, options);
newOptions.onError = (err) => {
if (onError) {
const extra = {
source: msg,
path: parsePath(path),
code: err.code,
domain: err.domain,
location: err.location
};
onError(err.message, extra);
errors.push(err);
}
};
const { code, ast, map } = messageCompiler.baseCompile(_msg, newOptions);
const occured = errors.length > 0;
const genCode = !occured ? env === "development" ? `(()=>{const fn=${code};fn.source=${JSON.stringify(msg)};return fn;})()` : `${code}` : `\`${_msg}\``;
return { code: genCode, ast, map, errors };
}
function mapLinesColumns(resMap, codeMaps, inSourceMap) {
if (!resMap) {
return null;
}
const resMapConsumer = new sourceMapJs.SourceMapConsumer(resMap);
const inMapConsumer = inSourceMap ? new sourceMapJs.SourceMapConsumer(inSourceMap) : null;
const mergedMapGenerator = new sourceMapJs.SourceMapGenerator();
let inMapFirstItem = null;
if (inMapConsumer) {
inMapConsumer.eachMapping((m) => {
if (inMapFirstItem) {
return;
}
inMapFirstItem = m;
});
}
resMapConsumer.eachMapping((res) => {
if (res.originalLine == null) {
return;
}
const map = codeMaps.get(res.name);
if (!map) {
return;
}
let inMapOrigin = null;
if (inMapConsumer) {
inMapOrigin = inMapConsumer.originalPositionFor({
line: res.originalLine,
column: res.originalColumn - 1
});
if (inMapOrigin.source == null) {
inMapOrigin = null;
return;
}
}
const mapConsumer = new sourceMapJs.SourceMapConsumer(map);
mapConsumer.eachMapping((m) => {
mergedMapGenerator.addMapping({
original: {
line: inMapFirstItem ? inMapFirstItem.originalLine + res.originalLine - 2 : res.originalLine,
column: inMapFirstItem ? inMapFirstItem.originalColumn + res.originalColumn : res.originalColumn
},
generated: {
line: inMapFirstItem ? inMapFirstItem.generatedLine + res.originalLine - 2 : res.originalLine,
// map column with message format compilation code map
column: inMapFirstItem ? inMapFirstItem.generatedColumn + res.originalColumn + m.generatedColumn : res.originalColumn + m.generatedColumn
},
source: inMapOrigin ? inMapOrigin.source : res.source,
name: m.name
// message format compilation code
});
});
});
const generator = mergedMapGenerator;
const targetConsumer = inMapConsumer || resMapConsumer;
targetConsumer.sources.forEach((sourceFile) => {
generator._sources.add(sourceFile);
const sourceContent = targetConsumer.sourceContentFor(sourceFile);
if (sourceContent != null) {
mergedMapGenerator.setSourceContent(sourceFile, sourceContent);
}
});
generator._sourceRoot = inSourceMap ? inSourceMap.sourceRoot : resMap.sourceRoot;
generator._file = inSourceMap ? inSourceMap.file : resMap.file;
return generator.toJSON();
}
function generateResourceAst(msg, options = {}, path) {
const env = options.env != null ? options.env : "development";
const strictMessage = shared.isBoolean(options.strictMessage) ? options.strictMessage : true;
const escapeHtml = !!options.escapeHtml;
const onError = options.onError || ON_ERROR_NOOP;
const errors = [];
let detecteHtmlInMsg = false;
if (messageCompiler.detectHtmlTag(msg)) {
detecteHtmlInMsg = true;
if (strictMessage) {
const errMsg = shared.format(DETECT_MESSAGE, { msg });
onError(shared.format(errMsg), {
source: msg,
path: parsePath(path)
});
}
}
const _msg = detecteHtmlInMsg && escapeHtml ? shared.escapeHtml(msg) : msg;
const newOptions = Object.assign(
{
location: env === "development",
minify: shared.isBoolean(options.minify) ? options.minify : env === "production"
},
options
);
if (newOptions.jit != null) {
newOptions.jit = true;
}
newOptions.onError = (err) => {
if (onError) {
const extra = {
source: msg,
path: parsePath(path),
code: err.code,
domain: err.domain,
location: err.location
};
onError(err.message, extra);
errors.push(err);
}
};
const { ast, map } = messageCompiler.baseCompile(_msg, newOptions);
const occured = errors.length > 0;
const code = !occured ? `${shared.friendlyJSONstringify(ast)}` : `\`${_msg}\``;
return { code, ast, map, errors };
}
function excludeLocales({
messages,
onlyLocales
}) {
const _messages = { ...messages };
Object.keys(_messages).forEach((locale) => {
if (!onlyLocales.includes(locale)) {
delete _messages[locale];
}
});
return _messages;
}
function generateLegacyCode({
isGlobal = false,
vueVersion = "v2.6"
}, generator) {
const componentNamespace = `Component${vueVersion === "v2.6" ? ".options" : ""}`;
const variableName = !isGlobal ? "__i18n" : "__i18nGlobal";
const exportSyntax = "export default";
const code = `${exportSyntax} function (Component) {
${componentNamespace}.${variableName} = ${componentNamespace}.${variableName} || []
${componentNamespace}.${variableName}.push(${shared.friendlyJSONstringify(
generator()
)})
delete ${componentNamespace}._Ctor
}`;
return code;
}
function generate$2(targetSource, {
type = "plain",
legacy = false,
vueVersion = "v2.6",
bridge = false,
onlyLocales = [],
exportESM = false,
filename = "vue-i18n-loader.json",
inSourceMap = void 0,
locale = "",
isGlobal = false,
sourceMap = false,
env = "development",
forceStringify = false,
onError = void 0,
strictMessage = true,
escapeHtml = false,
useClassComponent = false,
jit = false
}, injector) {
let 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,
jit
};
const generator = createCodeGenerator(options);
let ast = jsoncEslintParser.parseJSON(value, { filePath: filename });
if (!locale && type === "sfc" && onlyLocales?.length) {
const messages = jsoncEslintParser.getStaticJSONValue(ast);
value = JSON.stringify(
excludeLocales({
messages,
onlyLocales
})
);
ast = jsoncEslintParser.parseJSON(value, { filePath: filename });
}
if (legacy && type === "sfc") {
const gen = () => shared.friendlyJSONstringify(jsoncEslintParser.getStaticJSONValue(ast));
const code2 = generateLegacyCode({ isGlobal, vueVersion }, gen);
const s = new MagicString__default(code2);
return {
ast,
code: s.toString(),
map: s.generateMap({
file: filename,
source: value,
includeContent: true
})
};
}
const codeMaps = _generate$2(generator, ast, options, injector);
const { code, map } = generator.context();
const newMap = map && !jit ? mapLinesColumns(map.toJSON(), codeMaps, inSourceMap) || null : null;
return {
ast,
code,
map: newMap != null ? newMap : void 0
};
}
function _generate$2(generator, node, options = {}, injector) {
const propsCountStack = [];
const pathStack = [];
const itemsCountStack = [];
const { forceStringify } = generator.context();
const codeMaps = /* @__PURE__ */ new Map();
const {
type,
bridge,
exportESM,
sourceMap,
isGlobal,
locale,
useClassComponent,
jit
} = options;
const codegenFn = jit ? generateResourceAst : generateMessageFunction;
const componentNamespace = "_Component";
jsoncEslintParser.traverseNodes(node, {
enterNode(node2, parent) {
switch (node2.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();
const componentVariable = bridge ? `Component.options || Component` : useClassComponent ? `Component.__o || Component.__vccOpts || Component` : `Component`;
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 "JSONObjectExpression":
generator.push(`{`);
generator.indent();
propsCountStack.push(node2.properties.length);
if (parent.type === "JSONArrayExpression") {
const lastIndex2 = itemsCountStack.length - 1;
const currentCount = parent.elements.length - itemsCountStack[lastIndex2];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex2] = --itemsCountStack[lastIndex2];
}
break;
case "JSONProperty":
if (node2.value.type === "JSONLiteral" && (node2.key.type === "JSONLiteral" || node2.key.type === "JSONIdentifier")) {
const name = node2.key.type === "JSONLiteral" ? node2.key.value : node2.key.name;
const value = node2.value.value;
if (shared.isString(value)) {
generator.push(`${JSON.stringify(name)}: `);
pathStack.push(name.toString());
const { code, map } = codegenFn(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node2.value, value);
} else {
if (forceStringify) {
const strValue = JSON.stringify(value);
generator.push(`${JSON.stringify(name)}: `);
pathStack.push(name.toString());
const { code, map } = codegenFn(strValue, options, pathStack);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node2.value, strValue);
} else {
generator.push(
`${JSON.stringify(name)}: ${JSON.stringify(value)}`
);
pathStack.push(name.toString());
}
}
} else if ((node2.value.type === "JSONObjectExpression" || node2.value.type === "JSONArrayExpression") && (node2.key.type === "JSONLiteral" || node2.key.type === "JSONIdentifier")) {
const name = node2.key.type === "JSONLiteral" ? node2.key.value : node2.key.name;
generator.push(`${JSON.stringify(name)}: `);
pathStack.push(name.toString());
}
const lastIndex = propsCountStack.length - 1;
propsCountStack[lastIndex] = --propsCountStack[lastIndex];
break;
case "JSONArrayExpression":
generator.push(`[`);
generator.indent();
if (parent.type === "JSONArrayExpression") {
const lastIndex2 = itemsCountStack.length - 1;
const currentCount = parent.elements.length - itemsCountStack[lastIndex2];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex2] = --itemsCountStack[lastIndex2];
}
itemsCountStack.push(node2.elements.length);
break;
case "JSONLiteral":
if (parent.type === "JSONArrayExpression") {
const lastIndex2 = itemsCountStack.length - 1;
const currentCount = parent.elements.length - itemsCountStack[lastIndex2];
pathStack.push(currentCount.toString());
if (node2.type === "JSONLiteral") {
const value = node2.value;
if (shared.isString(value)) {
const { code, map } = codegenFn(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node2, value);
} else {
if (forceStringify) {
const strValue = JSON.stringify(value);
const { code, map } = codegenFn(strValue, options, pathStack);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node2, strValue);
} else {
generator.push(`${JSON.stringify(value)}`);
}
}
}
itemsCountStack[lastIndex2] = --itemsCountStack[lastIndex2];
}
break;
}
},
leaveNode(node2, parent) {
switch (node2.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.pushline(`}`);
} else if (type === "plain") {
generator.push(`
`);
generator.push("export default resource");
}
break;
case "JSONObjectExpression":
if (propsCountStack[propsCountStack.length - 1] === 0) {
pathStack.pop();
propsCountStack.pop();
}
generator.deindent();
generator.push(`}`);
if (parent.type === "JSONArrayExpression") {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
}
break;
case "JSONProperty":
if (propsCountStack[propsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
break;
case "JSONArrayExpression":
if (itemsCountStack[itemsCountStack.length - 1] === 0) {
pathStack.pop();
itemsCountStack.pop();
}
generator.deindent();
generator.push(`]`);
if (parent.type === "JSONArrayExpression") {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
}
break;
case "JSONLiteral":
if (parent.type === "JSONArrayExpression") {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
} else {
generator.pushline(`,`);
}
}
break;
}
}
});
return codeMaps;
}
function generate$1(targetSource, {
type = "plain",
legacy = false,
vueVersion = "v2.6",
bridge = false,
onlyLocales = [],
exportESM = false,
useClassComponent = false,
filename = "vue-i18n-loader.yaml",
inSourceMap = void 0,
locale = "",
isGlobal = false,
sourceMap = false,
env = "development",
forceStringify = false,
onError = void 0,
strictMessage = true,
escapeHtml = false,
jit = false
}, injector) {
let 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,
jit
};
const generator = createCodeGenerator(options);
let ast = yamlEslintParser.parseYAML(value, { filePath: filename });
if (!locale && type === "sfc" && onlyLocales?.length) {
const messages = yamlEslintParser.getStaticYAMLValue(ast);
value = JSON.stringify(
excludeLocales({
messages,
onlyLocales
})
);
ast = yamlEslintParser.parseYAML(value, { filePath: filename });
}
if (legacy && type === "sfc") {
const gen = () => shared.friendlyJSONstringify(yamlEslintParser.getStaticYAMLValue(ast));
const code2 = generateLegacyCode({ isGlobal, vueVersion }, gen);
const s = new MagicString__default(code2);
return {
ast,
code: s.toString(),
map: s.generateMap({
file: filename,
source: value,
includeContent: true
})
};
}
const codeMaps = _generate$1(generator, ast, options, injector);
const { code, map } = generator.context();
const newMap = map ? mapLinesColumns(map.toJSON(), codeMaps, inSourceMap) || null : null;
return {
ast,
code,
map: newMap != null ? newMap : void 0
};
}
function _generate$1(generator, node, options = {}, injector) {
const propsCountStack = [];
const pathStack = [];
const itemsCountStack = [];
const { forceStringify } = generator.context();
const codeMaps = /* @__PURE__ */ new Map();
const {
type,
bridge,
exportESM,
sourceMap,
isGlobal,
locale,
useClassComponent,
jit
} = options;
const codegenFn = jit ? generateResourceAst : generateMessageFunction;
const componentNamespace = "_Component";
yamlEslintParser.traverseNodes(node, {
enterNode(node2, parent) {
switch (node2.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();
const componentVariable = bridge ? `Component.options || Component` : useClassComponent ? `Component.__o || Component.__vccOpts || Component` : `Component`;
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(node2.pairs.length);
if (parent.type === "YAMLSequence") {
const lastIndex2 = itemsCountStack.length - 1;
const currentCount = parent.entries.length - itemsCountStack[lastIndex2];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex2] = --itemsCountStack[lastIndex2];
}
break;
case "YAMLPair":
if (node2.value && node2.value.type === "YAMLScalar" && node2.key && node2.key.type === "YAMLScalar") {
const name = node2.key.value;
const value = node2.value.value;
if (shared.isString(value)) {
generator.push(`${JSON.stringify(name)}: `);
name && pathStack.push(name.toString());
const { code, map } = codegenFn(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node2.value, value);
} else {
if (forceStringify) {
const strValue = JSON.stringify(value);
generator.push(`${JSON.stringify(name)}: `);
name && pathStack.push(name.toString());
const { code, map } = codegenFn(strValue, options, pathStack);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node2.value, strValue);
} else {
generator.push(
`${JSON.stringify(name)}: ${JSON.stringify(value)}`
);
name && pathStack.push(name.toString());
}
}
} else if (node2.value && (node2.value.type === "YAMLMapping" || node2.value.type === "YAMLSequence") && node2.key && node2.key.type === "YAMLScalar") {
const name = node2.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 lastIndex2 = itemsCountStack.length - 1;
const currentCount = parent.entries.length - itemsCountStack[lastIndex2];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex2] = --itemsCountStack[lastIndex2];
}
itemsCountStack.push(node2.entries.length);
break;
case "YAMLScalar":
if (parent.type === "YAMLSequence") {
const lastIndex2 = itemsCountStack.length - 1;
const currentCount = parent.entries.length - itemsCountStack[lastIndex2];
pathStack.push(currentCount.toString());
if (node2.type === "YAMLScalar") {
const value = node2.value;
if (shared.isString(value)) {
const { code, map } = codegenFn(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node2, value);
} else {
if (forceStringify) {
const strValue = JSON.stringify(value);
const { code, map } = codegenFn(strValue, options, pathStack);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node2, strValue);
} else {
generator.push(`${JSON.stringify(value)}`);
}
}
}
itemsCountStack[lastIndex2] = --itemsCountStack[lastIndex2];
}
break;
}
},
leaveNode(node2, parent) {
switch (node2.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(`
`);
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;
}
}
});
return codeMaps;
}
function generate(targetSource, {
type = "plain",
bridge = false,
exportESM = false,
filename = "vue-i18n-loader.js",
inSourceMap = void 0,
locale = "",
isGlobal = false,
sourceMap = false,
env = "development",
forceStringify = false,
onError = void 0,
strictMessage = true,
escapeHtml = false,
useClassComponent = false,
allowDynamic = false,
jit = false
}, injector) {
const target = Buffer.isBuffer(targetSource) ? targetSource.toString() : targetSource;
const value = target;
const options = {
type,
bridge,
exportESM,
source: value,
sourceMap,
locale,
isGlobal,
inSourceMap,
env,
filename,
forceStringify,
onError,
strictMessage,
escapeHtml,
useClassComponent,
jit
};
const generator = createCodeGenerator(options);
const ast = acorn.parse(value, {
ecmaVersion: "latest",
sourceType: "module",
sourceFile: filename,
allowImportExportEverywhere: true
});
const exportResult = scanAst(ast);
if (!allowDynamic) {
if (!exportResult || exportResult !== "object") {
throw new Error(
`You need to define an object as the locale message with 'export default'.`
);
}
} else {
if (!exportResult) {
throw new Error(
`You need to define 'export default' that will return the locale messages.`
);
}
if (exportResult !== "object") {
return {
ast,
code: value,
map: inSourceMap
};
}
}
const codeMaps = _generate(generator, ast, options, injector);
const { code, map } = generator.context();
const newMap = map ? mapLinesColumns(map.toJSON(), codeMaps, inSourceMap) || null : null;
return {
ast,
code,
map: newMap != null ? newMap : void 0
};
}
function scanAst(ast) {
if (ast.type !== "Program") {
throw new Error("Invalid AST: does not have Program node");
}
let ret = false;
for (const node of ast.body) {
if (node.type === "ExportDefaultDeclaration") {
if (node.declaration.type === "ObjectExpression") {
ret = "object";
break;
} else if (node.declaration.type === "FunctionDeclaration") {
ret = "function";
break;
} else if (node.declaration.type === "ArrowFunctionExpression") {
ret = "arrow-function";
break;
}
}
}
return ret;
}
function _generate(generator, node, options = {}, injector) {
const propsCountStack = [];
const pathStack = [];
const itemsCountStack = [];
const skipStack = [];
const { forceStringify } = generator.context();
const codeMaps = /* @__PURE__ */ new Map();
const {
type,
bridge,
exportESM,
sourceMap,
isGlobal,
locale,
useClassComponent,
jit
} = options;
const codegenFn = jit ? generateResourceAst : generateMessageFunction;
const componentNamespace = "_Component";
estreeWalker.walk(node, {
/**
* NOTE:
* force cast to Node of `estree-walker@3.x`,
* because `estree-walker@3.x` is not dual packages,
* so it's support only esm only ...
*/
// @ts-ignore
enter(node2, parent) {
switch (node2.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();
const componentVariable = bridge ? `Component.options || Component` : useClassComponent ? `Component.__o || Component.__vccOpts || Component` : `Component`;
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 "ObjectExpression":
generator.push(`{`);
generator.indent();
propsCountStack.push(node2.properties.length);
if (parent != null && parent.type === "ArrayExpression") {
const lastIndex = itemsCountStack.length - 1;
const currentCount = parent.elements.length - itemsCountStack[lastIndex];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
}
break;
case "Property":
if (parent != null && parent.type === "ObjectExpression") {
if (node2 != null) {
if (isJSONablePrimitiveLiteral(node2.value) && (node2.key.type === "Literal" || node2.key.type === "Identifier")) {
const name = node2.key.type === "Literal" ? String(node2.key.value) : node2.key.name;
if (node2.value.type === "Literal" && shared.isString(node2.value.value) || node2.value.type === "TemplateLiteral") {
const value = getValue(node2.value);
generator.push(`${JSON.stringify(name)}: `);
pathStack.push(name);
const { code, map } = codegenFn(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node2.value, value);
skipStack.push(false);
} else {
const value = getValue(node2.value);
if (forceStringify) {
const strValue = JSON.stringify(value);
generator.push(`${JSON.stringify(name)}: `);
pathStack.push(name);
const { code, map } = codegenFn(
strValue,
options,
pathStack
);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node2.value, strValue);
} else {
generator.push(
`${JSON.stringify(name)}: ${JSON.stringify(value)}`
);
pathStack.push(name);
}
skipStack.push(false);
}
} else if ((node2.value.type === "FunctionExpression" || node2.value.type === "ArrowFunctionExpression") && (node2.key.type === "Literal" || node2.key.type === "Identifier")) {
const name = node2.key.type === "Literal" ? String(node2.key.value) : node2.key.name;
generator.push(`${JSON.stringify(name)}: `);
pathStack.push(name);
const code = escodegen.generate(node2.value);
generator.push(`${code}`, node2.value, code);
skipStack.push(false);
} else if ((node2.value.type === "ObjectExpression" || node2.value.type === "ArrayExpression") && (node2.key.type === "Literal" || node2.key.type === "Identifier")) {
const name = node2.key.type === "Literal" ? String(node2.key.value) : node2.key.name;
generator.push(`${JSON.stringify(name)}: `);
pathStack.push(name);
} else {
skipStack.push(true);
}
}
const lastIndex = propsCountStack.length - 1;
propsCountStack[lastIndex] = --propsCountStack[lastIndex];
}
break;
case "ArrayExpression":
generator.push(`[`);
generator.indent();
if (parent != null && parent.type === "ArrayExpression") {
const lastIndex = itemsCountStack.length - 1;
const currentCount = parent.elements.length - itemsCountStack[lastIndex];
pathStack.push(currentCount.toString());
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
}
itemsCountStack.push(node2.elements.length);
break;
default:
if (node2 != null && parent != null) {
if (parent.type === "ArrayExpression") {
const lastIndex = itemsCountStack.length - 1;
const currentCount = parent.elements.length - itemsCountStack[lastIndex];
pathStack.push(currentCount.toString());
if (isJSONablePrimitiveLiteral(node2)) {
if (node2.type === "Literal" && shared.isString(node2.value) || node2.type === "TemplateLiteral") {
const value = getValue(node2);
const { code, map } = codegenFn(value, options, pathStack);
sourceMap && map != null && codeMaps.set(value, map);
generator.push(`${code}`, node2, value);
} else {
const value = getValue(node2);
if (forceStringify) {
const strValue = JSON.stringify(value);
const { code, map } = codegenFn(
strValue,
options,
pathStack
);
sourceMap && map != null && codeMaps.set(strValue, map);
generator.push(`${code}`, node2, strValue);
} else {
generator.push(`${JSON.stringify(value)}`);
}
}
skipStack.push(false);
} else {
skipStack.push(true);
}
itemsCountStack[lastIndex] = --itemsCountStack[lastIndex];
}
}
break;
}
},
/**
* NOTE:
* force cast to Node of `estree-walker@3.x`,
* because `estree-walker@3.x` is not dual packages,
* so it's support only esm only ...
*/
// @ts-ignore
leave(node2, parent) {
switch (node2.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.pushline(`}`);
} else if (type === "plain") {
generator.push(`
`);
generator.push("export default resource");
}
break;
case "ObjectExpression":
if (propsCountStack[propsCountStack.length - 1] === 0) {
pathStack.pop();
propsCountStack.pop();
}
generator.deindent();
generator.push(`}`);
if (parent != null && parent.type === "ArrayExpression") {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
generator.pushline(`,`);
}
}
break;
case "Property":
if (parent != null && parent.type === "ObjectExpression") {
if (propsCountStack[propsCountStack.length - 1] !== 0) {
pathStack.pop();
if (!skipStack.pop()) {
generator.pushline(`,`);
}
}
}
break;
case "ArrayExpression":
if (itemsCountStack[itemsCountStack.length - 1] === 0) {
pathStack.pop();
itemsCountStack.pop();
}
generator.deindent();
generator.push(`]`);
if (parent != null && parent.type === "ArrayExpression") {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
if (!skipStack.pop()) {
generator.pushline(`,`);
}
}
}
break;
case "Literal":
if (parent != null && parent.type === "ArrayExpression") {
if (itemsCountStack[itemsCountStack.length - 1] !== 0) {
pathStack.pop();
if (!skipStack.pop()) {
generator.pushline(`,`);
}
} else {
if (!skipStack.pop()) {
generator.pushline(`,`);
}
}
}
break;
}
}
});
return codeMaps;
}
function isJSONablePrimitiveLiteral(node) {
return node.type === "Literal" && (shared.isString(node.value) || shared.isNumber(node.value) || shared.isBoolean(node.value) || node.value === null) || node.type === "TemplateLiteral";
}
function getValue(node) {
return node.type === "Literal" ? node.value : node.type === "TemplateLiteral" ? node.quasis.map((quasi) => quasi.value.cooked).join("") : void 0;
}
const _require = module__default.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
function checkInstallPackage(pkg, debug) {
let installedVueI18n = false;
try {
debug(`vue-i18n load path: ${_require.resolve("vue-i18n")}`);
installedVueI18n = true;
} catch (e) {
debug(`cannot find 'vue-i18n'`, e);
}
let installedPetiteVueI18n = false;
try {
debug(`petite-vue-i18n load path: ${_require.resolve("petite-vue-i18n")}`);
installedPetiteVueI18n = true;
} catch (e) {
debug(`cannot find 'petite-vue-i18n'`, e);
}
if (installedVueI18n) {
return "vue-i18n";
}
if (installedPetiteVueI18n) {
return "petite-vue-i18n";
}
throw new Error(
`${pkg} requires 'vue-i18n' or 'petite-vue-i18n' to be present in the dependency tree.`
);
}
function checkVueI18nBridgeInstallPackage(debug) {
let ret = false;
try {
debug(`vue-i18n-bridge load path: ${_require.resolve("vue-i18n-bridge")}`);
ret = true;
} catch (e) {
debug(`cannot find 'vue-i18n-bridge'`, e);
}
return ret;
}
function getVueI18nVersion(debug) {
const VueI18n = loadModule("vue-i18n", debug);
if (VueI18n == null) {
return "";
}
if (VueI18n.version && VueI18n.version.startsWith("8.")) {
return "8";
}
if (VueI18n.VERSION && VueI18n.VERSION.startsWith("9.")) {
return "9";
}
return "unknown";
}
function loadModule(moduleName, debug) {
try {
return _require(moduleName);
} catch (e) {
debug(`cannot load '${moduleName}'`, e);
return null;
}
}
exports.checkInstallPackage = checkInstallPackage;
exports.checkVueI18nBridgeInstallPackage = checkVueI18nBridgeInstallPackage;
exports.generateJSON = generate$2;
exports.generateJavaScript = generate;
exports.generateYAML = generate$1;
exports.getVueI18nVersion = getVueI18nVersion;