@ladjs/i18n
Advanced tools
Comparing version 1.1.0 to 1.1.1
136
lib/index.js
@@ -1,20 +0,32 @@ | ||
'use strict'; | ||
"use strict"; | ||
function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } | ||
function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { Promise.resolve(value).then(_next, _throw); } } | ||
var _require = require('path'); | ||
function _asyncToGenerator(fn) { return function () { var self = this, args = arguments; return new Promise(function (resolve, reject) { var gen = fn.apply(self, args); function _next(value) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "next", value); } function _throw(err) { asyncGeneratorStep(gen, resolve, reject, _next, _throw, "throw", err); } _next(undefined); }); }; } | ||
const extname = _require.extname, | ||
const _require = require('path'), | ||
extname = _require.extname, | ||
resolve = _require.resolve; | ||
var _require2 = require('qs'); | ||
const Boom = require('@hapi/boom'); | ||
const stringify = _require2.stringify; | ||
const autoBind = require('auto-bind'); | ||
const Boom = require('boom'); | ||
const s = require('underscore.string'); | ||
const boolean = require('boolean'); | ||
var _require3 = require('lodash'); | ||
const debug = require('debug')('ladjs:i18n'); | ||
const isEmpty = _require3.isEmpty, | ||
const i18n = require('i18n'); | ||
const locales = require('i18n-locales'); | ||
const moment = require('moment'); | ||
const titleize = require('titleize'); | ||
const _require2 = require('country-language'), | ||
getLanguage = _require2.getLanguage; | ||
const _require3 = require('lodash'), | ||
isEmpty = _require3.isEmpty, | ||
sortBy = _require3.sortBy, | ||
@@ -24,14 +36,6 @@ every = _require3.every, | ||
var _require4 = require('country-language'); | ||
const _require4 = require('qs'), | ||
stringify = _require4.stringify; // expose global | ||
const getLanguage = _require4.getLanguage; | ||
const moment = require('moment'); | ||
const i18n = require('i18n'); | ||
const locales = require('i18n-locales'); | ||
const autoBind = require('auto-bind'); | ||
const debug = require('debug')('ladjs:i18n'); | ||
const boolean = require('boolean'); | ||
// expose global | ||
i18n.api = {}; | ||
@@ -61,19 +65,12 @@ | ||
}, config); | ||
const logger = this.config.logger; | ||
this.config.logDebugFn = logger.debug; | ||
this.config.logWarnFn = logger.warn; | ||
this.config.logErrorFn = logger.error; | ||
this.config.logErrorFn = logger.error; // validate locales against available ones | ||
// validate locales against available ones | ||
if (!every(this.config.locales, l => locales.includes(l))) throw new Error(`Invalid locales: ${this.config.locales.filter(str => !locales.includes(str)).join(', ')}`); | ||
if (!every(this.config.locales, l => locales.includes(l))) throw new Error(`Invalid locales: ${this.config.locales.filter(str => !locales.includes(str)).join(', ')}`); // inherit i18n object | ||
// inherit i18n object | ||
Object.assign(this, i18n); | ||
Object.assign(this, i18n); // configure i18n | ||
// configure i18n | ||
this.configure(this.config); | ||
autoBind(this); | ||
@@ -83,7 +80,5 @@ } | ||
translate(key, locale) { | ||
const phrases = this.config.phrases; | ||
// eslint-disable-next-line prefer-rest-params | ||
const phrases = this.config.phrases; // eslint-disable-next-line prefer-rest-params | ||
let args = Object.keys(arguments) | ||
// eslint-disable-next-line prefer-rest-params | ||
let args = Object.keys(arguments) // eslint-disable-next-line prefer-rest-params | ||
.map(key => arguments[key]).slice(2); | ||
@@ -93,3 +88,6 @@ if (typeof args === 'undefined') args = []; | ||
if (typeof phrase !== 'string') throw new Error(`translation key missing: ${key}`); | ||
args = [{ phrase, locale }, ...args]; | ||
args = [{ | ||
phrase, | ||
locale | ||
}, ...args]; | ||
return i18n.api.t(...args); | ||
@@ -99,19 +97,14 @@ } | ||
middleware(ctx, next) { | ||
var _config = this.config; | ||
const locales = _config.locales, | ||
defaultLocale = _config.defaultLocale, | ||
phrases = _config.phrases, | ||
cookie = _config.cookie; | ||
const _this$config = this.config, | ||
locales = _this$config.locales, | ||
defaultLocale = _this$config.defaultLocale, | ||
phrases = _this$config.phrases, | ||
cookie = _this$config.cookie; // expose api methods to `ctx.request` and `ctx.state` | ||
// expose api methods to `ctx.request` and `ctx.state` | ||
i18n.init(ctx.request, ctx.state); // expose a helper function to `ctx.state.l` | ||
// which prefixes a link/path with the locale | ||
i18n.init(ctx.request, ctx.state); | ||
// expose a helper function to `ctx.state.l` | ||
// which prefixes a link/path with the locale | ||
ctx.state.l = (path = '') => { | ||
return `/${ctx.state.locale}${path}`; | ||
}; | ||
// override the existing locale detection with our own | ||
}; // override the existing locale detection with our own | ||
// in order of priority: | ||
@@ -126,6 +119,6 @@ // | ||
let locale = locales.find(l => { | ||
return `/${l}` === ctx.path || ctx.path.indexOf(`/${l}/`) === 0; | ||
}); | ||
ctx.pathWithoutLocale = locale ? ctx.path.substring(`/${locale}`.length) : ctx.path; | ||
@@ -136,2 +129,3 @@ if (ctx.pathWithoutLocale === '') ctx.pathWithoutLocale = '/'; | ||
locale = defaultLocale; | ||
if (ctx.cookies.get(cookie) && locales.includes(ctx.cookies.get(cookie))) { | ||
@@ -146,15 +140,14 @@ locale = ctx.cookies.get(cookie); | ||
} | ||
} | ||
} // set the locale properly | ||
// set the locale properly | ||
i18n.setLocale([ctx.request, ctx.state], locale); | ||
ctx.locale = ctx.request.locale; | ||
ctx.locale = ctx.request.locale; // if the locale was not available then redirect user | ||
// if the locale was not available then redirect user | ||
if (locale !== ctx.state.locale) { | ||
debug('locale was not available redirecting user'); | ||
return ctx.redirect(`/${ctx.state.locale}${ctx.pathWithoutLocale}${isEmpty(ctx.query) ? '' : `?${stringify(ctx.query)}`}`); | ||
} | ||
} // available languages for a dropdown menu to change language | ||
// available languages for a dropdown menu to change language | ||
ctx.state.availableLanguages = sortBy(locales.map(locale => { | ||
@@ -166,11 +159,9 @@ return { | ||
}; | ||
}), 'name'); | ||
}), 'name'); // get the name of the current locale's language in native language | ||
// get the name of the current locale's language in native language | ||
ctx.state.currentLanguage = s.titleize(getLanguage(ctx.request.locale).nativeName[0]); | ||
// bind `ctx.translate` as a helper func | ||
ctx.state.currentLanguage = titleize(getLanguage(ctx.request.locale).nativeName[0]); // bind `ctx.translate` as a helper func | ||
// so you can pass `ctx.translate('SOME_KEY_IN_CONFIG');` and it will lookup | ||
// `phrases['SOMETHING']` to get a specific and constant message | ||
// and then it will call `t` to translate it to the user's locale | ||
ctx.translate = function (...args) { | ||
@@ -189,13 +180,13 @@ if (typeof args[0] !== 'string' || typeof phrases[args[0]] !== 'string') return ctx.throw(Boom.badRequest('Translation for your locale failed, try again')); | ||
return _asyncToGenerator(function* () { | ||
debug('attempting to redirect'); | ||
// do not redirect static paths | ||
if (extname(ctx.path) !== '') return next(); | ||
debug('attempting to redirect'); // do not redirect static paths | ||
// inspired by nodejs.org language support | ||
if (extname(ctx.path) !== '') return next(); // inspired by nodejs.org language support | ||
// <https://github.com/nodejs/nodejs.org/commit/d6cdd942a8fc0fffcf6879eca124295e95991bbc#diff-78c12f5adc1848d13b1c6f07055d996eR59> | ||
const locale = ctx.url.split('/')[1].split('?')[0]; | ||
const hasLang = _this.config.locales.includes(locale); | ||
// if the URL did not have a valid language found | ||
const hasLang = _this.config.locales.includes(locale); // if the URL did not have a valid language found | ||
// then redirect the user to their detected locale | ||
if (!hasLang) { | ||
@@ -210,5 +201,4 @@ ctx.status = 302; | ||
debug('found valid language "%s"', locale); | ||
debug('found valid language "%s"', locale); // set the cookie for future requests | ||
// set the cookie for future requests | ||
ctx.cookies.set(_this.config.cookie, locale, { | ||
@@ -219,8 +209,8 @@ // Disable signed cookies in NODE_ENV=test | ||
}); | ||
debug('set cookies for locale "%s"', locale); | ||
debug('set cookies for locale "%s"', locale); // if the user is logged in and ctx.isAuthenticated() exists, | ||
// then save it as `last_locale` | ||
// if the user is logged in and ctx.isAuthenticated() exists, | ||
// then save it as `last_locale` | ||
if (isFunction(ctx.isAuthenticated) && ctx.isAuthenticated()) { | ||
ctx.state.user.last_locale = locale; | ||
try { | ||
@@ -236,5 +226,5 @@ yield ctx.state.user.save(); | ||
} | ||
} | ||
module.exports = I18N; | ||
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJyZXF1aXJlIiwiZXh0bmFtZSIsInJlc29sdmUiLCJzdHJpbmdpZnkiLCJCb29tIiwicyIsImlzRW1wdHkiLCJzb3J0QnkiLCJldmVyeSIsImlzRnVuY3Rpb24iLCJnZXRMYW5ndWFnZSIsIm1vbWVudCIsImkxOG4iLCJsb2NhbGVzIiwiYXV0b0JpbmQiLCJkZWJ1ZyIsImJvb2xlYW4iLCJhcGkiLCJJMThOIiwiY29uc3RydWN0b3IiLCJjb25maWciLCJPYmplY3QiLCJhc3NpZ24iLCJwaHJhc2VzIiwibG9nZ2VyIiwiY29uc29sZSIsImRpcmVjdG9yeSIsImNvb2tpZSIsImluZGVudCIsImRlZmF1bHRMb2NhbGUiLCJzeW5jRmlsZXMiLCJwcm9jZXNzIiwiZW52IiwiSTE4Tl9TWU5DX0ZJTEVTIiwiYXV0b1JlbG9hZCIsIkkxOE5fQVVUT19SRUxPQUQiLCJ1cGRhdGVGaWxlcyIsIkkxOE5fVVBEQVRFX0ZJTEVTIiwiX18iLCJfX24iLCJfX2wiLCJfX2giLCJfX21mIiwicmVnaXN0ZXIiLCJsb2dEZWJ1Z0ZuIiwibG9nV2FybkZuIiwid2FybiIsImxvZ0Vycm9yRm4iLCJlcnJvciIsImwiLCJpbmNsdWRlcyIsIkVycm9yIiwiZmlsdGVyIiwic3RyIiwiam9pbiIsImNvbmZpZ3VyZSIsInRyYW5zbGF0ZSIsImtleSIsImxvY2FsZSIsImFyZ3MiLCJrZXlzIiwiYXJndW1lbnRzIiwibWFwIiwic2xpY2UiLCJwaHJhc2UiLCJ0IiwibWlkZGxld2FyZSIsImN0eCIsIm5leHQiLCJpbml0IiwicmVxdWVzdCIsInN0YXRlIiwicGF0aCIsImZpbmQiLCJpbmRleE9mIiwicGF0aFdpdGhvdXRMb2NhbGUiLCJzdWJzdHJpbmciLCJsZW5ndGgiLCJjb29raWVzIiwiZ2V0IiwiYWNjZXB0c0xhbmd1YWdlcyIsInNldExvY2FsZSIsInJlZGlyZWN0IiwicXVlcnkiLCJhdmFpbGFibGVMYW5ndWFnZXMiLCJ1cmwiLCJuYW1lIiwiY3VycmVudExhbmd1YWdlIiwidGl0bGVpemUiLCJuYXRpdmVOYW1lIiwidGhyb3ciLCJiYWRSZXF1ZXN0Iiwic3BsaXQiLCJoYXNMYW5nIiwic3RhdHVzIiwic2V0Iiwic2lnbmVkIiwiTk9ERV9FTlYiLCJleHBpcmVzIiwiYWRkIiwidG9EYXRlIiwiaXNBdXRoZW50aWNhdGVkIiwidXNlciIsImxhc3RfbG9jYWxlIiwic2F2ZSIsImVyciIsIm1vZHVsZSIsImV4cG9ydHMiXSwibWFwcGluZ3MiOiI7Ozs7ZUFBMkJBLFFBQVEsTUFBUixDOztNQUFwQkMsTyxZQUFBQSxPO01BQVNDLE8sWUFBQUEsTzs7Z0JBQ0lGLFFBQVEsSUFBUixDOztNQUFiRyxTLGFBQUFBLFM7O0FBQ1AsTUFBTUMsT0FBT0osUUFBUSxNQUFSLENBQWI7QUFDQSxNQUFNSyxJQUFJTCxRQUFRLG1CQUFSLENBQVY7O2dCQUM2Q0EsUUFBUSxRQUFSLEM7O01BQXRDTSxPLGFBQUFBLE87TUFBU0MsTSxhQUFBQSxNO01BQVFDLEssYUFBQUEsSztNQUFPQyxVLGFBQUFBLFU7O2dCQUNUVCxRQUFRLGtCQUFSLEM7O01BQWZVLFcsYUFBQUEsVzs7QUFDUCxNQUFNQyxTQUFTWCxRQUFRLFFBQVIsQ0FBZjtBQUNBLE1BQU1ZLE9BQU9aLFFBQVEsTUFBUixDQUFiO0FBQ0EsTUFBTWEsVUFBVWIsUUFBUSxjQUFSLENBQWhCO0FBQ0EsTUFBTWMsV0FBV2QsUUFBUSxXQUFSLENBQWpCO0FBQ0EsTUFBTWUsUUFBUWYsUUFBUSxPQUFSLEVBQWlCLFlBQWpCLENBQWQ7QUFDQSxNQUFNZ0IsVUFBVWhCLFFBQVEsU0FBUixDQUFoQjs7QUFFQTtBQUNBWSxLQUFLSyxHQUFMLEdBQVcsRUFBWDs7QUFFQSxNQUFNQyxJQUFOLENBQVc7QUFDVEMsY0FBWUMsU0FBUyxFQUFyQixFQUF5QjtBQUN2QixTQUFLQSxNQUFMLEdBQWNDLE9BQU9DLE1BQVAsQ0FDWjtBQUNFQyxlQUFTLEVBRFg7QUFFRUMsY0FBUUMsT0FGVjtBQUdFQyxpQkFBV3hCLFFBQVEsU0FB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LElBQUlnQixLQUFaLENBQUwsRUFBeUJELFlBQWEsSUFBRy9FLFVBQVVnRSxJQUFJZ0IsS0FBZCxDQUFxQixFQUFyQztBQUN6QnBFLGNBQU0saURBQU4sRUFBeURtRSxRQUF6RDtBQUNBLGVBQU9mLElBQUllLFFBQUosQ0FBYUEsUUFBYixDQUFQO0FBQ0Q7O0FBRURuRSxZQUFNLDJCQUFOLEVBQW1DMkMsTUFBbkM7O0FBRUE7QUFDQVMsVUFBSVcsT0FBSixDQUFZaUIsR0FBWixDQUFnQixNQUFLM0UsTUFBTCxDQUFZTyxNQUE1QixFQUFvQytCLE1BQXBDLEVBQTRDO0FBQzFDO0FBQ0FzQyxnQkFBUWpFLFFBQVFDLEdBQVIsQ0FBWWlFLFFBQVosS0FBeUIsTUFGUztBQUcxQ0MsaUJBQVN2RixTQUNOd0YsR0FETSxDQUNGLENBREUsRUFDQyxNQURELEVBRU5DLE1BRk07QUFIaUMsT0FBNUM7QUFPQXJGLFlBQU0sNkJBQU4sRUFBcUMyQyxNQUFyQzs7QUFFQTtBQUNBO0FBQ0EsVUFBSWpELFdBQVcwRCxJQUFJa0MsZUFBZixLQUFtQ2xDLElBQUlrQyxlQUFKLEVBQXZDLEVBQThEO0FBQzVEbEMsWUFBSUksS0FBSixDQUFVK0IsSUFBVixDQUFlQyxXQUFmLEdBQTZCN0MsTUFBN0I7QUFDQSxZQUFJO0FBQ0YsZ0JBQU1TLElBQUlJLEtBQUosQ0FBVStCLElBQVYsQ0FBZUUsSUFBZixFQUFOO0FBQ0QsU0FGRCxDQUVFLE9BQU9DLEdBQVAsRUFBWTtBQUNaLGdCQUFLckYsTUFBTCxDQUFZSSxNQUFaLENBQW1Cd0IsS0FBbkIsQ0FBeUJ5RCxHQUF6QjtBQUNEO0FBQ0Y7O0FBRUQsYUFBT3JDLE1BQVA7QUE3Q3dCO0FBOEN6QjtBQTlNUTs7QUFpTlhzQyxPQUFPQyxPQUFQLEdBQWlCekYsSUFBakIiLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzQ29udGVudCI6WyJjb25zdCB7ZXh0bmFtZSwgcmVzb2x2ZX0gPSByZXF1aXJlKCdwYXRoJyk7XG5jb25zdCB7c3RyaW5naWZ5fSA9IHJlcXVpcmUoJ3FzJyk7XG5jb25zdCBCb29tID0gcmVxdWlyZSgnYm9vbScpO1xuY29uc3QgcyA9IHJlcXVpcmUoJ3VuZGVyc2NvcmUuc3RyaW5nJyk7XG5jb25zdCB7aXNFbXB0eSwgc29ydEJ5LCBldmVyeSwgaXNGdW5jdGlvbn0gPSByZXF1aXJlKCdsb2Rhc2gnKTtcbmNvbnN0IHtnZXRMYW5ndWFnZX0gPSByZXF1aXJlKCdjb3VudHJ5LWxhbmd1YWdlJyk7XG5jb25zdCBtb21lbnQgPSByZXF1aXJlKCdtb21lbnQnKTtcbmNvbnN0IGkxOG4gPSByZXF1aXJlKCdpMThuJyk7XG5jb25zdCBsb2NhbGVzID0gcmVxdWlyZSgnaTE4bi1sb2NhbGVzJyk7XG5jb25zdCBhdXRvQmluZCA9IHJlcXVpcmUoJ2F1dG8tYmluZCcpO1xuY29uc3QgZGVidWcgPSByZXF1aXJlKCdkZWJ1ZycpKCdsYWRqczppMThuJyk7XG5jb25zdCBib29sZWFuID0gcmVxdWlyZSgnYm9vbGVhbicpO1xuXG4vLyBleHBvc2UgZ2xvYmFsXG5pMThuLmFwaSA9IHt9O1xuXG5jbGFzcyBJMThOIHtcbiAgY29uc3RydWN0b3IoY29uZmlnID0ge30pIHtcbiAgICB0aGlzLmNvbmZpZyA9IE9iamVjdC5hc3NpZ24oXG4gICAgICB7XG4gICAgICAgIHBocmFzZXM6IHt9LFxuICAgICAgICBsb2dnZXI6IGNvbnNvbGUsXG4gICAgICAgIGRpcmVjdG9yeTogcmVzb2x2ZSgnbG9jYWxlcycpLFxuICAgICAgICBsb2NhbGVzOiBbJ2VuJywgJ2VzJywgJ3poJ10sXG4gICAgICAgIGNvb2tpZTogJ2xvY2FsZScsXG4gICAgICAgIGluZGVudDogJyAgJyxcbiAgICAgICAgZGVmYXVsdExvY2FsZTogJ2VuJyxcbiAgICAgICAgc3luY0ZpbGVzOiBib29sZWFuKHByb2Nlc3MuZW52LkkxOE5fU1lOQ19GSUxFUyB8fCB0cnVlKSxcbiAgICAgICAgYXV0b1JlbG9hZDogYm9vbGVhbihwcm9jZXNzLmVudi5JMThOX0FVVE9fUkVMT0FEIHx8IGZhbHNlKSxcbiAgICAgICAgdXBkYXRlRmlsZXM6IGJvb2xlYW4ocHJvY2Vzcy5lbnYuSTE4Tl9VUERBVEVfRklMRVMgfHwgdHJ1ZSksXG4gICAgICAgIGFwaToge1xuICAgICAgICAgIF9fOiAndCcsXG4gICAgICAgICAgX19uOiAndG4nLFxuICAgICAgICAgIF9fbDogJ3RsJyxcbiAgICAgICAgICBfX2g6ICd0aCcsXG4gICAgICAgICAgX19tZjogJ3RtZidcbiAgICAgICAgfSxcbiAgICAgICAgcmVnaXN0ZXI6IGkxOG4uYXBpXG4gICAgICB9LFxuICAgICAgY29uZmlnXG4gICAgKTtcblxuICAgIGNvbnN0IHtsb2dnZXJ9ID0gdGhpcy5jb25maWc7XG5cbiAgICB0aGlzLmNvbmZpZy5sb2dEZWJ1Z0ZuID0gbG9nZ2VyLmRlYnVnO1xuICAgIHRoaXMuY29uZmlnLmxvZ1dhcm5GbiA9IGxvZ2dlci53YXJuO1xuICAgIHRoaXMuY29uZmlnLmxvZ0Vycm9yRm4gPSBsb2dnZXIuZXJyb3I7XG5cbiAgICAvLyB2YWxpZGF0ZSBsb2NhbGVzIGFnYWluc3QgYXZhaWxhYmxlIG9uZXNcbiAgICBpZiAoIWV2ZXJ5KHRoaXMuY29uZmlnLmxvY2FsZXMsIGwgPT4gbG9jYWxlcy5pbmNsdWRlcyhsKSkpXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgIGBJbnZhbGlkIGxvY2FsZXM6ICR7dGhpcy5jb25maWcubG9jYWxlc1xuICAgICAgICAgIC5maWx0ZXIoc3RyID0+ICFsb2NhbGVzLmluY2x1ZGVzKHN0cikpXG4gICAgICAgICAgLmpvaW4oJywgJyl9YFxuICAgICAgKTtcblxuICAgIC8vIGluaGVyaXQgaTE4biBvYmplY3RcbiAgICBPYmplY3QuYXNzaWduKHRoaXMsIGkxOG4pO1xuXG4gICAgLy8gY29uZmlndXJlIGkxOG5cbiAgICB0aGlzLmNvbmZpZ3VyZSh0aGlzLmNvbmZpZyk7XG5cbiAgICBhdXRvQmluZCh0aGlzKTtcbiAgfVxuXG4gIHRyYW5zbGF0ZShrZXksIGxvY2FsZSkge1xuICAgIGNvbnN0IHtwaHJhc2VzfSA9IHRoaXMuY29uZmlnO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICBsZXQgYXJncyA9IE9iamVjdC5rZXlzKGFyZ3VtZW50cylcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBwcmVmZXItcmVzdC1wYXJhbXNcbiAgICAgIC5tYXAoa2V5ID0+IGFyZ3VtZW50c1trZXldKVxuICAgICAgLnNsaWNlKDIpO1xuICAgIGlmICh0eXBlb2YgYXJncyA9PT0gJ3VuZGVmaW5lZCcpIGFyZ3MgPSBbXTtcbiAgICBjb25zdCBwaHJhc2UgPSBwaHJhc2VzW2tleV07XG4gICAgaWYgKHR5cGVvZiBwaHJhc2UgIT09ICdzdHJpbmcnKVxuICAgICAgdGhyb3cgbmV3IEVycm9yKGB0cmFuc2xhdGlvbiBrZXkgbWlzc2luZzogJHtrZXl9YCk7XG4gICAgYXJncyA9IFt7cGhyYXNlLCBsb2NhbGV9LCAuLi5hcmdzXTtcbiAgICByZXR1cm4gaTE4bi5hcGkudCguLi5hcmdzKTtcbiAgfVxuXG4gIG1pZGRsZXdhcmUoY3R4LCBuZXh0KSB7XG4gICAgY29uc3Qge2xvY2FsZXMsIGRlZmF1bHRMb2NhbGUsIHBocmFzZXMsIGNvb2tpZX0gPSB0aGlzLmNvbmZpZztcblxuICAgIC8vIGV4cG9zZSBhcGkgbWV0aG9kcyB0byBgY3R4LnJlcXVlc3RgIGFuZCBgY3R4LnN0YXRlYFxuICAgIGkxOG4uaW5pdChjdHgucmVxdWVzdCwgY3R4LnN0YXRlKTtcblxuICAgIC8vIGV4cG9zZSBhIGhlbHBlciBmdW5jdGlvbiB0byBgY3R4LnN0YXRlLmxgXG4gICAgLy8gd2hpY2ggcHJlZml4ZXMgYSBsaW5rL3BhdGggd2l0aCB0aGUgbG9jYWxlXG4gICAgY3R4LnN0YXRlLmwgPSAocGF0aCA9ICcnKSA9PiB7XG4gICAgICByZXR1cm4gYC8ke2N0eC5zdGF0ZS5sb2NhbGV9JHtwYXRofWA7XG4gICAgfTtcblxuICAgIC8vIG92ZXJyaWRlIHRoZSBleGlzdGluZyBsb2NhbGUgZGV0ZWN0aW9uIHdpdGggb3VyIG93blxuICAgIC8vIGluIG9yZGVyIG9mIHByaW9yaXR5OlxuICAgIC8vXG4gICAgLy8gMS4gY2hlY2sgdGhlIFVSTCwgaWYgPT09IGAvZGVgIG9yIHN0YXJ0cyB3aXRoIGAvZGUvYCB0aGVuIGxvY2FsZSBpcyBgZGVgXG4gICAgLy8gMi4gY2hlY2sgdGhlIGNvb2tpZVxuICAgIC8vIDMuIGNoZWNrIEFjY2VwdC1MYW5ndWFnZSBsYXN0XG4gICAgLy9cbiAgICAvLyBhbHNvIHdlIG5lZWQgdG8gZXhwb3NlIGBjdHgucGF0aFdpdGhvdXRMb2NhbGVgXG4gICAgLy8gYXMgdGhlIHBhdGggd2l0aG91dCBsb2NhbGVcblxuICAgIGxldCBsb2NhbGUgPSBsb2NhbGVzLmZpbmQobCA9PiB7XG4gICAgICByZXR1cm4gYC8ke2x9YCA9PT0gY3R4LnBhdGggfHwgY3R4LnBhdGguaW5kZXhPZihgLyR7bH0vYCkgPT09IDA7XG4gICAgfSk7XG5cbiAgICBjdHgucGF0aFdpdGhvdXRMb2NhbGUgPSBsb2NhbGVcbiAgICAgID8gY3R4LnBhdGguc3Vic3RyaW5nKGAvJHtsb2NhbGV9YC5sZW5ndGgpXG4gICAgICA6IGN0eC5wYXRoO1xuICAgIGlmIChjdHgucGF0aFdpdGhvdXRMb2NhbGUgPT09ICcnKSBjdHgucGF0aFdpdGhvdXRMb2NhbGUgPSAnLyc7XG5cbiAgICBpZiAoIWxvY2FsZSkge1xuICAgICAgbG9jYWxlID0gZGVmYXVsdExvY2FsZTtcbiAgICAgIGlmIChcbiAgICAgICAgY3R4LmNvb2tpZXMuZ2V0KGNvb2tpZSkgJiZcbiAgICAgICAgbG9jYWxlcy5pbmNsdWRlcyhjdHguY29va2llcy5nZXQoY29va2llKSlcbiAgICAgICkge1xuICAgICAgICBsb2NhbGUgPSBjdHguY29va2llcy5nZXQoY29va2llKTtcbiAgICAgICAgZGVidWcoJ2ZvdW5kIGxvY2FsZSB2aWEgY29va2llIHVzaW5nICVzJywgbG9jYWxlKTtcbiAgICAgIH0gZWxzZSBpZiAoY3R4LnJlcXVlc3QuYWNjZXB0c0xhbmd1YWdlcyhsb2NhbGVzKSkge1xuICAgICAgICBsb2NhbGUgPSBjdHgucmVxdWVzdC5hY2NlcHRzTGFuZ3VhZ2VzKGxvY2FsZXMpO1xuICAgICAgICBkZWJ1ZygnZm91bmQgbG9jYWxlIHZpYSBBY2NlcHQtTGFuZ3VhZ2UgaGVhZGVyIHVzaW5nICVzJywgbG9jYWxlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGRlYnVnKCd1c2luZyBkZWZhdWx0IGxvY2FsZScpO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIHNldCB0aGUgbG9jYWxlIHByb3Blcmx5XG4gICAgaTE4bi5zZXRMb2NhbGUoW2N0eC5yZXF1ZXN0LCBjdHguc3RhdGVdLCBsb2NhbGUpO1xuICAgIGN0eC5sb2NhbGUgPSBjdHgucmVxdWVzdC5sb2NhbGU7XG5cbiAgICAvLyBpZiB0aGUgbG9jYWxlIHdhcyBub3QgYXZhaWxhYmxlIHRoZW4gcmVkaXJlY3QgdXNlclxuICAgIGlmIChsb2NhbGUgIT09IGN0eC5zdGF0ZS5sb2NhbGUpIHtcbiAgICAgIGRlYnVnKCdsb2NhbGUgd2FzIG5vdCBhdmFpbGFibGUgcmVkaXJlY3RpbmcgdXNlcicpO1xuICAgICAgcmV0dXJuIGN0eC5yZWRpcmVjdChcbiAgICAgICAgYC8ke2N0eC5zdGF0ZS5sb2NhbGV9JHtjdHgucGF0aFdpdGhvdXRMb2NhbGV9JHtcbiAgICAgICAgICBpc0VtcHR5KGN0eC5xdWVyeSkgPyAnJyA6IGA/JHtzdHJpbmdpZnkoY3R4LnF1ZXJ5KX1gXG4gICAgICAgIH1gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIGF2YWlsYWJsZSBsYW5ndWFnZXMgZm9yIGEgZHJvcGRvd24gbWVudSB0byBjaGFuZ2UgbGFuZ3VhZ2VcbiAgICBjdHguc3RhdGUuYXZhaWxhYmxlTGFuZ3VhZ2VzID0gc29ydEJ5KFxuICAgICAgbG9jYWxlcy5tYXAobG9jYWxlID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICBsb2NhbGUsXG4gICAgICAgICAgdXJsOiBgLyR7bG9jYWxlfSR7Y3R4LnBhdGhXaXRob3V0TG9jYWxlfSR7XG4gICAgICAgICAgICBpc0VtcHR5KGN0eC5xdWVyeSkgPyAnJyA6IGA/JHtzdHJpbmdpZnkoY3R4LnF1ZXJ5KX1gXG4gICAgICAgICAgfWAsXG4gICAgICAgICAgbmFtZTogZ2V0TGFuZ3VhZ2UobG9jYWxlKS5uYW1lWzBdXG4gICAgICAgIH07XG4gICAgICB9KSxcbiAgICAgICduYW1lJ1xuICAgICk7XG5cbiAgICAvLyBnZXQgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgbG9jYWxlJ3MgbGFuZ3VhZ2UgaW4gbmF0aXZlIGxhbmd1YWdlXG4gICAgY3R4LnN0YXRlLmN1cnJlbnRMYW5ndWFnZSA9IHMudGl0bGVpemUoXG4gICAgICBnZXRMYW5ndWFnZShjdHgucmVxdWVzdC5sb2NhbGUpLm5hdGl2ZU5hbWVbMF1cbiAgICApO1xuXG4gICAgLy8gYmluZCBgY3R4LnRyYW5zbGF0ZWAgYXMgYSBoZWxwZXIgZnVuY1xuICAgIC8vIHNvIHlvdSBjYW4gcGFzcyBgY3R4LnRyYW5zbGF0ZSgnU09NRV9LRVlfSU5fQ09ORklHJyk7YCBhbmQgaXQgd2lsbCBsb29rdXBcbiAgICAvLyBgcGhyYXNlc1snU09NRVRISU5HJ11gIHRvIGdldCBhIHNwZWNpZmljIGFuZCBjb25zdGFudCBtZXNzYWdlXG4gICAgLy8gYW5kIHRoZW4gaXQgd2lsbCBjYWxsIGB0YCB0byB0cmFuc2xhdGUgaXQgdG8gdGhlIHVzZXIncyBsb2NhbGVcbiAgICBjdHgudHJhbnNsYXRlID0gZnVuY3Rpb24oLi4uYXJncykge1xuICAgICAgaWYgKHR5cGVvZiBhcmdzWzBdICE9PSAnc3RyaW5nJyB8fCB0eXBlb2YgcGhyYXNlc1thcmdzWzBdXSAhPT0gJ3N0cmluZycpXG4gICAgICAgIHJldHVybiBjdHgudGhyb3coXG4gICAgICAgICAgQm9vbS5iYWRSZXF1ZXN0KCdUcmFuc2xhdGlvbiBmb3IgeW91ciBsb2NhbGUgZmFpbGVkLCB0cnkgYWdhaW4nKVxuICAgICAgICApO1xuICAgICAgYXJnc1swXSA9IHBocmFzZXNbYXJnc1swXV07XG4gICAgICByZXR1cm4gY3R4LnJlcXVlc3QudCguLi5hcmdzKTtcbiAgICB9O1xuXG4gICAgcmV0dXJuIG5leHQoKTtcbiAgfVxuXG4gIGFzeW5jIHJlZGlyZWN0KGN0eCwgbmV4dCkge1xuICAgIGRlYnVnKCdhdHRlbXB0aW5nIHRvIHJlZGlyZWN0Jyk7XG4gICAgLy8gZG8gbm90IHJlZGlyZWN0IHN0YXRpYyBwYXRoc1xuICAgIGlmIChleHRuYW1lKGN0eC5wYXRoKSAhPT0gJycpIHJldHVybiBuZXh0KCk7XG5cbiAgICAvLyBpbnNwaXJlZCBieSBub2RlanMub3JnIGxhbmd1YWdlIHN1cHBvcnRcbiAgICAvLyA8aHR0cHM6Ly9naXRodWIuY29tL25vZGVqcy9ub2RlanMub3JnL2NvbW1pdC9kNmNkZDk0MmE4ZmMwZmZmY2Y2ODc5ZWNhMTI0Mjk1ZTk1OTkxYmJjI2RpZmYtNzhjMTJmNWFkYzE4NDhkMTNiMWM2ZjA3MDU1ZDk5NmVSNTk+XG4gICAgY29uc3QgbG9jYWxlID0gY3R4LnVybC5zcGxpdCgnLycpWzFdLnNwbGl0KCc/JylbMF07XG4gICAgY29uc3QgaGFzTGFuZyA9IHRoaXMuY29uZmlnLmxvY2FsZXMuaW5jbHVkZXMobG9jYWxlKTtcblxuICAgIC8vIGlmIHRoZSBVUkwgZGlkIG5vdCBoYXZlIGEgdmFsaWQgbGFuZ3VhZ2UgZm91bmRcbiAgICAvLyB0aGVuIHJlZGlyZWN0IHRoZSB1c2VyIHRvIHRoZWlyIGRldGVjdGVkIGxvY2FsZVxuICAgIGlmICghaGFzTGFuZykge1xuICAgICAgY3R4LnN0YXR1cyA9IDMwMjtcbiAgICAgIGxldCByZWRpcmVjdCA9IGAvJHtjdHgucmVxdWVzdC5sb2NhbGV9JHtjdHgudXJsfWA7XG4gICAgICBpZiAocmVkaXJlY3QgPT09IGAvJHtjdHgucmVxdWVzdC5sb2NhbGV9L2ApXG4gICAgICAgIHJlZGlyZWN0ID0gYC8ke2N0eC5yZXF1ZXN0LmxvY2FsZX1gO1xuICAgICAgaWYgKCFpc0VtcHR5KGN0eC5xdWVyeSkpIHJlZGlyZWN0ICs9IGA/JHtzdHJpbmdpZnkoY3R4LnF1ZXJ5KX1gO1xuICAgICAgZGVidWcoJ25vIHZhbGlkIGxvY2FsZSBmb3VuZCBpbiBVUkwsIHJlZGlyZWN0aW5nIHRvICVzJywgcmVkaXJlY3QpO1xuICAgICAgcmV0dXJuIGN0eC5yZWRpcmVjdChyZWRpcmVjdCk7XG4gICAgfVxuXG4gICAgZGVidWcoJ2ZvdW5kIHZhbGlkIGxhbmd1YWdlIFwiJXNcIicsIGxvY2FsZSk7XG5cbiAgICAvLyBzZXQgdGhlIGNvb2tpZSBmb3IgZnV0dXJlIHJlcXVlc3RzXG4gICAgY3R4LmNvb2tpZXMuc2V0KHRoaXMuY29uZmlnLmNvb2tpZSwgbG9jYWxlLCB7XG4gICAgICAvLyBEaXNhYmxlIHNpZ25lZCBjb29raWVzIGluIE5PREVfRU5WPXRlc3RcbiAgICAgIHNpZ25lZDogcHJvY2Vzcy5lbnYuTk9ERV9FTlYgIT09ICd0ZXN0JyxcbiAgICAgIGV4cGlyZXM6IG1vbWVudCgpXG4gICAgICAgIC5hZGQoMSwgJ3llYXInKVxuICAgICAgICAudG9EYXRlKClcbiAgICB9KTtcbiAgICBkZWJ1Zygnc2V0IGNvb2tpZXMgZm9yIGxvY2FsZSBcIiVzXCInLCBsb2NhbGUpO1xuXG4gICAgLy8gaWYgdGhlIHVzZXIgaXMgbG9nZ2VkIGluIGFuZCBjdHguaXNBdXRoZW50aWNhdGVkKCkgZXhpc3RzLFxuICAgIC8vIHRoZW4gc2F2ZSBpdCBhcyBgbGFzdF9sb2NhbGVgXG4gICAgaWYgKGlzRnVuY3Rpb24oY3R4LmlzQXV0aGVudGljYXRlZCkgJiYgY3R4LmlzQXV0aGVudGljYXRlZCgpKSB7XG4gICAgICBjdHguc3RhdGUudXNlci5sYXN0X2xvY2FsZSA9IGxvY2FsZTtcbiAgICAgIHRyeSB7XG4gICAgICAgIGF3YWl0IGN0eC5zdGF0ZS51c2VyLnNhdmUoKTtcbiAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICB0aGlzLmNvbmZpZy5sb2dnZXIuZXJyb3IoZXJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dCgpO1xuICB9XG59XG5cbm1vZHVsZS5leHBvcnRzID0gSTE4TjtcbiJdfQ== | ||
module.exports = I18N; |
{ | ||
"name": "@ladjs/i18n", | ||
"description": "i18n wrapper and Koa middleware for Lad", | ||
"version": "1.1.0", | ||
"version": "1.1.1", | ||
"author": "Nick Baugh <niftylettuce@gmail.com> (http://niftylettuce.com/)", | ||
@@ -23,35 +23,37 @@ "ava": { | ||
"dependencies": { | ||
"auto-bind": "^2.0.0", | ||
"boolean": "^0.2.0", | ||
"boom": "7.3.0", | ||
"@hapi/boom": "^7.4.3", | ||
"auto-bind": "^2.1.0", | ||
"boolean": "^1.0.0", | ||
"country-language": "^0.1.7", | ||
"debug": "^4.1.1", | ||
"i18n": "^0.8.3", | ||
"i18n-locales": "^0.0.2", | ||
"lodash": "^4.17.11", | ||
"moment": "^2.23.0", | ||
"qs": "^6.6.0", | ||
"underscore.string": "^3.3.5" | ||
"lodash": "^4.17.15", | ||
"moment": "^2.24.0", | ||
"qs": "^6.8.0", | ||
"titleize": "^2.1.0" | ||
}, | ||
"devDependencies": { | ||
"@commitlint/cli": "^7.3.1", | ||
"@commitlint/config-conventional": "^7.3.1", | ||
"ava": "^1.1.0", | ||
"babel-cli": "^6.26.0", | ||
"babel-preset-env": "^1.7.0", | ||
"codecov": "^3.1.0", | ||
"cross-env": "^5.2.0", | ||
"debug": "^4.1.1", | ||
"eslint": "^5.12.0", | ||
"@babel/cli": "^7.5.5", | ||
"@babel/core": "^7.5.5", | ||
"@babel/preset-env": "^7.5.5", | ||
"@commitlint/cli": "^8.1.0", | ||
"@commitlint/config-conventional": "^8.1.0", | ||
"ava": "^2.3.0", | ||
"codecov": "^3.5.0", | ||
"cross-env": "^5.2.1", | ||
"eslint": "^6.3.0", | ||
"eslint-config-xo-lass": "^1.0.3", | ||
"eslint-plugin-node": "^10.0.0", | ||
"fixpack": "^2.3.1", | ||
"husky": "^1.3.1", | ||
"koa": "^2.6.2", | ||
"husky": "^3.0.5", | ||
"koa": "^2.8.1", | ||
"koa-generic-session": "^2.0.1", | ||
"lint-staged": "^8.1.0", | ||
"nyc": "^13.1.0", | ||
"remark-cli": "^6.0.1", | ||
"remark-preset-github": "^0.0.13", | ||
"sinon": "^7.2.2", | ||
"supertest": "^3.3.0", | ||
"xo": "^0.23.0" | ||
"lint-staged": "^9.2.5", | ||
"nyc": "^14.1.1", | ||
"remark-cli": "^7.0.0", | ||
"remark-preset-github": "^0.0.16", | ||
"sinon": "^7.4.2", | ||
"supertest": "^4.0.2", | ||
"xo": "^0.24.0" | ||
}, | ||
@@ -68,3 +70,3 @@ "engines": { | ||
"hooks": { | ||
"pre-commit": "npm test", | ||
"pre-commit": "lint-staged && npm test", | ||
"commit-msg": "commitlint -E HUSKY_GIT_PARAMS" | ||
@@ -79,18 +81,21 @@ } | ||
"lint-staged": { | ||
"linters": { | ||
"*.js": [ | ||
"xo --fix", | ||
"git add" | ||
], | ||
"*.md": [ | ||
"remark . -qfo", | ||
"git add" | ||
], | ||
"package.json": [ | ||
"fixpack", | ||
"git add" | ||
] | ||
} | ||
"*.js": [ | ||
"xo --fix", | ||
"git add" | ||
], | ||
"*.md": [ | ||
"remark . -qfo", | ||
"git add" | ||
], | ||
"package.json": [ | ||
"fixpack", | ||
"git add" | ||
] | ||
}, | ||
"main": "lib/index.js", | ||
"prettier": { | ||
"singleQuote": true, | ||
"bracketSpacing": true, | ||
"trailingComma": "none" | ||
}, | ||
"remarkConfig": { | ||
@@ -108,3 +113,3 @@ "plugins": [ | ||
"coverage": "nyc report --reporter=text-lcov > coverage.lcov && codecov", | ||
"lint": "xo && remark . -qfo", | ||
"lint": "xo && remark . -qfo && eslint --no-inline-config -c .lib.eslintrc lib", | ||
"test": "npm run build && npm run lint && npm run test-coverage", | ||
@@ -111,0 +116,0 @@ "test-coverage": "cross-env NODE_ENV=test nyc ava", |
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
16967
11
22
172
1
+ Added@hapi/boom@^7.4.3
+ Addeddebug@^4.1.1
+ Addedtitleize@^2.1.0
+ Added@hapi/boom@7.4.11(transitive)
+ Added@hapi/hoek@8.5.1(transitive)
+ Addedboolean@1.0.0(transitive)
+ Addedtitleize@2.1.0(transitive)
- Removedboom@7.3.0
- Removedunderscore.string@^3.3.5
- Removedboolean@0.2.0(transitive)
- Removedboom@7.3.0(transitive)
- Removedhoek@6.1.3(transitive)
- Removedunderscore.string@3.3.6(transitive)
- Removedutil-deprecate@1.0.2(transitive)
Updatedauto-bind@^2.1.0
Updatedboolean@^1.0.0
Updatedlodash@^4.17.15
Updatedmoment@^2.24.0
Updatedqs@^6.8.0