├── .gitignore ├── .npmignore ├── .travis.yml ├── README.md ├── index.test.ts ├── index.ts ├── package-lock.json ├── package.json ├── tsconfig.json └── tslint.json /.gitignore: -------------------------------------------------------------------------------- 1 | coverage/ 2 | dist/ 3 | node_modules/ 4 | .nyc_output/ 5 | .vscode/ 6 | typedoc/ 7 | -------------------------------------------------------------------------------- /.npmignore: -------------------------------------------------------------------------------- 1 | coverage/ 2 | .git/ 3 | node_modules/ 4 | .nyc_output/ 5 | .vscode/ 6 | typedoc/ 7 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: node_js 2 | node_js: node 3 | script: npm run test-ci 4 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # juxta 2 | 3 | A library for writing composable comparison functions. 4 | 5 | *juxta* has the following features: 6 | 7 | * **Composable**. You can express "sort by X then by Y" and "sort X before Y" using a uniform API. 8 | * **Type-safe**. *juxta* has complete TypeScript definitions. If it compiles, it (probably) works. 9 | * **Readable**. Code that uses *juxta* is much easier to understand and audit than the equivalent written out in full. 10 | 11 | 12 | ## Example 13 | 14 | ```typescript 15 | import compare, { Comparator } from 'juxta'; 16 | import _ from 'lodash'; 17 | import moment from 'moment'; 18 | 19 | interface SearchResult { 20 | name: string | null; 21 | rank: number; 22 | time: Moment; 23 | } 24 | 25 | const compareNames: Comparator = 26 | compare() 27 | .append(_.isNull); 28 | 29 | const compareSearchResults: Comparator = 30 | compare.on((s: SearchResult) => s.rank) 31 | .then(compare.on((s: SearchResult) => s.time).reverse()) 32 | .then(compareNames.from((s: SearchResult) => s.name)); 33 | 34 | let results: SearchResult[] = [ 35 | { 36 | name: "Humanity Has Declined", 37 | rank: 2, 38 | time: moment('2012-07-02'), 39 | }, 40 | { 41 | name: null, 42 | rank: 1, 43 | time: moment('1818-05-05'), 44 | }, 45 | { 46 | name: "Ping Pong The Animation", 47 | rank: 0, 48 | time: moment('2014-04-11'), 49 | }, 50 | ]; 51 | 52 | results.sort(compareSearchResults); 53 | ``` 54 | 55 | 56 | ## Why *juxta*? 57 | 58 | JavaScript provides a built-in method to sort arrays, called [`Array.prototype.sort`][Array.prototype.sort]. You can customize how it compares elements by passing a *comparison function* to the method. 59 | 60 | [Array.prototype.sort]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort 61 | 62 | Unfortunately, these comparison functions can be hard to write and understand. For example, here's a function that compares nullable strings, sorting `null` values last: 63 | 64 | ```typescript 65 | function compareStringsNullLast(a: string | null, b: string | null): number { 66 | if (a === null && b === null) { 67 | return 0; 68 | } else if (a === null && b !== null) { 69 | return -1; 70 | } else if (a !== null && b === null) { 71 | return 1; 72 | } else { 73 | return a < b ? -1 : a > b ? 1 : 0; 74 | } 75 | } 76 | ``` 77 | 78 | I'd hate to be the person reviewing that code. 79 | 80 | **Fun fact!** There's a bug in that example! Can you find it? 81 | 82 | With *juxta*, this function can be written as follows: 83 | 84 | ```typescript 85 | const compareStringsNullLast = compare().append(_.isNull); 86 | ``` 87 | 88 | That's much less typing -- and more importantly, it is guaranteed correct. 89 | 90 | 91 | ## Creating comparison functions 92 | 93 | *juxta* exposes its API through a default export. By convention we name it `compare`: 94 | 95 | ```typescript 96 | import compare from 'juxta'; 97 | ``` 98 | 99 | There are three main ways to create a comparison function: 100 | 101 | * Use `compare()` to compare values of type `T` using the built-in `<` and `>` operators. For example, `compare()` compares values of type `number`. 102 | * Use `compare(existingFunction)` to wrap an existing comparison function in a *juxta* object. This lets you use the helper methods detailed below. For example, `compare((s: string, t: string) => s.localeCompare(t))` compares strings case-insensitively using the current locale. 103 | * Use `compare.on(...)` to transform the input before comparing it. For example, `compare.on((x: any[]) => x.length)` compares arrays by length. 104 | 105 | 106 | ## Using comparison functions 107 | 108 | All *juxta* objects are functions, so you can pass them directly to `.sort()`: 109 | 110 | ```typescript 111 | const compareNumbers = compare(); 112 | console.log([3, 2, 1].sort(compareNumbers)); // [1, 2, 3] 113 | ``` 114 | 115 | 116 | ## Ascending vs descending order 117 | 118 | `compare()` and `compare.on()` use ascending order (smallest first) by default. 119 | 120 | To sort by descending order (largest first) instead, use the `.reverse()` method: `compare().reverse()`. 121 | 122 | Calling `.reverse()` twice gives the same result as calling it zero times. 123 | 124 | 125 | ## Transforming the input 126 | 127 | Each elf has a hat, and each hat has a [bauble]. We want to sort elves by the baubles on their hats. (The comparison of baubles is a solved problem and has been defined elsewhere.) 128 | 129 | This can be written as follows: 130 | 131 | ```typescript 132 | const compareElvesByBaubles = compareBaubles.from((e: Elf) => e.hat.bauble); 133 | ``` 134 | 135 | [bauble]: http://www.dictionary.com/browse/bauble 136 | 137 | Note that since we're transforming *inputs*, not outputs, the method calls may look "backwards" to what you would expect. This is apparent when using more than one `.from()` call: 138 | 139 | ```typescript 140 | const compareElvesByBaubles = compareBaubles 141 | .from((h: Hat) => h.bauble) 142 | .from((e: Elf) => e.hat); 143 | ``` 144 | 145 | 146 | ## Sorting by multiple fields 147 | 148 | On testing, it was found that there are elves with identical baubles. In this case, they can be distinguished by the colors of their socks. 149 | 150 | To sort by more than one property, chain the comparison functions using `.then()`: 151 | 152 | ```typescript 153 | const compareElvesByBaublesAndSockColor = compareElvesByBaubles 154 | .then(compare.on((e: Elf) => e.sock.color)); 155 | ``` 156 | 157 | 158 | ## Partitioning the input into groups 159 | 160 | Oh no! Some elves have rebelled against the social order, and replaced the baubles on their hats with [trinkets]. Your assistant has provided you with two options: either punish the "trinketeers" by sorting them last, or cede to their demands and sort them first. Luckily, *juxta* allows for both: 161 | 162 | [trinkets]: https://www.merriam-webster.com/dictionary/trinket 163 | 164 | ```typescript 165 | // TODO: implement sock colors under the new regime 166 | 167 | const compareTrinketsFirst = compareElvesByBaubles 168 | .prepend((e: Elf) => e.hasTrinket(), compareElvesByTrinkets); 169 | 170 | const compareTrinketsLast = compareElvesByBaubles 171 | .append((e: Elf) => e.hasTrinket(), compareElvesByTrinkets); 172 | ``` 173 | 174 | In more peaceful times, `.prepend()` and `.append()` can be used for separating `null`, `undefined`, and `NaN` values as well: 175 | 176 | ```typescript 177 | import _ from 'lodash'; 178 | 179 | const compareNumbers = compare().append(isNaN); 180 | 181 | const compareStrings = compare() 182 | .prepend(_.isNull); 183 | .append(_.isUndefined); 184 | 185 | const compareNumbersBeforeStrings = compareStrings 186 | .prepend(_.isNumber, compareNumbers); 187 | ``` 188 | 189 | In the definition of `compareStrings`, the `.prepend()` and `.append()` calls together extend the input type from `string` to `string | null | undefined`. These type changes can confuse the TypeScript compiler; writing out the generic parameters explicitly (`` and ``) helps it along. 190 | 191 | 192 | ## Type annotations 193 | 194 | *juxta* uses advanced TypeScript features to model its API. This means that you may need to write more type annotations than usual when using the library. Here are some general tips for using TypeScript with *juxta*: 195 | 196 | * Enable `noImplicitAny`. This ensures that if TypeScript fails to infer a type, it will raise an error instead of defaulting to `any`. 197 | 198 | * If a method takes a callback, give explicit types to each of the callback's arguments. If a method takes generic parameters, fill out each parameter. The examples in this documentation tend to follow these rules, so you're okay if you copy from them. 199 | 200 | * If you use an IDE such as Visual Studio Code, you can inspect the inferred type of any expression by hovering over it. This can help debug confusing type errors. 201 | 202 | 203 | ## Case-insensitive string comparisons 204 | 205 | Unlike some other comparison libraries, *juxta* does not provide a simple way to compare strings case-insensitively. This is because string comparison is a subtle topic that many people get wrong. I do not want to add foot-guns by presenting things as less complex than they really are. 206 | 207 | *juxta* does provide `compare.locale()`, which wraps the built-in [`Intl.Collator`][Intl.Collator] object. For example, `compare.locale('en', { sensitivity: 'base' })` will compare case-insensitively according to English sorting rules. 208 | 209 | [Intl.Collator]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Collator 210 | -------------------------------------------------------------------------------- /index.test.ts: -------------------------------------------------------------------------------- 1 | import { expect } from 'chai'; 2 | import compare, { Comparator } from './index'; 3 | 4 | // tslint:disable:only-arrow-functions 5 | 6 | describe('creating comparators', function () { 7 | describe('simple comparisons', function () { 8 | it('can compare numbers', function () { 9 | const f = compare(); 10 | expect(f(10, 10)).to.equal(0); 11 | expect(f(20, 10)).to.equal(1); 12 | expect(f(10, 20)).to.equal(-1); 13 | }); 14 | 15 | it('can compare strings', function () { 16 | const f = compare(); 17 | expect(f('a', 'b')).to.equal(-1); 18 | expect(f('a', 'a')).to.equal(0); 19 | expect(f('b', 'a')).to.equal(1); 20 | }); 21 | 22 | it('uses valueOf for custom objects', function () { 23 | class ValueOf { 24 | constructor(private value: number) { } 25 | public valueOf(): number { 26 | return this.value; 27 | } 28 | } 29 | const f = compare(); 30 | expect(f(new ValueOf(5), new ValueOf(-10))).to.equal(1); 31 | }); 32 | }); 33 | 34 | describe('custom comparator', function () { 35 | it('calls a custom comparator if given', function () { 36 | interface Named { 37 | name: string; 38 | } 39 | function compareName(a: Named, b: Named): number { 40 | return a.name.localeCompare(b.name); 41 | } 42 | const f = compare(compareName); 43 | expect(f({ name: 'Alice' }, { name: 'Bob' })).to.equal(-1); 44 | }); 45 | }); 46 | }); 47 | 48 | describe('modifiers', function () { 49 | describe('#reverse', function () { 50 | it('works', function () { 51 | const f = compare().reverse(); 52 | expect(f(10, 20)).to.equal(1); 53 | expect(f(10, 10)).to.equal(0); 54 | expect(f(20, 10)).to.equal(-1); 55 | }); 56 | }); 57 | 58 | describe('#from', function () { 59 | it('works', function () { 60 | const f: Comparator = compare().from((x) => x.toString()); 61 | expect(f(16, 9)).to.equal(-1); 62 | }); 63 | }); 64 | 65 | describe('#append', function () { 66 | describe('with type predicates', function () { 67 | const f: Comparator = compare().append(isString); 68 | 69 | it('uses the underlying comparator when the predicate matches neither', function () { 70 | expect(f(1, 1)).to.equal(0); 71 | expect(f(16, 9)).to.equal(1); 72 | }); 73 | it('orders T before U', function () { 74 | expect(f(1, '1')).to.equal(-1); 75 | expect(f('1', 1)).to.equal(1); 76 | }); 77 | it('uses the auxiliary comparator when the predicate matches both', function () { 78 | expect(f('1', '1')).to.equal(0); 79 | expect(f('16', '9')).to.equal(-1); 80 | }); 81 | }); 82 | 83 | describe('with normal predicates', function () { 84 | const f = compare().append((x: string) => x.length === 1, compare().reverse()); 85 | 86 | it('uses the underlying comparator when the predicate matches neither', function () { 87 | expect(f('aa', 'aa')).to.equal(0); 88 | expect(f('aa', 'bb')).to.equal(-1); 89 | }); 90 | it('orders falsy before truthy', function () { 91 | expect(f('zzzzz', 'a')).to.equal(-1); 92 | expect(f('a', 'zzzzz')).to.equal(1); 93 | }); 94 | it('uses the auxiliary comparator when the predicate matches both', function () { 95 | expect(f('z', 'a')).to.equal(-1); 96 | }); 97 | }); 98 | }); 99 | 100 | describe('#prepend', function () { 101 | describe('with type predicates', function () { 102 | const f: Comparator = compare().prepend(isString); 103 | 104 | it('uses the underlying comparator when the predicate matches neither', function () { 105 | expect(f(1, 1)).to.equal(0); 106 | expect(f(16, 9)).to.equal(1); 107 | }); 108 | it('orders T after U', function () { 109 | expect(f(1, '1')).to.equal(1); 110 | expect(f('1', 1)).to.equal(-1); 111 | }); 112 | it('uses the auxiliary comparator when the predicate matches both', function () { 113 | expect(f('1', '1')).to.equal(0); 114 | expect(f('16', '9')).to.equal(-1); 115 | }); 116 | }); 117 | 118 | describe('with normal predicates', function () { 119 | const f = compare().prepend((x: string) => x.length === 1, compare().reverse()); 120 | 121 | it('uses the underlying comparator when the predicate matches neither', function () { 122 | expect(f('aa', 'aa')).to.equal(0); 123 | expect(f('aa', 'bb')).to.equal(-1); 124 | }); 125 | it('orders truthy before falsy', function () { 126 | expect(f('z', 'aaaaa')).to.equal(-1); 127 | expect(f('aaaaa', 'z')).to.equal(1); 128 | }); 129 | it('uses the auxiliary comparator when the predicate matches both', function () { 130 | expect(f('z', 'a')).to.equal(-1); 131 | }); 132 | }); 133 | }); 134 | 135 | describe('#then', function () { 136 | interface Person { 137 | name: string; 138 | age: number; 139 | } 140 | 141 | const anna = { name: 'Anna', age: 32 }; 142 | const khalid = { name: 'Khalid', age: 16 }; 143 | const yuukoTheElder = { name: 'Yuuko', age: 64 }; 144 | const yuukoTheYounger = { name: 'Yuuko', age: 8 }; 145 | 146 | const f = compare().from((x: Person) => x.name) 147 | .then(compare().from((x: Person) => x.age).reverse()); 148 | 149 | it('returns the first result if non-zero', function () { 150 | expect(f(anna, khalid)).to.equal(-1); 151 | expect(f(yuukoTheYounger, khalid)).to.equal(1); 152 | }); 153 | 154 | it('uses the second comparator if the first compares equal', function () { 155 | expect(f(yuukoTheElder, yuukoTheYounger)).to.equal(-1); 156 | expect(f(yuukoTheYounger, yuukoTheElder)).to.equal(1); 157 | }); 158 | 159 | it('returns zero if both comparators compare equal', function () { 160 | expect(f(khalid, khalid)).to.equal(0); 161 | }); 162 | 163 | it('uses the default comparator if none given', function () { 164 | const g = compare().from((s: string) => s[1]).then(); 165 | expect(g('za', 'yb')).to.equal(-1); 166 | expect(g('za', 'ya')).to.equal(1); 167 | }); 168 | }); 169 | }); 170 | 171 | describe('prefabs', function () { 172 | describe('#on', function () { 173 | it('accepts callbacks', function () { 174 | const f: Comparator = compare.on((s) => s.toLowerCase()); 175 | expect(f('ZZZ', 'aaa')).to.equal(1); 176 | }); 177 | }); 178 | 179 | describe('#locale', function () { 180 | it('works', function () { 181 | const f = compare.locale('en', { sensitivity: 'base' }); 182 | expect(f('AAA', 'aaa')).to.equal(0); 183 | expect(f('aaa', 'BBB')).to.equal(-1); 184 | }); 185 | 186 | it('exposes a collator property', function () { 187 | const f = compare.locale('en', { sensitivity: 'base' }); 188 | expect(f.collator).is.instanceOf(Intl.Collator); 189 | }); 190 | 191 | it('marks the collator property as read-only', function () { 192 | const f = compare.locale('en', { sensitivity: 'base' }); 193 | expect(() => (f as any).collator = 42).to.throw(TypeError); 194 | }); 195 | }); 196 | }); 197 | 198 | function isString(value: T | string): value is string { 199 | return typeof value === 'string'; 200 | } 201 | -------------------------------------------------------------------------------- /index.ts: -------------------------------------------------------------------------------- 1 | export interface Compare { 2 | (func?: BaseComparator): Comparator; 3 | on(transform: (a: T) => any): Comparator; 4 | locale(locales?: string | string[], options?: Intl.CollatorOptions): LocaleComparator; 5 | } 6 | 7 | export type BaseComparator = (a: T, b: T) => number; 8 | 9 | export interface Comparator extends BaseComparator { 10 | reverse(): Comparator; 11 | from(transform: (a: U) => T): Comparator; 12 | append(predicate: (a: T | U) => a is U, handler?: BaseComparator): Comparator; 13 | append(predicate: (a: T) => boolean, handler?: BaseComparator): Comparator; 14 | prepend(predicate: (a: U | T) => a is U, handler?: BaseComparator): Comparator; 15 | prepend(predicate: (a: T) => boolean, handler?: BaseComparator): Comparator; 16 | then(handler?: BaseComparator): Comparator; 17 | } 18 | 19 | export interface LocaleComparator extends Comparator { 20 | readonly collator: Intl.Collator; 21 | } 22 | 23 | function defaultComparator(a: T, b: T): number { 24 | if (a < b) { 25 | return -1; 26 | } 27 | if (a > b) { 28 | return 1; 29 | } 30 | return 0; 31 | } 32 | 33 | function reverse(this: BaseComparator): Comparator { 34 | return compare((a, b) => this(b, a)); 35 | } 36 | 37 | function from(this: BaseComparator, transform: (a: U) => T): Comparator { 38 | return compare((a, b) => this(transform(a), transform(b))); 39 | } 40 | 41 | function append( 42 | this: BaseComparator, 43 | predicate: (a: T | U) => a is U, 44 | handler: BaseComparator = defaultComparator, 45 | ): Comparator { 46 | return compare((a, b) => { 47 | if (predicate(a)) { 48 | if (predicate(b)) { 49 | return handler(a, b); 50 | } else { 51 | return 1; 52 | } 53 | } else { 54 | if (predicate(b)) { 55 | return -1; 56 | } else { 57 | return this(a, b); 58 | } 59 | } 60 | }); 61 | } 62 | 63 | function prepend( 64 | this: BaseComparator, 65 | predicate: (a: U | T) => a is U, 66 | handler: BaseComparator = defaultComparator, 67 | ): Comparator { 68 | return compare((a, b) => { 69 | if (predicate(a)) { 70 | if (predicate(b)) { 71 | return handler(a, b); 72 | } else { 73 | return -1; 74 | } 75 | } else { 76 | if (predicate(b)) { 77 | return 1; 78 | } else { 79 | return this(a, b); 80 | } 81 | } 82 | }); 83 | } 84 | 85 | function then( 86 | this: BaseComparator, 87 | handler: BaseComparator = defaultComparator, 88 | ): Comparator { 89 | return compare((a, b) => { 90 | return this(a, b) || handler(a, b); 91 | }); 92 | } 93 | 94 | const compare: Compare = ( (func: BaseComparator = defaultComparator): Comparator => { 95 | const result = func as any; 96 | result.reverse = reverse; 97 | result.from = from; 98 | result.append = append; 99 | result.prepend = prepend; 100 | result.then = then; 101 | return result; 102 | }) as Compare; 103 | 104 | compare.on = function on(transform: (a: T) => any): Comparator { 105 | return this().from(transform); 106 | }; 107 | 108 | compare.locale = function locale(locales?: string | string[], options?: Intl.CollatorOptions): LocaleComparator { 109 | const collator = new Intl.Collator(locales, options); 110 | const result = this(collator.compare) as LocaleComparator; 111 | Object.defineProperty(result, 'collator', { 112 | value: collator, 113 | writable: false, 114 | }); 115 | return result; 116 | }; 117 | 118 | export default compare; 119 | -------------------------------------------------------------------------------- /package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "juxta", 3 | "version": "2.0.3", 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.3.2", 18 | "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.2.tgz", 19 | "integrity": "sha512-f3QCuPppXxtZOEm5GWPra/uYUjmNQlu9pbAD8D/9jze4pTY83rTtB1igTBSwvkeNlC5gR24zFFkz+2WHLFQhqQ==", 20 | "dev": true, 21 | "requires": { 22 | "@babel/types": "^7.3.2", 23 | "jsesc": "^2.5.1", 24 | "lodash": "^4.17.10", 25 | "source-map": "^0.5.0", 26 | "trim-right": "^1.0.1" 27 | } 28 | }, 29 | "@babel/helper-function-name": { 30 | "version": "7.1.0", 31 | "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.1.0.tgz", 32 | "integrity": "sha512-A95XEoCpb3TO+KZzJ4S/5uW5fNe26DjBGqf1o9ucyLyCmi1dXq/B3c8iaWTfBk3VvetUxl16e8tIrd5teOCfGw==", 33 | "dev": true, 34 | "requires": { 35 | "@babel/helper-get-function-arity": "^7.0.0", 36 | "@babel/template": "^7.1.0", 37 | "@babel/types": "^7.0.0" 38 | } 39 | }, 40 | "@babel/helper-get-function-arity": { 41 | "version": "7.0.0", 42 | "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.0.0.tgz", 43 | "integrity": "sha512-r2DbJeg4svYvt3HOS74U4eWKsUAMRH01Z1ds1zx8KNTPtpTL5JAsdFv8BNyOpVqdFhHkkRDIg5B4AsxmkjAlmQ==", 44 | "dev": true, 45 | "requires": { 46 | "@babel/types": "^7.0.0" 47 | } 48 | }, 49 | "@babel/helper-split-export-declaration": { 50 | "version": "7.0.0", 51 | "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.0.0.tgz", 52 | "integrity": "sha512-MXkOJqva62dfC0w85mEf/LucPPS/1+04nmmRMPEBUB++hiiThQ2zPtX/mEWQ3mtzCEjIJvPY8nuwxXtQeQwUag==", 53 | "dev": true, 54 | "requires": { 55 | "@babel/types": "^7.0.0" 56 | } 57 | }, 58 | "@babel/highlight": { 59 | "version": "7.0.0", 60 | "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz", 61 | "integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==", 62 | "dev": true, 63 | "requires": { 64 | "chalk": "^2.0.0", 65 | "esutils": "^2.0.2", 66 | "js-tokens": "^4.0.0" 67 | } 68 | }, 69 | "@babel/parser": { 70 | "version": "7.3.2", 71 | "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.2.tgz", 72 | "integrity": "sha512-QzNUC2RO1gadg+fs21fi0Uu0OuGNzRKEmgCxoLNzbCdoprLwjfmZwzUrpUNfJPaVRwBpDY47A17yYEGWyRelnQ==", 73 | "dev": true 74 | }, 75 | "@babel/template": { 76 | "version": "7.2.2", 77 | "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz", 78 | "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==", 79 | "dev": true, 80 | "requires": { 81 | "@babel/code-frame": "^7.0.0", 82 | "@babel/parser": "^7.2.2", 83 | "@babel/types": "^7.2.2" 84 | } 85 | }, 86 | "@babel/traverse": { 87 | "version": "7.2.3", 88 | "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.2.3.tgz", 89 | "integrity": "sha512-Z31oUD/fJvEWVR0lNZtfgvVt512ForCTNKYcJBGbPb1QZfve4WGH8Wsy7+Mev33/45fhP/hwQtvgusNdcCMgSw==", 90 | "dev": true, 91 | "requires": { 92 | "@babel/code-frame": "^7.0.0", 93 | "@babel/generator": "^7.2.2", 94 | "@babel/helper-function-name": "^7.1.0", 95 | "@babel/helper-split-export-declaration": "^7.0.0", 96 | "@babel/parser": "^7.2.3", 97 | "@babel/types": "^7.2.2", 98 | "debug": "^4.1.0", 99 | "globals": "^11.1.0", 100 | "lodash": "^4.17.10" 101 | }, 102 | "dependencies": { 103 | "debug": { 104 | "version": "4.1.1", 105 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz", 106 | "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", 107 | "dev": true, 108 | "requires": { 109 | "ms": "^2.1.1" 110 | } 111 | }, 112 | "ms": { 113 | "version": "2.1.1", 114 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 115 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==", 116 | "dev": true 117 | } 118 | } 119 | }, 120 | "@babel/types": { 121 | "version": "7.3.2", 122 | "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.2.tgz", 123 | "integrity": "sha512-3Y6H8xlUlpbGR+XvawiH0UXehqydTmNmEpozWcXymqwcrwYAl5KMvKtQ+TF6f6E08V6Jur7v/ykdDSF+WDEIXQ==", 124 | "dev": true, 125 | "requires": { 126 | "esutils": "^2.0.2", 127 | "lodash": "^4.17.10", 128 | "to-fast-properties": "^2.0.0" 129 | } 130 | }, 131 | "@types/chai": { 132 | "version": "4.1.7", 133 | "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.1.7.tgz", 134 | "integrity": "sha512-2Y8uPt0/jwjhQ6EiluT0XCri1Dbplr0ZxfFXUz+ye13gaqE8u5gL5ppao1JrUYr9cIip5S6MvQzBS7Kke7U9VA==", 135 | "dev": true 136 | }, 137 | "@types/events": { 138 | "version": "3.0.0", 139 | "resolved": "https://registry.npmjs.org/@types/events/-/events-3.0.0.tgz", 140 | "integrity": "sha512-EaObqwIvayI5a8dCzhFrjKzVwKLxjoG9T6Ppd5CEo07LRKfQ8Yokw54r5+Wq7FaBQ+yXRvQAYPrHwya1/UFt9g==", 141 | "dev": true 142 | }, 143 | "@types/fs-extra": { 144 | "version": "5.0.4", 145 | "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-5.0.4.tgz", 146 | "integrity": "sha512-DsknoBvD8s+RFfSGjmERJ7ZOP1HI0UZRA3FSI+Zakhrc/Gy26YQsLI+m5V5DHxroHRJqCDLKJp7Hixn8zyaF7g==", 147 | "dev": true, 148 | "requires": { 149 | "@types/node": "*" 150 | } 151 | }, 152 | "@types/glob": { 153 | "version": "7.1.1", 154 | "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.1.1.tgz", 155 | "integrity": "sha512-1Bh06cbWJUHMC97acuD6UMG29nMt0Aqz1vF3guLfG+kHHJhy3AyohZFFxYk2f7Q1SQIrNwvncxAE0N/9s70F2w==", 156 | "dev": true, 157 | "requires": { 158 | "@types/events": "*", 159 | "@types/minimatch": "*", 160 | "@types/node": "*" 161 | } 162 | }, 163 | "@types/handlebars": { 164 | "version": "4.0.40", 165 | "resolved": "https://registry.npmjs.org/@types/handlebars/-/handlebars-4.0.40.tgz", 166 | "integrity": "sha512-sGWNtsjNrLOdKha2RV1UeF8+UbQnPSG7qbe5wwbni0mw4h2gHXyPFUMOC+xwGirIiiydM/HSqjDO4rk6NFB18w==", 167 | "dev": true 168 | }, 169 | "@types/highlight.js": { 170 | "version": "9.12.3", 171 | "resolved": "https://registry.npmjs.org/@types/highlight.js/-/highlight.js-9.12.3.tgz", 172 | "integrity": "sha512-pGF/zvYOACZ/gLGWdQH8zSwteQS1epp68yRcVLJMgUck/MjEn/FBYmPub9pXT8C1e4a8YZfHo1CKyV8q1vKUnQ==", 173 | "dev": true 174 | }, 175 | "@types/lodash": { 176 | "version": "4.14.120", 177 | "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.14.120.tgz", 178 | "integrity": "sha512-jQ21kQ120mo+IrDs1nFNVm/AsdFxIx2+vZ347DbogHJPd/JzKNMOqU6HCYin1W6v8l5R9XSO2/e9cxmn7HAnVw==", 179 | "dev": true 180 | }, 181 | "@types/marked": { 182 | "version": "0.4.2", 183 | "resolved": "https://registry.npmjs.org/@types/marked/-/marked-0.4.2.tgz", 184 | "integrity": "sha512-cDB930/7MbzaGF6U3IwSQp6XBru8xWajF5PV2YZZeV8DyiliTuld11afVztGI9+yJZ29il5E+NpGA6ooV/Cjkg==", 185 | "dev": true 186 | }, 187 | "@types/minimatch": { 188 | "version": "3.0.3", 189 | "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", 190 | "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", 191 | "dev": true 192 | }, 193 | "@types/mocha": { 194 | "version": "5.2.5", 195 | "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-5.2.5.tgz", 196 | "integrity": "sha512-lAVp+Kj54ui/vLUFxsJTMtWvZraZxum3w3Nwkble2dNuV5VnPA+Mi2oGX9XYJAaIvZi3tn3cbjS/qcJXRb6Bww==", 197 | "dev": true 198 | }, 199 | "@types/node": { 200 | "version": "10.12.23", 201 | "resolved": "https://registry.npmjs.org/@types/node/-/node-10.12.23.tgz", 202 | "integrity": "sha512-EKhb5NveQ3NlW5EV7B0VRtDKwUfVey8LuJRl9pp5iW0se87/ZqLjG0PMf2MCzPXAJYWZN5Ltg7pHIAf9/Dm1tQ==", 203 | "dev": true 204 | }, 205 | "@types/shelljs": { 206 | "version": "0.8.2", 207 | "resolved": "https://registry.npmjs.org/@types/shelljs/-/shelljs-0.8.2.tgz", 208 | "integrity": "sha512-vVp7BCQn0yUQgpiohrdxAhHdm/bTlXshB4HG3LEBq1PgvjKiyeYHohIPIv0QBt/jipb140iMS5Xy1iR6qKovKw==", 209 | "dev": true, 210 | "requires": { 211 | "@types/glob": "*", 212 | "@types/node": "*" 213 | } 214 | }, 215 | "ansi-regex": { 216 | "version": "2.1.1", 217 | "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", 218 | "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", 219 | "dev": true 220 | }, 221 | "ansi-styles": { 222 | "version": "3.2.1", 223 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", 224 | "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", 225 | "dev": true, 226 | "requires": { 227 | "color-convert": "^1.9.0" 228 | } 229 | }, 230 | "arg": { 231 | "version": "4.1.0", 232 | "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.0.tgz", 233 | "integrity": "sha512-ZWc51jO3qegGkVh8Hwpv636EkbesNV5ZNQPCtRa+0qytRYPEs9IYT9qITY9buezqUH5uqyzlWLcufrzU2rffdg==", 234 | "dev": true 235 | }, 236 | "argparse": { 237 | "version": "1.0.10", 238 | "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", 239 | "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", 240 | "dev": true, 241 | "requires": { 242 | "sprintf-js": "~1.0.2" 243 | } 244 | }, 245 | "assertion-error": { 246 | "version": "1.1.0", 247 | "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", 248 | "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", 249 | "dev": true 250 | }, 251 | "async": { 252 | "version": "2.6.1", 253 | "resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz", 254 | "integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==", 255 | "dev": true, 256 | "requires": { 257 | "lodash": "^4.17.10" 258 | } 259 | }, 260 | "babel-code-frame": { 261 | "version": "6.26.0", 262 | "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", 263 | "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", 264 | "dev": true, 265 | "requires": { 266 | "chalk": "^1.1.3", 267 | "esutils": "^2.0.2", 268 | "js-tokens": "^3.0.2" 269 | }, 270 | "dependencies": { 271 | "ansi-styles": { 272 | "version": "2.2.1", 273 | "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", 274 | "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=", 275 | "dev": true 276 | }, 277 | "chalk": { 278 | "version": "1.1.3", 279 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", 280 | "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", 281 | "dev": true, 282 | "requires": { 283 | "ansi-styles": "^2.2.1", 284 | "escape-string-regexp": "^1.0.2", 285 | "has-ansi": "^2.0.0", 286 | "strip-ansi": "^3.0.0", 287 | "supports-color": "^2.0.0" 288 | } 289 | }, 290 | "js-tokens": { 291 | "version": "3.0.2", 292 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", 293 | "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", 294 | "dev": true 295 | }, 296 | "supports-color": { 297 | "version": "2.0.0", 298 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", 299 | "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", 300 | "dev": true 301 | } 302 | } 303 | }, 304 | "balanced-match": { 305 | "version": "1.0.0", 306 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", 307 | "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", 308 | "dev": true 309 | }, 310 | "brace-expansion": { 311 | "version": "1.1.11", 312 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 313 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 314 | "dev": true, 315 | "requires": { 316 | "balanced-match": "^1.0.0", 317 | "concat-map": "0.0.1" 318 | } 319 | }, 320 | "browser-stdout": { 321 | "version": "1.3.1", 322 | "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", 323 | "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", 324 | "dev": true 325 | }, 326 | "buffer-from": { 327 | "version": "1.1.1", 328 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 329 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==", 330 | "dev": true 331 | }, 332 | "builtin-modules": { 333 | "version": "1.1.1", 334 | "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", 335 | "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", 336 | "dev": true 337 | }, 338 | "chai": { 339 | "version": "4.2.0", 340 | "resolved": "https://registry.npmjs.org/chai/-/chai-4.2.0.tgz", 341 | "integrity": "sha512-XQU3bhBukrOsQCuwZndwGcCVQHyZi53fQ6Ys1Fym7E4olpIqqZZhhoFJoaKVvV17lWQoXYwgWN2nF5crA8J2jw==", 342 | "dev": true, 343 | "requires": { 344 | "assertion-error": "^1.1.0", 345 | "check-error": "^1.0.2", 346 | "deep-eql": "^3.0.1", 347 | "get-func-name": "^2.0.0", 348 | "pathval": "^1.1.0", 349 | "type-detect": "^4.0.5" 350 | } 351 | }, 352 | "chalk": { 353 | "version": "2.4.2", 354 | "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", 355 | "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", 356 | "dev": true, 357 | "requires": { 358 | "ansi-styles": "^3.2.1", 359 | "escape-string-regexp": "^1.0.5", 360 | "supports-color": "^5.3.0" 361 | } 362 | }, 363 | "check-error": { 364 | "version": "1.0.2", 365 | "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", 366 | "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", 367 | "dev": true 368 | }, 369 | "color-convert": { 370 | "version": "1.9.3", 371 | "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", 372 | "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", 373 | "dev": true, 374 | "requires": { 375 | "color-name": "1.1.3" 376 | } 377 | }, 378 | "color-name": { 379 | "version": "1.1.3", 380 | "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", 381 | "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", 382 | "dev": true 383 | }, 384 | "commander": { 385 | "version": "2.15.1", 386 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", 387 | "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", 388 | "dev": true 389 | }, 390 | "concat-map": { 391 | "version": "0.0.1", 392 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 393 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", 394 | "dev": true 395 | }, 396 | "debug": { 397 | "version": "3.1.0", 398 | "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", 399 | "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", 400 | "dev": true, 401 | "requires": { 402 | "ms": "2.0.0" 403 | } 404 | }, 405 | "deep-eql": { 406 | "version": "3.0.1", 407 | "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-3.0.1.tgz", 408 | "integrity": "sha512-+QeIQyN5ZuO+3Uk5DYh6/1eKO0m0YmJFGNmFHGACpf1ClL1nmlV/p4gNgbl2pJGxgXb4faqo6UE+M5ACEMyVcw==", 409 | "dev": true, 410 | "requires": { 411 | "type-detect": "^4.0.0" 412 | } 413 | }, 414 | "diff": { 415 | "version": "3.5.0", 416 | "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", 417 | "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", 418 | "dev": true 419 | }, 420 | "escape-string-regexp": { 421 | "version": "1.0.5", 422 | "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", 423 | "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", 424 | "dev": true 425 | }, 426 | "esprima": { 427 | "version": "4.0.1", 428 | "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", 429 | "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", 430 | "dev": true 431 | }, 432 | "esutils": { 433 | "version": "2.0.2", 434 | "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", 435 | "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", 436 | "dev": true 437 | }, 438 | "fs-extra": { 439 | "version": "7.0.1", 440 | "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-7.0.1.tgz", 441 | "integrity": "sha512-YJDaCJZEnBmcbw13fvdAM9AwNOJwOzrE4pqMqBq5nFiEqXUqHwlK4B+3pUw6JNvfSPtX05xFHtYy/1ni01eGCw==", 442 | "dev": true, 443 | "requires": { 444 | "graceful-fs": "^4.1.2", 445 | "jsonfile": "^4.0.0", 446 | "universalify": "^0.1.0" 447 | } 448 | }, 449 | "fs.realpath": { 450 | "version": "1.0.0", 451 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 452 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", 453 | "dev": true 454 | }, 455 | "get-func-name": { 456 | "version": "2.0.0", 457 | "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", 458 | "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", 459 | "dev": true 460 | }, 461 | "glob": { 462 | "version": "7.1.2", 463 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", 464 | "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", 465 | "dev": true, 466 | "requires": { 467 | "fs.realpath": "^1.0.0", 468 | "inflight": "^1.0.4", 469 | "inherits": "2", 470 | "minimatch": "^3.0.4", 471 | "once": "^1.3.0", 472 | "path-is-absolute": "^1.0.0" 473 | } 474 | }, 475 | "globals": { 476 | "version": "11.10.0", 477 | "resolved": "https://registry.npmjs.org/globals/-/globals-11.10.0.tgz", 478 | "integrity": "sha512-0GZF1RiPKU97IHUO5TORo9w1PwrH/NBPl+fS7oMLdaTRiYmYbwK4NWoZWrAdd0/abG9R2BU+OiwyQpTpE6pdfQ==", 479 | "dev": true 480 | }, 481 | "graceful-fs": { 482 | "version": "4.1.15", 483 | "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.15.tgz", 484 | "integrity": "sha512-6uHUhOPEBgQ24HM+r6b/QwWfZq+yiFcipKFrOFiBEnWdy5sdzYoi+pJeQaPI5qOLRFqWmAXUPQNsielzdLoecA==", 485 | "dev": true 486 | }, 487 | "growl": { 488 | "version": "1.10.5", 489 | "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", 490 | "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", 491 | "dev": true 492 | }, 493 | "handlebars": { 494 | "version": "4.1.0", 495 | "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.1.0.tgz", 496 | "integrity": "sha512-l2jRuU1NAWK6AW5qqcTATWQJvNPEwkM7NEKSiv/gqOsoSQbVoWyqVEY5GS+XPQ88zLNmqASRpzfdm8d79hJS+w==", 497 | "dev": true, 498 | "requires": { 499 | "async": "^2.5.0", 500 | "optimist": "^0.6.1", 501 | "source-map": "^0.6.1", 502 | "uglify-js": "^3.1.4" 503 | }, 504 | "dependencies": { 505 | "source-map": { 506 | "version": "0.6.1", 507 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 508 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 509 | "dev": true 510 | } 511 | } 512 | }, 513 | "has-ansi": { 514 | "version": "2.0.0", 515 | "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", 516 | "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", 517 | "dev": true, 518 | "requires": { 519 | "ansi-regex": "^2.0.0" 520 | } 521 | }, 522 | "has-flag": { 523 | "version": "3.0.0", 524 | "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", 525 | "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", 526 | "dev": true 527 | }, 528 | "he": { 529 | "version": "1.1.1", 530 | "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", 531 | "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", 532 | "dev": true 533 | }, 534 | "highlight.js": { 535 | "version": "9.14.2", 536 | "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.14.2.tgz", 537 | "integrity": "sha512-Nc6YNECYpxyJABGYJAyw7dBAYbXEuIzwzkqoJnwbc1nIpCiN+3ioYf0XrBnLiyyG0JLuJhpPtt2iTSbXiKLoyA==", 538 | "dev": true 539 | }, 540 | "inflight": { 541 | "version": "1.0.6", 542 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 543 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 544 | "dev": true, 545 | "requires": { 546 | "once": "^1.3.0", 547 | "wrappy": "1" 548 | } 549 | }, 550 | "inherits": { 551 | "version": "2.0.3", 552 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 553 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", 554 | "dev": true 555 | }, 556 | "interpret": { 557 | "version": "1.2.0", 558 | "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.2.0.tgz", 559 | "integrity": "sha512-mT34yGKMNceBQUoVn7iCDKDntA7SC6gycMAWzGx1z/CMCTV7b2AAtXlo3nRyHZ1FelRkQbQjprHSYGwzLtkVbw==", 560 | "dev": true 561 | }, 562 | "istanbul-lib-coverage": { 563 | "version": "2.0.3", 564 | "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.3.tgz", 565 | "integrity": "sha512-dKWuzRGCs4G+67VfW9pBFFz2Jpi4vSp/k7zBcJ888ofV5Mi1g5CUML5GvMvV6u9Cjybftu+E8Cgp+k0dI1E5lw==", 566 | "dev": true 567 | }, 568 | "istanbul-lib-instrument": { 569 | "version": "3.1.0", 570 | "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-3.1.0.tgz", 571 | "integrity": "sha512-ooVllVGT38HIk8MxDj/OIHXSYvH+1tq/Vb38s8ixt9GoJadXska4WkGY+0wkmtYCZNYtaARniH/DixUGGLZ0uA==", 572 | "dev": true, 573 | "requires": { 574 | "@babel/generator": "^7.0.0", 575 | "@babel/parser": "^7.0.0", 576 | "@babel/template": "^7.0.0", 577 | "@babel/traverse": "^7.0.0", 578 | "@babel/types": "^7.0.0", 579 | "istanbul-lib-coverage": "^2.0.3", 580 | "semver": "^5.5.0" 581 | } 582 | }, 583 | "js-tokens": { 584 | "version": "4.0.0", 585 | "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", 586 | "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", 587 | "dev": true 588 | }, 589 | "js-yaml": { 590 | "version": "3.12.1", 591 | "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.1.tgz", 592 | "integrity": "sha512-um46hB9wNOKlwkHgiuyEVAybXBjwFUV0Z/RaHJblRd9DXltue9FTYvzCr9ErQrK9Adz5MU4gHWVaNUfdmrC8qA==", 593 | "dev": true, 594 | "requires": { 595 | "argparse": "^1.0.7", 596 | "esprima": "^4.0.0" 597 | } 598 | }, 599 | "jsesc": { 600 | "version": "2.5.2", 601 | "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", 602 | "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", 603 | "dev": true 604 | }, 605 | "jsonfile": { 606 | "version": "4.0.0", 607 | "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-4.0.0.tgz", 608 | "integrity": "sha1-h3Gq4HmbZAdrdmQPygWPnBDjPss=", 609 | "dev": true, 610 | "requires": { 611 | "graceful-fs": "^4.1.6" 612 | } 613 | }, 614 | "lodash": { 615 | "version": "4.17.11", 616 | "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz", 617 | "integrity": "sha512-cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==", 618 | "dev": true 619 | }, 620 | "make-error": { 621 | "version": "1.3.5", 622 | "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", 623 | "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", 624 | "dev": true 625 | }, 626 | "marked": { 627 | "version": "0.4.0", 628 | "resolved": "https://registry.npmjs.org/marked/-/marked-0.4.0.tgz", 629 | "integrity": "sha512-tMsdNBgOsrUophCAFQl0XPe6Zqk/uy9gnue+jIIKhykO51hxyu6uNx7zBPy0+y/WKYVZZMspV9YeXLNdKk+iYw==", 630 | "dev": true 631 | }, 632 | "minimatch": { 633 | "version": "3.0.4", 634 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 635 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 636 | "dev": true, 637 | "requires": { 638 | "brace-expansion": "^1.1.7" 639 | } 640 | }, 641 | "minimist": { 642 | "version": "0.0.8", 643 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", 644 | "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", 645 | "dev": true 646 | }, 647 | "mkdirp": { 648 | "version": "0.5.1", 649 | "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", 650 | "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", 651 | "dev": true, 652 | "requires": { 653 | "minimist": "0.0.8" 654 | } 655 | }, 656 | "mocha": { 657 | "version": "5.2.0", 658 | "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", 659 | "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", 660 | "dev": true, 661 | "requires": { 662 | "browser-stdout": "1.3.1", 663 | "commander": "2.15.1", 664 | "debug": "3.1.0", 665 | "diff": "3.5.0", 666 | "escape-string-regexp": "1.0.5", 667 | "glob": "7.1.2", 668 | "growl": "1.10.5", 669 | "he": "1.1.1", 670 | "minimatch": "3.0.4", 671 | "mkdirp": "0.5.1", 672 | "supports-color": "5.4.0" 673 | } 674 | }, 675 | "ms": { 676 | "version": "2.0.0", 677 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 678 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", 679 | "dev": true 680 | }, 681 | "nyc": { 682 | "version": "13.2.0", 683 | "resolved": "https://registry.npmjs.org/nyc/-/nyc-13.2.0.tgz", 684 | "integrity": "sha512-gQBlOqvfpYt9b2PZ7qElrHWt8x4y8ApNfbMBoDPdl3sY4/4RJwCxDGTSqhA9RnaguZjS5nW7taW8oToe86JLgQ==", 685 | "dev": true, 686 | "requires": { 687 | "archy": "^1.0.0", 688 | "arrify": "^1.0.1", 689 | "caching-transform": "^3.0.1", 690 | "convert-source-map": "^1.6.0", 691 | "find-cache-dir": "^2.0.0", 692 | "find-up": "^3.0.0", 693 | "foreground-child": "^1.5.6", 694 | "glob": "^7.1.3", 695 | "istanbul-lib-coverage": "^2.0.3", 696 | "istanbul-lib-hook": "^2.0.3", 697 | "istanbul-lib-instrument": "^3.0.1", 698 | "istanbul-lib-report": "^2.0.4", 699 | "istanbul-lib-source-maps": "^3.0.2", 700 | "istanbul-reports": "^2.1.0", 701 | "make-dir": "^1.3.0", 702 | "merge-source-map": "^1.1.0", 703 | "resolve-from": "^4.0.0", 704 | "rimraf": "^2.6.3", 705 | "signal-exit": "^3.0.2", 706 | "spawn-wrap": "^1.4.2", 707 | "test-exclude": "^5.1.0", 708 | "uuid": "^3.3.2", 709 | "yargs": "^12.0.5", 710 | "yargs-parser": "^11.1.1" 711 | }, 712 | "dependencies": { 713 | "ansi-regex": { 714 | "version": "3.0.0", 715 | "bundled": true, 716 | "dev": true 717 | }, 718 | "append-transform": { 719 | "version": "1.0.0", 720 | "bundled": true, 721 | "dev": true, 722 | "requires": { 723 | "default-require-extensions": "^2.0.0" 724 | } 725 | }, 726 | "archy": { 727 | "version": "1.0.0", 728 | "bundled": true, 729 | "dev": true 730 | }, 731 | "arrify": { 732 | "version": "1.0.1", 733 | "bundled": true, 734 | "dev": true 735 | }, 736 | "async": { 737 | "version": "2.6.1", 738 | "bundled": true, 739 | "dev": true, 740 | "requires": { 741 | "lodash": "^4.17.10" 742 | } 743 | }, 744 | "balanced-match": { 745 | "version": "1.0.0", 746 | "bundled": true, 747 | "dev": true 748 | }, 749 | "brace-expansion": { 750 | "version": "1.1.11", 751 | "bundled": true, 752 | "dev": true, 753 | "requires": { 754 | "balanced-match": "^1.0.0", 755 | "concat-map": "0.0.1" 756 | } 757 | }, 758 | "builtin-modules": { 759 | "version": "1.1.1", 760 | "bundled": true, 761 | "dev": true 762 | }, 763 | "caching-transform": { 764 | "version": "3.0.1", 765 | "bundled": true, 766 | "dev": true, 767 | "requires": { 768 | "hasha": "^3.0.0", 769 | "make-dir": "^1.3.0", 770 | "package-hash": "^3.0.0", 771 | "write-file-atomic": "^2.3.0" 772 | } 773 | }, 774 | "camelcase": { 775 | "version": "5.0.0", 776 | "bundled": true, 777 | "dev": true 778 | }, 779 | "cliui": { 780 | "version": "4.1.0", 781 | "bundled": true, 782 | "dev": true, 783 | "requires": { 784 | "string-width": "^2.1.1", 785 | "strip-ansi": "^4.0.0", 786 | "wrap-ansi": "^2.0.0" 787 | } 788 | }, 789 | "code-point-at": { 790 | "version": "1.1.0", 791 | "bundled": true, 792 | "dev": true 793 | }, 794 | "commander": { 795 | "version": "2.17.1", 796 | "bundled": true, 797 | "dev": true, 798 | "optional": true 799 | }, 800 | "commondir": { 801 | "version": "1.0.1", 802 | "bundled": true, 803 | "dev": true 804 | }, 805 | "concat-map": { 806 | "version": "0.0.1", 807 | "bundled": true, 808 | "dev": true 809 | }, 810 | "convert-source-map": { 811 | "version": "1.6.0", 812 | "bundled": true, 813 | "dev": true, 814 | "requires": { 815 | "safe-buffer": "~5.1.1" 816 | } 817 | }, 818 | "cross-spawn": { 819 | "version": "4.0.2", 820 | "bundled": true, 821 | "dev": true, 822 | "requires": { 823 | "lru-cache": "^4.0.1", 824 | "which": "^1.2.9" 825 | } 826 | }, 827 | "debug": { 828 | "version": "4.1.1", 829 | "bundled": true, 830 | "dev": true, 831 | "requires": { 832 | "ms": "^2.1.1" 833 | } 834 | }, 835 | "decamelize": { 836 | "version": "1.2.0", 837 | "bundled": true, 838 | "dev": true 839 | }, 840 | "default-require-extensions": { 841 | "version": "2.0.0", 842 | "bundled": true, 843 | "dev": true, 844 | "requires": { 845 | "strip-bom": "^3.0.0" 846 | } 847 | }, 848 | "end-of-stream": { 849 | "version": "1.4.1", 850 | "bundled": true, 851 | "dev": true, 852 | "requires": { 853 | "once": "^1.4.0" 854 | } 855 | }, 856 | "error-ex": { 857 | "version": "1.3.2", 858 | "bundled": true, 859 | "dev": true, 860 | "requires": { 861 | "is-arrayish": "^0.2.1" 862 | } 863 | }, 864 | "es6-error": { 865 | "version": "4.1.1", 866 | "bundled": true, 867 | "dev": true 868 | }, 869 | "execa": { 870 | "version": "1.0.0", 871 | "bundled": true, 872 | "dev": true, 873 | "requires": { 874 | "cross-spawn": "^6.0.0", 875 | "get-stream": "^4.0.0", 876 | "is-stream": "^1.1.0", 877 | "npm-run-path": "^2.0.0", 878 | "p-finally": "^1.0.0", 879 | "signal-exit": "^3.0.0", 880 | "strip-eof": "^1.0.0" 881 | }, 882 | "dependencies": { 883 | "cross-spawn": { 884 | "version": "6.0.5", 885 | "bundled": true, 886 | "dev": true, 887 | "requires": { 888 | "nice-try": "^1.0.4", 889 | "path-key": "^2.0.1", 890 | "semver": "^5.5.0", 891 | "shebang-command": "^1.2.0", 892 | "which": "^1.2.9" 893 | } 894 | } 895 | } 896 | }, 897 | "find-cache-dir": { 898 | "version": "2.0.0", 899 | "bundled": true, 900 | "dev": true, 901 | "requires": { 902 | "commondir": "^1.0.1", 903 | "make-dir": "^1.0.0", 904 | "pkg-dir": "^3.0.0" 905 | } 906 | }, 907 | "find-up": { 908 | "version": "3.0.0", 909 | "bundled": true, 910 | "dev": true, 911 | "requires": { 912 | "locate-path": "^3.0.0" 913 | } 914 | }, 915 | "foreground-child": { 916 | "version": "1.5.6", 917 | "bundled": true, 918 | "dev": true, 919 | "requires": { 920 | "cross-spawn": "^4", 921 | "signal-exit": "^3.0.0" 922 | } 923 | }, 924 | "fs.realpath": { 925 | "version": "1.0.0", 926 | "bundled": true, 927 | "dev": true 928 | }, 929 | "get-caller-file": { 930 | "version": "1.0.3", 931 | "bundled": true, 932 | "dev": true 933 | }, 934 | "get-stream": { 935 | "version": "4.1.0", 936 | "bundled": true, 937 | "dev": true, 938 | "requires": { 939 | "pump": "^3.0.0" 940 | } 941 | }, 942 | "glob": { 943 | "version": "7.1.3", 944 | "bundled": true, 945 | "dev": true, 946 | "requires": { 947 | "fs.realpath": "^1.0.0", 948 | "inflight": "^1.0.4", 949 | "inherits": "2", 950 | "minimatch": "^3.0.4", 951 | "once": "^1.3.0", 952 | "path-is-absolute": "^1.0.0" 953 | } 954 | }, 955 | "graceful-fs": { 956 | "version": "4.1.15", 957 | "bundled": true, 958 | "dev": true 959 | }, 960 | "handlebars": { 961 | "version": "4.0.12", 962 | "bundled": true, 963 | "dev": true, 964 | "requires": { 965 | "async": "^2.5.0", 966 | "optimist": "^0.6.1", 967 | "source-map": "^0.6.1", 968 | "uglify-js": "^3.1.4" 969 | }, 970 | "dependencies": { 971 | "source-map": { 972 | "version": "0.6.1", 973 | "bundled": true, 974 | "dev": true 975 | } 976 | } 977 | }, 978 | "has-flag": { 979 | "version": "3.0.0", 980 | "bundled": true, 981 | "dev": true 982 | }, 983 | "hasha": { 984 | "version": "3.0.0", 985 | "bundled": true, 986 | "dev": true, 987 | "requires": { 988 | "is-stream": "^1.0.1" 989 | } 990 | }, 991 | "hosted-git-info": { 992 | "version": "2.7.1", 993 | "bundled": true, 994 | "dev": true 995 | }, 996 | "imurmurhash": { 997 | "version": "0.1.4", 998 | "bundled": true, 999 | "dev": true 1000 | }, 1001 | "inflight": { 1002 | "version": "1.0.6", 1003 | "bundled": true, 1004 | "dev": true, 1005 | "requires": { 1006 | "once": "^1.3.0", 1007 | "wrappy": "1" 1008 | } 1009 | }, 1010 | "inherits": { 1011 | "version": "2.0.3", 1012 | "bundled": true, 1013 | "dev": true 1014 | }, 1015 | "invert-kv": { 1016 | "version": "2.0.0", 1017 | "bundled": true, 1018 | "dev": true 1019 | }, 1020 | "is-arrayish": { 1021 | "version": "0.2.1", 1022 | "bundled": true, 1023 | "dev": true 1024 | }, 1025 | "is-builtin-module": { 1026 | "version": "1.0.0", 1027 | "bundled": true, 1028 | "dev": true, 1029 | "requires": { 1030 | "builtin-modules": "^1.0.0" 1031 | } 1032 | }, 1033 | "is-fullwidth-code-point": { 1034 | "version": "2.0.0", 1035 | "bundled": true, 1036 | "dev": true 1037 | }, 1038 | "is-stream": { 1039 | "version": "1.1.0", 1040 | "bundled": true, 1041 | "dev": true 1042 | }, 1043 | "isexe": { 1044 | "version": "2.0.0", 1045 | "bundled": true, 1046 | "dev": true 1047 | }, 1048 | "istanbul-lib-coverage": { 1049 | "version": "2.0.3", 1050 | "bundled": true, 1051 | "dev": true 1052 | }, 1053 | "istanbul-lib-hook": { 1054 | "version": "2.0.3", 1055 | "bundled": true, 1056 | "dev": true, 1057 | "requires": { 1058 | "append-transform": "^1.0.0" 1059 | } 1060 | }, 1061 | "istanbul-lib-report": { 1062 | "version": "2.0.4", 1063 | "bundled": true, 1064 | "dev": true, 1065 | "requires": { 1066 | "istanbul-lib-coverage": "^2.0.3", 1067 | "make-dir": "^1.3.0", 1068 | "supports-color": "^6.0.0" 1069 | }, 1070 | "dependencies": { 1071 | "supports-color": { 1072 | "version": "6.1.0", 1073 | "bundled": true, 1074 | "dev": true, 1075 | "requires": { 1076 | "has-flag": "^3.0.0" 1077 | } 1078 | } 1079 | } 1080 | }, 1081 | "istanbul-lib-source-maps": { 1082 | "version": "3.0.2", 1083 | "bundled": true, 1084 | "dev": true, 1085 | "requires": { 1086 | "debug": "^4.1.1", 1087 | "istanbul-lib-coverage": "^2.0.3", 1088 | "make-dir": "^1.3.0", 1089 | "rimraf": "^2.6.2", 1090 | "source-map": "^0.6.1" 1091 | }, 1092 | "dependencies": { 1093 | "source-map": { 1094 | "version": "0.6.1", 1095 | "bundled": true, 1096 | "dev": true 1097 | } 1098 | } 1099 | }, 1100 | "istanbul-reports": { 1101 | "version": "2.1.0", 1102 | "bundled": true, 1103 | "dev": true, 1104 | "requires": { 1105 | "handlebars": "^4.0.11" 1106 | } 1107 | }, 1108 | "json-parse-better-errors": { 1109 | "version": "1.0.2", 1110 | "bundled": true, 1111 | "dev": true 1112 | }, 1113 | "lcid": { 1114 | "version": "2.0.0", 1115 | "bundled": true, 1116 | "dev": true, 1117 | "requires": { 1118 | "invert-kv": "^2.0.0" 1119 | } 1120 | }, 1121 | "load-json-file": { 1122 | "version": "4.0.0", 1123 | "bundled": true, 1124 | "dev": true, 1125 | "requires": { 1126 | "graceful-fs": "^4.1.2", 1127 | "parse-json": "^4.0.0", 1128 | "pify": "^3.0.0", 1129 | "strip-bom": "^3.0.0" 1130 | } 1131 | }, 1132 | "locate-path": { 1133 | "version": "3.0.0", 1134 | "bundled": true, 1135 | "dev": true, 1136 | "requires": { 1137 | "p-locate": "^3.0.0", 1138 | "path-exists": "^3.0.0" 1139 | } 1140 | }, 1141 | "lodash": { 1142 | "version": "4.17.11", 1143 | "bundled": true, 1144 | "dev": true 1145 | }, 1146 | "lodash.flattendeep": { 1147 | "version": "4.4.0", 1148 | "bundled": true, 1149 | "dev": true 1150 | }, 1151 | "lru-cache": { 1152 | "version": "4.1.5", 1153 | "bundled": true, 1154 | "dev": true, 1155 | "requires": { 1156 | "pseudomap": "^1.0.2", 1157 | "yallist": "^2.1.2" 1158 | } 1159 | }, 1160 | "make-dir": { 1161 | "version": "1.3.0", 1162 | "bundled": true, 1163 | "dev": true, 1164 | "requires": { 1165 | "pify": "^3.0.0" 1166 | } 1167 | }, 1168 | "map-age-cleaner": { 1169 | "version": "0.1.3", 1170 | "bundled": true, 1171 | "dev": true, 1172 | "requires": { 1173 | "p-defer": "^1.0.0" 1174 | } 1175 | }, 1176 | "mem": { 1177 | "version": "4.0.0", 1178 | "bundled": true, 1179 | "dev": true, 1180 | "requires": { 1181 | "map-age-cleaner": "^0.1.1", 1182 | "mimic-fn": "^1.0.0", 1183 | "p-is-promise": "^1.1.0" 1184 | } 1185 | }, 1186 | "merge-source-map": { 1187 | "version": "1.1.0", 1188 | "bundled": true, 1189 | "dev": true, 1190 | "requires": { 1191 | "source-map": "^0.6.1" 1192 | }, 1193 | "dependencies": { 1194 | "source-map": { 1195 | "version": "0.6.1", 1196 | "bundled": true, 1197 | "dev": true 1198 | } 1199 | } 1200 | }, 1201 | "mimic-fn": { 1202 | "version": "1.2.0", 1203 | "bundled": true, 1204 | "dev": true 1205 | }, 1206 | "minimatch": { 1207 | "version": "3.0.4", 1208 | "bundled": true, 1209 | "dev": true, 1210 | "requires": { 1211 | "brace-expansion": "^1.1.7" 1212 | } 1213 | }, 1214 | "minimist": { 1215 | "version": "0.0.10", 1216 | "bundled": true, 1217 | "dev": true 1218 | }, 1219 | "mkdirp": { 1220 | "version": "0.5.1", 1221 | "bundled": true, 1222 | "dev": true, 1223 | "requires": { 1224 | "minimist": "0.0.8" 1225 | }, 1226 | "dependencies": { 1227 | "minimist": { 1228 | "version": "0.0.8", 1229 | "bundled": true, 1230 | "dev": true 1231 | } 1232 | } 1233 | }, 1234 | "ms": { 1235 | "version": "2.1.1", 1236 | "bundled": true, 1237 | "dev": true 1238 | }, 1239 | "nice-try": { 1240 | "version": "1.0.5", 1241 | "bundled": true, 1242 | "dev": true 1243 | }, 1244 | "normalize-package-data": { 1245 | "version": "2.4.0", 1246 | "bundled": true, 1247 | "dev": true, 1248 | "requires": { 1249 | "hosted-git-info": "^2.1.4", 1250 | "is-builtin-module": "^1.0.0", 1251 | "semver": "2 || 3 || 4 || 5", 1252 | "validate-npm-package-license": "^3.0.1" 1253 | } 1254 | }, 1255 | "npm-run-path": { 1256 | "version": "2.0.2", 1257 | "bundled": true, 1258 | "dev": true, 1259 | "requires": { 1260 | "path-key": "^2.0.0" 1261 | } 1262 | }, 1263 | "number-is-nan": { 1264 | "version": "1.0.1", 1265 | "bundled": true, 1266 | "dev": true 1267 | }, 1268 | "once": { 1269 | "version": "1.4.0", 1270 | "bundled": true, 1271 | "dev": true, 1272 | "requires": { 1273 | "wrappy": "1" 1274 | } 1275 | }, 1276 | "optimist": { 1277 | "version": "0.6.1", 1278 | "bundled": true, 1279 | "dev": true, 1280 | "requires": { 1281 | "minimist": "~0.0.1", 1282 | "wordwrap": "~0.0.2" 1283 | } 1284 | }, 1285 | "os-homedir": { 1286 | "version": "1.0.2", 1287 | "bundled": true, 1288 | "dev": true 1289 | }, 1290 | "os-locale": { 1291 | "version": "3.1.0", 1292 | "bundled": true, 1293 | "dev": true, 1294 | "requires": { 1295 | "execa": "^1.0.0", 1296 | "lcid": "^2.0.0", 1297 | "mem": "^4.0.0" 1298 | } 1299 | }, 1300 | "p-defer": { 1301 | "version": "1.0.0", 1302 | "bundled": true, 1303 | "dev": true 1304 | }, 1305 | "p-finally": { 1306 | "version": "1.0.0", 1307 | "bundled": true, 1308 | "dev": true 1309 | }, 1310 | "p-is-promise": { 1311 | "version": "1.1.0", 1312 | "bundled": true, 1313 | "dev": true 1314 | }, 1315 | "p-limit": { 1316 | "version": "2.1.0", 1317 | "bundled": true, 1318 | "dev": true, 1319 | "requires": { 1320 | "p-try": "^2.0.0" 1321 | } 1322 | }, 1323 | "p-locate": { 1324 | "version": "3.0.0", 1325 | "bundled": true, 1326 | "dev": true, 1327 | "requires": { 1328 | "p-limit": "^2.0.0" 1329 | } 1330 | }, 1331 | "p-try": { 1332 | "version": "2.0.0", 1333 | "bundled": true, 1334 | "dev": true 1335 | }, 1336 | "package-hash": { 1337 | "version": "3.0.0", 1338 | "bundled": true, 1339 | "dev": true, 1340 | "requires": { 1341 | "graceful-fs": "^4.1.15", 1342 | "hasha": "^3.0.0", 1343 | "lodash.flattendeep": "^4.4.0", 1344 | "release-zalgo": "^1.0.0" 1345 | } 1346 | }, 1347 | "parse-json": { 1348 | "version": "4.0.0", 1349 | "bundled": true, 1350 | "dev": true, 1351 | "requires": { 1352 | "error-ex": "^1.3.1", 1353 | "json-parse-better-errors": "^1.0.1" 1354 | } 1355 | }, 1356 | "path-exists": { 1357 | "version": "3.0.0", 1358 | "bundled": true, 1359 | "dev": true 1360 | }, 1361 | "path-is-absolute": { 1362 | "version": "1.0.1", 1363 | "bundled": true, 1364 | "dev": true 1365 | }, 1366 | "path-key": { 1367 | "version": "2.0.1", 1368 | "bundled": true, 1369 | "dev": true 1370 | }, 1371 | "path-type": { 1372 | "version": "3.0.0", 1373 | "bundled": true, 1374 | "dev": true, 1375 | "requires": { 1376 | "pify": "^3.0.0" 1377 | } 1378 | }, 1379 | "pify": { 1380 | "version": "3.0.0", 1381 | "bundled": true, 1382 | "dev": true 1383 | }, 1384 | "pkg-dir": { 1385 | "version": "3.0.0", 1386 | "bundled": true, 1387 | "dev": true, 1388 | "requires": { 1389 | "find-up": "^3.0.0" 1390 | } 1391 | }, 1392 | "pseudomap": { 1393 | "version": "1.0.2", 1394 | "bundled": true, 1395 | "dev": true 1396 | }, 1397 | "pump": { 1398 | "version": "3.0.0", 1399 | "bundled": true, 1400 | "dev": true, 1401 | "requires": { 1402 | "end-of-stream": "^1.1.0", 1403 | "once": "^1.3.1" 1404 | } 1405 | }, 1406 | "read-pkg": { 1407 | "version": "3.0.0", 1408 | "bundled": true, 1409 | "dev": true, 1410 | "requires": { 1411 | "load-json-file": "^4.0.0", 1412 | "normalize-package-data": "^2.3.2", 1413 | "path-type": "^3.0.0" 1414 | } 1415 | }, 1416 | "read-pkg-up": { 1417 | "version": "4.0.0", 1418 | "bundled": true, 1419 | "dev": true, 1420 | "requires": { 1421 | "find-up": "^3.0.0", 1422 | "read-pkg": "^3.0.0" 1423 | } 1424 | }, 1425 | "release-zalgo": { 1426 | "version": "1.0.0", 1427 | "bundled": true, 1428 | "dev": true, 1429 | "requires": { 1430 | "es6-error": "^4.0.1" 1431 | } 1432 | }, 1433 | "require-directory": { 1434 | "version": "2.1.1", 1435 | "bundled": true, 1436 | "dev": true 1437 | }, 1438 | "require-main-filename": { 1439 | "version": "1.0.1", 1440 | "bundled": true, 1441 | "dev": true 1442 | }, 1443 | "resolve-from": { 1444 | "version": "4.0.0", 1445 | "bundled": true, 1446 | "dev": true 1447 | }, 1448 | "rimraf": { 1449 | "version": "2.6.3", 1450 | "bundled": true, 1451 | "dev": true, 1452 | "requires": { 1453 | "glob": "^7.1.3" 1454 | } 1455 | }, 1456 | "safe-buffer": { 1457 | "version": "5.1.2", 1458 | "bundled": true, 1459 | "dev": true 1460 | }, 1461 | "semver": { 1462 | "version": "5.6.0", 1463 | "bundled": true, 1464 | "dev": true 1465 | }, 1466 | "set-blocking": { 1467 | "version": "2.0.0", 1468 | "bundled": true, 1469 | "dev": true 1470 | }, 1471 | "shebang-command": { 1472 | "version": "1.2.0", 1473 | "bundled": true, 1474 | "dev": true, 1475 | "requires": { 1476 | "shebang-regex": "^1.0.0" 1477 | } 1478 | }, 1479 | "shebang-regex": { 1480 | "version": "1.0.0", 1481 | "bundled": true, 1482 | "dev": true 1483 | }, 1484 | "signal-exit": { 1485 | "version": "3.0.2", 1486 | "bundled": true, 1487 | "dev": true 1488 | }, 1489 | "spawn-wrap": { 1490 | "version": "1.4.2", 1491 | "bundled": true, 1492 | "dev": true, 1493 | "requires": { 1494 | "foreground-child": "^1.5.6", 1495 | "mkdirp": "^0.5.0", 1496 | "os-homedir": "^1.0.1", 1497 | "rimraf": "^2.6.2", 1498 | "signal-exit": "^3.0.2", 1499 | "which": "^1.3.0" 1500 | } 1501 | }, 1502 | "spdx-correct": { 1503 | "version": "3.1.0", 1504 | "bundled": true, 1505 | "dev": true, 1506 | "requires": { 1507 | "spdx-expression-parse": "^3.0.0", 1508 | "spdx-license-ids": "^3.0.0" 1509 | } 1510 | }, 1511 | "spdx-exceptions": { 1512 | "version": "2.2.0", 1513 | "bundled": true, 1514 | "dev": true 1515 | }, 1516 | "spdx-expression-parse": { 1517 | "version": "3.0.0", 1518 | "bundled": true, 1519 | "dev": true, 1520 | "requires": { 1521 | "spdx-exceptions": "^2.1.0", 1522 | "spdx-license-ids": "^3.0.0" 1523 | } 1524 | }, 1525 | "spdx-license-ids": { 1526 | "version": "3.0.3", 1527 | "bundled": true, 1528 | "dev": true 1529 | }, 1530 | "string-width": { 1531 | "version": "2.1.1", 1532 | "bundled": true, 1533 | "dev": true, 1534 | "requires": { 1535 | "is-fullwidth-code-point": "^2.0.0", 1536 | "strip-ansi": "^4.0.0" 1537 | } 1538 | }, 1539 | "strip-ansi": { 1540 | "version": "4.0.0", 1541 | "bundled": true, 1542 | "dev": true, 1543 | "requires": { 1544 | "ansi-regex": "^3.0.0" 1545 | } 1546 | }, 1547 | "strip-bom": { 1548 | "version": "3.0.0", 1549 | "bundled": true, 1550 | "dev": true 1551 | }, 1552 | "strip-eof": { 1553 | "version": "1.0.0", 1554 | "bundled": true, 1555 | "dev": true 1556 | }, 1557 | "test-exclude": { 1558 | "version": "5.1.0", 1559 | "bundled": true, 1560 | "dev": true, 1561 | "requires": { 1562 | "arrify": "^1.0.1", 1563 | "minimatch": "^3.0.4", 1564 | "read-pkg-up": "^4.0.0", 1565 | "require-main-filename": "^1.0.1" 1566 | } 1567 | }, 1568 | "uglify-js": { 1569 | "version": "3.4.9", 1570 | "bundled": true, 1571 | "dev": true, 1572 | "optional": true, 1573 | "requires": { 1574 | "commander": "~2.17.1", 1575 | "source-map": "~0.6.1" 1576 | }, 1577 | "dependencies": { 1578 | "source-map": { 1579 | "version": "0.6.1", 1580 | "bundled": true, 1581 | "dev": true, 1582 | "optional": true 1583 | } 1584 | } 1585 | }, 1586 | "uuid": { 1587 | "version": "3.3.2", 1588 | "bundled": true, 1589 | "dev": true 1590 | }, 1591 | "validate-npm-package-license": { 1592 | "version": "3.0.4", 1593 | "bundled": true, 1594 | "dev": true, 1595 | "requires": { 1596 | "spdx-correct": "^3.0.0", 1597 | "spdx-expression-parse": "^3.0.0" 1598 | } 1599 | }, 1600 | "which": { 1601 | "version": "1.3.1", 1602 | "bundled": true, 1603 | "dev": true, 1604 | "requires": { 1605 | "isexe": "^2.0.0" 1606 | } 1607 | }, 1608 | "which-module": { 1609 | "version": "2.0.0", 1610 | "bundled": true, 1611 | "dev": true 1612 | }, 1613 | "wordwrap": { 1614 | "version": "0.0.3", 1615 | "bundled": true, 1616 | "dev": true 1617 | }, 1618 | "wrap-ansi": { 1619 | "version": "2.1.0", 1620 | "bundled": true, 1621 | "dev": true, 1622 | "requires": { 1623 | "string-width": "^1.0.1", 1624 | "strip-ansi": "^3.0.1" 1625 | }, 1626 | "dependencies": { 1627 | "ansi-regex": { 1628 | "version": "2.1.1", 1629 | "bundled": true, 1630 | "dev": true 1631 | }, 1632 | "is-fullwidth-code-point": { 1633 | "version": "1.0.0", 1634 | "bundled": true, 1635 | "dev": true, 1636 | "requires": { 1637 | "number-is-nan": "^1.0.0" 1638 | } 1639 | }, 1640 | "string-width": { 1641 | "version": "1.0.2", 1642 | "bundled": true, 1643 | "dev": true, 1644 | "requires": { 1645 | "code-point-at": "^1.0.0", 1646 | "is-fullwidth-code-point": "^1.0.0", 1647 | "strip-ansi": "^3.0.0" 1648 | } 1649 | }, 1650 | "strip-ansi": { 1651 | "version": "3.0.1", 1652 | "bundled": true, 1653 | "dev": true, 1654 | "requires": { 1655 | "ansi-regex": "^2.0.0" 1656 | } 1657 | } 1658 | } 1659 | }, 1660 | "wrappy": { 1661 | "version": "1.0.2", 1662 | "bundled": true, 1663 | "dev": true 1664 | }, 1665 | "write-file-atomic": { 1666 | "version": "2.4.2", 1667 | "bundled": true, 1668 | "dev": true, 1669 | "requires": { 1670 | "graceful-fs": "^4.1.11", 1671 | "imurmurhash": "^0.1.4", 1672 | "signal-exit": "^3.0.2" 1673 | } 1674 | }, 1675 | "y18n": { 1676 | "version": "4.0.0", 1677 | "bundled": true, 1678 | "dev": true 1679 | }, 1680 | "yallist": { 1681 | "version": "2.1.2", 1682 | "bundled": true, 1683 | "dev": true 1684 | }, 1685 | "yargs": { 1686 | "version": "12.0.5", 1687 | "bundled": true, 1688 | "dev": true, 1689 | "requires": { 1690 | "cliui": "^4.0.0", 1691 | "decamelize": "^1.2.0", 1692 | "find-up": "^3.0.0", 1693 | "get-caller-file": "^1.0.1", 1694 | "os-locale": "^3.0.0", 1695 | "require-directory": "^2.1.1", 1696 | "require-main-filename": "^1.0.1", 1697 | "set-blocking": "^2.0.0", 1698 | "string-width": "^2.0.0", 1699 | "which-module": "^2.0.0", 1700 | "y18n": "^3.2.1 || ^4.0.0", 1701 | "yargs-parser": "^11.1.1" 1702 | } 1703 | }, 1704 | "yargs-parser": { 1705 | "version": "11.1.1", 1706 | "bundled": true, 1707 | "dev": true, 1708 | "requires": { 1709 | "camelcase": "^5.0.0", 1710 | "decamelize": "^1.2.0" 1711 | } 1712 | } 1713 | } 1714 | }, 1715 | "once": { 1716 | "version": "1.4.0", 1717 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1718 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1719 | "dev": true, 1720 | "requires": { 1721 | "wrappy": "1" 1722 | } 1723 | }, 1724 | "optimist": { 1725 | "version": "0.6.1", 1726 | "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", 1727 | "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", 1728 | "dev": true, 1729 | "requires": { 1730 | "minimist": "~0.0.1", 1731 | "wordwrap": "~0.0.2" 1732 | } 1733 | }, 1734 | "path-is-absolute": { 1735 | "version": "1.0.1", 1736 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1737 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 1738 | "dev": true 1739 | }, 1740 | "path-parse": { 1741 | "version": "1.0.6", 1742 | "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz", 1743 | "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==", 1744 | "dev": true 1745 | }, 1746 | "pathval": { 1747 | "version": "1.1.0", 1748 | "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", 1749 | "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", 1750 | "dev": true 1751 | }, 1752 | "progress": { 1753 | "version": "2.0.3", 1754 | "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", 1755 | "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", 1756 | "dev": true 1757 | }, 1758 | "rechoir": { 1759 | "version": "0.6.2", 1760 | "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", 1761 | "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", 1762 | "dev": true, 1763 | "requires": { 1764 | "resolve": "^1.1.6" 1765 | } 1766 | }, 1767 | "resolve": { 1768 | "version": "1.10.0", 1769 | "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz", 1770 | "integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==", 1771 | "dev": true, 1772 | "requires": { 1773 | "path-parse": "^1.0.6" 1774 | } 1775 | }, 1776 | "rimraf": { 1777 | "version": "2.6.3", 1778 | "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", 1779 | "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", 1780 | "dev": true, 1781 | "requires": { 1782 | "glob": "^7.1.3" 1783 | }, 1784 | "dependencies": { 1785 | "glob": { 1786 | "version": "7.1.3", 1787 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", 1788 | "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", 1789 | "dev": true, 1790 | "requires": { 1791 | "fs.realpath": "^1.0.0", 1792 | "inflight": "^1.0.4", 1793 | "inherits": "2", 1794 | "minimatch": "^3.0.4", 1795 | "once": "^1.3.0", 1796 | "path-is-absolute": "^1.0.0" 1797 | } 1798 | } 1799 | } 1800 | }, 1801 | "semver": { 1802 | "version": "5.6.0", 1803 | "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", 1804 | "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==", 1805 | "dev": true 1806 | }, 1807 | "shelljs": { 1808 | "version": "0.8.3", 1809 | "resolved": "https://registry.npmjs.org/shelljs/-/shelljs-0.8.3.tgz", 1810 | "integrity": "sha512-fc0BKlAWiLpwZljmOvAOTE/gXawtCoNrP5oaY7KIaQbbyHeQVg01pSEuEGvGh3HEdBU4baCD7wQBwADmM/7f7A==", 1811 | "dev": true, 1812 | "requires": { 1813 | "glob": "^7.0.0", 1814 | "interpret": "^1.0.0", 1815 | "rechoir": "^0.6.2" 1816 | } 1817 | }, 1818 | "source-map": { 1819 | "version": "0.5.7", 1820 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", 1821 | "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", 1822 | "dev": true 1823 | }, 1824 | "source-map-support": { 1825 | "version": "0.5.10", 1826 | "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.10.tgz", 1827 | "integrity": "sha512-YfQ3tQFTK/yzlGJuX8pTwa4tifQj4QS2Mj7UegOu8jAz59MqIiMGPXxQhVQiIMNzayuUSF/jEuVnfFF5JqybmQ==", 1828 | "dev": true, 1829 | "requires": { 1830 | "buffer-from": "^1.0.0", 1831 | "source-map": "^0.6.0" 1832 | }, 1833 | "dependencies": { 1834 | "source-map": { 1835 | "version": "0.6.1", 1836 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1837 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1838 | "dev": true 1839 | } 1840 | } 1841 | }, 1842 | "sprintf-js": { 1843 | "version": "1.0.3", 1844 | "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", 1845 | "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", 1846 | "dev": true 1847 | }, 1848 | "strip-ansi": { 1849 | "version": "3.0.1", 1850 | "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", 1851 | "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", 1852 | "dev": true, 1853 | "requires": { 1854 | "ansi-regex": "^2.0.0" 1855 | } 1856 | }, 1857 | "supports-color": { 1858 | "version": "5.4.0", 1859 | "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", 1860 | "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", 1861 | "dev": true, 1862 | "requires": { 1863 | "has-flag": "^3.0.0" 1864 | } 1865 | }, 1866 | "to-fast-properties": { 1867 | "version": "2.0.0", 1868 | "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", 1869 | "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=", 1870 | "dev": true 1871 | }, 1872 | "trim-right": { 1873 | "version": "1.0.1", 1874 | "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", 1875 | "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", 1876 | "dev": true 1877 | }, 1878 | "ts-node": { 1879 | "version": "8.0.2", 1880 | "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.2.tgz", 1881 | "integrity": "sha512-MosTrinKmaAcWgO8tqMjMJB22h+sp3Rd1i4fdoWY4mhBDekOwIAKI/bzmRi7IcbCmjquccYg2gcF6NBkLgr0Tw==", 1882 | "dev": true, 1883 | "requires": { 1884 | "arg": "^4.1.0", 1885 | "diff": "^3.1.0", 1886 | "make-error": "^1.1.1", 1887 | "source-map-support": "^0.5.6", 1888 | "yn": "^3.0.0" 1889 | } 1890 | }, 1891 | "tslib": { 1892 | "version": "1.9.3", 1893 | "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz", 1894 | "integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==", 1895 | "dev": true 1896 | }, 1897 | "tslint": { 1898 | "version": "5.12.1", 1899 | "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.12.1.tgz", 1900 | "integrity": "sha512-sfodBHOucFg6egff8d1BvuofoOQ/nOeYNfbp7LDlKBcLNrL3lmS5zoiDGyOMdT7YsEXAwWpTdAHwOGOc8eRZAw==", 1901 | "dev": true, 1902 | "requires": { 1903 | "babel-code-frame": "^6.22.0", 1904 | "builtin-modules": "^1.1.1", 1905 | "chalk": "^2.3.0", 1906 | "commander": "^2.12.1", 1907 | "diff": "^3.2.0", 1908 | "glob": "^7.1.1", 1909 | "js-yaml": "^3.7.0", 1910 | "minimatch": "^3.0.4", 1911 | "resolve": "^1.3.2", 1912 | "semver": "^5.3.0", 1913 | "tslib": "^1.8.0", 1914 | "tsutils": "^2.27.2" 1915 | } 1916 | }, 1917 | "tsutils": { 1918 | "version": "2.29.0", 1919 | "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.29.0.tgz", 1920 | "integrity": "sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==", 1921 | "dev": true, 1922 | "requires": { 1923 | "tslib": "^1.8.1" 1924 | } 1925 | }, 1926 | "type-detect": { 1927 | "version": "4.0.8", 1928 | "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", 1929 | "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", 1930 | "dev": true 1931 | }, 1932 | "typedoc": { 1933 | "version": "0.14.2", 1934 | "resolved": "https://registry.npmjs.org/typedoc/-/typedoc-0.14.2.tgz", 1935 | "integrity": "sha512-aEbgJXV8/KqaVhcedT7xG6d2r+mOvB5ep3eIz1KuB5sc4fDYXcepEEMdU7XSqLFO5hVPu0nllHi1QxX2h/QlpQ==", 1936 | "dev": true, 1937 | "requires": { 1938 | "@types/fs-extra": "^5.0.3", 1939 | "@types/handlebars": "^4.0.38", 1940 | "@types/highlight.js": "^9.12.3", 1941 | "@types/lodash": "^4.14.110", 1942 | "@types/marked": "^0.4.0", 1943 | "@types/minimatch": "3.0.3", 1944 | "@types/shelljs": "^0.8.0", 1945 | "fs-extra": "^7.0.0", 1946 | "handlebars": "^4.0.6", 1947 | "highlight.js": "^9.13.1", 1948 | "lodash": "^4.17.10", 1949 | "marked": "^0.4.0", 1950 | "minimatch": "^3.0.0", 1951 | "progress": "^2.0.0", 1952 | "shelljs": "^0.8.2", 1953 | "typedoc-default-themes": "^0.5.0", 1954 | "typescript": "3.2.x" 1955 | }, 1956 | "dependencies": { 1957 | "typescript": { 1958 | "version": "3.2.4", 1959 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.2.4.tgz", 1960 | "integrity": "sha512-0RNDbSdEokBeEAkgNbxJ+BLwSManFy9TeXz8uW+48j/xhEXv1ePME60olyzw2XzUqUBNAYFeJadIqAgNqIACwg==", 1961 | "dev": true 1962 | } 1963 | } 1964 | }, 1965 | "typedoc-default-themes": { 1966 | "version": "0.5.0", 1967 | "resolved": "https://registry.npmjs.org/typedoc-default-themes/-/typedoc-default-themes-0.5.0.tgz", 1968 | "integrity": "sha1-bcJDPnjti+qOiHo6zeLzF4W9Yic=", 1969 | "dev": true 1970 | }, 1971 | "typescript": { 1972 | "version": "3.3.3", 1973 | "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.3.3.tgz", 1974 | "integrity": "sha512-Y21Xqe54TBVp+VDSNbuDYdGw0BpoR/Q6wo/+35M8PAU0vipahnyduJWirxxdxjsAkS7hue53x2zp8gz7F05u0A==", 1975 | "dev": true 1976 | }, 1977 | "uglify-js": { 1978 | "version": "3.4.9", 1979 | "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz", 1980 | "integrity": "sha512-8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==", 1981 | "dev": true, 1982 | "optional": true, 1983 | "requires": { 1984 | "commander": "~2.17.1", 1985 | "source-map": "~0.6.1" 1986 | }, 1987 | "dependencies": { 1988 | "commander": { 1989 | "version": "2.17.1", 1990 | "resolved": "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz", 1991 | "integrity": "sha512-wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==", 1992 | "dev": true, 1993 | "optional": true 1994 | }, 1995 | "source-map": { 1996 | "version": "0.6.1", 1997 | "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", 1998 | "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", 1999 | "dev": true, 2000 | "optional": true 2001 | } 2002 | } 2003 | }, 2004 | "universalify": { 2005 | "version": "0.1.2", 2006 | "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", 2007 | "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", 2008 | "dev": true 2009 | }, 2010 | "wordwrap": { 2011 | "version": "0.0.3", 2012 | "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", 2013 | "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", 2014 | "dev": true 2015 | }, 2016 | "wrappy": { 2017 | "version": "1.0.2", 2018 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 2019 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", 2020 | "dev": true 2021 | }, 2022 | "yn": { 2023 | "version": "3.0.0", 2024 | "resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz", 2025 | "integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==", 2026 | "dev": true 2027 | } 2028 | } 2029 | } 2030 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "juxta", 3 | "version": "2.0.3", 4 | "description": "Composable comparisons", 5 | "main": "dist/index.js", 6 | "typings": "dist/index.d.ts", 7 | "scripts": { 8 | "build": "rimraf dist && tsc", 9 | "mocha": "rimraf coverage && nyc mocha --require ts-node/register --reporter nyan **/*.test.ts", 10 | "mocha-ci": "rimraf coverage && nyc mocha --require ts-node/register --reporter spec **/*.test.ts", 11 | "prepare": "npm run build", 12 | "prepublishOnly": "npm test", 13 | "test": "npm run mocha && npm run tslint", 14 | "test-ci": "npm run mocha-ci && npm run tslint", 15 | "tslint": "tslint --project tsconfig.json", 16 | "typedoc": "rimraf typedoc && typedoc --out typedoc --tsconfig tsconfig.json --exclude **/*.test.ts --ignoreCompilerErrors --excludeNotExported --excludePrivate --mode file" 17 | }, 18 | "nyc": { 19 | "extension": [ 20 | ".ts" 21 | ], 22 | "exclude": [ 23 | "**/*.d.ts", 24 | "**/*.test.ts", 25 | "coverage", 26 | "dist", 27 | "typedoc" 28 | ], 29 | "reporter": [ 30 | "html", 31 | "text" 32 | ], 33 | "all": true 34 | }, 35 | "repository": { 36 | "type": "git", 37 | "url": "git+https://github.com/lfairy/juxta.git" 38 | }, 39 | "keywords": [ 40 | "compare", 41 | "compose", 42 | "functional", 43 | "array", 44 | "object", 45 | "sort" 46 | ], 47 | "author": "Chris Wong ", 48 | "license": "MIT OR Apache-2.0", 49 | "bugs": { 50 | "url": "https://github.com/lfairy/juxta/issues" 51 | }, 52 | "homepage": "https://github.com/lfairy/juxta#readme", 53 | "devDependencies": { 54 | "@types/chai": "^4.1.7", 55 | "@types/mocha": "^5.2.5", 56 | "chai": "^4.2.0", 57 | "mocha": "^5.2.0", 58 | "nyc": "^13.2.0", 59 | "rimraf": "^2.6.3", 60 | "ts-node": "^8.0.2", 61 | "tslint": "^5.12.1", 62 | "typedoc": "^0.14.2", 63 | "typescript": "^3.3.3" 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /tsconfig.json: -------------------------------------------------------------------------------- 1 | { 2 | "compilerOptions": { 3 | "target": "es5", 4 | "module": "commonjs", 5 | "strict": true, 6 | "outDir": "dist", 7 | "declaration": true, 8 | "sourceMap": true 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /tslint.json: -------------------------------------------------------------------------------- 1 | { 2 | "extends": [ 3 | "tslint:latest" 4 | ], 5 | "rules": { 6 | "interface-name": [ 7 | true, 8 | "never-prefix" 9 | ], 10 | "no-implicit-dependencies": [ 11 | true, 12 | "dev" 13 | ], 14 | "quotemark": [ 15 | true, 16 | "single", 17 | "avoid-escape" 18 | ], 19 | "space-before-function-paren": [ 20 | true, 21 | { 22 | "anonymous": "always", 23 | "named": "never", 24 | "asyncArrow": "always", 25 | "method": "never", 26 | "constructor": "never" 27 | } 28 | ] 29 | } 30 | } 31 | --------------------------------------------------------------------------------