From 2310c9a0ec426b043d9e62aa1efd8940c41c56cd Mon Sep 17 00:00:00 2001 From: Spown Date: Sun, 7 May 2017 22:16:36 +0200 Subject: [PATCH 1/5] + i18n.disableReload; ~ fs.watch->chokidar; --- .gitignore | 1 + .jshintrc | 2 +- .travis.yml | 1 + README.md | 4 + appveyor.yml | 1 + i18n.js | 126 ++++++++++++++++++------------- package.json | 8 +- test/.jshintrc | 14 ++++ test/i18n.configureAutoreload.js | 95 ++++++++++++++++++++--- 9 files changed, 186 insertions(+), 66 deletions(-) create mode 100644 test/.jshintrc diff --git a/.gitignore b/.gitignore index 7260d1f9..d53f210c 100644 --- a/.gitignore +++ b/.gitignore @@ -8,3 +8,4 @@ coverage/ defaultlocales localestowrite localesmakeplural +.vscode \ No newline at end of file diff --git a/.jshintrc b/.jshintrc index d07f9686..0f190b1c 100644 --- a/.jshintrc +++ b/.jshintrc @@ -35,7 +35,7 @@ "latedef": false, // Enforce line length to 100 characters - "maxlen": 100, + "maxlen": 120, // Require capitalized names for constructor functions. "newcap": true, diff --git a/.travis.yml b/.travis.yml index 0ef616f7..6e0fd28a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -5,6 +5,7 @@ node_js: - 0.12 - 4 - 5 + - 6 - iojs branches: only: diff --git a/README.md b/README.md index ba9f7a31..31e9af34 100644 --- a/README.md +++ b/README.md @@ -307,6 +307,10 @@ and add it's extra attributes and methods, like so: Now each _local_ object (ie. res.locals) is setup with _it's own "private"_ locale and methods to get the appropriate translation from the _global_ catalog. +### i18n.disableReload() + +Stopps watching for outside changes on the locale files if ```autoReload: true```. + ### i18n.__() Translates a single phrase and adds it to locales if unknown. Returns translated parsed and substituted string. diff --git a/appveyor.yml b/appveyor.yml index 1fc97dc0..82f420d5 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -4,6 +4,7 @@ environment: - nodejs_version: "0.12" - nodejs_version: "4" - nodejs_version: "5" + - nodejs_version: "6" - nodejs_version: "iojs" branches: only: diff --git a/i18n.js b/i18n.js index 0870cac9..dd2da07b 100644 --- a/i18n.js +++ b/i18n.js @@ -9,7 +9,10 @@ 'use strict'; // dependencies -var vsprintf = require('sprintf-js').vsprintf, +var pkg = require('./package.json'), + chokidar = require('chokidar'), + upath = require('upath'), + vsprintf = require('sprintf-js').vsprintf, fs = require('fs'), url = require('url'), path = require('path'), @@ -24,7 +27,7 @@ var vsprintf = require('sprintf-js').vsprintf, parseInterval = require('math-interval-parser').default; // exports an instance -module.exports = (function() { +module.exports = (function () { var MessageformatInstanceForLocale = {}, PluralsForLocale = {}, @@ -44,6 +47,7 @@ module.exports = (function() { }, pathsep = path.sep, // ---> means win support will be available in node 0.8.x and above autoReload, + fsWatcher, cookiename, defaultLocale, directory, @@ -65,7 +69,13 @@ module.exports = (function() { // public exports var i18n = {}; - i18n.version = '0.8.3'; + i18n.version = pkg.version; + + i18n.disableReload = function disableReload() { + if (fsWatcher && fsWatcher.closed === false) { + fsWatcher.close(); + } + }; i18n.configure = function i18nConfigure(opt) { @@ -91,7 +101,7 @@ module.exports = (function() { // or give an array objects to register to if (Array.isArray(opt.register)) { register = opt.register; - register.forEach(function(r) { + register.forEach(function (r) { applyAPItoObject(r); }); } else { @@ -155,22 +165,28 @@ module.exports = (function() { // implicitly read all locales if (Array.isArray(opt.locales)) { - opt.locales.forEach(function(l) { + opt.locales.forEach(function (l) { read(l); }); // auto reload locale files when changed + i18n.disableReload(); if (autoReload) { // watch changes of locale files (it's called twice because fs.watch is still unstable) - fs.watch(directory, function(event, filename) { - var localeFromFile = guessLocaleFromFile(filename); - - if (localeFromFile && opt.locales.indexOf(localeFromFile) > -1) { - logDebug('Auto reloading locale file "' + filename + '".'); + fsWatcher = chokidar.watch( + upath.join(directory, '*'), { + persistent: true + } + ); + fsWatcher.on('all', function (event, filePath) { + var fileName = upath.basename(filePath), + localeFromFile = guessLocaleFromFile(fileName); + //console.log(' fsWatcher.on', event, fileName); + if (event === 'change' && localeFromFile && opt.locales.indexOf(localeFromFile) > -1) { + logDebug('Auto reloading locale file "' + fileName + '".'); read(localeFromFile); } - }); } } @@ -283,17 +299,23 @@ module.exports = (function() { i18n.__l = function i18nTranslationList(phrase) { var translations = []; - Object.keys(locales).sort().forEach(function(l) { - translations.push(i18n.__({ phrase: phrase, locale: l })); + Object.keys(locales).sort().forEach(function (l) { + translations.push(i18n.__({ + phrase: phrase, + locale: l + })); }); return translations; }; i18n.__h = function i18nTranslationHash(phrase) { var translations = []; - Object.keys(locales).sort().forEach(function(l) { + Object.keys(locales).sort().forEach(function (l) { var hash = {}; - hash[l] = i18n.__({ phrase: phrase, locale: l }); + hash[l] = i18n.__({ + phrase: phrase, + locale: l + }); translations.push(hash); }); return translations; @@ -367,7 +389,9 @@ module.exports = (function() { } else { // split locales with a region code var lc = targetLocale.toLowerCase().split(/[_-\s]+/) - .filter(function(el){ return true && el; }); + .filter(function (el) { + return true && el; + }); // take the first part of locale, fallback to full locale p = new MakePlural(lc[0] || targetLocale); PluralsForLocale[targetLocale] = p; @@ -412,7 +436,7 @@ module.exports = (function() { // consider any extra registered objects if (typeof register === 'object') { if (Array.isArray(register) && !skipImplicitObjects) { - register.forEach(function(r) { + register.forEach(function (r) { r.locale = targetObject.locale; }); } else { @@ -526,7 +550,7 @@ module.exports = (function() { // = private methods = // =================== - var postProcess = function(msg, namedValues, args, count) { + var postProcess = function (msg, namedValues, args, count) { // test for parsable interval string if ((/\|/).test(msg)) { @@ -552,13 +576,13 @@ module.exports = (function() { return msg; }; - var argsEndWithNamedObject = function(args) { + var argsEndWithNamedObject = function (args) { return (args.length > 1 && args[args.length - 1] !== null && typeof args[args.length - 1] === 'object'); }; - var parseArgv = function(args) { + var parseArgv = function (args) { var namedValues, returnArgs; if (argsEndWithNamedObject(args)) { @@ -575,7 +599,7 @@ module.exports = (function() { /** * registers all public API methods to a given response object when not already declared */ - var applyAPItoObject = function(object) { + var applyAPItoObject = function (object) { var alreadySetted = true; @@ -616,7 +640,7 @@ module.exports = (function() { /** * tries to guess locales by scanning the given directory */ - var guessLocales = function(directory) { + var guessLocales = function (directory) { var entries = fs.readdirSync(directory); var localesFound = []; @@ -632,7 +656,7 @@ module.exports = (function() { /** * tries to guess locales from a given filename */ - var guessLocaleFromFile = function(filename) { + var guessLocaleFromFile = function (filename) { var extensionRegex = new RegExp(extension + '$', 'g'); var prefixRegex = new RegExp('^' + prefix, 'g'); @@ -645,9 +669,9 @@ module.exports = (function() { * guess language setting based on http headers */ - var guessLanguage = function(request) { + var guessLanguage = function (request) { if (typeof request === 'object') { - var languageHeader = request.headers? request.headers['accept-language'] : undefined, + var languageHeader = request.headers ? request.headers['accept-language'] : undefined, languages = [], regions = []; @@ -694,7 +718,7 @@ module.exports = (function() { // where the original, unsupported language existed. var acceptedLanguageIndex = acceptedLanguages.indexOf(lang); var fallbackIndex = acceptedLanguages.indexOf(fallback); - if(fallbackIndex > -1) { + if (fallbackIndex > -1) { acceptedLanguages.splice(fallbackIndex, 1); } acceptedLanguages.splice(acceptedLanguageIndex + 1, 0, fallback); @@ -741,7 +765,7 @@ module.exports = (function() { /** * Get a sorted list of accepted languages from the HTTP Accept-Language header */ - var getAcceptedLanguagesFromHeader = function(header) { + var getAcceptedLanguagesFromHeader = function (header) { var languages = header.split(','), preferences = {}; return languages.map(function parseLanguagePreference(item) { @@ -755,7 +779,7 @@ module.exports = (function() { preferences[preferenceParts[0]] = preferenceParts[1]; return preferenceParts[0]; - }).filter(function(lang) { + }).filter(function (lang) { return preferences[lang] > 0; }).sort(function sortLanguages(a, b) { return preferences[b] - preferences[a]; @@ -766,7 +790,7 @@ module.exports = (function() { * searches for locale in given object */ - var getLocaleFromObject = function(obj) { + var getLocaleFromObject = function (obj) { var locale; if (obj && obj.scope) { locale = obj.scope.locale; @@ -780,12 +804,12 @@ module.exports = (function() { /** * splits and parses a phrase for mathematical interval expressions */ - var parsePluralInterval = function(phrase, count) { + var parsePluralInterval = function (phrase, count) { var returnPhrase = phrase; var phrases = phrase.split(/\|/); // some() breaks on 1st true - phrases.some(function(p) { + phrases.some(function (p) { var matches = p.match(/^\s*([\(\)\[\]\d,]+)?\s*(.*)$/); // not the same as in combined condition @@ -810,7 +834,7 @@ module.exports = (function() { * [20,] - all numbers ≥20 (matches: 20, 21, 22, ...) * [,20] - all numbers ≤20 (matches: 20, 21, 22, ...) */ - var matchInterval = function(number, interval) { + var matchInterval = function (number, interval) { interval = parseInterval(interval); if (interval && typeof number === 'number') { if (interval.from.value === number) { @@ -829,7 +853,7 @@ module.exports = (function() { /** * read locale file, translate a msg and write to fs if new */ - var translate = function(locale, singular, plural, skipSyncToAllFiles) { + var translate = function (locale, singular, plural, skipSyncToAllFiles) { // add same key to all translations if (!skipSyncToAllFiles && syncFiles) { @@ -907,7 +931,7 @@ module.exports = (function() { * initialize the same key in all locales * when not already existing, checked via translate */ - var syncToAllFiles = function(singular, plural) { + var syncToAllFiles = function (singular, plural) { // iterate over locales and translate again // this will implicitly write/sync missing keys // to the rest of locales @@ -927,7 +951,7 @@ module.exports = (function() { * @returns {Function} A function that, when invoked, returns the current value stored * in the object at the requested location. */ - var localeAccessor = function(locale, singular, allowDelayedTraversal) { + var localeAccessor = function (locale, singular, allowDelayedTraversal) { // Bail out on non-existent locales to defend against internal errors. if (!locales[locale]) return Function.prototype; @@ -939,13 +963,13 @@ module.exports = (function() { // The accessor we're trying to find and which we want to return. var accessor = null; // An accessor that returns null. - var nullAccessor = function() { + var nullAccessor = function () { return null; }; // Do we need to re-traverse the tree upon invocation of the accessor? var reTraverse = false; // Split the provided term and run the callback for each subterm. - singular.split(objectNotation).reduce(function(object, index) { + singular.split(objectNotation).reduce(function (object, index) { // Make the accessor return null. accessor = nullAccessor; // If our current target object (in the locale tree) doesn't exist or @@ -957,7 +981,7 @@ module.exports = (function() { return null; } // We can traverse deeper, so we generate an accessor for this current level. - accessor = function() { + accessor = function () { return object[index]; }; // Return a reference to the next deeper level in the locale tree. @@ -965,7 +989,7 @@ module.exports = (function() { }, locales[locale]); // Return the requested accessor. - return function() { + return function () { // If we need to re-traverse (because we didn't find our target term) // traverse again and return the new result (but don't allow further iterations) // or return the previously found accessor if it was already valid. @@ -974,7 +998,7 @@ module.exports = (function() { } else { // No object notation, just return an accessor that performs array lookup. - return function() { + return function () { return locales[locale][singular]; }; } @@ -993,7 +1017,7 @@ module.exports = (function() { * @returns {Function} A function that takes one argument. When the function is * invoked, the targeted translation term will be set to the given value inside the locale table. */ - var localeMutator = function(locale, singular, allowBranching) { + var localeMutator = function (locale, singular, allowBranching) { // Bail out on non-existent locales to defend against internal errors. if (!locales[locale]) return Function.prototype; @@ -1005,17 +1029,17 @@ module.exports = (function() { // This will become the function we want to return. var accessor = null; // An accessor that takes one argument and returns null. - var nullAccessor = function() { + var nullAccessor = function () { return null; }; // Fix object path. - var fixObject = function() { + var fixObject = function () { return {}; }; // Are we going to need to re-traverse the tree when the mutator is invoked? var reTraverse = false; // Split the provided term and run the callback for each subterm. - singular.split(objectNotation).reduce(function(object, index) { + singular.split(objectNotation).reduce(function (object, index) { // Make the mutator do nothing. accessor = nullAccessor; // If our current target object (in the locale tree) doesn't exist or @@ -1037,12 +1061,12 @@ module.exports = (function() { } } // Generate a mutator for the current level. - accessor = function(value) { + accessor = function (value) { object[index] = value; return value; }; // Generate a fixer for the current level. - fixObject = function() { + fixObject = function () { object[index] = {}; return object[index]; }; @@ -1053,7 +1077,7 @@ module.exports = (function() { }, locales[locale]); // Return the final mutator. - return function(value) { + return function (value) { // If we need to re-traverse the tree // invoke the search again, but allow branching // this time (because here the mutator is being invoked) @@ -1063,7 +1087,7 @@ module.exports = (function() { } else { // No object notation, just return a mutator that performs array lookup and changes the value. - return function(value) { + return function (value) { locales[locale][singular] = value; return value; }; @@ -1073,7 +1097,7 @@ module.exports = (function() { /** * try reading a file */ - var read = function(locale) { + var read = function (locale) { var localeFile = {}, file = getStorageFilePath(locale); try { @@ -1105,7 +1129,7 @@ module.exports = (function() { /** * try writing a file in a created directory */ - var write = function(locale) { + var write = function (locale) { var stats, target, tmp; // don't write new locale information to disk if updateFiles isn't true @@ -1147,7 +1171,7 @@ module.exports = (function() { /** * basic normalization of filepath */ - var getStorageFilePath = function(locale) { + var getStorageFilePath = function (locale) { // changed API to use .json as default, #16 var ext = extension || '.json', filepath = path.normalize(directory + pathsep + prefix + locale + ext), diff --git a/package.json b/package.json index e9a676e7..bd642a82 100644 --- a/package.json +++ b/package.json @@ -18,12 +18,14 @@ "lib": "." }, "dependencies": { + "chokidar": "^1.6.1", "debug": "*", - "make-plural": "^3.0.3", + "make-plural": "^4", "math-interval-parser": "^1.1.0", - "messageformat": "^0.3.1", + "messageformat": "^0", "mustache": "*", - "sprintf-js": ">=1.0.3" + "sprintf-js": ">=1.0.3", + "upath": "^1.0.0" }, "devDependencies": { "async": "*", diff --git a/test/.jshintrc b/test/.jshintrc new file mode 100644 index 00000000..fcf55dc6 --- /dev/null +++ b/test/.jshintrc @@ -0,0 +1,14 @@ +{ + "extends": "../.jshintrc", + "globals": { + "describe": true, + "it": true, + "before": true, + "beforeEach": true, + "after": true, + "afterEach": true, + "should": true + }, + "browser": true, + "node": true +} \ No newline at end of file diff --git a/test/i18n.configureAutoreload.js b/test/i18n.configureAutoreload.js index c3caf7a7..ef7ad4ed 100644 --- a/test/i18n.configureAutoreload.js +++ b/test/i18n.configureAutoreload.js @@ -1,7 +1,9 @@ +'use strict'; var i18n = require('../i18n'), - should = require("should"), - fs = require('fs'), - path = require('path'); + should = require('should'), + fs = require('fs'), + path = require('path') +; var i18nPath = 'i18n'; var i18nFilename = path.resolve(i18nPath + '.js'); @@ -18,7 +20,7 @@ describe('autoreload configuration', function() { var testScope = {}; var directory = path.resolve(__dirname + '/../testlocalesauto'); - it('will start with empty catalogs', function(done) { + before('will start with empty catalogs', function(done) { fs.mkdirSync(directory); fs.writeFileSync(directory + '/de.json', '{}'); fs.writeFileSync(directory + '/en.json', '{}'); @@ -49,7 +51,7 @@ describe('autoreload configuration', function() { done(); }); - it('will remove testlocalesauto after tests', function() { + after('will remove testlocalesauto after tests', function() { fs.unlinkSync(directory + '/de.json'); fs.unlinkSync(directory + '/en.json'); fs.rmdirSync(directory); @@ -61,7 +63,7 @@ describe('autoreload configuration with prefix', function() { var testScope = {}; var directory = path.resolve(__dirname + '/../testlocalesautoprefixed'); - it('will start with empty catalogs', function(done) { + before('will start with empty catalogs', function(done) { fs.mkdirSync(directory); fs.writeFileSync(directory + '/customprefix-de.json', '{}'); fs.writeFileSync(directory + '/customprefix-en.json', '{}'); @@ -93,7 +95,7 @@ describe('autoreload configuration with prefix', function() { done(); }); - it('will remove testlocalesautoprefixed after tests', function() { + after('will remove testlocalesautoprefixed after tests', function() { fs.unlinkSync(directory + '/customprefix-de.json'); fs.unlinkSync(directory + '/customprefix-en.json'); fs.rmdirSync(directory); @@ -106,7 +108,7 @@ describe('autoreload configuration with prefix and customextension', function() var testScope = {}; var directory = path.resolve(__dirname + '/../testlocalesautoprefixedext'); - it('will start with empty catalogs', function(done) { + before('will start with empty catalogs', function(done) { fs.mkdirSync(directory); fs.writeFileSync(directory + '/customprefix-de.customextension', '{}'); fs.writeFileSync(directory + '/customprefix-en.customextension', '{}'); @@ -139,7 +141,7 @@ describe('autoreload configuration with prefix and customextension', function() done(); }); - it('will remove testlocalesautoprefixed after tests', function() { + after('will remove testlocalesautoprefixed after tests', function() { fs.unlinkSync(directory + '/customprefix-de.customextension'); fs.unlinkSync(directory + '/customprefix-en.customextension'); fs.rmdirSync(directory); @@ -152,7 +154,7 @@ describe('autoreload configuration with customextension', function() { var testScope = {}; var directory = path.resolve(__dirname + '/../testlocalesautocustomextension'); - it('will start with empty catalogs', function(done) { + before('will start with empty catalogs', function(done) { fs.mkdirSync(directory); fs.writeFileSync(directory + '/de.customextension', '{}'); fs.writeFileSync(directory + '/en.customextension', '{}'); @@ -184,10 +186,81 @@ describe('autoreload configuration with customextension', function() { done(); }); - it('will remove testlocalesautoprefixed after tests', function() { + after('will remove testlocalesautoprefixed after tests', function() { fs.unlinkSync(directory + '/de.customextension'); fs.unlinkSync(directory + '/en.customextension'); fs.rmdirSync(directory); }); +}); + +describe('autoreload disabling', function() { + var testScope = {}, + directory = path.resolve(__dirname + '/../testlocalesautodisable') + ; + function clearFS() { + fs.unlinkSync(directory + '/de.json'); + fs.unlinkSync(directory + '/en.json'); + fs.rmdirSync(directory); + } + + beforeEach('will start with empty catalogs', function(done) { + try {clearFS();} catch (err){} + fs.mkdirSync(directory); + fs.writeFileSync(directory + '/de.json', '{}'); + fs.writeFileSync(directory + '/en.json', '{}'); + setTimeout(done, timeout); + }); + + it('should disable autoloading via i18n.disableReload()', function (done) { + reconfigure({ + directory: directory, + register: testScope, + autoReload: true + }); + setTimeout(function () { + should.deepEqual(i18n.getCatalog(), { de: {}, en: {} }); + + i18n.disableReload(); + fs.writeFileSync(directory + '/de.json', '{"Hello":"Hallo"}'); + setTimeout(function () { + i18n.setLocale(testScope, 'de'); + should.deepEqual(i18n.getCatalog(), { de: {}, en: {} }); + should.equal('Hello', testScope.__('Hello')); + done(); + }, timeout); + }, timeout); + }); + + it('should disable autoloading via i18n.config()', function (done) { + reconfigure({ + directory: directory, + register: testScope, + autoReload: true + }); + setTimeout(function () { + should.deepEqual(i18n.getCatalog(), { de: {}, en: {} }); + + i18n.configure({ + directory: directory, + register: testScope, + autoReload: false + }); + setTimeout(function () { + fs.writeFileSync(directory + '/de.json', '{"Hello":"Hallo"}'); + setTimeout(function () { + i18n.setLocale(testScope, 'de'); + should.deepEqual(i18n.getCatalog(), { de: {}, en: {} }); + should.notEqual('Hallo', testScope.__('Hello')); + done(); + }, timeout); + }, timeout); + }, timeout); + }); + + afterEach('will remove /testlocalesautodisable after tests', function (done) { + clearFS(); + done(); + }); + }); \ No newline at end of file From a77d6ffffc448f0ac1d3fa36f051d46536bf1026 Mon Sep 17 00:00:00 2001 From: Spown Date: Tue, 24 Oct 2017 05:22:17 +0200 Subject: [PATCH 2/5] ~ v0.8.4; steadfestiness of setLocale --- .jshintrc | 3 --- i18n.js | 12 +++++++++++- package.json | 2 +- test/i18n.setup.js | 7 +++++-- 4 files changed, 17 insertions(+), 7 deletions(-) diff --git a/.jshintrc b/.jshintrc index 0f190b1c..bccad5a7 100644 --- a/.jshintrc +++ b/.jshintrc @@ -34,9 +34,6 @@ // Prohibit use of a variable before it is defined. "latedef": false, - // Enforce line length to 100 characters - "maxlen": 120, - // Require capitalized names for constructor functions. "newcap": true, diff --git a/i18n.js b/i18n.js index dd2da07b..a0bc29d5 100644 --- a/i18n.js +++ b/i18n.js @@ -430,8 +430,18 @@ module.exports = (function () { targetLocale = fallbacks[targetLocale]; } + //disallow alien locales + if (!locales[targetLocale]) { + targetLocale = defaultLocale; + } + + if (!targetLocale || !targetObject) { + error(`setLocale should be supplied with a valid locale (currently: ${typeof targetLocale}) and applied to a valid type of object (currently: ${typeof targetObject})`); + return false; + } + // now set locale on object - targetObject.locale = locales[targetLocale] ? targetLocale : defaultLocale; + targetObject.locale = targetLocale; // consider any extra registered objects if (typeof register === 'object') { diff --git a/package.json b/package.json index bd642a82..401ae4e7 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "i18n", "description": "lightweight translation module with dynamic json storage", - "version": "0.8.3", + "version": "0.8.4", "homepage": "http://github.com/mashpie/i18n-node", "repository": { "type": "git", diff --git a/test/i18n.setup.js b/test/i18n.setup.js index dca4b01a..4025f507 100644 --- a/test/i18n.setup.js +++ b/test/i18n.setup.js @@ -1,5 +1,8 @@ +'use strict'; var i18n = require('../i18n'), - should = require("should"); + pkg = require('../package.json'), + should = require("should") + ; i18n.configure({ locales: ['en', 'de'], @@ -10,7 +13,7 @@ i18n.configure({ describe('Module Setup', function () { it('should export a valid version', function () { - should.equal(i18n.version, '0.8.3'); + should.equal(i18n.version, pkg.version); }); it('should export configure as i18nConfigure', function () { From 3ad9b7859c7ae63522a72cf52bbbdb72d39e283f Mon Sep 17 00:00:00 2001 From: Spown Date: Tue, 24 Oct 2017 06:15:58 +0200 Subject: [PATCH 3/5] ~ m --- i18n.js | 2 +- test/i18n.setup.js | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/i18n.js b/i18n.js index a0bc29d5..0d2745b4 100644 --- a/i18n.js +++ b/i18n.js @@ -436,7 +436,7 @@ module.exports = (function () { } if (!targetLocale || !targetObject) { - error(`setLocale should be supplied with a valid locale (currently: ${typeof targetLocale}) and applied to a valid type of object (currently: ${typeof targetObject})`); + error('setLocale should be supplied with a valid locale (currently: '+typeof targetLocale+') and applied to a valid type of object (currently: '+typeof targetObject+')'); return false; } diff --git a/test/i18n.setup.js b/test/i18n.setup.js index 4025f507..17ea84fa 100644 --- a/test/i18n.setup.js +++ b/test/i18n.setup.js @@ -1,7 +1,6 @@ -'use strict'; var i18n = require('../i18n'), pkg = require('../package.json'), - should = require("should") + should = require('should') ; i18n.configure({ @@ -12,6 +11,7 @@ i18n.configure({ }); describe('Module Setup', function () { + 'use strict'; it('should export a valid version', function () { should.equal(i18n.version, pkg.version); }); From 9b98552913c4bfa34f3b31d84be1c543f64e41fc Mon Sep 17 00:00:00 2001 From: Spown Date: Tue, 24 Oct 2017 06:20:08 +0200 Subject: [PATCH 4/5] ~ ci; mocha ^3.5.3 --- .travis.yml | 3 ++- appveyor.yml | 2 ++ package.json | 2 +- 3 files changed, 5 insertions(+), 2 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6e0fd28a..5c9e61a9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,12 @@ language: node_js node_js: - 0.10 - - 0.11 - 0.12 - 4 - 5 - 6 + - 7 + - 8 - iojs branches: only: diff --git a/appveyor.yml b/appveyor.yml index 82f420d5..b85f3a19 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -5,6 +5,8 @@ environment: - nodejs_version: "4" - nodejs_version: "5" - nodejs_version: "6" + - nodejs_version: "7" + - nodejs_version: "8" - nodejs_version: "iojs" branches: only: diff --git a/package.json b/package.json index 401ae4e7..c4d4ace1 100644 --- a/package.json +++ b/package.json @@ -32,7 +32,7 @@ "cookie-parser": "^1.4.1", "express": "^4.13.4", "jshint": "*", - "mocha": "*", + "mocha": "^3.5.3", "should": "*", "sinon": "*", "url": "^0.11.0", From 3a7042d400d4fb78f085faa13438cf701f1a0c87 Mon Sep 17 00:00:00 2001 From: Spown Date: Tue, 24 Oct 2017 22:32:44 +0200 Subject: [PATCH 5/5] ~ ci; --- .travis.yml | 3 +- appveyor.yml | 3 +- i18n.js | 11 +- package-lock.json | 2498 ++++++++++++++++++++++++++++++ package.json | 23 +- test/helpers/reconfig.js | 12 + test/i18n.api.global.js | 71 +- test/i18n.configureApi.js | 28 +- test/i18n.configureAutoreload.js | 83 +- test/i18n.mf.js | 7 +- 10 files changed, 2620 insertions(+), 119 deletions(-) create mode 100644 package-lock.json create mode 100644 test/helpers/reconfig.js diff --git a/.travis.yml b/.travis.yml index 5c9e61a9..ec18ec05 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,12 +2,11 @@ language: node_js node_js: - 0.10 - 0.12 + - iojs - 4 - 5 - 6 - 7 - - 8 - - iojs branches: only: - master diff --git a/appveyor.yml b/appveyor.yml index b85f3a19..909fca24 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -2,12 +2,11 @@ environment: matrix: - nodejs_version: "0.10" - nodejs_version: "0.12" + - nodejs_version: "iojs" - nodejs_version: "4" - nodejs_version: "5" - nodejs_version: "6" - nodejs_version: "7" - - nodejs_version: "8" - - nodejs_version: "iojs" branches: only: - master diff --git a/i18n.js b/i18n.js index 0d2745b4..2e0015d6 100644 --- a/i18n.js +++ b/i18n.js @@ -3,7 +3,7 @@ * @link https://github.com/mashpie/i18n-node * @license http://opensource.org/licenses/MIT * - * @version 0.8.3 + * @version 0.8.4 */ 'use strict'; @@ -72,8 +72,8 @@ module.exports = (function () { i18n.version = pkg.version; i18n.disableReload = function disableReload() { - if (fsWatcher && fsWatcher.closed === false) { - fsWatcher.close(); + if (fsWatcher) { + return fsWatcher.close(); } }; @@ -182,8 +182,7 @@ module.exports = (function () { fsWatcher.on('all', function (event, filePath) { var fileName = upath.basename(filePath), localeFromFile = guessLocaleFromFile(fileName); - //console.log(' fsWatcher.on', event, fileName); - if (event === 'change' && localeFromFile && opt.locales.indexOf(localeFromFile) > -1) { + if (event === 'change' && localeFromFile && ~opt.locales.indexOf(localeFromFile)) { logDebug('Auto reloading locale file "' + fileName + '".'); read(localeFromFile); } @@ -1194,7 +1193,7 @@ module.exports = (function () { return filepathJS; } } catch (e) { - logDebug('will use ' + filepath); + //logDebug('will use ' + filepath); } return filepath; }; diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 00000000..22241bd4 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,2498 @@ +{ + "name": "i18n", + "version": "0.8.4", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "dev": true + }, + "abbrev": { + "version": "http://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=" + }, + "accepts": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.4.tgz", + "integrity": "sha1-hiRnWMfdbSGmR0/whKR0DsBesh8=", + "dev": true, + "requires": { + "mime-types": "2.1.17", + "negotiator": "0.6.1" + } + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "dev": true + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "dev": true, + "requires": { + "acorn": "2.7.0" + } + }, + "ajv": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.3.0.tgz", + "integrity": "sha1-RBT/dKUIecII7l/cgm4ywwNUnto=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ambi": { + "version": "http://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", + "integrity": "sha1-fI43K+SIkRV+fOoBy2+RQ9H3QiA=", + "requires": { + "editions": "http://registry.npmjs.org/editions/-/editions-1.3.3.tgz", + "typechecker": "http://registry.npmjs.org/typechecker/-/typechecker-4.4.1.tgz" + }, + "dependencies": { + "typechecker": { + "version": "http://registry.npmjs.org/typechecker/-/typechecker-4.4.1.tgz", + "integrity": "sha1-+XuV9RsDhBchLWd9RaNz7nvO1+Y=", + "requires": { + "editions": "http://registry.npmjs.org/editions/-/editions-1.3.3.tgz" + } + } + } + }, + "any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha1-q8av7tzqUugJzcA3au0845Y10X8=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==" + }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "async": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/async/-/async-2.5.0.tgz", + "integrity": "sha512-e+lJAJeNWuPCNyxZKOBdaJGyLGHugXVQtrAwtuAe2vhxTYxFTKE73p8JuTmdH0qdQZtDvI4dhJwjZc5zsfIsYw==", + "dev": true, + "requires": { + "lodash": "4.17.4" + }, + "dependencies": { + "lodash": { + "version": "4.17.4", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.4.tgz", + "integrity": "sha1-eCA6TRwyiuHYbcpkYONptX9AVa4=", + "dev": true + } + } + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-runtime": { + "version": "5.8.29", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-5.8.29.tgz", + "integrity": "sha1-SiBSy8/1MXiNOp1rA81/RIKF+CU=", + "dev": true, + "requires": { + "core-js": "1.2.7" + } + }, + "balanced-match": { + "version": "http://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "binary-extensions": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.10.0.tgz", + "integrity": "sha1-muuabF6IY4qtFx4Wf1kAq+JINdA=" + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.5.1.tgz", + "integrity": "sha512-MKiLiV+I1AA596t9w1sQJ8jkiSr5+ZKi0WKrYGUn6d1Fx+Ij4tIj+m2WMQSGczs5jZVxV339chE8iwk6F64wjA==", + "dev": true + }, + "body-parser": { + "version": "1.18.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.2.tgz", + "integrity": "sha1-h2eKGdhLR9hZuDGZvVm84iKxBFQ=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "content-type": "1.0.4", + "debug": "2.6.9", + "depd": "1.1.1", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "on-finished": "2.3.0", + "qs": "6.5.1", + "raw-body": "2.3.2", + "type-is": "1.6.15" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "brace-expansion": { + "version": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "requires": { + "balanced-match": "http://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "concat-map": "http://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "glob-parent": "2.0.0", + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "readdirp": "2.1.0" + } + }, + "cli": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz", + "integrity": "sha1-IoF1NPJL+klQw01TLUjsvGIbjBQ=", + "dev": true, + "requires": { + "exit": "0.1.2", + "glob": "7.1.2" + }, + "dependencies": { + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "http://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "http://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "3.0.4", + "once": "http://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coffee-script": { + "version": "http://registry.npmjs.org/coffee-script/-/coffee-script-1.12.5.tgz", + "integrity": "sha1-gJ9FhUGRErv+RqBzrXVDrxjCc0Y=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "dev": true, + "requires": { + "graceful-readlink": "1.0.1" + } + }, + "concat-map": { + "version": "http://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "console-browserify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz", + "integrity": "sha1-8CQcRXMKn8YyOyBtvzjtx0HQuxA=", + "dev": true, + "requires": { + "date-now": "0.1.4" + } + }, + "content-disposition": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.2.tgz", + "integrity": "sha1-DPaLud318r55YcOoUXjLhdunjLQ=", + "dev": true + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "dev": true + }, + "cookie": { + "version": "http://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "integrity": "sha1-5+Ch+e9DtMi6klxcWpboBtFoc7s=", + "dev": true + }, + "cookie-parser": { + "version": "http://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.3.tgz", + "integrity": "sha1-D+MfoZ0AC5X0qt8fU/3CuKIDuqU=", + "dev": true, + "requires": { + "cookie": "http://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "cookie-signature": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz" + } + }, + "cookie-signature": { + "version": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=", + "dev": true + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + } + } + }, + "csextends": { + "version": "http://registry.npmjs.org/csextends/-/csextends-1.1.1.tgz", + "integrity": "sha1-zFPBNJ+vfwrmzfb2xKTZFW08TsE=", + "requires": { + "coffee-script": "http://registry.npmjs.org/coffee-script/-/coffee-script-1.12.5.tgz" + } + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "dev": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "dev": true, + "requires": { + "cssom": "0.3.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "date-now": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz", + "integrity": "sha1-6vQ5/U1ISK105cx9vvIAZyueNFs=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "depd": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.1.tgz", + "integrity": "sha1-V4O04cRZ8G+lyif5kfPQbnoxA1k=", + "dev": true + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=", + "dev": true + }, + "diff": { + "version": "http://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "eachr": { + "version": "http://registry.npmjs.org/eachr/-/eachr-2.0.4.tgz", + "integrity": "sha1-Rm98qhBwj2EFCeMsgHqv5X/BIr8=", + "requires": { + "typechecker": "http://registry.npmjs.org/typechecker/-/typechecker-2.1.0.tgz" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "editions": { + "version": "http://registry.npmjs.org/editions/-/editions-1.3.3.tgz", + "integrity": "sha1-CQcQG92iD6w8vjNMJ8vQaI3Jmls=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=", + "dev": true + }, + "encodeurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.1.tgz", + "integrity": "sha1-eePVhlU0aQn+bw9Fpd5oEDspTSA=", + "dev": true + }, + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=", + "dev": true + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "escodegen": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.0.tgz", + "integrity": "sha512-v0MYvNQ32bzwoG2OSFzWAkuahDQHK92JBN0pTAALJ4RIxEZe766QJPDR8Hqy7XNUy5K3fnVL76OqYAdc4TZEIw==", + "dev": true, + "requires": { + "esprima": "3.1.3", + "estraverse": "4.2.0", + "esutils": "2.0.2", + "optionator": "0.8.2", + "source-map": "0.5.7" + } + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "dev": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=", + "dev": true + }, + "eventsource": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-0.1.6.tgz", + "integrity": "sha1-Cs7ehJ7X3RzMMsgRuxG5RNTykjI=", + "dev": true, + "requires": { + "original": "1.0.0" + } + }, + "exit": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", + "integrity": "sha1-BjJjj42HfMghB9MKD/8aF8uhzQw=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "2.2.3" + } + }, + "express": { + "version": "4.16.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.16.2.tgz", + "integrity": "sha1-41xt/i1kt9ygpc1PIXgb4ymeB2w=", + "dev": true, + "requires": { + "accepts": "1.3.4", + "array-flatten": "1.1.1", + "body-parser": "1.18.2", + "content-disposition": "0.5.2", + "content-type": "1.0.4", + "cookie": "http://registry.npmjs.org/cookie/-/cookie-0.3.1.tgz", + "cookie-signature": "http://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "debug": "2.6.9", + "depd": "1.1.1", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "finalhandler": "1.1.0", + "fresh": "0.5.2", + "merge-descriptors": "1.0.1", + "methods": "1.1.2", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "path-to-regexp": "0.1.7", + "proxy-addr": "2.0.2", + "qs": "6.5.1", + "range-parser": "1.2.0", + "safe-buffer": "5.1.1", + "send": "0.16.1", + "serve-static": "1.13.1", + "setprototypeof": "1.1.0", + "statuses": "1.3.1", + "type-is": "1.6.15", + "utils-merge": "1.0.1", + "vary": "1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extendr": { + "version": "http://registry.npmjs.org/extendr/-/extendr-2.1.0.tgz", + "integrity": "sha1-MBqgu+pWX00tyPVw8qImEahSe1Y=", + "requires": { + "typechecker": "http://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz" + }, + "dependencies": { + "typechecker": { + "version": "http://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz", + "integrity": "sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=" + } + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "extract-opts": { + "version": "http://registry.npmjs.org/extract-opts/-/extract-opts-2.2.0.tgz", + "integrity": "sha1-H6KOunNSxttID4hc63GkaBC+bX0=", + "requires": { + "typechecker": "http://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz" + }, + "dependencies": { + "typechecker": { + "version": "http://registry.npmjs.org/typechecker/-/typechecker-2.0.8.tgz", + "integrity": "sha1-6D2oS7ZMWEzLNFg4V2xAsDN9uC4=" + } + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha1-zgtoVbRYU+eRsvzGgARtiCU91/U=", + "dev": true, + "requires": { + "debug": "2.6.9", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "on-finished": "2.3.0", + "parseurl": "1.3.2", + "statuses": "1.3.1", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "1.0.2" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.17" + } + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true, + "requires": { + "samsam": "1.3.0" + } + }, + "forwarded": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", + "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=", + "dev": true + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=", + "dev": true + }, + "fs-extra": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-2.1.2.tgz", + "integrity": "sha1-BGxwFjzvmq1GsOSn+kZ/si1x3jU=", + "dev": true, + "requires": { + "graceful-fs": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "jsonfile": "2.4.0" + } + }, + "fs-promise": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/fs-promise/-/fs-promise-2.0.3.tgz", + "integrity": "sha1-9k5PhUvPaJqovdy6JokW2z20aFQ=", + "dev": true, + "requires": { + "any-promise": "1.3.0", + "fs-extra": "2.1.2", + "mz": "2.7.0", + "thenify-all": "1.6.0" + } + }, + "fs.realpath": { + "version": "http://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + } + }, + "glob": { + "version": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "http://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "once": "http://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "2.0.1" + } + }, + "graceful-fs": { + "version": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "dev": true + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.3.0", + "har-schema": "2.0.0" + } + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.0", + "sntp": "2.0.2" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.0.tgz", + "integrity": "sha512-v0XCLxICi9nPfYrS9RL8HbYnXi9obYAeLbSP00BmnZwCK9+Ih9WOjoZ8YoHCoav2csqn4FOz4Orldsy2dmDwmQ==", + "dev": true + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "dev": true, + "requires": { + "domelementtype": "1.3.0", + "domhandler": "2.3.0", + "domutils": "1.5.1", + "entities": "1.0.0", + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "http-errors": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.6.2.tgz", + "integrity": "sha1-CgAsyFcHGSp+eUbO7cERVfYOxzY=", + "dev": true, + "requires": { + "depd": "1.1.1", + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "setprototypeof": "1.0.3", + "statuses": "1.3.1" + }, + "dependencies": { + "setprototypeof": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.0.3.tgz", + "integrity": "sha1-ZlZ+NwQ+608E2RvWWMDL77VbjgQ=", + "dev": true + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==", + "dev": true + }, + "ignorefs": { + "version": "http://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", + "integrity": "sha1-2ln7hYl25KXkNwLM0fKC/byeV1Y=", + "requires": { + "editions": "http://registry.npmjs.org/editions/-/editions-1.3.3.tgz", + "ignorepatterns": "http://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz" + } + }, + "ignorepatterns": { + "version": "http://registry.npmjs.org/ignorepatterns/-/ignorepatterns-1.1.0.tgz", + "integrity": "sha1-rI9DbyI5td+2bV8NOpBKh6xnzF4=" + }, + "inflight": { + "version": "http://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "http://registry.npmjs.org/once/-/once-1.4.0.tgz", + "wrappy": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "inherits": { + "version": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ipaddr.js": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.5.2.tgz", + "integrity": "sha1-1LUFvemUaYfM8PxY2QEP+WB+P6A=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "1.10.0" + } + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "3.2.2" + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "dev": true, + "requires": { + "abab": "1.0.4", + "acorn": "2.7.0", + "acorn-globals": "1.0.9", + "cssom": "0.3.2", + "cssstyle": "0.2.37", + "escodegen": "1.9.0", + "nwmatcher": "1.4.3", + "parse5": "1.5.1", + "request": "2.83.0", + "sax": "1.2.4", + "symbol-tree": "3.2.2", + "tough-cookie": "2.3.3", + "webidl-conversions": "2.0.1", + "whatwg-url-compat": "0.6.5", + "xml-name-validator": "2.0.1" + } + }, + "jshint": { + "version": "2.9.5", + "resolved": "https://registry.npmjs.org/jshint/-/jshint-2.9.5.tgz", + "integrity": "sha1-HnJSkVzmgbQIJ+4UJIxG006apiw=", + "dev": true, + "requires": { + "cli": "1.0.1", + "console-browserify": "1.1.0", + "exit": "0.1.2", + "htmlparser2": "3.8.3", + "lodash": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "minimatch": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "shelljs": "0.3.0", + "strip-json-comments": "1.0.4" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jsonfile": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz", + "integrity": "sha1-NzaitCi4e72gzIO1P6PWM6NcKug=", + "dev": true, + "requires": { + "graceful-fs": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "just-extend": { + "version": "1.1.26", + "resolved": "https://registry.npmjs.org/just-extend/-/just-extend-1.1.26.tgz", + "integrity": "sha512-IIG0FXHB/XpUZ7vGbktoc2EGsF+fLHJ1tU+vaqoKkVRBwH2FDxLTmkGkSp0XHRp6Y3KGZPIldH1YW8lOluGYrA==", + "dev": true + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "lodash": { + "version": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "integrity": "sha1-Nni9irmVBXwHreg27S7wh9qBHUU=" + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash.keys": "3.1.2" + } + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true, + "requires": { + "lodash._baseassign": "3.2.0", + "lodash._basecreate": "3.0.3", + "lodash._isiterateecall": "3.0.9" + } + }, + "lodash.get": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", + "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lolex": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-2.1.3.tgz", + "integrity": "sha512-BdHq78SeI+6PAUtl4atDuCt7L6E4fab3mSRtqxm4ywaXe4uP7jZ0TTcFNuU20syUjxZc2l7jFqKVMJ+AX0LnpQ==", + "dev": true + }, + "make-plural": { + "version": "http://registry.npmjs.org/make-plural/-/make-plural-4.0.1.tgz", + "integrity": "sha1-vpy3P1Q0GgKJaZtqv2Q5c9O+3VM=", + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + } + }, + "math-interval-parser": { + "version": "http://registry.npmjs.org/math-interval-parser/-/math-interval-parser-1.1.0.tgz", + "integrity": "sha1-2+2lsGsySZc8bfYXD94jhvCv2JM=", + "requires": { + "xregexp": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz" + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=", + "dev": true + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=", + "dev": true + }, + "messageformat": { + "version": "http://registry.npmjs.org/messageformat/-/messageformat-0.3.1.tgz", + "integrity": "sha1-5Y//gkXps5cXmeW0PbWLPpQX9aI=", + "requires": { + "async": "1.5.2", + "glob": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "make-plural": "http://registry.npmjs.org/make-plural/-/make-plural-3.0.6.tgz", + "nopt": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "watchr": "http://registry.npmjs.org/watchr/-/watchr-2.4.13.tgz" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + }, + "make-plural": { + "version": "http://registry.npmjs.org/make-plural/-/make-plural-3.0.6.tgz", + "integrity": "sha1-IDOgO6wpC487uRJY9lud9+iwHKc=", + "requires": { + "minimist": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz" + } + } + } + }, + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "dev": true + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "dev": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "dev": true, + "requires": { + "mime-db": "1.30.0" + } + }, + "minimatch": { + "version": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha1-Kk5AkLlrLbBqnX3wEFWmKnfJt3Q=", + "requires": { + "brace-expansion": "http://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz" + } + }, + "minimist": { + "version": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.5.3.tgz", + "integrity": "sha512-/6na001MJWEtYxHOV1WLfsmR4YIynkUEhBwzsb+fk2qmQ3iqsi258l/Q2MWHJMImAcNpZ8DEdYAK72NHoIQ9Eg==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.9.0", + "debug": "2.6.8", + "diff": "http://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "escape-string-regexp": "1.0.5", + "glob": "7.1.1", + "growl": "1.9.2", + "he": "1.1.1", + "json3": "3.3.2", + "lodash.create": "3.1.1", + "mkdirp": "0.5.1", + "supports-color": "3.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true, + "requires": { + "fs.realpath": "http://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "inflight": "http://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "minimatch": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "once": "http://registry.npmjs.org/once/-/once-1.4.0.tgz", + "path-is-absolute": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mustache": { + "version": "http://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=" + }, + "mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dev": true, + "requires": { + "any-promise": "1.3.0", + "object-assign": "4.1.1", + "thenify-all": "1.6.0" + } + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", + "dev": true + }, + "negotiator": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.1.tgz", + "integrity": "sha1-KzJxhOiZIQEXeyhWP7XnECrNDKk=", + "dev": true + }, + "nise": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/nise/-/nise-1.2.0.tgz", + "integrity": "sha512-q9jXh3UNsMV28KeqI43ILz5+c3l+RiNW8mhurEwCKckuHQbL+hTJIKKTiUlCPKlgQ/OukFvSnKB/Jk3+sFbkGA==", + "dev": true, + "requires": { + "formatio": "1.2.0", + "just-extend": "1.1.26", + "lolex": "1.6.0", + "path-to-regexp": "1.7.0", + "text-encoding": "0.6.4" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "nopt": { + "version": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "http://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "nwmatcher": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.3.tgz", + "integrity": "sha512-IKdSTiDWCarf2JTS5e9e2+5tPZGdkRJ79XjYV0pzK8Q9BpsFyBq1RGKxzs7Q8UBushGw7m6TzVKz6fcY99iSWw==", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "dev": true, + "requires": { + "ee-first": "1.1.1" + } + }, + "once": { + "version": "http://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=", + "dev": true + }, + "original": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/original/-/original-1.0.0.tgz", + "integrity": "sha1-kUf5P6FpbQS+YeAb1QuurKZWvTs=", + "dev": true, + "requires": { + "url-parse": "1.0.5" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "dev": true + }, + "parseurl": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.2.tgz", + "integrity": "sha1-/CidTtiZMRlGDBViUyYs3I3mW/M=", + "dev": true + }, + "path-is-absolute": { + "version": "http://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "proxy-addr": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.2.tgz", + "integrity": "sha1-ZXFQT0e7mI7IGAJT+F3X4UlSvew=", + "dev": true, + "requires": { + "forwarded": "0.1.2", + "ipaddr.js": "1.5.2" + } + }, + "punycode": { + "version": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=", + "dev": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "querystring": { + "version": "http://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz", + "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=", + "dev": true + }, + "querystringify": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-0.0.4.tgz", + "integrity": "sha1-DPf4T5Rj/wrlHExLFC2VvjdyTZw=", + "dev": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "1.1.5" + } + } + } + }, + "range-parser": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.0.tgz", + "integrity": "sha1-9JvmtIeJTdxA3MlKMi9hEJLgDV4=", + "dev": true + }, + "raw-body": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.2.tgz", + "integrity": "sha1-vNYMd9Prk83gBQKVw/N5OJvIj4k=", + "dev": true, + "requires": { + "bytes": "3.0.0", + "http-errors": "1.6.2", + "iconv-lite": "0.4.19", + "unpipe": "1.0.0" + } + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.3.tgz", + "integrity": "sha512-m+qzzcn7KUxEmd1gMbchF+Y2eIUbieUaxkWtptyHywrX0rE8QEYqPC07Vuy4Wm32/xE16NcdBctb8S0Xe/5IeQ==", + "requires": { + "core-util-is": "1.0.2", + "inherits": "http://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "minimatch": "http://registry.npmjs.org/minimatch/-/minimatch-3.0.3.tgz", + "readable-stream": "2.3.3", + "set-immediate-shim": "1.0.1" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.1", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.17", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.1.0" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==" + }, + "safefs": { + "version": "http://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", + "integrity": "sha1-gXDBRE1wOOCMrqBaN0+uL6NJ4Vw=", + "requires": { + "graceful-fs": "http://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz" + } + }, + "samsam": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.3.0.tgz", + "integrity": "sha512-1HwIYD/8UlOtFS3QO3w7ey+SdSDFE4HRNLZoZRYVQefrOY3l17epswImeB1ijgJFQJodIaHcwkp3r/myBjFVbg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "scandirectory": { + "version": "http://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", + "integrity": "sha1-bOA/VKCQtmjjy+2/IO354xBZPnI=", + "requires": { + "ignorefs": "http://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", + "safefs": "http://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", + "taskgroup": "http://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz" + } + }, + "send": { + "version": "0.16.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.16.1.tgz", + "integrity": "sha512-ElCLJdJIKPk6ux/Hocwhk7NFHpI3pVm/IZOYWqUmoxcgeyM+MpxHHKhb8QmlJDX1pU6WrgaHBkVNm73Sv7uc2A==", + "dev": true, + "requires": { + "debug": "2.6.9", + "depd": "1.1.1", + "destroy": "1.0.4", + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "etag": "1.8.1", + "fresh": "0.5.2", + "http-errors": "1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "2.3.0", + "range-parser": "1.2.0", + "statuses": "1.3.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + } + } + }, + "serve-static": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.13.1.tgz", + "integrity": "sha512-hSMUZrsPa/I09VYFJwa627JJkNs0NrfL1Uzuup+GqHfToR2KcsXFymXSV90hoyw3M+msjFuQly+YzIH/q0MGlQ==", + "dev": true, + "requires": { + "encodeurl": "1.0.1", + "escape-html": "1.0.3", + "parseurl": "1.3.2", + "send": "0.16.1" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==", + "dev": true + }, + "shelljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz", + "integrity": "sha1-NZbmMHp4FUT1kfN9phg2DzHbV7E=", + "dev": true + }, + "should": { + "version": "13.1.2", + "resolved": "https://registry.npmjs.org/should/-/should-13.1.2.tgz", + "integrity": "sha512-oiGqKOuE4t98vdCs4ICifvzL2u9nWMaziSXVwHOYPyqqY1gBzGZS6LvzIc5uEFN0PiS69Sbvcqyw9hbYXkF4og==", + "dev": true, + "requires": { + "should-equal": "2.0.0", + "should-format": "3.0.3", + "should-type": "1.4.0", + "should-type-adaptors": "1.0.1", + "should-util": "1.0.0" + } + }, + "should-equal": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/should-equal/-/should-equal-2.0.0.tgz", + "integrity": "sha512-ZP36TMrK9euEuWQYBig9W55WPC7uo37qzAEmbjHz4gfyuXrEUgF8cUvQVO+w+d3OMfPvSRQJ22lSm8MQJ43LTA==", + "dev": true, + "requires": { + "should-type": "1.4.0" + } + }, + "should-format": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/should-format/-/should-format-3.0.3.tgz", + "integrity": "sha1-m/yPdPo5IFxT04w01xcwPidxJPE=", + "dev": true, + "requires": { + "should-type": "1.4.0", + "should-type-adaptors": "1.0.1" + } + }, + "should-type": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/should-type/-/should-type-1.4.0.tgz", + "integrity": "sha1-B1bYzoRt/QmEOmlHcZ36DUz/XPM=", + "dev": true + }, + "should-type-adaptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/should-type-adaptors/-/should-type-adaptors-1.0.1.tgz", + "integrity": "sha1-7+VVPN9oz/ZuXF9RtxLcNRx3vqo=", + "dev": true, + "requires": { + "should-type": "1.4.0", + "should-util": "1.0.0" + } + }, + "should-util": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/should-util/-/should-util-1.0.0.tgz", + "integrity": "sha1-yYzaN0qmsZDfi6h8mInCtNtiAGM=", + "dev": true + }, + "sinon": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-4.0.1.tgz", + "integrity": "sha512-4qIY0pCWCvGCJpV/1JkFu9kbsNEZ9O34cG1oru/c7OCDtrEs50Gq/VjkA2ID5ZwLyoNx1i1ws118oh/p6fVeDg==", + "dev": true, + "requires": { + "diff": "http://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "formatio": "1.2.0", + "lodash.get": "4.4.2", + "lolex": "2.1.3", + "native-promise-only": "0.8.1", + "nise": "1.2.0", + "path-to-regexp": "1.7.0", + "samsam": "1.3.0", + "text-encoding": "0.6.4", + "type-detect": "4.0.3" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true, + "requires": { + "isarray": "0.0.1" + } + } + } + }, + "sntp": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.0.2.tgz", + "integrity": "sha1-UGQRDwr4X3z9t9a2ekACjOUrSys=", + "dev": true, + "requires": { + "hoek": "4.2.0" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true, + "optional": true + }, + "sprintf-js": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.1.tgz", + "integrity": "sha1-Nr54Mgr+WAH2zqPueLblqrlA6gw=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + } + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha1-+vUbnrdKrvOzrPStX2Gr8ky3uT4=", + "dev": true + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true, + "requires": { + "has-flag": "1.0.0" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "dev": true + }, + "taskgroup": { + "version": "http://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz", + "integrity": "sha1-feGT/r12gnPEV3MElwJNUSwnkVo=", + "requires": { + "ambi": "http://registry.npmjs.org/ambi/-/ambi-2.5.0.tgz", + "csextends": "http://registry.npmjs.org/csextends/-/csextends-1.1.1.tgz" + } + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "thenify": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.0.tgz", + "integrity": "sha1-5p44obq+lpsBCCB5eLn2K4hgSDk=", + "dev": true, + "requires": { + "any-promise": "1.3.0" + } + }, + "thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha1-GhkY1ALY/D+Y+/I02wvMjMEOlyY=", + "dev": true, + "requires": { + "thenify": "3.3.0" + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + }, + "dependencies": { + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + } + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "dev": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "type-is": { + "version": "1.6.15", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.15.tgz", + "integrity": "sha1-yrEPtJCeRByChC6v4a1kbIGARBA=", + "dev": true, + "requires": { + "media-typer": "0.3.0", + "mime-types": "2.1.17" + } + }, + "typechecker": { + "version": "http://registry.npmjs.org/typechecker/-/typechecker-2.1.0.tgz", + "integrity": "sha1-0cIJOlT/ihn1jP+HfuqlTyJC04M=" + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=", + "dev": true + }, + "underscore.string": { + "version": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz", + "integrity": "sha1-ccCL9rQosRM/N+ePo6Icgvcymw0=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=", + "dev": true + }, + "upath": { + "version": "http://registry.npmjs.org/upath/-/upath-1.0.0.tgz", + "integrity": "sha1-tHBrlGHKhHOt+JEz0jVonKF/NlY=", + "requires": { + "lodash": "https://registry.npmjs.org/lodash/-/lodash-3.7.0.tgz", + "underscore.string": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz" + } + }, + "url": { + "version": "http://registry.npmjs.org/url/-/url-0.11.0.tgz", + "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=", + "dev": true, + "requires": { + "punycode": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz", + "querystring": "http://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz" + } + }, + "url-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.0.5.tgz", + "integrity": "sha1-CFSGBCKv3P7+tsllxmLUgAFpkns=", + "dev": true, + "requires": { + "querystringify": "0.0.4", + "requires-port": "1.0.0" + } + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=", + "dev": true + }, + "uuid": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.1.0.tgz", + "integrity": "sha512-DIWtzUkw04M4k3bf1IcpS2tngXEL26YUD2M0tMDUpnUrz2hgzUBlD55a4FjdLGPvfHxS6uluGWvaVEqgBcVa+g==", + "dev": true + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=", + "dev": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + } + }, + "watchr": { + "version": "http://registry.npmjs.org/watchr/-/watchr-2.4.13.tgz", + "integrity": "sha1-10hHu01vkPYf4sdPn2hmKqDgdgE=", + "requires": { + "eachr": "http://registry.npmjs.org/eachr/-/eachr-2.0.4.tgz", + "extendr": "http://registry.npmjs.org/extendr/-/extendr-2.1.0.tgz", + "extract-opts": "http://registry.npmjs.org/extract-opts/-/extract-opts-2.2.0.tgz", + "ignorefs": "http://registry.npmjs.org/ignorefs/-/ignorefs-1.2.0.tgz", + "safefs": "http://registry.npmjs.org/safefs/-/safefs-3.2.2.tgz", + "scandirectory": "http://registry.npmjs.org/scandirectory/-/scandirectory-2.5.0.tgz", + "taskgroup": "http://registry.npmjs.org/taskgroup/-/taskgroup-4.3.1.tgz", + "typechecker": "http://registry.npmjs.org/typechecker/-/typechecker-2.1.0.tgz" + } + }, + "webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "dev": true + }, + "whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/whatwg-url-compat/-/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "dev": true, + "requires": { + "tr46": "0.0.3" + } + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrappy": { + "version": "http://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "ws": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/ws/-/ws-1.1.4.tgz", + "integrity": "sha1-V/QNA2gy5fUFVmKjl8Tedu1mv2E=", + "dev": true, + "requires": { + "options": "0.0.6", + "ultron": "1.0.2" + } + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "dev": true + }, + "xregexp": { + "version": "https://registry.npmjs.org/xregexp/-/xregexp-2.0.0.tgz", + "integrity": "sha1-UqY+VsoLhKfzpfPWGHLxJq16WUM=" + }, + "zombie": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/zombie/-/zombie-5.0.7.tgz", + "integrity": "sha512-zrYFTD5iWxI3EJohmZ8F2sNafo44F/132wLj5WHLSHmytds60s+JiXLomflQ8sbNuWCZJAuszvf6+eUiVsUqPQ==", + "dev": true, + "requires": { + "babel-runtime": "5.8.29", + "bluebird": "3.5.1", + "debug": "2.6.9", + "eventsource": "0.1.6", + "iconv-lite": "0.4.19", + "jsdom": "7.2.2", + "lodash": "3.10.1", + "mime": "1.4.1", + "ms": "0.7.3", + "request": "2.83.0", + "tough-cookie": "2.3.3", + "ws": "1.1.4" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "ms": { + "version": "0.7.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.3.tgz", + "integrity": "sha1-cIFVpeROM/X9D8U+gdDUCpG+H/8=", + "dev": true + } + } + } + } +} diff --git a/package.json b/package.json index c4d4ace1..a934676a 100644 --- a/package.json +++ b/package.json @@ -18,32 +18,33 @@ "lib": "." }, "dependencies": { - "chokidar": "^1.6.1", - "debug": "*", + "chokidar": "^1.7.0", + "debug": "^3.1.0", "make-plural": "^4", "math-interval-parser": "^1.1.0", "messageformat": "^0", "mustache": "*", - "sprintf-js": ">=1.0.3", + "sprintf-js": "^1.1.1", "upath": "^1.0.0" }, "devDependencies": { - "async": "*", + "async": "^2.5.0", "cookie-parser": "^1.4.1", - "express": "^4.13.4", - "jshint": "*", + "express": "^4.16.2", + "fs-promise": "^2.0.3", + "jshint": "^2.9.5", "mocha": "^3.5.3", - "should": "*", - "sinon": "*", + "should": "^13.1.2", + "sinon": "^4.0.1", "url": "^0.11.0", - "zombie": "*" + "zombie": "^5.0.7" }, "engines": { - "node": ">=0.10.0" + "node": ">=0.10.0 <8" }, "scripts": { "jshint": "jshint --verbose .", - "test": "npm run jshint && make test", + "test": "npm run jshint && mocha", "test-ci": "npm run jshint && istanbul cover ./node_modules/mocha/bin/_mocha" }, "license": "MIT" diff --git a/test/helpers/reconfig.js b/test/helpers/reconfig.js new file mode 100644 index 00000000..95a58693 --- /dev/null +++ b/test/helpers/reconfig.js @@ -0,0 +1,12 @@ +module.exports = function reconfigure(i18nFilename, config) { + 'use strict'; + var i18n, _i18n = require.cache[i18nFilename]; + if (_i18n) { + try {require.cache[i18nFilename].exports.disableReload();} + catch (err) { } + delete require.cache[i18nFilename]; + } + i18n = require(i18nFilename); + i18n.configure(config); + return i18n; +}; \ No newline at end of file diff --git a/test/i18n.api.global.js b/test/i18n.api.global.js index 73ed5edd..0f871bd8 100644 --- a/test/i18n.api.global.js +++ b/test/i18n.api.global.js @@ -1,8 +1,9 @@ var i18n = require('../i18n'), - should = require("should"); + should = require('should'); describe('Module API', function() { - + 'use strict'; + /*global __, __n*/ beforeEach(function() { i18n.configure({ @@ -103,21 +104,21 @@ describe('Module API', function() { it('should test the ordering in sprintf', function() { i18n.setLocale('en'); - should.equal(__('ordered arguments', "First", "Second"), 'Second then First'); + should.equal(__('ordered arguments', 'First', 'Second'), 'Second then First'); i18n.setLocale('de'); - should.equal(__('ordered arguments', "First", "Second"), 'First then Second'); + should.equal(__('ordered arguments', 'First', 'Second'), 'First then Second'); }); it('should test more complex sprintf examples', function() { i18n.setLocale('en'); - should.equal(__('ordered arguments with numbers', "First", 2, 123.456), '2 then First then 123.46'); + should.equal(__('ordered arguments with numbers', 'First', 2, 123.456), '2 then First then 123.46'); i18n.setLocale('de'); - should.equal(__('ordered arguments with numbers', "First", 2, 123.456), 'First then 2 then 123.46'); + should.equal(__('ordered arguments with numbers', 'First', 2, 123.456), 'First then 2 then 123.46'); }); it('should allow for repeated references to the same argument.', function() { i18n.setLocale('en'); - should.equal(__('repeated argument', "repeated"), 'repeated, repeated, repeated'); + should.equal(__('repeated argument', 'repeated'), 'repeated, repeated, repeated'); }); it('should also return translations when iterating thru variables values', function() { @@ -138,20 +139,20 @@ describe('Module API', function() { it('should be possible to use an json object as 1st parameter to specifiy a certain locale for that lookup', function() { should.equal(__({ - phrase: "Hello", - locale: "en" + phrase: 'Hello', + locale: 'en' }), 'Hello'); should.equal(__({ - phrase: "Hello", - locale: "de" + phrase: 'Hello', + locale: 'de' }), 'Hallo'); should.equal(__({ - locale: "en", - phrase: "Hello" + locale: 'en', + phrase: 'Hello' }), 'Hello'); should.equal(__({ - locale: "de", - phrase: "Hello" + locale: 'de', + phrase: 'Hello' }), 'Hallo'); // passing specific locale @@ -227,57 +228,57 @@ describe('Module API', function() { var singular, plural; i18n.setLocale('en'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "nl" }, 1); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "nl" }, 3); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'nl' }, 1); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'nl' }, 3); should.equal(singular, '1 Katze'); should.equal(plural, '3 Katzen'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "en" }, 1); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "en" }, 3); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'en' }, 1); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'en' }, 3); should.equal(singular, '1 cat'); should.equal(plural, '3 cats'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "de" }, 1); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "de" }, 3); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'de' }, 1); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'de' }, 3); should.equal(singular, '1 Katze'); should.equal(plural, '3 Katzen'); i18n.setLocale('en'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "nl", count: 1 }); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "nl", count: 3 }); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'nl', count: 1 }); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'nl', count: 3 }); should.equal(singular, '1 Katze'); should.equal(plural, '3 Katzen'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "en", count: 1 }); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "en", count: 3 }); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'en', count: 1 }); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'en', count: 3 }); should.equal(singular, '1 cat'); should.equal(plural, '3 cats'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "de", count: 1 }); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "de", count: 3 }); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'de', count: 1 }); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'de', count: 3 }); should.equal(singular, '1 Katze'); should.equal(plural, '3 Katzen'); i18n.setLocale('en'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "nl", count: "1" }); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "nl", count: "3" }); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'nl', count: '1' }); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'nl', count: '3' }); should.equal(singular, '1 Katze'); should.equal(plural, '3 Katzen'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "en", count: "1" }); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "en", count: "3" }); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'en', count: '1' }); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'en', count: '3' }); should.equal(singular, '1 cat'); should.equal(plural, '3 cats'); - singular = __n({ singular: "%s cat", plural: "%s cats", locale: "de", count: "1" }); - plural = __n({ singular: "%s cat", plural: "%s cats", locale: "de", count: "3" }); + singular = __n({ singular: '%s cat', plural: '%s cats', locale: 'de', count: '1' }); + plural = __n({ singular: '%s cat', plural: '%s cats', locale: 'de', count: '3' }); should.equal(singular, '1 Katze'); should.equal(plural, '3 Katzen'); }); it('should allow two arguments', function() { - var singular = __n("cat", 1); - var plural = __n("cat", 3); + var singular = __n('cat', 1); + var plural = __n('cat', 3); should.equal(singular, '1 cat'); should.equal(plural, '3 cats'); }); diff --git a/test/i18n.configureApi.js b/test/i18n.configureApi.js index bc158771..89f0f0ab 100644 --- a/test/i18n.configureApi.js +++ b/test/i18n.configureApi.js @@ -1,24 +1,18 @@ /*jslint nomen: true, undef: true, sloppy: true, white: true, stupid: true, passfail: false, node: true, plusplus: true, indent: 2 */ -var i18n = require('../i18n'), - should = require("should"), +var reconfigure = require('./helpers/reconfig'), + should = require('should'), fs = require('fs'), - path = require('path'); - -var i18nPath = 'i18n'; -var i18nFilename = path.resolve(i18nPath + '.js'); - -function reconfigure(config) { - delete require.cache[i18nFilename]; - i18n = require(i18nFilename); - i18n.configure(config); -} + path = require('path'), + i18nFilename = path.resolve('i18n.js'), + i18n +; describe('configure api', function() { it('should set an alias method on the object', function() { var customObject = {}; - reconfigure({ + i18n = reconfigure(i18nFilename, { locales: ['en', 'de'], register: customObject, api: { @@ -33,7 +27,7 @@ describe('configure api', function() { it('should work for any existing API method', function() { var customObject = {}; - reconfigure({ + i18n = reconfigure(i18nFilename, { locales: ['en', 'de'], register: customObject, api: { @@ -47,7 +41,7 @@ describe('configure api', function() { it('should ignore non existing API methods', function() { var customObject = {}; - reconfigure({ + i18n = reconfigure(i18nFilename, { locales: ['en', 'de'], register: customObject, api: { @@ -59,7 +53,7 @@ describe('configure api', function() { it('should not expose the actual API methods', function() { var customObject = {}; - reconfigure({ + i18n = reconfigure(i18nFilename, { locales: ['en', 'de'], register: customObject, api: { @@ -72,7 +66,7 @@ describe('configure api', function() { it('should escape res -> locals -> res recursion', function() { var customObject = {}; customObject.locals = { res: customObject }; - reconfigure({ + i18n = reconfigure(i18nFilename, { locales: ['en', 'de'], register: customObject, api: { diff --git a/test/i18n.configureAutoreload.js b/test/i18n.configureAutoreload.js index ef7ad4ed..25e75c31 100644 --- a/test/i18n.configureAutoreload.js +++ b/test/i18n.configureAutoreload.js @@ -1,73 +1,72 @@ 'use strict'; -var i18n = require('../i18n'), - should = require('should'), - fs = require('fs'), - path = require('path') +var reconfigure = require('./helpers/reconfig'), + i18n = require('../i18n'), + should = require('should'), + //fs = require('fs'), + fs = require('fs-promise'), + path = require('path'), + i18nFilename = path.resolve('i18n.js'), + timeout = 50 ; -var i18nPath = 'i18n'; -var i18nFilename = path.resolve(i18nPath + '.js'); -var timeout = 50; -function reconfigure(config) { - delete require.cache[i18nFilename]; - i18n = require(i18nFilename); - i18n.configure(config); -} describe('autoreload configuration', function() { var testScope = {}; - var directory = path.resolve(__dirname + '/../testlocalesauto'); + var directory = path.resolve(__dirname + '/../sandbox/testlocalesauto'); - before('will start with empty catalogs', function(done) { + before('start with empty catalogs, then change "de"', function(done) { fs.mkdirSync(directory); fs.writeFileSync(directory + '/de.json', '{}'); fs.writeFileSync(directory + '/en.json', '{}'); - reconfigure({ + i18n = reconfigure(i18nFilename, { directory: directory, register: testScope, autoReload: true }); should.deepEqual(i18n.getCatalog(), { de: {}, en: {} }); - setTimeout(done, timeout); - }); + setTimeout(function() { + fs.writeFile(directory + '/de.json', '{"Hello":"Hallo"}', function (err) { + if (err) { + done(err); + } else { + done(); + } + }); + }, timeout); - it('reloads when a catalog is altered', function(done) { - fs.writeFileSync(directory + '/de.json', '{"Hello":"Hallo"}'); - setTimeout(done, timeout); }); it('has added new string to catalog and translates correctly', function(done) { i18n.setLocale(testScope, 'de'); - should.equal('Hallo', testScope.__('Hello')); + should.equal(testScope.__('Hello'), 'Hallo'); should.deepEqual(i18n.getCatalog(), { de: { Hello: 'Hallo' }, en: {} }); done(); }); it('will add new string to catalog and files from __()', function(done) { - should.equal('Hallo', testScope.__('Hello')); + should.equal(testScope.__('Hello'), 'Hallo'); should.deepEqual(i18n.getCatalog(), { de: { Hello: 'Hallo' }, en: {} }); done(); }); after('will remove testlocalesauto after tests', function() { - fs.unlinkSync(directory + '/de.json'); - fs.unlinkSync(directory + '/en.json'); - fs.rmdirSync(directory); + return fs.emptyDir(path.resolve(__dirname + '/../sandbox')); }); }); describe('autoreload configuration with prefix', function() { var testScope = {}; - var directory = path.resolve(__dirname + '/../testlocalesautoprefixed'); + var directory = path.resolve(__dirname + '/../sandbox/testlocalesautoprefixed'); before('will start with empty catalogs', function(done) { + if (fs.existsSync(directory)) {fs.unlinkSync(directory);} fs.mkdirSync(directory); fs.writeFileSync(directory + '/customprefix-de.json', '{}'); fs.writeFileSync(directory + '/customprefix-en.json', '{}'); - reconfigure({ + i18n = reconfigure(i18nFilename, { directory: directory, register: testScope, prefix: 'customprefix-', @@ -96,9 +95,7 @@ describe('autoreload configuration with prefix', function() { }); after('will remove testlocalesautoprefixed after tests', function() { - fs.unlinkSync(directory + '/customprefix-de.json'); - fs.unlinkSync(directory + '/customprefix-en.json'); - fs.rmdirSync(directory); + return fs.emptyDir(path.resolve(__dirname + '/../sandbox')); }); }); @@ -106,13 +103,13 @@ describe('autoreload configuration with prefix', function() { describe('autoreload configuration with prefix and customextension', function() { var testScope = {}; - var directory = path.resolve(__dirname + '/../testlocalesautoprefixedext'); + var directory = path.resolve(__dirname + '/../sandbox/testlocalesautoprefixedext'); before('will start with empty catalogs', function(done) { fs.mkdirSync(directory); fs.writeFileSync(directory + '/customprefix-de.customextension', '{}'); fs.writeFileSync(directory + '/customprefix-en.customextension', '{}'); - reconfigure({ + i18n = reconfigure(i18nFilename, { directory: directory, register: testScope, prefix: 'customprefix-', @@ -142,9 +139,7 @@ describe('autoreload configuration with prefix and customextension', function() }); after('will remove testlocalesautoprefixed after tests', function() { - fs.unlinkSync(directory + '/customprefix-de.customextension'); - fs.unlinkSync(directory + '/customprefix-en.customextension'); - fs.rmdirSync(directory); + return fs.emptyDir(path.resolve(__dirname + '/../sandbox')); }); }); @@ -152,13 +147,13 @@ describe('autoreload configuration with prefix and customextension', function() describe('autoreload configuration with customextension', function() { var testScope = {}; - var directory = path.resolve(__dirname + '/../testlocalesautocustomextension'); + var directory = path.resolve(__dirname + '/../sandbox/testlocalesautocustomextension'); before('will start with empty catalogs', function(done) { fs.mkdirSync(directory); fs.writeFileSync(directory + '/de.customextension', '{}'); fs.writeFileSync(directory + '/en.customextension', '{}'); - reconfigure({ + i18n = reconfigure(i18nFilename, { directory: directory, register: testScope, extension: '.customextension', @@ -187,16 +182,14 @@ describe('autoreload configuration with customextension', function() { }); after('will remove testlocalesautoprefixed after tests', function() { - fs.unlinkSync(directory + '/de.customextension'); - fs.unlinkSync(directory + '/en.customextension'); - fs.rmdirSync(directory); + return fs.emptyDir(path.resolve(__dirname + '/../sandbox')); }); }); describe('autoreload disabling', function() { var testScope = {}, - directory = path.resolve(__dirname + '/../testlocalesautodisable') + directory = path.resolve(__dirname + '/../sandbox/testlocalesautodisable') ; function clearFS() { fs.unlinkSync(directory + '/de.json'); @@ -213,7 +206,7 @@ describe('autoreload disabling', function() { }); it('should disable autoloading via i18n.disableReload()', function (done) { - reconfigure({ + i18n = reconfigure(i18nFilename, { directory: directory, register: testScope, autoReload: true @@ -233,7 +226,7 @@ describe('autoreload disabling', function() { }); it('should disable autoloading via i18n.config()', function (done) { - reconfigure({ + i18n = reconfigure(i18nFilename, { directory: directory, register: testScope, autoReload: true @@ -263,4 +256,8 @@ describe('autoreload disabling', function() { done(); }); + after(function () { + return fs.emptyDir(path.resolve(__dirname + '/../sandbox')); + }); + }); \ No newline at end of file diff --git a/test/i18n.mf.js b/test/i18n.mf.js index fe669f0d..ba9891c9 100644 --- a/test/i18n.mf.js +++ b/test/i18n.mf.js @@ -1,10 +1,11 @@ var i18n = require('../i18n'), - should = require("should"), + should = require('should')/* , fs = require('fs'), - path = require('path'); + path = require('path') */ +; describe('parsing Messageformat phrases', function() { - + 'use strict'; var mfTest = {}; beforeEach(function() {