UNPKG

@zainulbr/i18n-webpack-plugin

Version:

Rewrite original embed localization into your bundle with support webpack 5

132 lines (103 loc) 5.21 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.default = void 0; var _ConstDependency = _interopRequireDefault(require("webpack/lib/dependencies/ConstDependency")); var _NullFactory = _interopRequireDefault(require("webpack/lib/NullFactory")); var _MissingLocalizationError = _interopRequireDefault(require("./MissingLocalizationError")); var _MakeLocalizeFunction = _interopRequireDefault(require("./MakeLocalizeFunction")); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } /** * * @param {object|function} localization * @param {object|string} Options object or obselete functionName string * @constructor */ var I18nPlugin = /*#__PURE__*/function () { function I18nPlugin(localization, poptions, failOnMissing) { _classCallCheck(this, I18nPlugin); var options = poptions; // Backward-compatiblility if (typeof options === 'string') { options = { functionName: options }; } if (typeof failOnMissing !== 'undefined') { options.failOnMissing = failOnMissing; } this.options = options || {}; var plocalization = typeof localization === 'function' ? localization : (0, _MakeLocalizeFunction.default)(localization, !!this.options.nested); this.localization = localization ? plocalization : {}; this.functionName = this.options.functionName || '__'; this.failOnMissing = !!this.options.failOnMissing; this.hideMessage = this.options.hideMessage || false; } _createClass(I18nPlugin, [{ key: "apply", value: function apply(compiler) { var PLUGIN_NAME = 'I18nPlugin'; var localization = this.localization, failOnMissing = this.failOnMissing, hideMessage = this.hideMessage; // eslint-disable-line no-unused-vars var name = this.functionName; compiler.hooks.compilation.tap(PLUGIN_NAME, function (compilation, _ref) { var normalModuleFactory = _ref.normalModuleFactory; compilation.dependencyFactories.set(_ConstDependency.default, new _NullFactory.default()); compilation.dependencyTemplates.set(_ConstDependency.default, new _ConstDependency.default.Template()); var handler = function handler(parser) { // eslint-disable-line no-unused-vars // should use function here instead of arrow function due to save the Tapable's context parser.hooks.call.for(name).tap("call ".concat(name), function (expr) { var param; var defaultValue; switch (expr.arguments.length) { case 2: param = expr.arguments[1].value; if (typeof param !== 'string') return; defaultValue = expr.arguments[0].value; if (typeof defaultValue !== 'string') return; break; case 1: param = expr.arguments[0].value; if (typeof param !== 'string') return; defaultValue = param; break; default: return; } var result = localization && typeof localization === 'function' ? localization(param) : defaultValue; if (typeof result === 'undefined') { var error = parser.state.module[__dirname]; if (!error) { error = new _MissingLocalizationError.default(parser.state.module, param, defaultValue); parser.state.module[__dirname] = error; if (failOnMissing) { parser.state.module.errors.push(error); } else if (!hideMessage) { parser.state.module.warnings.push(error); } } else if (!error.requests.includes(param)) { error.add(param, defaultValue); } result = defaultValue; } var dep = new _ConstDependency.default(JSON.stringify(result), expr.range); dep.loc = expr.loc; parser.state.current.addDependency(dep); return true; }); }; normalModuleFactory.hooks.parser.for('javascript/auto').tap(PLUGIN_NAME, handler); normalModuleFactory.hooks.parser.for('javascript/dynamic').tap(PLUGIN_NAME, handler); normalModuleFactory.hooks.parser.for('javascript/esm').tap(PLUGIN_NAME, handler); }); } }]); return I18nPlugin; }(); var _default = I18nPlugin; exports.default = _default;