├── .gitignore
├── .npmignore
├── .travis.yml
├── LICENSE
├── README.md
├── build.js
├── index.d.ts
├── index.js
├── package-lock.json
├── package.json
├── src
└── parser.pegjs
└── test
├── benchmark.js
└── unit
└── parser.js
/.gitignore:
--------------------------------------------------------------------------------
1 | .nyc_output/
2 | coverage/
3 | dist/
4 | lib/
5 | node_modules/
6 | src/parser.js
7 | tmp/
8 |
--------------------------------------------------------------------------------
/.npmignore:
--------------------------------------------------------------------------------
1 | .nyc_output/
2 | coverage/
3 | test/
4 | tmp/
5 | Gruntfile.js
6 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - 10
4 | - 12
5 | deploy:
6 | provider: npm
7 | email: seth@bertalotto.net
8 | api_key:
9 | secure: jyGb7oBDKjLL6+mzCq2na8wCqMgoiClXTRG+QczR41mvHY3dTflyjKYw8o3F7q3AKfSIUJly3Newe8CyckIxh6PJ1hM1RWxD8S7lhA6cbPcl7JlO3IYKQIzCaETIGenr2nJ7bAgN858fYlpFunL9izGxEhkgJ97xyAvj75uQAxA=
10 | on:
11 | branch: master
12 | # tags: true
13 | skip_cleanup: true
14 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | Copyright 2014 Yahoo! Inc.
2 | All rights reserved.
3 |
4 | Redistribution and use in source and binary forms, with or without
5 | modification, are permitted provided that the following conditions are met:
6 |
7 | * Redistributions of source code must retain the above copyright
8 | notice, this list of conditions and the following disclaimer.
9 |
10 | * Redistributions in binary form must reproduce the above copyright
11 | notice, this list of conditions and the following disclaimer in the
12 | documentation and/or other materials provided with the distribution.
13 |
14 | * Neither the name of the Yahoo! Inc. nor the
15 | names of its contributors may be used to endorse or promote products
16 | derived from this software without specific prior written permission.
17 |
18 | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19 | ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20 | WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21 | DISCLAIMED. IN NO EVENT SHALL YAHOO! INC. BE LIABLE FOR ANY
22 | DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23 | (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24 | LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25 | ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26 | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27 | SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 |
29 | --------------------------------------------------------------------------------
30 |
31 | Inspired by and derived from:
32 | messageformat.js https://github.com/SlexAxton/messageformat.js
33 | Copyright 2014 Alex Sexton
34 | Apache License, Version 2.0
35 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Code has been moved to the [FormatJS monorepo](https://github.com/formatjs/formatjs/tree/master/packages/intl-messageformat-parser).
2 |
3 | Intl MessageFormat Parser
4 | =========================
5 |
6 | Parses [ICU Message strings][ICU] into an AST via JavaScript.
7 |
8 | [![npm Version][npm-badge]][npm]
9 | [![Build Status][travis-badge]][travis]
10 | [![Dependency Status][david-badge]][david]
11 |
12 |
13 | Overview
14 | --------
15 |
16 | This package implements a parser in JavaScript that parses the industry standard [ICU Message strings][ICU] — used for internationalization — into an AST. The produced AST can then be used by a compiler, like [`intl-messageformat`][intl-mf], to produce localized formatted strings for display to users.
17 |
18 | This parser is written in [PEG.js][], a parser generator for JavaScript. This parser's implementation was inspired by and derived from Alex Sexton's [messageformat.js][] project. The differences from Alex's implementation are:
19 |
20 | - This project is standalone.
21 | - It's authored as ES6 modules compiled to CommonJS and the Bundle format for the browser.
22 | - The produced AST is more descriptive and uses recursive structures.
23 | - The keywords used in the AST match the ICU Message "spec".
24 |
25 |
26 | Usage
27 | -----
28 |
29 | ### Loading in the Browser
30 |
31 | The `dist/` folder contains the version of this package for use in the browser, and it can be loaded and used like this:
32 |
33 | ```html
34 |
35 |
38 | ```
39 |
40 | ### Loading in Node.js
41 |
42 | This package can also be `require()`-ed in Node.js:
43 |
44 | ```js
45 | var parser = require('intl-messageformat-parser');
46 | parser.parse('...');
47 | ```
48 |
49 | ### Example
50 |
51 | Given an ICU Message string like this:
52 |
53 | ```
54 | On {takenDate, date, short} {name} took {numPhotos, plural,
55 | =0 {no photos.}
56 | =1 {one photo.}
57 | other {# photos.}
58 | }
59 | ```
60 |
61 | ```js
62 | // Assume `msg` is the string above.
63 | parser.parse(msg);
64 | ```
65 |
66 | This parser will produce this AST:
67 |
68 | ```json
69 | {
70 | "type": "messageFormatPattern",
71 | "elements": [
72 | {
73 | "type": "messageTextElement",
74 | "value": "On "
75 | },
76 | {
77 | "type": "argumentElement",
78 | "id": "takenDate",
79 | "format": {
80 | "type": "dateFormat",
81 | "style": "short"
82 | }
83 | },
84 | {
85 | "type": "messageTextElement",
86 | "value": " "
87 | },
88 | {
89 | "type": "argumentElement",
90 | "id": "name",
91 | "format": null
92 | },
93 | {
94 | "type": "messageTextElement",
95 | "value": " took "
96 | },
97 | {
98 | "type": "argumentElement",
99 | "id": "numPhotos",
100 | "format": {
101 | "type": "pluralFormat",
102 | "offset": 0,
103 | "options": [
104 | {
105 | "type": "optionalFormatPattern",
106 | "selector": "=0",
107 | "value": {
108 | "type": "messageFormatPattern",
109 | "elements": [
110 | {
111 | "type": "messageTextElement",
112 | "value": "no photos."
113 | }
114 | ]
115 | }
116 | },
117 | {
118 | "type": "optionalFormatPattern",
119 | "selector": "=1",
120 | "value": {
121 | "type": "messageFormatPattern",
122 | "elements": [
123 | {
124 | "type": "messageTextElement",
125 | "value": "one photo."
126 | }
127 | ]
128 | }
129 | },
130 | {
131 | "type": "optionalFormatPattern",
132 | "selector": "other",
133 | "value": {
134 | "type": "messageFormatPattern",
135 | "elements": [
136 | {
137 | "type": "messageTextElement",
138 | "value": "# photos."
139 | }
140 | ]
141 | }
142 | }
143 | ]
144 | }
145 | }
146 | ]
147 | }
148 | ```
149 |
150 |
151 | License
152 | -------
153 |
154 | This software is free to use under the Yahoo! Inc. BSD license.
155 | See the [LICENSE file][] for license text and copyright information.
156 |
157 |
158 | [npm]: https://www.npmjs.org/package/intl-messageformat-parser
159 | [npm-badge]: https://img.shields.io/npm/v/intl-messageformat-parser.svg?style=flat-square
160 | [david]: https://david-dm.org/yahoo/intl-messageformat-parser
161 | [david-badge]: https://img.shields.io/david/yahoo/intl-messageformat-parser.svg?style=flat-square
162 | [travis]: https://travis-ci.org/yahoo/intl-messageformat-parser
163 | [travis-badge]: https://img.shields.io/travis/yahoo/intl-messageformat-parser.svg?style=flat-square
164 | [ICU]: http://userguide.icu-project.org/formatparse/messages
165 | [intl-mf]: https://github.com/yahoo/intl-messageformat
166 | [PEG.js]: https://pegjs.org/
167 | [messageformat.js]: https://github.com/SlexAxton/messageformat.js
168 | [LICENSE file]: https://github.com/yahoo/intl-messageformat-parser/blob/master/LICENSE
169 |
--------------------------------------------------------------------------------
/build.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | const peg = require('pegjs')
3 | const fs = require('fs')
4 | const {outputFileSync} = require('fs-extra')
5 | const grammar = fs.readFileSync('./src/parser.pegjs', 'utf-8')
6 |
7 | // ES6
8 | outputFileSync('src/parser.js', `export default ${peg.generate(grammar, {output: 'source'})}`)
9 |
10 | // Globals
11 | outputFileSync('dist/parser.js', peg.generate(grammar, {output: 'source', format: 'globals', exportVar: 'IntlMessageFormatParser'}))
12 |
13 | // CJS
14 | outputFileSync('lib/parser.js', peg.generate(grammar, {output: 'source', format: 'commonjs'}))
--------------------------------------------------------------------------------
/index.d.ts:
--------------------------------------------------------------------------------
1 | type Selector = string
2 | interface LocationDetails {
3 | offset: number
4 | line: number
5 | column: number
6 | }
7 | interface Location {
8 | start: LocationDetails,
9 | end: LocationDetails
10 | }
11 | interface SimpleFormat {
12 | type: 'numberFormat' | 'dateFormat' | 'timeFormat'
13 | style: string
14 | location: Location
15 | }
16 | interface PluralFormat extends PluralStyle {
17 | ordinal: false
18 | }
19 | interface SelectFormat {
20 | type: 'selectFormat'
21 | options: OptionalFormatPattern[],
22 | location: Location
23 | }
24 | interface SelectOrdinalFormat extends PluralStyle {
25 | ordinal: true,
26 | }
27 | type ElementFormat = SimpleFormat | PluralFormat | SelectOrdinalFormat | SelectFormat
28 | interface OptionalFormatPattern {
29 | type: 'optionalFormatPattern',
30 | selector: Selector
31 | value: MessageFormatPattern
32 | location: Location
33 | }
34 | interface PluralStyle {
35 | type: 'pluralFormat',
36 | offset: number
37 | options: OptionalFormatPattern[],
38 | location: Location
39 | }
40 | interface MessageTextElement {
41 | type: 'messageTextElement'
42 | value: string
43 | location: Location
44 | }
45 | interface ArgumentElement {
46 | type: 'argumentElement'
47 | id: string
48 | format: ElementFormat
49 | location: Location
50 | }
51 | type Element = MessageTextElement | ArgumentElement
52 |
53 | export interface MessageFormatPattern {
54 | type: 'messageFormatPattern',
55 | elements: Array,
56 | location: Location
57 | }
58 | interface Parser {
59 | parse (msg: string): MessageFormatPattern
60 | }
61 | declare const parser: Parser
62 | export default parser
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | 'use strict';
2 |
3 | var parser = require('./lib/parser')
4 |
5 | module.exports = parser
6 | module.exports['default'] = parser
7 |
--------------------------------------------------------------------------------
/package-lock.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "intl-messageformat-parser",
3 | "version": "1.5.1",
4 | "lockfileVersion": 1,
5 | "requires": true,
6 | "dependencies": {
7 | "@babel/code-frame": {
8 | "version": "7.0.0",
9 | "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
10 | "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
11 | "dev": true,
12 | "requires": {
13 | "@babel/highlight": "^7.0.0"
14 | }
15 | },
16 | "@babel/generator": {
17 | "version": "7.4.4",
18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.4.4.tgz",
19 | "integrity": "sha512-53UOLK6TVNqKxf7RUh8NE851EHRxOOeVXKbK2bivdb+iziMyk03Sr4eaE9OELCbyZAAafAKPDwF2TPUES5QbxQ==",
20 | "dev": true,
21 | "requires": {
22 | "@babel/types": "^7.4.4",
23 | "jsesc": "^2.5.1",
24 | "lodash": "^4.17.11",
25 | "source-map": "^0.5.0",
26 | "trim-right": "^1.0.1"
27 | },
28 | "dependencies": {
29 | "source-map": {
30 | "version": "0.5.7",
31 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
32 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
33 | "dev": true
34 | }
35 | }
36 | },
37 | "@babel/helper-function-name": {
38 | "version": "7.1.0",
39 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz",
40 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==",
41 | "dev": true,
42 | "requires": {
43 | "@babel/helper-get-function-arity": "^7.0.0",
44 | "@babel/template": "^7.1.0",
45 | "@babel/types": "^7.0.0"
46 | }
47 | },
48 | "@babel/helper-get-function-arity": {
49 | "version": "7.0.0",
50 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz",
51 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==",
52 | "dev": true,
53 | "requires": {
54 | "@babel/types": "^7.0.0"
55 | }
56 | },
57 | "@babel/helper-split-export-declaration": {
58 | "version": "7.4.4",
59 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.4.4.tgz",
60 | "integrity": "sha512-Ro/XkzLf3JFITkW6b+hNxzZ1n5OQ80NvIUdmHspih1XAhtN3vPTuUFT4eQnela+2MaZ5ulH+iyP513KJrxbN7Q==",
61 | "dev": true,
62 | "requires": {
63 | "@babel/types": "^7.4.4"
64 | }
65 | },
66 | "@babel/highlight": {
67 | "version": "7.0.0",
68 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
69 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
70 | "dev": true,
71 | "requires": {
72 | "chalk": "^2.0.0",
73 | "esutils": "^2.0.2",
74 | "js-tokens": "^4.0.0"
75 | },
76 | "dependencies": {
77 | "ansi-styles": {
78 | "version": "3.2.1",
79 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
80 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
81 | "dev": true,
82 | "requires": {
83 | "color-convert": "^1.9.0"
84 | }
85 | },
86 | "chalk": {
87 | "version": "2.4.2",
88 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
89 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
90 | "dev": true,
91 | "requires": {
92 | "ansi-styles": "^3.2.1",
93 | "escape-string-regexp": "^1.0.5",
94 | "supports-color": "^5.3.0"
95 | }
96 | },
97 | "has-flag": {
98 | "version": "3.0.0",
99 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
100 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
101 | "dev": true
102 | },
103 | "supports-color": {
104 | "version": "5.5.0",
105 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
106 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
107 | "dev": true,
108 | "requires": {
109 | "has-flag": "^3.0.0"
110 | }
111 | }
112 | }
113 | },
114 | "@babel/parser": {
115 | "version": "7.4.4",
116 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.4.tgz",
117 | "integrity": "sha512-5pCS4mOsL+ANsFZGdvNLybx4wtqAZJ0MJjMHxvzI3bvIsz6sQvzW8XX92EYIkiPtIvcfG3Aj+Ir5VNyjnZhP7w==",
118 | "dev": true
119 | },
120 | "@babel/template": {
121 | "version": "7.4.4",
122 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.4.4.tgz",
123 | "integrity": "sha512-CiGzLN9KgAvgZsnivND7rkA+AeJ9JB0ciPOD4U59GKbQP2iQl+olF1l76kJOupqidozfZ32ghwBEJDhnk9MEcw==",
124 | "dev": true,
125 | "requires": {
126 | "@babel/code-frame": "^7.0.0",
127 | "@babel/parser": "^7.4.4",
128 | "@babel/types": "^7.4.4"
129 | }
130 | },
131 | "@babel/traverse": {
132 | "version": "7.4.4",
133 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.4.4.tgz",
134 | "integrity": "sha512-Gw6qqkw/e6AGzlyj9KnkabJX7VcubqPtkUQVAwkc0wUMldr3A/hezNB3Rc5eIvId95iSGkGIOe5hh1kMKf951A==",
135 | "dev": true,
136 | "requires": {
137 | "@babel/code-frame": "^7.0.0",
138 | "@babel/generator": "^7.4.4",
139 | "@babel/helper-function-name": "^7.1.0",
140 | "@babel/helper-split-export-declaration": "^7.4.4",
141 | "@babel/parser": "^7.4.4",
142 | "@babel/types": "^7.4.4",
143 | "debug": "^4.1.0",
144 | "globals": "^11.1.0",
145 | "lodash": "^4.17.11"
146 | },
147 | "dependencies": {
148 | "debug": {
149 | "version": "4.1.1",
150 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
151 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
152 | "dev": true,
153 | "requires": {
154 | "ms": "^2.1.1"
155 | }
156 | }
157 | }
158 | },
159 | "@babel/types": {
160 | "version": "7.4.4",
161 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.4.4.tgz",
162 | "integrity": "sha512-dOllgYdnEFOebhkKCjzSVFqw/PmmB8pH6RGOWkY4GsboQNd47b1fBThBSwlHAq9alF9vc1M3+6oqR47R50L0tQ==",
163 | "dev": true,
164 | "requires": {
165 | "esutils": "^2.0.2",
166 | "lodash": "^4.17.11",
167 | "to-fast-properties": "^2.0.0"
168 | }
169 | },
170 | "ansi-colors": {
171 | "version": "3.2.3",
172 | "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-3.2.3.tgz",
173 | "integrity": "sha512-LEHHyuhlPY3TmuUYMh2oz89lTShfvgbmzaBcxve9t/9Wuy7Dwf4yoAKcND7KFT1HAQfqZ12qtc+DUrBMeKF9nw==",
174 | "dev": true
175 | },
176 | "append-transform": {
177 | "version": "1.0.0",
178 | "resolved": "https://registry.npmjs.org/append-transform/-/append-transform-1.0.0.tgz",
179 | "integrity": "sha512-P009oYkeHyU742iSZJzZZywj4QRJdnTWffaKuJQLablCZ1uz6/cW4yaRgcDaoQ+uwOxxnt0gRUcwfsNP2ri0gw==",
180 | "dev": true,
181 | "requires": {
182 | "default-require-extensions": "^2.0.0"
183 | }
184 | },
185 | "archy": {
186 | "version": "1.0.0",
187 | "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz",
188 | "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=",
189 | "dev": true
190 | },
191 | "argparse": {
192 | "version": "1.0.10",
193 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
194 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
195 | "dev": true,
196 | "requires": {
197 | "sprintf-js": "~1.0.2"
198 | }
199 | },
200 | "balanced-match": {
201 | "version": "1.0.0",
202 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
203 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
204 | "dev": true
205 | },
206 | "benchmark": {
207 | "version": "2.1.4",
208 | "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-2.1.4.tgz",
209 | "integrity": "sha1-CfPeMckWQl1JjMLuVloOvzwqVik=",
210 | "dev": true,
211 | "requires": {
212 | "lodash": "^4.17.4",
213 | "platform": "^1.3.3"
214 | }
215 | },
216 | "brace-expansion": {
217 | "version": "1.1.11",
218 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
219 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
220 | "dev": true,
221 | "requires": {
222 | "balanced-match": "^1.0.0",
223 | "concat-map": "0.0.1"
224 | }
225 | },
226 | "browser-stdout": {
227 | "version": "1.3.1",
228 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz",
229 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==",
230 | "dev": true
231 | },
232 | "caching-transform": {
233 | "version": "3.0.2",
234 | "resolved": "https://registry.npmjs.org/caching-transform/-/caching-transform-3.0.2.tgz",
235 | "integrity": "sha512-Mtgcv3lh3U0zRii/6qVgQODdPA4G3zhG+jtbCWj39RXuUFTMzH0vcdMtaJS1jPowd+It2Pqr6y3NJMQqOqCE2w==",
236 | "dev": true,
237 | "requires": {
238 | "hasha": "^3.0.0",
239 | "make-dir": "^2.0.0",
240 | "package-hash": "^3.0.0",
241 | "write-file-atomic": "^2.4.2"
242 | }
243 | },
244 | "cliui": {
245 | "version": "4.1.0",
246 | "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz",
247 | "integrity": "sha512-4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==",
248 | "dev": true,
249 | "requires": {
250 | "string-width": "^2.1.1",
251 | "strip-ansi": "^4.0.0",
252 | "wrap-ansi": "^2.0.0"
253 | },
254 | "dependencies": {
255 | "ansi-regex": {
256 | "version": "3.0.0",
257 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
258 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
259 | "dev": true
260 | },
261 | "strip-ansi": {
262 | "version": "4.0.0",
263 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
264 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
265 | "dev": true,
266 | "requires": {
267 | "ansi-regex": "^3.0.0"
268 | }
269 | }
270 | }
271 | },
272 | "code-point-at": {
273 | "version": "1.1.0",
274 | "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz",
275 | "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=",
276 | "dev": true
277 | },
278 | "color-convert": {
279 | "version": "1.9.3",
280 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
281 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
282 | "dev": true,
283 | "requires": {
284 | "color-name": "1.1.3"
285 | }
286 | },
287 | "color-name": {
288 | "version": "1.1.3",
289 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
290 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
291 | "dev": true
292 | },
293 | "commander": {
294 | "version": "2.20.0",
295 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
296 | "integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
297 | "dev": true,
298 | "optional": true
299 | },
300 | "commondir": {
301 | "version": "1.0.1",
302 | "resolved": "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz",
303 | "integrity": "sha1-3dgA2gxmEnOTzKWVDqloo6rxJTs=",
304 | "dev": true
305 | },
306 | "concat-map": {
307 | "version": "0.0.1",
308 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
309 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
310 | "dev": true
311 | },
312 | "convert-source-map": {
313 | "version": "1.6.0",
314 | "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz",
315 | "integrity": "sha512-eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==",
316 | "dev": true,
317 | "requires": {
318 | "safe-buffer": "~5.1.1"
319 | }
320 | },
321 | "cp-file": {
322 | "version": "6.2.0",
323 | "resolved": "https://registry.npmjs.org/cp-file/-/cp-file-6.2.0.tgz",
324 | "integrity": "sha512-fmvV4caBnofhPe8kOcitBwSn2f39QLjnAnGq3gO9dfd75mUytzKNZB1hde6QHunW2Rt+OwuBOMc3i1tNElbszA==",
325 | "dev": true,
326 | "requires": {
327 | "graceful-fs": "^4.1.2",
328 | "make-dir": "^2.0.0",
329 | "nested-error-stacks": "^2.0.0",
330 | "pify": "^4.0.1",
331 | "safe-buffer": "^5.0.1"
332 | },
333 | "dependencies": {
334 | "pify": {
335 | "version": "4.0.1",
336 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
337 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
338 | "dev": true
339 | }
340 | }
341 | },
342 | "cross-spawn": {
343 | "version": "6.0.5",
344 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
345 | "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
346 | "dev": true,
347 | "requires": {
348 | "nice-try": "^1.0.4",
349 | "path-key": "^2.0.1",
350 | "semver": "^5.5.0",
351 | "shebang-command": "^1.2.0",
352 | "which": "^1.2.9"
353 | }
354 | },
355 | "debug": {
356 | "version": "3.2.6",
357 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
358 | "integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
359 | "dev": true,
360 | "requires": {
361 | "ms": "^2.1.1"
362 | }
363 | },
364 | "decamelize": {
365 | "version": "1.2.0",
366 | "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
367 | "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
368 | "dev": true
369 | },
370 | "default-require-extensions": {
371 | "version": "2.0.0",
372 | "resolved": "https://registry.npmjs.org/default-require-extensions/-/default-require-extensions-2.0.0.tgz",
373 | "integrity": "sha1-9fj7sYp9bVCyH2QfZJ67Uiz+JPc=",
374 | "dev": true,
375 | "requires": {
376 | "strip-bom": "^3.0.0"
377 | },
378 | "dependencies": {
379 | "strip-bom": {
380 | "version": "3.0.0",
381 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
382 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
383 | "dev": true
384 | }
385 | }
386 | },
387 | "define-properties": {
388 | "version": "1.1.3",
389 | "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
390 | "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
391 | "dev": true,
392 | "requires": {
393 | "object-keys": "^1.0.12"
394 | }
395 | },
396 | "diff": {
397 | "version": "3.5.0",
398 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
399 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
400 | "dev": true
401 | },
402 | "emoji-regex": {
403 | "version": "7.0.3",
404 | "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
405 | "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
406 | "dev": true
407 | },
408 | "end-of-stream": {
409 | "version": "1.4.1",
410 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
411 | "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
412 | "dev": true,
413 | "requires": {
414 | "once": "^1.4.0"
415 | }
416 | },
417 | "error-ex": {
418 | "version": "1.3.2",
419 | "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
420 | "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
421 | "dev": true,
422 | "requires": {
423 | "is-arrayish": "^0.2.1"
424 | }
425 | },
426 | "es-abstract": {
427 | "version": "1.13.0",
428 | "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.13.0.tgz",
429 | "integrity": "sha512-vDZfg/ykNxQVwup/8E1BZhVzFfBxs9NqMzGcvIJrqg5k2/5Za2bWo40dK2J1pgLngZ7c+Shh8lwYtLGyrwPutg==",
430 | "dev": true,
431 | "requires": {
432 | "es-to-primitive": "^1.2.0",
433 | "function-bind": "^1.1.1",
434 | "has": "^1.0.3",
435 | "is-callable": "^1.1.4",
436 | "is-regex": "^1.0.4",
437 | "object-keys": "^1.0.12"
438 | }
439 | },
440 | "es-to-primitive": {
441 | "version": "1.2.0",
442 | "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz",
443 | "integrity": "sha512-qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==",
444 | "dev": true,
445 | "requires": {
446 | "is-callable": "^1.1.4",
447 | "is-date-object": "^1.0.1",
448 | "is-symbol": "^1.0.2"
449 | }
450 | },
451 | "es6-error": {
452 | "version": "4.1.1",
453 | "resolved": "https://registry.npmjs.org/es6-error/-/es6-error-4.1.1.tgz",
454 | "integrity": "sha512-Um/+FxMr9CISWh0bi5Zv0iOD+4cFh5qLeks1qhAopKVAJw3drgKbKySikp7wGhDL0HPeaja0P5ULZrxLkniUVg==",
455 | "dev": true
456 | },
457 | "escape-string-regexp": {
458 | "version": "1.0.5",
459 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
460 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
461 | "dev": true
462 | },
463 | "esprima": {
464 | "version": "4.0.1",
465 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
466 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
467 | "dev": true
468 | },
469 | "esutils": {
470 | "version": "2.0.2",
471 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
472 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
473 | "dev": true
474 | },
475 | "execa": {
476 | "version": "1.0.0",
477 | "resolved": "https://registry.npmjs.org/execa/-/execa-1.0.0.tgz",
478 | "integrity": "sha512-adbxcyWV46qiHyvSp50TKt05tB4tK3HcmF7/nxfAdhnox83seTDbwnaqKO4sXRy7roHAIFqJP/Rw/AuEbX61LA==",
479 | "dev": true,
480 | "requires": {
481 | "cross-spawn": "^6.0.0",
482 | "get-stream": "^4.0.0",
483 | "is-stream": "^1.1.0",
484 | "npm-run-path": "^2.0.0",
485 | "p-finally": "^1.0.0",
486 | "signal-exit": "^3.0.0",
487 | "strip-eof": "^1.0.0"
488 | }
489 | },
490 | "expect.js": {
491 | "version": "0.3.1",
492 | "resolved": "https://registry.npmjs.org/expect.js/-/expect.js-0.3.1.tgz",
493 | "integrity": "sha1-sKWaDS7/VDdUTr8M6qYBWEHQm1s=",
494 | "dev": true
495 | },
496 | "find-cache-dir": {
497 | "version": "2.1.0",
498 | "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-2.1.0.tgz",
499 | "integrity": "sha512-Tq6PixE0w/VMFfCgbONnkiQIVol/JJL7nRMi20fqzA4NRs9AfeqMGeRdPi3wIhYkxjeBaWh2rxwapn5Tu3IqOQ==",
500 | "dev": true,
501 | "requires": {
502 | "commondir": "^1.0.1",
503 | "make-dir": "^2.0.0",
504 | "pkg-dir": "^3.0.0"
505 | }
506 | },
507 | "flat": {
508 | "version": "4.1.0",
509 | "resolved": "https://registry.npmjs.org/flat/-/flat-4.1.0.tgz",
510 | "integrity": "sha512-Px/TiLIznH7gEDlPXcUD4KnBusa6kR6ayRUVcnEAbreRIuhkqow/mun59BuRXwoYk7ZQOLW1ZM05ilIvK38hFw==",
511 | "dev": true,
512 | "requires": {
513 | "is-buffer": "~2.0.3"
514 | }
515 | },
516 | "foreground-child": {
517 | "version": "1.5.6",
518 | "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-1.5.6.tgz",
519 | "integrity": "sha1-T9ca0t/elnibmApcCilZN8svXOk=",
520 | "dev": true,
521 | "requires": {
522 | "cross-spawn": "^4",
523 | "signal-exit": "^3.0.0"
524 | },
525 | "dependencies": {
526 | "cross-spawn": {
527 | "version": "4.0.2",
528 | "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-4.0.2.tgz",
529 | "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=",
530 | "dev": true,
531 | "requires": {
532 | "lru-cache": "^4.0.1",
533 | "which": "^1.2.9"
534 | }
535 | }
536 | }
537 | },
538 | "fs-extra": {
539 | "version": "7.0.1",
540 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz",
541 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==",
542 | "dev": true,
543 | "requires": {
544 | "graceful-fs": "^4.1.2",
545 | "jsonfile": "^4.0.0",
546 | "universalify": "^0.1.0"
547 | }
548 | },
549 | "fs.realpath": {
550 | "version": "1.0.0",
551 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
552 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
553 | "dev": true
554 | },
555 | "function-bind": {
556 | "version": "1.1.1",
557 | "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
558 | "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
559 | "dev": true
560 | },
561 | "get-caller-file": {
562 | "version": "2.0.5",
563 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
564 | "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
565 | "dev": true
566 | },
567 | "get-stream": {
568 | "version": "4.1.0",
569 | "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-4.1.0.tgz",
570 | "integrity": "sha512-GMat4EJ5161kIy2HevLlr4luNjBgvmj413KaQA7jt4V8B4RDsfpHk7WQ9GVqfYyyx8OS/L66Kox+rJRNklLK7w==",
571 | "dev": true,
572 | "requires": {
573 | "pump": "^3.0.0"
574 | }
575 | },
576 | "globals": {
577 | "version": "11.12.0",
578 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
579 | "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
580 | "dev": true
581 | },
582 | "graceful-fs": {
583 | "version": "4.1.15",
584 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz",
585 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==",
586 | "dev": true
587 | },
588 | "growl": {
589 | "version": "1.10.5",
590 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz",
591 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==",
592 | "dev": true
593 | },
594 | "handlebars": {
595 | "version": "4.1.2",
596 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.2.tgz",
597 | "integrity": "sha512-nvfrjqvt9xQ8Z/w0ijewdD/vvWDTOweBUm96NTr66Wfvo1mJenBLwcYmPs3TIBP5ruzYGD7Hx/DaM9RmhroGPw==",
598 | "dev": true,
599 | "requires": {
600 | "neo-async": "^2.6.0",
601 | "optimist": "^0.6.1",
602 | "source-map": "^0.6.1",
603 | "uglify-js": "^3.1.4"
604 | },
605 | "dependencies": {
606 | "source-map": {
607 | "version": "0.6.1",
608 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
609 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
610 | "dev": true
611 | }
612 | }
613 | },
614 | "has": {
615 | "version": "1.0.3",
616 | "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
617 | "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
618 | "dev": true,
619 | "requires": {
620 | "function-bind": "^1.1.1"
621 | }
622 | },
623 | "has-symbols": {
624 | "version": "1.0.0",
625 | "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz",
626 | "integrity": "sha1-uhqPGvKg/DllD1yFA2dwQSIGO0Q=",
627 | "dev": true
628 | },
629 | "hasha": {
630 | "version": "3.0.0",
631 | "resolved": "https://registry.npmjs.org/hasha/-/hasha-3.0.0.tgz",
632 | "integrity": "sha1-UqMvq4Vp1BymmmH/GiFPjrfIvTk=",
633 | "dev": true,
634 | "requires": {
635 | "is-stream": "^1.0.1"
636 | }
637 | },
638 | "he": {
639 | "version": "1.2.0",
640 | "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz",
641 | "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==",
642 | "dev": true
643 | },
644 | "hosted-git-info": {
645 | "version": "2.7.1",
646 | "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz",
647 | "integrity": "sha512-7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==",
648 | "dev": true
649 | },
650 | "imurmurhash": {
651 | "version": "0.1.4",
652 | "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz",
653 | "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=",
654 | "dev": true
655 | },
656 | "inflight": {
657 | "version": "1.0.6",
658 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
659 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
660 | "dev": true,
661 | "requires": {
662 | "once": "^1.3.0",
663 | "wrappy": "1"
664 | }
665 | },
666 | "inherits": {
667 | "version": "2.0.3",
668 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
669 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
670 | "dev": true
671 | },
672 | "invert-kv": {
673 | "version": "2.0.0",
674 | "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz",
675 | "integrity": "sha512-wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==",
676 | "dev": true
677 | },
678 | "is-arrayish": {
679 | "version": "0.2.1",
680 | "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
681 | "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
682 | "dev": true
683 | },
684 | "is-buffer": {
685 | "version": "2.0.3",
686 | "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
687 | "integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw==",
688 | "dev": true
689 | },
690 | "is-callable": {
691 | "version": "1.1.4",
692 | "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz",
693 | "integrity": "sha512-r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==",
694 | "dev": true
695 | },
696 | "is-date-object": {
697 | "version": "1.0.1",
698 | "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz",
699 | "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=",
700 | "dev": true
701 | },
702 | "is-fullwidth-code-point": {
703 | "version": "2.0.0",
704 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
705 | "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
706 | "dev": true
707 | },
708 | "is-regex": {
709 | "version": "1.0.4",
710 | "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz",
711 | "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=",
712 | "dev": true,
713 | "requires": {
714 | "has": "^1.0.1"
715 | }
716 | },
717 | "is-stream": {
718 | "version": "1.1.0",
719 | "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz",
720 | "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=",
721 | "dev": true
722 | },
723 | "is-symbol": {
724 | "version": "1.0.2",
725 | "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz",
726 | "integrity": "sha512-HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==",
727 | "dev": true,
728 | "requires": {
729 | "has-symbols": "^1.0.0"
730 | }
731 | },
732 | "isexe": {
733 | "version": "2.0.0",
734 | "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
735 | "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
736 | "dev": true
737 | },
738 | "istanbul-lib-coverage": {
739 | "version": "2.0.4",
740 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.4.tgz",
741 | "integrity": "sha512-LXTBICkMARVgo579kWDm8SqfB6nvSDKNqIOBEjmJRnL04JvoMHCYGWaMddQnseJYtkEuEvO/sIcOxPLk9gERug==",
742 | "dev": true
743 | },
744 | "istanbul-lib-hook": {
745 | "version": "2.0.6",
746 | "resolved": "https://registry.npmjs.org/istanbul-lib-hook/-/istanbul-lib-hook-2.0.6.tgz",
747 | "integrity": "sha512-829DKONApZ7UCiPXcOYWSgkFXa4+vNYoNOt3F+4uDJLKL1OotAoVwvThoEj1i8jmOj7odbYcR3rnaHu+QroaXg==",
748 | "dev": true,
749 | "requires": {
750 | "append-transform": "^1.0.0"
751 | }
752 | },
753 | "istanbul-lib-instrument": {
754 | "version": "3.2.0",
755 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.2.0.tgz",
756 | "integrity": "sha512-06IM3xShbNW4NgZv5AP4QH0oHqf1/ivFo8eFys0ZjPXHGldHJQWb3riYOKXqmOqfxXBfxu4B+g/iuhOPZH0RJg==",
757 | "dev": true,
758 | "requires": {
759 | "@babel/generator": "^7.0.0",
760 | "@babel/parser": "^7.0.0",
761 | "@babel/template": "^7.0.0",
762 | "@babel/traverse": "^7.0.0",
763 | "@babel/types": "^7.0.0",
764 | "istanbul-lib-coverage": "^2.0.4",
765 | "semver": "^6.0.0"
766 | },
767 | "dependencies": {
768 | "semver": {
769 | "version": "6.0.0",
770 | "resolved": "https://registry.npmjs.org/semver/-/semver-6.0.0.tgz",
771 | "integrity": "sha512-0UewU+9rFapKFnlbirLi3byoOuhrSsli/z/ihNnvM24vgF+8sNBiI1LZPBSH9wJKUwaUbw+s3hToDLCXkrghrQ==",
772 | "dev": true
773 | }
774 | }
775 | },
776 | "istanbul-lib-report": {
777 | "version": "2.0.7",
778 | "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-2.0.7.tgz",
779 | "integrity": "sha512-wLH6beJBFbRBLiTlMOBxmb85cnVM1Vyl36N48e4e/aTKSM3WbOx7zbVIH1SQ537fhhsPbX0/C5JB4qsmyRXXyA==",
780 | "dev": true,
781 | "requires": {
782 | "istanbul-lib-coverage": "^2.0.4",
783 | "make-dir": "^2.1.0",
784 | "supports-color": "^6.0.0"
785 | },
786 | "dependencies": {
787 | "has-flag": {
788 | "version": "3.0.0",
789 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
790 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
791 | "dev": true
792 | },
793 | "supports-color": {
794 | "version": "6.1.0",
795 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
796 | "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
797 | "dev": true,
798 | "requires": {
799 | "has-flag": "^3.0.0"
800 | }
801 | }
802 | }
803 | },
804 | "istanbul-lib-source-maps": {
805 | "version": "3.0.5",
806 | "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-3.0.5.tgz",
807 | "integrity": "sha512-eDhZ7r6r1d1zQPVZehLc3D0K14vRba/eBYkz3rw16DLOrrTzve9RmnkcwrrkWVgO1FL3EK5knujVe5S8QHE9xw==",
808 | "dev": true,
809 | "requires": {
810 | "debug": "^4.1.1",
811 | "istanbul-lib-coverage": "^2.0.4",
812 | "make-dir": "^2.1.0",
813 | "rimraf": "^2.6.2",
814 | "source-map": "^0.6.1"
815 | },
816 | "dependencies": {
817 | "debug": {
818 | "version": "4.1.1",
819 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
820 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
821 | "dev": true,
822 | "requires": {
823 | "ms": "^2.1.1"
824 | }
825 | },
826 | "source-map": {
827 | "version": "0.6.1",
828 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
829 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
830 | "dev": true
831 | }
832 | }
833 | },
834 | "istanbul-reports": {
835 | "version": "2.2.3",
836 | "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-2.2.3.tgz",
837 | "integrity": "sha512-T6EbPuc8Cb620LWAYyZ4D8SSn06dY9i1+IgUX2lTH8gbwflMc9Obd33zHTyNX653ybjpamAHS9toKS3E6cGhTw==",
838 | "dev": true,
839 | "requires": {
840 | "handlebars": "^4.1.0"
841 | }
842 | },
843 | "js-tokens": {
844 | "version": "4.0.0",
845 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
846 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
847 | "dev": true
848 | },
849 | "js-yaml": {
850 | "version": "3.13.1",
851 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
852 | "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
853 | "dev": true,
854 | "requires": {
855 | "argparse": "^1.0.7",
856 | "esprima": "^4.0.0"
857 | }
858 | },
859 | "jsesc": {
860 | "version": "2.5.2",
861 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
862 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
863 | "dev": true
864 | },
865 | "json-parse-better-errors": {
866 | "version": "1.0.2",
867 | "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
868 | "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
869 | "dev": true
870 | },
871 | "jsonfile": {
872 | "version": "4.0.0",
873 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz",
874 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=",
875 | "dev": true,
876 | "requires": {
877 | "graceful-fs": "^4.1.6"
878 | }
879 | },
880 | "lcid": {
881 | "version": "2.0.0",
882 | "resolved": "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz",
883 | "integrity": "sha512-avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==",
884 | "dev": true,
885 | "requires": {
886 | "invert-kv": "^2.0.0"
887 | }
888 | },
889 | "locate-path": {
890 | "version": "3.0.0",
891 | "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
892 | "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
893 | "dev": true,
894 | "requires": {
895 | "p-locate": "^3.0.0",
896 | "path-exists": "^3.0.0"
897 | },
898 | "dependencies": {
899 | "path-exists": {
900 | "version": "3.0.0",
901 | "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
902 | "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
903 | "dev": true
904 | }
905 | }
906 | },
907 | "lodash": {
908 | "version": "4.17.11",
909 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz",
910 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==",
911 | "dev": true
912 | },
913 | "lodash.flattendeep": {
914 | "version": "4.4.0",
915 | "resolved": "https://registry.npmjs.org/lodash.flattendeep/-/lodash.flattendeep-4.4.0.tgz",
916 | "integrity": "sha1-+wMJF/hqMTTlvJvsDWngAT3f7bI=",
917 | "dev": true
918 | },
919 | "log-symbols": {
920 | "version": "2.2.0",
921 | "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
922 | "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
923 | "dev": true,
924 | "requires": {
925 | "chalk": "^2.0.1"
926 | },
927 | "dependencies": {
928 | "ansi-styles": {
929 | "version": "3.2.1",
930 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
931 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
932 | "dev": true,
933 | "requires": {
934 | "color-convert": "^1.9.0"
935 | }
936 | },
937 | "chalk": {
938 | "version": "2.4.2",
939 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
940 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
941 | "dev": true,
942 | "requires": {
943 | "ansi-styles": "^3.2.1",
944 | "escape-string-regexp": "^1.0.5",
945 | "supports-color": "^5.3.0"
946 | }
947 | },
948 | "has-flag": {
949 | "version": "3.0.0",
950 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
951 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
952 | "dev": true
953 | },
954 | "supports-color": {
955 | "version": "5.5.0",
956 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
957 | "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
958 | "dev": true,
959 | "requires": {
960 | "has-flag": "^3.0.0"
961 | }
962 | }
963 | }
964 | },
965 | "lru-cache": {
966 | "version": "4.1.5",
967 | "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
968 | "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
969 | "dev": true,
970 | "requires": {
971 | "pseudomap": "^1.0.2",
972 | "yallist": "^2.1.2"
973 | }
974 | },
975 | "make-dir": {
976 | "version": "2.1.0",
977 | "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz",
978 | "integrity": "sha512-LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==",
979 | "dev": true,
980 | "requires": {
981 | "pify": "^4.0.1",
982 | "semver": "^5.6.0"
983 | },
984 | "dependencies": {
985 | "pify": {
986 | "version": "4.0.1",
987 | "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz",
988 | "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==",
989 | "dev": true
990 | }
991 | }
992 | },
993 | "map-age-cleaner": {
994 | "version": "0.1.3",
995 | "resolved": "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.3.tgz",
996 | "integrity": "sha512-bJzx6nMoP6PDLPBFmg7+xRKeFZvFboMrGlxmNj9ClvX53KrmvM5bXFXEWjbz4cz1AFn+jWJ9z/DJSz7hrs0w3w==",
997 | "dev": true,
998 | "requires": {
999 | "p-defer": "^1.0.0"
1000 | }
1001 | },
1002 | "mem": {
1003 | "version": "4.3.0",
1004 | "resolved": "https://registry.npmjs.org/mem/-/mem-4.3.0.tgz",
1005 | "integrity": "sha512-qX2bG48pTqYRVmDB37rn/6PT7LcR8T7oAX3bf99u1Tt1nzxYfxkgqDwUwolPlXweM0XzBOBFzSx4kfp7KP1s/w==",
1006 | "dev": true,
1007 | "requires": {
1008 | "map-age-cleaner": "^0.1.1",
1009 | "mimic-fn": "^2.0.0",
1010 | "p-is-promise": "^2.0.0"
1011 | }
1012 | },
1013 | "merge-source-map": {
1014 | "version": "1.1.0",
1015 | "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.1.0.tgz",
1016 | "integrity": "sha512-Qkcp7P2ygktpMPh2mCQZaf3jhN6D3Z/qVZHSdWvQ+2Ef5HgRAPBO57A77+ENm0CPx2+1Ce/MYKi3ymqdfuqibw==",
1017 | "dev": true,
1018 | "requires": {
1019 | "source-map": "^0.6.1"
1020 | },
1021 | "dependencies": {
1022 | "source-map": {
1023 | "version": "0.6.1",
1024 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1025 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1026 | "dev": true
1027 | }
1028 | }
1029 | },
1030 | "mimic-fn": {
1031 | "version": "2.1.0",
1032 | "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz",
1033 | "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==",
1034 | "dev": true
1035 | },
1036 | "minimatch": {
1037 | "version": "3.0.4",
1038 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
1039 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
1040 | "dev": true,
1041 | "requires": {
1042 | "brace-expansion": "^1.1.7"
1043 | }
1044 | },
1045 | "minimist": {
1046 | "version": "0.0.10",
1047 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz",
1048 | "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=",
1049 | "dev": true
1050 | },
1051 | "mkdirp": {
1052 | "version": "0.5.1",
1053 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
1054 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
1055 | "dev": true,
1056 | "requires": {
1057 | "minimist": "0.0.8"
1058 | },
1059 | "dependencies": {
1060 | "minimist": {
1061 | "version": "0.0.8",
1062 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
1063 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
1064 | "dev": true
1065 | }
1066 | }
1067 | },
1068 | "mocha": {
1069 | "version": "6.1.4",
1070 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-6.1.4.tgz",
1071 | "integrity": "sha512-PN8CIy4RXsIoxoFJzS4QNnCH4psUCPWc4/rPrst/ecSJJbLBkubMiyGCP2Kj/9YnWbotFqAoeXyXMucj7gwCFg==",
1072 | "dev": true,
1073 | "requires": {
1074 | "ansi-colors": "3.2.3",
1075 | "browser-stdout": "1.3.1",
1076 | "debug": "3.2.6",
1077 | "diff": "3.5.0",
1078 | "escape-string-regexp": "1.0.5",
1079 | "find-up": "3.0.0",
1080 | "glob": "7.1.3",
1081 | "growl": "1.10.5",
1082 | "he": "1.2.0",
1083 | "js-yaml": "3.13.1",
1084 | "log-symbols": "2.2.0",
1085 | "minimatch": "3.0.4",
1086 | "mkdirp": "0.5.1",
1087 | "ms": "2.1.1",
1088 | "node-environment-flags": "1.0.5",
1089 | "object.assign": "4.1.0",
1090 | "strip-json-comments": "2.0.1",
1091 | "supports-color": "6.0.0",
1092 | "which": "1.3.1",
1093 | "wide-align": "1.1.3",
1094 | "yargs": "13.2.2",
1095 | "yargs-parser": "13.0.0",
1096 | "yargs-unparser": "1.5.0"
1097 | },
1098 | "dependencies": {
1099 | "find-up": {
1100 | "version": "3.0.0",
1101 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1102 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1103 | "dev": true,
1104 | "requires": {
1105 | "locate-path": "^3.0.0"
1106 | }
1107 | },
1108 | "glob": {
1109 | "version": "7.1.3",
1110 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
1111 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
1112 | "dev": true,
1113 | "requires": {
1114 | "fs.realpath": "^1.0.0",
1115 | "inflight": "^1.0.4",
1116 | "inherits": "2",
1117 | "minimatch": "^3.0.4",
1118 | "once": "^1.3.0",
1119 | "path-is-absolute": "^1.0.0"
1120 | }
1121 | },
1122 | "has-flag": {
1123 | "version": "3.0.0",
1124 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
1125 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
1126 | "dev": true
1127 | },
1128 | "supports-color": {
1129 | "version": "6.0.0",
1130 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.0.0.tgz",
1131 | "integrity": "sha512-on9Kwidc1IUQo+bQdhi8+Tijpo0e1SS6RoGo2guUwn5vdaxw8RXOF9Vb2ws+ihWOmh4JnCJOvaziZWP1VABaLg==",
1132 | "dev": true,
1133 | "requires": {
1134 | "has-flag": "^3.0.0"
1135 | }
1136 | }
1137 | }
1138 | },
1139 | "ms": {
1140 | "version": "2.1.1",
1141 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
1142 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
1143 | "dev": true
1144 | },
1145 | "neo-async": {
1146 | "version": "2.6.0",
1147 | "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz",
1148 | "integrity": "sha512-MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==",
1149 | "dev": true
1150 | },
1151 | "nested-error-stacks": {
1152 | "version": "2.1.0",
1153 | "resolved": "https://registry.npmjs.org/nested-error-stacks/-/nested-error-stacks-2.1.0.tgz",
1154 | "integrity": "sha512-AO81vsIO1k1sM4Zrd6Hu7regmJN1NSiAja10gc4bX3F0wd+9rQmcuHQaHVQCYIEC8iFXnE+mavh23GOt7wBgug==",
1155 | "dev": true
1156 | },
1157 | "nice-try": {
1158 | "version": "1.0.5",
1159 | "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
1160 | "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
1161 | "dev": true
1162 | },
1163 | "node-environment-flags": {
1164 | "version": "1.0.5",
1165 | "resolved": "https://registry.npmjs.org/node-environment-flags/-/node-environment-flags-1.0.5.tgz",
1166 | "integrity": "sha512-VNYPRfGfmZLx0Ye20jWzHUjyTW/c+6Wq+iLhDzUI4XmhrDd9l/FozXV3F2xOaXjvp0co0+v1YSR3CMP6g+VvLQ==",
1167 | "dev": true,
1168 | "requires": {
1169 | "object.getownpropertydescriptors": "^2.0.3",
1170 | "semver": "^5.7.0"
1171 | }
1172 | },
1173 | "normalize-package-data": {
1174 | "version": "2.5.0",
1175 | "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.5.0.tgz",
1176 | "integrity": "sha512-/5CMN3T0R4XTj4DcGaexo+roZSdSFW/0AOOTROrjxzCG1wrWXEsGbRKevjlIL+ZDE4sZlJr5ED4YW0yqmkK+eA==",
1177 | "dev": true,
1178 | "requires": {
1179 | "hosted-git-info": "^2.1.4",
1180 | "resolve": "^1.10.0",
1181 | "semver": "2 || 3 || 4 || 5",
1182 | "validate-npm-package-license": "^3.0.1"
1183 | },
1184 | "dependencies": {
1185 | "resolve": {
1186 | "version": "1.10.1",
1187 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.1.tgz",
1188 | "integrity": "sha512-KuIe4mf++td/eFb6wkaPbMDnP6kObCaEtIDuHOUED6MNUo4K670KZUHuuvYPZDxNF0WVLw49n06M2m2dXphEzA==",
1189 | "dev": true,
1190 | "requires": {
1191 | "path-parse": "^1.0.6"
1192 | }
1193 | }
1194 | }
1195 | },
1196 | "npm-run-path": {
1197 | "version": "2.0.2",
1198 | "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz",
1199 | "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=",
1200 | "dev": true,
1201 | "requires": {
1202 | "path-key": "^2.0.0"
1203 | }
1204 | },
1205 | "number-is-nan": {
1206 | "version": "1.0.1",
1207 | "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz",
1208 | "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=",
1209 | "dev": true
1210 | },
1211 | "nyc": {
1212 | "version": "14.0.0",
1213 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-14.0.0.tgz",
1214 | "integrity": "sha512-R1zC6UZak6pzn5BZQorkSH5GdOGafrwyeja+eimS5Tu+KJ/hCgBc8qA1QWSzxQmT2FDl2lbpqPw7tBDbSvhAHg==",
1215 | "dev": true,
1216 | "requires": {
1217 | "archy": "^1.0.0",
1218 | "caching-transform": "^3.0.2",
1219 | "convert-source-map": "^1.6.0",
1220 | "cp-file": "^6.2.0",
1221 | "find-cache-dir": "^2.1.0",
1222 | "find-up": "^3.0.0",
1223 | "foreground-child": "^1.5.6",
1224 | "glob": "^7.1.3",
1225 | "istanbul-lib-coverage": "^2.0.4",
1226 | "istanbul-lib-hook": "^2.0.6",
1227 | "istanbul-lib-instrument": "^3.2.0",
1228 | "istanbul-lib-report": "^2.0.7",
1229 | "istanbul-lib-source-maps": "^3.0.5",
1230 | "istanbul-reports": "^2.2.2",
1231 | "make-dir": "^2.1.0",
1232 | "merge-source-map": "^1.1.0",
1233 | "resolve-from": "^4.0.0",
1234 | "rimraf": "^2.6.3",
1235 | "signal-exit": "^3.0.2",
1236 | "spawn-wrap": "^1.4.2",
1237 | "test-exclude": "^5.2.2",
1238 | "uuid": "^3.3.2",
1239 | "yargs": "^13.2.2",
1240 | "yargs-parser": "^13.0.0"
1241 | },
1242 | "dependencies": {
1243 | "find-up": {
1244 | "version": "3.0.0",
1245 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1246 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1247 | "dev": true,
1248 | "requires": {
1249 | "locate-path": "^3.0.0"
1250 | }
1251 | },
1252 | "glob": {
1253 | "version": "7.1.3",
1254 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
1255 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
1256 | "dev": true,
1257 | "requires": {
1258 | "fs.realpath": "^1.0.0",
1259 | "inflight": "^1.0.4",
1260 | "inherits": "2",
1261 | "minimatch": "^3.0.4",
1262 | "once": "^1.3.0",
1263 | "path-is-absolute": "^1.0.0"
1264 | }
1265 | }
1266 | }
1267 | },
1268 | "object-keys": {
1269 | "version": "1.1.1",
1270 | "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
1271 | "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
1272 | "dev": true
1273 | },
1274 | "object.assign": {
1275 | "version": "4.1.0",
1276 | "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
1277 | "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
1278 | "dev": true,
1279 | "requires": {
1280 | "define-properties": "^1.1.2",
1281 | "function-bind": "^1.1.1",
1282 | "has-symbols": "^1.0.0",
1283 | "object-keys": "^1.0.11"
1284 | }
1285 | },
1286 | "object.getownpropertydescriptors": {
1287 | "version": "2.0.3",
1288 | "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz",
1289 | "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=",
1290 | "dev": true,
1291 | "requires": {
1292 | "define-properties": "^1.1.2",
1293 | "es-abstract": "^1.5.1"
1294 | }
1295 | },
1296 | "once": {
1297 | "version": "1.4.0",
1298 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
1299 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
1300 | "dev": true,
1301 | "requires": {
1302 | "wrappy": "1"
1303 | }
1304 | },
1305 | "optimist": {
1306 | "version": "0.6.1",
1307 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz",
1308 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=",
1309 | "dev": true,
1310 | "requires": {
1311 | "minimist": "~0.0.1",
1312 | "wordwrap": "~0.0.2"
1313 | },
1314 | "dependencies": {
1315 | "wordwrap": {
1316 | "version": "0.0.3",
1317 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz",
1318 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=",
1319 | "dev": true
1320 | }
1321 | }
1322 | },
1323 | "os-homedir": {
1324 | "version": "1.0.2",
1325 | "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
1326 | "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
1327 | "dev": true
1328 | },
1329 | "os-locale": {
1330 | "version": "3.1.0",
1331 | "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-3.1.0.tgz",
1332 | "integrity": "sha512-Z8l3R4wYWM40/52Z+S265okfFj8Kt2cC2MKY+xNi3kFs+XGI7WXu/I309QQQYbRW4ijiZ+yxs9pqEhJh0DqW3Q==",
1333 | "dev": true,
1334 | "requires": {
1335 | "execa": "^1.0.0",
1336 | "lcid": "^2.0.0",
1337 | "mem": "^4.0.0"
1338 | }
1339 | },
1340 | "p-defer": {
1341 | "version": "1.0.0",
1342 | "resolved": "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz",
1343 | "integrity": "sha1-n26xgvbJqozXQwBKfU+WsZaw+ww=",
1344 | "dev": true
1345 | },
1346 | "p-finally": {
1347 | "version": "1.0.0",
1348 | "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz",
1349 | "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=",
1350 | "dev": true
1351 | },
1352 | "p-is-promise": {
1353 | "version": "2.1.0",
1354 | "resolved": "https://registry.npmjs.org/p-is-promise/-/p-is-promise-2.1.0.tgz",
1355 | "integrity": "sha512-Y3W0wlRPK8ZMRbNq97l4M5otioeA5lm1z7bkNkxCka8HSPjR0xRWmpCmc9utiaLP9Jb1eD8BgeIxTW4AIF45Pg==",
1356 | "dev": true
1357 | },
1358 | "p-limit": {
1359 | "version": "2.2.0",
1360 | "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.2.0.tgz",
1361 | "integrity": "sha512-pZbTJpoUsCzV48Mc9Nh51VbwO0X9cuPFE8gYwx9BTCt9SF8/b7Zljd2fVgOxhIF/HDTKgpVzs+GPhyKfjLLFRQ==",
1362 | "dev": true,
1363 | "requires": {
1364 | "p-try": "^2.0.0"
1365 | }
1366 | },
1367 | "p-locate": {
1368 | "version": "3.0.0",
1369 | "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
1370 | "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
1371 | "dev": true,
1372 | "requires": {
1373 | "p-limit": "^2.0.0"
1374 | }
1375 | },
1376 | "p-try": {
1377 | "version": "2.2.0",
1378 | "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
1379 | "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
1380 | "dev": true
1381 | },
1382 | "package-hash": {
1383 | "version": "3.0.0",
1384 | "resolved": "https://registry.npmjs.org/package-hash/-/package-hash-3.0.0.tgz",
1385 | "integrity": "sha512-lOtmukMDVvtkL84rJHI7dpTYq+0rli8N2wlnqUcBuDWCfVhRUfOmnR9SsoHFMLpACvEV60dX7rd0rFaYDZI+FA==",
1386 | "dev": true,
1387 | "requires": {
1388 | "graceful-fs": "^4.1.15",
1389 | "hasha": "^3.0.0",
1390 | "lodash.flattendeep": "^4.4.0",
1391 | "release-zalgo": "^1.0.0"
1392 | }
1393 | },
1394 | "path-is-absolute": {
1395 | "version": "1.0.1",
1396 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
1397 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
1398 | "dev": true
1399 | },
1400 | "path-key": {
1401 | "version": "2.0.1",
1402 | "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
1403 | "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
1404 | "dev": true
1405 | },
1406 | "path-parse": {
1407 | "version": "1.0.6",
1408 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
1409 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
1410 | "dev": true
1411 | },
1412 | "pegjs": {
1413 | "version": "0.10.0",
1414 | "resolved": "https://registry.npmjs.org/pegjs/-/pegjs-0.10.0.tgz",
1415 | "integrity": "sha1-z4uvrm7d/0tafvsYUmnqr0YQ3b0=",
1416 | "dev": true
1417 | },
1418 | "pkg-dir": {
1419 | "version": "3.0.0",
1420 | "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz",
1421 | "integrity": "sha512-/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==",
1422 | "dev": true,
1423 | "requires": {
1424 | "find-up": "^3.0.0"
1425 | },
1426 | "dependencies": {
1427 | "find-up": {
1428 | "version": "3.0.0",
1429 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1430 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1431 | "dev": true,
1432 | "requires": {
1433 | "locate-path": "^3.0.0"
1434 | }
1435 | }
1436 | }
1437 | },
1438 | "platform": {
1439 | "version": "1.3.5",
1440 | "resolved": "https://registry.npmjs.org/platform/-/platform-1.3.5.tgz",
1441 | "integrity": "sha512-TuvHS8AOIZNAlE77WUDiR4rySV/VMptyMfcfeoMgs4P8apaZM3JrnbzBiixKUv+XR6i+BXrQh8WAnjaSPFO65Q==",
1442 | "dev": true
1443 | },
1444 | "pseudomap": {
1445 | "version": "1.0.2",
1446 | "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
1447 | "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
1448 | "dev": true
1449 | },
1450 | "pump": {
1451 | "version": "3.0.0",
1452 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz",
1453 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==",
1454 | "dev": true,
1455 | "requires": {
1456 | "end-of-stream": "^1.1.0",
1457 | "once": "^1.3.1"
1458 | }
1459 | },
1460 | "release-zalgo": {
1461 | "version": "1.0.0",
1462 | "resolved": "https://registry.npmjs.org/release-zalgo/-/release-zalgo-1.0.0.tgz",
1463 | "integrity": "sha1-CXALflB0Mpc5Mw5TXFqQ+2eFFzA=",
1464 | "dev": true,
1465 | "requires": {
1466 | "es6-error": "^4.0.1"
1467 | }
1468 | },
1469 | "require-directory": {
1470 | "version": "2.1.1",
1471 | "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
1472 | "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
1473 | "dev": true
1474 | },
1475 | "require-main-filename": {
1476 | "version": "2.0.0",
1477 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
1478 | "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
1479 | "dev": true
1480 | },
1481 | "resolve-from": {
1482 | "version": "4.0.0",
1483 | "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz",
1484 | "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==",
1485 | "dev": true
1486 | },
1487 | "rimraf": {
1488 | "version": "2.6.3",
1489 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
1490 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
1491 | "dev": true,
1492 | "requires": {
1493 | "glob": "^7.1.3"
1494 | },
1495 | "dependencies": {
1496 | "glob": {
1497 | "version": "7.1.4",
1498 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
1499 | "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
1500 | "dev": true,
1501 | "requires": {
1502 | "fs.realpath": "^1.0.0",
1503 | "inflight": "^1.0.4",
1504 | "inherits": "2",
1505 | "minimatch": "^3.0.4",
1506 | "once": "^1.3.0",
1507 | "path-is-absolute": "^1.0.0"
1508 | }
1509 | }
1510 | }
1511 | },
1512 | "safe-buffer": {
1513 | "version": "5.1.2",
1514 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
1515 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
1516 | "dev": true
1517 | },
1518 | "semver": {
1519 | "version": "5.7.0",
1520 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.0.tgz",
1521 | "integrity": "sha512-Ya52jSX2u7QKghxeoFGpLwCtGlt7j0oY9DYb5apt9nPlJ42ID+ulTXESnt/qAQcoSERyZ5sl3LDIOw0nAn/5DA==",
1522 | "dev": true
1523 | },
1524 | "set-blocking": {
1525 | "version": "2.0.0",
1526 | "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
1527 | "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
1528 | "dev": true
1529 | },
1530 | "shebang-command": {
1531 | "version": "1.2.0",
1532 | "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
1533 | "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
1534 | "dev": true,
1535 | "requires": {
1536 | "shebang-regex": "^1.0.0"
1537 | }
1538 | },
1539 | "shebang-regex": {
1540 | "version": "1.0.0",
1541 | "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
1542 | "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
1543 | "dev": true
1544 | },
1545 | "signal-exit": {
1546 | "version": "3.0.2",
1547 | "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz",
1548 | "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=",
1549 | "dev": true
1550 | },
1551 | "spawn-wrap": {
1552 | "version": "1.4.2",
1553 | "resolved": "https://registry.npmjs.org/spawn-wrap/-/spawn-wrap-1.4.2.tgz",
1554 | "integrity": "sha512-vMwR3OmmDhnxCVxM8M+xO/FtIp6Ju/mNaDfCMMW7FDcLRTPFWUswec4LXJHTJE2hwTI9O0YBfygu4DalFl7Ylg==",
1555 | "dev": true,
1556 | "requires": {
1557 | "foreground-child": "^1.5.6",
1558 | "mkdirp": "^0.5.0",
1559 | "os-homedir": "^1.0.1",
1560 | "rimraf": "^2.6.2",
1561 | "signal-exit": "^3.0.2",
1562 | "which": "^1.3.0"
1563 | }
1564 | },
1565 | "spdx-correct": {
1566 | "version": "3.1.0",
1567 | "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.1.0.tgz",
1568 | "integrity": "sha512-lr2EZCctC2BNR7j7WzJ2FpDznxky1sjfxvvYEyzxNyb6lZXHODmEoJeFu4JupYlkfha1KZpJyoqiJ7pgA1qq8Q==",
1569 | "dev": true,
1570 | "requires": {
1571 | "spdx-expression-parse": "^3.0.0",
1572 | "spdx-license-ids": "^3.0.0"
1573 | }
1574 | },
1575 | "spdx-exceptions": {
1576 | "version": "2.2.0",
1577 | "resolved": "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz",
1578 | "integrity": "sha512-2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==",
1579 | "dev": true
1580 | },
1581 | "spdx-expression-parse": {
1582 | "version": "3.0.0",
1583 | "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz",
1584 | "integrity": "sha512-Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==",
1585 | "dev": true,
1586 | "requires": {
1587 | "spdx-exceptions": "^2.1.0",
1588 | "spdx-license-ids": "^3.0.0"
1589 | }
1590 | },
1591 | "spdx-license-ids": {
1592 | "version": "3.0.4",
1593 | "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.4.tgz",
1594 | "integrity": "sha512-7j8LYJLeY/Yb6ACbQ7F76qy5jHkp0U6jgBfJsk97bwWlVUnUWsAgpyaCvo17h0/RQGnQ036tVDomiwoI4pDkQA==",
1595 | "dev": true
1596 | },
1597 | "sprintf-js": {
1598 | "version": "1.0.3",
1599 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
1600 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
1601 | "dev": true
1602 | },
1603 | "string-width": {
1604 | "version": "2.1.1",
1605 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz",
1606 | "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==",
1607 | "dev": true,
1608 | "requires": {
1609 | "is-fullwidth-code-point": "^2.0.0",
1610 | "strip-ansi": "^4.0.0"
1611 | },
1612 | "dependencies": {
1613 | "ansi-regex": {
1614 | "version": "3.0.0",
1615 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1616 | "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1617 | "dev": true
1618 | },
1619 | "strip-ansi": {
1620 | "version": "4.0.0",
1621 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
1622 | "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
1623 | "dev": true,
1624 | "requires": {
1625 | "ansi-regex": "^3.0.0"
1626 | }
1627 | }
1628 | }
1629 | },
1630 | "strip-eof": {
1631 | "version": "1.0.0",
1632 | "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz",
1633 | "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=",
1634 | "dev": true
1635 | },
1636 | "strip-json-comments": {
1637 | "version": "2.0.1",
1638 | "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz",
1639 | "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=",
1640 | "dev": true
1641 | },
1642 | "test-exclude": {
1643 | "version": "5.2.2",
1644 | "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-5.2.2.tgz",
1645 | "integrity": "sha512-N2pvaLpT8guUpb5Fe1GJlmvmzH3x+DAKmmyEQmFP792QcLYoGE1syxztSvPD1V8yPe6VrcCt6YGQVjSRjCASsA==",
1646 | "dev": true,
1647 | "requires": {
1648 | "glob": "^7.1.3",
1649 | "minimatch": "^3.0.4",
1650 | "read-pkg-up": "^4.0.0",
1651 | "require-main-filename": "^2.0.0"
1652 | },
1653 | "dependencies": {
1654 | "find-up": {
1655 | "version": "3.0.0",
1656 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1657 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1658 | "dev": true,
1659 | "requires": {
1660 | "locate-path": "^3.0.0"
1661 | }
1662 | },
1663 | "glob": {
1664 | "version": "7.1.3",
1665 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
1666 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
1667 | "dev": true,
1668 | "requires": {
1669 | "fs.realpath": "^1.0.0",
1670 | "inflight": "^1.0.4",
1671 | "inherits": "2",
1672 | "minimatch": "^3.0.4",
1673 | "once": "^1.3.0",
1674 | "path-is-absolute": "^1.0.0"
1675 | }
1676 | },
1677 | "load-json-file": {
1678 | "version": "4.0.0",
1679 | "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-4.0.0.tgz",
1680 | "integrity": "sha1-L19Fq5HjMhYjT9U62rZo607AmTs=",
1681 | "dev": true,
1682 | "requires": {
1683 | "graceful-fs": "^4.1.2",
1684 | "parse-json": "^4.0.0",
1685 | "pify": "^3.0.0",
1686 | "strip-bom": "^3.0.0"
1687 | }
1688 | },
1689 | "parse-json": {
1690 | "version": "4.0.0",
1691 | "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
1692 | "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
1693 | "dev": true,
1694 | "requires": {
1695 | "error-ex": "^1.3.1",
1696 | "json-parse-better-errors": "^1.0.1"
1697 | }
1698 | },
1699 | "path-type": {
1700 | "version": "3.0.0",
1701 | "resolved": "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz",
1702 | "integrity": "sha512-T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==",
1703 | "dev": true,
1704 | "requires": {
1705 | "pify": "^3.0.0"
1706 | }
1707 | },
1708 | "pify": {
1709 | "version": "3.0.0",
1710 | "resolved": "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz",
1711 | "integrity": "sha1-5aSs0sEB/fPZpNB/DbxNtJ3SgXY=",
1712 | "dev": true
1713 | },
1714 | "read-pkg": {
1715 | "version": "3.0.0",
1716 | "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-3.0.0.tgz",
1717 | "integrity": "sha1-nLxoaXj+5l0WwA4rGcI3/Pbjg4k=",
1718 | "dev": true,
1719 | "requires": {
1720 | "load-json-file": "^4.0.0",
1721 | "normalize-package-data": "^2.3.2",
1722 | "path-type": "^3.0.0"
1723 | }
1724 | },
1725 | "read-pkg-up": {
1726 | "version": "4.0.0",
1727 | "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-4.0.0.tgz",
1728 | "integrity": "sha512-6etQSH7nJGsK0RbG/2TeDzZFa8shjQ1um+SwQQ5cwKy0dhSXdOncEhb1CPpvQG4h7FyOV6EB6YlV0yJvZQNAkA==",
1729 | "dev": true,
1730 | "requires": {
1731 | "find-up": "^3.0.0",
1732 | "read-pkg": "^3.0.0"
1733 | }
1734 | },
1735 | "strip-bom": {
1736 | "version": "3.0.0",
1737 | "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
1738 | "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=",
1739 | "dev": true
1740 | }
1741 | }
1742 | },
1743 | "to-fast-properties": {
1744 | "version": "2.0.0",
1745 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
1746 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
1747 | "dev": true
1748 | },
1749 | "trim-right": {
1750 | "version": "1.0.1",
1751 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
1752 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
1753 | "dev": true
1754 | },
1755 | "uglify-js": {
1756 | "version": "3.5.9",
1757 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.5.9.tgz",
1758 | "integrity": "sha512-WpT0RqsDtAWPNJK955DEnb6xjymR8Fn0OlK4TT4pS0ASYsVPqr5ELhgwOwLCP5J5vHeJ4xmMmz3DEgdqC10JeQ==",
1759 | "dev": true,
1760 | "optional": true,
1761 | "requires": {
1762 | "commander": "~2.20.0",
1763 | "source-map": "~0.6.1"
1764 | },
1765 | "dependencies": {
1766 | "source-map": {
1767 | "version": "0.6.1",
1768 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
1769 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
1770 | "dev": true,
1771 | "optional": true
1772 | }
1773 | }
1774 | },
1775 | "universalify": {
1776 | "version": "0.1.2",
1777 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz",
1778 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==",
1779 | "dev": true
1780 | },
1781 | "uuid": {
1782 | "version": "3.3.2",
1783 | "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
1784 | "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
1785 | "dev": true
1786 | },
1787 | "validate-npm-package-license": {
1788 | "version": "3.0.4",
1789 | "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz",
1790 | "integrity": "sha512-DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==",
1791 | "dev": true,
1792 | "requires": {
1793 | "spdx-correct": "^3.0.0",
1794 | "spdx-expression-parse": "^3.0.0"
1795 | }
1796 | },
1797 | "which": {
1798 | "version": "1.3.1",
1799 | "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz",
1800 | "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==",
1801 | "dev": true,
1802 | "requires": {
1803 | "isexe": "^2.0.0"
1804 | }
1805 | },
1806 | "which-module": {
1807 | "version": "2.0.0",
1808 | "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
1809 | "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
1810 | "dev": true
1811 | },
1812 | "wide-align": {
1813 | "version": "1.1.3",
1814 | "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz",
1815 | "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==",
1816 | "dev": true,
1817 | "requires": {
1818 | "string-width": "^1.0.2 || 2"
1819 | }
1820 | },
1821 | "wrap-ansi": {
1822 | "version": "2.1.0",
1823 | "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz",
1824 | "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=",
1825 | "dev": true,
1826 | "requires": {
1827 | "string-width": "^1.0.1",
1828 | "strip-ansi": "^3.0.1"
1829 | },
1830 | "dependencies": {
1831 | "ansi-regex": {
1832 | "version": "2.1.1",
1833 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
1834 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
1835 | "dev": true
1836 | },
1837 | "is-fullwidth-code-point": {
1838 | "version": "1.0.0",
1839 | "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz",
1840 | "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=",
1841 | "dev": true,
1842 | "requires": {
1843 | "number-is-nan": "^1.0.0"
1844 | }
1845 | },
1846 | "string-width": {
1847 | "version": "1.0.2",
1848 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz",
1849 | "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=",
1850 | "dev": true,
1851 | "requires": {
1852 | "code-point-at": "^1.0.0",
1853 | "is-fullwidth-code-point": "^1.0.0",
1854 | "strip-ansi": "^3.0.0"
1855 | }
1856 | },
1857 | "strip-ansi": {
1858 | "version": "3.0.1",
1859 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
1860 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
1861 | "dev": true,
1862 | "requires": {
1863 | "ansi-regex": "^2.0.0"
1864 | }
1865 | }
1866 | }
1867 | },
1868 | "wrappy": {
1869 | "version": "1.0.2",
1870 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
1871 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
1872 | "dev": true
1873 | },
1874 | "write-file-atomic": {
1875 | "version": "2.4.2",
1876 | "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.4.2.tgz",
1877 | "integrity": "sha512-s0b6vB3xIVRLWywa6X9TOMA7k9zio0TMOsl9ZnDkliA/cfJlpHXAscj0gbHVJiTdIuAYpIyqS5GW91fqm6gG5g==",
1878 | "dev": true,
1879 | "requires": {
1880 | "graceful-fs": "^4.1.11",
1881 | "imurmurhash": "^0.1.4",
1882 | "signal-exit": "^3.0.2"
1883 | }
1884 | },
1885 | "y18n": {
1886 | "version": "4.0.0",
1887 | "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
1888 | "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
1889 | "dev": true
1890 | },
1891 | "yallist": {
1892 | "version": "2.1.2",
1893 | "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
1894 | "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
1895 | "dev": true
1896 | },
1897 | "yargs": {
1898 | "version": "13.2.2",
1899 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-13.2.2.tgz",
1900 | "integrity": "sha512-WyEoxgyTD3w5XRpAQNYUB9ycVH/PQrToaTXdYXRdOXvEy1l19br+VJsc0vcO8PTGg5ro/l/GY7F/JMEBmI0BxA==",
1901 | "dev": true,
1902 | "requires": {
1903 | "cliui": "^4.0.0",
1904 | "find-up": "^3.0.0",
1905 | "get-caller-file": "^2.0.1",
1906 | "os-locale": "^3.1.0",
1907 | "require-directory": "^2.1.1",
1908 | "require-main-filename": "^2.0.0",
1909 | "set-blocking": "^2.0.0",
1910 | "string-width": "^3.0.0",
1911 | "which-module": "^2.0.0",
1912 | "y18n": "^4.0.0",
1913 | "yargs-parser": "^13.0.0"
1914 | },
1915 | "dependencies": {
1916 | "ansi-regex": {
1917 | "version": "4.1.0",
1918 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
1919 | "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
1920 | "dev": true
1921 | },
1922 | "find-up": {
1923 | "version": "3.0.0",
1924 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1925 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1926 | "dev": true,
1927 | "requires": {
1928 | "locate-path": "^3.0.0"
1929 | }
1930 | },
1931 | "string-width": {
1932 | "version": "3.1.0",
1933 | "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
1934 | "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
1935 | "dev": true,
1936 | "requires": {
1937 | "emoji-regex": "^7.0.1",
1938 | "is-fullwidth-code-point": "^2.0.0",
1939 | "strip-ansi": "^5.1.0"
1940 | }
1941 | },
1942 | "strip-ansi": {
1943 | "version": "5.2.0",
1944 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
1945 | "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
1946 | "dev": true,
1947 | "requires": {
1948 | "ansi-regex": "^4.1.0"
1949 | }
1950 | }
1951 | }
1952 | },
1953 | "yargs-parser": {
1954 | "version": "13.0.0",
1955 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-13.0.0.tgz",
1956 | "integrity": "sha512-w2LXjoL8oRdRQN+hOyppuXs+V/fVAYtpcrRxZuF7Kt/Oc+Jr2uAcVntaUTNT6w5ihoWfFDpNY8CPx1QskxZ/pw==",
1957 | "dev": true,
1958 | "requires": {
1959 | "camelcase": "^5.0.0",
1960 | "decamelize": "^1.2.0"
1961 | },
1962 | "dependencies": {
1963 | "camelcase": {
1964 | "version": "5.3.1",
1965 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
1966 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
1967 | "dev": true
1968 | }
1969 | }
1970 | },
1971 | "yargs-unparser": {
1972 | "version": "1.5.0",
1973 | "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-1.5.0.tgz",
1974 | "integrity": "sha512-HK25qidFTCVuj/D1VfNiEndpLIeJN78aqgR23nL3y4N0U/91cOAzqfHlF8n2BvoNDcZmJKin3ddNSvOxSr8flw==",
1975 | "dev": true,
1976 | "requires": {
1977 | "flat": "^4.1.0",
1978 | "lodash": "^4.17.11",
1979 | "yargs": "^12.0.5"
1980 | },
1981 | "dependencies": {
1982 | "camelcase": {
1983 | "version": "5.3.1",
1984 | "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
1985 | "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
1986 | "dev": true
1987 | },
1988 | "find-up": {
1989 | "version": "3.0.0",
1990 | "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
1991 | "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
1992 | "dev": true,
1993 | "requires": {
1994 | "locate-path": "^3.0.0"
1995 | }
1996 | },
1997 | "get-caller-file": {
1998 | "version": "1.0.3",
1999 | "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz",
2000 | "integrity": "sha512-3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==",
2001 | "dev": true
2002 | },
2003 | "require-main-filename": {
2004 | "version": "1.0.1",
2005 | "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz",
2006 | "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=",
2007 | "dev": true
2008 | },
2009 | "yargs": {
2010 | "version": "12.0.5",
2011 | "resolved": "https://registry.npmjs.org/yargs/-/yargs-12.0.5.tgz",
2012 | "integrity": "sha512-Lhz8TLaYnxq/2ObqHDql8dX8CJi97oHxrjUcYtzKbbykPtVW9WB+poxI+NM2UIzsMgNCZTIf0AQwsjK5yMAqZw==",
2013 | "dev": true,
2014 | "requires": {
2015 | "cliui": "^4.0.0",
2016 | "decamelize": "^1.2.0",
2017 | "find-up": "^3.0.0",
2018 | "get-caller-file": "^1.0.1",
2019 | "os-locale": "^3.0.0",
2020 | "require-directory": "^2.1.1",
2021 | "require-main-filename": "^1.0.1",
2022 | "set-blocking": "^2.0.0",
2023 | "string-width": "^2.0.0",
2024 | "which-module": "^2.0.0",
2025 | "y18n": "^3.2.1 || ^4.0.0",
2026 | "yargs-parser": "^11.1.1"
2027 | }
2028 | },
2029 | "yargs-parser": {
2030 | "version": "11.1.1",
2031 | "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-11.1.1.tgz",
2032 | "integrity": "sha512-C6kB/WJDiaxONLJQnF8ccx9SEeoTTLek8RVbaOIsrAUS8VrBEXfmeSnCZxygc+XC2sNMBIwOOnfcxiynjHsVSQ==",
2033 | "dev": true,
2034 | "requires": {
2035 | "camelcase": "^5.0.0",
2036 | "decamelize": "^1.2.0"
2037 | }
2038 | }
2039 | }
2040 | }
2041 | }
2042 | }
2043 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "intl-messageformat-parser",
3 | "version": "1.5.1",
4 | "description": "Parses ICU Message strings into an AST via JavaScript.",
5 | "main": "index.js",
6 | "jsnext:main": "src/parser.js",
7 | "browser": "dist/parser.js",
8 | "scripts": {
9 | "clean": "rimraf dist lib",
10 | "test": "nyc mocha test/unit/ --reporter spec",
11 | "build": "npm run clean && ./build.js",
12 | "benchmark": "./test/benchmark.js",
13 | "prepublish": "npm run build"
14 | },
15 | "contributors": [
16 | "Eric Ferraiuolo ",
17 | "Long Ho ",
18 | "Ryuichi Okumura ",
19 | "Seth Bertalotto ",
20 | "Song Seunggeun ",
21 | "Tobias Bieniek "
22 | ],
23 | "repository": {
24 | "type": "git",
25 | "url": "git://github.com/yahoo/intl-messageformat-parser.git"
26 | },
27 | "keywords": [
28 | "i18n",
29 | "intl",
30 | "internationalization",
31 | "localization",
32 | "globalization",
33 | "messageformat",
34 | "parser",
35 | "plural",
36 | "icu"
37 | ],
38 | "author": "Eric Ferraiuolo ",
39 | "license": "BSD-3-Clause",
40 | "bugs": {
41 | "url": "https://github.com/yahoo/intl-messageformat-parser/issues"
42 | },
43 | "homepage": "https://github.com/yahoo/intl-messageformat-parser",
44 | "devDependencies": {
45 | "benchmark": "^2.1.4",
46 | "expect.js": "^0.3.1",
47 | "fs-extra": "^7.0.1",
48 | "mocha": "^6.1.4",
49 | "nyc": "^14.0.0",
50 | "pegjs": "^0.10.0",
51 | "rimraf": "^2.6.3"
52 | }
53 | }
54 |
--------------------------------------------------------------------------------
/src/parser.pegjs:
--------------------------------------------------------------------------------
1 | /*
2 | Copyright 2014, Yahoo! Inc. All rights reserved.
3 | Copyrights licensed under the New BSD License.
4 | See the accompanying LICENSE file for terms.
5 | */
6 |
7 | /*
8 | Inspired by and derivied from:
9 | messageformat.js https://github.com/SlexAxton/messageformat.js
10 | Copyright 2014 Alex Sexton
11 | Apache License, Version 2.0
12 | */
13 |
14 | start
15 | = messageFormatPattern
16 |
17 | messageFormatPattern
18 | = elements:messageFormatElement* {
19 | return {
20 | type : 'messageFormatPattern',
21 | elements: elements,
22 | location: location()
23 | };
24 | }
25 |
26 | messageFormatElement
27 | = messageTextElement
28 | / argumentElement
29 |
30 | messageText
31 | = text:(_ chars _)+ {
32 | var string = '',
33 | i, j, outerLen, inner, innerLen;
34 |
35 | for (i = 0, outerLen = text.length; i < outerLen; i += 1) {
36 | inner = text[i];
37 |
38 | for (j = 0, innerLen = inner.length; j < innerLen; j += 1) {
39 | string += inner[j];
40 | }
41 | }
42 |
43 | return string;
44 | }
45 | / $(ws)
46 |
47 | messageTextElement
48 | = messageText:messageText {
49 | return {
50 | type : 'messageTextElement',
51 | value: messageText,
52 | location: location()
53 | };
54 | }
55 |
56 | argument
57 | = number
58 | / $([^ \t\n\r,.+={}#]+)
59 |
60 | argumentElement
61 | = '{' _ id:argument _ format:(',' _ elementFormat)? _ '}' {
62 | return {
63 | type : 'argumentElement',
64 | id : id,
65 | format: format && format[2],
66 | location: location()
67 | };
68 | }
69 |
70 | elementFormat
71 | = simpleFormat
72 | / pluralFormat
73 | / selectOrdinalFormat
74 | / selectFormat
75 |
76 | simpleFormat
77 | = type:('number' / 'date' / 'time') _ style:(',' _ chars)? {
78 | return {
79 | type : type + 'Format',
80 | style: style && style[2],
81 | location: location()
82 | };
83 | }
84 |
85 | pluralFormat
86 | = 'plural' _ ',' _ pluralStyle:pluralStyle {
87 | return {
88 | type : pluralStyle.type,
89 | ordinal: false,
90 | offset : pluralStyle.offset || 0,
91 | options: pluralStyle.options,
92 | location: location()
93 | };
94 | }
95 |
96 | selectOrdinalFormat
97 | = 'selectordinal' _ ',' _ pluralStyle:pluralStyle {
98 | return {
99 | type : pluralStyle.type,
100 | ordinal: true,
101 | offset : pluralStyle.offset || 0,
102 | options: pluralStyle.options,
103 | location: location()
104 | }
105 | }
106 |
107 | selectFormat
108 | = 'select' _ ',' _ options:optionalFormatPattern+ {
109 | return {
110 | type : 'selectFormat',
111 | options: options,
112 | location: location()
113 | };
114 | }
115 |
116 | selector
117 | = $('=' number)
118 | / chars
119 |
120 | optionalFormatPattern
121 | = _ selector:selector _ '{' _ pattern:messageFormatPattern _ '}' {
122 | return {
123 | type : 'optionalFormatPattern',
124 | selector: selector,
125 | value : pattern,
126 | location: location()
127 | };
128 | }
129 |
130 | offset
131 | = 'offset:' _ number:number {
132 | return number;
133 | }
134 |
135 | pluralStyle
136 | = offset:offset? _ options:optionalFormatPattern+ {
137 | return {
138 | type : 'pluralFormat',
139 | offset : offset,
140 | options: options,
141 | location: location()
142 | };
143 | }
144 |
145 | // -- Helpers ------------------------------------------------------------------
146 |
147 | ws 'whitespace' = [ \t\n\r]+
148 | _ 'optionalWhitespace' = $(ws*)
149 |
150 | digit = [0-9]
151 | hexDigit = [0-9a-f]i
152 |
153 | number = digits:('0' / $([1-9] digit*)) {
154 | return parseInt(digits, 10);
155 | }
156 |
157 | char
158 | = [^{}\\\0-\x1F\x7f \t\n\r]
159 | / '\\\\' { return '\\'; }
160 | / '\\#' { return '\\#'; }
161 | / '\\{' { return '\u007B'; }
162 | / '\\}' { return '\u007D'; }
163 | / '\\u' digits:$(hexDigit hexDigit hexDigit hexDigit) {
164 | return String.fromCharCode(parseInt(digits, 16));
165 | }
166 |
167 | chars = chars:char+ { return chars.join(''); }
168 |
--------------------------------------------------------------------------------
/test/benchmark.js:
--------------------------------------------------------------------------------
1 | #!/usr/bin/env node
2 | 'use strict';
3 | const benchmark = require('benchmark')
4 | var parser = require('../');
5 |
6 | const complexMsg = '' +
7 | '{gender_of_host, select, ' +
8 | 'female {' +
9 | '{num_guests, plural, offset:1 ' +
10 | '=0 {{host} does not give a party.}' +
11 | '=1 {{host} invites {guest} to her party.}' +
12 | '=2 {{host} invites {guest} and one other person to her party.}' +
13 | 'other {{host} invites {guest} and # other people to her party.}}}' +
14 | 'male {' +
15 | '{num_guests, plural, offset:1 ' +
16 | '=0 {{host} does not give a party.}' +
17 | '=1 {{host} invites {guest} to his party.}' +
18 | '=2 {{host} invites {guest} and one other person to his party.}' +
19 | 'other {{host} invites {guest} and # other people to his party.}}}' +
20 | 'other {' +
21 | '{num_guests, plural, offset:1 ' +
22 | '=0 {{host} does not give a party.}' +
23 | '=1 {{host} invites {guest} to their party.}' +
24 | '=2 {{host} invites {guest} and one other person to their party.}' +
25 | 'other {{host} invites {guest} and # other people to their party.}}}}';
26 |
27 | const normalMsg = '' +
28 | 'Yo, {firstName} {lastName} has ' +
29 | '{numBooks, number, integer} ' +
30 | '{numBooks, plural, ' +
31 | 'one {book} ' +
32 | 'other {books}}.';
33 |
34 | const simpleMsg = 'Hello, {name}!';
35 |
36 | const stringMsg = 'Hello, world!';
37 |
38 | new benchmark.Suite()
39 | .add('complex_msg', () => parser.parse(complexMsg))
40 | .add('normal_msg', () => parser.parse(normalMsg))
41 | .add('simple_msg', () => parser.parse(simpleMsg))
42 | .add('string_msg', () => parser.parse(stringMsg))
43 | .on('cycle', function(event) {
44 | console.log(String(event.target));
45 | })
46 | .run()
47 |
--------------------------------------------------------------------------------
/test/unit/parser.js:
--------------------------------------------------------------------------------
1 | /* global describe, it */
2 | 'use strict';
3 |
4 | var expect = require('expect.js');
5 | var parser = require('../../');
6 |
7 | describe('exports', function () {
8 | it('should have a `parse` export', function () {
9 | expect(parser).to.have.property('parse');
10 | expect(parser.parse).to.be.a('function');
11 | });
12 |
13 | it('should have a `SyntaxError` export', function () {
14 | expect(parser).to.have.property('SyntaxError');
15 | expect(parser.SyntaxError).to.be.a('function');
16 | });
17 | });
18 |
19 | describe('parse()', function () {
20 | var parse = parser.parse;
21 |
22 | it('should expect a String argument', function () {
23 | expect(parse).withArgs('').to.not.throwException();
24 |
25 | expect(parse).withArgs().to.throwException();
26 | expect(parse).withArgs(undefined).to.throwException();
27 | expect(parse).withArgs(null).to.throwException();
28 | });
29 |
30 | it('should return an AST object', function () {
31 | var ast = parse('');
32 | expect(ast).to.be.an('object');
33 | expect(ast.type).to.equal('messageFormatPattern');
34 | expect(ast.elements).to.be.an('array');
35 | expect(ast.elements).to.be.empty(0);
36 | });
37 |
38 | describe('parse("Hello, World!")', function () {
39 | var msg = 'Hello, World!';
40 | var ast = parse(msg);
41 |
42 | it('should contain 1 `elements`', function () {
43 | expect(ast.elements).to.have.length(1);
44 | });
45 |
46 | it('should contain a `messageTextElement`', function () {
47 | var element = ast.elements[0];
48 | expect(element).to.be.an('object');
49 | expect(element).to.have.property('type');
50 | expect(element.type).to.equal('messageTextElement');
51 | expect(element).to.have.property('value');
52 | expect(element.value).to.equal(msg);
53 | expect(element).to.have.property('location');
54 | expect(element.location).to.eql({
55 | start: { offset: 0, line: 1, column: 1 },
56 | end: { offset: 13, line: 1, column: 14 },
57 | });
58 | });
59 | });
60 |
61 | describe('parse("Hello, {name}!")', function () {
62 | var msg = 'Hello, {name}!';
63 | var ast = parse(msg);
64 |
65 | it('should contain 3 `elements`', function () {
66 | expect(ast.elements).to.have.length(3);
67 | });
68 |
69 | it('should first contain a `messageTextElement`', function () {
70 | var element = ast.elements[0];
71 | expect(element.value).to.equal('Hello, ');
72 | expect(element).to.have.property('location');
73 | expect(element.location).to.eql({
74 | start: { offset: 0, line: 1, column: 1 },
75 | end: { offset: 7, line: 1, column: 8 },
76 | });
77 | });
78 |
79 | it('should then contain an `argumentElement`', function () {
80 | var element = ast.elements[1];
81 | expect(element).to.be.an('object');
82 | expect(element).to.have.property('type');
83 | expect(element.type).to.equal('argumentElement');
84 | expect(element).to.have.property('id');
85 | expect(element.id).to.equal('name');
86 | expect(element).to.have.property('format');
87 | expect(element.format).to.equal(null);
88 | expect(element).to.have.property('location');
89 | expect(element.location).to.eql({
90 | start: { offset: 7, line: 1, column: 8 },
91 | end: { offset: 13, line: 1, column: 14 },
92 | });
93 | });
94 |
95 | it('should finally contain a `messageTextElement`', function () {
96 | var element = ast.elements[2];
97 | expect(element.value).to.equal('!');
98 | expect(element).to.have.property('location');
99 | expect(element.location).to.eql({
100 | start: { offset: 13, line: 1, column: 14 },
101 | end: { offset: 14, line: 1, column: 15 },
102 | });
103 | });
104 | });
105 |
106 | describe('parse("{num, number, percent}")', function () {
107 | var msg = '{num, number, percent}';
108 | var ast = parse(msg);
109 |
110 | it('should contain 1 `elements`', function () {
111 | expect(ast.elements).to.have.length(1);
112 | });
113 |
114 | it('should contain an `argumentElement`', function () {
115 | var element = ast.elements[0];
116 | expect(element).to.be.an('object');
117 | expect(element).to.have.property('type');
118 | expect(element.type).to.equal('argumentElement');
119 | expect(element).to.have.property('id');
120 | expect(element.id).to.equal('num');
121 | expect(element).to.have.property('location');
122 | expect(element.location).to.eql({
123 | start: { offset: 0, line: 1, column: 1 },
124 | end: { offset: 22, line: 1, column: 23 },
125 | });
126 | expect(element).to.have.property('format');
127 |
128 | var format = element.format;
129 | expect(format).to.be.an('object');
130 | expect(format).to.have.property('type');
131 | expect(format.type).to.equal('numberFormat');
132 | expect(format).to.have.property('style');
133 | expect(format.style).to.equal('percent');
134 | expect(format).to.have.property('location');
135 | expect(format.location).to.eql({
136 | start: { offset: 6, line: 1, column: 7 },
137 | end: { offset: 21, line: 1, column: 22 },
138 | });
139 | });
140 | });
141 |
142 | describe('parse("{numPhotos, plural, =0{no photos} =1{one photo} other{# photos}}")', function () {
143 | var msg = '{numPhotos, plural, =0{no photos} =1{one photo} other{# photos}}';
144 | var ast = parse(msg);
145 |
146 | it('should contain 1 `elements`', function () {
147 | expect(ast.elements).to.have.length(1);
148 | });
149 |
150 | it('should contain an `argumentElement`', function () {
151 | var element = ast.elements[0];
152 | expect(element).to.be.an('object');
153 | expect(element).to.have.property('type');
154 | expect(element.type).to.equal('argumentElement');
155 | expect(element).to.have.property('id');
156 | expect(element.id).to.equal('numPhotos');
157 | expect(element).to.have.property('location');
158 | expect(element.location).to.eql({
159 | start: { offset: 0, line: 1, column: 1 },
160 | end: { offset: 64, line: 1, column: 65 },
161 | });
162 | expect(element).to.have.property('format');
163 |
164 | var format = element.format;
165 | expect(format).to.be.an('object');
166 | expect(format).to.have.property('type');
167 | expect(format.type).to.equal('pluralFormat');
168 | expect(format).to.have.property('offset');
169 | expect(format.offset).to.equal(0);
170 | expect(format).to.have.property('location');
171 | expect(format.location).to.eql({
172 | start: { offset: 12, line: 1, column: 13 },
173 | end: { offset: 63, line: 1, column: 64 },
174 | });
175 | });
176 |
177 | it('should contain 3 `options`', function () {
178 | var options = ast.elements[0].format.options;
179 | expect(options).to.have.length(3);
180 |
181 | var option = options[0];
182 | expect(option).to.be.an('object');
183 | expect(option).to.have.property('type');
184 | expect(option.type).to.equal('optionalFormatPattern');
185 | expect(option).to.have.property('selector');
186 | expect(option.selector).to.equal('=0');
187 | expect(option).to.have.property('value');
188 | expect(option.value).to.be.an('object');
189 | expect(option).to.have.property('location');
190 | expect(option.location).to.eql({
191 | start: { offset: 20, line: 1, column: 21 },
192 | end: { offset: 33, line: 1, column: 34 },
193 | });
194 |
195 | expect(options[1].selector).to.equal('=1');
196 | expect(options[2].selector).to.equal('other');
197 | });
198 |
199 | it('should contain nested `messageFormatPattern` values for each option', function () {
200 | var options = ast.elements[0].format.options;
201 |
202 | var value = options[0].value;
203 | expect(value).to.have.property('type');
204 | expect(value.type).to.equal('messageFormatPattern');
205 | expect(value).to.have.property('elements');
206 | expect(value.elements).to.be.an('array');
207 | expect(value.elements).to.have.length(1);
208 |
209 | var element = value.elements[0];
210 | expect(element).to.be.an('object');
211 | expect(element).to.have.property('type');
212 | expect(element.type).to.equal('messageTextElement');
213 | expect(element).to.have.property('value');
214 | expect(element.value).to.equal('no photos');
215 | expect(element).to.have.property('location');
216 | expect(element.location).to.eql({
217 | start: { offset: 23, line: 1, column: 24 },
218 | end: { offset: 32, line: 1, column: 33 },
219 | });
220 |
221 | expect(options[1].value.elements[0].value).to.equal('one photo');
222 | expect(options[2].value.elements[0].value).to.equal('# photos');
223 | });
224 | });
225 |
226 | describe('parse("{floor, selectordinal, =0{ground} one{#st} two{#nd} few{#rd} other{#th}} floor")', function () {
227 | var msg = '{floor, selectordinal, =0{ground} one{#st} two{#nd} few{#rd} other{#th}} floor';
228 | var ast = parse(msg);
229 |
230 | it('should contain 2 `elements`', function () {
231 | expect(ast.elements).to.have.length(2);
232 | });
233 |
234 | it('should contain an `argumentElement`', function () {
235 | var element = ast.elements[0];
236 | expect(element).to.be.an('object');
237 | expect(element).to.have.property('type');
238 | expect(element.type).to.equal('argumentElement');
239 | expect(element).to.have.property('id');
240 | expect(element.id).to.equal('floor');
241 | expect(element).to.have.property('location');
242 | expect(element.location).to.eql({
243 | start: { offset: 0, line: 1, column: 1 },
244 | end: { offset: 72, line: 1, column: 73 },
245 | });
246 | expect(element).to.have.property('format');
247 |
248 | var format = element.format;
249 | expect(format).to.be.an('object');
250 | expect(format).to.have.property('type');
251 | expect(format.type).to.equal('pluralFormat');
252 | expect(format).to.have.property('offset');
253 | expect(format.offset).to.equal(0);
254 | expect(format.ordinal).to.equal(true);
255 | expect(format).to.have.property('location');
256 | expect(format.location).to.eql({
257 | start: { offset: 8, line: 1, column: 9 },
258 | end: { offset: 71, line: 1, column: 72 },
259 | });
260 | });
261 |
262 | it('should contain 5 `options`', function () {
263 | var options = ast.elements[0].format.options;
264 | expect(options).to.have.length(5);
265 |
266 | var option = options[0];
267 | expect(option).to.be.an('object');
268 | expect(option).to.have.property('type');
269 | expect(option.type).to.equal('optionalFormatPattern');
270 | expect(option).to.have.property('selector');
271 | expect(option.selector).to.equal('=0');
272 | expect(option).to.have.property('value');
273 | expect(option.value).to.be.an('object');
274 | expect(option).to.have.property('location');
275 | expect(option.location).to.eql({
276 | start: { offset: 23, line: 1, column: 24 },
277 | end: { offset: 33, line: 1, column: 34 },
278 | });
279 |
280 | expect(options[1].selector).to.equal('one');
281 | expect(options[2].selector).to.equal('two');
282 | expect(options[3].selector).to.equal('few');
283 | expect(options[4].selector).to.equal('other');
284 | });
285 |
286 | it('should contain nested `messageFormatPattern` values for each option', function () {
287 | var options = ast.elements[0].format.options;
288 |
289 | var value = options[0].value;
290 | expect(value).to.have.property('type');
291 | expect(value.type).to.equal('messageFormatPattern');
292 | expect(value).to.have.property('elements');
293 | expect(value.elements).to.be.an('array');
294 | expect(value.elements).to.have.length(1);
295 |
296 | var element = value.elements[0];
297 | expect(element).to.be.an('object');
298 | expect(element).to.have.property('type');
299 | expect(element.type).to.equal('messageTextElement');
300 | expect(element).to.have.property('value');
301 | expect(element.value).to.equal('ground');
302 | expect(element).to.have.property('location');
303 | expect(element.location).to.eql({
304 | start: { offset: 26, line: 1, column: 27 },
305 | end: { offset: 32, line: 1, column: 33 },
306 | });
307 |
308 | expect(options[0].value.elements[0].value).to.equal('ground');
309 | expect(options[1].value.elements[0].value).to.equal('#st');
310 | expect(options[2].value.elements[0].value).to.equal('#nd');
311 | expect(options[3].value.elements[0].value).to.equal('#rd');
312 | expect(options[4].value.elements[0].value).to.equal('#th');
313 | });
314 | });
315 |
316 | describe('parse("{gender, select, female {woman} male {man} other {person}}")', function () {
317 | var msg = '{gender, select, female {woman} male {man} other {person}}';
318 | var ast = parse(msg);
319 |
320 | it('should contain 1 `elements`', function () {
321 | expect(ast.elements).to.have.length(1);
322 | });
323 |
324 | it('should contain an `argumentElement`', function () {
325 | var element = ast.elements[0];
326 | expect(element).to.be.an('object');
327 | expect(element).to.have.property('type');
328 | expect(element.type).to.equal('argumentElement');
329 | expect(element).to.have.property('id');
330 | expect(element.id).to.equal('gender');
331 | expect(element).to.have.property('location');
332 | expect(element.location).to.eql({
333 | start: { offset: 0, line: 1, column: 1 },
334 | end: { offset: 58, line: 1, column: 59 },
335 | });
336 | expect(element).to.have.property('format');
337 |
338 | var format = element.format;
339 | expect(format).to.be.an('object');
340 | expect(format).to.have.property('type');
341 | expect(format.type).to.equal('selectFormat');
342 | expect(format).to.have.property('location');
343 | expect(format.location).to.eql({
344 | start: { offset: 9, line: 1, column: 10 },
345 | end: { offset: 57, line: 1, column: 58 },
346 | });
347 | });
348 |
349 | it('should contain 3 `options`', function () {
350 | var options = ast.elements[0].format.options;
351 | expect(options).to.have.length(3);
352 |
353 | var option = options[0];
354 | expect(option).to.be.an('object');
355 | expect(option).to.have.property('type');
356 | expect(option.type).to.equal('optionalFormatPattern');
357 | expect(option).to.have.property('selector');
358 | expect(option.selector).to.equal('female');
359 | expect(option).to.have.property('value');
360 | expect(option.value).to.be.an('object');
361 | expect(option).to.have.property('location');
362 | expect(option.location).to.eql({
363 | start: { offset: 17, line: 1, column: 18 },
364 | end: { offset: 31, line: 1, column: 32 },
365 | });
366 |
367 | expect(options[1].selector).to.equal('male');
368 | expect(options[2].selector).to.equal('other');
369 | });
370 |
371 | it('should contain nested `messageFormatPattern` values for each option', function () {
372 | var options = ast.elements[0].format.options;
373 |
374 | var value = options[0].value;
375 | expect(value).to.have.property('type');
376 | expect(value.type).to.equal('messageFormatPattern');
377 | expect(value).to.have.property('elements');
378 | expect(value.elements).to.be.an('array');
379 | expect(value.elements).to.have.length(1);
380 |
381 | var element = value.elements[0];
382 | expect(element).to.be.an('object');
383 | expect(element).to.have.property('type');
384 | expect(element.type).to.equal('messageTextElement');
385 | expect(element).to.have.property('value');
386 | expect(element.value).to.equal('woman');
387 | expect(element).to.have.property('location');
388 | expect(element.location).to.eql({
389 | start: { offset: 25, line: 1, column: 26 },
390 | end: { offset: 30, line: 1, column: 31 },
391 | });
392 |
393 | expect(options[1].value.elements[0].value).to.equal('man');
394 | expect(options[2].value.elements[0].value).to.equal('person');
395 | });
396 | });
397 |
398 | describe('whitespace', function () {
399 | it('should allow whitespace in and around `messageTextElement`s', function () {
400 | var msg = ' some random test ';
401 | var ast = parse(msg);
402 | expect(ast.elements[0].value).to.equal(msg);
403 | });
404 |
405 | it('should allow whitespace in `argumentElement`s', function () {
406 | var msg = '{ num , number,percent }';
407 | var ast = parse(msg);
408 |
409 | var element = ast.elements[0];
410 | expect(element.id).to.equal('num');
411 | expect(element.format.type).to.equal('numberFormat');
412 | expect(element.format.style).to.equal('percent');
413 | });
414 | });
415 |
416 | describe('escaping', function () {
417 | it('should allow escaping of syntax chars via `\\\\`', function () {
418 | expect(parse('\\{').elements[0].value).to.equal('{');
419 | expect(parse('\\}').elements[0].value).to.equal('}');
420 | expect(parse('\\u003C').elements[0].value).to.equal('<');
421 |
422 | // Escaping "#" needs to be special-cased so it remains escaped so
423 | // the runtime doesn't replace it when in a `pluralFormat` option.
424 | expect(parse('\\#').elements[0].value).to.equal('\\#');
425 | });
426 |
427 | it('should allow backslash chars in `messageTextElement`s', function () {
428 | expect(parse('\\u005c').elements[0].value).to.equal('\\');
429 | expect(parse('\\\\').elements[0].value).to.equal('\\');
430 | });
431 | });
432 | });
433 |
--------------------------------------------------------------------------------