pax_global_header00006660000000000000000000000064135316777400014527gustar00rootroot0000000000000052 comment=4aa17e9afa3fedfa6f601d958a23e4932c2ebd58 gettext-parser-4.0.2/000077500000000000000000000000001353167774000145105ustar00rootroot00000000000000gettext-parser-4.0.2/.eslintrc.js000066400000000000000000000004541353167774000167520ustar00rootroot00000000000000module.exports = { 'env': { 'commonjs': true, 'es6': true, 'node': true }, 'extends': 'standard', 'globals': { 'Atomics': 'readonly', 'SharedArrayBuffer': 'readonly' }, 'parserOptions': { 'ecmaVersion': 2018 }, 'rules': { 'semi': ['error', 'always'] } } gettext-parser-4.0.2/.gitignore000066400000000000000000000001611353167774000164760ustar00rootroot00000000000000lib-cov *.seed *.log *.csv *.dat *.out *.pid *.gz pids logs results npm-debug.log node_modules .DS_Store .idea gettext-parser-4.0.2/.npmignore000066400000000000000000000000511353167774000165030ustar00rootroot00000000000000test .eslintrc.js .gitignore .travis.yml gettext-parser-4.0.2/.travis.yml000066400000000000000000000001201353167774000166120ustar00rootroot00000000000000language: node_js node_js: - "node" - "lts/*" notifications: email: false gettext-parser-4.0.2/CHANGELOG.md000066400000000000000000000071161353167774000163260ustar00rootroot00000000000000# Change Log ## [4.0.0-alpha.1] - 2019-03-17 - Fix header title casing same when parsing (compiling fixed in 4.0.0-alpha.0) ## [4.0.0-alpha.0] - 2019-03-15 - Fix header tiltle casing when compiling (now enforced for fixed list and left unchanged for all others). ## [3.1.1] - 2019-03-14 - Update code to ES6 ## [3.1.0] - 2018-11-19 - Add error when PO contains unescaped double quotes (thx @probertson) ## [3.0.0] - 2018-11-10 - Remove support for old node versions ## [2.1.0] - 2018-11-10 - Add wider node support by using `readable-stream` module (thx @coolstuffit and @RignonNoel) ## [2.0.0] - 2018-07-04 - Rename `sortByMsgId` parameter to `sort` (BREAKING) - Change `sort` parameter to accept custom compare function (thx @probertson) ## [1.3.1] - 2018-02-20 - Fix catastrophic backtracking vulnerability in patch version to reach more users. ## [1.4.0] - 2018-02-19 - Fix catastrophic backtracking vulnerability in line folding regex (thx @davisjam). - Add sort option for PO compilation (thx @AlexMost). ## [1.3.0] - 2017-08-03 - Add line folding length option to `po.compile` (thx @SleepWalker). - Update code to use new buffer API. ## [1.2.2] - 2017-01-11 - Use semistandard coding style. - Remove unreachable code (thx @jelly). - Replace grunt with npm scripts. - Replace jshint with eslint. ## [1.2.1] - 2016-11-26 - Fix typo in readme (thx @TimKam). - New project maintainer. ## [1.2.0] - 2016-06-13 - Fix compilation of plurals when msgstr only contains one element (thx @maufl). - Fix example in readme (thx @arthuralee). ## [1.1.2] - 2015-10-07 - Update dependencies. ## [1.1.1] - 2015-06-04 - Fix hash table location value in compiled mo files ## [1.1.0] - 2015-01-21 - Add `po.createParseStream` method for parsing PO files from a Stream source - Update documentation ## [1.0.0] - 2015-01-21 - Bump version to 1.0.0 to be compatible with semver - Change tests from nodeunit to mocha - Unify code style in files and added jshint task to check it - Add Grunt support to check style and run tests on `npm test` ## [0.2.0] - 2013-12-30 - Remove node-iconv dependency - Fix a global variable leak (`line` was not defined in `pocompiler._addPOString`) - Apply some code maintenance (applied jshint rules, added "use strict" statements) - Update e-mail address in .travis.yml - Add CHANGELOG file [4.0.0-alpha.1]: https://github.com/smhg/gettext-parser/compare/v4.0.0-alpha.0...v4.0.0-alpha.1 [4.0.0-alpha.0]: https://github.com/smhg/gettext-parser/compare/v3.1.1...v4.0.0-alpha.0 [3.1.1]: https://github.com/smhg/gettext-parser/compare/v3.1.0...v3.1.1 [3.1.0]: https://github.com/smhg/gettext-parser/compare/v3.0.0...v3.1.0 [3.0.0]: https://github.com/smhg/gettext-parser/compare/v2.1.0...v3.0.0 [2.1.0]: https://github.com/smhg/gettext-parser/compare/v2.0.0...v2.1.0 [2.0.0]: https://github.com/smhg/gettext-parser/compare/v1.4.0...v2.0.0 [1.4.0]: https://github.com/smhg/gettext-parser/compare/v1.3.1...v1.4.0 [1.3.1]: https://github.com/smhg/gettext-parser/compare/v1.3.0...v1.3.1 [1.3.0]: https://github.com/smhg/gettext-parser/compare/v1.2.2...v1.3.0 [1.2.2]: https://github.com/smhg/gettext-parser/compare/v1.2.1...v1.2.2 [1.2.1]: https://github.com/smhg/gettext-parser/compare/v1.2.0...v1.2.1 [1.2.0]: https://github.com/smhg/gettext-parser/compare/v1.1.2...v1.2.0 [1.1.2]: https://github.com/smhg/gettext-parser/compare/v1.1.1...v1.1.2 [1.1.1]: https://github.com/smhg/gettext-parser/compare/v1.1.0...v1.1.1 [1.1.0]: https://github.com/smhg/gettext-parser/compare/v1.0.0...v1.1.0 [1.0.0]: https://github.com/smhg/gettext-parser/compare/v0.2.0...v1.0.0 [0.2.0]: https://github.com/smhg/gettext-parser/compare/v0.1.10...v0.2.0gettext-parser-4.0.2/LICENSE000066400000000000000000000020471353167774000155200ustar00rootroot00000000000000Copyright (c) 2014-2015 Andris Reinman Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. gettext-parser-4.0.2/README.md000066400000000000000000000163521353167774000157760ustar00rootroot00000000000000gettext-parser [![Build Status](https://secure.travis-ci.org/smhg/gettext-parser.png)](http://travis-ci.org/smhg/gettext-parser) ============== Parse and compile gettext *po* and *mo* files with node.js, nothing more, nothing less. > *Please note:* starting with version 3 only latest LTS and latest stable node versions are supported. **Use version 2 with older node versions.** ## Usage Include the library: var gettextParser = require("gettext-parser"); ### Parse PO files Parse a PO file with gettextParser.po.parse(input[, defaultCharset]) → Object Where * **input** is a *po* file as a Buffer or an unicode string. Charset is converted to unicode from other encodings only if the input is a Buffer, otherwise the charset information is discarded * **defaultCharset** is the charset to use if charset is not defined or is the default `"CHARSET"` (applies only if *input* is a Buffer) Method returns gettext-parser specific translation object (see below) **Example** ```javascript var input = require('fs').readFileSync('en.po'); var po = gettextParser.po.parse(input); console.log(po.translations['']); // output translations for the default context ``` ### Parse PO as a Stream PO files can also be parsed from a stream source. After all input is processed the parser emits a single 'data' event which contains the parsed translation object. gettextParser.po.createParseStream([defaultCharset][, streamOptions]) → Transform Stream Where * **defaultCharset** is the charset to use if charset is not defined or is the default `"CHARSET"` * **streamOptions** are the standard stream options **Example** ```javascript var input = require('fs').createReadStream('en.po'); var po = gettextParser.po.createParseStream(); input.pipe(po); po.on('data', function(data){ console.log(data.translations['']); // output translations for the default context }); ``` ### Compile PO from a translation object If you have a translation object you can convert this to a valid PO file with gettextParser.po.compile(data[, options]) → Buffer Where * **data** is a translation object either got from parsing a PO/MO file or composed by other means * **options** is a configuration object with possible values * **foldLength** is the length at which to fold message strings into newlines (default: 76). Set to 0 or false to disable folding. * **sort** (boolean|Function) - (default `false`) if `true`, entries will be sorted by msgid in the resulting .po(.pot) file. If a comparator function is provided, that function will be used to sort entries in the output. The function is called with two arguments, each of which is a single message entry with the structure described below. The function should follow the standard rules for functions passed to `Array.sort()`: return `0` if the entries are interchangeable in sort order; return a number less than 0 if the first entry should come before the second one; and return a number greater than 0 if the second entry should come before the first one. **Example** ```javascript var data = { ... }; var output = gettextParser.po.compile(data); require('fs').writeFileSync(output); ``` ### Parse MO files Parse a MO file with gettextParser.mo.parse(input[, defaultCharset]) → Object Where * **input** is a *mo* file as a Buffer * **defaultCharset** is the charset to use if charset is not defined or is the default `"CHARSET"` Method returns gettext-parser specific translation object (see below) **Example** ```javascript var input = require('fs').readFileSync('en.mo'); var mo = gettextParser.mo.parse(input); console.log(mo.translations['']); // output translations for the default context ``` ### Compile MO from a translation object If you have a translation object you can convert this to a valid MO file with gettextParser.mo.compile(data) → Buffer Where * **data** is a translation object either got from parsing a PO/MO file or composed by other means **Example** ```javascript var data = { ... }; var output = gettextParser.mo.compile(data); require('fs').writeFileSync(output); ``` ### Notes #### Overriding charset If you are compiling a previously parsed translation object, you can override the output charset with the `charset` property (applies both for compiling *mo* and *po* files). ```javascript var obj = gettextParser.po.parse(inputBuf); obj.charset = "windows-1257"; outputBuf = gettextParser.po.compile(obj); ``` Headers for the output are modified to match the updated charset. #### ICONV support By default *gettext-parser* uses pure JS [iconv-lite](https://github.com/ashtuchkin/iconv-lite) for encoding and decoding non UTF-8 charsets. If you need to support more complex encodings that are not supported by *iconv-lite*, you need to add [iconv](https://github.com/bnoordhuis/node-iconv) as an additional dependency for your project (*gettext-parser* will detect if it is available and tries to use it instead of *iconv-lite*). ## Data structure of parsed mo/po files ### Character set Parsed data is always in unicode but the original charset of the file can be found from the `charset` property. This value is also used when compiling translations to a *mo* or *po* file. ### Headers Headers can be found from the `headers` object, all keys are lowercase and the value for a key is a string. This value will also be used when compiling. ### Translations Translations can be found from the `translations` object which in turn holds context objects for `msgctxt`. Default context can be found from `translations[""]`. Context objects include all the translations, where `msgid` value is the key. The value is an object with the following possible properties: * **msgctxt** context for this translation, if not present the default context applies * **msgid** string to be translated * **msgid_plural** the plural form of the original string (might not be present) * **msgstr** an array of translations * **comments** an object with the following properties: `translator`, `reference`, `extracted`, `flag`, `previous`. Example ```json { "charset": "iso-8859-1", "headers": { "content-type": "text/plain; charset=iso-8859-1", "plural-forms": "nplurals=2; plural=(n!=1);" }, "translations": { "": { "": { "msgid": "", "msgstr": ["Content-Type: text/plain; charset=iso-8859-1\n..."] } }, "another context": { "%s example": { "msgctxt": "another context", "msgid": "%s example", "msgid_plural": "%s examples", "msgstr": ["% näide", "%s näidet"], "comments": { "translator": "This is regular comment", "reference": "/path/to/file:123" } } } } } ``` Notice that the structure has both a `headers` object and a `""` translation with the header string. When compiling the structure to a *mo* or a *po* file, the `headers` object is used to define the header. Header string in the `""` translation is just for reference (includes the original unmodified data) but will not be used when compiling. So if you need to add or alter header values, use only the `headers` object. If you need to convert *gettext-parser* formatted translation object to something else, eg. for *jed*, check out [po2json](https://github.com/mikeedwards/po2json). ## License **MIT** gettext-parser-4.0.2/index.js000066400000000000000000000004101353167774000161500ustar00rootroot00000000000000const { parse, stream } = require('./lib/poparser'); module.exports = { po: { parse, createParseStream: stream, compile: require('./lib/pocompiler') }, mo: { parse: require('./lib/moparser'), compile: require('./lib/mocompiler') } }; gettext-parser-4.0.2/lib/000077500000000000000000000000001353167774000152565ustar00rootroot00000000000000gettext-parser-4.0.2/lib/mocompiler.js000066400000000000000000000153511353167774000177670ustar00rootroot00000000000000const { Buffer } = require('safe-buffer'); const encoding = require('encoding'); const sharedFuncs = require('./shared'); const contentType = require('content-type'); /** * Exposes general compiler function. Takes a translation * object as a parameter and returns binary MO object * * @param {Object} table Translation object * @return {Buffer} Compiled binary MO object */ module.exports = function (table) { const compiler = new Compiler(table); return compiler.compile(); }; /** * Creates a MO compiler object. * * @constructor * @param {Object} table Translation table as defined in the README */ function Compiler (table = {}) { this._table = table; let { headers = {}, translations = {} } = this._table; headers = Object.keys(headers).reduce((result, key) => { const lowerKey = key.toLowerCase(); if (sharedFuncs.HEADERS.has(lowerKey)) { // POT-Creation-Date is removed in MO (see https://savannah.gnu.org/bugs/?49654) if (lowerKey !== 'pot-creation-date') { result[sharedFuncs.HEADERS.get(lowerKey)] = headers[key]; } } else { result[key] = headers[key]; } return result; }, {}); // filter out empty translations translations = Object.keys(translations).reduce((result, msgctxt) => { const context = translations[msgctxt]; const msgs = Object.keys(context).reduce((result, msgid) => { const hasTranslation = context[msgid].msgstr.some(item => !!item.length); if (hasTranslation) { result[msgid] = context[msgid]; } return result; }, {}); if (Object.keys(msgs).length) { result[msgctxt] = msgs; } return result; }, {}); this._table.translations = translations; this._table.headers = headers; this._translations = []; this._writeFunc = 'writeUInt32LE'; this._handleCharset(); } /** * Magic bytes for the generated binary data */ Compiler.prototype.MAGIC = 0x950412de; /** * Handles header values, replaces or adds (if needed) a charset property */ Compiler.prototype._handleCharset = function () { const ct = contentType.parse(this._table.headers['Content-Type'] || 'text/plain'); const charset = sharedFuncs.formatCharset(this._table.charset || ct.parameters.charset || 'utf-8'); // clean up content-type charset independently using fallback if missing if (ct.parameters.charset) { ct.parameters.charset = sharedFuncs.formatCharset(ct.parameters.charset); } this._table.charset = charset; this._table.headers['Content-Type'] = contentType.format(ct); }; /** * Generates an array of translation strings * in the form of [{msgid:... , msgstr:...}] * * @return {Array} Translation strings array */ Compiler.prototype._generateList = function () { const list = []; list.push({ msgid: Buffer.alloc(0), msgstr: encoding.convert(sharedFuncs.generateHeader(this._table.headers), this._table.charset) }); Object.keys(this._table.translations).forEach(msgctxt => { if (typeof this._table.translations[msgctxt] !== 'object') { return; } Object.keys(this._table.translations[msgctxt]).forEach(msgid => { if (typeof this._table.translations[msgctxt][msgid] !== 'object') { return; } if (msgctxt === '' && msgid === '') { return; } const msgidPlural = this._table.translations[msgctxt][msgid].msgid_plural; let key = msgid; if (msgctxt) { key = msgctxt + '\u0004' + key; } if (msgidPlural) { key += '\u0000' + msgidPlural; } const value = [].concat(this._table.translations[msgctxt][msgid].msgstr || []).join('\u0000'); list.push({ msgid: encoding.convert(key, this._table.charset), msgstr: encoding.convert(value, this._table.charset) }); }); }); return list; }; /** * Calculate buffer size for the final binary object * * @param {Array} list An array of translation strings from _generateList * @return {Object} Size data of {msgid, msgstr, total} */ Compiler.prototype._calculateSize = function (list) { let msgidLength = 0; let msgstrLength = 0; let totalLength = 0; list.forEach(translation => { msgidLength += translation.msgid.length + 1; // + extra 0x00 msgstrLength += translation.msgstr.length + 1; // + extra 0x00 }); totalLength = 4 + // magic number 4 + // revision 4 + // string count 4 + // original string table offset 4 + // translation string table offset 4 + // hash table size 4 + // hash table offset (4 + 4) * list.length + // original string table (4 + 4) * list.length + // translations string table msgidLength + // originals msgstrLength; // translations return { msgid: msgidLength, msgstr: msgstrLength, total: totalLength }; }; /** * Generates the binary MO object from the translation list * * @param {Array} list translation list * @param {Object} size Byte size information * @return {Buffer} Compiled MO object */ Compiler.prototype._build = function (list, size) { const returnBuffer = Buffer.alloc(size.total); let curPosition = 0; let i; let len; // magic returnBuffer[this._writeFunc](this.MAGIC, 0); // revision returnBuffer[this._writeFunc](0, 4); // string count returnBuffer[this._writeFunc](list.length, 8); // original string table offset returnBuffer[this._writeFunc](28, 12); // translation string table offset returnBuffer[this._writeFunc](28 + (4 + 4) * list.length, 16); // hash table size returnBuffer[this._writeFunc](0, 20); // hash table offset returnBuffer[this._writeFunc](28 + (4 + 4) * list.length * 2, 24); // build originals table curPosition = 28 + 2 * (4 + 4) * list.length; for (i = 0, len = list.length; i < len; i++) { list[i].msgid.copy(returnBuffer, curPosition); returnBuffer[this._writeFunc](list[i].msgid.length, 28 + i * 8); returnBuffer[this._writeFunc](curPosition, 28 + i * 8 + 4); returnBuffer[curPosition + list[i].msgid.length] = 0x00; curPosition += list[i].msgid.length + 1; } // build translations table for (i = 0, len = list.length; i < len; i++) { list[i].msgstr.copy(returnBuffer, curPosition); returnBuffer[this._writeFunc](list[i].msgstr.length, 28 + (4 + 4) * list.length + i * 8); returnBuffer[this._writeFunc](curPosition, 28 + (4 + 4) * list.length + i * 8 + 4); returnBuffer[curPosition + list[i].msgstr.length] = 0x00; curPosition += list[i].msgstr.length + 1; } return returnBuffer; }; /** * Compiles translation object into a binary MO object * * @return {Buffer} Compiled MO object */ Compiler.prototype.compile = function () { const list = this._generateList(); const size = this._calculateSize(list); list.sort(sharedFuncs.compareMsgid); return this._build(list, size); }; gettext-parser-4.0.2/lib/moparser.js000066400000000000000000000121561353167774000174510ustar00rootroot00000000000000const encoding = require('encoding'); const sharedFuncs = require('./shared'); /** * Parses a binary MO object into translation table * * @param {Buffer} buffer Binary MO object * @param {String} [defaultCharset] Default charset to use * @return {Object} Translation object */ module.exports = function (buffer, defaultCharset) { const parser = new Parser(buffer, defaultCharset); return parser.parse(); }; /** * Creates a MO parser object. * * @constructor * @param {Buffer} fileContents Binary MO object * @param {String} [defaultCharset] Default charset to use */ function Parser (fileContents, defaultCharset = 'iso-8859-1') { this._fileContents = fileContents; /** * Method name for writing int32 values, default littleendian */ this._writeFunc = 'writeUInt32LE'; /** * Method name for reading int32 values, default littleendian */ this._readFunc = 'readUInt32LE'; this._charset = defaultCharset; this._table = { charset: this._charset, headers: undefined, translations: {} }; } /** * Magic constant to check the endianness of the input file */ Parser.prototype.MAGIC = 0x950412de; /** * Checks if number values in the input file are in big- or littleendian format. * * @return {Boolean} Return true if magic was detected */ Parser.prototype._checkMagick = function () { if (this._fileContents.readUInt32LE(0) === this.MAGIC) { this._readFunc = 'readUInt32LE'; this._writeFunc = 'writeUInt32LE'; return true; } else if (this._fileContents.readUInt32BE(0) === this.MAGIC) { this._readFunc = 'readUInt32BE'; this._writeFunc = 'writeUInt32BE'; return true; } return false; }; /** * Read the original strings and translations from the input MO file. Use the * first translation string in the file as the header. */ Parser.prototype._loadTranslationTable = function () { let offsetOriginals = this._offsetOriginals; let offsetTranslations = this._offsetTranslations; let position; let length; let msgid; let msgstr; for (let i = 0; i < this._total; i++) { // msgid string length = this._fileContents[this._readFunc](offsetOriginals); offsetOriginals += 4; position = this._fileContents[this._readFunc](offsetOriginals); offsetOriginals += 4; msgid = this._fileContents.slice(position, position + length); // matching msgstr length = this._fileContents[this._readFunc](offsetTranslations); offsetTranslations += 4; position = this._fileContents[this._readFunc](offsetTranslations); offsetTranslations += 4; msgstr = this._fileContents.slice(position, position + length); if (!i && !msgid.toString()) { this._handleCharset(msgstr); } msgid = encoding.convert(msgid, 'utf-8', this._charset) .toString('utf8'); msgstr = encoding.convert(msgstr, 'utf-8', this._charset) .toString('utf8'); this._addString(msgid, msgstr); } // dump the file contents object this._fileContents = null; }; /** * Detects charset for MO strings from the header * * @param {Buffer} headers Header value */ Parser.prototype._handleCharset = function (headers) { const headersStr = headers.toString(); let match; if ((match = headersStr.match(/[; ]charset\s*=\s*([\w-]+)/i))) { this._charset = this._table.charset = sharedFuncs.formatCharset(match[1], this._charset); } headers = encoding.convert(headers, 'utf-8', this._charset) .toString('utf8'); this._table.headers = sharedFuncs.parseHeader(headers); }; /** * Adds a translation to the translation object * * @param {String} msgid Original string * @params {String} msgstr Translation for the original string */ Parser.prototype._addString = function (msgid, msgstr) { const translation = {}; let msgctxt; let msgidPlural; msgid = msgid.split('\u0004'); if (msgid.length > 1) { msgctxt = msgid.shift(); translation.msgctxt = msgctxt; } else { msgctxt = ''; } msgid = msgid.join('\u0004'); const parts = msgid.split('\u0000'); msgid = parts.shift(); translation.msgid = msgid; if ((msgidPlural = parts.join('\u0000'))) { translation.msgid_plural = msgidPlural; } msgstr = msgstr.split('\u0000'); translation.msgstr = [].concat(msgstr || []); if (!this._table.translations[msgctxt]) { this._table.translations[msgctxt] = {}; } this._table.translations[msgctxt][msgid] = translation; }; /** * Parses the MO object and returns translation table * * @return {Object} Translation table */ Parser.prototype.parse = function () { if (!this._checkMagick()) { return false; } /** * GetText revision nr, usually 0 */ this._revision = this._fileContents[this._readFunc](4); /** * Total count of translated strings */ this._total = this._fileContents[this._readFunc](8); /** * Offset position for original strings table */ this._offsetOriginals = this._fileContents[this._readFunc](12); /** * Offset position for translation strings table */ this._offsetTranslations = this._fileContents[this._readFunc](16); // Load translations into this._translationTable this._loadTranslationTable(); return this._table; }; gettext-parser-4.0.2/lib/pocompiler.js000066400000000000000000000136431353167774000177740ustar00rootroot00000000000000const { Buffer } = require('safe-buffer'); const encoding = require('encoding'); const sharedFuncs = require('./shared'); const contentType = require('content-type'); /** * Exposes general compiler function. Takes a translation * object as a parameter and returns PO object * * @param {Object} table Translation object * @return {Buffer} Compiled PO object */ module.exports = function (table, options) { const compiler = new Compiler(table, options); return compiler.compile(); }; /** * Creates a PO compiler object. * * @constructor * @param {Object} table Translation table to be compiled */ function Compiler (table = {}, options = {}) { this._table = table; this._options = options; this._table.translations = this._table.translations || {}; let { headers = {} } = this._table; headers = Object.keys(headers).reduce((result, key) => { const lowerKey = key.toLowerCase(); if (sharedFuncs.HEADERS.has(lowerKey)) { result[sharedFuncs.HEADERS.get(lowerKey)] = headers[key]; } else { result[key] = headers[key]; } return result; }, {}); this._table.headers = headers; if (!('foldLength' in this._options)) { this._options.foldLength = 76; } if (!('sort' in this._options)) { this._options.sort = false; } this._translations = []; this._handleCharset(); } /** * Converts a comments object to a comment string. The comment object is * in the form of {translator:'', reference: '', extracted: '', flag: '', previous:''} * * @param {Object} comments A comments object * @return {String} A comment string for the PO file */ Compiler.prototype._drawComments = function (comments) { const lines = []; const types = [{ key: 'translator', prefix: '# ' }, { key: 'reference', prefix: '#: ' }, { key: 'extracted', prefix: '#. ' }, { key: 'flag', prefix: '#, ' }, { key: 'previous', prefix: '#| ' }]; types.forEach(type => { if (!comments[type.key]) { return; } comments[type.key].split(/\r?\n|\r/).forEach(line => { lines.push(`${type.prefix}${line}`); }); }); return lines.join('\n'); }; /** * Builds a PO string for a single translation object * * @param {Object} block Translation object * @param {Object} [override] Properties of this object will override `block` properties * @return {String} Translation string for a single object */ Compiler.prototype._drawBlock = function (block, override = {}) { const response = []; const msgctxt = override.msgctxt || block.msgctxt; const msgid = override.msgid || block.msgid; const msgidPlural = override.msgid_plural || block.msgid_plural; const msgstr = [].concat(override.msgstr || block.msgstr); let comments = override.comments || block.comments; // add comments if (comments && (comments = this._drawComments(comments))) { response.push(comments); } if (msgctxt) { response.push(this._addPOString('msgctxt', msgctxt)); } response.push(this._addPOString('msgid', msgid || '')); if (msgidPlural) { response.push(this._addPOString('msgid_plural', msgidPlural)); msgstr.forEach((msgstr, i) => { response.push(this._addPOString(`msgstr[${i}]`, msgstr || '')); }); } else { response.push(this._addPOString('msgstr', msgstr[0] || '')); } return response.join('\n'); }; /** * Escapes and joins a key and a value for the PO string * * @param {String} key Key name * @param {String} value Key value * @return {String} Joined and escaped key-value pair */ Compiler.prototype._addPOString = function (key = '', value = '') { key = key.toString(); // escape newlines and quotes value = value.toString() .replace(/\\/g, '\\\\') .replace(/"/g, '\\"') .replace(/\t/g, '\\t') .replace(/\r/g, '\\r') .replace(/\n/g, '\\n'); let lines = [value]; if (this._options.foldLength > 0) { lines = sharedFuncs.foldLine(value, this._options.foldLength); } if (lines.length < 2) { return `${key} "${lines.shift() || ''}"`; } return `${key} ""\n"${lines.join('"\n"')}"`; }; /** * Handles header values, replaces or adds (if needed) a charset property */ Compiler.prototype._handleCharset = function () { const ct = contentType.parse(this._table.headers['Content-Type'] || 'text/plain'); const charset = sharedFuncs.formatCharset(this._table.charset || ct.parameters.charset || 'utf-8'); // clean up content-type charset independently using fallback if missing if (ct.parameters.charset) { ct.parameters.charset = sharedFuncs.formatCharset(ct.parameters.charset); } this._table.charset = charset; this._table.headers['Content-Type'] = contentType.format(ct); }; /** * Compiles translation object into a PO object * * @return {Buffer} Compiled PO object */ Compiler.prototype.compile = function () { const headerBlock = (this._table.translations[''] && this._table.translations['']['']) || {}; let response = []; Object.keys(this._table.translations).forEach(msgctxt => { if (typeof this._table.translations[msgctxt] !== 'object') { return; } Object.keys(this._table.translations[msgctxt]).forEach(msgid => { if (typeof this._table.translations[msgctxt][msgid] !== 'object') { return; } if (msgctxt === '' && msgid === '') { return; } response.push(this._table.translations[msgctxt][msgid]); }); }); if (this._options.sort !== false) { if (typeof this._options.sort === 'function') { response = response.sort(this._options.sort); } else { response = response.sort(sharedFuncs.compareMsgid); } } response = response.map(r => this._drawBlock(r)); response.unshift(this._drawBlock(headerBlock, { msgstr: sharedFuncs.generateHeader(this._table.headers) })); if (this._table.charset === 'utf-8' || this._table.charset === 'ascii') { return Buffer.from(response.join('\n\n'), 'utf-8'); } return encoding.convert(response.join('\n\n'), this._table.charset); }; gettext-parser-4.0.2/lib/poparser.js000066400000000000000000000333251353167774000174550ustar00rootroot00000000000000const encoding = require('encoding'); const sharedFuncs = require('./shared'); const Transform = require('readable-stream').Transform; const util = require('util'); /** * Parses a PO object into translation table * * @param {Buffer|String} buffer PO object * @param {String} [defaultCharset] Default charset to use * @return {Object} Translation object */ module.exports.parse = function (buffer, defaultCharset) { const parser = new Parser(buffer, defaultCharset); return parser.parse(); }; /** * Parses a PO stream, emits translation table in object mode * * @param {String} [defaultCharset] Default charset to use * @param {String} [options] Stream options * @return {Stream} Transform stream */ module.exports.stream = function (defaultCharset, options) { return new PoParserTransform(defaultCharset, options); }; /** * Creates a PO parser object. If PO object is a string, * UTF-8 will be used as the charset * * @constructor * @param {Buffer|String} fileContents PO object * @param {String} [defaultCharset] Default charset to use */ function Parser (fileContents, defaultCharset = 'iso-8859-1') { this._charset = defaultCharset; this._lex = []; this._escaped = false; this._node = {}; this._state = this.states.none; this._lineNumber = 1; if (typeof fileContents === 'string') { this._charset = 'utf-8'; this._fileContents = fileContents; } else { this._fileContents = this._handleCharset(fileContents); } } /** * Parses the PO object and returns translation table * * @return {Object} Translation table */ Parser.prototype.parse = function () { this._lexer(this._fileContents); return this._finalize(this._lex); }; /** * Detects charset for PO strings from the header * * @param {Buffer} headers Header value */ Parser.prototype._handleCharset = function (buf = '') { const str = buf.toString(); let pos; let headers = ''; let match; if ((pos = str.search(/^\s*msgid/im)) >= 0) { pos = pos + str.substr(pos + 5).search(/^\s*(msgid|msgctxt)/im); headers = str.substr(0, pos >= 0 ? pos + 5 : str.length); } if ((match = headers.match(/[; ]charset\s*=\s*([\w-]+)(?:[\s;]|\\n)*"\s*$/mi))) { this._charset = sharedFuncs.formatCharset(match[1], this._charset); } if (this._charset === 'utf-8') { return str; } return this._toString(buf); }; Parser.prototype._toString = function (buf) { return encoding.convert(buf, 'utf-8', this._charset).toString('utf-8'); }; /** * State constants for parsing FSM */ Parser.prototype.states = { none: 0x01, comments: 0x02, key: 0x03, string: 0x04 }; /** * Value types for lexer */ Parser.prototype.types = { comments: 0x01, key: 0x02, string: 0x03 }; /** * String matches for lexer */ Parser.prototype.symbols = { quotes: /["']/, comments: /#/, whitespace: /\s/, key: /[\w\-[\]]/, keyNames: /^(?:msgctxt|msgid(?:_plural)?|msgstr(?:\[\d+])?)$/ }; /** * Token parser. Parsed state can be found from this._lex * * @param {String} chunk String */ Parser.prototype._lexer = function (chunk) { let chr; for (let i = 0, len = chunk.length; i < len; i++) { chr = chunk.charAt(i); if (chr === '\n') { this._lineNumber += 1; } switch (this._state) { case this.states.none: if (chr.match(this.symbols.quotes)) { this._node = { type: this.types.string, value: '', quote: chr }; this._lex.push(this._node); this._state = this.states.string; } else if (chr.match(this.symbols.comments)) { this._node = { type: this.types.comments, value: '' }; this._lex.push(this._node); this._state = this.states.comments; } else if (!chr.match(this.symbols.whitespace)) { this._node = { type: this.types.key, value: chr }; this._lex.push(this._node); this._state = this.states.key; } break; case this.states.comments: if (chr === '\n') { this._state = this.states.none; } else if (chr !== '\r') { this._node.value += chr; } break; case this.states.string: if (this._escaped) { switch (chr) { case 't': this._node.value += '\t'; break; case 'n': this._node.value += '\n'; break; case 'r': this._node.value += '\r'; break; default: this._node.value += chr; } this._escaped = false; } else { if (chr === this._node.quote) { this._state = this.states.none; } else if (chr === '\\') { this._escaped = true; break; } else { this._node.value += chr; } this._escaped = false; } break; case this.states.key: if (!chr.match(this.symbols.key)) { if (!this._node.value.match(this.symbols.keyNames)) { const err = new SyntaxError(`Error parsing PO data: Invalid key name "${this._node.value}" at line ${this._lineNumber}. This can be caused by an unescaped quote character in a msgid or msgstr value.`); err.lineNumber = this._lineNumber; throw err; } this._state = this.states.none; i--; } else { this._node.value += chr; } break; } } }; /** * Join multi line strings * * @param {Object} tokens Parsed tokens * @return {Object} Parsed tokens, with multi line strings joined into one */ Parser.prototype._joinStringValues = function (tokens) { const response = []; let lastNode; for (let i = 0, len = tokens.length; i < len; i++) { if (lastNode && tokens[i].type === this.types.string && lastNode.type === this.types.string) { lastNode.value += tokens[i].value; } else if (lastNode && tokens[i].type === this.types.comments && lastNode.type === this.types.comments) { lastNode.value += '\n' + tokens[i].value; } else { response.push(tokens[i]); lastNode = tokens[i]; } } return response; }; /** * Parse comments into separate comment blocks * * @param {Object} tokens Parsed tokens */ Parser.prototype._parseComments = function (tokens) { // parse comments tokens.forEach(node => { let comment; let lines; if (node && node.type === this.types.comments) { comment = { translator: [], extracted: [], reference: [], flag: [], previous: [] }; lines = (node.value || '').split(/\n/); lines.forEach(line => { switch (line.charAt(0) || '') { case ':': comment.reference.push(line.substr(1).trim()); break; case '.': comment.extracted.push(line.substr(1).replace(/^\s+/, '')); break; case ',': comment.flag.push(line.substr(1).replace(/^\s+/, '')); break; case '|': comment.previous.push(line.substr(1).replace(/^\s+/, '')); break; default: comment.translator.push(line.replace(/^\s+/, '')); } }); node.value = {}; Object.keys(comment).forEach(key => { if (comment[key] && comment[key].length) { node.value[key] = comment[key].join('\n'); } }); } }); }; /** * Join gettext keys with values * * @param {Object} tokens Parsed tokens * @return {Object} Tokens */ Parser.prototype._handleKeys = function (tokens) { const response = []; let lastNode; for (let i = 0, len = tokens.length; i < len; i++) { if (tokens[i].type === this.types.key) { lastNode = { key: tokens[i].value }; if (i && tokens[i - 1].type === this.types.comments) { lastNode.comments = tokens[i - 1].value; } lastNode.value = ''; response.push(lastNode); } else if (tokens[i].type === this.types.string && lastNode) { lastNode.value += tokens[i].value; } } return response; }; /** * Separate different values into individual translation objects * * @param {Object} tokens Parsed tokens * @return {Object} Tokens */ Parser.prototype._handleValues = function (tokens) { const response = []; let lastNode; let curContext; let curComments; for (let i = 0, len = tokens.length; i < len; i++) { if (tokens[i].key.toLowerCase() === 'msgctxt') { curContext = tokens[i].value; curComments = tokens[i].comments; } else if (tokens[i].key.toLowerCase() === 'msgid') { lastNode = { msgid: tokens[i].value }; if (curContext) { lastNode.msgctxt = curContext; } if (curComments) { lastNode.comments = curComments; } if (tokens[i].comments && !lastNode.comments) { lastNode.comments = tokens[i].comments; } curContext = false; curComments = false; response.push(lastNode); } else if (tokens[i].key.toLowerCase() === 'msgid_plural') { if (lastNode) { lastNode.msgid_plural = tokens[i].value; } if (tokens[i].comments && !lastNode.comments) { lastNode.comments = tokens[i].comments; } curContext = false; curComments = false; } else if (tokens[i].key.substr(0, 6).toLowerCase() === 'msgstr') { if (lastNode) { lastNode.msgstr = (lastNode.msgstr || []).concat(tokens[i].value); } if (tokens[i].comments && !lastNode.comments) { lastNode.comments = tokens[i].comments; } curContext = false; curComments = false; } } return response; }; /** * Compose a translation table from tokens object * * @param {Object} tokens Parsed tokens * @return {Object} Translation table */ Parser.prototype._normalize = function (tokens) { const table = { charset: this._charset, headers: undefined, translations: {} }; let msgctxt; for (let i = 0, len = tokens.length; i < len; i++) { msgctxt = tokens[i].msgctxt || ''; if (!table.translations[msgctxt]) { table.translations[msgctxt] = {}; } if (!table.headers && !msgctxt && !tokens[i].msgid) { table.headers = sharedFuncs.parseHeader(tokens[i].msgstr[0]); } table.translations[msgctxt][tokens[i].msgid] = tokens[i]; } return table; }; /** * Converts parsed tokens to a translation table * * @param {Object} tokens Parsed tokens * @returns {Object} Translation table */ Parser.prototype._finalize = function (tokens) { let data = this._joinStringValues(tokens); this._parseComments(data); data = this._handleKeys(data); data = this._handleValues(data); return this._normalize(data); }; /** * Creates a transform stream for parsing PO input * * @constructor * @param {String} [defaultCharset] Default charset to use * @param {String} [options] Stream options */ function PoParserTransform (defaultCharset, options) { if (!options && defaultCharset && typeof defaultCharset === 'object') { options = defaultCharset; defaultCharset = undefined; } this.defaultCharset = defaultCharset; this._parser = false; this._tokens = {}; this._cache = []; this._cacheSize = 0; this.initialTreshold = options.initialTreshold || 2 * 1024; Transform.call(this, options); this._writableState.objectMode = false; this._readableState.objectMode = true; } util.inherits(PoParserTransform, Transform); /** * Processes a chunk of the input stream */ PoParserTransform.prototype._transform = function (chunk, encoding, done) { let i; let len = 0; if (!chunk || !chunk.length) { return done(); } if (!this._parser) { this._cache.push(chunk); this._cacheSize += chunk.length; // wait until the first 1kb before parsing headers for charset if (this._cacheSize < this.initialTreshold) { return setImmediate(done); } else if (this._cacheSize) { chunk = Buffer.concat(this._cache, this._cacheSize); this._cacheSize = 0; this._cache = []; } this._parser = new Parser(chunk, this.defaultCharset); } else if (this._cacheSize) { // this only happens if we had an uncompleted 8bit sequence from the last iteration this._cache.push(chunk); this._cacheSize += chunk.length; chunk = Buffer.concat(this._cache, this._cacheSize); this._cacheSize = 0; this._cache = []; } // cache 8bit bytes from the end of the chunk // helps if the chunk ends in the middle of an utf-8 sequence for (i = chunk.length - 1; i >= 0; i--) { if (chunk[i] >= 0x80) { len++; continue; } break; } // it seems we found some 8bit bytes from the end of the string, so let's cache these if (len) { this._cache = [chunk.slice(chunk.length - len)]; this._cacheSize = this._cache[0].length; chunk = chunk.slice(0, chunk.length - len); } // chunk might be empty if it only continued of 8bit bytes and these were all cached if (chunk.length) { try { this._parser._lexer(this._parser._toString(chunk)); } catch (error) { setImmediate(() => { done(error); }); return; } } setImmediate(done); }; /** * Once all input has been processed emit the parsed translation table as an object */ PoParserTransform.prototype._flush = function (done) { let chunk; if (this._cacheSize) { chunk = Buffer.concat(this._cache, this._cacheSize); } if (!this._parser && chunk) { this._parser = new Parser(chunk, this.defaultCharset); } if (chunk) { try { this._parser._lexer(this._parser._toString(chunk)); } catch (error) { setImmediate(() => { done(error); }); return; } } if (this._parser) { this.push(this._parser._finalize(this._parser._lex)); } setImmediate(done); }; gettext-parser-4.0.2/lib/shared.js000066400000000000000000000077521353167774000170750ustar00rootroot00000000000000module.exports.parseHeader = parseHeader; module.exports.generateHeader = generateHeader; module.exports.formatCharset = formatCharset; module.exports.foldLine = foldLine; module.exports.compareMsgid = compareMsgid; // see https://www.gnu.org/software/gettext/manual/html_node/Header-Entry.html const HEADERS = new Map([ ['project-id-version', 'Project-Id-Version'], ['report-msgid-bugs-to', 'Report-Msgid-Bugs-To'], ['pot-creation-date', 'POT-Creation-Date'], ['po-revision-date', 'PO-Revision-Date'], ['last-translator', 'Last-Translator'], ['language-team', 'Language-Team'], ['language', 'Language'], ['content-type', 'Content-Type'], ['content-transfer-encoding', 'Content-Transfer-Encoding'], ['plural-forms', 'Plural-Forms'] ]); module.exports.HEADERS = HEADERS; /** * Parses a header string into an object of key-value pairs * * @param {String} str Header string * @return {Object} An object of key-value pairs */ function parseHeader (str = '') { return str.split('\n') .reduce((headers, line) => { const parts = line.split(':'); let key = (parts.shift() || '').trim(); if (key) { const value = parts.join(':').trim(); key = HEADERS.get(key.toLowerCase()) || key; headers[key] = value; } return headers; }, {}); } /** * Joins a header object of key value pairs into a header string * * @param {Object} header Object of key value pairs * @return {String} Header string */ function generateHeader (header = {}) { const keys = Object.keys(header) .filter(key => !!key); if (!keys.length) { return ''; } return keys.map(key => `${key}: ${(header[key] || '').trim()}` ) .join('\n') + '\n'; } /** * Normalizes charset name. Converts utf8 to utf-8, WIN1257 to windows-1257 etc. * * @param {String} charset Charset name * @return {String} Normalized charset name */ function formatCharset (charset = 'iso-8859-1', defaultCharset = 'iso-8859-1') { return charset.toString() .toLowerCase() .replace(/^utf[-_]?(\d+)$/, 'utf-$1') .replace(/^win(?:dows)?[-_]?(\d+)$/, 'windows-$1') .replace(/^latin[-_]?(\d+)$/, 'iso-8859-$1') .replace(/^(us[-_]?)?ascii$/, 'ascii') .replace(/^charset$/, defaultCharset) .trim(); } /** * Folds long lines according to PO format * * @param {String} str PO formatted string to be folded * @param {Number} [maxLen=76] Maximum allowed length for folded lines * @return {Array} An array of lines */ function foldLine (str, maxLen = 76) { const lines = []; const len = str.length; let curLine = ''; let pos = 0; let match; while (pos < len) { curLine = str.substr(pos, maxLen); // ensure that the line never ends with a partial escaping // make longer lines if needed while (curLine.substr(-1) === '\\' && pos + curLine.length < len) { curLine += str.charAt(pos + curLine.length); } // ensure that if possible, line breaks are done at reasonable places if ((match = /.*?\\n/.exec(curLine))) { // use everything before and including the first line break curLine = match[0]; } else if (pos + curLine.length < len) { // if we're not at the end if ((match = /.*\s+/.exec(curLine)) && /[^\s]/.test(match[0])) { // use everything before and including the last white space character (if anything) curLine = match[0]; } else if ((match = /.*[\x21-\x2f0-9\x5b-\x60\x7b-\x7e]+/.exec(curLine)) && /[^\x21-\x2f0-9\x5b-\x60\x7b-\x7e]/.test(match[0])) { // use everything before and including the last "special" character (if anything) curLine = match[0]; } } lines.push(curLine); pos += curLine.length; } return lines; } /** * Comparator function for comparing msgid * @param {Object} object with msgid prev * @param {Object} object with msgid next * @returns {number} comparator index */ function compareMsgid ({ msgid: left }, { msgid: right }) { if (left < right) { return -1; } if (left > right) { return 1; } return 0; } gettext-parser-4.0.2/package-lock.json000066400000000000000000002427711353167774000177410ustar00rootroot00000000000000{ "name": "gettext-parser", "version": "4.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { "@babel/code-frame": { "version": "7.5.5", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.5.5.tgz", "integrity": "sha512-27d4lZoomVyo51VegxI20xZPuSHusqbQag/ztrBC7wegWoQ1nLREPVSKSW8byhTlzTKyNE4ifaTA6lCp7JjpFw==", "dev": true, "requires": { "@babel/highlight": "^7.0.0" } }, "@babel/highlight": { "version": "7.5.0", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.5.0.tgz", "integrity": "sha512-7dV4eu9gBxoM0dAnj/BCFDW9LFU0zvTrkq0ugM7pnHEgguOEeOz1so2ZghEdzviYzQEED0r4EAgpsBChKy1TRQ==", "dev": true, "requires": { "chalk": "^2.0.0", "esutils": "^2.0.2", "js-tokens": "^4.0.0" } }, "acorn": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.0.0.tgz", "integrity": "sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==", "dev": true }, "acorn-jsx": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.0.2.tgz", "integrity": "sha512-tiNTrP1MP0QrChmD2DdupCr6HWSFeKVw5d/dHTu4Y7rkAkRhU/Dt7dphAfIUyxtHpl/eBVip5uTNSpQJHylpAw==", "dev": true }, "ajv": { "version": "6.10.2", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.10.2.tgz", "integrity": "sha512-TXtUUEYHuaTEbLZWIKUr5pmBuhDLy+8KYtPYdcV8qC+pOZL+NKqYwvWSRrVXHn+ZmRRAu8vJTAznH7Oag6RVRw==", "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", "json-schema-traverse": "^0.4.1", "uri-js": "^4.2.2" } }, "ansi-colors": { "version": "3.2.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz", "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==", "dev": true }, "ansi-escapes": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "dev": true }, "ansi-regex": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", "dev": true }, "ansi-styles": { "version": "3.2.1", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "requires": { "color-convert": "^1.9.0" } }, "argparse": { "version": "1.0.10", "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "dev": true, "requires": { "sprintf-js": "~1.0.2" } }, "array-includes": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.0.3.tgz", "integrity": "sha1-GEtI9i2S10UrsxsyMWXH+L0CJm0=", "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.7.0" } }, "assertion-error": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", "dev": true }, "astral-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz", "integrity": "sha512-+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==", "dev": true }, "balanced-match": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", "dev": true }, "brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "dev": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" } }, "browser-stdout": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", "dev": true }, "callsites": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", "dev": true }, "camelcase": { "version": "5.3.1", "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", "dev": true }, "chai": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", "dev": true, "requires": { "assertion-error": "^1.1.0", "check-error": "^1.0.2", "deep-eql": "^3.0.1", "get-func-name": "^2.0.0", "pathval": "^1.1.0", "type-detect": "^4.0.5" } }, "chalk": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "requires": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", "supports-color": "^5.3.0" } }, "chardet": { "version": "0.7.0", "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz", "integrity": "sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==", "dev": true }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", "dev": true }, "cli-cursor": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", "dev": true, "requires": { "restore-cursor": "^2.0.0" } }, "cli-width": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=", "dev": true }, "cliui": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz", "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==", "dev": true, "requires": { "string-width": "^2.1.1", "strip-ansi": "^4.0.0", "wrap-ansi": "^2.0.0" }, "dependencies": { "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } } } }, "code-point-at": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", "dev": true }, "color-convert": { "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { "color-name": "1.1.3" } }, "color-name": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", "dev": true }, "concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", "dev": true }, "contains-path": { "version": "0.1.0", "resolved": "https://registry.npmjs.org/contains-path/-/contains-path-0.1.0.tgz", "integrity": "sha1-/ozxhP9mcLa67wGp1IYaXL7EEgo=", "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==" }, "cross-spawn": { "version": "6.0.5", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz", "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==", "dev": true, "requires": { "nice-try": "^1.0.4", "path-key": "^2.0.1", "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" }, "dependencies": { "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "debug": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", "dev": true, "requires": { "ms": "^2.1.1" } }, "decamelize": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", "dev": true }, "deep-eql": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", "dev": true, "requires": { "type-detect": "^4.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 }, "define-properties": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", "dev": true, "requires": { "object-keys": "^1.0.12" } }, "diff": { "version": "3.5.0", "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", "dev": true }, "doctrine": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", "dev": true, "requires": { "esutils": "^2.0.2" } }, "emoji-regex": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz", "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==", "dev": true }, "encoding": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", "requires": { "iconv-lite": "~0.4.13" } }, "end-of-stream": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", "dev": true, "requires": { "once": "^1.4.0" } }, "error-ex": { "version": "1.3.2", "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", "dev": true, "requires": { "is-arrayish": "^0.2.1" } }, "es-abstract": { "version": "1.13.0", "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz", "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==", "dev": true, "requires": { "es-to-primitive": "^1.2.0", "function-bind": "^1.1.1", "has": "^1.0.3", "is-callable": "^1.1.4", "is-regex": "^1.0.4", "object-keys": "^1.0.12" } }, "es-to-primitive": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz", "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==", "dev": true, "requires": { "is-callable": "^1.1.4", "is-date-object": "^1.0.1", "is-symbol": "^1.0.2" } }, "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 }, "eslint": { "version": "6.2.2", "resolved": "https://registry.npmjs.org/eslint/-/eslint-6.2.2.tgz", "integrity": "sha512-mf0elOkxHbdyGX1IJEUsNBzCDdyoUgljF3rRlgfyYh0pwGnreLc0jjD6ZuleOibjmnUWZLY2eXwSooeOgGJ2jw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", "ajv": "^6.10.0", "chalk": "^2.1.0", "cross-spawn": "^6.0.5", "debug": "^4.0.1", "doctrine": "^3.0.0", "eslint-scope": "^5.0.0", "eslint-utils": "^1.4.2", "eslint-visitor-keys": "^1.1.0", "espree": "^6.1.1", "esquery": "^1.0.1", "esutils": "^2.0.2", "file-entry-cache": "^5.0.1", "functional-red-black-tree": "^1.0.1", "glob-parent": "^5.0.0", "globals": "^11.7.0", "ignore": "^4.0.6", "import-fresh": "^3.0.0", "imurmurhash": "^0.1.4", "inquirer": "^6.4.1", "is-glob": "^4.0.0", "js-yaml": "^3.13.1", "json-stable-stringify-without-jsonify": "^1.0.1", "levn": "^0.3.0", "lodash": "^4.17.14", "minimatch": "^3.0.4", "mkdirp": "^0.5.1", "natural-compare": "^1.4.0", "optionator": "^0.8.2", "progress": "^2.0.0", "regexpp": "^2.0.1", "semver": "^6.1.2", "strip-ansi": "^5.2.0", "strip-json-comments": "^3.0.1", "table": "^5.2.3", "text-table": "^0.2.0", "v8-compile-cache": "^2.0.3" } }, "eslint-config-standard": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/eslint-config-standard/-/eslint-config-standard-14.1.0.tgz", "integrity": "sha512-EF6XkrrGVbvv8hL/kYa/m6vnvmUT+K82pJJc4JJVMM6+Qgqh0pnwprSxdduDLB9p/7bIxD+YV5O0wfb8lmcPbA==", "dev": true }, "eslint-import-resolver-node": { "version": "0.3.2", "resolved": "https://registry.npmjs.org/eslint-import-resolver-node/-/eslint-import-resolver-node-0.3.2.tgz", "integrity": "sha512-sfmTqJfPSizWu4aymbPr4Iidp5yKm8yDkHp+Ir3YiTHiiDfxh69mOUsmiqW6RZ9zRXFaF64GtYmN7e+8GHBv6Q==", "dev": true, "requires": { "debug": "^2.6.9", "resolve": "^1.5.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" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "eslint-module-utils": { "version": "2.4.1", "resolved": "https://registry.npmjs.org/eslint-module-utils/-/eslint-module-utils-2.4.1.tgz", "integrity": "sha512-H6DOj+ejw7Tesdgbfs4jeS4YMFrT8uI8xwd1gtQqXssaR0EQ26L+2O/w6wkYFy2MymON0fTwHmXBvvfLNZVZEw==", "dev": true, "requires": { "debug": "^2.6.8", "pkg-dir": "^2.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" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "eslint-plugin-es": { "version": "1.4.1", "resolved": "https://registry.npmjs.org/eslint-plugin-es/-/eslint-plugin-es-1.4.1.tgz", "integrity": "sha512-5fa/gR2yR3NxQf+UXkeLeP8FBBl6tSgdrAz1+cF84v1FMM4twGwQoqTnn+QxFLcPOrF4pdKEJKDB/q9GoyJrCA==", "dev": true, "requires": { "eslint-utils": "^1.4.2", "regexpp": "^2.0.1" } }, "eslint-plugin-import": { "version": "2.18.2", "resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.18.2.tgz", "integrity": "sha512-5ohpsHAiUBRNaBWAF08izwUGlbrJoJJ+W9/TBwsGoR1MnlgfwMIKrFeSjWbt6moabiXW9xNvtFz+97KHRfI4HQ==", "dev": true, "requires": { "array-includes": "^3.0.3", "contains-path": "^0.1.0", "debug": "^2.6.9", "doctrine": "1.5.0", "eslint-import-resolver-node": "^0.3.2", "eslint-module-utils": "^2.4.0", "has": "^1.0.3", "minimatch": "^3.0.4", "object.values": "^1.1.0", "read-pkg-up": "^2.0.0", "resolve": "^1.11.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" } }, "doctrine": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-1.5.0.tgz", "integrity": "sha1-N53Ocw9hZvds76TmcHoVmwLFpvo=", "dev": true, "requires": { "esutils": "^2.0.2", "isarray": "^1.0.0" } }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", "dev": true } } }, "eslint-plugin-node": { "version": "9.1.0", "resolved": "https://registry.npmjs.org/eslint-plugin-node/-/eslint-plugin-node-9.1.0.tgz", "integrity": "sha512-ZwQYGm6EoV2cfLpE1wxJWsfnKUIXfM/KM09/TlorkukgCAwmkgajEJnPCmyzoFPQQkmvo5DrW/nyKutNIw36Mw==", "dev": true, "requires": { "eslint-plugin-es": "^1.4.0", "eslint-utils": "^1.3.1", "ignore": "^5.1.1", "minimatch": "^3.0.4", "resolve": "^1.10.1", "semver": "^6.1.0" }, "dependencies": { "ignore": { "version": "5.1.4", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.1.4.tgz", "integrity": "sha512-MzbUSahkTW1u7JpKKjY7LCARd1fU5W2rLdxlM4kdkayuCwZImjkpluF9CM1aLewYJguPDqewLam18Y6AU69A8A==", "dev": true } } }, "eslint-plugin-promise": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/eslint-plugin-promise/-/eslint-plugin-promise-4.2.1.tgz", "integrity": "sha512-VoM09vT7bfA7D+upt+FjeBO5eHIJQBUWki1aPvB+vbNiHS3+oGIJGIeyBtKQTME6UPXXy3vV07OL1tHd3ANuDw==", "dev": true }, "eslint-plugin-standard": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-4.0.1.tgz", "integrity": "sha512-v/KBnfyaOMPmZc/dmc6ozOdWqekGp7bBGq4jLAecEfPGmfKiWS4sA8sC0LqiV9w5qmXAtXVn4M3p1jSyhY85SQ==", "dev": true }, "eslint-scope": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.0.0.tgz", "integrity": "sha512-oYrhJW7S0bxAFDvWqzvMPRm6pcgcnWc4QnofCAqRTRfQC0JcwenzGglTtsLyIuuWFfkqDG9vz67cnttSd53djw==", "dev": true, "requires": { "esrecurse": "^4.1.0", "estraverse": "^4.1.1" } }, "eslint-utils": { "version": "1.4.2", "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.2.tgz", "integrity": "sha512-eAZS2sEUMlIeCjBeubdj45dmBHQwPHWyBcT1VSYB7o9x9WRRqKxyUoiXlRjyAwzN7YEzHJlYg0NmzDRWx6GP4Q==", "dev": true, "requires": { "eslint-visitor-keys": "^1.0.0" } }, "eslint-visitor-keys": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.1.0.tgz", "integrity": "sha512-8y9YjtM1JBJU/A9Kc+SbaOV4y29sSWckBwMHa+FGtVj5gN/sbnKDf6xJUl+8g7FAij9LVaP8C24DUiH/f/2Z9A==", "dev": true }, "espree": { "version": "6.1.1", "resolved": "https://registry.npmjs.org/espree/-/espree-6.1.1.tgz", "integrity": "sha512-EYbr8XZUhWbYCqQRW0duU5LxzL5bETN6AjKBGy1302qqzPaCH10QbRg3Wvco79Z8x9WbiE8HYB4e75xl6qUYvQ==", "dev": true, "requires": { "acorn": "^7.0.0", "acorn-jsx": "^5.0.2", "eslint-visitor-keys": "^1.1.0" } }, "esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", "dev": true }, "esquery": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.1.tgz", "integrity": "sha512-SmiyZ5zIWH9VM+SRUReLS5Q8a7GxtRdxEBVZpm98rJM7Sb+A9DVCndXfkeFUd3byderg+EbDkfnevfCwynWaNA==", "dev": true, "requires": { "estraverse": "^4.0.0" } }, "esrecurse": { "version": "4.2.1", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz", "integrity": "sha512-64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==", "dev": true, "requires": { "estraverse": "^4.1.0" } }, "estraverse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", "dev": true }, "esutils": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", "dev": true }, "execa": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz", "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==", "dev": true, "requires": { "cross-spawn": "^6.0.0", "get-stream": "^4.0.0", "is-stream": "^1.1.0", "npm-run-path": "^2.0.0", "p-finally": "^1.0.0", "signal-exit": "^3.0.0", "strip-eof": "^1.0.0" } }, "external-editor": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz", "integrity": "sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==", "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", "tmp": "^0.0.33" } }, "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", "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 }, "figures": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", "dev": true, "requires": { "escape-string-regexp": "^1.0.5" } }, "file-entry-cache": { "version": "5.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz", "integrity": "sha512-bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==", "dev": true, "requires": { "flat-cache": "^2.0.1" } }, "find-up": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", "dev": true, "requires": { "locate-path": "^2.0.0" } }, "flat": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz", "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==", "dev": true, "requires": { "is-buffer": "~2.0.3" } }, "flat-cache": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz", "integrity": "sha512-LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==", "dev": true, "requires": { "flatted": "^2.0.0", "rimraf": "2.6.3", "write": "1.0.3" } }, "flatted": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-2.0.1.tgz", "integrity": "sha512-a1hQMktqW9Nmqr5aktAux3JMNqaucxGcjtjWnZLHX7yyPCmlSV3M54nGYbqT8K+0GhF3NBgmJCc3ma+WOgX8Jg==", "dev": true }, "fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", "dev": true }, "function-bind": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", "dev": true }, "functional-red-black-tree": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", "dev": true }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", "dev": true }, "get-func-name": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", "dev": true }, "get-stream": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz", "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==", "dev": true, "requires": { "pump": "^3.0.0" } }, "glob": { "version": "7.1.4", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz", "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "glob-parent": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.0.0.tgz", "integrity": "sha512-Z2RwiujPRGluePM6j699ktJYxmPpJKCfpGA13jz2hmFZC7gKetzrWvg5KN3+OsIFmydGyZ1AVwERCq1w/ZZwRg==", "dev": true, "requires": { "is-glob": "^4.0.1" } }, "globals": { "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true }, "graceful-fs": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.2.tgz", "integrity": "sha512-IItsdsea19BoLC7ELy13q1iJFNmd7ofZH5+X/pJr90/nRoPEX0DJo1dHDbgtYWOhJhcCgMDTOw84RZ72q6lB+Q==", "dev": true }, "growl": { "version": "1.10.5", "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", "dev": true }, "has": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "dev": true, "requires": { "function-bind": "^1.1.1" } }, "has-flag": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", "dev": true }, "has-symbols": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz", "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=", "dev": true }, "he": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", "dev": true }, "hosted-git-info": { "version": "2.8.4", "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.8.4.tgz", "integrity": "sha512-pzXIvANXEFrc5oFFXRMkbLPQ2rXRoDERwDLyrcUxGhaZhgP54BBSl9Oheh7Vv0T090cszWBxPjkQQ5Sq1PbBRQ==", "dev": true }, "iconv-lite": { "version": "0.4.24", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", "requires": { "safer-buffer": ">= 2.1.2 < 3" } }, "ignore": { "version": "4.0.6", "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", "dev": true }, "import-fresh": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.1.0.tgz", "integrity": "sha512-PpuksHKGt8rXfWEr9m9EHIpgyyaltBy8+eF6GJM0QCAxMgxCfucMF3mjecK2QsJr0amJW7gTqh5/wht0z2UhEQ==", "dev": true, "requires": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" } }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", "dev": true }, "inflight": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", "dev": true, "requires": { "once": "^1.3.0", "wrappy": "1" } }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "inquirer": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", "dev": true, "requires": { "ansi-escapes": "^3.2.0", "chalk": "^2.4.2", "cli-cursor": "^2.1.0", "cli-width": "^2.0.0", "external-editor": "^3.0.3", "figures": "^2.0.0", "lodash": "^4.17.12", "mute-stream": "0.0.7", "run-async": "^2.2.0", "rxjs": "^6.4.0", "string-width": "^2.1.0", "strip-ansi": "^5.1.0", "through": "^2.3.6" } }, "invert-kv": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz", "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==", "dev": true }, "is-arrayish": { "version": "0.2.1", "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", "dev": true }, "is-buffer": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz", "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==", "dev": true }, "is-callable": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz", "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==", "dev": true }, "is-date-object": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", "dev": true }, "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", "dev": true }, "is-fullwidth-code-point": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", "dev": true }, "is-glob": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz", "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==", "dev": true, "requires": { "is-extglob": "^2.1.1" } }, "is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=", "dev": true }, "is-regex": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", "dev": true, "requires": { "has": "^1.0.1" } }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, "is-symbol": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz", "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==", "dev": true, "requires": { "has-symbols": "^1.0.0" } }, "isarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", "dev": true }, "isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", "dev": true }, "js-tokens": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, "js-yaml": { "version": "3.13.1", "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", "dev": true, "requires": { "argparse": "^1.0.7", "esprima": "^4.0.0" } }, "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", "dev": true }, "json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", "dev": true }, "lcid": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz", "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==", "dev": true, "requires": { "invert-kv": "^2.0.0" } }, "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" } }, "load-json-file": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", "dev": true, "requires": { "graceful-fs": "^4.1.2", "parse-json": "^2.2.0", "pify": "^2.0.0", "strip-bom": "^3.0.0" } }, "locate-path": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", "dev": true, "requires": { "p-locate": "^2.0.0", "path-exists": "^3.0.0" } }, "lodash": { "version": "4.17.15", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz", "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==", "dev": true }, "log-symbols": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz", "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==", "dev": true, "requires": { "chalk": "^2.0.1" } }, "map-age-cleaner": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz", "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==", "dev": true, "requires": { "p-defer": "^1.0.0" } }, "mem": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz", "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==", "dev": true, "requires": { "map-age-cleaner": "^0.1.1", "mimic-fn": "^2.0.0", "p-is-promise": "^2.0.0" }, "dependencies": { "mimic-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", "dev": true } } }, "mimic-fn": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", "dev": true }, "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": "^1.1.7" } }, "minimist": { "version": "0.0.8", "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", "dev": 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" } }, "mocha": { "version": "6.2.0", "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.2.0.tgz", "integrity": "sha512-qwfFgY+7EKAAUAdv7VYMZQknI7YJSGesxHyhn6qD52DV8UcSZs5XwCifcZGMVIE4a5fbmhvbotxC0DLQ0oKohQ==", "dev": true, "requires": { "ansi-colors": "3.2.3", "browser-stdout": "1.3.1", "debug": "3.2.6", "diff": "3.5.0", "escape-string-regexp": "1.0.5", "find-up": "3.0.0", "glob": "7.1.3", "growl": "1.10.5", "he": "1.2.0", "js-yaml": "3.13.1", "log-symbols": "2.2.0", "minimatch": "3.0.4", "mkdirp": "0.5.1", "ms": "2.1.1", "node-environment-flags": "1.0.5", "object.assign": "4.1.0", "strip-json-comments": "2.0.1", "supports-color": "6.0.0", "which": "1.3.1", "wide-align": "1.1.3", "yargs": "13.2.2", "yargs-parser": "13.0.0", "yargs-unparser": "1.5.0" }, "dependencies": { "debug": { "version": "3.2.6", "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz", "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==", "dev": true, "requires": { "ms": "^2.1.1" } }, "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "glob": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", "dev": true, "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", "minimatch": "^3.0.4", "once": "^1.3.0", "path-is-absolute": "^1.0.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "ms": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", "dev": true }, "p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "strip-json-comments": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", "dev": true }, "supports-color": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz", "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==", "dev": true, "requires": { "has-flag": "^3.0.0" } } } }, "ms": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", "dev": true }, "mute-stream": { "version": "0.0.7", "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=", "dev": true }, "natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", "dev": true }, "nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==", "dev": true }, "node-environment-flags": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz", "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==", "dev": true, "requires": { "object.getownpropertydescriptors": "^2.0.3", "semver": "^5.7.0" }, "dependencies": { "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "normalize-package-data": { "version": "2.5.0", "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz", "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==", "dev": true, "requires": { "hosted-git-info": "^2.1.4", "resolve": "^1.10.0", "semver": "2 || 3 || 4 || 5", "validate-npm-package-license": "^3.0.1" }, "dependencies": { "semver": { "version": "5.7.1", "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true } } }, "npm-run-path": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", "dev": true, "requires": { "path-key": "^2.0.0" } }, "number-is-nan": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", "dev": true }, "object-keys": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", "dev": true }, "object.assign": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", "dev": true, "requires": { "define-properties": "^1.1.2", "function-bind": "^1.1.1", "has-symbols": "^1.0.0", "object-keys": "^1.0.11" } }, "object.getownpropertydescriptors": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", "dev": true, "requires": { "define-properties": "^1.1.2", "es-abstract": "^1.5.1" } }, "object.values": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.0.tgz", "integrity": "sha512-8mf0nKLAoFX6VlNVdhGj31SVYpaNFtUnuoOXWyFEstsWRgU837AK+JYM0iAxwkSzGRbwn8cbFmgbyxj1j4VbXg==", "dev": true, "requires": { "define-properties": "^1.1.3", "es-abstract": "^1.12.0", "function-bind": "^1.1.1", "has": "^1.0.3" } }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", "dev": true, "requires": { "wrappy": "1" } }, "onetime": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", "dev": true, "requires": { "mimic-fn": "^1.0.0" } }, "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.4", "levn": "~0.3.0", "prelude-ls": "~1.1.2", "type-check": "~0.3.2", "wordwrap": "~1.0.0" } }, "os-locale": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz", "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==", "dev": true, "requires": { "execa": "^1.0.0", "lcid": "^2.0.0", "mem": "^4.0.0" } }, "os-tmpdir": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", "dev": true }, "p-defer": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz", "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=", "dev": true }, "p-finally": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", "dev": true }, "p-is-promise": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz", "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==", "dev": true }, "p-limit": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz", "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==", "dev": true, "requires": { "p-try": "^1.0.0" } }, "p-locate": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", "dev": true, "requires": { "p-limit": "^1.1.0" } }, "p-try": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", "dev": true }, "parent-module": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", "dev": true, "requires": { "callsites": "^3.0.0" } }, "parse-json": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", "dev": true, "requires": { "error-ex": "^1.2.0" } }, "path-exists": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", "dev": true }, "path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", "dev": true }, "path-key": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", "dev": true }, "path-parse": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", "dev": true }, "path-type": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", "dev": true, "requires": { "pify": "^2.0.0" } }, "pathval": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", "dev": true }, "pify": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", "dev": true }, "pkg-dir": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz", "integrity": "sha1-9tXREJ4Z1j7fQo4L1X4Sd3YVM0s=", "dev": true, "requires": { "find-up": "^2.1.0" } }, "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 }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "dev": true }, "pump": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "dev": true, "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" } }, "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", "dev": true }, "read-pkg": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", "dev": true, "requires": { "load-json-file": "^2.0.0", "normalize-package-data": "^2.3.2", "path-type": "^2.0.0" } }, "read-pkg-up": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", "dev": true, "requires": { "find-up": "^2.0.0", "read-pkg": "^2.0.0" } }, "readable-stream": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.4.0.tgz", "integrity": "sha512-jItXPLmrSR8jmTRmRWJXCnGJsfy85mB3Wd/uINMXA65yrnFo0cPClFIUWzo2najVNSl+mx7/4W8ttlLWJe99pQ==", "requires": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", "util-deprecate": "^1.0.1" } }, "regexpp": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz", "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==", "dev": true }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", "dev": true }, "require-main-filename": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz", "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==", "dev": true }, "resolve": { "version": "1.12.0", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.12.0.tgz", "integrity": "sha512-B/dOmuoAik5bKcD6s6nXDCjzUKnaDvdkRyAk6rsmsKLipWj4797iothd7jmmUhWTfinVMU+wc56rYKsit2Qy4w==", "dev": true, "requires": { "path-parse": "^1.0.6" } }, "resolve-from": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", "dev": true }, "restore-cursor": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", "dev": true, "requires": { "onetime": "^2.0.0", "signal-exit": "^3.0.2" } }, "rimraf": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", "dev": true, "requires": { "glob": "^7.1.3" } }, "run-async": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", "dev": true, "requires": { "is-promise": "^2.1.0" } }, "rxjs": { "version": "6.5.2", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz", "integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==", "dev": true, "requires": { "tslib": "^1.9.0" } }, "safe-buffer": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.0.tgz", "integrity": "sha512-fZEwUGbVl7kouZs1jCdMLdt95hdIv0ZeHg6L7qPeciMZhZ+/gdesW4wgTARkrFWEpspjEATAzUGPG8N2jJiwbg==" }, "safer-buffer": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", "dev": true }, "shebang-command": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", "dev": true, "requires": { "shebang-regex": "^1.0.0" } }, "shebang-regex": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", "dev": true }, "signal-exit": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", "dev": true }, "slice-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz", "integrity": "sha512-Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==", "dev": true, "requires": { "ansi-styles": "^3.2.0", "astral-regex": "^1.0.0", "is-fullwidth-code-point": "^2.0.0" } }, "spdx-correct": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz", "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==", "dev": true, "requires": { "spdx-expression-parse": "^3.0.0", "spdx-license-ids": "^3.0.0" } }, "spdx-exceptions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz", "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==", "dev": true }, "spdx-expression-parse": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz", "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==", "dev": true, "requires": { "spdx-exceptions": "^2.1.0", "spdx-license-ids": "^3.0.0" } }, "spdx-license-ids": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz", "integrity": "sha512-J+FWzZoynJEXGphVIS+XEh3kFSjZX/1i9gFBaWQcB+/tmpe2qUsSBABpcxqxnAxFdiUFEgAX1bjYGQvIZmoz9Q==", "dev": true }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", "dev": true }, "string-width": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", "dev": true, "requires": { "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^4.0.0" }, "dependencies": { "strip-ansi": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", "dev": true, "requires": { "ansi-regex": "^3.0.0" } } } }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "requires": { "safe-buffer": "~5.2.0" } }, "strip-ansi": { "version": "5.2.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", "dev": true, "requires": { "ansi-regex": "^4.1.0" }, "dependencies": { "ansi-regex": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz", "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==", "dev": true } } }, "strip-bom": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", "dev": true }, "strip-eof": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", "dev": true }, "strip-json-comments": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.0.1.tgz", "integrity": "sha512-VTyMAUfdm047mwKl+u79WIdrZxtFtn+nBxHeb844XBQ9uMNTuTHdx2hc5RiAJYqwTj3wc/xe5HLSdJSkJ+WfZw==", "dev": true }, "supports-color": { "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "requires": { "has-flag": "^3.0.0" } }, "table": { "version": "5.4.6", "resolved": "https://registry.npmjs.org/table/-/table-5.4.6.tgz", "integrity": "sha512-wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==", "dev": true, "requires": { "ajv": "^6.10.2", "lodash": "^4.17.14", "slice-ansi": "^2.1.0", "string-width": "^3.0.0" }, "dependencies": { "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } } } }, "text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", "dev": true }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", "dev": true }, "tmp": { "version": "0.0.33", "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", "dev": true, "requires": { "os-tmpdir": "~1.0.2" } }, "tslib": { "version": "1.10.0", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.10.0.tgz", "integrity": "sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==", "dev": 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.8", "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", "dev": true }, "uri-js": { "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", "dev": true, "requires": { "punycode": "^2.1.0" } }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" }, "v8-compile-cache": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz", "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==", "dev": true }, "validate-npm-package-license": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz", "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==", "dev": true, "requires": { "spdx-correct": "^3.0.0", "spdx-expression-parse": "^3.0.0" } }, "which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, "requires": { "isexe": "^2.0.0" } }, "which-module": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", "dev": true }, "wide-align": { "version": "1.1.3", "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", "dev": true, "requires": { "string-width": "^1.0.2 || 2" } }, "wordwrap": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", "dev": true }, "wrap-ansi": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", "dev": true, "requires": { "string-width": "^1.0.1", "strip-ansi": "^3.0.1" }, "dependencies": { "ansi-regex": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", "dev": true }, "is-fullwidth-code-point": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", "dev": true, "requires": { "number-is-nan": "^1.0.0" } }, "string-width": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", "dev": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", "strip-ansi": "^3.0.0" } }, "strip-ansi": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", "dev": true, "requires": { "ansi-regex": "^2.0.0" } } } }, "wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", "dev": true }, "write": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/write/-/write-1.0.3.tgz", "integrity": "sha512-/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==", "dev": true, "requires": { "mkdirp": "^0.5.1" } }, "y18n": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz", "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==", "dev": true }, "yargs": { "version": "13.2.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz", "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==", "dev": true, "requires": { "cliui": "^4.0.0", "find-up": "^3.0.0", "get-caller-file": "^2.0.1", "os-locale": "^3.1.0", "require-directory": "^2.1.1", "require-main-filename": "^2.0.0", "set-blocking": "^2.0.0", "string-width": "^3.0.0", "which-module": "^2.0.0", "y18n": "^4.0.0", "yargs-parser": "^13.0.0" }, "dependencies": { "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "string-width": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz", "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==", "dev": true, "requires": { "emoji-regex": "^7.0.1", "is-fullwidth-code-point": "^2.0.0", "strip-ansi": "^5.1.0" } } } }, "yargs-parser": { "version": "13.0.0", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz", "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } }, "yargs-unparser": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz", "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==", "dev": true, "requires": { "flat": "^4.1.0", "lodash": "^4.17.11", "yargs": "^12.0.5" }, "dependencies": { "find-up": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz", "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==", "dev": true, "requires": { "locate-path": "^3.0.0" } }, "get-caller-file": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz", "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==", "dev": true }, "locate-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz", "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==", "dev": true, "requires": { "p-locate": "^3.0.0", "path-exists": "^3.0.0" } }, "p-limit": { "version": "2.2.1", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.1.tgz", "integrity": "sha512-85Tk+90UCVWvbDavCLKPOLC9vvY8OwEX/RtKF+/1OADJMVlFfEHOiMTPVyxg7mk/dKa+ipdHm0OUkTvCpMTuwg==", "dev": true, "requires": { "p-try": "^2.0.0" } }, "p-locate": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz", "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==", "dev": true, "requires": { "p-limit": "^2.0.0" } }, "p-try": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", "dev": true }, "require-main-filename": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", "dev": true }, "yargs": { "version": "12.0.5", "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz", "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==", "dev": true, "requires": { "cliui": "^4.0.0", "decamelize": "^1.2.0", "find-up": "^3.0.0", "get-caller-file": "^1.0.1", "os-locale": "^3.0.0", "require-directory": "^2.1.1", "require-main-filename": "^1.0.1", "set-blocking": "^2.0.0", "string-width": "^2.0.0", "which-module": "^2.0.0", "y18n": "^3.2.1 || ^4.0.0", "yargs-parser": "^11.1.1" } }, "yargs-parser": { "version": "11.1.1", "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz", "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==", "dev": true, "requires": { "camelcase": "^5.0.0", "decamelize": "^1.2.0" } } } } } } gettext-parser-4.0.2/package.json000066400000000000000000000024131353167774000167760ustar00rootroot00000000000000{ "name": "gettext-parser", "description": "Parse and compile gettext po and mo files to/from json, nothing more, nothing less", "version": "4.0.2", "author": "Andris Reinman", "contributors": [ { "name": "Sam Hauglustaine" } ], "homepage": "http://github.com/smhg/gettext-parser", "repository": { "type": "git", "url": "http://github.com/smhg/gettext-parser.git" }, "scripts": { "lint": "eslint lib/*.js test/*.js index.js", "test-generate-mo": "msgfmt test/fixtures/latin13.po -o test/fixtures/latin13.mo & msgfmt test/fixtures/utf8.po -o test/fixtures/utf8.mo", "test": "mocha", "preversion": "npm run lint && npm test", "postversion": "git push && git push --tags" }, "main": "./index", "license": "MIT", "dependencies": { "content-type": "^1.0.4", "encoding": "^0.1.12", "readable-stream": "^3.4.0", "safe-buffer": "^5.2.0" }, "devDependencies": { "chai": "^4.2.0", "eslint": "^6.0.1", "eslint-config-standard": "^14.1.0", "eslint-plugin-import": "^2.18.0", "eslint-plugin-node": "^9.1.0", "eslint-plugin-promise": "^4.2.1", "eslint-plugin-standard": "^4.0.0", "mocha": "^6.1.4" }, "keywords": [ "i18n", "l10n", "gettext", "mo", "po" ] } gettext-parser-4.0.2/test/000077500000000000000000000000001353167774000154675ustar00rootroot00000000000000gettext-parser-4.0.2/test/.eslintrc.js000066400000000000000000000000661353167774000177300ustar00rootroot00000000000000module.exports = { 'env': { 'mocha': true } } gettext-parser-4.0.2/test/fixtures/000077500000000000000000000000001353167774000173405ustar00rootroot00000000000000gettext-parser-4.0.2/test/fixtures/error-double-escaped-quote.po000066400000000000000000000012051353167774000250340ustar00rootroot00000000000000# gettext-parser test file. msgid "" msgstr "" "Project-Id-Version: gettext-parser\n" "Report-Msgid-Bugs-To: andris@node.ee\n" "POT-Creation-Date: 2012-05-18 14:28:00+03:00\n" "PO-Revision-Date: 2012-05-18 14:37+0300\n" "Last-Translator: Andris Reinman \n" "Language-Team: gettext-parser \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Poedit-Language: Estonian\n" "X-Poedit-Country: ESTONIA\n" "X-Poedit-Sourcecharset: utf-8\n" # Double-escaped double quote msgid "o2" msgstr "t2\\"-4\\""gettext-parser-4.0.2/test/fixtures/error-unescaped-quote.po000066400000000000000000000011741353167774000241340ustar00rootroot00000000000000# gettext-parser test file. msgid "" msgstr "" "Project-Id-Version: gettext-parser\n" "Report-Msgid-Bugs-To: andris@node.ee\n" "POT-Creation-Date: 2012-05-18 14:28:00+03:00\n" "PO-Revision-Date: 2012-05-18 14:37+0300\n" "Last-Translator: Andris Reinman \n" "Language-Team: gettext-parser \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Language: \n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "X-Poedit-Language: Estonian\n" "X-Poedit-Country: ESTONIA\n" "X-Poedit-Sourcecharset: utf-8\n" # Unescaped double quote msgid "o1" msgstr "t1"-4""gettext-parser-4.0.2/test/fixtures/headers-case.json000066400000000000000000000004521353167774000225600ustar00rootroot00000000000000{ "headers": { "Project-Id-Version": "project 1.0.2", "Content-Type": "text/plain; charset=UTF-8", "Content-Transfer-Encoding": "8bit", "Plural-Forms": "nplurals=2; plural=(n!=1);", "Mime-Version": "1.0", "X-Poedit-SourceCharset": "UTF-8" } }gettext-parser-4.0.2/test/fixtures/headers-case.po000066400000000000000000000003551353167774000222270ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: project 1.0.2\n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "Mime-Version: 1.0\n" "X-Poedit-SourceCharset: UTF-8\n"gettext-parser-4.0.2/test/fixtures/headers-charset.json000066400000000000000000000006651353167774000233040ustar00rootroot00000000000000{ "charset": "utf-8", "headers": { "Content-Type": "text/plain; charset=UTF-8", "Project-Id-Version": "PACKAGE VERSION" }, "translations": { "": { "": { "msgid": "", "msgstr": [ "Project-Id-Version: PACKAGE VERSION\nContent-Type: text/plain; charset=UTF-8\n" ] }, "test": { "msgid": "test", "msgstr": [ "test" ] } } } }gettext-parser-4.0.2/test/fixtures/headers-charset.po000066400000000000000000000002021353167774000227340ustar00rootroot00000000000000msgid "" msgstr "" "Project-Id-Version: PACKAGE VERSION\n" "Content-Type: text/plain; charset=UTF-8\n" msgid "test" msgstr "test"gettext-parser-4.0.2/test/fixtures/latin13-mo.json000066400000000000000000000046111353167774000221210ustar00rootroot00000000000000{ "charset": "iso-8859-13", "headers": { "Project-Id-Version": "gettext-parser", "Report-Msgid-Bugs-To": "andris@node.ee", "PO-Revision-Date": "2012-05-18 14:44+0300", "Last-Translator": "Andris Reinman ", "Language-Team": "gettext-parser ", "Language": "", "Content-Type": "text/plain; charset=iso-8859-13", "Content-Transfer-Encoding": "8bit", "Plural-Forms": "nplurals=2; plural=(n!=1);", "mime-version": "1.0", "x-poedit-language": "Estonian", "x-poedit-country": "ESTONIA", "x-poedit-sourcecharset": "iso-8859-13" }, "translations": { "": { "": { "msgid": "", "msgstr": [ "Project-Id-Version: gettext-parser\nReport-Msgid-Bugs-To: andris@node.ee\nPO-Revision-Date: 2012-05-18 14:44+0300\nLast-Translator: Andris Reinman \nLanguage-Team: gettext-parser \nLanguage: \nContent-Type: text/plain; charset=iso-8859-13\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n!=1);\nmime-version: 1.0\nx-poedit-language: Estonian\nx-poedit-country: ESTONIA\nx-poedit-sourcecharset: iso-8859-13\n" ] }, "o1": { "msgid": "o1", "msgstr": [ "t1" ] }, "o2-1": { "msgid": "o2-1", "msgid_plural": "o2-2", "msgstr": [ "t2-1", "t2-2" ] }, "o3-õäöü": { "msgid": "o3-õäöü", "msgstr": [ "t3-žš" ] }, "test": { "msgid": "test", "msgstr": [ "test" ] } }, "c1": { "co1": { "msgctxt": "c1", "msgid": "co1", "msgstr": [ "ct1" ] } }, "c2": { "co2-1": { "msgctxt": "c2", "msgid": "co2-1", "msgid_plural": "co2-2", "msgstr": [ "ct2-1", "ct2-2" ] } } } }gettext-parser-4.0.2/test/fixtures/latin13-po.json000066400000000000000000000072571353167774000221350ustar00rootroot00000000000000{ "charset": "iso-8859-13", "headers": { "Project-Id-Version": "gettext-parser", "Report-Msgid-Bugs-To": "andris@node.ee", "POT-Creation-Date": "2012-05-18 14:28:00+03:00", "PO-Revision-Date": "2012-05-18 14:44+0300", "Last-Translator": "Andris Reinman ", "Language-Team": "gettext-parser ", "Language": "", "Content-Type": "text/plain; charset=iso-8859-13", "Content-Transfer-Encoding": "8bit", "Plural-Forms": "nplurals=2; plural=(n!=1);", "mime-version": "1.0", "x-poedit-language": "Estonian", "x-poedit-country": "ESTONIA", "x-poedit-sourcecharset": "iso-8859-13" }, "translations": { "": { "": { "msgid": "", "comments": { "translator": "gettext-parser test file.\nCopyright (C) 2012 Andris Reinman\nThis file is distributed under the same license as the gettext-parser package.\nANDRIS REINMAN , 2012.\n" }, "msgstr": [ "Project-Id-Version: gettext-parser\nReport-Msgid-Bugs-To: andris@node.ee\nPOT-Creation-Date: 2012-05-18 14:28:00+03:00\nPO-Revision-Date: 2012-05-18 14:44+0300\nLast-Translator: Andris Reinman \nLanguage-Team: gettext-parser \nLanguage: \nContent-Type: text/plain; charset=iso-8859-13\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n!=1);\nmime-version: 1.0\nx-poedit-language: Estonian\nx-poedit-country: ESTONIA\nx-poedit-sourcecharset: iso-8859-13\n" ] }, "o1": { "msgid": "o1", "comments": { "translator": "Normal string" }, "msgstr": [ "t1" ] }, "o2-1": { "msgid": "o2-1", "comments": { "translator": "Plural string" }, "msgid_plural": "o2-2", "msgstr": [ "t2-1", "t2-2" ] }, "o3-õäöü": { "msgid": "o3-õäöü", "comments": { "translator": "Normal string with special chars" }, "msgstr": [ "t3-žš" ] }, "test": { "msgid": "test", "comments": { "translator": "Normal comment line 1\nNormal comment line 2", "extracted": "Editors note line 1\nEditors note line 2", "reference": "/absolute/path:13\n/absolute/path:14", "flag": "line 1\nline 2", "previous": "msgid \"previous-line1\"\n\"previous-line2\"" }, "msgstr": [ "test" ] } }, "c1": { "co1": { "msgid": "co1", "msgctxt": "c1", "comments": { "translator": "Normal string in a context" }, "msgstr": [ "ct1" ] } }, "c2": { "co2-1": { "msgid": "co2-1", "msgctxt": "c2", "comments": { "translator": "Plural string in a context" }, "msgid_plural": "co2-2", "msgstr": [ "ct2-1", "ct2-2" ] } } } }gettext-parser-4.0.2/test/fixtures/latin13.mo000066400000000000000000000012461353167774000211530ustar00rootroot00000000000000T ~  c1co1c2co2-1co2-2o1o2-1o2-2o3-testProject-Id-Version: gettext-parser Report-Msgid-Bugs-To: andris@node.ee PO-Revision-Date: 2012-05-18 14:44+0300 Last-Translator: Andris Reinman Language-Team: gettext-parser Language: Content-Type: text/plain; charset=iso-8859-13 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n!=1); mime-version: 1.0 x-poedit-language: Estonian x-poedit-country: ESTONIA x-poedit-sourcecharset: iso-8859-13 ct1ct2-1ct2-2t1t2-1t2-2t3-testgettext-parser-4.0.2/test/fixtures/latin13.po000066400000000000000000000025171353167774000211600ustar00rootroot00000000000000# gettext-parser test file. # Copyright (C) 2012 Andris Reinman # This file is distributed under the same license as the gettext-parser package. # ANDRIS REINMAN , 2012. # msgid "" msgstr "" "Project-Id-Version: gettext-parser\n" "Report-Msgid-Bugs-To: andris@node.ee\n" "POT-Creation-Date: 2012-05-18 14:28:00+03:00\n" "PO-Revision-Date: 2012-05-18 14:44+0300\n" "Last-Translator: Andris Reinman \n" "Language-Team: gettext-parser \n" "Language: \n" "Content-Type: text/plain; charset=iso-8859-13\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "mime-version: 1.0\n" "x-poedit-language: Estonian\n" "x-poedit-country: ESTONIA\n" "x-poedit-sourcecharset: iso-8859-13\n" # Normal string msgid "o1" msgstr "t1" # Plural string msgid "o2-1" msgid_plural "o2-2" msgstr[0] "t2-1" msgstr[1] "t2-2" # Normal string with special chars msgid "o3-" msgstr "t3-" # Normal comment line 1 # Normal comment line 2 #: /absolute/path:13 #: /absolute/path:14 #. Editors note line 1 #. Editors note line 2 #, line 1 #, line 2 #| msgid "previous-line1" #| "previous-line2" msgid "test" msgstr "test" # Normal string in a context msgctxt "c1" msgid "co1" msgstr "ct1" # Plural string in a context msgctxt "c2" msgid "co2-1" msgid_plural "co2-2" msgstr[0] "ct2-1" msgstr[1] "ct2-2"gettext-parser-4.0.2/test/fixtures/plural-pot.json000066400000000000000000000040731353167774000223360ustar00rootroot00000000000000{ "charset": "utf-8", "headers": { "project-id-version": "gettext-parser", "report-msgid-bugs-to": "andris@node.ee", "pot-creation-date": "2012-05-18 14:28:00+03:00", "po-revision-date": "2012-05-18 14:37+0300", "last-translator": "Andris Reinman ", "language-team": "gettext-parser ", "language": "", "content-type": "text/plain; charset=utf-8", "content-transfer-encoding": "8bit", "plural-forms": "nplurals=2; plural=(n!=1);", "mime-version": "1.0", "x-poedit-language": "Estonian", "x-poedit-country": "ESTONIA", "x-poedit-sourcecharset": "utf-8" }, "translations": { "": { "": { "msgid": "", "comments": { "translator": "gettext-parser test file.\nCopyright (C) 2012 Andris Reinman\nThis file is distributed under the same license as the gettext-parser package.\nANDRIS REINMAN , 2012.\n" }, "msgstr": [ "Project-Id-Version: gettext-parser\nReport-Msgid-Bugs-To: andris@node.ee\nPOT-Creation-Date: 2012-05-18 14:28:00+03:00\nPO-Revision-Date: 2012-05-18 14:37+0300\nLast-Translator: Andris Reinman \nLanguage-Team: gettext-parser \nLanguage: \nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n!=1);\nmime-version: 1.0\nx-poedit-language: Estonian\nx-poedit-country: ESTONIA\nx-poedit-sourcecharset: utf-8\n" ] }, "o1": { "msgid": "o1", "comments": { "translator": "Normal string" }, "msgstr": [""] }, "o2-1": { "msgid": "o2-1", "comments": { "translator": "Plural string" }, "msgid_plural": "o2-2\no2-3\no2-4", "msgstr": [""] } } } } gettext-parser-4.0.2/test/fixtures/plural.pot000066400000000000000000000015421353167774000213650ustar00rootroot00000000000000# gettext-parser test file. # Copyright (C) 2012 Andris Reinman # This file is distributed under the same license as the gettext-parser package. # ANDRIS REINMAN , 2012. # msgid "" msgstr "" "Project-Id-Version: gettext-parser\n" "Report-Msgid-Bugs-To: andris@node.ee\n" "POT-Creation-Date: 2012-05-18 14:28:00+03:00\n" "PO-Revision-Date: 2012-05-18 14:37+0300\n" "Last-Translator: Andris Reinman \n" "Language-Team: gettext-parser \n" "Language: \n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "mime-version: 1.0\n" "x-poedit-language: Estonian\n" "x-poedit-country: ESTONIA\n" "x-poedit-sourcecharset: utf-8\n" # Normal string msgid "o1" msgstr "" # Plural string msgid "o2-1" msgid_plural "" "o2-2\n" "o2-3\n" "o2-4" msgstr[0] ""gettext-parser-4.0.2/test/fixtures/sort-test.json000066400000000000000000000011541353167774000222000ustar00rootroot00000000000000{ "charset": "utf-8", "headers": { }, "translations": { "": { "": { "msgid": "", "msgstr": [""] }, "bbbb": { "msgid": "bbbb", "msgstr": [ "bbbb"] }, "aaaa": { "msgid": "aaaa", "msgstr": [ "aaaa"] }, "dddd": { "msgid": "dddd", "msgstr": [ "dddd"] }, "cccc": { "msgid": "cccc", "msgstr": [ "cccc"] } } } } gettext-parser-4.0.2/test/fixtures/sort-test.pot000066400000000000000000000002341353167774000220270ustar00rootroot00000000000000msgid "" msgstr "Content-Type: text/plain\n" msgid "aaaa" msgstr "aaaa" msgid "bbbb" msgstr "bbbb" msgid "cccc" msgstr "cccc" msgid "dddd" msgstr "dddd"gettext-parser-4.0.2/test/fixtures/sort-with-msgctxt-test-1.json000066400000000000000000000014511353167774000247760ustar00rootroot00000000000000{ "charset": "utf-8", "headers": { }, "translations": { "": { "": { "msgid": "", "msgstr": [""], "msgctxt": "" }, "bbbb": { "msgid": "bbbb", "msgstr": [ "bbbb"], "msgctxt": "" }, "aaaa": { "msgid": "aaaa", "msgstr": [ "aaaa"], "msgctxt": "" }, "cccc": { "msgid": "cccc", "msgstr": [ "cccc"], "msgctxt": "" } }, "ctxt1": { "aaaa": { "msgid": "aaaa", "msgstr": [ "aaaa"], "msgctxt": "ctxt1" } } } } gettext-parser-4.0.2/test/fixtures/sort-with-msgctxt-test-2.json000066400000000000000000000014511353167774000247770ustar00rootroot00000000000000{ "charset": "utf-8", "headers": { }, "translations": { "ctxt1": { "aaaa": { "msgid": "aaaa", "msgstr": [ "aaaa"], "msgctxt": "ctxt1" } }, "": { "": { "msgid": "", "msgstr": [""], "msgctxt": "" }, "bbbb": { "msgid": "bbbb", "msgstr": [ "bbbb"], "msgctxt": "" }, "aaaa": { "msgid": "aaaa", "msgstr": [ "aaaa"], "msgctxt": "" }, "cccc": { "msgid": "cccc", "msgstr": [ "cccc"], "msgctxt": "" } } } } gettext-parser-4.0.2/test/fixtures/sort-with-msgctxt-test.pot000066400000000000000000000002541353167774000244710ustar00rootroot00000000000000msgid "" msgstr "Content-Type: text/plain\n" msgid "aaaa" msgstr "aaaa" msgctxt "ctxt1" msgid "aaaa" msgstr "aaaa" msgid "bbbb" msgstr "bbbb" msgid "cccc" msgstr "cccc"gettext-parser-4.0.2/test/fixtures/utf8-folding-100.po000066400000000000000000000027701353167774000225120ustar00rootroot00000000000000# gettext-parser test file. # Copyright (C) 2012 Andris Reinman # This file is distributed under the same license as the gettext-parser package. # ANDRIS REINMAN , 2012. # msgid "" msgstr "" "Project-Id-Version: gettext-parser\n" "Report-Msgid-Bugs-To: andris@node.ee\n" "POT-Creation-Date: 2012-05-18 14:28:00+03:00\n" "PO-Revision-Date: 2012-05-18 14:37+0300\n" "Last-Translator: Andris Reinman \n" "Language-Team: gettext-parser \n" "Language: \n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "mime-version: 1.0\n" "x-poedit-language: Estonian\n" "x-poedit-country: ESTONIA\n" "x-poedit-sourcecharset: utf-8\n" # Normal string msgid "o1" msgstr "t1" # Plural string msgid "o2-1" msgid_plural "" "o2-2\n" "o2-3\n" "o2-4" msgstr[0] "t2-1" msgstr[1] "t2-2" # Normal string with special chars msgid "o3-õäöü" msgstr "t3-žš" # Normal comment line 1 # Normal comment line 2 #: /absolute/path:13 #: /absolute/path:14 #. Editors note line 1 #. Editors note line 2 #, line 1 #, line 2 #| msgid "previous-line1" #| "previous-line2" msgid "test" msgstr "test" # String with escapes msgid "\"\\'\t" msgstr "\"\\'\t" # Normal string in a context msgctxt "c1" msgid "co1" msgstr "ct1" # Plural string in a context msgctxt "c2" msgid "co2-1" msgid_plural "co2-2" msgstr[0] "ct2-1" msgstr[1] "ct2-2" msgctxt "Button label" msgid "Log in" msgstr "" msgctxt "Dialog title" msgid "Log in" msgstr ""gettext-parser-4.0.2/test/fixtures/utf8-mo.json000066400000000000000000000050171353167774000215350ustar00rootroot00000000000000{ "charset": "utf-8", "headers": { "Project-Id-Version": "gettext-parser", "Report-Msgid-Bugs-To": "andris@node.ee", "PO-Revision-Date": "2012-05-18 14:37+0300", "Last-Translator": "Andris Reinman ", "Language-Team": "gettext-parser ", "Language": "", "Content-Type": "text/plain; charset=utf-8", "Content-Transfer-Encoding": "8bit", "Plural-Forms": "nplurals=2; plural=(n!=1);", "mime-version": "1.0", "x-poedit-language": "Estonian", "x-poedit-country": "ESTONIA", "x-poedit-sourcecharset": "utf-8" }, "translations": { "": { "": { "msgid": "", "msgstr": [ "Project-Id-Version: gettext-parser\nReport-Msgid-Bugs-To: andris@node.ee\nPO-Revision-Date: 2012-05-18 14:37+0300\nLast-Translator: Andris Reinman \nLanguage-Team: gettext-parser \nLanguage: \nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n!=1);\nmime-version: 1.0\nx-poedit-language: Estonian\nx-poedit-country: ESTONIA\nx-poedit-sourcecharset: utf-8\n" ] }, "o1": { "msgid": "o1", "msgstr": [ "t1" ] }, "o2-1": { "msgid": "o2-1", "msgid_plural": "o2-2\no2-3\no2-4", "msgstr": [ "t2-1", "t2-2" ] }, "o3-õäöü": { "msgid": "o3-õäöü", "msgstr": [ "t3-žš" ] }, "test": { "msgid": "test", "msgstr": [ "test" ] }, "\"\\'\t": { "msgid": "\"\\'\t", "msgstr": [ "\"\\'\t" ] } }, "c1": { "co1": { "msgid": "co1", "msgctxt": "c1", "msgstr": [ "ct1" ] } }, "c2": { "co2-1": { "msgid": "co2-1", "msgctxt": "c2", "msgid_plural": "co2-2", "msgstr": [ "ct2-1", "ct2-2" ] } } } }gettext-parser-4.0.2/test/fixtures/utf8-no-folding.po000066400000000000000000000027051353167774000226240ustar00rootroot00000000000000# gettext-parser test file. # Copyright (C) 2012 Andris Reinman # This file is distributed under the same license as the gettext-parser package. # ANDRIS REINMAN , 2012. # msgid "" msgstr "Project-Id-Version: gettext-parser\nReport-Msgid-Bugs-To: andris@node.ee\nPOT-Creation-Date: 2012-05-18 14:28:00+03:00\nPO-Revision-Date: 2012-05-18 14:37+0300\nLast-Translator: Andris Reinman \nLanguage-Team: gettext-parser \nLanguage: \nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n!=1);\nmime-version: 1.0\nx-poedit-language: Estonian\nx-poedit-country: ESTONIA\nx-poedit-sourcecharset: utf-8\n" # Normal string msgid "o1" msgstr "t1" # Plural string msgid "o2-1" msgid_plural "o2-2\no2-3\no2-4" msgstr[0] "t2-1" msgstr[1] "t2-2" # Normal string with special chars msgid "o3-õäöü" msgstr "t3-žš" # Normal comment line 1 # Normal comment line 2 #: /absolute/path:13 #: /absolute/path:14 #. Editors note line 1 #. Editors note line 2 #, line 1 #, line 2 #| msgid "previous-line1" #| "previous-line2" msgid "test" msgstr "test" # String with escapes msgid "\"\\'\t" msgstr "\"\\'\t" # Normal string in a context msgctxt "c1" msgid "co1" msgstr "ct1" # Plural string in a context msgctxt "c2" msgid "co2-1" msgid_plural "co2-2" msgstr[0] "ct2-1" msgstr[1] "ct2-2" msgctxt "Button label" msgid "Log in" msgstr "" msgctxt "Dialog title" msgid "Log in" msgstr ""gettext-parser-4.0.2/test/fixtures/utf8-po.json000066400000000000000000000105321353167774000215360ustar00rootroot00000000000000{ "charset": "utf-8", "headers": { "Project-Id-Version": "gettext-parser", "Report-Msgid-Bugs-To": "andris@node.ee", "POT-Creation-Date": "2012-05-18 14:28:00+03:00", "PO-Revision-Date": "2012-05-18 14:37+0300", "Last-Translator": "Andris Reinman ", "Language-Team": "gettext-parser ", "Language": "", "Content-Type": "text/plain; charset=utf-8", "Content-Transfer-Encoding": "8bit", "Plural-Forms": "nplurals=2; plural=(n!=1);", "mime-version": "1.0", "x-poedit-language": "Estonian", "x-poedit-country": "ESTONIA", "x-poedit-sourcecharset": "utf-8" }, "translations": { "": { "": { "msgid": "", "comments": { "translator": "gettext-parser test file.\nCopyright (C) 2012 Andris Reinman\nThis file is distributed under the same license as the gettext-parser package.\nANDRIS REINMAN , 2012.\n" }, "msgstr": [ "Project-Id-Version: gettext-parser\nReport-Msgid-Bugs-To: andris@node.ee\nPOT-Creation-Date: 2012-05-18 14:28:00+03:00\nPO-Revision-Date: 2012-05-18 14:37+0300\nLast-Translator: Andris Reinman \nLanguage-Team: gettext-parser \nLanguage: \nContent-Type: text/plain; charset=utf-8\nContent-Transfer-Encoding: 8bit\nPlural-Forms: nplurals=2; plural=(n!=1);\nmime-version: 1.0\nx-poedit-language: Estonian\nx-poedit-country: ESTONIA\nx-poedit-sourcecharset: utf-8\n" ] }, "o1": { "msgid": "o1", "comments": { "translator": "Normal string" }, "msgstr": [ "t1" ] }, "o2-1": { "msgid": "o2-1", "comments": { "translator": "Plural string" }, "msgid_plural": "o2-2\no2-3\no2-4", "msgstr": [ "t2-1", "t2-2" ] }, "o3-õäöü": { "msgid": "o3-õäöü", "comments": { "translator": "Normal string with special chars" }, "msgstr": [ "t3-žš" ] }, "test": { "msgid": "test", "comments": { "translator": "Normal comment line 1\nNormal comment line 2", "extracted": "Editors note line 1\nEditors note line 2", "reference": "/absolute/path:13\n/absolute/path:14", "flag": "line 1\nline 2", "previous": "msgid \"previous-line1\"\n\"previous-line2\"" }, "msgstr": [ "test" ] }, "\"\\'\t": { "msgid": "\"\\'\t", "comments": { "translator": "String with escapes" }, "msgstr": [ "\"\\'\t" ] } }, "c1": { "co1": { "msgid": "co1", "msgctxt": "c1", "comments": { "translator": "Normal string in a context" }, "msgstr": [ "ct1" ] } }, "c2": { "co2-1": { "msgid": "co2-1", "msgctxt": "c2", "comments": { "translator": "Plural string in a context" }, "msgid_plural": "co2-2", "msgstr": [ "ct2-1", "ct2-2" ] } }, "Button label": { "Log in": { "msgid": "Log in", "msgctxt": "Button label", "msgstr": [ "" ] } }, "Dialog title": { "Log in": { "msgid": "Log in", "msgctxt": "Dialog title", "msgstr": [ "" ] } } } }gettext-parser-4.0.2/test/fixtures/utf8.mo000066400000000000000000000013041353167774000205610ustar00rootroot00000000000000\   "\' c1co1c2co2-1co2-2o1o2-1o2-2 o2-3 o2-4o3-õäöütestProject-Id-Version: gettext-parser Report-Msgid-Bugs-To: andris@node.ee PO-Revision-Date: 2012-05-18 14:37+0300 Last-Translator: Andris Reinman Language-Team: gettext-parser Language: Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit Plural-Forms: nplurals=2; plural=(n!=1); mime-version: 1.0 x-poedit-language: Estonian x-poedit-country: ESTONIA x-poedit-sourcecharset: utf-8 "\' ct1ct2-1ct2-2t1t2-1t2-2t3-žštestgettext-parser-4.0.2/test/fixtures/utf8.po000066400000000000000000000027701353167774000205740ustar00rootroot00000000000000# gettext-parser test file. # Copyright (C) 2012 Andris Reinman # This file is distributed under the same license as the gettext-parser package. # ANDRIS REINMAN , 2012. # msgid "" msgstr "" "Project-Id-Version: gettext-parser\n" "Report-Msgid-Bugs-To: andris@node.ee\n" "POT-Creation-Date: 2012-05-18 14:28:00+03:00\n" "PO-Revision-Date: 2012-05-18 14:37+0300\n" "Last-Translator: Andris Reinman \n" "Language-Team: gettext-parser \n" "Language: \n" "Content-Type: text/plain; charset=utf-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=(n!=1);\n" "mime-version: 1.0\n" "x-poedit-language: Estonian\n" "x-poedit-country: ESTONIA\n" "x-poedit-sourcecharset: utf-8\n" # Normal string msgid "o1" msgstr "t1" # Plural string msgid "o2-1" msgid_plural "" "o2-2\n" "o2-3\n" "o2-4" msgstr[0] "t2-1" msgstr[1] "t2-2" # Normal string with special chars msgid "o3-õäöü" msgstr "t3-žš" # Normal comment line 1 # Normal comment line 2 #: /absolute/path:13 #: /absolute/path:14 #. Editors note line 1 #. Editors note line 2 #, line 1 #, line 2 #| msgid "previous-line1" #| "previous-line2" msgid "test" msgstr "test" # String with escapes msgid "\"\\'\t" msgstr "\"\\'\t" # Normal string in a context msgctxt "c1" msgid "co1" msgstr "ct1" # Plural string in a context msgctxt "c2" msgid "co2-1" msgid_plural "co2-2" msgstr[0] "ct2-1" msgstr[1] "ct2-2" msgctxt "Button label" msgid "Log in" msgstr "" msgctxt "Dialog title" msgid "Log in" msgstr ""gettext-parser-4.0.2/test/mo-compiler-test.js000066400000000000000000000021021353167774000212200ustar00rootroot00000000000000const chai = require('chai'); const { promisify } = require('util'); const path = require('path'); const { mo: { compile } } = require('..'); const readFile = promisify(require('fs').readFile); const expect = chai.expect; chai.config.includeStack = true; describe('MO Compiler', () => { describe('UTF-8', () => { it('should compile', async () => { const [json, mo] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/utf8-po.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/utf8.mo')) ]); const compiled = compile(JSON.parse(json)); expect(compiled.toString('utf8')).to.deep.equal(mo.toString('utf8')); }); }); describe('Latin-13', () => { it('should compile', async () => { const [json, mo] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/latin13-po.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/latin13.mo')) ]); const compiled = compile(JSON.parse(json)); expect(compiled.toString('utf8')).to.equal(mo.toString('utf8')); }); }); }); gettext-parser-4.0.2/test/mo-parser-test.js000066400000000000000000000017571353167774000207210ustar00rootroot00000000000000const chai = require('chai'); const { promisify } = require('util'); const path = require('path'); const { mo: { parse } } = require('..'); const readFile = promisify(require('fs').readFile); const expect = chai.expect; chai.config.includeStack = true; describe('MO Parser', () => { describe('UTF-8', () => { it('should parse', async () => { const [mo, json] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/utf8.mo')), readFile(path.join(__dirname, 'fixtures/utf8-mo.json'), 'utf8') ]); const parsed = parse(mo); expect(parsed).to.deep.equal(JSON.parse(json)); }); }); describe('Latin-13', () => { it('should parse', async () => { const [mo, json] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/latin13.mo')), readFile(path.join(__dirname, 'fixtures/latin13-mo.json'), 'utf8') ]); const parsed = parse(mo); expect(parsed).to.deep.equal(JSON.parse(json)); }); }); }); gettext-parser-4.0.2/test/po-compiler-test.js000066400000000000000000000106111353167774000212270ustar00rootroot00000000000000const chai = require('chai'); const { promisify } = require('util'); const path = require('path'); const { po: { compile } } = require('..'); const readFile = promisify(require('fs').readFile); const expect = chai.expect; chai.config.includeStack = true; describe('PO Compiler', () => { describe('Headers', () => { it('should keep tile casing', async () => { const [json, po] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/headers-case.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/headers-case.po'), 'utf8') ]); const compiled = compile(JSON.parse(json)) .toString('utf8'); expect(compiled).to.equal(po); }); }); describe('UTF-8', () => { it('should compile', async () => { const [json, po] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/utf8-po.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/utf8.po'), 'utf8') ]); const compiled = compile(JSON.parse(json)) .toString('utf8'); expect(compiled).to.equal(po); }); }); describe('Latin-13', () => { it('should compile', async () => { const [json, po] = await Promise.all([ // gettext-parser can only handle utf8 input (output will be the specified charset) readFile(path.join(__dirname, 'fixtures/latin13-po.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/latin13.po'), 'latin1') ]); const compiled = compile(JSON.parse(json)) .toString('latin1'); expect(compiled).to.equal(po); }); }); describe('Plurals', () => { it('should compile correct plurals in POT files', async () => { const [json, pot] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/plural-pot.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/plural.pot'), 'utf8') ]); const compiled = compile(JSON.parse(json)) .toString('utf8'); expect(compiled).to.equal(pot); }); }); describe('Message folding', () => { it('should compile without folding', async () => { const [json, po] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/utf8-po.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/utf8-no-folding.po'), 'utf8') ]); const compiled = compile(JSON.parse(json), { foldLength: 0 }) .toString('utf8'); expect(compiled).to.equal(po); }); it('should compile with different folding', async () => { const [json, po] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/utf8-po.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/utf8-folding-100.po'), 'utf8') ]); const compiled = compile(JSON.parse(json), { foldLength: 100 }) .toString('utf8'); expect(compiled).to.equal(po); }); }); describe('Sorting', () => { it('should sort output entries by msgid when `sort` is `true`', async () => { const [json, pot] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/sort-test.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/sort-test.pot'), 'utf8') ]); const compiled = compile(JSON.parse(json), { sort: true }) .toString('utf8'); expect(compiled).to.equal(pot); }); it('should sort entries using a custom `sort` function', async () => { function compareMsgidAndMsgctxt (left, right) { if (left.msgid > right.msgid) { return 1; } if (right.msgid > left.msgid) { return -1; } if (left.msgctxt > right.msgctxt) { return 1; } if (right.msgctxt > left.msgctxt) { return -1; } return 0; } const [json1, json2, pot] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/sort-with-msgctxt-test-1.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/sort-with-msgctxt-test-2.json'), 'utf8'), readFile(path.join(__dirname, 'fixtures/sort-with-msgctxt-test.pot'), 'utf8') ]); const compiled1 = compile(JSON.parse(json1), { sort: compareMsgidAndMsgctxt }) .toString('utf8'); const compiled2 = compile(JSON.parse(json2), { sort: compareMsgidAndMsgctxt }) .toString('utf8'); expect(compiled1).to.equal(compiled2); expect(compiled1).to.equal(pot); expect(compiled2).to.equal(pot); }); }); }); gettext-parser-4.0.2/test/po-parser-test.js000066400000000000000000000072511353167774000207170ustar00rootroot00000000000000const chai = require('chai'); const { promisify } = require('util'); const path = require('path'); const fs = require('fs'); const gettextParser = require('..'); const readFile = promisify(fs.readFile); const expect = chai.expect; chai.config.includeStack = true; describe('PO Parser', () => { describe('headers', () => { it('should detect charset in header', async () => { const [po, json] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/headers-charset.po')), readFile(path.join(__dirname, 'fixtures/headers-charset.json'), 'utf8') ]); const parsed = gettextParser.po.parse(po); expect(parsed).to.deep.equal(JSON.parse(json)); }); }); describe('UTF-8', () => { it('should parse', async () => { const [po, json] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/utf8.po')), readFile(path.join(__dirname, 'fixtures/utf8-po.json'), 'utf8') ]); const parsed = gettextParser.po.parse(po); expect(parsed).to.deep.equal(JSON.parse(json)); }); }); describe('UTF-8 as a string', () => { it('should parse', async () => { const [po, json] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/utf8.po'), 'utf8'), readFile(path.join(__dirname, 'fixtures/utf8-po.json'), 'utf8') ]); const parsed = gettextParser.po.parse(po); expect(parsed).to.deep.equal(JSON.parse(json)); }); }); describe('Stream input', () => { it('should parse', done => { const po = fs.createReadStream(path.join(__dirname, 'fixtures/utf8.po'), { highWaterMark: 1 // ensure that any utf-8 sequences will be broken when streaming }); const json = fs.readFileSync(path.join(__dirname, 'fixtures/utf8-po.json'), 'utf8'); let parsed; const stream = po.pipe(gettextParser.po.createParseStream({ initialTreshold: 800 // home many bytes to cache for parsing the header })); stream.on('data', data => { parsed = data; }); stream.on('end', () => { expect(parsed).to.deep.equal(JSON.parse(json)); done(); }); }); }); describe('Latin-13', () => { it('should parse', async () => { const [po, json] = await Promise.all([ readFile(path.join(__dirname, 'fixtures/latin13.po')), readFile(path.join(__dirname, 'fixtures/latin13-po.json'), 'utf8') ]); const parsed = gettextParser.po.parse(po); expect(parsed).to.deep.equal(JSON.parse(json)); }); }); describe('parsing errors', () => { const invalidKeyError = /Error parsing PO data: Invalid key name/; it('should throw (unescaped quote)', async () => { const po = await readFile(path.join(__dirname, 'fixtures/error-unescaped-quote.po')); expect(gettextParser.po.parse.bind(gettextParser.po, po)).to.throw(invalidKeyError); }); it('should throw (double-escaped quote)', async () => { const po = await readFile(path.join(__dirname, 'fixtures/error-double-escaped-quote.po')); expect(gettextParser.po.parse.bind(gettextParser.po, po)).to.throw(invalidKeyError); }); it('should throw (stream with unescaped quote)', done => { const poStream = fs.createReadStream(path.join(__dirname, 'fixtures/error-unescaped-quote.po'), { highWaterMark: 1 // ensure that any utf-8 sequences will be broken when streaming }); const stream = poStream.pipe(gettextParser.po.createParseStream({ initialTreshold: 800 // home many bytes to cache for parsing the header })); stream.on('error', error => { expect(error.message).to.match(invalidKeyError); done(); }); }); }); }); gettext-parser-4.0.2/test/shared.js000066400000000000000000000113211353167774000172710ustar00rootroot00000000000000'use strict'; const chai = require('chai'); const { promisify } = require('util'); const path = require('path'); const { formatCharset, parseHeader, generateHeader, foldLine } = require('../lib/shared'); const readFile = promisify(require('fs').readFile); const expect = chai.expect; chai.config.includeStack = true; describe('Shared functions', () => { describe('formatCharset', () => { it('should default to iso-8859-1', () => { expect(formatCharset()).to.equal('iso-8859-1'); }); it('should normalize UTF8 to utf-8', () => { expect(formatCharset('UTF8')).to.equal('utf-8'); }); }); describe('parseHeader', () => { it('should return an empty object by default', () => { expect(parseHeader()).to.deep.equal({}); }); it('should convert a header string into an object', async () => { const str = `Project-Id-Version: project 1.0.2 POT-Creation-Date: 2012-05-18 14:28:00+03:00 content-type: text/plain; charset=utf-8 Plural-Forms: nplurals=2; plural=(n!=1); mime-version: 1.0 X-Poedit-SourceCharset: UTF-8`; const headers = parseHeader(str); expect(headers).to.have.all.keys( 'Project-Id-Version', 'POT-Creation-Date', 'Content-Type', 'Plural-Forms', 'mime-version', 'X-Poedit-SourceCharset' ); }); }); describe('generateHeader', () => { it('should return an empty string by default', () => { expect(generateHeader()).to.equal(''); }); it('should convert a header object into a string', async () => { const json = await readFile(path.join(__dirname, 'fixtures/headers-case.json'), 'utf8'); const { headers } = JSON.parse(json); const headerKeys = Object.keys(headers); const headerString = generateHeader(headers); headerKeys.forEach(key => { expect(headerString).to.have.string(key); expect(headerString).to.have.string(headers[key]); }); expect(headerString).to.match(/\n$/, 'Non-empty header has to end with newline'); }); }); describe('foldLine', () => { it('should not fold when not necessary', () => { const line = 'abc def ghi'; const folded = foldLine(line); expect(line).to.equal(folded.join('')); expect(folded.length).to.equal(1); }); it('should force fold with newline', () => { const line = 'abc \\ndef \\nghi'; const folded = foldLine(line); expect(line).to.equal(folded.join('')); expect(folded).to.deep.equal(['abc \\n', 'def \\n', 'ghi']); expect(folded.length).to.equal(3); }); it('should fold at default length', () => { const expected = ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum pretium ', 'a nunc ac fringilla. Nulla laoreet tincidunt tincidunt. Proin tristique ', 'vestibulum mauris non aliquam. Vivamus volutpat odio nisl, sed placerat ', 'turpis sodales a. Vestibulum quis lectus ac elit sagittis sodales ac a ', 'felis. Nulla iaculis, nisl ut mattis fringilla, tortor quam tincidunt ', 'lorem, quis feugiat purus felis ut velit. Donec euismod eros ut leo ', 'lobortis tristique.' ]; const folded = foldLine(expected.join('')); expect(folded).to.deep.equal(expected); expect(folded.length).to.equal(7); }); it('should force fold white space', () => { const line = 'abc def ghi'; const folded = foldLine(line, 5); expect(line).to.equal(folded.join('')); expect(folded).to.deep.equal(['abc ', 'def ', 'ghi']); expect(folded.length).to.equal(3); }); it('should ignore leading spaces', () => { const line = ' abc def ghi'; const folded = foldLine(line, 5); expect(line).to.equal(folded.join('')); expect(folded).to.deep.equal([' a', 'bc ', 'def ', 'ghi']); expect(folded.length).to.equal(4); }); it('should force fold special character', () => { const line = 'abcdef--ghi'; const folded = foldLine(line, 5); expect(line).to.equal(folded.join('')); expect(folded).to.deep.equal(['abcde', 'f--', 'ghi']); expect(folded.length).to.equal(3); }); it('should force fold last special character', () => { const line = 'ab--cdef--ghi'; const folded = foldLine(line, 10); expect(line).to.equal(folded.join('')); expect(folded).to.deep.equal(['ab--cdef--', 'ghi']); expect(folded.length).to.equal(2); }); it('should force fold only if at least one non-special character', () => { const line = '--abcdefghi'; const folded = foldLine(line, 5); expect(line).to.equal(folded.join('')); expect(folded).to.deep.equal(['--abc', 'defgh', 'i']); expect(folded.length).to.equal(3); }); }); });