diff --git a/.travis.yml b/.travis.yml index 5fb0c96..bcbd2fe 100644 --- a/.travis.yml +++ b/.travis.yml @@ -2,7 +2,7 @@ sudo: false language: node_js node_js: -- '7' +- '8' env: global: @@ -10,7 +10,6 @@ env: - secure: ZFxa817TgXMaJc/zC0PUHFqPt4aSXJxuMAXpsthyZyCMC0M2HAyZH14fDf8o7LX24q90EO6eAn3/JRhHWyQK9MygM4wW3J5mTc4Hm/2sJpqmDgmwHaoa1jZSxf7bykb1dPvkdgR15U0Xd0vtmMVR0gY7yQ6pcRVUPO6TNceCsu6p1nUfPGBDjLAKAa5wdJhaxOmfKjoIyT36jrJ2U5lCs7YtYuJGSgu4wHBnVsNjZIYyA8cF6FNMYYe/lRTheCz9vE0IYlmXT5aPEQL2kWZRGyWZOzBbtQXI+5XVqlKNbao4l15K62BvKuBu70bOa9Hxz7nR2ycwcfcpdxiJeDbOYwF5zsXVYY633p3SngPrkKBOww6gqbkMDEN6dqkT7clSZzqHnlL/o35b8LKNwdO9pxqU5YFALFHMSms5zJpTo3TAz4wxlb6TZCJlk+9Y4QaE3JqwTRxfk0Xw79w6N6eQXY2qq0zmL4MMyu3Q0KTCRAYX9CoWEbDD4WanWrLyXTkQbkNO7rZ+nSbS7CmEnt4Zs8AlLqdtsdf93cw7LcDotWnLQ+Fj+hUnApivSJkcQCFpqaJqFJcUutkn70ziqPe3b/BZZtHsbc1Dvda2GLl9gR9jFh61wrlk2WM/Q5kr+BVfT5RtKMSXRrEasEjz15tS0EQMP1k7VXjGMV4P1b57i4A= os: -#- osx - linux addons: @@ -35,11 +34,13 @@ before_install: fi install: - - yarn install - - yarn run build +- npm install + +before_script: +- npm run build script: -- yarn test --silent +- npm test --silent deploy: provider: script diff --git a/.vscodeignore b/.vscodeignore index b3a4323..314df7a 100644 --- a/.vscodeignore +++ b/.vscodeignore @@ -1,13 +1,16 @@ +.github/** .vscode/** .vscode-test/** -typings/** -out/test/** + +.gitignore +package-lock.json +prepare-release.js + +config/** test/** src/** -**/*.map -.gitignore tsconfig.json tslint.json -typings.json + *.vsix -_workspace/** \ No newline at end of file +out/test/** diff --git a/CHANGELOG.md b/CHANGELOG.md index 51fbed8..4d514c6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -3,6 +3,16 @@ All notable changes to this project will be documented in this file. This project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +#### Added +- Import grouping, imports are now grouped and sorted (read the docs in README) ([#102](https://github.com/buehler/typescript-hero/issues/102)) +- Option to add a trailing comma to a multiline import (at the last import) ([#100](https://github.com/buehler/typescript-hero/issues/100)) + +#### Changed +- Multiline import statement threshold to a new default value `125`, since github thinks this is a good value [source-code-line-length](http://hilton.org.uk/blog/source-code-line-length) + +#### Removed +- `newImportLocation` setting, since the imports are grouped and sorted, the new import location is obsolete ([#102](https://github.com/buehler/typescript-hero/issues/102)) + #### Fixed - Default imports are removed regardless if they are used or not ([#149](https://github.com/buehler/typescript-hero/issues/149)) - Support for generic interfaces and abstract classes for the implement elements feature of the light bulb ([#158](https://github.com/buehler/typescript-hero/issues/158)) diff --git a/README.md b/README.md index d9425bb..3eab455 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,6 @@ All commands are preceeded by `typescriptHero`. | Command | Extension part | Description | | ---------------------------- | --------------- | --------------------------------------------------------- | -| showCmdGui | general | Shows a small gui with all available internal commands | | resolve.addImport | import resolver | Shows a pick list with all recognized, importable symbols | | resolve.addImportUnderCursor | import resolver | Imports the symbol under the cursor | | resolve.addMissingImports | import resolver | Imports all missing symbols for the actual document | @@ -74,13 +73,14 @@ The following settings do have the prefix `resolver`. So an example setting coul | Setting | Description | | ------------------------------------- | ------------------------------------------------------------------------------------ | -| stringQuoteStyle | The string delimiter to use for the imports | +| stringQuoteStyle | The string delimiter to use for the imports (`'` or `"`) | | ignorePatterns | If any of these strings is part of a file path, the file is ignored | | insertSpaceBeforeAndAfterImportBraces | If the extension should place spaces into import braces (`{Symbol}` vs `{ Symbol }`) | | insertSemicolons | If the extension should add a semicolon to the end of a statement | | multiLineWrapThreshold | The threshold, when imports are converted into multiline imports | -| newImportLocation | The location of new imports (at the top of the file, or at the cursor location) | +| multiLineTrailingComma | When multiline imports are created, `true` inserts a trailing comma to the last line | | disableImportSorting | Disable sorting during organize imports action | +| importGroups | The groups that are used for sorting the imports (description below) | ## Features (extended) @@ -93,6 +93,91 @@ TypeScript Hero can manage your imports. It is capable of: - Import all missing identifiers of the current file - Remove unused imports and sort the remaining ones by alphabet +#### Import groups + +The import groups setting allows you to order all your imports as you may want. The settings is an array of elements. +An element can either be a string (with a certain keyword or a regex like string) or an object that contains an +identifier (with a certain keyword or a regex like string) and a sort order. The order you enter those objects / string +does matter since it is used to define the import groups. + +An example (complex) could be: + +```json +[ + "Plains", + "/@angular/", + { + "identifier": "/Foo[1-9]Bar/", + "order": "desc" + }, + "Workspace", + { + "identifier": "Remaining", + "order": "desc" + } +] +``` + +##### Keyword imports + +- `Modules` : contains all imports from modules (npm etc) `import ... from 'vscode';` +- `Plains` : contains all string only imports `import 'reflect-metadata;` +- `Workspace` : contains all local project files `import ... from '../server';` +- `Remaining` : contains all imports that are not matched by other import groups + +(_hint_: The `Remaining` group is added implicitly as the last import group if not added specifically) + +The default is as follows: + +```json +[ + "Plains", + "Modules", + "Workspace" +] +``` + +For everybody that just wants all imports ordered in asc or desc, just overwrite the default with: + +For all imports sorted asc: +```json +[] +``` + +For all imports sorted desc: +```json +[ + { + "identifier": "Remaining", + "order": "desc" + } +] +``` + +##### Regex imports + +The regex import group contains a regex string. Let's say you want to group all your `@angular` namespaced imports together +in one group you'd use `/@angular/` as "identifier" (either in the object when you want to change the order or just +the plain regex since default order is `asc`). + +(_hint_: only the name of the library is matched against the regex) + +```json +[ + "/@angular/" +] +``` + +The setting above would create two groups: one with all @angular imports another with all other imports. + +```typescript +import {http} from '@angular/http'; +import {component} from '@angular/core'; + +import 'reflect-metadata'; +import {Server} from './server'; +``` + ### Intellisense Intellisense is a common IDE feature. TypeScript Hero provides you with symbols as you type your code diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..d225cbe --- /dev/null +++ b/package-lock.json @@ -0,0 +1,3403 @@ +{ + "name": "typescript-hero", + "version": "0.13.2", + "lockfileVersion": 1, + "dependencies": { + "@types/chai": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.0.tgz", + "integrity": "sha512-B56eI1x+Av9A7XHsgF0+WyLyBytAQqvdBoaULY3c4TGeKwLm43myB78EeBA8/VQn74KblXM4/ecmjTJJXUUF1A==", + "dev": true + }, + "@types/mocha": { + "version": "2.2.41", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.41.tgz", + "integrity": "sha1-4nzwgXFT658nE7LT9saPHhw8pgg=", + "dev": true + }, + "@types/node": { + "version": "7.0.31", + "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.31.tgz", + "integrity": "sha512-+KrE1LDddn97ip+gXZAnzNQ0pupKH/6tcKwTpo96BDVNpzmhIKGHug0Wd3H0dN4WEqYB1tXYI5m2mZuIZNI8tg==", + "dev": true + }, + "@types/reflect-metadata": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/@types/reflect-metadata/-/reflect-metadata-0.0.5.tgz", + "integrity": "sha1-nAQr+pgD1Xeq1PV9+8pLfK5Chv4=", + "dev": true + }, + "@types/sinon": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.1.tgz", + "integrity": "sha512-WXpK6gOice0sdhfrAtRaDNtg0E0e04MRuCKYuqtCmc8O1P9P+ia3Z5zuMf4cDVB27s9w4UjjML5/6vjkiI2gNA==", + "dev": true + }, + "@types/sinon-chai": { + "version": "2.7.28", + "resolved": "https://registry.npmjs.org/@types/sinon-chai/-/sinon-chai-2.7.28.tgz", + "integrity": "sha512-qh9K/XtXzdHWiUqvFFjw3jQ5ZNrw0wzHaCWTcgBfSn7KwbjZHywinAdinSpUXeHBv+4cojk/9WSrPwVPYiITTA==", + "dev": true + }, + "ansi-align": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-align/-/ansi-align-2.0.0.tgz", + "integrity": "sha1-w2rsy6VjuJzrVW82kPCx2eNUf38=", + "dev": true + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=" + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true + }, + "arr-flatten": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.3.tgz", + "integrity": "sha1-onTthawIhJtr14R8RYB0XcUa37E=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=" + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=" + }, + "assertion-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.0.2.tgz", + "integrity": "sha1-E8pRXYYgbaC6xm6DTdOX2HWBCUw=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=" + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=" + }, + "babel-code-frame": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.22.0.tgz", + "integrity": "sha1-AnYgvuVnqIwyVhV05/0IAdMxGOQ=", + "dev": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "binary-extensions": { + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.8.0.tgz", + "integrity": "sha1-SOyNFt9Dd+rl+liEaCSAr02Vx3Q=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true + }, + "bluebird": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.11.0.tgz", + "integrity": "sha1-U0uQM8AiyVecVro7Plpcqvu2UOE=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=" + }, + "boxen": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/boxen/-/boxen-1.1.0.tgz", + "integrity": "sha1-sbad1SIwXoB6md7ud329blFnsQI=", + "dev": true, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true + }, + "capture-stack-trace": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz", + "integrity": "sha1-Sm+gc5nCa7pH8LJJa00PtAjFVQ0=", + "dev": true + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "chai": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.0.2.tgz", + "integrity": "sha1-L3MnxN5vOF3XeHmZ4qsCaXoyuDs=", + "dev": true + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=" + }, + "check-error": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", + "integrity": "sha1-V00xLt2Iu13YkS6Sht1sCu1KrII=", + "dev": true + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true + }, + "chokidar-cli": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/chokidar-cli/-/chokidar-cli-1.2.0.tgz", + "integrity": "sha1-jn9YRCJzGCAYvhho5Twir2WiGUg=", + "dev": true + }, + "cli-boxes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cli-boxes/-/cli-boxes-1.0.0.tgz", + "integrity": "sha1-T6kXw+WclKAEzWH47lCdplFocUM=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + } + } + }, + "clone": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.2.tgz", + "integrity": "sha1-Jgt6meux7f4kdTgXX3gyQ8sZ0Uk=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=" + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "configstore": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/configstore/-/configstore-3.1.0.tgz", + "integrity": "sha1-Rd+QcHPibfoc9LLVL1tgVF6qEdE=", + "dev": true + }, + "convert-source-map": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.0.tgz", + "integrity": "sha1-ms1whRxtXf3ZPZKC5e35SgP/RrU=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "coveralls": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/coveralls/-/coveralls-2.13.1.tgz", + "integrity": "sha1-1wu5rMGDXsTwY/+drFQjwXsR8Xg=" + }, + "create-error-class": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/create-error-class/-/create-error-class-3.0.2.tgz", + "integrity": "sha1-Br56vvlHo/FKMP1hBnHUAbyot7Y=", + "dev": true + }, + "cross-spawn-async": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz", + "integrity": "sha1-hF/wwINKPe2dFg2sptOQkGuyiMw=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=" + }, + "crypto-random-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/crypto-random-string/-/crypto-random-string-1.0.0.tgz", + "integrity": "sha1-ojD2T1aDEOFJgAmUB5DsmVRbyn4=", + "dev": true + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "dateformat": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.0.0.tgz", + "integrity": "sha1-J0Pjq7XD/CRi5SfcpEXgTp9N7hc=", + "dev": true + }, + "debug": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.0.tgz", + "integrity": "sha1-vFlryr52F/Edn6FTYe3tVgi4SZs=", + "dev": true + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "deep-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", + "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true + }, + "deep-eql": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-2.0.2.tgz", + "integrity": "sha1-sbrAblbwp2d3aG1Qyf63XC7XZ5o=", + "dev": true, + "dependencies": { + "type-detect": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-3.0.0.tgz", + "integrity": "sha1-RtDMhVOrt7E6NSsNbeov1Y8tm1U=", + "dev": true + } + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true + }, + "del-cli": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/del-cli/-/del-cli-1.0.0.tgz", + "integrity": "sha1-PP/B1QiyW1MscDucRQ5DlniZFi0=", + "dev": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + }, + "diff": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.2.0.tgz", + "integrity": "sha1-yc45Okt8vQsFinJck98pkCeGj/k=", + "dev": true + }, + "doctrine": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz", + "integrity": "sha1-fLhgNZujvpDgQLJrcpzkv6ZUxSM=", + "dev": true, + "dependencies": { + "esutils": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz", + "integrity": "sha1-wBzKqa5LiXxtDD4hCuUvPHqEQ3U=", + "dev": true + } + } + }, + "dot-prop": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-4.1.1.tgz", + "integrity": "sha1-qEk/C3te7sglJbXHWH+n3nyoWcE=", + "dev": true + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "dependencies": { + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexer3": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/duplexer3/-/duplexer3-0.1.4.tgz", + "integrity": "sha1-7gHdHKwO08vH/b6jfcCo8c4ALOI=", + "dev": true + }, + "duplexify": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.0.tgz", + "integrity": "sha1-GqdzAC4VeEV+nZ1KULDMquvL1gQ=", + "dev": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true + }, + "end-of-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.0.0.tgz", + "integrity": "sha1-1FlucCc0qT5A6a+GQxnqvZn/Lw4=", + "dev": true, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true + } + } + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "esprima": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz", + "integrity": "sha1-luO3DVd59q1JzQMmc9HDEnZ7pYE=" + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true + }, + "execa": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.4.0.tgz", + "integrity": "sha1-TrZGejaglfq7KXD/nV4/t7zm68M=", + "dev": true + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=" + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=" + }, + "fancy-log": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.0.tgz", + "integrity": "sha1-Rb4X0Cu5kX1gzP/UmVyZnmyMmUg=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "filewalker": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/filewalker/-/filewalker-0.1.3.tgz", + "integrity": "sha1-1jv52BO6NTRLgYJ0eCT2/3VL9MU=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true + }, + "findup-sync": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-0.3.0.tgz", + "integrity": "sha1-N5MKpdgWt3fANEXhlmzGeQpMCxY=", + "dev": true, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true + } + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=" + }, + "formatio": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/formatio/-/formatio-1.2.0.tgz", + "integrity": "sha1-87IWfZBoxGmKjVH092CjmlTYGOs=", + "dev": true + }, + "fqueue": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/fqueue/-/fqueue-0.0.0.tgz", + "integrity": "sha1-UzIFpPmtIbuqOPxhzvOpMML1SDY=", + "dev": true + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.2.tgz", + "integrity": "sha512-Sn44E5wQW4bTHXvQmvSHwqbuiXtduD6Rrjm2ZtUEGbyrig+nUH3t/QD4M4/ZXViY556TBpRgZkHLDx3JxPwxiw==", + "dev": true, + "optional": true, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "bundled": true, + "dev": true, + "optional": true + }, + "ansi-regex": { + "version": "2.1.1", + "bundled": true, + "dev": true + }, + "aproba": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "asn1": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "bundled": true, + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "block-stream": { + "version": "0.0.9", + "bundled": true, + "dev": true + }, + "boom": { + "version": "2.10.1", + "bundled": true, + "dev": true + }, + "brace-expansion": { + "version": "1.1.7", + "bundled": true, + "dev": true + }, + "buffer-shims": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "caseless": { + "version": "0.12.0", + "bundled": true, + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "bundled": true, + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "bundled": true, + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "bundled": true, + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "dashdash": { + "version": "1.14.1", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "bundled": true, + "dev": true, + "optional": true + }, + "deep-extend": { + "version": "0.4.2", + "bundled": true, + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "delegates": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extend": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "bundled": true, + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "fs.realpath": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "fstream": { + "version": "1.0.11", + "bundled": true, + "dev": true + }, + "fstream-ignore": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "gauge": { + "version": "2.7.4", + "bundled": true, + "dev": true, + "optional": true + }, + "getpass": { + "version": "0.1.7", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "bundled": true, + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "bundled": true, + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "bundled": true, + "dev": true, + "optional": true + }, + "has-unicode": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "bundled": true, + "dev": true, + "optional": true + }, + "hoek": { + "version": "2.16.3", + "bundled": true, + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "inflight": { + "version": "1.0.6", + "bundled": true, + "dev": true + }, + "inherits": { + "version": "2.0.3", + "bundled": true, + "dev": true + }, + "ini": { + "version": "1.3.4", + "bundled": true, + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "bundled": true, + "dev": true + }, + "isstream": { + "version": "0.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "jsbn": { + "version": "0.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "bundled": true, + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "bundled": true, + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "bundled": true, + "dev": true + }, + "minimist": { + "version": "0.0.8", + "bundled": true, + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "bundled": true, + "dev": true + }, + "ms": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "bundled": true, + "dev": true, + "optional": true + }, + "nopt": { + "version": "4.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "npmlog": { + "version": "4.1.0", + "bundled": true, + "dev": true, + "optional": true + }, + "number-is-nan": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "bundled": true, + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "bundled": true, + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "bundled": true, + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "bundled": true, + "dev": true, + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "bundled": true, + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "bundled": true, + "dev": true + }, + "punycode": { + "version": "1.4.1", + "bundled": true, + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "minimist": { + "version": "1.2.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "bundled": true, + "dev": true + }, + "request": { + "version": "2.81.0", + "bundled": true, + "dev": true, + "optional": true + }, + "rimraf": { + "version": "2.6.1", + "bundled": true, + "dev": true + }, + "safe-buffer": { + "version": "5.0.1", + "bundled": true, + "dev": true + }, + "semver": { + "version": "5.3.0", + "bundled": true, + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "bundled": true, + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "bundled": true, + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "bundled": true, + "dev": true, + "optional": true + }, + "sshpk": { + "version": "1.13.0", + "bundled": true, + "dev": true, + "optional": true, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "bundled": true, + "dev": true, + "optional": true + } + } + }, + "string_decoder": { + "version": "1.0.1", + "bundled": true, + "dev": true + }, + "string-width": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "bundled": true, + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "bundled": true, + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "bundled": true, + "dev": true + }, + "tar-pack": { + "version": "3.4.0", + "bundled": true, + "dev": true, + "optional": true + }, + "tough-cookie": { + "version": "2.3.2", + "bundled": true, + "dev": true, + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "bundled": true, + "dev": true, + "optional": true + }, + "tweetnacl": { + "version": "0.14.5", + "bundled": true, + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "bundled": true, + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "bundled": true, + "dev": true + }, + "uuid": { + "version": "3.0.1", + "bundled": true, + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "bundled": true, + "dev": true, + "optional": true + }, + "wide-align": { + "version": "1.1.2", + "bundled": true, + "dev": true, + "optional": true + }, + "wrappy": { + "version": "1.0.2", + "bundled": true, + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=" + }, + "get-func-name": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", + "integrity": "sha1-6td0q+5y4gQJQzoGY2YCPdaIekE=", + "dev": true + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true + } + } + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true + }, + "glogg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.0.tgz", + "integrity": "sha1-f+DxmfV6yQbPUS/urY+Q7kooT8U=", + "dev": true + }, + "got": { + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/got/-/got-6.7.1.tgz", + "integrity": "sha1-JAzQV4WpoY5WHcG0S0HHY+8ejbA=", + "dev": true + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + }, + "growl": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.9.2.tgz", + "integrity": "sha1-Dqd0NxXbjY3ixe3hd14bRayFwC8=", + "dev": true + }, + "gulp-chmod": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", + "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true + }, + "gulp-filter": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.0.0.tgz", + "integrity": "sha1-z6gZZvtniE8rp1SwZxUpKUKNWbw=", + "dev": true + }, + "gulp-gunzip": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-0.0.3.tgz", + "integrity": "sha1-e24HsPWP09QlFcSOrVpj3wVy9i8=", + "dev": true, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true + } + } + }, + "gulp-remote-src": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.2.tgz", + "integrity": "sha1-zrN3DjREMo1hOG+6qrIAvBHNmKg=", + "dev": true, + "dependencies": { + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=", + "dev": true + } + } + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true + } + } + }, + "gulp-symdest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", + "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", + "dev": true + }, + "gulp-untar": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", + "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", + "dev": true + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulp-vinyl-zip": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-1.4.0.tgz", + "integrity": "sha1-VjgvLMtXIxuwR4x4c3zNVylzvuE=", + "dev": true, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=" + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=" + }, + "has-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz", + "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=" + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "hosted-git-info": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.4.2.tgz", + "integrity": "sha1-AHa59GonBQbduq6lZJaJdGBhKmc=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=" + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true + }, + "inversify": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-4.1.1.tgz", + "integrity": "sha1-qV7bNK4IK7EXUzbVHc1fARE0xiU=" + }, + "inversify-inject-decorators": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/inversify-inject-decorators/-/inversify-inject-decorators-3.0.1.tgz", + "integrity": "sha1-3kbfRrpyZC6srHlFHsXBAeTbywA=" + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true + }, + "is-buffer": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.5.tgz", + "integrity": "sha1-Hzsm72E7IUuIy8ojzGwB2Hlh7sw=", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=", + "dev": true + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true + }, + "is-my-json-valid": { + "version": "2.16.0", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz", + "integrity": "sha1-8Hndm/2uZe4gOKrorLyGqxCeNpM=" + }, + "is-npm": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-npm/-/is-npm-1.0.0.tgz", + "integrity": "sha1-8vtjpl5JBbQGyGBydloaTceTufQ=", + "dev": true + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true + }, + "is-path-inside": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.0.tgz", + "integrity": "sha1-/AbloWg/vaE95mev9xe7wQpI838=", + "dev": true + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + }, + "is-redirect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-redirect/-/is-redirect-1.0.0.tgz", + "integrity": "sha1-HQPd7VO9jbDzDCbk+V02/HyH3CQ=", + "dev": true + }, + "is-retry-allowed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz", + "integrity": "sha1-EaBgVotnM5REAz0BJaYaINVk+zQ=", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", + "dev": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true + }, + "js-tokens": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.1.tgz", + "integrity": "sha1-COnxMkhKLEWjCQfp3E1VZ7fxFNc=", + "dev": true + }, + "js-yaml": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.6.1.tgz", + "integrity": "sha1-bl/mfYsgXOTSL60Ft3geja3MSzA=" + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=" + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=" + }, + "json3": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.3.2.tgz", + "integrity": "sha1-PAQ0dD35Pi9cQq7nsZvLSDV19OE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=" + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true + }, + "latest-version": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/latest-version/-/latest-version-3.1.0.tgz", + "integrity": "sha1-ogU4P+oyKzO1rjsYq+4NwvNW7hU=", + "dev": true + }, + "lazy-req": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/lazy-req/-/lazy-req-2.0.0.tgz", + "integrity": "sha1-yUUKNj7N2i5vDHATKtTzf48G8rQ=", + "dev": true + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true + }, + "lcov-parse": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/lcov-parse/-/lcov-parse-0.0.10.tgz", + "integrity": "sha1-GwuP+ayceIklBYK3C3ExXZ2m2aM=" + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=", + "dev": true + }, + "lodash._baseassign": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz", + "integrity": "sha1-jDigmVAPIVrQnlnxci/QxSv+Ck4=", + "dev": true + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basecreate": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz", + "integrity": "sha1-G8ZhYU2qf8MRt9A78WgGoCE8+CE=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.create": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.create/-/lodash.create-3.1.1.tgz", + "integrity": "sha1-1/KEnw29p+BGgruM1yqwIkYd6+c=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true + }, + "log-driver": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/log-driver/-/log-driver-1.2.5.tgz", + "integrity": "sha1-euTsJXMC/XkNVXyxDJcQDYV7AFY=" + }, + "lolex": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/lolex/-/lolex-1.6.0.tgz", + "integrity": "sha1-OpoCg0UqR9dDnnJzG54H1zhuSfY=", + "dev": true + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true + }, + "lowercase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lowercase-keys/-/lowercase-keys-1.0.0.tgz", + "integrity": "sha1-TjNms55/VFfjXxMkvfb4jQv8cwY=", + "dev": true + }, + "lru-cache": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.2.tgz", + "integrity": "sha1-HRdnnAac2l0ECZGgnbwsDbN35V4=", + "dev": true + }, + "make-dir": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-1.0.0.tgz", + "integrity": "sha1-l6ARdR6R3YfPre9Ygy67BJNt6Xg=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=" + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "3.4.2", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-3.4.2.tgz", + "integrity": "sha1-0O9NMyEm2/GNDWQMmzgt1IvpdZQ=", + "dev": true, + "dependencies": { + "glob": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.1.tgz", + "integrity": "sha1-gFIR3wT6rxxjo2ADBs31reULLsg=", + "dev": true + }, + "supports-color": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.1.2.tgz", + "integrity": "sha1-cqJiiU2dQIuVbKBf83su2KbiotU=", + "dev": true + } + } + }, + "mocha-testdata": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mocha-testdata/-/mocha-testdata-1.2.0.tgz", + "integrity": "sha1-bMDUGCDpu2aQMzRSTlrkIN537Oo=", + "dev": true + }, + "ms": { + "version": "0.7.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.2.tgz", + "integrity": "sha1-riXPJRKziFodldfwN4aNhDESR2U=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true + }, + "nan": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.6.2.tgz", + "integrity": "sha1-5P805slf37WuzAjeZZb0NgWn20U=", + "dev": true, + "optional": true + }, + "native-promise-only": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/native-promise-only/-/native-promise-only-0.8.1.tgz", + "integrity": "sha1-IKMYwwy0X3H+et+/eyHJnBRy7xE=", + "dev": true + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true + }, + "normalize-package-data": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.3.8.tgz", + "integrity": "sha1-2Bntoqne29H/pWPqQHHZNngilbs=", + "dev": true + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true + }, + "npm-run-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-1.0.0.tgz", + "integrity": "sha1-9cMr9ZX+ga6Sfa7FLoL4sACsPI8=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + } + } + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "dev": true + }, + "package-json": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/package-json/-/package-json-4.0.1.tgz", + "integrity": "sha1-iGmgQBJTZhxMTKPabCEh7VVfXu0=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-1.0.0.tgz", + "integrity": "sha1-XVPVeAGWRsDWiADbThRua9wqx68=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-to-regexp": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.7.0.tgz", + "integrity": "sha1-Wf3g9DW62suhA6hOnTvGTpa5k30=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true + }, + "pathval": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.0.tgz", + "integrity": "sha1-uULm1L3mUwBe9rcTYd74cn0GReA=", + "dev": true + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=" + }, + "prepend-http": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz", + "integrity": "sha1-1PRWKwzjaW5BrFLQ4ALlemNdxtw=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=" + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=" + }, + "queue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", + "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true + }, + "randomatic": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.6.tgz", + "integrity": "sha1-EQ3Kv/OX6dz/fAeJzMCkmt8exbs=", + "dev": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true + }, + "readable-stream": { + "version": "2.2.10", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.10.tgz", + "integrity": "sha512-HQEnnoV404e0EtwB9yNiuk2tJ+egeVC8Y9QBAxzDg8DBJt4BzRp+yQuIb/t3FIWkSTmIi+sgx7yVv/ZM0GNoqw==", + "dev": true, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + } + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true + }, + "reflect-metadata": { + "version": "0.1.10", + "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.10.tgz", + "integrity": "sha1-tPg3BEFqytiZiMmxVjXUfgO5NEo=" + }, + "regex-cache": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.3.tgz", + "integrity": "sha1-mxpsNdTQ3871cRrmUejp09cRQUU=", + "dev": true + }, + "registry-auth-token": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/registry-auth-token/-/registry-auth-token-3.3.1.tgz", + "integrity": "sha1-+w0yie4Nmtosu1KvXf5mywcNMAY=", + "dev": true + }, + "registry-url": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/registry-url/-/registry-url-3.1.0.tgz", + "integrity": "sha1-PU74cPc93h138M+aOBQyRE4XSUI=", + "dev": true + }, + "remove-trailing-separator": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz", + "integrity": "sha1-YV67lq9VlVLUv0BXyENtSGq2PMQ=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=" + }, + "resolve": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.3.3.tgz", + "integrity": "sha1-ZVkHw0aahoDcLeOidaj91paR8OU=", + "dev": true + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true + }, + "samsam": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/samsam/-/samsam-1.2.1.tgz", + "integrity": "sha1-7dOQk6MYQ3DLhZJDsr3yVefY6mc=", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true + }, + "semver-diff": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/semver-diff/-/semver-diff-2.1.0.tgz", + "integrity": "sha1-S7uEN8jTfksM8aaP1ybsbWRdbTY=", + "dev": true + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true + }, + "sinon": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-2.3.4.tgz", + "integrity": "sha1-RmrY0brobW21GqIYuS6Ze8Pl24g=", + "dev": true + }, + "sinon-chai": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.11.0.tgz", + "integrity": "sha512-3kbzpr2q8N+M4CWkcym349ifwkXorsbw2YyVpEIvB3AKC/ebrLHXj3DySt8epKGA49zJBSgn1OvWHZ+O+aR0dA==", + "dev": true + }, + "slide": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", + "integrity": "sha1-VusCfWW00tzmyy4tMsTUr8nh1wc=", + "dev": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=" + }, + "source-map": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.6.tgz", + "integrity": "sha1-dc449SvwczxafwwRjYEzSiu19BI=", + "dev": true + }, + "source-map-support": { + "version": "0.4.15", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.15.tgz", + "integrity": "sha1-AyAt9lwG0r2MfsI2KhkwVv7407E=", + "dev": true + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=" + } + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamfilter": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.5.tgz", + "integrity": "sha1-h1BxEb644phFFxe1Ec/tjwAqv1M=", + "dev": true + }, + "streamifier": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true + }, + "string-width": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.0.0.tgz", + "integrity": "sha1-Y1xUNsxypuDDh87KJ41OLuxSaH4=", + "dev": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=" + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true + }, + "term-size": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/term-size/-/term-size-0.1.1.tgz", + "integrity": "sha1-hzYLljlsq1dgljcUzaDQy+7K2co=", + "dev": true + }, + "text-encoding": { + "version": "0.6.4", + "resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.6.4.tgz", + "integrity": "sha1-45mpgiV6J22uQou5KEXLcb3CbRk=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=", + "dev": true + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "timed-out": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/timed-out/-/timed-out-4.0.1.tgz", + "integrity": "sha1-8y6srFoXW+ol1/q1Zas+2HQe9W8=", + "dev": true + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=" + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "ts-json-serializer": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/ts-json-serializer/-/ts-json-serializer-1.2.4.tgz", + "integrity": "sha1-ZtT16NKSotQ7GkeLvcrkJ68hfEU=" + }, + "tslib": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.7.1.tgz", + "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=" + }, + "tslint": { + "version": "5.4.3", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.4.3.tgz", + "integrity": "sha1-dhyEArgONHt3M6BDkKdXslNYBGc=", + "dev": true + }, + "tslint-config-airbnb": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/tslint-config-airbnb/-/tslint-config-airbnb-5.1.2.tgz", + "integrity": "sha1-byh8ZHZiAfzeb86GL0d4j0Dg2pw=", + "dev": true + }, + "tslint-consistent-codestyle": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/tslint-consistent-codestyle/-/tslint-consistent-codestyle-1.4.0.tgz", + "integrity": "sha1-+NPs5Mv22IFblBDp0PJI+JGWNXU=", + "dev": true + }, + "tslint-eslint-rules": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz", + "integrity": "sha1-fDDniC8mvCdr/5HSOEl1xp2viLo=", + "dev": true, + "dependencies": { + "tsutils": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", + "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "dev": true + } + } + }, + "tslint-microsoft-contrib": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.0.tgz", + "integrity": "sha1-D/Y4nOPbxeoQN4KQCngG//oUUP8=", + "dev": true + }, + "tsutils": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.4.0.tgz", + "integrity": "sha1-rUzm26Dlo+2934Ymt8oEB4IYn+o=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=" + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-detect": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.3.tgz", + "integrity": "sha1-Dj8mcLRAmbC0bChNE2p+9Jx0wuo=", + "dev": true + }, + "typescript": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.3.4.tgz", + "integrity": "sha1-PTgyGCgjHkNPKHUUlZw3qCtin0I=" + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true + }, + "unique-string": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-string/-/unique-string-1.0.0.tgz", + "integrity": "sha1-nhBXzKhRq7kzmPizOuGHuZyuwRo=", + "dev": true + }, + "unzip-response": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/unzip-response/-/unzip-response-2.0.1.tgz", + "integrity": "sha1-0vD3N9FrBhXnKmk17QQhRXLVb5c=", + "dev": true + }, + "update-notifier": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/update-notifier/-/update-notifier-2.1.0.tgz", + "integrity": "sha1-7AweU1NrdmR6JLd8uDlm2TFRI9k=", + "dev": true + }, + "url-parse-lax": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/url-parse-lax/-/url-parse-lax-1.0.0.tgz", + "integrity": "sha1-evjzA2Rem9eaJy56FKxovAYJ2nM=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=" + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=" + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "dependencies": { + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true + } + } + }, + "vinyl-source-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz", + "integrity": "sha1-RMvlEIIFJ53rDFZTwJSiiHk4sas=", + "dev": true, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true + } + } + }, + "vrsource-tslint-rules": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/vrsource-tslint-rules/-/vrsource-tslint-rules-5.1.0.tgz", + "integrity": "sha1-RfeBevbQSQmWvwDBnPelrzDHl6Q=", + "dev": true, + "dependencies": { + "tslint": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.1.0.tgz", + "integrity": "sha1-UaR7rutYlW/NYXvSzwDi7w7qLtk=", + "dev": true + }, + "tsutils": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-1.9.1.tgz", + "integrity": "sha1-ufmrROVa+WgYMdXyjQrur1x1DLA=", + "dev": true + } + } + }, + "vscode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.0.tgz", + "integrity": "sha1-sEwjmbbsdoE1yWiOeHPXduKNy5U=", + "dev": true + }, + "vscode-languageclient": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-3.3.0.tgz", + "integrity": "sha512-4HVt0GorAV7lJfoT2C6qh/Fug9u/HSmKUa8u+y+Pte0HqvUtOwTI8qlX1vu8vyQ5OHD8t8pJad/9yIbYntwxCw==", + "dependencies": { + "vscode-jsonrpc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.3.0.tgz", + "integrity": "sha512-a4dTM+nU6C9fNVfcZuJODpSiVsFNx/u5dwkEBbbPtftUhnnwlO9tacnudhKoY9+FVpSlgQ3QTR9rltRm0U8nhg==" + } + } + }, + "vscode-languageserver": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-3.3.0.tgz", + "integrity": "sha512-8YvEbjl77Nl24/cgcSbQC/CPEhSoJwvLLKGJZJbIF4DsGo4jrVDbuARXfmUt9S6vCEEr++o3fbbZ17iLZ0QH0A==", + "dependencies": { + "vscode-jsonrpc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.3.0.tgz", + "integrity": "sha512-a4dTM+nU6C9fNVfcZuJODpSiVsFNx/u5dwkEBbbPtftUhnnwlO9tacnudhKoY9+FVpSlgQ3QTR9rltRm0U8nhg==" + } + } + }, + "vscode-languageserver-types": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.3.0.tgz", + "integrity": "sha512-5BMClM4D3mRl5JlWFxIxhhJAbcVW9dFviz8ubppmG8epCTzl1bPpndcnvsjOjUlVsO9V8l8Ktklqc70Ew6soew==" + }, + "which": { + "version": "1.2.14", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.14.tgz", + "integrity": "sha1-mofEN48D6CfOyvGs31bHNsAcFOU=", + "dev": true + }, + "widest-line": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/widest-line/-/widest-line-1.0.0.tgz", + "integrity": "sha1-DAnIXCqUaD0Nfq+O4JfVZL8OEFw=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + } + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write-file-atomic": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-2.1.0.tgz", + "integrity": "sha512-0TZ20a+xcIl4u0+Mj5xDH2yOWdmQiXlKf9Hm+TgDXjTMsEYb+gDrmb8e8UNAzMCitX8NBqG4Z/FUQIyzv/R1JQ==", + "dev": true + }, + "xdg-basedir": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/xdg-basedir/-/xdg-basedir-3.0.0.tgz", + "integrity": "sha1-SWsswQnsqNus/i3HK2A8F8WHCtQ=", + "dev": true + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "dev": true, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.8.0.tgz", + "integrity": "sha1-eUUK/yKyqcWkHvVOAtuQfM+/nuI=", + "dev": true + }, + "yazl": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.2.tgz", + "integrity": "sha1-FMsZCD4eJacAksFYiqvg9OTdTYg=", + "dev": true + } + } +} diff --git a/package.json b/package.json index 911aaa6..9e6f65d 100644 --- a/package.json +++ b/package.json @@ -10,7 +10,7 @@ "version": "0.13.2", "publisher": "rbbit", "engines": { - "vscode": "^1.6.0", + "vscode": "^1.13.0", "node": ">=6.0.0", "npm": ">=3.9.5" }, @@ -36,31 +36,31 @@ "homepage": "https://buehler.github.io/typescript-hero/", "scripts": { "vscode:prepublish": "npm install && npm run build && npm prune --production", - "predevelop": "yarn del ./out", + "predevelop": "del-cli ./out", "develop": "tsc", "postinstall": "node ./node_modules/vscode/bin/install", - "pretest": "yarn del ./out && tsc -p ./config/tsconfig.test.json && yarn run lint", + "pretest": "del-cli ./out && tsc -p ./config/tsconfig.test.json && npm run lint", "test": "node ./node_modules/vscode/bin/test", "lint": "tslint -c tslint.json --project ./config/tsconfig.build.json", - "build": "yarn del ./out && tsc -p ./config/tsconfig.build.json", - "package": "yarn run build && yarn del './*.vsix' && vsce package" + "build": "del-cli ./out && tsc -p ./config/tsconfig.build.json", + "package": "npm run build && del-cli './*.vsix' && vsce package" }, "devDependencies": { "@types/chai": "^4.0.0", "@types/mocha": "^2.2.39", - "@types/node": "^7.0.27", + "@types/node": "^7.0.31", "@types/reflect-metadata": "0.0.5", "@types/sinon": "^2.3.0", - "@types/sinon-chai": "^2.7.27", - "chai": "^4.0.1", + "@types/sinon-chai": "^2.7.28", + "chai": "^4.0.2", "del-cli": "^1.0.0", "filewalker": "^0.1.3", "mocha-testdata": "^1.2.0", - "sinon": "^2.3.2", - "sinon-chai": "^2.8.0", - "tslint": "^5.4.2", - "tslint-config-airbnb": "^5.0.1", - "tsutils": "^2.3.0", + "sinon": "^2.3.4", + "sinon-chai": "^2.11.0", + "tslint": "^5.4.3", + "tslint-config-airbnb": "^5.1.2", + "tsutils": "^2.4.0", "vscode": "^1.0.3" }, "dependencies": { @@ -70,9 +70,9 @@ "ts-json-serializer": "^1.2.4", "tslib": "^1.5.0", "typescript": "^2.3.4", - "vscode-languageclient": "^3.0.4", - "vscode-languageserver": "^3.0.5", - "vscode-languageserver-types": "^3.0.3" + "vscode-languageclient": "^3.3.0", + "vscode-languageserver": "^3.3.0", + "vscode-languageserver-types": "^3.3.0" }, "activationEvents": [ "onLanguage:typescript", @@ -82,27 +82,27 @@ "commands": [ { "command": "typescriptHero.resolve.addImport", - "title": "Typescript: Add an import to current file" + "title": "TS Hero: Add an import to current file" }, { "command": "typescriptHero.resolve.addImportUnderCursor", - "title": "Typescript: Adds the current symbol under the cursor as an import to current file" + "title": "TS Hero: Adds the current symbol under the cursor as an import to current file" }, { "command": "typescriptHero.resolve.addMissingImports", - "title": "Typescript: Adds all missing imports for the open document" + "title": "TS Hero: Adds all missing imports for the open document" }, { "command": "typescriptHero.resolve.organizeImports", - "title": "Typescript: Organize imports (sort and remove unused)" + "title": "TS Hero: Organize imports (sort and remove unused)" }, { "command": "typescriptHero.resolve.rebuildCache", - "title": "Typescript: Rebuild the resolver cache" + "title": "TS Hero: Rebuild the resolver cache" }, { "command": "typescriptHero.codeFix.executeCodeAction", - "title": "Typescript: Execute a code action" + "title": "TS Hero (internal): Execute a code action" } ], "keybindings": [ @@ -175,21 +175,87 @@ "type": "number", "minimum": 1, "multipleOf": 1, - "default": 120, + "default": 125, "description": "Defines the threshold when an import should be wrapped into a multiline import." }, - "typescriptHero.resolver.newImportLocation": { - "enum": [ - "TopOfFile", - "AtCursorLocation" - ], - "default": "TopOfFile", - "description": "Defines the location of new imports." + "typescriptHero.resolver.multiLineTrailingComma": { + "type": "boolean", + "default": true, + "description": "Defined if multi line imports contain the last trailing comma." }, "typescriptHero.resolver.disableImportsSorting": { "type": "boolean", "default": false, - "description": "Defines if sorting is disable during organize imports" + "description": "Defines if sorting is disable during organize imports." + }, + "typescriptHero.resolver.importGroups": { + "type": "array", + "items": { + "anyOf": [ + { + "enum": [ + "Modules", + "Plains", + "Workspace", + "Remaining" + ] + }, + { + "type": "string", + "pattern": "\\/[A-Za-z-_0-9]+\\/" + }, + { + "type": "object", + "properties": { + "identifier": { + "enum": [ + "Modules", + "Plains", + "Workspace", + "Remaining" + ] + }, + "order": { + "enum": [ + "asc", + "desc" + ] + } + }, + "additionalProperties": false, + "required": [ + "identifier", + "order" + ] + }, + { + "type": "object", + "properties": { + "identifier": { + "type": "string", + "pattern": "\\/[A-Za-z-_0-9]+\\/" + }, + "order": { + "enum": [ + "asc", + "desc" + ] + } + }, + "additionalProperties": false, + "required": [ + "identifier", + "order" + ] + } + ] + }, + "default": [ + "Plains", + "Modules", + "Workspace" + ], + "description": "Defines the groups of the imports ordering. Multiple groups possible, see readme for instructions." } } } diff --git a/prepare-release.js b/prepare-release.js index d0a9e36..3775302 100755 --- a/prepare-release.js +++ b/prepare-release.js @@ -29,6 +29,7 @@ exec(`git commit -m "Update changelog to v${versionNumber}"`); console.log('Update package.json version'); -exec(`yarn version --new-version ${versionNumber} --no-git-tag-version`); +exec(`npm --no-git-tag-version version ${versionNumber}`); exec('git add package.json'); +exec('git add package-lock.json'); exec(`git commit -m "Update package.json to v${versionNumber}"`); diff --git a/src/common/communication/index.ts b/src/common/communication/index.ts index 4f777bd..e9d4764 100644 --- a/src/common/communication/index.ts +++ b/src/common/communication/index.ts @@ -1,6 +1,6 @@ import { injectable } from 'inversify'; import { TsSerializer } from 'ts-json-serializer'; -import { GenericNotificationHandler, GenericRequestHandler } from 'vscode-jsonrpc'; +import { GenericNotificationHandler, GenericRequestHandler } from 'vscode-languageclient'; /** * List of notifications that are passed between the client and the server. @@ -27,13 +27,15 @@ export enum Request { /** * Type for the connection endpoint. Is used for the communication between server and client. + * + * @interface ConnectionEndpoint */ -type ConnectionEndpoint = { +interface ConnectionEndpoint { sendNotification: (method: string, params: any) => void; sendRequest: (method: string, params: any) => Thenable; onNotification: (method: string, handler: GenericNotificationHandler) => void; onRequest: (method: string, handler: GenericRequestHandler) => void; -}; +} /** * Base connection class. Does provide the basic functionallity to send and receive notifications. @@ -130,7 +132,7 @@ export abstract class Connection { } this.handler[method].push(handler); } - + /** * Registers a notification handler to the connection. It is assumed, that the notification contains * serialized arguments. The serializer will attempt to deserialize the arguments and thus may fail. diff --git a/src/common/config/ResolverConfig.ts b/src/common/config/ResolverConfig.ts index 79c41b5..b3a7821 100644 --- a/src/common/config/ResolverConfig.ts +++ b/src/common/config/ResolverConfig.ts @@ -1,4 +1,5 @@ -import { GenerationOptions, ImportLocation } from '../ts-generation'; +import { ImportGroup } from '../../extension/import-grouping'; +import { GenerationOptions } from '../ts-generation'; /** * Configuration interface for the resolver extension. @@ -55,13 +56,19 @@ export interface ResolverConfig { multiLineWrapThreshold: number; /** - * Where the new imports should be added (e.g. top of the file, current cursor location, etc). - * + * If a multiline named import should contain the last trailing comma. + * * @readonly - * @type {ImportLocation} + * @type {boolean} * @memberof ResolverConfig + * + * @example + * import { + * Foo, + * Bar, << + * } from 'whatever'; */ - newImportLocation: ImportLocation; + multiLineTrailingComma: boolean; /** * Returns the tab size that is configured in vscode. @@ -80,6 +87,14 @@ export interface ResolverConfig { */ disableImportSorting: boolean; + /** + * Returns the configured import groups. On a parsing error, a default should be provided. + * + * @type {ImportGroup[]} + * @memberof ResolverConfig + */ + importGroups: ImportGroup[]; + /** * All information that are needed to print an import. * diff --git a/src/common/helpers/DeclarationIndexHelpers.ts b/src/common/helpers/DeclarationIndexHelpers.ts index dd3bd51..f71eb22 100644 --- a/src/common/helpers/DeclarationIndexHelpers.ts +++ b/src/common/helpers/DeclarationIndexHelpers.ts @@ -1,6 +1,7 @@ +import { join, normalize, parse, relative } from 'path'; + import { DeclarationInfo, DefaultDeclaration } from '../ts-parsing/declarations'; import { DefaultImport, ExternalModuleImport, Import, NamedImport, NamespaceImport } from '../ts-parsing/imports'; -import { join, normalize, parse, relative } from 'path'; /** * Calculates a list of declarationInfos filtered by the already imported ones in the given document. @@ -9,15 +10,15 @@ import { join, normalize, parse, relative } from 'path'; * @export * @param {ResolveIndex} resolveIndex * @param {string} documentPath - * @param {string} rootPath * @param {TsImport[]} imports + * @param {string} [rootPath] * @returns {DeclarationInfo[]} */ export function getDeclarationsFilteredByImports( declarationInfos: DeclarationInfo[], documentPath: string, - rootPath: string, imports: Import[], + rootPath?: string, ): DeclarationInfo[] { let declarations = declarationInfos; @@ -47,11 +48,11 @@ export function getDeclarationsFilteredByImports( * * @param {string} library Name of the library * @param {string} actualFilePath Filepath of the actually open file - * @param {string} rootPath Root path of the workspace + * @param {string} [rootPath] Root path of the workspace * @returns {string} Absolut path from the workspace root to the desired library */ -export function getAbsolutLibraryName(library: string, actualFilePath: string, rootPath: string): string { - if (!library.startsWith('.')) { +export function getAbsolutLibraryName(library: string, actualFilePath: string, rootPath?: string): string { + if (!library.startsWith('.') || !rootPath) { return library; } return '/' + relative( @@ -68,11 +69,11 @@ export function getAbsolutLibraryName(library: string, actualFilePath: string, r * * @param {string} library Name of the library * @param {string} actualFilePath Filepath of the actually open file - * @param {string} rootPath Root path of the workspace + * @param {string} [rootPath] Root path of the workspace * @returns {string} Relative path from the actual file to the library */ -export function getRelativeLibraryName(library: string, actualFilePath: string, rootPath: string): string { - if (!library.startsWith('/')) { +export function getRelativeLibraryName(library: string, actualFilePath: string, rootPath?: string): string { + if (!library.startsWith('/') || !rootPath) { return library; } diff --git a/src/common/helpers/ImportHelpers.ts b/src/common/helpers/ImportHelpers.ts index 85be4c7..e8ede01 100644 --- a/src/common/helpers/ImportHelpers.ts +++ b/src/common/helpers/ImportHelpers.ts @@ -1,4 +1,3 @@ -import { ImportLocation } from '../ts-generation'; import { Position, TextEditor } from 'vscode'; /** @@ -6,16 +5,12 @@ import { Position, TextEditor } from 'vscode'; * Does respect the "use strict" string as first line of a document. * * @export - * @param {ImportLocation} location - * @param {TextEditor} editor + * @param {TextEditor | undefined} editor * @returns {Position} */ -export function getImportInsertPosition(location: ImportLocation, editor: TextEditor): Position { +export function getImportInsertPosition(editor: TextEditor | undefined): Position { if (!editor) { return new Position(0, 0); } - if (location === ImportLocation.TopOfFile) { - return editor.document.lineAt(0).text.match(/use strict/) ? new Position(1, 0) : new Position(0, 0); - } - return new Position(editor.selection.active.line, 0); + return editor.document.lineAt(0).text.match(/use strict/) ? new Position(1, 0) : new Position(0, 0); } diff --git a/src/common/ts-generation/GenerationOptions.ts b/src/common/ts-generation/GenerationOptions.ts index 702fe82..0c50c4d 100644 --- a/src/common/ts-generation/GenerationOptions.ts +++ b/src/common/ts-generation/GenerationOptions.ts @@ -8,6 +8,7 @@ * @property {string} eol Defines end of line character (semicolon or nothing) * @property {boolean} spaceBraces Defines if the symbols should have spacing in the braces ({ Foo } or {Foo}). * @property {number} multiLineWrapThreshold The threshold where an import is written as multiline. + * @property {boolean} multiLineTrailingComma Defines if the last line of a multiline import should have a comma. * @property {number} tabSize How many spaces of indentiation. */ export type GenerationOptions = { @@ -15,5 +16,6 @@ export type GenerationOptions = { eol: '' | ';', spaceBraces: boolean, multiLineWrapThreshold: number, + multiLineTrailingComma: boolean, tabSize: number, }; diff --git a/src/common/ts-generation/ImportLocation.ts b/src/common/ts-generation/ImportLocation.ts deleted file mode 100644 index db5453d..0000000 --- a/src/common/ts-generation/ImportLocation.ts +++ /dev/null @@ -1,10 +0,0 @@ -/** - * Where a new import should be located. - * - * @export - * @enum {number} - */ -export enum ImportLocation { - TopOfFile, - AtCursorLocation, -} diff --git a/src/common/ts-generation/index.ts b/src/common/ts-generation/index.ts index b53b7ed..d3cfa40 100644 --- a/src/common/ts-generation/index.ts +++ b/src/common/ts-generation/index.ts @@ -1,3 +1,2 @@ export * from './Generatable'; export * from './GenerationOptions'; -export * from './ImportLocation'; diff --git a/src/common/ts-parsing/imports/DefaultImport.ts b/src/common/ts-parsing/imports/DefaultImport.ts index 0df6419..7c9d997 100644 --- a/src/common/ts-parsing/imports/DefaultImport.ts +++ b/src/common/ts-parsing/imports/DefaultImport.ts @@ -27,7 +27,7 @@ export class DefaultImport implements AliasedImport { * @memberof DefaultImport */ public generateTypescript({ stringQuoteStyle, eol }: GenerationOptions): string { - return `import ${this.alias} from ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}\n`; + return `import ${this.alias} from ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}`; } /** diff --git a/src/common/ts-parsing/imports/ExternalModuleImport.ts b/src/common/ts-parsing/imports/ExternalModuleImport.ts index c3b415c..b735585 100644 --- a/src/common/ts-parsing/imports/ExternalModuleImport.ts +++ b/src/common/ts-parsing/imports/ExternalModuleImport.ts @@ -27,7 +27,7 @@ export class ExternalModuleImport implements AliasedImport { * @memberof ExternalModuleImport */ public generateTypescript({ stringQuoteStyle, eol }: GenerationOptions): string { - return `import ${this.alias} = require(${stringQuoteStyle}${this.libraryName}${stringQuoteStyle})${eol}\n`; + return `import ${this.alias} = require(${stringQuoteStyle}${this.libraryName}${stringQuoteStyle})${eol}`; } /** diff --git a/src/common/ts-parsing/imports/NamedImport.ts b/src/common/ts-parsing/imports/NamedImport.ts index 1a2a62d..5f77f28 100644 --- a/src/common/ts-parsing/imports/NamedImport.ts +++ b/src/common/ts-parsing/imports/NamedImport.ts @@ -1,8 +1,13 @@ import { GenerationOptions } from '../../ts-generation'; +import { stringTemplate } from '../../utilities/StringTemplate'; import { SymbolSpecifier } from '../SymbolSpecifier'; import { Import } from './Import'; import { Serializable } from 'ts-json-serializer'; +const multiLineImport = stringTemplate`import { +${0}${1} +} from ${2}`; + /** * Basic typescript import (ES6 style). Does contain multiple symbols of a file and converts * itself to a multiline import if the threshold is reached. @@ -43,7 +48,7 @@ export class NamedImport implements Import { const lib = this.libraryName; const importString = - `import {${space}${specifiers}${space}} from ${stringQuoteStyle}${lib}${stringQuoteStyle}${eol}\n`; + `import {${space}${specifiers}${space}} from ${stringQuoteStyle}${lib}${stringQuoteStyle}${eol}`; if (importString.length > multiLineWrapThreshold) { return this.toMultiLineImport(options); } @@ -71,11 +76,16 @@ export class NamedImport implements Import { * * @memberof NamedImport */ - public toMultiLineImport({ eol, stringQuoteStyle, tabSize }: GenerationOptions): string { + public toMultiLineImport({ eol, stringQuoteStyle, tabSize, multiLineTrailingComma }: GenerationOptions): string { const spacings = Array(tabSize + 1).join(' '); - return `import { -${this.specifiers.sort(this.specifierSort).map(o => `${spacings}${o.generateTypescript()}`).join(',\n')} -} from ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}\n`; + return multiLineImport( + this.specifiers.sort(this.specifierSort).map(o => `${spacings}${o.generateTypescript()}`).join(',\n'), + multiLineTrailingComma ? ',' : '', + `${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}`, + ); +// return `import { +// ${this.specifiers.sort(this.specifierSort).map(o => `${spacings}${o.generateTypescript()}`).join(',\n')} +// } from ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}`; } /** diff --git a/src/common/ts-parsing/imports/NamespaceImport.ts b/src/common/ts-parsing/imports/NamespaceImport.ts index 1224c3d..a5c239c 100644 --- a/src/common/ts-parsing/imports/NamespaceImport.ts +++ b/src/common/ts-parsing/imports/NamespaceImport.ts @@ -26,7 +26,7 @@ export class NamespaceImport implements AliasedImport { * @memberof NamespaceImport */ public generateTypescript({ stringQuoteStyle, eol }: GenerationOptions): string { - return `import * as ${this.alias} from ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}\n`; + return `import * as ${this.alias} from ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}`; } /** diff --git a/src/common/ts-parsing/imports/StringImport.ts b/src/common/ts-parsing/imports/StringImport.ts index aba44f1..2728fd2 100644 --- a/src/common/ts-parsing/imports/StringImport.ts +++ b/src/common/ts-parsing/imports/StringImport.ts @@ -26,7 +26,7 @@ export class StringImport implements Import { * @memberof StringImport */ public generateTypescript({ stringQuoteStyle, eol }: GenerationOptions): string { - return `import ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}\n`; + return `import ${stringQuoteStyle}${this.libraryName}${stringQuoteStyle}${eol}`; } /** diff --git a/src/common/utilities/StringTemplate.ts b/src/common/utilities/StringTemplate.ts new file mode 100644 index 0000000..b42767b --- /dev/null +++ b/src/common/utilities/StringTemplate.ts @@ -0,0 +1,19 @@ +/** + * Creates a template from an expression string. The template can then be used to infuse stuff into the template. + * + * @export + * @param {string[]} strings + * @param {...number[]} keys + * @returns {(...values: any[]) => string} + */ +export function stringTemplate(strings: TemplateStringsArray, ...keys: number[]): (...values: any[]) => string { + return (...values: any[]) => { + const result = [strings[0]]; + + keys.forEach((key, idx) => { + result.push(values[key], strings[idx + 1]); + }); + + return result.join(''); + }; +} diff --git a/src/extension/VscodeExtensionConfig.ts b/src/extension/VscodeExtensionConfig.ts index 84f513f..d7ba229 100644 --- a/src/extension/VscodeExtensionConfig.ts +++ b/src/extension/VscodeExtensionConfig.ts @@ -1,8 +1,10 @@ -import { ExtensionConfig, ResolverConfig } from '../common/config'; -import { ImportLocation, GenerationOptions } from '../common/ts-generation'; import { injectable } from 'inversify'; import { workspace } from 'vscode'; +import { ExtensionConfig, ResolverConfig } from '../common/config'; +import { GenerationOptions } from '../common/ts-generation'; +import { ImportGroup, ImportGroupSetting, ImportGroupSettingParser, RemainImportGroup } from './import-grouping'; + const sectionKey = 'typescriptHero'; /** @@ -24,7 +26,7 @@ export class VscodeExtensionConfig implements ExtensionConfig { * @memberof VscodeExtensionConfig */ public get verbosity(): string { - return workspace.getConfiguration(sectionKey).get('verbosity'); + return workspace.getConfiguration(sectionKey).get('verbosity') || 'Warning'; } /** @@ -54,7 +56,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get insertSpaceBeforeAndAfterImportBraces(): boolean { - return workspace.getConfiguration(sectionKey).get('resolver.insertSpaceBeforeAndAfterImportBraces'); + return workspace.getConfiguration(sectionKey).get('resolver.insertSpaceBeforeAndAfterImportBraces') || true; } /** @@ -66,7 +68,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get insertSemicolons(): boolean { - return workspace.getConfiguration(sectionKey).get('resolver.insertSemicolons'); + return workspace.getConfiguration(sectionKey).get('resolver.insertSemicolons') || true; } /** @@ -77,7 +79,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get stringQuoteStyle(): string { - return workspace.getConfiguration(sectionKey).get('resolver.stringQuoteStyle'); + return workspace.getConfiguration(sectionKey).get('resolver.stringQuoteStyle') || `'`; } /** @@ -89,7 +91,11 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get ignorePatterns(): string[] { - return workspace.getConfiguration(sectionKey).get('resolver.ignorePatterns'); + return workspace.getConfiguration(sectionKey).get('resolver.ignorePatterns') || [ + 'build', + 'out', + 'dist', + ]; } /** @@ -100,19 +106,24 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get multiLineWrapThreshold(): number { - return workspace.getConfiguration(sectionKey).get('resolver.multiLineWrapThreshold'); + return workspace.getConfiguration(sectionKey).get('resolver.multiLineWrapThreshold') || 125; } /** - * Where the new imports should be added (e.g. top of the file, current cursor location, etc). - * + * If a multiline named import should contain the last trailing comma. + * * @readonly - * @type {ImportLocation} + * @type {boolean} * @memberof VscodeResolverConfig + * + * @example + * import { + * Foo, + * Bar, << + * } from 'whatever'; */ - public get newImportLocation(): ImportLocation { - const configString = workspace.getConfiguration(sectionKey).get('resolver.newImportLocation'); - return ImportLocation[configString]; + public get multiLineTrailingComma(): boolean { + return workspace.getConfiguration(sectionKey).get('resolver.multiLineTrailingComma') || true; } /** @@ -123,7 +134,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof ResolverConfig */ public get disableImportSorting(): boolean { - return workspace.getConfiguration(sectionKey).get('resolver.disableImportsSorting'); + return workspace.getConfiguration(sectionKey).get('resolver.disableImportsSorting') || false; } /** @@ -134,7 +145,33 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get tabSize(): number { - return workspace.getConfiguration().get('editor.tabSize'); + return workspace.getConfiguration().get('editor.tabSize') || 4; + } + + /** + * Returns the configured import groups. On a parsing error, the default is used. + * + * @type {ImportGroup[]} + * @memberof VscodeResolverConfig + */ + public get importGroups(): ImportGroup[] { + const groups = workspace.getConfiguration(sectionKey).get('resolver.importGroups'); + let importGroups: ImportGroup[] = []; + + try { + if (groups) { + importGroups = groups.map(g => ImportGroupSettingParser.parseSetting(g)); + } else { + importGroups = ImportGroupSettingParser.default; + } + } catch (e) { + importGroups = ImportGroupSettingParser.default; + } + if (!importGroups.some(i => i instanceof RemainImportGroup)) { + importGroups.push(new RemainImportGroup()); + } + + return importGroups; } /** @@ -148,6 +185,7 @@ class VscodeResolverConfig implements ResolverConfig { return { eol: this.insertSemicolons ? ';' : '', multiLineWrapThreshold: this.multiLineWrapThreshold, + multiLineTrailingComma: this.multiLineTrailingComma, spaceBraces: this.insertSpaceBeforeAndAfterImportBraces, stringQuoteStyle: this.stringQuoteStyle, tabSize: this.tabSize, diff --git a/src/extension/code-actions/CodeActionCreator.ts b/src/extension/code-actions/CodeActionCreator.ts index f97c15a..d026d49 100644 --- a/src/extension/code-actions/CodeActionCreator.ts +++ b/src/extension/code-actions/CodeActionCreator.ts @@ -50,9 +50,9 @@ export abstract class CodeActionCreator { */ protected createCommand(title: string, codeAction: CodeAction): Command { return { + title, arguments: [codeAction], command: 'typescriptHero.codeFix.executeCodeAction', - title, }; } } diff --git a/src/extension/code-actions/MissingImplementationInClassCreator.ts b/src/extension/code-actions/MissingImplementationInClassCreator.ts index 9e7cfc0..780fbcf 100644 --- a/src/extension/code-actions/MissingImplementationInClassCreator.ts +++ b/src/extension/code-actions/MissingImplementationInClassCreator.ts @@ -1,3 +1,6 @@ +import { injectable } from 'inversify'; +import { Command, Diagnostic, TextDocument, workspace } from 'vscode'; + import { getAbsolutLibraryName } from '../../common/helpers'; import { TypescriptParser } from '../../common/ts-parsing'; import { ClassLikeDeclaration, GenericDeclaration } from '../../common/ts-parsing/declarations/Declaration'; @@ -5,8 +8,6 @@ import { NamedImport } from '../../common/ts-parsing/imports'; import { CalculatedDeclarationIndex } from '../declarations/CalculatedDeclarationIndex'; import { ImplementPolymorphElements, NoopCodeAction } from './CodeAction'; import { CodeActionCreator } from './CodeActionCreator'; -import { injectable } from 'inversify'; -import { Command, Diagnostic, TextDocument, workspace } from 'vscode'; /** * Action creator that handles missing implementations in a class. diff --git a/src/extension/extensions/CodeCompletionExtension.ts b/src/extension/extensions/CodeCompletionExtension.ts index caee355..b1bb043 100644 --- a/src/extension/extensions/CodeCompletionExtension.ts +++ b/src/extension/extensions/CodeCompletionExtension.ts @@ -1,19 +1,3 @@ -import { ExtensionConfig } from '../../common/config'; -import { - getAbsolutLibraryName, - getDeclarationsFilteredByImports, - getImportInsertPosition, - getRelativeLibraryName, -} from '../../common/helpers'; -import { SymbolSpecifier, TypescriptParser } from '../../common/ts-parsing'; -import { DeclarationInfo, DefaultDeclaration, ModuleDeclaration } from '../../common/ts-parsing/declarations'; -import { NamedImport, NamespaceImport } from '../../common/ts-parsing/imports'; -import { File } from '../../common/ts-parsing/resources'; -import { Logger, LoggerFactory } from '../../common/utilities'; -import { CalculatedDeclarationIndex } from '../declarations/CalculatedDeclarationIndex'; -import { importRange } from '../helpers'; -import { iocSymbols } from '../IoCSymbols'; -import { BaseExtension } from './BaseExtension'; import { inject, injectable } from 'inversify'; import { CancellationToken, @@ -23,11 +7,17 @@ import { languages, Position, TextDocument, - TextEdit, - window, workspace, } from 'vscode'; +import { getDeclarationsFilteredByImports } from '../../common/helpers'; +import { TypescriptParser } from '../../common/ts-parsing'; +import { Logger, LoggerFactory } from '../../common/utilities'; +import { CalculatedDeclarationIndex } from '../declarations/CalculatedDeclarationIndex'; +import { iocSymbols } from '../IoCSymbols'; +import { ImportManager } from '../managers/ImportManager'; +import { BaseExtension } from './BaseExtension'; + /** * Extension that provides code completion for typescript files. Uses the calculated index to provide information. * @@ -43,7 +33,6 @@ export class CodeCompletionExtension extends BaseExtension implements Completion constructor( @inject(iocSymbols.extensionContext) context: ExtensionContext, @inject(iocSymbols.loggerFactory) loggerFactory: LoggerFactory, - @inject(iocSymbols.configuration) private config: ExtensionConfig, private parser: TypescriptParser, private index: CalculatedDeclarationIndex, ) { @@ -114,82 +103,31 @@ export class CodeCompletionExtension extends BaseExtension implements Completion this.logger.info('Search completion for word.', { searchWord }); const parsed = await this.parser.parseSource(document.getText()); + const manager = await ImportManager.create(document); const declarations = getDeclarationsFilteredByImports( this.index.declarationInfos, document.fileName, - workspace.rootPath, parsed.imports, + workspace.rootPath, ) .filter(o => !parsed.declarations.some(d => d.name === o.declaration.name)) .filter(o => !parsed.usages.some(d => d === o.declaration.name)); - return declarations - .filter(o => o.declaration.name.toLowerCase().indexOf(searchWord.toLowerCase()) >= 0) - .map((o) => { - const item = new CompletionItem(o.declaration.name, o.declaration.itemKind); - item.detail = o.from; - item.sortText = o.declaration.intellisenseSortKey; - item.additionalTextEdits = this.calculateTextEdits(o, document, parsed); - return item; - }); - } - - /** - * - * - * @private - * @param {DeclarationInfo} declaration - * @param {TextDocument} document - * @param {File} parsedSource - * @returns {TextEdit[]} - * - * @memberof CodeCompletionExtension - */ - private calculateTextEdits(declaration: DeclarationInfo, document: TextDocument, parsedSource: File): TextEdit[] { - const imp = parsedSource.imports.find((o) => { - if (o instanceof NamedImport) { - const importedLib = getAbsolutLibraryName(o.libraryName, document.fileName, workspace.rootPath); - return importedLib === declaration.from; - } - return false; - }); - - if (imp && imp instanceof NamedImport) { - const modifiedImp = imp.clone(); - modifiedImp.specifiers.push(new SymbolSpecifier(declaration.declaration.name)); - - return [ - TextEdit.replace( - importRange(document, imp.start, imp.end), - modifiedImp.generateTypescript(this.config.resolver.generationOptions), - ), - ]; - } else if (declaration.declaration instanceof ModuleDeclaration) { - const mod = new NamespaceImport(declaration.from, declaration.declaration.name); - return [ - TextEdit.insert( - getImportInsertPosition( - this.config.resolver.newImportLocation, window.activeTextEditor, - ), - mod.generateTypescript(this.config.resolver.generationOptions), - ), - ]; - } else if (declaration.declaration instanceof DefaultDeclaration) { - // TODO: when the completion starts, the command should add the text edit. - } else { - const library = getRelativeLibraryName(declaration.from, document.fileName, workspace.rootPath); - const named = new NamedImport(library); - named.specifiers.push(new SymbolSpecifier(declaration.declaration.name)); - return [ - TextEdit.insert( - getImportInsertPosition( - this.config.resolver.newImportLocation, window.activeTextEditor, - ), - named.generateTypescript(this.config.resolver.generationOptions), - ), - ]; + const items: CompletionItem[] = []; + for (const declaration of declarations.filter( + o => o.declaration.name.toLowerCase().indexOf(searchWord.toLowerCase()) >= 0) + ) { + const item = new CompletionItem(declaration.declaration.name, declaration.declaration.itemKind); + + manager.addDeclarationImport(declaration); + item.detail = declaration.from; + item.sortText = declaration.declaration.intellisenseSortKey; + item.additionalTextEdits = manager.calculateTextEdits(); + items.push(item); + + manager.reset(); } - return []; + return items; } } diff --git a/src/extension/extensions/ImportResolveExtension.ts b/src/extension/extensions/ImportResolveExtension.ts index 332ef6b..b45bed1 100644 --- a/src/extension/extensions/ImportResolveExtension.ts +++ b/src/extension/extensions/ImportResolveExtension.ts @@ -1,3 +1,8 @@ +import { existsSync } from 'fs'; +import { inject, injectable } from 'inversify'; +import { join } from 'path'; +import { commands, ExtensionContext, StatusBarAlignment, StatusBarItem, Uri, window, workspace } from 'vscode'; + import { Notification } from '../../common/communication'; import { ExtensionConfig } from '../../common/config'; import { getDeclarationsFilteredByImports } from '../../common/helpers'; @@ -11,10 +16,6 @@ import { iocSymbols } from '../IoCSymbols'; import { ImportManager } from '../managers'; import { ClientConnection } from '../utilities/ClientConnection'; import { BaseExtension } from './BaseExtension'; -import { existsSync } from 'fs'; -import { inject, injectable } from 'inversify'; -import { join } from 'path'; -import { commands, ExtensionContext, StatusBarAlignment, StatusBarItem, Uri, window, workspace } from 'vscode'; type DeclarationsForImportOptions = { cursorSymbol: string, documentSource: string, documentPath: string }; type MissingDeclarationsForFileOptions = { documentSource: string, documentPath: string }; @@ -96,7 +97,7 @@ export async function findFiles(config: ExtensionConfig): Promise { uris = uris.map((o, idx) => idx === 0 ? o.filter( f => f.fsPath - .replace(workspace.rootPath, '') + .replace(workspace.rootPath || '', '') .split(/\\|\//) .every(p => excludePatterns.indexOf(p) < 0)) : o, @@ -156,7 +157,6 @@ export class ImportResolveExtension extends BaseExtension { Notification.IndexCreationRunning, () => this.statusBarItem.text = resolverSyncing, ); - // TODO: readd add Import. this.context.subscriptions.push( commands.registerTextEditorCommand('typescriptHero.resolve.addImport', () => this.addImport()), ); @@ -255,6 +255,9 @@ export class ImportResolveExtension extends BaseExtension { * @memberof ImportResolveExtension */ private async addImportUnderCursor(): Promise { + if (!window.activeTextEditor) { + return; + } if (!this.index.indexReady) { this.showCacheWarning(); return; @@ -302,6 +305,9 @@ export class ImportResolveExtension extends BaseExtension { * @memberof ImportResolveExtension */ private async addMissingImports(): Promise { + if (!window.activeTextEditor) { + return; + } if (!this.index.indexReady) { this.showCacheWarning(); return; @@ -332,6 +338,9 @@ export class ImportResolveExtension extends BaseExtension { * @memberof ImportResolveExtension */ private async organizeImports(): Promise { + if (!window.activeTextEditor) { + return false; + } try { const ctrl = await ImportManager.create(window.activeTextEditor.document); return await ctrl.organizeImports().commit(); @@ -351,6 +360,9 @@ export class ImportResolveExtension extends BaseExtension { * @memberof ImportResolveExtension */ private async addImportToDocument(declaration: DeclarationInfo): Promise { + if (!window.activeTextEditor) { + return false; + } const ctrl = await ImportManager.create(window.activeTextEditor.document); return await ctrl.addDeclarationImport(declaration).commit(); } @@ -405,8 +417,8 @@ export class ImportResolveExtension extends BaseExtension { const declarations = getDeclarationsFilteredByImports( this.index.declarationInfos, documentPath, - workspace.rootPath, parsedSource.imports, + workspace.rootPath, ).filter(o => o.declaration.name.startsWith(cursorSymbol)); return [ @@ -433,8 +445,8 @@ export class ImportResolveExtension extends BaseExtension { const declarations = getDeclarationsFilteredByImports( this.index.declarationInfos, documentPath, - workspace.rootPath, parsedDocument.imports, + workspace.rootPath, ); for (const usage of parsedDocument.nonLocalUsages) { diff --git a/src/extension/import-grouping/ImportGroup.ts b/src/extension/import-grouping/ImportGroup.ts new file mode 100644 index 0000000..634b361 --- /dev/null +++ b/src/extension/import-grouping/ImportGroup.ts @@ -0,0 +1,56 @@ +import { Generatable } from '../../common/ts-generation'; +import { Import } from '../../common/ts-parsing/imports'; +import { ImportGroupOrder } from './ImportGroupOrder'; + +/** + * Interface for an import group. A group contains a list of imports that are grouped and sorted + * together on organizing all imports and inserting new imports. + * + * @export + * @interface ImportGroup + * @extends {Generatable} + */ +export interface ImportGroup extends Generatable { + /** + * The readonly list of imports for this group. + * + * @type {Import[]} + * @memberof ImportGroup + */ + readonly imports: Import[]; + + /** + * A sorted list of the imports of this group. + * + * @type {Import[]} + * @memberof ImportGroup + */ + readonly sortedImports: Import[]; + + /** + * The order of the imports (asc / desc). + * + * @type {ImportGroupOrder} + * @memberof ImportGroup + */ + order: ImportGroupOrder; + + /** + * Adds the given import to itself if it is the correct group for the import. Does return true if the import is + * handled, otherwise it must return false. + * + * @param {Import} tsImport + * @returns {boolean} + * + * @memberof ImportGroup + */ + processImport(tsImport: Import): boolean; + + /** + * Resets the import group (clears the imports). + * + * + * @memberof ImportGroup + */ + reset(): void; +} diff --git a/src/extension/import-grouping/ImportGroupIdentifierInvalidError.ts b/src/extension/import-grouping/ImportGroupIdentifierInvalidError.ts new file mode 100644 index 0000000..1173671 --- /dev/null +++ b/src/extension/import-grouping/ImportGroupIdentifierInvalidError.ts @@ -0,0 +1,13 @@ +/** + * Thrown when a import group identifier neither does match a keyword nor a regex pattern. + * + * @export + * @class ImportGroupIdentifierInvalidError + * @extends {Error} + */ +export class ImportGroupIdentifierInvalidError extends Error { + constructor(identifier: string) { + super(); + this.message = `The identifier "${identifier}" does not match a keyword or a regex pattern (/ .. /).`; + } +} diff --git a/src/extension/import-grouping/ImportGroupKeyword.ts b/src/extension/import-grouping/ImportGroupKeyword.ts new file mode 100644 index 0000000..23ea620 --- /dev/null +++ b/src/extension/import-grouping/ImportGroupKeyword.ts @@ -0,0 +1,12 @@ +/** + * Enum for the different special keywords of the KeywordImportGroup. + * + * @export + * @enum {number} + */ +export enum ImportGroupKeyword { + Modules, + Plains, + Workspace, + Remaining, +} diff --git a/src/extension/import-grouping/ImportGroupOrder.ts b/src/extension/import-grouping/ImportGroupOrder.ts new file mode 100644 index 0000000..57bb024 --- /dev/null +++ b/src/extension/import-grouping/ImportGroupOrder.ts @@ -0,0 +1,4 @@ +/** + * Import grouping order (asc / desc). + */ +export type ImportGroupOrder = 'asc' | 'desc'; diff --git a/src/extension/import-grouping/ImportGroupSettingParser.ts b/src/extension/import-grouping/ImportGroupSettingParser.ts new file mode 100644 index 0000000..7779da6 --- /dev/null +++ b/src/extension/import-grouping/ImportGroupSettingParser.ts @@ -0,0 +1,78 @@ +import { ImportGroup } from './ImportGroup'; +import { ImportGroupIdentifierInvalidError } from './ImportGroupIdentifierInvalidError'; +import { ImportGroupKeyword } from './ImportGroupKeyword'; +import { ImportGroupOrder } from './ImportGroupOrder'; +import { KeywordImportGroup } from './KeywordImportGroup'; +import { RegexImportGroup } from './RegexImportGroup'; +import { RemainImportGroup } from './RemainImportGroup'; + +/** + * Inserted setting that is contained in the settings.json of .vscode. + */ +export type ImportGroupSetting = string | { identifier: string, order: ImportGroupOrder }; + +/** + * Parser that takes the vscode - setting and creates import groups out of it. + * Contains a default if the parsing fails. + * + * @export + * @class ImportGroupSettingParser + */ +export class ImportGroupSettingParser { + /** + * Default value for the import groups. + * Contains the following: + * - Plain imports + * - Module imports + * - Workspace imports + * + * @readonly + * @static + * @type {ImportGroup[]} + * @memberof ImportGroupSettingParser + */ + public static get default(): ImportGroup[] { + return [ + new KeywordImportGroup(ImportGroupKeyword.Plains), + new KeywordImportGroup(ImportGroupKeyword.Modules), + new KeywordImportGroup(ImportGroupKeyword.Workspace), + new RemainImportGroup(), + ]; + } + + /** + * Function that takes a string or object ({@link ImportGroupSetting}) and parses an import group out of it. + * + * @static + * @param {ImportGroupSetting} setting + * @returns {ImportGroup} + * @throws {ImportGroupIdentifierInvalidError} When the identifier is invalid (neither keyword nor valid regex) + * + * @memberof ImportGroupSettingParser + */ + public static parseSetting(setting: ImportGroupSetting): ImportGroup { + let identifier: string; + let order: ImportGroupOrder = 'asc'; + + if (typeof setting === 'string') { + identifier = setting; + } else { + identifier = setting.identifier; + order = setting.order; + } + + if (/\/[A-Za-z-_0-9]+\//g.test(identifier)) { + return new RegexImportGroup(identifier, order); + } + + if (ImportGroupKeyword[identifier] === ImportGroupKeyword.Remaining) { + return new RemainImportGroup(order); + } + + if (ImportGroupKeyword[identifier] !== undefined) { + return new KeywordImportGroup(ImportGroupKeyword[identifier], order); + } + + throw new ImportGroupIdentifierInvalidError(identifier); + } +} diff --git a/src/extension/import-grouping/KeywordImportGroup.ts b/src/extension/import-grouping/KeywordImportGroup.ts new file mode 100644 index 0000000..e035613 --- /dev/null +++ b/src/extension/import-grouping/KeywordImportGroup.ts @@ -0,0 +1,113 @@ +import { GenerationOptions } from '../../common/ts-generation'; +import { Import, StringImport } from '../../common/ts-parsing/imports'; +import { importSort } from '../utilities/utilityFunctions'; +import { ImportGroup } from './ImportGroup'; +import { ImportGroupKeyword } from './ImportGroupKeyword'; +import { ImportGroupOrder } from './ImportGroupOrder'; + +/** + * Importgroup for keywords. Uses "Modules", "Plains", "Workspace" as a keyword and processes the corresponding imports. + * + * @export + * @class KeywordImportGroup + * @implements {ImportGroup} + */ +export class KeywordImportGroup implements ImportGroup { + public readonly imports: Import[] = []; + + public get sortedImports(): Import[] { + return this.imports.sort((i1, i2) => importSort(i1, i2, this.order)); + } + + constructor(public readonly keyword: ImportGroupKeyword, public readonly order: ImportGroupOrder = 'asc') { } + + public reset(): void { + this.imports.length = 0; + } + + public processImport(tsImport: Import): boolean { + switch (this.keyword) { + case ImportGroupKeyword.Modules: + return this.processModulesImport(tsImport); + case ImportGroupKeyword.Plains: + return this.processPlainsImport(tsImport); + case ImportGroupKeyword.Workspace: + return this.processWorkspaceImport(tsImport); + default: + return false; + } + } + + public generateTypescript(options: GenerationOptions): string { + if (!this.imports.length) { + return ''; + } + return this.sortedImports + .map(imp => imp.generateTypescript(options)) + .join('\n') + '\n'; + } + + /** + * Process a library import. + * @example import ... from 'vscode'; + * + * @private + * @param {Import} tsImport + * @returns {boolean} + * + * @memberof KeywordImportGroup + */ + private processModulesImport(tsImport: Import): boolean { + if ( + tsImport instanceof StringImport || + tsImport.libraryName.startsWith('.') || + tsImport.libraryName.startsWith('/') + ) { + return false; + } + this.imports.push(tsImport); + return true; + } + + /** + * Process a string only import. + * @example import 'reflect-metadata'; + * + * @private + * @param {Import} tsImport + * @returns {boolean} + * + * @memberof KeywordImportGroup + */ + private processPlainsImport(tsImport: Import): boolean { + if (!(tsImport instanceof StringImport)) { + return false; + } + this.imports.push(tsImport); + return true; + } + + /** + * Process a workspace import (not string nor lib import). + * @example import ... from './server'; + * + * @private + * @param {Import} tsImport + * @returns {boolean} + * + * @memberof KeywordImportGroup + */ + private processWorkspaceImport(tsImport: Import): boolean { + if ( + tsImport instanceof StringImport || + ( + !tsImport.libraryName.startsWith('.') && + !tsImport.libraryName.startsWith('/') + ) + ) { + return false; + } + this.imports.push(tsImport); + return true; + } +} diff --git a/src/extension/import-grouping/RegexImportGroup.ts b/src/extension/import-grouping/RegexImportGroup.ts new file mode 100644 index 0000000..a6e3784 --- /dev/null +++ b/src/extension/import-grouping/RegexImportGroup.ts @@ -0,0 +1,57 @@ +import { GenerationOptions } from '../../common/ts-generation'; +import { Import, StringImport } from '../../common/ts-parsing/imports'; +import { importSort } from '../utilities/utilityFunctions'; +import { ImportGroup } from './ImportGroup'; +import { ImportGroupOrder } from './ImportGroupOrder'; + +/** + * Importgroup that processes all imports that match a certain regex (the lib name). + * + * @export + * @class RegexImportGroup + * @implements {ImportGroup} + */ +export class RegexImportGroup implements ImportGroup { + public readonly imports: Import[] = []; + + public get sortedImports(): Import[] { + const sorted = this.imports.sort((i1, i2) => importSort(i1, i2, this.order)); + return [ + ...sorted.filter(i => i instanceof StringImport), + ...sorted.filter(i => !(i instanceof StringImport)), + ]; + } + + /** + * Creates an instance of RegexImportGroup. + * + * @param {string} regex The regex that is matched against the imports library name. + * @param {ImportGroupOrder} [order='asc'] + * + * @memberof RegexImportGroup + */ + constructor(public readonly regex: string, public readonly order: ImportGroupOrder = 'asc') { } + + public reset(): void { + this.imports.length = 0; + } + + public processImport(tsImport: Import): boolean { + const regex = new RegExp(this.regex.replace(/\//g, ''), 'g'); + + if (regex.test(tsImport.libraryName)) { + this.imports.push(tsImport); + return true; + } + return false; + } + + public generateTypescript(options: GenerationOptions): string { + if (!this.imports.length) { + return ''; + } + return this.sortedImports + .map(imp => imp.generateTypescript(options)) + .join('\n') + '\n'; + } +} diff --git a/src/extension/import-grouping/RemainImportGroup.ts b/src/extension/import-grouping/RemainImportGroup.ts new file mode 100644 index 0000000..932ee64 --- /dev/null +++ b/src/extension/import-grouping/RemainImportGroup.ts @@ -0,0 +1,44 @@ +import { GenerationOptions } from '../../common/ts-generation'; +import { Import, StringImport } from '../../common/ts-parsing/imports'; +import { importSort } from '../utilities/utilityFunctions'; +import { ImportGroup } from './ImportGroup'; +import { ImportGroupOrder } from './ImportGroupOrder'; + +/** + * Importgroup that processes all imports. Should be used if other groups don't process the import. + * + * @export + * @class RemainImportGroup + * @implements {ImportGroup} + */ +export class RemainImportGroup implements ImportGroup { + public readonly imports: Import[] = []; + + public get sortedImports(): Import[] { + const sorted = this.imports.sort((i1, i2) => importSort(i1, i2, this.order)); + return [ + ...sorted.filter(i => i instanceof StringImport), + ...sorted.filter(i => !(i instanceof StringImport)), + ]; + } + + constructor(public readonly order: ImportGroupOrder = 'asc') { } + + public reset(): void { + this.imports.length = 0; + } + + public processImport(tsImport: Import): boolean { + this.imports.push(tsImport); + return true; + } + + public generateTypescript(options: GenerationOptions): string { + if (!this.imports.length) { + return ''; + } + return this.sortedImports + .map(imp => imp.generateTypescript(options)) + .join('\n') + '\n'; + } +} diff --git a/src/extension/import-grouping/index.ts b/src/extension/import-grouping/index.ts new file mode 100644 index 0000000..bc2f2ba --- /dev/null +++ b/src/extension/import-grouping/index.ts @@ -0,0 +1,8 @@ +export * from './ImportGroup'; +export * from './ImportGroupKeyword'; +export * from './ImportGroupOrder'; +export * from './KeywordImportGroup'; +export * from './RegexImportGroup'; +export * from './RemainImportGroup'; +export * from './ImportGroupSettingParser'; +export * from './ImportGroupIdentifierInvalidError'; diff --git a/src/extension/managers/ImportManager.ts b/src/extension/managers/ImportManager.ts index c68fdce..b523b98 100644 --- a/src/extension/managers/ImportManager.ts +++ b/src/extension/managers/ImportManager.ts @@ -1,3 +1,5 @@ +import { InputBoxOptions, Range, TextDocument, TextEdit, window, workspace, WorkspaceEdit } from 'vscode'; + import { ExtensionConfig } from '../../common/config'; import { getAbsolutLibraryName, @@ -21,12 +23,11 @@ import { isAliasedImport } from '../../common/type-guards/TypescriptHeroGuards'; import { DeclarationIndex } from '../../server/indices/DeclarationIndex'; import { CalculatedDeclarationIndex } from '../declarations/CalculatedDeclarationIndex'; import { importRange } from '../helpers'; +import { ImportGroup } from '../import-grouping'; import { Container } from '../IoC'; import { iocSymbols } from '../IoCSymbols'; import { ImportProxy } from '../proxy-objects/ImportProxy'; import { ObjectManager } from './ObjectManager'; -import { InputBoxOptions, TextDocument, TextEdit as CodeTextEdit, window, workspace, WorkspaceEdit } from 'vscode'; -import { TextEdit } from 'vscode-languageserver-types'; /** * String-Sort function. @@ -85,6 +86,7 @@ export class ImportManager implements ObjectManager { return Container.get(iocSymbols.configuration); } + private importGroups: ImportGroup[]; private imports: Import[] = []; private userImportDecisions: { [usage: string]: DeclarationInfo[] }[] = []; private organize: boolean; @@ -104,7 +106,7 @@ export class ImportManager implements ObjectManager { public readonly document: TextDocument, private _parsedDocument: File, ) { - this.imports = _parsedDocument.imports.map(o => o.clone()); + this.reset(); } /** @@ -126,6 +128,17 @@ export class ImportManager implements ObjectManager { return new ImportManager(document, source); } + /** + * Resets the imports and the import groups back to the initial state of the parsed document. + * + * @memberof ImportManager + */ + public reset(): void { + this.imports = this._parsedDocument.imports.map(o => o.clone()); + this.importGroups = ImportManager.config.resolver.importGroups; + this.addImportsToGroups(this.imports); + } + /** * Adds an import for a declaration to the documents imports. * This index is merged and commited during the commit() function. @@ -155,28 +168,29 @@ export class ImportManager implements ObjectManager { alreadyImported.addSpecifier(declarationInfo.declaration.name); } } else { + let imp: Import; if (declarationInfo.declaration instanceof ModuleDeclaration) { - this.imports.push(new NamespaceImport( + imp = new NamespaceImport( declarationInfo.from, declarationInfo.declaration.name, - )); + ); } else if (declarationInfo.declaration instanceof DefaultDeclaration) { - const imp = new ImportProxy(getRelativeLibraryName( + imp = new ImportProxy(getRelativeLibraryName( declarationInfo.from, this.document.fileName, workspace.rootPath, )); - imp.defaultPurposal = declarationInfo.declaration.name; - this.imports.push(imp); + (imp as ImportProxy).defaultPurposal = declarationInfo.declaration.name; } else { - const imp = new ImportProxy(getRelativeLibraryName( + imp = new ImportProxy(getRelativeLibraryName( declarationInfo.from, this.document.fileName, workspace.rootPath, )); - imp.specifiers.push(new SymbolSpecifier(declarationInfo.declaration.name)); - this.imports.push(imp); + (imp as ImportProxy).specifiers.push(new SymbolSpecifier(declarationInfo.declaration.name)); } + this.imports.push(imp); + this.addImportsToGroups([imp]); } return this; @@ -195,8 +209,8 @@ export class ImportManager implements ObjectManager { const declarations = getDeclarationsFilteredByImports( index.declarationInfos, this.document.fileName, - workspace.rootPath, this.imports, + workspace.rootPath, ); for (const usage of this._parsedDocument.nonLocalUsages) { @@ -253,7 +267,11 @@ export class ImportManager implements ObjectManager { ]; } + for (const group of this.importGroups) { + group.reset(); + } this.imports = keep; + this.addImportsToGroups(this.imports); return this; } @@ -268,64 +286,129 @@ export class ImportManager implements ObjectManager { * @memberof ImportManager */ public async commit(): Promise { - // Commit the documents imports: - // 1. Remove imports that are in the document, but not anymore - // 2. Update existing / insert new ones - const edits: TextEdit[] = []; - await this.resolveImportSpecifiers(); + const edits: TextEdit[] = this.calculateTextEdits(); + const workspaceEdit = new WorkspaceEdit(); + + workspaceEdit.set(this.document.uri, edits); + + const result = await workspace.applyEdit(workspaceEdit); + + if (result) { + delete this.organize; + this._parsedDocument = await ImportManager.parser.parseSource(this.document.getText()); + this._parsedDocument.imports = this._parsedDocument.imports.map( + o => o instanceof NamedImport || o instanceof DefaultImport ? new ImportProxy(o) : o, + ); + this.imports = this._parsedDocument.imports.map(o => o.clone()); + for (const group of this.importGroups) { + group.reset(); + } + this.addImportsToGroups(this.imports); + } + + return result; + } + + /** + * Calculate the needed {@link TextEdit} array for the actual changes in the imports. + * + * @returns {TextEdit[]} + * + * @memberof ImportManager + */ + public calculateTextEdits(): TextEdit[] { + const edits: TextEdit[] = []; + if (this.organize) { + // since the imports should be organized: + // delete all imports and the following lines (if empty) + // newly generate all groups. for (const imp of this._parsedDocument.imports) { - edits.push(TextEdit.del(importRange(this.document, imp.start, imp.end))); + edits.push(TextEdit.delete(importRange(this.document, imp.start, imp.end))); + if (imp.end !== undefined) { + const nextLine = this.document.lineAt(this.document.positionAt(imp.end).line + 1); + if (nextLine.text === '') { + edits.push(TextEdit.delete(nextLine.rangeIncludingLineBreak)); + } + } } edits.push(TextEdit.insert( - getImportInsertPosition(ImportManager.config.resolver.newImportLocation, window.activeTextEditor), - this.imports.reduce( - (all, cur) => all + cur.generateTypescript(ImportManager.config.resolver.generationOptions), - '', - ), + getImportInsertPosition(window.activeTextEditor), + this.importGroups + .map(group => group.generateTypescript(ImportManager.config.resolver.generationOptions)) + .filter(Boolean) + .join('\n') + '\n', )); } else { + // Commit the documents imports: + // 1. Remove imports that are in the document, but not anymore + // 2. Update existing / insert new ones for (const imp of this._parsedDocument.imports) { if (!this.imports.some(o => o.libraryName === imp.libraryName)) { - edits.push(TextEdit.del(importRange(this.document, imp.start, imp.end))); + edits.push(TextEdit.delete(importRange(this.document, imp.start, imp.end))); } } const proxies = this._parsedDocument.imports.filter(o => o instanceof ImportProxy); - for (const imp of this.imports) { - if (imp instanceof ImportProxy && - proxies.some((o: ImportProxy) => o.isEqual(imp as ImportProxy))) { - continue; - } - if (imp.start !== undefined && imp.end !== undefined) { - edits.push(TextEdit.replace( - importRange(this.document, imp.start, imp.end), - imp.generateTypescript(ImportManager.config.resolver.generationOptions), - )); - } else { - edits.push(TextEdit.insert( - getImportInsertPosition( - ImportManager.config.resolver.newImportLocation, - window.activeTextEditor, - ), - imp.generateTypescript(ImportManager.config.resolver.generationOptions), - )); + for (const group of this.importGroups) { + const grpImports = group.sortedImports; + for (const imp of grpImports) { + if (imp instanceof ImportProxy && + proxies.some((o: ImportProxy) => o.isEqual(imp as ImportProxy))) { + continue; + } + + const physicalFirstImport = grpImports.find(grpImp => grpImp.start !== undefined); + const physicalLastImport = [...grpImports].reverse().find(grpImp => grpImp.end !== undefined); + + if (physicalFirstImport && physicalLastImport) { + // If the group has more than 0 imports, delete the whole group (like in organize) + // and regenerate it at the start of it's first import that has a start position + // if there is an import that is there already + edits.push(TextEdit.replace( + new Range( + this.document.positionAt(physicalFirstImport.start!), + this.document.lineAt( + this.document.positionAt(physicalLastImport.end!).line, + ).rangeIncludingLineBreak.end, + ), + group.generateTypescript(ImportManager.config.resolver.generationOptions), + )); + } else { + // Since the group has no imports, generate it at the top of the file. + edits.push(TextEdit.insert( + getImportInsertPosition( + window.activeTextEditor, + ), + group.generateTypescript(ImportManager.config.resolver.generationOptions) + '\n', + )); + } + + break; } } } - // Later, more edits will come (like add methods to a class or so.) + return edits; + } - const workspaceEdit = new WorkspaceEdit(); - workspaceEdit.set(this.document.uri, edits); - const result = await workspace.applyEdit(workspaceEdit); - if (result) { - delete this.organize; - this._parsedDocument = await ImportManager.parser.parseSource(this.document.getText()); + /** + * Add a list of imports to the groups of the ImportManager. + * + * @private + * @param {Import[]} imports + * + * @memberof ImportManager + */ + private addImportsToGroups(imports: Import[]): void { + for (const tsImport of imports) { + for (const group of this.importGroups) { + if (group.processImport(tsImport)) { + break; + } + } } - - return result; } /** @@ -383,7 +466,7 @@ export class ImportManager implements ObjectManager { for (const spec of imp.specifiers) { const specifiers = getSpecifiers(); if (specifiers.filter(o => o === (spec.alias || spec.specifier)).length > 1) { - spec.alias = await this.getSpecifierAlias(); + spec.alias = await this.getSpecifierAlias(spec.alias || spec.specifier); } } } @@ -397,10 +480,10 @@ export class ImportManager implements ObjectManager { * * @memberof ImportManager */ - private async getSpecifierAlias(): Promise { + private async getSpecifierAlias(specifierName: string): Promise { const result = await this.vscodeInputBox({ - placeHolder: 'Alias for specifier', - prompt: 'Please enter an alias for the specifier..', + placeHolder: `Alias for specifier "${specifierName}"`, + prompt: `Please enter an alias for the specifier "${specifierName}"...`, validateInput: s => !!s ? '' : 'Please enter a variable name', }); return !!result ? result : undefined; @@ -418,7 +501,7 @@ export class ImportManager implements ObjectManager { private async getDefaultIdentifier(declarationName: string): Promise { const result = await this.vscodeInputBox({ placeHolder: 'Default export name', - prompt: 'Please enter a variable name for the default export..', + prompt: 'Please enter a variable name for the default export...', validateInput: s => !!s ? '' : 'Please enter a variable name', value: declarationName, }); @@ -430,11 +513,11 @@ export class ImportManager implements ObjectManager { * * @private * @param {InputBoxOptions} options - * @returns {Promise} + * @returns {Promise} * * @memberof ImportManager */ - private async vscodeInputBox(options: InputBoxOptions): Promise { + private async vscodeInputBox(options: InputBoxOptions): Promise { return await window.showInputBox(options); } } diff --git a/src/extension/proxy-objects/ImportProxy.ts b/src/extension/proxy-objects/ImportProxy.ts index 97efc61..003694a 100644 --- a/src/extension/proxy-objects/ImportProxy.ts +++ b/src/extension/proxy-objects/ImportProxy.ts @@ -103,7 +103,7 @@ export class ImportProxy extends NamedImport { public generateTypescript(options: GenerationOptions): string { if (this.specifiers.length <= 0) { return new DefaultImport( - this.libraryName, this.defaultAlias!, this.start, this.end, + this.libraryName, (this.defaultAlias || this.defaultPurposal)!, this.start, this.end, ).generateTypescript(options); } if (this.defaultAlias) { diff --git a/src/extension/utilities/ClientConnection.ts b/src/extension/utilities/ClientConnection.ts index d95e606..1e67b09 100644 --- a/src/extension/utilities/ClientConnection.ts +++ b/src/extension/utilities/ClientConnection.ts @@ -30,7 +30,7 @@ export class ClientConnection extends Connection { const serverOptions: ServerOptions = { run: { module, transport: TransportKind.ipc }, - debug: { module, transport: TransportKind.ipc, options }, + debug: { module, options, transport: TransportKind.ipc }, }; const clientOptions: LanguageClientOptions = { diff --git a/src/extension/utilities/utilityFunctions.ts b/src/extension/utilities/utilityFunctions.ts new file mode 100644 index 0000000..0bfc94f --- /dev/null +++ b/src/extension/utilities/utilityFunctions.ts @@ -0,0 +1,52 @@ +import { SymbolSpecifier } from '../../common/ts-parsing'; +import { Import } from '../../common/ts-parsing/imports'; + +/** + * String-Sort function. + * + * @export + * @param {string} strA + * @param {string} strB + * @param {('asc' | 'desc')} [order='asc'] + * @returns {number} + */ +export function stringSort(strA: string, strB: string, order: 'asc' | 'desc' = 'asc'): number { + let result: number = 0; + if (strA < strB) { + result = -1; + } else if (strA > strB) { + result = 1; + } + if (order === 'desc') { + result *= -1; + } + return result; +} + +/** + * Order imports by library name. + * + * @export + * @param {Import} i1 + * @param {Import} i2 + * @param {('asc' | 'desc')} [order='asc'] + * @returns {number} + */ +export function importSort(i1: Import, i2: Import, order: 'asc' | 'desc' = 'asc'): number { + const strA = i1.libraryName.toLowerCase(); + const strB = i2.libraryName.toLowerCase(); + + return stringSort(strA, strB, order); +} + +/** + * Order specifiers by name. + * + * @export + * @param {SymbolSpecifier} i1 + * @param {SymbolSpecifier} i2 + * @returns {number} + */ +export function specifierSort(i1: SymbolSpecifier, i2: SymbolSpecifier): number { + return stringSort(i1.specifier, i2.specifier); +} diff --git a/test/_workspace/extension/import-grouping/imports.ts b/test/_workspace/extension/import-grouping/imports.ts new file mode 100644 index 0000000..8993764 --- /dev/null +++ b/test/_workspace/extension/import-grouping/imports.ts @@ -0,0 +1,6 @@ +import 'sideEffectLib'; +import './workspaceSideEffectLib'; +import { Foobar } from './myFile'; +import { AnotherFoobar } from './anotherFile'; +import { ModuleFoobar } from 'myLib'; +import { AnotherModuleFoo } from 'anotherLib'; diff --git a/test/common/ts-parsing/TypescriptParser.test.ts b/test/common/ts-parsing/TypescriptParser.test.ts index 2df22fb..4683414 100644 --- a/test/common/ts-parsing/TypescriptParser.test.ts +++ b/test/common/ts-parsing/TypescriptParser.test.ts @@ -1,3 +1,7 @@ +import * as chai from 'chai'; +import { join } from 'path'; +import * as vscode from 'vscode'; + import { TypescriptParser } from '../../../src/common/ts-parsing'; import { ClassDeclaration, @@ -18,9 +22,6 @@ import { StringImport, } from '../../../src/common/ts-parsing/imports'; import { Module, Namespace, Resource } from '../../../src/common/ts-parsing/resources'; -import * as chai from 'chai'; -import { join } from 'path'; -import * as vscode from 'vscode'; const should = chai.should(); @@ -35,10 +36,10 @@ describe('common / TypescriptParser', () => { describe('Import parsing', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/importsOnly.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/importsOnly.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse imports', () => { @@ -112,10 +113,10 @@ describe('common / TypescriptParser', () => { describe('Export parsing', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/exportsOnly.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/exportsOnly.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse export all from another file', () => { @@ -158,10 +159,10 @@ describe('common / TypescriptParser', () => { describe('Enums', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/enum.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/enum.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse a file', () => { @@ -188,10 +189,10 @@ describe('common / TypescriptParser', () => { describe('Type aliases', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/typeAlias.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/typeAlias.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse a file', () => { @@ -214,10 +215,10 @@ describe('common / TypescriptParser', () => { describe('Functions', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/function.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/function.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse a file', () => { @@ -285,10 +286,10 @@ describe('common / TypescriptParser', () => { describe('Variables', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/variable.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/variable.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse a file', () => { @@ -345,10 +346,10 @@ describe('common / TypescriptParser', () => { describe('Interfaces', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/interface.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/interface.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse a file', () => { @@ -414,10 +415,10 @@ describe('common / TypescriptParser', () => { describe('Classes', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/class.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/class.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse a file', () => { @@ -500,10 +501,10 @@ describe('common / TypescriptParser', () => { describe('Modules', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/module.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/module.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse a file', () => { @@ -529,10 +530,10 @@ describe('common / TypescriptParser', () => { describe('Usages', () => { - const file = join(vscode.workspace.rootPath, 'common/ts-parsing/usagesOnly.ts'); + const file = join(vscode.workspace.rootPath!, 'common/ts-parsing/usagesOnly.ts'); beforeEach(async () => { - parsed = await parser.parseFile(file, vscode.workspace.rootPath); + parsed = await parser.parseFile(file, vscode.workspace.rootPath!); }); it('should parse decorator usages', () => { diff --git a/test/extension/extensions/CodeActionExtension.test.ts b/test/extension/extensions/CodeActionExtension.test.ts index 940a051..c629cfe 100644 --- a/test/extension/extensions/CodeActionExtension.test.ts +++ b/test/extension/extensions/CodeActionExtension.test.ts @@ -1,10 +1,11 @@ +import * as chai from 'chai'; +import { join } from 'path'; +import * as sinon from 'sinon'; +import { ExtensionContext, Position, Range, TextDocument, window, workspace } from 'vscode'; + import { TypescriptParser } from '../../../src/common/ts-parsing'; import { LoggerFactory } from '../../../src/common/utilities'; -import { - AddImportCodeAction, - CodeAction, - ImplementPolymorphElements, -} from '../../../src/extension/code-actions/CodeAction'; +import { AddImportCodeAction, CodeAction, ImplementPolymorphElements } from '../../../src/extension/code-actions/CodeAction'; import { MissingImplementationInClassCreator, } from '../../../src/extension/code-actions/MissingImplementationInClassCreator'; @@ -13,10 +14,6 @@ import { CodeActionExtension } from '../../../src/extension/extensions/CodeActio import { Container } from '../../../src/extension/IoC'; import { iocSymbols } from '../../../src/extension/IoCSymbols'; import { DeclarationIndex } from '../../../src/server/indices/DeclarationIndex'; -import * as chai from 'chai'; -import { join } from 'path'; -import * as sinon from 'sinon'; -import { ExtensionContext, Position, Range, TextDocument, window, workspace } from 'vscode'; chai.should(); @@ -42,23 +39,23 @@ describe('CodeActionExtension', () => { await index.buildIndex( [ join( - workspace.rootPath, + workspace.rootPath!, 'server/indices/MyClass.ts', ), join( - workspace.rootPath, + workspace.rootPath!, 'extension/extensions/codeActionExtension/exportedObjects.ts', ), join( - workspace.rootPath, + workspace.rootPath!, 'extension/extensions/codeActionExtension/implementInterfaceOrAbstract.ts', ), join( - workspace.rootPath, + workspace.rootPath!, 'node_modules/fancy-library/FancierLibraryClass.d.ts', ), ], - workspace.rootPath, + workspace.rootPath!, ); const creators = [ @@ -72,7 +69,7 @@ describe('CodeActionExtension', () => { describe('executeCodeAction', () => { const file = join( - workspace.rootPath, + workspace.rootPath!, 'extension/extensions/codeActionExtension/empty.ts', ); let document: TextDocument; @@ -83,7 +80,7 @@ describe('CodeActionExtension', () => { }); afterEach(async () => { - await window.activeTextEditor.edit((builder) => { + await window.activeTextEditor!.edit((builder) => { builder.delete(new Range( new Position(0, 0), document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, @@ -115,7 +112,7 @@ describe('CodeActionExtension', () => { describe('missingImport', () => { const file = join( - workspace.rootPath, + workspace.rootPath!, 'extension/extensions/codeActionExtension/empty.ts', ); let document: TextDocument; @@ -126,7 +123,7 @@ describe('CodeActionExtension', () => { }); afterEach(async () => { - await window.activeTextEditor.edit((builder) => { + await window.activeTextEditor!.edit((builder) => { builder.delete(new Range( new Position(0, 0), document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, @@ -148,7 +145,7 @@ describe('CodeActionExtension', () => { }); describe('missingPolymorphicElements', () => { - const file = join(workspace.rootPath, 'extension/extensions/codeActionExtension/implementInterfaceOrAbstract.ts'); + const file = join(workspace.rootPath!, 'extension/extensions/codeActionExtension/implementInterfaceOrAbstract.ts'); let document: TextDocument; let documentText: string; @@ -159,7 +156,7 @@ describe('CodeActionExtension', () => { }); afterEach(async () => { - await window.activeTextEditor.edit((builder) => { + await window.activeTextEditor!.edit((builder) => { builder.delete(new Range( new Position(0, 0), document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, @@ -433,7 +430,7 @@ describe('CodeActionExtension', () => { describe('provideCodeActions', () => { const file = join( - workspace.rootPath, + workspace.rootPath!, 'extension/extensions/codeActionExtension/empty.ts', ); let document: TextDocument; diff --git a/test/extension/extensions/CodeCompletionExtension.test.ts b/test/extension/extensions/CodeCompletionExtension.test.ts index 8dfcd36..3b20d80 100644 --- a/test/extension/extensions/CodeCompletionExtension.test.ts +++ b/test/extension/extensions/CodeCompletionExtension.test.ts @@ -1,13 +1,13 @@ -import { ExtensionConfig } from '../../../src/common/config'; +import * as chai from 'chai'; +import { join } from 'path'; +import * as vscode from 'vscode'; + import { TypescriptParser } from '../../../src/common/ts-parsing'; import { LoggerFactory } from '../../../src/common/utilities'; import { CodeCompletionExtension } from '../../../src/extension/extensions/CodeCompletionExtension'; import { Container } from '../../../src/extension/IoC'; import { iocSymbols } from '../../../src/extension/IoCSymbols'; import { DeclarationIndex } from '../../../src/server/indices/DeclarationIndex'; -import * as chai from 'chai'; -import { join } from 'path'; -import * as vscode from 'vscode'; const should = chai.should(); @@ -19,7 +19,7 @@ describe('CodeCompletionExtension', () => { before(async () => { const file = join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'extension/extensions/codeCompletionExtension/codeCompletionFile.ts', ); document = await vscode.workspace.openTextDocument(file); @@ -27,25 +27,24 @@ describe('CodeCompletionExtension', () => { const ctx = Container.get(iocSymbols.extensionContext); const logger = Container.get(iocSymbols.loggerFactory); - const config = Container.get(iocSymbols.configuration); const parser = Container.get(TypescriptParser); const index = new DeclarationIndex(logger, parser); await index.buildIndex( [ join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'extension/extensions/codeCompletionExtension/codeCompletionImports.ts', ), join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'server/indices/MyClass.ts', ), ], - vscode.workspace.rootPath, + vscode.workspace.rootPath!, ); - extension = new CodeCompletionExtension(ctx, logger, config, parser, index as any); + extension = new CodeCompletionExtension(ctx, logger, parser, index as any); }); it('shoud resolve to null if typing in a string', async () => { @@ -77,23 +76,26 @@ describe('CodeCompletionExtension', () => { should.exist(result); result![0].label.should.equal('MyClass'); - result![0].detail.should.equal('/server/indices/MyClass'); + result![0].detail!.should.equal('/server/indices/MyClass'); }); it('shoud add an insert text edit if import would be new', async () => { const result = await extension.provideCompletionItems(document, new vscode.Position(6, 5), token); should.exist(result); - result![0].additionalTextEdits.should.be.an('array').with.lengthOf(1); - result![0].additionalTextEdits[0].newText.should.equal('import { MyClass } from \'../../../server/indices/MyClass\';\n'); + result![0].additionalTextEdits!.should.be.an('array').with.lengthOf(1); + result![0].additionalTextEdits![0].newText.should.equal( + `import { MyClass } from '../../../server/indices/MyClass';\n` + + `import { AlreadyImported } from './codeCompletionImports';\n`, + ); }); it('shoud add a replace text edit if import will be updated with new specifier', async () => { const result = await extension.provideCompletionItems(document, new vscode.Position(9, 10), token); should.exist(result); - result![0].additionalTextEdits.should.be.an('array').with.lengthOf(1); - result![0].additionalTextEdits[0].newText.should.equal( + result![0].additionalTextEdits!.should.be.an('array').with.lengthOf(1); + result![0].additionalTextEdits![0].newText.should.equal( `import { AlreadyImported, ShouldBeImported } from './codeCompletionImports';\n`, ); }); diff --git a/test/extension/extensions/ImportResolveExtension.test.ts b/test/extension/extensions/ImportResolveExtension.test.ts index bc76d90..395091e 100644 --- a/test/extension/extensions/ImportResolveExtension.test.ts +++ b/test/extension/extensions/ImportResolveExtension.test.ts @@ -1,13 +1,14 @@ -import { TypescriptParser } from '../../../src/common/ts-parsing'; -import { DeclarationIndex } from '../../../src/server/indices/DeclarationIndex'; +import * as chai from 'chai'; +import { join } from 'path'; +import * as vscode from 'vscode'; + import { ExtensionConfig } from '../../../src/common/config'; +import { TypescriptParser } from '../../../src/common/ts-parsing'; import { LoggerFactory } from '../../../src/common/utilities'; import { ImportResolveExtension } from '../../../src/extension/extensions/ImportResolveExtension'; import { Container } from '../../../src/extension/IoC'; import { iocSymbols } from '../../../src/extension/IoCSymbols'; -import * as chai from 'chai'; -import { join } from 'path'; -import * as vscode from 'vscode'; +import { DeclarationIndex } from '../../../src/server/indices/DeclarationIndex'; chai.should(); @@ -17,7 +18,7 @@ describe('ImportResolveExtension', () => { before(async () => { const file = join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'extension/extensions/importResolveExtension/addImportToDocument.ts', ); const document = await vscode.workspace.openTextDocument(file); @@ -33,23 +34,23 @@ describe('ImportResolveExtension', () => { await index.buildIndex( [ join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'typings/globals/body-parser/index.d.ts', ), join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'server/indices/MyClass.ts', ), join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'extension/extensions/importResolveExtension/sub1/sub2/sub3/subFile.ts', ), join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'extension/extensions/importResolveExtension/sameDirectory.ts', ), ], - vscode.workspace.rootPath, + vscode.workspace.rootPath!, ); extension = new ImportResolveExtension(ctx, logger, config, index as any, parser, null); @@ -58,7 +59,7 @@ describe('ImportResolveExtension', () => { describe('addImportToDocument', () => { const file = join( - vscode.workspace.rootPath, + vscode.workspace.rootPath!, 'extension/extensions/importResolveExtension/addImportToDocument.ts', ); let document: vscode.TextDocument; @@ -69,7 +70,7 @@ describe('ImportResolveExtension', () => { }); afterEach(async () => { - await vscode.window.activeTextEditor.edit((builder) => { + await vscode.window.activeTextEditor!.edit((builder) => { builder.delete(new vscode.Range( new vscode.Position(0, 0), document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, @@ -84,7 +85,7 @@ describe('ImportResolveExtension', () => { docuemntPath: document.fileName, }); await extension.addImportToDocument(items[0]); - document.getText().should.equal(`import * as bodyParser from 'body-parser';\n`); + document.getText().should.equal(`import * as bodyParser from 'body-parser';\n\n`); }); it('shoud write a named import correctly', async () => { @@ -94,7 +95,7 @@ describe('ImportResolveExtension', () => { docuemntPath: document.fileName, }); await extension.addImportToDocument(items[0]); - document.getText().should.equal(`import { Class1 } from '../../../server/indices/MyClass';\n`); + document.getText().should.equal(`import { Class1 } from '../../../server/indices/MyClass';\n\n`); }); it('shoud update a named import correcty', async () => { @@ -105,7 +106,7 @@ describe('ImportResolveExtension', () => { }); await extension.addImportToDocument(items[0]); await extension.addImportToDocument(items[1]); - document.getText().should.equal(`import { Class1, Class2 } from '../../../server/indices/MyClass';\n`); + document.getText().should.equal(`import { Class1, Class2 } from '../../../server/indices/MyClass';\n\n`); }); it('shoud use the correct relative path', async () => { @@ -142,7 +143,7 @@ describe('ImportResolveExtension', () => { describe('organizeImports', () => { - const file = join(vscode.workspace.rootPath, 'extension/extensions/importResolveExtension/organizeImports.ts'); + const file = join(vscode.workspace.rootPath!, 'extension/extensions/importResolveExtension/organizeImports.ts'); let document: vscode.TextDocument; let documentText: string; @@ -153,7 +154,7 @@ describe('ImportResolveExtension', () => { }); afterEach(async () => { - await vscode.window.activeTextEditor.edit((builder) => { + await vscode.window.activeTextEditor!.edit((builder) => { builder.delete(new vscode.Range( new vscode.Position(0, 0), document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, @@ -174,13 +175,13 @@ describe('ImportResolveExtension', () => { it('shoud order libraries by name', async () => { await extension.organizeImports(); - document.lineAt(1).text.should.match(/resourceIndex/); - document.lineAt(2).text.should.match(/subfolderstructure/); + document.lineAt(2).text.should.match(/resourceIndex/); + document.lineAt(3).text.should.match(/subfolderstructure/); }); it('shoud order specifiers by name', async () => { await extension.organizeImports(); - document.lineAt(1).text.should.match(/ExportAlias.*FancierLibraryClass/); + document.lineAt(2).text.should.match(/ExportAlias.*FancierLibraryClass/); }); }); diff --git a/test/extension/import-grouping/ImportGroupSettingParser.test.ts b/test/extension/import-grouping/ImportGroupSettingParser.test.ts new file mode 100644 index 0000000..0090fa7 --- /dev/null +++ b/test/extension/import-grouping/ImportGroupSettingParser.test.ts @@ -0,0 +1,54 @@ +import { + ImportGroupIdentifierInvalidError, + ImportGroupKeyword, + ImportGroupSettingParser, + KeywordImportGroup, + RegexImportGroup, +} from '../../../src/extension/import-grouping'; +import * as chai from 'chai'; + +chai.should(); + +describe('ImportGroupSettingParser', () => { + + it('should parse a simple keyword', () => { + const result = ImportGroupSettingParser.parseSetting('Workspace') as KeywordImportGroup; + + result.keyword.should.equal(ImportGroupKeyword.Workspace); + result.order.should.equal('asc'); + }); + + it('should parse a simple regex', () => { + const result = ImportGroupSettingParser.parseSetting('/foobar/') as RegexImportGroup; + + result.regex.should.equal('/foobar/'); + result.order.should.equal('asc'); + }); + + it('should parse a complex keyword pattern', () => { + const result = ImportGroupSettingParser.parseSetting({ + identifier: 'Workspace', + order: 'desc', + }) as KeywordImportGroup; + + result.keyword.should.equal(ImportGroupKeyword.Workspace); + result.order.should.equal('desc'); + }); + + it('should parse a complex regex pattern', () => { + const result = ImportGroupSettingParser.parseSetting({ + identifier: '/foobar/', + order: 'desc', + }) as RegexImportGroup; + + result.regex.should.equal('/foobar/'); + result.order.should.equal('desc'); + }); + + it('should throw on non found keyword and regex', () => { + const fn = () => ImportGroupSettingParser.parseSetting('whatever'); + + fn.should.throw(ImportGroupIdentifierInvalidError); + }); + +}); diff --git a/test/extension/import-grouping/KeywordImportGroup.test.ts b/test/extension/import-grouping/KeywordImportGroup.test.ts new file mode 100644 index 0000000..d6256e0 --- /dev/null +++ b/test/extension/import-grouping/KeywordImportGroup.test.ts @@ -0,0 +1,179 @@ +import * as chai from 'chai'; +import { join } from 'path'; +import { workspace } from 'vscode'; + +import { ExtensionConfig } from '../../../src/common/config'; +import { TypescriptParser } from '../../../src/common/ts-parsing'; +import { File } from '../../../src/common/ts-parsing/resources'; +import { ImportGroupKeyword, KeywordImportGroup } from '../../../src/extension/import-grouping'; +import { Container } from '../../../src/extension/IoC'; +import { iocSymbols } from '../../../src/extension/IoCSymbols'; + +chai.should(); + +describe('KeywordImportGroup', () => { + + let file: File; + let importGroup: KeywordImportGroup; + let config: ExtensionConfig; + + before(async () => { + const parser = Container.get(TypescriptParser); + config = Container.get(iocSymbols.configuration); + file = await parser.parseFile( + join( + workspace.rootPath!, + 'extension/import-grouping/imports.ts', + ), + workspace.rootPath!, + ); + }); + + describe(`keyword "Modules"`, () => { + + beforeEach(() => { + importGroup = new KeywordImportGroup(ImportGroupKeyword.Modules); + }); + + it('should process a module import', () => { + importGroup.processImport(file.imports[4]).should.be.true; + }); + + it('should not process a plain import', () => { + importGroup.processImport(file.imports[0]).should.be.false; + }); + + it('should not process a workspace import', () => { + importGroup.processImport(file.imports[2]).should.be.false; + }); + + it('should correctly process a list of imports', () => { + file.imports.map(i => importGroup.processImport(i)).should.deep.equal([false, false, false, false, true, true]); + }); + + it('should generate the correct typescript (asc)', () => { + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import { AnotherModuleFoo } from 'anotherLib';\n` + + `import { ModuleFoobar } from 'myLib';\n`, + ); + }); + + it('should generate the correct typescript (desc)', () => { + (importGroup as any).order = 'desc'; + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import { ModuleFoobar } from 'myLib';\n` + + `import { AnotherModuleFoo } from 'anotherLib';\n`, + ); + }); + + }); + + describe(`keyword "Plains"`, () => { + + beforeEach(() => { + importGroup = new KeywordImportGroup(ImportGroupKeyword.Plains); + }); + + it('should not process a module import', () => { + importGroup.processImport(file.imports[4]).should.be.false; + }); + + it('should process a plain import', () => { + importGroup.processImport(file.imports[0]).should.be.true; + }); + + it('should not process a workspace import', () => { + importGroup.processImport(file.imports[2]).should.be.false; + }); + + it('should correctly process a list of imports', () => { + file.imports.map(i => importGroup.processImport(i)).should.deep.equal([true, true, false, false, false, false]); + }); + + it('should generate the correct typescript (asc)', () => { + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import './workspaceSideEffectLib';\n` + + `import 'sideEffectLib';\n`, + ); + }); + + it('should generate the correct typescript (desc)', () => { + (importGroup as any).order = 'desc'; + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import 'sideEffectLib';\n` + + `import './workspaceSideEffectLib';\n`, + ); + }); + + }); + + describe(`keyword "Workspace"`, () => { + + beforeEach(() => { + importGroup = new KeywordImportGroup(ImportGroupKeyword.Workspace); + }); + + it('should not process a module import', () => { + importGroup.processImport(file.imports[4]).should.be.false; + }); + + it('should not process a plain import', () => { + importGroup.processImport(file.imports[0]).should.be.false; + }); + + it('should process a workspace import', () => { + importGroup.processImport(file.imports[2]).should.be.true; + }); + + it('should correctly process a list of imports', () => { + file.imports.map(i => importGroup.processImport(i)).should.deep.equal([false, false, true, true, false, false]); + }); + + it('should generate the correct typescript (asc)', () => { + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import { AnotherFoobar } from './anotherFile';\n` + + `import { Foobar } from './myFile';\n`, + ); + }); + + it('should generate the correct typescript (desc)', () => { + (importGroup as any).order = 'desc'; + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import { Foobar } from './myFile';\n` + + `import { AnotherFoobar } from './anotherFile';\n`, + ); + }); + + }); + +}); diff --git a/test/extension/import-grouping/RegexImportGroup.test.ts b/test/extension/import-grouping/RegexImportGroup.test.ts new file mode 100644 index 0000000..516e112 --- /dev/null +++ b/test/extension/import-grouping/RegexImportGroup.test.ts @@ -0,0 +1,77 @@ +import * as chai from 'chai'; +import { join } from 'path'; +import { workspace } from 'vscode'; + +import { ExtensionConfig } from '../../../src/common/config'; +import { TypescriptParser } from '../../../src/common/ts-parsing'; +import { File } from '../../../src/common/ts-parsing/resources'; +import { RegexImportGroup } from '../../../src/extension/import-grouping'; +import { Container } from '../../../src/extension/IoC'; +import { iocSymbols } from '../../../src/extension/IoCSymbols'; + +chai.should(); + +describe('RegexImportGroup', () => { + + let file: File; + let importGroup: RegexImportGroup; + let config: ExtensionConfig; + + before(async () => { + const parser = Container.get(TypescriptParser); + config = Container.get(iocSymbols.configuration); + file = await parser.parseFile( + join( + workspace.rootPath!, + 'extension/import-grouping/imports.ts', + ), + workspace.rootPath!, + ); + }); + + beforeEach(() => { + importGroup = new RegexImportGroup(`/Lib/`); + }); + + it('should process a matching import', () => { + importGroup.processImport(file.imports[0]).should.be.true; + }); + + it('should not process a not matching import', () => { + importGroup.processImport(file.imports[2]).should.be.false; + }); + + it('should correctly process a list of imports', () => { + file.imports.map(i => importGroup.processImport(i)).should.deep.equal([true, true, false, false, true, true]); + }); + + it('should generate the correct typescript (asc)', () => { + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import './workspaceSideEffectLib';\n` + + `import 'sideEffectLib';\n` + + `import { AnotherModuleFoo } from 'anotherLib';\n` + + `import { ModuleFoobar } from 'myLib';\n`, + ); + }); + + it('should generate the correct typescript (desc)', () => { + (importGroup as any).order = 'desc'; + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import 'sideEffectLib';\n` + + `import './workspaceSideEffectLib';\n` + + `import { ModuleFoobar } from 'myLib';\n` + + `import { AnotherModuleFoo } from 'anotherLib';\n`, + ); + }); + +}); diff --git a/test/extension/import-grouping/RemainImportGroup.test.ts b/test/extension/import-grouping/RemainImportGroup.test.ts new file mode 100644 index 0000000..68589c0 --- /dev/null +++ b/test/extension/import-grouping/RemainImportGroup.test.ts @@ -0,0 +1,73 @@ +import * as chai from 'chai'; +import { join } from 'path'; +import { workspace } from 'vscode'; + +import { ExtensionConfig } from '../../../src/common/config'; +import { TypescriptParser } from '../../../src/common/ts-parsing'; +import { File } from '../../../src/common/ts-parsing/resources'; +import { RemainImportGroup } from '../../../src/extension/import-grouping'; +import { Container } from '../../../src/extension/IoC'; +import { iocSymbols } from '../../../src/extension/IoCSymbols'; + +chai.should(); + +describe('RemainImportGroup', () => { + + let file: File; + let importGroup: RemainImportGroup; + let config: ExtensionConfig; + + before(async () => { + const parser = Container.get(TypescriptParser); + config = Container.get(iocSymbols.configuration); + file = await parser.parseFile( + join( + workspace.rootPath!, + 'extension/import-grouping/imports.ts', + ), + workspace.rootPath!, + ); + }); + + beforeEach(() => { + importGroup = new RemainImportGroup(); + }); + + it('should process all imports', () => { + file.imports.map(i => importGroup.processImport(i)).should.deep.equal([true, true, true, true, true, true]); + }); + + it('should generate the correct typescript (asc)', () => { + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import './workspaceSideEffectLib';\n` + + `import 'sideEffectLib';\n` + + `import { AnotherFoobar } from './anotherFile';\n` + + `import { Foobar } from './myFile';\n` + + `import { AnotherModuleFoo } from 'anotherLib';\n` + + `import { ModuleFoobar } from 'myLib';\n`, + ); + }); + + it('should generate the correct typescript (desc)', () => { + (importGroup as any).order = 'desc'; + for (const imp of file.imports) { + if (importGroup.processImport(imp)) { + continue; + } + } + importGroup.generateTypescript(config.resolver.generationOptions).should.equal( + `import 'sideEffectLib';\n` + + `import './workspaceSideEffectLib';\n` + + `import { ModuleFoobar } from 'myLib';\n` + + `import { AnotherModuleFoo } from 'anotherLib';\n` + + `import { Foobar } from './myFile';\n` + + `import { AnotherFoobar } from './anotherFile';\n`, + ); + }); + +}); diff --git a/test/extension/managers/ClassManager.test.ts b/test/extension/managers/ClassManager.test.ts index fc8ea61..716e4b2 100644 --- a/test/extension/managers/ClassManager.test.ts +++ b/test/extension/managers/ClassManager.test.ts @@ -1,36 +1,37 @@ +import * as chai from 'chai'; +import { join } from 'path'; +import sinonChai = require('sinon-chai'); +import { Position, Range, TextDocument, window, workspace } from 'vscode'; + import { ClassDeclaration, DeclarationVisibility, MethodDeclaration, - ParameterDeclaration + ParameterDeclaration, } from '../../../src/common/ts-parsing/declarations'; import { findFiles } from '../../../src/extension/extensions/ImportResolveExtension'; import { ClassManager } from '../../../src/extension/managers/ClassManager'; import { VscodeExtensionConfig } from '../../../src/extension/VscodeExtensionConfig'; import { DeclarationIndex } from '../../../src/server/indices/DeclarationIndex'; import { Container } from '../../../src/server/IoC'; -import * as chai from 'chai'; -import { join } from 'path'; -import sinonChai = require('sinon-chai'); -import { Position, Range, TextDocument, window, workspace } from 'vscode'; const should = chai.should(); chai.use(sinonChai); describe('ClassManager', () => { - const file = join(workspace.rootPath, 'extension/managers/ClassManagerFile.ts'); - let document: TextDocument, - documentText: string, - index: DeclarationIndex, - files: string[]; + const file = join(workspace.rootPath!, 'extension/managers/ClassManagerFile.ts'); + let document: TextDocument; + let documentText: string; + let index: DeclarationIndex; + let files: string[]; before(async () => { const config = new VscodeExtensionConfig(); files = await findFiles(config); index = Container.get(DeclarationIndex); - await index.buildIndex(files, workspace.rootPath); + await index.buildIndex(files, workspace.rootPath!); document = await workspace.openTextDocument(file); await window.showTextDocument(document); @@ -228,7 +229,7 @@ describe('ClassManager', () => { describe('commit()', () => { afterEach(async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit(builder => { builder.delete(new Range( new Position(0, 0), document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end @@ -240,7 +241,7 @@ describe('ClassManager', () => { it('should not touch anything if there has nothing changed', async () => { let ctrl = await ClassManager.create(document, 'ManagedClassWithMethods'); - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit(builder => { builder.replace(document.lineAt(10).rangeIncludingLineBreak, `public fooobar(): string { }`); }); diff --git a/test/extension/managers/ImportManager.test.ts b/test/extension/managers/ImportManager.test.ts index ec854a6..ce57c35 100644 --- a/test/extension/managers/ImportManager.test.ts +++ b/test/extension/managers/ImportManager.test.ts @@ -1,4 +1,9 @@ -import { ResolveQuickPickItem } from '../../../src/common/quick-pick-items'; +import * as chai from 'chai'; +import { join } from 'path'; +import * as sinon from 'sinon'; +import sinonChai = require('sinon-chai'); +import { Position, Range, TextDocument, window, workspace } from 'vscode'; + import { File } from '../../../src/common/ts-parsing/resources'; import { findFiles } from '../../../src/extension/extensions/ImportResolveExtension'; import { ImportManager } from '../../../src/extension/managers'; @@ -6,11 +11,6 @@ import { ImportProxy } from '../../../src/extension/proxy-objects/ImportProxy'; import { VscodeExtensionConfig } from '../../../src/extension/VscodeExtensionConfig'; import { DeclarationIndex } from '../../../src/server/indices/DeclarationIndex'; import { Container } from '../../../src/server/IoC'; -import * as chai from 'chai'; -import { join } from 'path'; -import sinon = require('sinon'); -import sinonChai = require('sinon-chai'); -import { Position, Range, TextDocument, window, workspace } from 'vscode'; const should = chai.should(); chai.use(sinonChai); @@ -38,18 +38,18 @@ function restoreInputBox(stub: sinon.SinonStub): void { describe('ImportManager', () => { - const file = join(workspace.rootPath, 'extension/managers/ImportManagerFile.ts'); - let document: TextDocument, - documentText: string, - index: DeclarationIndex, - files: string[]; + const file = join(workspace.rootPath!, 'extension/managers/ImportManagerFile.ts'); + let document: TextDocument; + let documentText: string; + let index: DeclarationIndex; + let files: string[]; before(async () => { const config = new VscodeExtensionConfig(); files = await findFiles(config); index = Container.get(DeclarationIndex); - await index.buildIndex(files, workspace.rootPath); + await index.buildIndex(files, workspace.rootPath!); document = await workspace.openTextDocument(file); await window.showTextDocument(document); @@ -58,10 +58,10 @@ describe('ImportManager', () => { }); afterEach(async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.delete(new Range( new Position(0, 0), - document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end + document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, )); builder.insert(new Position(0, 0), documentText); }); @@ -81,38 +81,41 @@ describe('ImportManager', () => { }); it('should add an import proxy for a named import', async () => { - const ctrl = await ImportManager.create(document), - imps = (ctrl as any).parsedDocument.imports; + const ctrl = await ImportManager.create(document); + const imps = (ctrl as any).parsedDocument.imports; imps[0].should.be.an.instanceof(ImportProxy); should.not.exist(imps[0].defaultAlias); }); it('should add an import proxy for a default import', async () => { - await window.activeTextEditor.edit(builder => { - builder.replace(new Range( - new Position(0, 0), - new Position(1, 0) - ), `import myDefaultExportedFunction from '../defaultExport/lateDefaultExportedElement';\n`); + await window.activeTextEditor!.edit((builder) => { + builder.replace( + new Range( + new Position(0, 0), + new Position(1, 0), + ), + `import myDefaultExportedFunction from '../defaultExport/lateDefaultExportedElement';\n`, + ); }); - const ctrl = await ImportManager.create(document), - imps = (ctrl as any).parsedDocument.imports; + const ctrl = await ImportManager.create(document); + const imps = (ctrl as any).parsedDocument.imports; imps[0].should.be.an.instanceof(ImportProxy); imps[0].defaultAlias.should.equal('myDefaultExportedFunction'); }); it('should add multiple import proxies', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert( new Position(0, 0), - `import myDefaultExportedFunction from '../defaultExport/lateDefaultExportedElement';\n` + `import myDefaultExportedFunction from '../defaultExport/lateDefaultExportedElement';\n`, ); }); - const ctrl = await ImportManager.create(document), - imps = (ctrl as any).parsedDocument.imports; + const ctrl = await ImportManager.create(document); + const imps = (ctrl as any).parsedDocument.imports; imps[0].should.be.an.instanceof(ImportProxy); imps[0].defaultAlias.should.equal('myDefaultExportedFunction'); @@ -121,45 +124,54 @@ describe('ImportManager', () => { }); it('should not add a proxy for a namespace import', async () => { - await window.activeTextEditor.edit(builder => { - builder.replace(new Range( - new Position(0, 0), - new Position(1, 0) - ), `import * as bodyParser from 'body-parser';\n`); + await window.activeTextEditor!.edit((builder) => { + builder.replace( + new Range( + new Position(0, 0), + new Position(1, 0), + ), + `import * as bodyParser from 'body-parser';\n`, + ); }); - const ctrl = await ImportManager.create(document), - imps = (ctrl as any).parsedDocument.imports; + const ctrl = await ImportManager.create(document); + const imps = (ctrl as any).parsedDocument.imports; imps.should.have.lengthOf(1); imps[0].should.not.be.an.instanceof(ImportProxy); }); it('should not add a proxy for an external import', async () => { - await window.activeTextEditor.edit(builder => { - builder.replace(new Range( - new Position(0, 0), - new Position(1, 0) - ), `import bodyParser = require('body-parser');\n`); + await window.activeTextEditor!.edit((builder) => { + builder.replace( + new Range( + new Position(0, 0), + new Position(1, 0), + ), + `import bodyParser = require('body-parser');\n`, + ); }); - const ctrl = await ImportManager.create(document), - imps = (ctrl as any).parsedDocument.imports; + const ctrl = await ImportManager.create(document); + const imps = (ctrl as any).parsedDocument.imports; imps.should.have.lengthOf(1); imps[0].should.not.be.an.instanceof(ImportProxy); }); it('should not add a proxy for a string import', async () => { - await window.activeTextEditor.edit(builder => { - builder.replace(new Range( - new Position(0, 0), - new Position(1, 0) - ), `import 'body-parser';\n`); + await window.activeTextEditor!.edit((builder) => { + builder.replace( + new Range( + new Position(0, 0), + new Position(1, 0), + ), + `import 'body-parser';\n`, + ); }); - const ctrl = await ImportManager.create(document), - imps = (ctrl as any).parsedDocument.imports; + const ctrl = await ImportManager.create(document); + const imps = (ctrl as any).parsedDocument.imports; imps.should.have.lengthOf(1); imps[0].should.not.be.an.instanceof(ImportProxy); @@ -169,7 +181,7 @@ describe('ImportManager', () => { describe('addDeclarationImport()', () => { - it('should add a normal import to the document.', async () => { + it('should add a normal import to the document', async () => { const ctrl = await ImportManager.create(document); const declaration = index.declarationInfos.find(o => o.declaration.name === 'NotBarelExported'); ctrl.addDeclarationImport(declaration!); @@ -179,7 +191,7 @@ describe('ImportManager', () => { (ctrl as any).imports[1].specifiers[0].specifier.should.equal('NotBarelExported'); }); - it('should add a module import to the import index.', async () => { + it('should add a module import to the import index', async () => { const ctrl = await ImportManager.create(document); const declaration = index.declarationInfos.find(o => o.from === 'body-parser'); ctrl.addDeclarationImport(declaration!); @@ -192,19 +204,19 @@ describe('ImportManager', () => { it('should add a default import to the import index.', async () => { const ctrl = await ImportManager.create(document); const declaration = index.declarationInfos.find( - o => o.declaration.name === 'myDefaultExportedFunction' + o => o.declaration.name === 'myDefaultExportedFunction', ); ctrl.addDeclarationImport(declaration!); (ctrl as any).imports.should.have.lengthOf(2); (ctrl as any).imports[1].libraryName.should.equal( - '../../server/indices/defaultExport/lateDefaultExportedElement' + '../../server/indices/defaultExport/lateDefaultExportedElement', ); (ctrl as any).imports[1].defaultPurposal.should.equal('myDefaultExportedFunction'); should.not.exist((ctrl as any).imports[1].defaultAlias); }); - it('should add multiple imports to the import index.', async () => { + it('should add multiple imports to the import index', async () => { const ctrl = await ImportManager.create(document); const declarations = index.declarationInfos.filter(o => o.declaration.name === 'FancierLibraryClass'); ctrl.addDeclarationImport(declarations[0]).addDeclarationImport(declarations[1]); @@ -215,10 +227,10 @@ describe('ImportManager', () => { (ctrl as any).imports[1].specifiers[0].specifier.should.equal('FancierLibraryClass'); }); - it('should add an import to an existing import index item.', async () => { + it('should add an import to an existing import index item', async () => { const ctrl = await ImportManager.create(document); - const declaration = index.declarationInfos.find(o => o.declaration.name === 'Class2'), - declaration2 = index.declarationInfos.find(o => o.declaration.name === 'Class3'); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'Class2'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'Class3'); ctrl.addDeclarationImport(declaration!).addDeclarationImport(declaration2!); @@ -242,12 +254,35 @@ describe('ImportManager', () => { (ctrl as any).imports[0].specifiers.should.have.lengthOf(2); }); + it('should add a normal import to a group', async () => { + const ctrl = await ImportManager.create(document); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'NotBarelExported'); + + (ctrl as any).importGroups[2].imports.should.have.lengthOf(1); + + ctrl.addDeclarationImport(declaration!); + + (ctrl as any).importGroups[2].imports.should.have.lengthOf(2); + }); + + it('should add an import to an existing import group', async () => { + const ctrl = await ImportManager.create(document); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'Class2'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'Class3'); + + (ctrl as any).importGroups[2].imports.should.have.lengthOf(1); + + ctrl.addDeclarationImport(declaration!).addDeclarationImport(declaration2!); + + (ctrl as any).importGroups[2].imports.should.have.lengthOf(1); + }); + }); describe('addMissingImports()', () => { it('should add a missing imports to the import index', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert(new Position(5, 0), `const foobar = new Class2();\n`); }); const ctrl = await ImportManager.create(document); @@ -259,11 +294,11 @@ describe('ImportManager', () => { }); it('should add multiple missing imports for a document', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert( new Position(5, 0), `const foobar = new Class2();\nconst foobaz = new Class3();` + - `\nconst barbaz = new NotBarelExported();\n` + `\nconst barbaz = new NotBarelExported();\n`, ); }); const ctrl = await ImportManager.create(document); @@ -278,10 +313,10 @@ describe('ImportManager', () => { }); it('should create a user decision specifier if multiple delcarations are found', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert( new Position(5, 0), - `const foobar = new FancierLibraryClass();\n` + `const foobar = new FancierLibraryClass();\n`, ); }); const ctrl = await ImportManager.create(document); @@ -309,6 +344,18 @@ describe('ImportManager', () => { (ctrl as any).imports[0].specifiers[0].specifier.should.equal('Class1'); }); + it('should remove an unused import from a group', async () => { + const ctrl = await ImportManager.create(document); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'myComponent'); + ctrl.addDeclarationImport(declaration!); + + (ctrl as any).importGroups[2].imports.should.have.lengthOf(2); + + ctrl.organizeImports(); + + (ctrl as any).importGroups[2].imports.should.have.lengthOf(1); + }); + it('should remove an unused specifier from an import', async () => { const ctrl = await ImportManager.create(document); const declaration = index.declarationInfos.find(o => o.declaration.name === 'Class2'); @@ -323,10 +370,10 @@ describe('ImportManager', () => { }); it('should not remove a string import', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert( new Position(0, 0), - `import 'my-string-import';\n` + `import 'my-string-import';\n`, ); }); const ctrl = await ImportManager.create(document); @@ -339,10 +386,10 @@ describe('ImportManager', () => { }); it('should order imports alphabetically', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert( new Position(1, 0), - `import { AddImportSameDirectory } from '../../../server/indices';\n` + `import { AddImportSameDirectory } from '../../../server/indices';\n`, ); builder.insert(new Position(6, 0), `const foo = AddImportSameDirectory;\n`); }); @@ -356,7 +403,7 @@ describe('ImportManager', () => { }); it('should order string imports before normal imports', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert(new Position(1, 0), `import 'foobar';\n`); }); const ctrl = await ImportManager.create(document); @@ -369,10 +416,10 @@ describe('ImportManager', () => { }); it('should order specifiers alphabetically', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.replace( document.lineAt(0).rangeIncludingLineBreak, - `import { Class2, Class1 } from '../resourceIndex';` + `import { Class2, Class1 } from '../resourceIndex';`, ); builder.insert(new Position(5, 0), `const foo = new Class2();\n`); }); @@ -386,10 +433,10 @@ describe('ImportManager', () => { }); it('should remove an unused default import', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.delete(new Range( new Position(0, 0), - document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end + document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, )); builder.insert( new Position(0, 0), @@ -406,10 +453,10 @@ describe('ImportManager', () => { }); it('should not remove a used default import', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.delete(new Range( new Position(0, 0), - document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end + document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, )); builder.insert( new Position(0, 0), @@ -435,10 +482,10 @@ let foobar = DefaultImport(); it('should not touch anything if nothing changed', async () => { const ctrl = await ImportManager.create(document); - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.replace( document.lineAt(0).rangeIncludingLineBreak, - `import {Class1} from '../resourceIndex';` + `import {Class1} from '../resourceIndex';`, ); }); @@ -447,55 +494,57 @@ let foobar = DefaultImport(); document.lineAt(0).text.should.equals(`import {Class1} from '../resourceIndex';`); }); - it('should add a single new import to the document (top)', async () => { + it('should add a single new import to the document (@correct place)', async () => { const ctrl = await ImportManager.create(document); const declaration = index.declarationInfos.find(o => o.declaration.name === 'NotBarelExported'); ctrl.addDeclarationImport(declaration!); (await ctrl.commit()).should.be.true; - document.lineAt(0).text.should.equals( - `import { NotBarelExported } from '../../server/indices/NotBarelExported';` + document.lineAt(1).text.should.equals( + `import { NotBarelExported } from '../../server/indices/NotBarelExported';`, ); }); - it('should add two new imports to the document (top)', async () => { + it('should add two new imports to the document (@correct place)', async () => { const ctrl = await ImportManager.create(document); - const declaration = index.declarationInfos.find(o => o.declaration.name === 'NotBarelExported'), - declaration2 = index.declarationInfos.find(o => o.declaration.name === 'isString'); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'NotBarelExported'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'isString'); + ctrl.addDeclarationImport(declaration!).addDeclarationImport(declaration2!); (await ctrl.commit()).should.be.true; - document.lineAt(0).text.should.equals( - `import { NotBarelExported } from '../../server/indices/NotBarelExported';` + document.lineAt(2).text.should.equals( + `import { NotBarelExported } from '../../server/indices/NotBarelExported';`, ); document.lineAt(1).text.should.equals( - `import { isString } from '../../server/indices/HelperFunctions';` + `import { isString } from '../../server/indices/HelperFunctions';`, ); }); - it('should add three new imports to the document (top)', async () => { + it('should add three new imports to the document (@correct place)', async () => { const ctrl = await ImportManager.create(document); - const declaration = index.declarationInfos.find(o => o.declaration.name === 'NotBarelExported'), - declaration2 = index.declarationInfos.find(o => o.declaration.name === 'isString'), - declaration3 = index.declarationInfos.find(o => o.declaration.name === 'myComponent'); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'NotBarelExported'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'isString'); + const declaration3 = index.declarationInfos.find(o => o.declaration.name === 'myComponent'); + ctrl.addDeclarationImport(declaration!) .addDeclarationImport(declaration2!) .addDeclarationImport(declaration3!); (await ctrl.commit()).should.be.true; - document.lineAt(0).text.should.equals( - `import { NotBarelExported } from '../../server/indices/NotBarelExported';` + document.lineAt(3).text.should.equals( + `import { NotBarelExported } from '../../server/indices/NotBarelExported';`, ); document.lineAt(1).text.should.equals( - `import { isString } from '../../server/indices/HelperFunctions';` + `import { isString } from '../../server/indices/HelperFunctions';`, ); document.lineAt(2).text.should.equals( - `import { myComponent } from '../../server/indices/MyReactTemplate';` + `import { myComponent } from '../../server/indices/MyReactTemplate';`, ); }); - it('should add a single new module import to the document (top)', async () => { + it('should add a single new module import to the document (@correct place)', async () => { const ctrl = await ImportManager.create(document); const declaration = index.declarationInfos.find(o => o.from === 'body-parser'); ctrl.addDeclarationImport(declaration!); @@ -504,19 +553,19 @@ let foobar = DefaultImport(); document.lineAt(0).text.should.equals(`import * as bodyParser from 'body-parser';`); }); - it('should add a single default import to the document (top)', async () => { + it('should add a single default import to the document (@correct place)', async () => { const stub = mockInputBox('DEFAULT_IMPORT'); try { const ctrl = await ImportManager.create(document); const declaration = index.declarationInfos.find( - o => o.declaration.name === 'myDefaultExportedFunction' + o => o.declaration.name === 'myDefaultExportedFunction', ); ctrl.addDeclarationImport(declaration!); (await ctrl.commit()).should.be.true; stub.should.be.calledWithMatch({ value: 'myDefaultExportedFunction' }); - document.lineAt(0).text.should.equals( - `import DEFAULT_IMPORT from '../../server/indices/defaultExport/lateDefaultExportedElement';` + document.lineAt(1).text.should.equals( + `import DEFAULT_IMPORT from '../../server/indices/defaultExport/lateDefaultExportedElement';`, ); } finally { restoreInputBox(stub); @@ -532,10 +581,10 @@ let foobar = DefaultImport(); (await ctrl.commit()).should.be.true; document.lineAt(0).text.should.equal( - `import { FancierLibraryClass } from 'fancy-library/FancierLibraryClass';` + `import { FancierLibraryClass } from 'fancy-library/FancierLibraryClass';`, ); - document.lineAt(1).text.should.equal( - `import { Class1, FancierLibraryClass as ALIASED_IMPORT } from '../../server/indices';` + document.lineAt(2).text.should.equal( + `import { Class1, FancierLibraryClass as ALIASED_IMPORT } from '../../server/indices';`, ); } finally { restoreInputBox(stub); @@ -553,8 +602,9 @@ let foobar = DefaultImport(); it('should add multiple specifier to an existing import', async () => { const ctrl = await ImportManager.create(document); - const declaration = index.declarationInfos.find(o => o.declaration.name === 'Class2'), - declaration2 = index.declarationInfos.find(o => o.declaration.name === 'Class3'); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'Class2'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'Class3'); + ctrl.addDeclarationImport(declaration!).addDeclarationImport(declaration2!); (await ctrl.commit()).should.be.true; @@ -565,14 +615,20 @@ let foobar = DefaultImport(); const stub = mockInputBox('DEFAULT_IMPORT'); try { const ctrl = await ImportManager.create(document); - const declaration = index.declarationInfos.find(o => o.declaration.name === 'multiExport'), - declaration2 = index.declarationInfos.find(o => o.declaration.name === 'MultiExportClass'); - ctrl.addDeclarationImport(declaration!).addDeclarationImport(declaration2!); + const declaration = index.declarationInfos.find(o => o.declaration.name === 'multiExport'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'MultiExportClass'); + + try { + ctrl.addDeclarationImport(declaration!); + ctrl.addDeclarationImport(declaration2!); + } catch (e) { + console.log(e); + } (await ctrl.commit()).should.be.true; - document.lineAt(0).text.should.equals( + document.lineAt(1).text.should.equals( `import { default as DEFAULT_IMPORT, MultiExportClass } ` + - `from '../../server/indices/defaultExport/multiExport';` + `from '../../server/indices/defaultExport/multiExport';`, ); } finally { restoreInputBox(stub); @@ -581,17 +637,17 @@ let foobar = DefaultImport(); it('should add a specifier to an import and a new import', async () => { const ctrl = await ImportManager.create(document); - const declaration1 = index.declarationInfos.find(o => o.declaration.name === 'Class2'), - declaration2 = index.declarationInfos.find(o => o.declaration.name === 'myComponent'); + const declaration1 = index.declarationInfos.find(o => o.declaration.name === 'Class2'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'myComponent'); await ctrl.addDeclarationImport(declaration1!) .addDeclarationImport(declaration2!) .commit(); - document.lineAt(0).text.should.equals( - `import { myComponent } from '../../server/indices/MyReactTemplate';` + document.lineAt(1).text.should.equals( + `import { myComponent } from '../../server/indices/MyReactTemplate';`, ); - document.lineAt(1).text.should.equals(`import { Class1, Class2 } from '../../server/indices';`); + document.lineAt(0).text.should.equals(`import { Class1, Class2 } from '../../server/indices';`); }); it('should convert a default import when a normal specifier is added', async () => { @@ -601,16 +657,16 @@ let foobar = DefaultImport(); let declaration = index.declarationInfos.find(o => o.declaration.name === 'multiExport'); await ctrl.addDeclarationImport(declaration!).commit(); - document.lineAt(0).text.should.equals( - `import DEFAULT_IMPORT from '../../server/indices/defaultExport/multiExport';` + document.lineAt(1).text.should.equals( + `import DEFAULT_IMPORT from '../../server/indices/defaultExport/multiExport';`, ); declaration = index.declarationInfos.find(o => o.declaration.name === 'MultiExportClass'); await ctrl.addDeclarationImport(declaration!).commit(); - document.lineAt(0).text.should.equals( + document.lineAt(1).text.should.equals( `import { default as DEFAULT_IMPORT, MultiExportClass } ` + - `from '../../server/indices/defaultExport/multiExport';` + `from '../../server/indices/defaultExport/multiExport';`, ); } finally { restoreInputBox(stub); @@ -624,17 +680,17 @@ let foobar = DefaultImport(); let declaration = index.declarationInfos.find(o => o.declaration.name === 'MultiExportClass'); await ctrl.addDeclarationImport(declaration!).commit(); - document.lineAt(0).text.should.equals( - `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';` + document.lineAt(1).text.should.equals( + `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';`, ); declaration = index.declarationInfos.find(o => o.declaration.name === 'multiExport'); ctrl.addDeclarationImport(declaration!); await ctrl.commit(); - document.lineAt(0).text.should.equals( + document.lineAt(1).text.should.equals( `import { default as DEFAULT_IMPORT, MultiExportClass } ` + - `from '../../server/indices/defaultExport/multiExport';` + `from '../../server/indices/defaultExport/multiExport';`, ); } finally { restoreInputBox(stub); @@ -642,37 +698,38 @@ let foobar = DefaultImport(); }); it('should render the optimized import', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert(new Position(5, 0), 'const foobar = new Class2();\n'); }); + const ctrl = await ImportManager.create(document); - const declaration1 = index.declarationInfos.find(o => o.declaration.name === 'Class2'), - declaration2 = index.declarationInfos.find(o => o.declaration.name === 'MultiExportClass'); + const declaration1 = index.declarationInfos.find(o => o.declaration.name === 'Class2'); + const declaration2 = index.declarationInfos.find(o => o.declaration.name === 'MultiExportClass'); await ctrl.addDeclarationImport(declaration1!) .addDeclarationImport(declaration2!) .commit(); - document.lineAt(0).text.should.equals( - `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';` - ); document.lineAt(1).text.should.equals( - `import { Class1, Class2 } from '../../server/indices';` + `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';`, + ); + document.lineAt(0).text.should.equals( + `import { Class1, Class2 } from '../../server/indices';`, ); await ctrl.organizeImports().commit(); document.lineAt(0).text.should.equals( - `import { Class1, Class2 } from '../../server/indices';` + `import { Class1, Class2 } from '../../server/indices';`, ); document.lineAt(1).text.should.equals(''); }); it('should render sorted imports when optimizing', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert( new Position(0, 0), - `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';\n` + `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';\n`, ); builder.insert(new Position(5, 0), 'const foobar = new MultiExportClass();\n'); }); @@ -681,15 +738,15 @@ let foobar = DefaultImport(); await ctrl.organizeImports().commit(); document.lineAt(1).text.should.equals( - `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';` + `import { MultiExportClass } from '../../server/indices/defaultExport/multiExport';`, ); document.lineAt(0).text.should.equals( - `import { Class1 } from '../../server/indices';` + `import { Class1 } from '../../server/indices';`, ); }); it('should render sorted specifiers when optimizing', async () => { - await window.activeTextEditor.edit(builder => { + await window.activeTextEditor!.edit((builder) => { builder.insert(new Position(0, 9), 'Class2, '); builder.insert(new Position(5, 0), 'const foobar = new Class2();\n'); }); @@ -698,32 +755,10 @@ let foobar = DefaultImport(); await ctrl.organizeImports().commit(); document.lineAt(0).text.should.equals( - `import { Class1, Class2 } from '../../server/indices';` + `import { Class1, Class2 } from '../../server/indices';`, ); }); - it('should ask which declaration should be used on multiple options (add missing)', async () => { - let stub: sinon.SinonStub | undefined; - try { - const declarations = index.declarationInfos.filter(o => o.declaration.name === 'FancierLibraryClass'); - stub = sinon.stub(window, 'showQuickPick').callsFake(() => { - return Promise.resolve(new ResolveQuickPickItem(declarations[0])); - }); - await window.activeTextEditor.edit(builder => { - builder.insert(new Position(5, 0), 'const foobar = new FancierLibraryClass();\n'); - }); - const ctrl = await ImportManager.create(document); - - await ctrl.addMissingImports(index).commit(); - - stub.should.be.calledOnce; - } finally { - if (stub) { - stub.restore(); - } - } - }); - }); }); diff --git a/test/extension/proxy-objects/ImportProxy.test.ts b/test/extension/proxy-objects/ImportProxy.test.ts index 59af914..5518a86 100644 --- a/test/extension/proxy-objects/ImportProxy.test.ts +++ b/test/extension/proxy-objects/ImportProxy.test.ts @@ -1,9 +1,10 @@ +import * as chai from 'chai'; +import { given } from 'mocha-testdata'; + import { GenerationOptions } from '../../../src/common/ts-generation'; import { SymbolSpecifier } from '../../../src/common/ts-parsing'; import { DefaultImport, NamedImport } from '../../../src/common/ts-parsing/imports'; import { ImportProxy } from '../../../src/extension/proxy-objects/ImportProxy'; -import * as chai from 'chai'; -import { given } from 'mocha-testdata'; chai.should(); @@ -19,8 +20,8 @@ describe('ImportProxy', () => { }); it('should use the values of a given TsNamedImport', () => { - const imp = new NamedImport('foo', 42, 1337), - proxy = new ImportProxy(imp); + const imp = new NamedImport('foo', 42, 1337); + const proxy = new ImportProxy(imp); proxy.libraryName.should.equal(imp.libraryName); proxy.start!.should.equal(imp.start); @@ -37,8 +38,8 @@ describe('ImportProxy', () => { }); it('should add a default alias from a TsDefaultImport', () => { - const imp = new DefaultImport('foo', 'ALIAS'), - proxy = new ImportProxy(imp); + const imp = new DefaultImport('foo', 'ALIAS'); + const proxy = new ImportProxy(imp); proxy.defaultAlias!.should.equal('ALIAS'); }); @@ -85,8 +86,8 @@ describe('ImportProxy', () => { describe('isEqual()', () => { it('should return true if another proxy is equal', () => { - const p1 = new ImportProxy('foo'), - p2 = new ImportProxy('foo'); + const p1 = new ImportProxy('foo'); + const p2 = new ImportProxy('foo'); p1.addSpecifier('bar'); p2.addSpecifier('bar'); @@ -167,9 +168,10 @@ describe('ImportProxy', () => { const options: GenerationOptions = { eol: ';', multiLineWrapThreshold: 120, + multiLineTrailingComma: false, stringQuoteStyle: `'`, spaceBraces: true, - tabSize: 4 + tabSize: 4, }; let proxy: ImportProxy; @@ -179,32 +181,32 @@ describe('ImportProxy', () => { it('should generate a TsDefaultImport when no specifiers are provided', () => { proxy.defaultAlias = 'ALIAS'; - proxy.generateTypescript(options).should.equal(`import ALIAS from 'foo';\n`); + proxy.generateTypescript(options).should.equal(`import ALIAS from 'foo';`); }); it('should generate a normal TsNamedImport when no default import is provided', () => { proxy.addSpecifier('bar'); proxy.addSpecifier('baz'); - proxy.generateTypescript(options).should.equal(`import { bar, baz } from 'foo';\n`); + proxy.generateTypescript(options).should.equal(`import { bar, baz } from 'foo';`); }); it('should generate a normal TsNamedImport with aliases when no default import is provided', () => { proxy.addSpecifier('bar'); proxy.specifiers.push(new SymbolSpecifier('baz', 'blub')); - proxy.generateTypescript(options).should.equal(`import { bar, baz as blub } from 'foo';\n`); + proxy.generateTypescript(options).should.equal(`import { bar, baz as blub } from 'foo';`); }); it('should generate a TsNamedImport with default import', () => { proxy.defaultAlias = 'ALIAS'; proxy.addSpecifier('bar'); - proxy.generateTypescript(options).should.equal(`import { bar, default as ALIAS } from 'foo';\n`); + proxy.generateTypescript(options).should.equal(`import { bar, default as ALIAS } from 'foo';`); }); it('should omit semicolons if configured', () => { const optionsClone = Object.assign({}, options); optionsClone.eol = ''; proxy.defaultAlias = 'ALIAS'; - proxy.generateTypescript(optionsClone).should.equal(`import ALIAS from 'foo'\n`); + proxy.generateTypescript(optionsClone).should.equal(`import ALIAS from 'foo'`); }); }); diff --git a/test/server/indices/DeclarationIndex.test.ts b/test/server/indices/DeclarationIndex.test.ts index 42ea359..4d4a33a 100644 --- a/test/server/indices/DeclarationIndex.test.ts +++ b/test/server/indices/DeclarationIndex.test.ts @@ -1,18 +1,20 @@ import 'reflect-metadata'; + +import * as chai from 'chai'; +import * as vscode from 'vscode'; + import { ClassDeclaration, FunctionDeclaration } from '../../../src/common/ts-parsing/declarations'; import { findFiles } from '../../../src/extension/extensions/ImportResolveExtension'; import { VscodeExtensionConfig } from '../../../src/extension/VscodeExtensionConfig'; import { DeclarationIndex } from '../../../src/server/indices/DeclarationIndex'; import { Container } from '../../../src/server/IoC'; -import * as chai from 'chai'; -import * as vscode from 'vscode'; const should = chai.should(); describe('DeclarationIndex', () => { - let declarationIndex: DeclarationIndex, - files: string[]; + let declarationIndex: DeclarationIndex; + let files: string[]; before(async () => { const config = new VscodeExtensionConfig(); @@ -26,11 +28,11 @@ describe('DeclarationIndex', () => { }); it('should not process a circular export cycle', async () => { - await declarationIndex.buildIndex(files, vscode.workspace.rootPath); + await declarationIndex.buildIndex(files, vscode.workspace.rootPath!); }); it('should resolve the build process', async () => { - await declarationIndex.buildIndex(files, vscode.workspace.rootPath); + await declarationIndex.buildIndex(files, vscode.workspace.rootPath!); }); it('should not have an index ready without build', () => { @@ -38,7 +40,7 @@ describe('DeclarationIndex', () => { }); it('should have an index ready after build', async () => { - await declarationIndex.buildIndex(files, vscode.workspace.rootPath); + await declarationIndex.buildIndex(files, vscode.workspace.rootPath!); declarationIndex.indexReady.should.be.true; }); @@ -46,13 +48,14 @@ describe('DeclarationIndex', () => { describe('buildIndex()', () => { beforeEach(async () => { - await declarationIndex.buildIndex(files, vscode.workspace.rootPath); + await declarationIndex.buildIndex(files, vscode.workspace.rootPath!); }); it('should contain certain parsedResources', () => { - let idx: any = declarationIndex, - resources = Object.assign({}, idx.parsedResources); + const idx: any = declarationIndex; + const resources = Object.assign({}, idx.parsedResources); + resources.should.contain.any.key('body-parser'); resources.should.contain.any.key('fancy-library'); resources.should.contain.any.key('NodeJS'); @@ -61,7 +64,7 @@ describe('DeclarationIndex', () => { }); it('should contain declarations with names', () => { - let list = declarationIndex.index!['isString']; + const list = declarationIndex.index!['isString']; list.should.be.an('array').with.lengthOf(2); list[0].from.should.equal('/server/indices/HelperFunctions'); @@ -70,7 +73,7 @@ describe('DeclarationIndex', () => { it('should contain a declaration name with multiple declarations', () => { - let list = declarationIndex.index!['FancierLibraryClass']; + const list = declarationIndex.index!['FancierLibraryClass']; list.should.be.an('array').with.lengthOf(2); list[0].from.should.equal('/server/indices'); @@ -80,56 +83,60 @@ describe('DeclarationIndex', () => { }); it('should not contain a duplicate declaration (overloaded declarations)', () => { - let list = declarationIndex.index!['execFile']; + const list = declarationIndex.index!['execFile']; list.should.be.an('array').with.lengthOf(1); list[0].from.should.equal('child_process'); }); it('should export * as correctly', () => { - let idx: any = declarationIndex, - resources = Object.assign({}, idx.parsedResources); + const idx: any = declarationIndex; + const resources = Object.assign({}, idx.parsedResources); + resources['/server/indices/MyClass'].declarations.length.should.equal(0); resources['/server/indices/index'].declarations[0].name.should.equal('MyClass'); resources['/server/indices/index'].declarations[1].name.should.equal('FancierLibraryClass'); }); it('should export an alias correctly', () => { - let idx: any = declarationIndex, - resources = Object.assign({}, idx.parsedResources); + const idx: any = declarationIndex; + const resources = Object.assign({}, idx.parsedResources); + resources['/server/indices/SpecialExports'].declarations.length.should.equal(0); resources['/server/indices/index'].declarations[11].name.should.equal('ExportAlias'); }); it('should not contain items from the build directory', () => { - let idx: any = declarationIndex, - resources = Object.assign({}, idx.parsedResources); + const idx: any = declarationIndex; + const resources = Object.assign({}, idx.parsedResources); + resources.should.not.contain.any.key('/build/app'); }); it('should contain declaration from *.tsx file', () => { - let idx: any = declarationIndex, - resources = Object.assign({}, idx.parsedResources); + const idx: any = declarationIndex; + const resources = Object.assign({}, idx.parsedResources); + resources['/server/indices/MyReactTemplate'].declarations.length.should.equal(1); resources['/server/indices/MyReactTemplate'].declarations[0].name.should.equal('myComponent'); }); it('should not filter node_modules / typings by pattern', () => { - let list = declarationIndex.index!['NestedDistDeclaration']; + const list = declarationIndex.index!['NestedDistDeclaration']; list.should.be.an('array').with.lengthOf(1); list[0].from.should.equal('some-lib/dist/SomeDeclaration'); }); it('should not contain filtered directories', () => { - let list = declarationIndex.index!['MyCompiledClass']; + const list = declarationIndex.index!['MyCompiledClass']; should.not.exist(list); }); it('should not crash on prototype methods (i.e. toString, hasOwnProperty)', () => { - let list = declarationIndex.index!['toString']; + const list = declarationIndex.index!['toString']; list.should.be.an('array').with.lengthOf(1); list[0].from.should.equal('/server/indices/proto'); - let list2 = declarationIndex.index!['hasOwnProperty']; + const list2 = declarationIndex.index!['hasOwnProperty']; list2.should.be.an('array').with.lengthOf(1); list2[0].from.should.equal('/server/indices/proto'); }); diff --git a/yarn.lock b/yarn.lock deleted file mode 100644 index c6e5a6c..0000000 --- a/yarn.lock +++ /dev/null @@ -1,2750 +0,0 @@ -# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. -# yarn lockfile v1 - - -"@types/chai@*", "@types/chai@^4.0.0": - version "4.0.0" - resolved "https://registry.yarnpkg.com/@types/chai/-/chai-4.0.0.tgz#4c9adabd2d04265769e6d9e847e86cc404dc7dcd" - -"@types/mocha@^2.2.39": - version "2.2.41" - resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-2.2.41.tgz#e27cf0817153eb9f2713b2d3f6c68f1e1c3ca608" - -"@types/node@^7.0.27": - version "7.0.27" - resolved "https://registry.yarnpkg.com/@types/node/-/node-7.0.27.tgz#ba5e1a87aca2b4f5817289615ffe56472927687e" - -"@types/reflect-metadata@0.0.5": - version "0.0.5" - resolved "https://registry.yarnpkg.com/@types/reflect-metadata/-/reflect-metadata-0.0.5.tgz#9c042bfa9803d577aad4f57dfbca4b7cae4286fe" - -"@types/sinon-chai@^2.7.27": - version "2.7.27" - resolved "https://registry.yarnpkg.com/@types/sinon-chai/-/sinon-chai-2.7.27.tgz#eb7729058ddf253a6979e559bb2b491084969aa1" - dependencies: - "@types/chai" "*" - "@types/sinon" "*" - -"@types/sinon@*", "@types/sinon@^2.3.0": - version "2.3.0" - resolved "https://registry.yarnpkg.com/@types/sinon/-/sinon-2.3.0.tgz#2cd3a0d53991d7a7b2a9179633c2a73795d853b6" - -abbrev@1: - version "1.1.0" - resolved "https://registry.yarnpkg.com/abbrev/-/abbrev-1.1.0.tgz#d0554c2256636e2f56e7c2e5ad183f859428d81f" - -ajv@^4.9.1: - version "4.11.8" - resolved "https://registry.yarnpkg.com/ajv/-/ajv-4.11.8.tgz#82ffb02b29e662ae53bdc20af15947706739c536" - dependencies: - co "^4.6.0" - json-stable-stringify "^1.0.1" - -ansi-align@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/ansi-align/-/ansi-align-2.0.0.tgz#c36aeccba563b89ceb556f3690f0b1d9e3547f7f" - dependencies: - string-width "^2.0.0" - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz#c3b33ab5ee360d86e0e628f0468ae7ef27d654df" - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz#b432dd3358b634cf75e1e4664368240533c1ddbe" - -anymatch@^1.1.0, anymatch@^1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/anymatch/-/anymatch-1.3.0.tgz#a3e52fa39168c825ff57b0248126ce5a8ff95507" - dependencies: - arrify "^1.0.0" - micromatch "^2.1.5" - -aproba@^1.0.3: - version "1.1.1" - resolved "https://registry.yarnpkg.com/aproba/-/aproba-1.1.1.tgz#95d3600f07710aa0e9298c726ad5ecf2eacbabab" - -are-we-there-yet@~1.1.2: - version "1.1.4" - resolved "https://registry.yarnpkg.com/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz#bb5dca382bb94f05e15194373d16fd3ba1ca110d" - dependencies: - delegates "^1.0.0" - readable-stream "^2.0.6" - -argparse@^1.0.7: - version "1.0.9" - resolved "https://registry.yarnpkg.com/argparse/-/argparse-1.0.9.tgz#73d83bc263f86e97f8cc4f6bae1b0e90a7d22c86" - dependencies: - sprintf-js "~1.0.2" - -arr-diff@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/arr-diff/-/arr-diff-2.0.0.tgz#8f3b827f955a8bd669697e4a4256ac3ceae356cf" - dependencies: - arr-flatten "^1.0.1" - -arr-flatten@^1.0.1: - version "1.0.3" - resolved "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.0.3.tgz#a274ed85ac08849b6bd7847c4580745dc51adfb1" - -array-differ@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/array-differ/-/array-differ-1.0.0.tgz#eff52e3758249d33be402b8bb8e564bb2b5d4031" - -array-filter@~0.0.0: - version "0.0.1" - resolved "https://registry.yarnpkg.com/array-filter/-/array-filter-0.0.1.tgz#7da8cf2e26628ed732803581fd21f67cacd2eeec" - -array-find-index@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-find-index/-/array-find-index-1.0.2.tgz#df010aa1287e164bbda6f9723b0a96a1ec4187a1" - -array-map@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-map/-/array-map-0.0.0.tgz#88a2bab73d1cf7bcd5c1b118a003f66f665fa662" - -array-reduce@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/array-reduce/-/array-reduce-0.0.0.tgz#173899d3ffd1c7d9383e4479525dbe278cab5f2b" - -array-union@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz#9a34410e4f4e3da23dea375be5be70f24778ec39" - dependencies: - array-uniq "^1.0.1" - -array-uniq@^1.0.1, array-uniq@^1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz#af6ac877a25cc7f74e058894753858dfdb24fdb6" - -array-unique@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/array-unique/-/array-unique-0.2.1.tgz#a1d97ccafcbc2625cc70fadceb36a50c58b01a53" - -arrify@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/arrify/-/arrify-1.0.1.tgz#898508da2226f380df904728456849c1501a4b0d" - -asn1@~0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/asn1/-/asn1-0.2.3.tgz#dac8787713c9966849fc8180777ebe9c1ddf3b86" - -assert-plus@1.0.0, assert-plus@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz#f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525" - -assert-plus@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/assert-plus/-/assert-plus-0.2.0.tgz#d74e1b87e7affc0db8aadb7021f3fe48101ab234" - -assertion-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/assertion-error/-/assertion-error-1.0.2.tgz#13ca515d86206da0bac66e834dd397d87581094c" - -async-each@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/async-each/-/async-each-1.0.1.tgz#19d386a1d9edc6e7c1c85d388aedbcc56d33602d" - -asynckit@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" - -aws-sign2@~0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.6.0.tgz#14342dd38dbcc94d0e5b87d763cd63612c0e794f" - -aws4@^1.2.1: - version "1.6.0" - resolved "https://registry.yarnpkg.com/aws4/-/aws4-1.6.0.tgz#83ef5ca860b2b32e4a0deedee8c771b9db57471e" - -babel-code-frame@^6.22.0: - version "6.22.0" - resolved "https://registry.yarnpkg.com/babel-code-frame/-/babel-code-frame-6.22.0.tgz#027620bee567a88c32561574e7fd0801d33118e4" - dependencies: - chalk "^1.1.0" - esutils "^2.0.2" - js-tokens "^3.0.0" - -balanced-match@^0.4.1: - version "0.4.2" - resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-0.4.2.tgz#cb3f3e3c732dc0f01ee70b403f302e61d7709838" - -bcrypt-pbkdf@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz#63bc5dcb61331b92bc05fd528953c33462a06f8d" - dependencies: - tweetnacl "^0.14.3" - -beeper@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/beeper/-/beeper-1.1.1.tgz#e6d5ea8c5dad001304a70b22638447f69cb2f809" - -binary-extensions@^1.0.0: - version "1.8.0" - resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.8.0.tgz#48ec8d16df4377eae5fa5884682480af4d95c774" - -block-stream@*: - version "0.0.9" - resolved "https://registry.yarnpkg.com/block-stream/-/block-stream-0.0.9.tgz#13ebfe778a03205cfe03751481ebb4b3300c126a" - dependencies: - inherits "~2.0.0" - -bluebird@^2.9.24: - version "2.11.0" - resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-2.11.0.tgz#534b9033c022c9579c56ba3b3e5a5caafbb650e1" - -boom@2.x.x: - version "2.10.1" - resolved "https://registry.yarnpkg.com/boom/-/boom-2.10.1.tgz#39c8918ceff5799f83f9492a848f625add0c766f" - dependencies: - hoek "2.x.x" - -boxen@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/boxen/-/boxen-1.1.0.tgz#b1b69dd522305e807a99deee777dbd6e5167b102" - dependencies: - ansi-align "^2.0.0" - camelcase "^4.0.0" - chalk "^1.1.1" - cli-boxes "^1.0.0" - string-width "^2.0.0" - term-size "^0.1.0" - widest-line "^1.0.0" - -brace-expansion@^1.1.7: - version "1.1.7" - resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.7.tgz#3effc3c50e000531fb720eaff80f0ae8ef23cf59" - dependencies: - balanced-match "^0.4.1" - concat-map "0.0.1" - -braces@^1.8.2: - version "1.8.5" - resolved "https://registry.yarnpkg.com/braces/-/braces-1.8.5.tgz#ba77962e12dff969d6b76711e914b737857bf6a7" - dependencies: - expand-range "^1.8.1" - preserve "^0.2.0" - repeat-element "^1.1.2" - -browser-stdout@1.3.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/browser-stdout/-/browser-stdout-1.3.0.tgz#f351d32969d32fa5d7a5567154263d928ae3bd1f" - -buffer-crc32@~0.2.3: - version "0.2.13" - resolved "https://registry.yarnpkg.com/buffer-crc32/-/buffer-crc32-0.2.13.tgz#0d333e3f00eac50aa1454abd30ef8c2a5d9a7242" - -buffer-shims@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/buffer-shims/-/buffer-shims-1.0.0.tgz#9978ce317388c649ad8793028c3477ef044a8b51" - -builtin-modules@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/builtin-modules/-/builtin-modules-1.1.1.tgz#270f076c5a72c02f5b65a47df94c5fe3a278892f" - -camelcase-keys@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/camelcase-keys/-/camelcase-keys-2.1.0.tgz#308beeaffdf28119051efa1d932213c91b8f92e7" - dependencies: - camelcase "^2.0.0" - map-obj "^1.0.0" - -camelcase@^2.0.0, camelcase@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-2.1.1.tgz#7c1d16d679a1bbe59ca02cacecfb011e201f5a1f" - -camelcase@^4.0.0: - version "4.1.0" - resolved "https://registry.yarnpkg.com/camelcase/-/camelcase-4.1.0.tgz#d545635be1e33c542649c69173e5de6acfae34dd" - -capture-stack-trace@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/capture-stack-trace/-/capture-stack-trace-1.0.0.tgz#4a6fa07399c26bba47f0b2496b4d0fb408c5550d" - -caseless@~0.11.0: - version "0.11.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.11.0.tgz#715b96ea9841593cc33067923f5ec60ebda4f7d7" - -caseless@~0.12.0: - version "0.12.0" - resolved "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz#1b681c21ff84033c826543090689420d187151dc" - -chai@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/chai/-/chai-4.0.1.tgz#9e41e808e17a7f10807721e2ac5a589d5bb09082" - dependencies: - assertion-error "^1.0.1" - check-error "^1.0.1" - deep-eql "^2.0.1" - get-func-name "^2.0.0" - pathval "^1.0.0" - type-detect "^4.0.0" - -chalk@^1.0.0, chalk@^1.1.0, chalk@^1.1.1: - version "1.1.3" - resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98" - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - -check-error@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/check-error/-/check-error-1.0.2.tgz#574d312edd88bb5dd8912e9286dd6c0aed4aac82" - -chokidar-cli@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/chokidar-cli/-/chokidar-cli-1.2.0.tgz#8e7f58442273182018be1868e53c22af65a21948" - dependencies: - anymatch "^1.1.0" - bluebird "^2.9.24" - chokidar "^1.0.1" - lodash "^3.7.0" - shell-quote "^1.4.3" - yargs "^3.7.2" - -chokidar@^1.0.1: - version "1.7.0" - resolved "https://registry.yarnpkg.com/chokidar/-/chokidar-1.7.0.tgz#798e689778151c8076b4b360e5edd28cda2bb468" - dependencies: - anymatch "^1.3.0" - async-each "^1.0.0" - glob-parent "^2.0.0" - inherits "^2.0.1" - is-binary-path "^1.0.0" - is-glob "^2.0.0" - path-is-absolute "^1.0.0" - readdirp "^2.0.0" - optionalDependencies: - fsevents "^1.0.0" - -cli-boxes@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cli-boxes/-/cli-boxes-1.0.0.tgz#4fa917c3e59c94a004cd61f8ee509da651687143" - -cliui@^3.0.3: - version "3.2.0" - resolved "https://registry.yarnpkg.com/cliui/-/cliui-3.2.0.tgz#120601537a916d29940f934da3b48d585a39213d" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - wrap-ansi "^2.0.0" - -clone-buffer@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58" - -clone-stats@^0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-0.0.1.tgz#b88f94a82cf38b8791d58046ea4029ad88ca99d1" - -clone-stats@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/clone-stats/-/clone-stats-1.0.0.tgz#b3782dff8bb5474e18b9b6bf0fdfe782f8777680" - -clone@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/clone/-/clone-0.2.0.tgz#c6126a90ad4f72dbf5acdb243cc37724fe93fc1f" - -clone@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.2.tgz#260b7a99ebb1edfe247538175f783243cb19d149" - -cloneable-readable@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/cloneable-readable/-/cloneable-readable-1.0.0.tgz#a6290d413f217a61232f95e458ff38418cfb0117" - dependencies: - inherits "^2.0.1" - process-nextick-args "^1.0.6" - through2 "^2.0.1" - -co@^4.6.0: - version "4.6.0" - resolved "https://registry.yarnpkg.com/co/-/co-4.6.0.tgz#6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184" - -code-point-at@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/code-point-at/-/code-point-at-1.1.0.tgz#0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77" - -colors@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/colors/-/colors-1.1.2.tgz#168a4701756b6a7f51a12ce0c97bfa28c084ed63" - -combined-stream@^1.0.5, combined-stream@~1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.5.tgz#938370a57b4a51dea2c77c15d5c5fdf895164009" - dependencies: - delayed-stream "~1.0.0" - -commander@2.9.0, commander@^2.9.0: - version "2.9.0" - resolved "https://registry.yarnpkg.com/commander/-/commander-2.9.0.tgz#9c99094176e12240cb22d6c5146098400fe0f7d4" - dependencies: - graceful-readlink ">= 1.0.0" - -concat-map@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz#d8a96bd77fd68df7793a73036a3ba0d5405d477b" - -configstore@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/configstore/-/configstore-3.1.0.tgz#45df907073e26dfa1cf4b2d52f5b60545eaa11d1" - dependencies: - dot-prop "^4.1.0" - graceful-fs "^4.1.2" - make-dir "^1.0.0" - unique-string "^1.0.0" - write-file-atomic "^2.0.0" - xdg-basedir "^3.0.0" - -console-control-strings@^1.0.0, console-control-strings@~1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/console-control-strings/-/console-control-strings-1.1.0.tgz#3d7cf4464db6446ea644bf4b39507f9851008e8e" - -convert-source-map@^1.1.1: - version "1.5.0" - resolved "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.5.0.tgz#9acd70851c6d5dfdd93d9282e5edf94a03ff46b5" - -core-util-is@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7" - -coveralls@^2.11.9: - version "2.13.1" - resolved "https://registry.yarnpkg.com/coveralls/-/coveralls-2.13.1.tgz#d70bb9acc1835ec4f063ff9dac5423c17b11f178" - dependencies: - js-yaml "3.6.1" - lcov-parse "0.0.10" - log-driver "1.2.5" - minimist "1.2.0" - request "2.79.0" - -create-error-class@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/create-error-class/-/create-error-class-3.0.2.tgz#06be7abef947a3f14a30fd610671d401bca8b7b6" - dependencies: - capture-stack-trace "^1.0.0" - -cross-spawn-async@^2.1.1: - version "2.2.5" - resolved "https://registry.yarnpkg.com/cross-spawn-async/-/cross-spawn-async-2.2.5.tgz#845ff0c0834a3ded9d160daca6d390906bb288cc" - dependencies: - lru-cache "^4.0.0" - which "^1.2.8" - -cryptiles@2.x.x: - version "2.0.5" - resolved "https://registry.yarnpkg.com/cryptiles/-/cryptiles-2.0.5.tgz#3bdfecdc608147c1c67202fa291e7dca59eaa3b8" - dependencies: - boom "2.x.x" - -crypto-random-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/crypto-random-string/-/crypto-random-string-1.0.0.tgz#a230f64f568310e1498009940790ec99545bca7e" - -currently-unhandled@^0.4.1: - version "0.4.1" - resolved "https://registry.yarnpkg.com/currently-unhandled/-/currently-unhandled-0.4.1.tgz#988df33feab191ef799a61369dd76c17adf957ea" - dependencies: - array-find-index "^1.0.1" - -dashdash@^1.12.0: - version "1.14.1" - resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0" - dependencies: - assert-plus "^1.0.0" - -dateformat@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/dateformat/-/dateformat-2.0.0.tgz#2743e3abb5c3fc2462e527dca445e04e9f4dee17" - -debug@2.6.0, debug@^2.2.0: - version "2.6.0" - resolved "https://registry.yarnpkg.com/debug/-/debug-2.6.0.tgz#bc596bcabe7617f11d9fa15361eded5608b8499b" - dependencies: - ms "0.7.2" - -decamelize@^1.1.1, decamelize@^1.1.2: - version "1.2.0" - resolved "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz#f6534d15148269b20352e7bee26f501f9a191290" - -deep-assign@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/deep-assign/-/deep-assign-1.0.0.tgz#b092743be8427dc621ea0067cdec7e70dd19f37b" - dependencies: - is-obj "^1.0.0" - -deep-eql@^2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/deep-eql/-/deep-eql-2.0.2.tgz#b1bac06e56f0a76777686d50c9feb75c2ed7679a" - dependencies: - type-detect "^3.0.0" - -deep-extend@~0.4.0: - version "0.4.2" - resolved "https://registry.yarnpkg.com/deep-extend/-/deep-extend-0.4.2.tgz#48b699c27e334bf89f10892be432f6e4c7d34a7f" - -del-cli@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/del-cli/-/del-cli-1.0.0.tgz#3cffc1d508b25b532c703b9c450e43967899162d" - dependencies: - del "^2.2.0" - meow "^3.6.0" - update-notifier "^2.1.0" - -del@^2.2.0: - version "2.2.2" - resolved "https://registry.yarnpkg.com/del/-/del-2.2.2.tgz#c12c981d067846c84bcaf862cff930d907ffd1a8" - dependencies: - globby "^5.0.0" - is-path-cwd "^1.0.0" - is-path-in-cwd "^1.0.0" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - rimraf "^2.2.8" - -delayed-stream@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" - -delegates@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/delegates/-/delegates-1.0.0.tgz#84c6e159b81904fdca59a0ef44cd870d31250f9a" - -diff@3.2.0, diff@^3.1.0, diff@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/diff/-/diff-3.2.0.tgz#c9ce393a4b7cbd0b058a725c93df299027868ff9" - -doctrine@^0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/doctrine/-/doctrine-0.7.2.tgz#7cb860359ba3be90e040b26b729ce4bfa654c523" - dependencies: - esutils "^1.1.6" - isarray "0.0.1" - -dot-prop@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/dot-prop/-/dot-prop-4.1.1.tgz#a8493f0b7b5eeec82525b5c7587fa7de7ca859c1" - dependencies: - is-obj "^1.0.0" - -duplexer2@0.0.2: - version "0.0.2" - resolved "https://registry.yarnpkg.com/duplexer2/-/duplexer2-0.0.2.tgz#c614dcf67e2fb14995a91711e5a617e8a60a31db" - dependencies: - readable-stream "~1.1.9" - -duplexer3@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/duplexer3/-/duplexer3-0.1.4.tgz#ee01dd1cac0ed3cbc7fdbea37dc0a8f1ce002ce2" - -duplexer@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz#ace6ff808c1ce66b57d1ebf97977acb02334cfc1" - -duplexify@^3.2.0: - version "3.5.0" - resolved "https://registry.yarnpkg.com/duplexify/-/duplexify-3.5.0.tgz#1aa773002e1578457e9d9d4a50b0ccaaebcbd604" - dependencies: - end-of-stream "1.0.0" - inherits "^2.0.1" - readable-stream "^2.0.0" - stream-shift "^1.0.0" - -ecc-jsbn@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz#0fc73a9ed5f0d53c38193398523ef7e543777505" - dependencies: - jsbn "~0.1.0" - -end-of-stream@1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.0.0.tgz#d4596e702734a93e40e9af864319eabd99ff2f0e" - dependencies: - once "~1.3.0" - -error-ex@^1.2.0: - version "1.3.1" - resolved "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.1.tgz#f855a86ce61adc4e8621c3cda21e7a7612c3a8dc" - dependencies: - is-arrayish "^0.2.1" - -escape-string-regexp@1.0.5, escape-string-regexp@^1.0.2: - version "1.0.5" - resolved "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz#1b61c0562190a8dff6ae3bb2cf0200ca130b86d4" - -esprima@^2.6.0: - version "2.7.3" - resolved "https://registry.yarnpkg.com/esprima/-/esprima-2.7.3.tgz#96e3b70d5779f6ad49cd032673d1c312767ba581" - -esutils@^1.1.6: - version "1.1.6" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-1.1.6.tgz#c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375" - -esutils@^2.0.2: - version "2.0.2" - resolved "https://registry.yarnpkg.com/esutils/-/esutils-2.0.2.tgz#0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b" - -event-stream@^3.3.1, event-stream@~3.3.4: - version "3.3.4" - resolved "https://registry.yarnpkg.com/event-stream/-/event-stream-3.3.4.tgz#4ab4c9a0f5a54db9338b4c34d86bfce8f4b35571" - dependencies: - duplexer "~0.1.1" - from "~0" - map-stream "~0.1.0" - pause-stream "0.0.11" - split "0.3" - stream-combiner "~0.0.4" - through "~2.3.1" - -execa@^0.4.0: - version "0.4.0" - resolved "https://registry.yarnpkg.com/execa/-/execa-0.4.0.tgz#4eb6467a36a095fabb2970ff9d5e3fb7bce6ebc3" - dependencies: - cross-spawn-async "^2.1.1" - is-stream "^1.1.0" - npm-run-path "^1.0.0" - object-assign "^4.0.1" - path-key "^1.0.0" - strip-eof "^1.0.0" - -expand-brackets@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-0.1.5.tgz#df07284e342a807cd733ac5af72411e581d1177b" - dependencies: - is-posix-bracket "^0.1.0" - -expand-range@^1.8.1: - version "1.8.2" - resolved "https://registry.yarnpkg.com/expand-range/-/expand-range-1.8.2.tgz#a299effd335fe2721ebae8e257ec79644fc85337" - dependencies: - fill-range "^2.1.0" - -extend-shallow@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz#51af7d614ad9a9f610ea1bafbb989d6b1c56890f" - dependencies: - is-extendable "^0.1.0" - -extend@^3.0.0, extend@~3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/extend/-/extend-3.0.1.tgz#a755ea7bc1adfcc5a31ce7e762dbaadc5e636444" - -extglob@^0.3.1: - version "0.3.2" - resolved "https://registry.yarnpkg.com/extglob/-/extglob-0.3.2.tgz#2e18ff3d2f49ab2765cec9023f011daa8d8349a1" - dependencies: - is-extglob "^1.0.0" - -extsprintf@1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.0.2.tgz#e1080e0658e300b06294990cc70e1502235fd550" - -fancy-log@^1.1.0: - version "1.3.0" - resolved "https://registry.yarnpkg.com/fancy-log/-/fancy-log-1.3.0.tgz#45be17d02bb9917d60ccffd4995c999e6c8c9948" - dependencies: - chalk "^1.1.1" - time-stamp "^1.0.0" - -fd-slicer@~1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/fd-slicer/-/fd-slicer-1.0.1.tgz#8b5bcbd9ec327c5041bf9ab023fd6750f1177e65" - dependencies: - pend "~1.2.0" - -filename-regex@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/filename-regex/-/filename-regex-2.0.1.tgz#c1c4b9bee3e09725ddb106b75c1e301fe2f18b26" - -filewalker@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/filewalker/-/filewalker-0.1.3.tgz#d63bf9d813ba35344b8182747824f6ff754bf4c5" - dependencies: - fqueue "0.0.x" - -fill-range@^2.1.0: - version "2.2.3" - resolved "https://registry.yarnpkg.com/fill-range/-/fill-range-2.2.3.tgz#50b77dfd7e469bc7492470963699fe7a8485a723" - dependencies: - is-number "^2.1.0" - isobject "^2.0.0" - randomatic "^1.1.3" - repeat-element "^1.1.2" - repeat-string "^1.5.2" - -find-up@^1.0.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz#6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f" - dependencies: - path-exists "^2.0.0" - pinkie-promise "^2.0.0" - -findup-sync@~0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/findup-sync/-/findup-sync-0.3.0.tgz#37930aa5d816b777c03445e1966cc6790a4c0b16" - dependencies: - glob "~5.0.0" - -first-chunk-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz#59bfb50cd905f60d7c394cd3d9acaab4e6ad934e" - -for-in@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz#81068d295a8142ec0ac726c6e2200c30fb6d5e80" - -for-own@^0.1.4: - version "0.1.5" - resolved "https://registry.yarnpkg.com/for-own/-/for-own-0.1.5.tgz#5265c681a4f294dabbf17c9509b6763aa84510ce" - dependencies: - for-in "^1.0.1" - -forever-agent@~0.6.1: - version "0.6.1" - resolved "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz#fbc71f0c41adeb37f96c577ad1ed42d8fdacca91" - -form-data@~2.1.1: - version "2.1.4" - resolved "https://registry.yarnpkg.com/form-data/-/form-data-2.1.4.tgz#33c183acf193276ecaa98143a69e94bfee1750d1" - dependencies: - asynckit "^0.4.0" - combined-stream "^1.0.5" - mime-types "^2.1.12" - -formatio@1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/formatio/-/formatio-1.2.0.tgz#f3b2167d9068c4698a8d51f4f760a39a54d818eb" - dependencies: - samsam "1.x" - -fqueue@0.0.x: - version "0.0.0" - resolved "https://registry.yarnpkg.com/fqueue/-/fqueue-0.0.0.tgz#533205a4f9ad21bbaa38fc61cef3a930c2f54836" - -from@~0: - version "0.1.7" - resolved "https://registry.yarnpkg.com/from/-/from-0.1.7.tgz#83c60afc58b9c56997007ed1a768b3ab303a44fe" - -fs.realpath@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz#1504ad2523158caa40db4a2787cb01411994ea4f" - -fsevents@^1.0.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/fsevents/-/fsevents-1.1.1.tgz#f19fd28f43eeaf761680e519a203c4d0b3d31aff" - dependencies: - nan "^2.3.0" - node-pre-gyp "^0.6.29" - -fstream-ignore@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/fstream-ignore/-/fstream-ignore-1.0.5.tgz#9c31dae34767018fe1d249b24dada67d092da105" - dependencies: - fstream "^1.0.0" - inherits "2" - minimatch "^3.0.0" - -fstream@^1.0.0, fstream@^1.0.10, fstream@^1.0.2: - version "1.0.11" - resolved "https://registry.yarnpkg.com/fstream/-/fstream-1.0.11.tgz#5c1fb1f117477114f0632a0eb4b71b3cb0fd3171" - dependencies: - graceful-fs "^4.1.2" - inherits "~2.0.0" - mkdirp ">=0.5 0" - rimraf "2" - -gauge@~2.7.3: - version "2.7.4" - resolved "https://registry.yarnpkg.com/gauge/-/gauge-2.7.4.tgz#2c03405c7538c39d7eb37b317022e325fb018bf7" - dependencies: - aproba "^1.0.3" - console-control-strings "^1.0.0" - has-unicode "^2.0.0" - object-assign "^4.1.0" - signal-exit "^3.0.0" - string-width "^1.0.1" - strip-ansi "^3.0.1" - wide-align "^1.1.0" - -generate-function@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/generate-function/-/generate-function-2.0.0.tgz#6858fe7c0969b7d4e9093337647ac79f60dfbe74" - -generate-object-property@^1.1.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/generate-object-property/-/generate-object-property-1.2.0.tgz#9c0e1c40308ce804f4783618b937fa88f99d50d0" - dependencies: - is-property "^1.0.0" - -get-func-name@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/get-func-name/-/get-func-name-2.0.0.tgz#ead774abee72e20409433a066366023dd6887a41" - -get-stdin@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/get-stdin/-/get-stdin-4.0.1.tgz#b968c6b0a04384324902e8bf1a5df32579a450fe" - -get-stream@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz#8e943d1358dc37555054ecbe2edb05aa174ede14" - -getpass@^0.1.1: - version "0.1.7" - resolved "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz#5eff8e3e684d569ae4cb2b1282604e8ba62149fa" - dependencies: - assert-plus "^1.0.0" - -glob-base@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/glob-base/-/glob-base-0.3.0.tgz#dbb164f6221b1c0b1ccf82aea328b497df0ea3c4" - dependencies: - glob-parent "^2.0.0" - is-glob "^2.0.0" - -glob-parent@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-2.0.0.tgz#81383d72db054fcccf5336daa902f182f6edbb28" - dependencies: - is-glob "^2.0.0" - -glob-parent@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz#9e6af6299d8d3bd2bd40430832bd113df906c5ae" - dependencies: - is-glob "^3.1.0" - path-dirname "^1.0.0" - -glob-stream@^5.3.2: - version "5.3.5" - resolved "https://registry.yarnpkg.com/glob-stream/-/glob-stream-5.3.5.tgz#a55665a9a8ccdc41915a87c701e32d4e016fad22" - dependencies: - extend "^3.0.0" - glob "^5.0.3" - glob-parent "^3.0.0" - micromatch "^2.3.7" - ordered-read-streams "^0.3.0" - through2 "^0.6.0" - to-absolute-glob "^0.1.1" - unique-stream "^2.0.2" - -glob@7.1.1: - version "7.1.1" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.1.tgz#805211df04faaf1c63a3600306cdf5ade50b2ec8" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.2" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^5.0.3, glob@~5.0.0: - version "5.0.15" - resolved "https://registry.yarnpkg.com/glob/-/glob-5.0.15.tgz#1bc936b9e02f4a603fcc222ecf7633d30b8b93b1" - dependencies: - inflight "^1.0.4" - inherits "2" - minimatch "2 || 3" - once "^1.3.0" - path-is-absolute "^1.0.0" - -glob@^7.0.3, glob@^7.0.5, glob@^7.1.1: - version "7.1.2" - resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.2.tgz#c19c9df9a028702d678612384a6552404c636d15" - dependencies: - fs.realpath "^1.0.0" - inflight "^1.0.4" - inherits "2" - minimatch "^3.0.4" - once "^1.3.0" - path-is-absolute "^1.0.0" - -globby@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/globby/-/globby-5.0.0.tgz#ebd84667ca0dbb330b99bcfc68eac2bc54370e0d" - dependencies: - array-union "^1.0.1" - arrify "^1.0.0" - glob "^7.0.3" - object-assign "^4.0.1" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -glogg@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/glogg/-/glogg-1.0.0.tgz#7fe0f199f57ac906cf512feead8f90ee4a284fc5" - dependencies: - sparkles "^1.0.0" - -got@^6.7.1: - version "6.7.1" - resolved "https://registry.yarnpkg.com/got/-/got-6.7.1.tgz#240cd05785a9a18e561dc1b44b41c763ef1e8db0" - dependencies: - create-error-class "^3.0.0" - duplexer3 "^0.1.4" - get-stream "^3.0.0" - is-redirect "^1.0.0" - is-retry-allowed "^1.0.0" - is-stream "^1.0.0" - lowercase-keys "^1.0.0" - safe-buffer "^5.0.1" - timed-out "^4.0.0" - unzip-response "^2.0.1" - url-parse-lax "^1.0.0" - -graceful-fs@^4.0.0, graceful-fs@^4.1.11, graceful-fs@^4.1.2: - version "4.1.11" - resolved "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.1.11.tgz#0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658" - -"graceful-readlink@>= 1.0.0": - version "1.0.1" - resolved "https://registry.yarnpkg.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz#4cafad76bc62f02fa039b2f94e9a3dd3a391a725" - -growl@1.9.2: - version "1.9.2" - resolved "https://registry.yarnpkg.com/growl/-/growl-1.9.2.tgz#0ea7743715db8d8de2c5ede1775e1b45ac85c02f" - -gulp-chmod@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/gulp-chmod/-/gulp-chmod-2.0.0.tgz#00c390b928a0799b251accf631aa09e01cc6299c" - dependencies: - deep-assign "^1.0.0" - stat-mode "^0.2.0" - through2 "^2.0.0" - -gulp-filter@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/gulp-filter/-/gulp-filter-5.0.0.tgz#cfa81966fb67884f2ba754b067152929428d59bc" - dependencies: - gulp-util "^3.0.6" - multimatch "^2.0.0" - streamfilter "^1.0.5" - -gulp-gunzip@0.0.3: - version "0.0.3" - resolved "https://registry.yarnpkg.com/gulp-gunzip/-/gulp-gunzip-0.0.3.tgz#7b6e07b0f58fd3d42515c48ead5a63df0572f62f" - dependencies: - through2 "~0.6.5" - vinyl "~0.4.6" - -gulp-remote-src@^0.4.2: - version "0.4.2" - resolved "https://registry.yarnpkg.com/gulp-remote-src/-/gulp-remote-src-0.4.2.tgz#ceb3770e3444328d61386fbaaab200bc11cd98a8" - dependencies: - event-stream "~3.3.4" - node.extend "~1.1.2" - request "~2.79.0" - through2 "~2.0.3" - vinyl "~2.0.1" - -gulp-sourcemaps@1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz#b86ff349d801ceb56e1d9e7dc7bbcb4b7dee600c" - dependencies: - convert-source-map "^1.1.1" - graceful-fs "^4.1.2" - strip-bom "^2.0.0" - through2 "^2.0.0" - vinyl "^1.0.0" - -gulp-symdest@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/gulp-symdest/-/gulp-symdest-1.1.0.tgz#c165320732d192ce56fd94271ffa123234bf2ae0" - dependencies: - event-stream "^3.3.1" - mkdirp "^0.5.1" - queue "^3.1.0" - vinyl-fs "^2.4.3" - -gulp-untar@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/gulp-untar/-/gulp-untar-0.0.6.tgz#d6bdefde7e9a8e054c9f162385a0782c4be74000" - dependencies: - event-stream "~3.3.4" - gulp-util "~3.0.8" - streamifier "~0.1.1" - tar "^2.2.1" - through2 "~2.0.3" - -gulp-util@^3.0.6, gulp-util@~3.0.8: - version "3.0.8" - resolved "https://registry.yarnpkg.com/gulp-util/-/gulp-util-3.0.8.tgz#0054e1e744502e27c04c187c3ecc505dd54bbb4f" - dependencies: - array-differ "^1.0.0" - array-uniq "^1.0.2" - beeper "^1.0.0" - chalk "^1.0.0" - dateformat "^2.0.0" - fancy-log "^1.1.0" - gulplog "^1.0.0" - has-gulplog "^0.1.0" - lodash._reescape "^3.0.0" - lodash._reevaluate "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.template "^3.0.0" - minimist "^1.1.0" - multipipe "^0.1.2" - object-assign "^3.0.0" - replace-ext "0.0.1" - through2 "^2.0.0" - vinyl "^0.5.0" - -gulp-vinyl-zip@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/gulp-vinyl-zip/-/gulp-vinyl-zip-1.4.0.tgz#56382f2ccb57231bb0478c78737ccd572973bee1" - dependencies: - event-stream "^3.3.1" - queue "^3.0.10" - through2 "^0.6.3" - vinyl "^0.4.6" - vinyl-fs "^2.0.0" - yauzl "^2.2.1" - yazl "^2.2.1" - -gulplog@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/gulplog/-/gulplog-1.0.0.tgz#e28c4d45d05ecbbed818363ce8f9c5926229ffe5" - dependencies: - glogg "^1.0.0" - -har-schema@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/har-schema/-/har-schema-1.0.5.tgz#d263135f43307c02c602afc8fe95970c0151369e" - -har-validator@~2.0.6: - version "2.0.6" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-2.0.6.tgz#cdcbc08188265ad119b6a5a7c8ab70eecfb5d27d" - dependencies: - chalk "^1.1.1" - commander "^2.9.0" - is-my-json-valid "^2.12.4" - pinkie-promise "^2.0.0" - -har-validator@~4.2.1: - version "4.2.1" - resolved "https://registry.yarnpkg.com/har-validator/-/har-validator-4.2.1.tgz#33481d0f1bbff600dd203d75812a6a5fba002e2a" - dependencies: - ajv "^4.9.1" - har-schema "^1.0.5" - -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz#34f5049ce1ecdf2b0649af3ef24e45ed35416d91" - dependencies: - ansi-regex "^2.0.0" - -has-flag@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/has-flag/-/has-flag-1.0.0.tgz#9d9e793165ce017a00f00418c43f942a7b1d11fa" - -has-gulplog@^0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/has-gulplog/-/has-gulplog-0.1.0.tgz#6414c82913697da51590397dafb12f22967811ce" - dependencies: - sparkles "^1.0.0" - -has-unicode@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/has-unicode/-/has-unicode-2.0.1.tgz#e0e6fe6a28cf51138855e086d1691e771de2a8b9" - -hawk@~3.1.3: - version "3.1.3" - resolved "https://registry.yarnpkg.com/hawk/-/hawk-3.1.3.tgz#078444bd7c1640b0fe540d2c9b73d59678e8e1c4" - dependencies: - boom "2.x.x" - cryptiles "2.x.x" - hoek "2.x.x" - sntp "1.x.x" - -hoek@2.x.x: - version "2.16.3" - resolved "https://registry.yarnpkg.com/hoek/-/hoek-2.16.3.tgz#20bb7403d3cea398e91dc4710a8ff1b8274a25ed" - -hosted-git-info@^2.1.4: - version "2.4.2" - resolved "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.4.2.tgz#0076b9f46a270506ddbaaea56496897460612a67" - -http-signature@~1.1.0: - version "1.1.1" - resolved "https://registry.yarnpkg.com/http-signature/-/http-signature-1.1.1.tgz#df72e267066cd0ac67fb76adf8e134a8fbcf91bf" - dependencies: - assert-plus "^0.2.0" - jsprim "^1.2.2" - sshpk "^1.7.0" - -imurmurhash@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz#9218b9b2b928a238b13dc4fb6b6d576f231453ea" - -indent-string@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/indent-string/-/indent-string-2.1.0.tgz#8e2d48348742121b4a8218b7a137e9a52049dc80" - dependencies: - repeating "^2.0.0" - -inflight@^1.0.4: - version "1.0.6" - resolved "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz#49bd6331d7d02d0c09bc910a1075ba8165b56df9" - dependencies: - once "^1.3.0" - wrappy "1" - -inherits@2, inherits@^2.0.1, inherits@~2.0.0, inherits@~2.0.1: - version "2.0.3" - resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz#633c2c83e3da42a502f52466022480f4208261de" - -ini@~1.3.0: - version "1.3.4" - resolved "https://registry.yarnpkg.com/ini/-/ini-1.3.4.tgz#0537cb79daf59b59a1a517dff706c86ec039162e" - -inversify-inject-decorators@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/inversify-inject-decorators/-/inversify-inject-decorators-3.0.1.tgz#de46df46ba72642eacac79451ec5c101e4dbcb00" - -inversify@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/inversify/-/inversify-4.1.1.tgz#a95edb34ae082bb1175336d51dcd5f011134c625" - -invert-kv@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/invert-kv/-/invert-kv-1.0.0.tgz#104a8e4aaca6d3d8cd157a8ef8bfab2d7a3ffdb6" - -is-arrayish@^0.2.1: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz#77c99840527aa8ecb1a8ba697b80645a7a926a9d" - -is-binary-path@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz#75f16642b480f187a711c814161fd3a4a7655898" - dependencies: - binary-extensions "^1.0.0" - -is-buffer@^1.1.5: - version "1.1.5" - resolved "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.5.tgz#1f3b26ef613b214b88cbca23cc6c01d87961eecc" - -is-builtin-module@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-builtin-module/-/is-builtin-module-1.0.0.tgz#540572d34f7ac3119f8f76c30cbc1b1e037affbe" - dependencies: - builtin-modules "^1.0.0" - -is-dotfile@^1.0.0: - version "1.0.3" - resolved "https://registry.yarnpkg.com/is-dotfile/-/is-dotfile-1.0.3.tgz#a6a2f32ffd2dfb04f5ca25ecd0f6b83cf798a1e1" - -is-equal-shallow@^0.1.3: - version "0.1.3" - resolved "https://registry.yarnpkg.com/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz#2238098fc221de0bcfa5d9eac4c45d638aa1c534" - dependencies: - is-primitive "^2.0.0" - -is-extendable@^0.1.0, is-extendable@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz#62b110e289a471418e3ec36a617d472e301dfc89" - -is-extglob@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-1.0.0.tgz#ac468177c4943405a092fc8f29760c6ffc6206c0" - -is-extglob@^2.1.0: - version "2.1.1" - resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2" - -is-finite@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-finite/-/is-finite-1.0.2.tgz#cc6677695602be550ef11e8b4aa6305342b6d0aa" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz#ef9e31386f031a7f0d643af82fde50c457ef00cb" - dependencies: - number-is-nan "^1.0.0" - -is-fullwidth-code-point@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz#a3b30a5c4f199183167aaab93beefae3ddfb654f" - -is-glob@^2.0.0, is-glob@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-2.0.1.tgz#d096f926a3ded5600f3fdfd91198cb0888c2d863" - dependencies: - is-extglob "^1.0.0" - -is-glob@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz#7ba5ae24217804ac70707b96922567486cc3e84a" - dependencies: - is-extglob "^2.1.0" - -is-my-json-valid@^2.12.4: - version "2.16.0" - resolved "https://registry.yarnpkg.com/is-my-json-valid/-/is-my-json-valid-2.16.0.tgz#f079dd9bfdae65ee2038aae8acbc86ab109e3693" - dependencies: - generate-function "^2.0.0" - generate-object-property "^1.1.0" - jsonpointer "^4.0.0" - xtend "^4.0.0" - -is-npm@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-npm/-/is-npm-1.0.0.tgz#f2fb63a65e4905b406c86072765a1a4dc793b9f4" - -is-number@^2.0.2, is-number@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/is-number/-/is-number-2.1.0.tgz#01fcbbb393463a548f2f466cce16dece49db908f" - dependencies: - kind-of "^3.0.2" - -is-obj@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz#3e4729ac1f5fde025cd7d83a896dab9f4f67db0f" - -is-path-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-1.0.0.tgz#d225ec23132e89edd38fda767472e62e65f1106d" - -is-path-in-cwd@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz#6477582b8214d602346094567003be8a9eac04dc" - dependencies: - is-path-inside "^1.0.0" - -is-path-inside@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-1.0.0.tgz#fc06e5a1683fbda13de667aff717bbc10a48f37f" - dependencies: - path-is-inside "^1.0.1" - -is-posix-bracket@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz#3334dc79774368e92f016e6fbc0a88f5cd6e6bc4" - -is-primitive@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/is-primitive/-/is-primitive-2.0.0.tgz#207bab91638499c07b2adf240a41a87210034575" - -is-property@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/is-property/-/is-property-1.0.2.tgz#57fe1c4e48474edd65b09911f26b1cd4095dda84" - -is-redirect@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-redirect/-/is-redirect-1.0.0.tgz#1d03dded53bd8db0f30c26e4f95d36fc7c87dc24" - -is-retry-allowed@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-retry-allowed/-/is-retry-allowed-1.1.0.tgz#11a060568b67339444033d0125a61a20d564fb34" - -is-stream@^1.0.0, is-stream@^1.0.1, is-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz#12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44" - -is-typedarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a" - -is-utf8@^0.2.0: - version "0.2.1" - resolved "https://registry.yarnpkg.com/is-utf8/-/is-utf8-0.2.1.tgz#4b0da1442104d1b336340e80797e865cf39f7d72" - -is-valid-glob@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/is-valid-glob/-/is-valid-glob-0.3.0.tgz#d4b55c69f51886f9b65c70d6c2622d37e29f48fe" - -is@^3.1.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/is/-/is-3.2.1.tgz#d0ac2ad55eb7b0bec926a5266f6c662aaa83dca5" - -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf" - -isarray@1.0.0, isarray@~1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" - -isexe@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" - -isobject@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz#f065561096a3f1da2ef46272f815c840d87e0c89" - dependencies: - isarray "1.0.0" - -isstream@~0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a" - -jodid25519@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/jodid25519/-/jodid25519-1.0.2.tgz#06d4912255093419477d425633606e0e90782967" - dependencies: - jsbn "~0.1.0" - -js-tokens@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-3.0.1.tgz#08e9f132484a2c45a30907e9dc4d5567b7f114d7" - -js-yaml@3.6.1: - version "3.6.1" - resolved "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.6.1.tgz#6e5fe67d8b205ce4d22fad05b7781e8dadcc4b30" - dependencies: - argparse "^1.0.7" - esprima "^2.6.0" - -jsbn@~0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz#a5e654c2e5a2deb5f201d96cefbca80c0ef2f513" - -json-schema@0.2.3: - version "0.2.3" - resolved "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz#b480c892e59a2f05954ce727bd3f2a4e882f9e13" - -json-stable-stringify@^1.0.0, json-stable-stringify@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz#9a759d39c5f2ff503fd5300646ed445f88c4f9af" - dependencies: - jsonify "~0.0.0" - -json-stringify-safe@~5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz#1296a2d58fd45f19a0f6ce01d65701e2c735b6eb" - -json3@3.3.2: - version "3.3.2" - resolved "https://registry.yarnpkg.com/json3/-/json3-3.3.2.tgz#3c0434743df93e2f5c42aee7b19bcb483575f4e1" - -jsonify@~0.0.0: - version "0.0.0" - resolved "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz#2c74b6ee41d93ca51b7b5aaee8f503631d252a73" - -jsonpointer@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/jsonpointer/-/jsonpointer-4.0.1.tgz#4fd92cb34e0e9db3c89c8622ecf51f9b978c6cb9" - -jsprim@^1.2.2: - version "1.4.0" - resolved "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.0.tgz#a3b87e40298d8c380552d8cc7628a0bb95a22918" - dependencies: - assert-plus "1.0.0" - extsprintf "1.0.2" - json-schema "0.2.3" - verror "1.3.6" - -kind-of@^3.0.2: - version "3.2.2" - resolved "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz#31ea21a734bab9bbb0f32466d893aea51e4a3c64" - dependencies: - is-buffer "^1.1.5" - -latest-version@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/latest-version/-/latest-version-3.1.0.tgz#a205383fea322b33b5ae3b18abee0dc2f356ee15" - dependencies: - package-json "^4.0.0" - -lazy-req@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/lazy-req/-/lazy-req-2.0.0.tgz#c9450a363ecdda2e6f0c70132ad4f37f8f06f2b4" - -lazystream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lazystream/-/lazystream-1.0.0.tgz#f6995fe0f820392f61396be89462407bb77168e4" - dependencies: - readable-stream "^2.0.5" - -lcid@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lcid/-/lcid-1.0.0.tgz#308accafa0bc483a3867b4b6f2b9506251d1b835" - dependencies: - invert-kv "^1.0.0" - -lcov-parse@0.0.10: - version "0.0.10" - resolved "https://registry.yarnpkg.com/lcov-parse/-/lcov-parse-0.0.10.tgz#1b0b8ff9ac9c7889250582b70b71315d9da6d9a3" - -load-json-file@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/load-json-file/-/load-json-file-1.1.0.tgz#956905708d58b4bab4c2261b04f59f31c99374c0" - dependencies: - graceful-fs "^4.1.2" - parse-json "^2.2.0" - pify "^2.0.0" - pinkie-promise "^2.0.0" - strip-bom "^2.0.0" - -lodash._baseassign@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash._baseassign/-/lodash._baseassign-3.2.0.tgz#8c38a099500f215ad09e59f1722fd0c52bfe0a4e" - dependencies: - lodash._basecopy "^3.0.0" - lodash.keys "^3.0.0" - -lodash._basecopy@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz#8da0e6a876cf344c0ad8a54882111dd3c5c7ca36" - -lodash._basecreate@^3.0.0: - version "3.0.3" - resolved "https://registry.yarnpkg.com/lodash._basecreate/-/lodash._basecreate-3.0.3.tgz#1bc661614daa7fc311b7d03bf16806a0213cf821" - -lodash._basetostring@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz#d1861d877f824a52f669832dcaf3ee15566a07d5" - -lodash._basevalues@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz#5b775762802bde3d3297503e26300820fdf661b7" - -lodash._getnative@^3.0.0: - version "3.9.1" - resolved "https://registry.yarnpkg.com/lodash._getnative/-/lodash._getnative-3.9.1.tgz#570bc7dede46d61cdcde687d65d3eecbaa3aaff5" - -lodash._isiterateecall@^3.0.0: - version "3.0.9" - resolved "https://registry.yarnpkg.com/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz#5203ad7ba425fae842460e696db9cf3e6aac057c" - -lodash._reescape@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reescape/-/lodash._reescape-3.0.0.tgz#2b1d6f5dfe07c8a355753e5f27fac7f1cde1616a" - -lodash._reevaluate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz#58bc74c40664953ae0b124d806996daca431e2ed" - -lodash._reinterpolate@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz#0ccf2d89166af03b3663c796538b75ac6e114d9d" - -lodash._root@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/lodash._root/-/lodash._root-3.0.1.tgz#fba1c4524c19ee9a5f8136b4609f017cf4ded692" - -lodash.create@3.1.1: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.create/-/lodash.create-3.1.1.tgz#d7f2849f0dbda7e04682bb8cd72ab022461debe7" - dependencies: - lodash._baseassign "^3.0.0" - lodash._basecreate "^3.0.0" - lodash._isiterateecall "^3.0.0" - -lodash.escape@^3.0.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/lodash.escape/-/lodash.escape-3.2.0.tgz#995ee0dc18c1b48cc92effae71a10aab5b487698" - dependencies: - lodash._root "^3.0.0" - -lodash.isarguments@^3.0.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz#2f573d85c6a24289ff00663b491c1d338ff3458a" - -lodash.isarray@^3.0.0: - version "3.0.4" - resolved "https://registry.yarnpkg.com/lodash.isarray/-/lodash.isarray-3.0.4.tgz#79e4eb88c36a8122af86f844aa9bcd851b5fbb55" - -lodash.isequal@^4.0.0: - version "4.5.0" - resolved "https://registry.yarnpkg.com/lodash.isequal/-/lodash.isequal-4.5.0.tgz#415c4478f2bcc30120c22ce10ed3226f7d3e18e0" - -lodash.keys@^3.0.0: - version "3.1.2" - resolved "https://registry.yarnpkg.com/lodash.keys/-/lodash.keys-3.1.2.tgz#4dbc0472b156be50a0b286855d1bd0b0c656098a" - dependencies: - lodash._getnative "^3.0.0" - lodash.isarguments "^3.0.0" - lodash.isarray "^3.0.0" - -lodash.restparam@^3.0.0: - version "3.6.1" - resolved "https://registry.yarnpkg.com/lodash.restparam/-/lodash.restparam-3.6.1.tgz#936a4e309ef330a7645ed4145986c85ae5b20805" - -lodash.template@^3.0.0: - version "3.6.2" - resolved "https://registry.yarnpkg.com/lodash.template/-/lodash.template-3.6.2.tgz#f8cdecc6169a255be9098ae8b0c53d378931d14f" - dependencies: - lodash._basecopy "^3.0.0" - lodash._basetostring "^3.0.0" - lodash._basevalues "^3.0.0" - lodash._isiterateecall "^3.0.0" - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - lodash.keys "^3.0.0" - lodash.restparam "^3.0.0" - lodash.templatesettings "^3.0.0" - -lodash.templatesettings@^3.0.0: - version "3.1.1" - resolved "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz#fb307844753b66b9f1afa54e262c745307dba8e5" - dependencies: - lodash._reinterpolate "^3.0.0" - lodash.escape "^3.0.0" - -lodash@^3.7.0: - version "3.10.1" - resolved "https://registry.yarnpkg.com/lodash/-/lodash-3.10.1.tgz#5bf45e8e49ba4189e17d482789dfd15bd140b7b6" - -log-driver@1.2.5: - version "1.2.5" - resolved "https://registry.yarnpkg.com/log-driver/-/log-driver-1.2.5.tgz#7ae4ec257302fd790d557cb10c97100d857b0056" - -lolex@^1.6.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/lolex/-/lolex-1.6.0.tgz#3a9a0283452a47d7439e72731b9e07d7386e49f6" - -loud-rejection@^1.0.0: - version "1.6.0" - resolved "https://registry.yarnpkg.com/loud-rejection/-/loud-rejection-1.6.0.tgz#5b46f80147edee578870f086d04821cf998e551f" - dependencies: - currently-unhandled "^0.4.1" - signal-exit "^3.0.0" - -lowercase-keys@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/lowercase-keys/-/lowercase-keys-1.0.0.tgz#4e3366b39e7f5457e35f1324bdf6f88d0bfc7306" - -lru-cache@^4.0.0: - version "4.0.2" - resolved "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.0.2.tgz#1d17679c069cda5d040991a09dbc2c0db377e55e" - dependencies: - pseudomap "^1.0.1" - yallist "^2.0.0" - -make-dir@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/make-dir/-/make-dir-1.0.0.tgz#97a011751e91dd87cfadef58832ebb04936de978" - dependencies: - pify "^2.3.0" - -map-obj@^1.0.0, map-obj@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/map-obj/-/map-obj-1.0.1.tgz#d933ceb9205d82bdcf4886f6742bdc2b4dea146d" - -map-stream@~0.1.0: - version "0.1.0" - resolved "https://registry.yarnpkg.com/map-stream/-/map-stream-0.1.0.tgz#e56aa94c4c8055a16404a0674b78f215f7c8e194" - -meow@^3.6.0: - version "3.7.0" - resolved "https://registry.yarnpkg.com/meow/-/meow-3.7.0.tgz#72cb668b425228290abbfa856892587308a801fb" - dependencies: - camelcase-keys "^2.0.0" - decamelize "^1.1.2" - loud-rejection "^1.0.0" - map-obj "^1.0.1" - minimist "^1.1.3" - normalize-package-data "^2.3.4" - object-assign "^4.0.1" - read-pkg-up "^1.0.1" - redent "^1.0.0" - trim-newlines "^1.0.0" - -merge-stream@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/merge-stream/-/merge-stream-1.0.1.tgz#4041202d508a342ba00174008df0c251b8c135e1" - dependencies: - readable-stream "^2.0.1" - -micromatch@^2.1.5, micromatch@^2.3.7: - version "2.3.11" - resolved "https://registry.yarnpkg.com/micromatch/-/micromatch-2.3.11.tgz#86677c97d1720b363431d04d0d15293bd38c1565" - dependencies: - arr-diff "^2.0.0" - array-unique "^0.2.1" - braces "^1.8.2" - expand-brackets "^0.1.4" - extglob "^0.3.1" - filename-regex "^2.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.1" - kind-of "^3.0.2" - normalize-path "^2.0.1" - object.omit "^2.0.0" - parse-glob "^3.0.4" - regex-cache "^0.4.2" - -mime-db@~1.27.0: - version "1.27.0" - resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.27.0.tgz#820f572296bbd20ec25ed55e5b5de869e5436eb1" - -mime-types@^2.1.12, mime-types@~2.1.7: - version "2.1.15" - resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.15.tgz#a4ebf5064094569237b8cf70046776d09fc92aed" - dependencies: - mime-db "~1.27.0" - -"minimatch@2 || 3", minimatch@^3.0.0, minimatch@^3.0.2, minimatch@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083" - dependencies: - brace-expansion "^1.1.7" - -minimist@0.0.8, minimist@~0.0.1: - version "0.0.8" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d" - -minimist@1.2.0, minimist@^1.1.0, minimist@^1.1.3, minimist@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284" - -mkdirp@0.5.1, "mkdirp@>=0.5 0", mkdirp@^0.5.0, mkdirp@^0.5.1: - version "0.5.1" - resolved "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.1.tgz#30057438eac6cf7f8c4767f38648d6697d75c903" - dependencies: - minimist "0.0.8" - -mocha-testdata@^1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/mocha-testdata/-/mocha-testdata-1.2.0.tgz#6cc0d41820e9bb66903334524e5ae420de77ecea" - -mocha@^3.2.0: - version "3.4.2" - resolved "https://registry.yarnpkg.com/mocha/-/mocha-3.4.2.tgz#d0ef4d332126dbf18d0d640c9b382dd48be97594" - dependencies: - browser-stdout "1.3.0" - commander "2.9.0" - debug "2.6.0" - diff "3.2.0" - escape-string-regexp "1.0.5" - glob "7.1.1" - growl "1.9.2" - json3 "3.3.2" - lodash.create "3.1.1" - mkdirp "0.5.1" - supports-color "3.1.2" - -ms@0.7.2: - version "0.7.2" - resolved "https://registry.yarnpkg.com/ms/-/ms-0.7.2.tgz#ae25cf2512b3885a1d95d7f037868d8431124765" - -multimatch@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/multimatch/-/multimatch-2.1.0.tgz#9c7906a22fb4c02919e2f5f75161b4cdbd4b2a2b" - dependencies: - array-differ "^1.0.0" - array-union "^1.0.1" - arrify "^1.0.0" - minimatch "^3.0.0" - -multipipe@^0.1.2: - version "0.1.2" - resolved "https://registry.yarnpkg.com/multipipe/-/multipipe-0.1.2.tgz#2a8f2ddf70eed564dff2d57f1e1a137d9f05078b" - dependencies: - duplexer2 "0.0.2" - -nan@^2.3.0: - version "2.6.2" - resolved "https://registry.yarnpkg.com/nan/-/nan-2.6.2.tgz#e4ff34e6c95fdfb5aecc08de6596f43605a7db45" - -native-promise-only@^0.8.1: - version "0.8.1" - resolved "https://registry.yarnpkg.com/native-promise-only/-/native-promise-only-0.8.1.tgz#20a318c30cb45f71fe7adfbf7b21c99c1472ef11" - -node-pre-gyp@^0.6.29: - version "0.6.34" - resolved "https://registry.yarnpkg.com/node-pre-gyp/-/node-pre-gyp-0.6.34.tgz#94ad1c798a11d7fc67381b50d47f8cc18d9799f7" - dependencies: - mkdirp "^0.5.1" - nopt "^4.0.1" - npmlog "^4.0.2" - rc "^1.1.7" - request "^2.81.0" - rimraf "^2.6.1" - semver "^5.3.0" - tar "^2.2.1" - tar-pack "^3.4.0" - -node.extend@~1.1.2: - version "1.1.6" - resolved "https://registry.yarnpkg.com/node.extend/-/node.extend-1.1.6.tgz#a7b882c82d6c93a4863a5504bd5de8ec86258b96" - dependencies: - is "^3.1.0" - -nopt@^4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/nopt/-/nopt-4.0.1.tgz#d0d4685afd5415193c8c7505602d0d17cd64474d" - dependencies: - abbrev "1" - osenv "^0.1.4" - -normalize-package-data@^2.3.2, normalize-package-data@^2.3.4: - version "2.3.8" - resolved "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.3.8.tgz#d819eda2a9dedbd1ffa563ea4071d936782295bb" - dependencies: - hosted-git-info "^2.1.4" - is-builtin-module "^1.0.0" - semver "2 || 3 || 4 || 5" - validate-npm-package-license "^3.0.1" - -normalize-path@^2.0.1: - version "2.1.1" - resolved "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz#1ab28b556e198363a8c1a6f7e6fa20137fe6aed9" - dependencies: - remove-trailing-separator "^1.0.1" - -npm-run-path@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-1.0.0.tgz#f5c32bf595fe81ae927daec52e82f8b000ac3c8f" - dependencies: - path-key "^1.0.0" - -npmlog@^4.0.2: - version "4.1.0" - resolved "https://registry.yarnpkg.com/npmlog/-/npmlog-4.1.0.tgz#dc59bee85f64f00ed424efb2af0783df25d1c0b5" - dependencies: - are-we-there-yet "~1.1.2" - console-control-strings "~1.1.0" - gauge "~2.7.3" - set-blocking "~2.0.0" - -number-is-nan@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/number-is-nan/-/number-is-nan-1.0.1.tgz#097b602b53422a522c1afb8790318336941a011d" - -oauth-sign@~0.8.1: - version "0.8.2" - resolved "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.8.2.tgz#46a6ab7f0aead8deae9ec0565780b7d4efeb9d43" - -object-assign@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-3.0.0.tgz#9bedd5ca0897949bca47e7ff408062d549f587f2" - -object-assign@^4.0.0, object-assign@^4.0.1, object-assign@^4.1.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863" - -object.omit@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/object.omit/-/object.omit-2.0.1.tgz#1a9c744829f39dbb858c76ca3579ae2a54ebd1fa" - dependencies: - for-own "^0.1.4" - is-extendable "^0.1.1" - -once@^1.3.0, once@^1.3.3: - version "1.4.0" - resolved "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz#583b1aa775961d4b113ac17d9c50baef9dd76bd1" - dependencies: - wrappy "1" - -once@~1.3.0: - version "1.3.3" - resolved "https://registry.yarnpkg.com/once/-/once-1.3.3.tgz#b2e261557ce4c314ec8304f3fa82663e4297ca20" - dependencies: - wrappy "1" - -optimist@~0.6.0: - version "0.6.1" - resolved "https://registry.yarnpkg.com/optimist/-/optimist-0.6.1.tgz#da3ea74686fa21a19a111c326e90eb15a0196686" - dependencies: - minimist "~0.0.1" - wordwrap "~0.0.2" - -ordered-read-streams@^0.3.0: - version "0.3.0" - resolved "https://registry.yarnpkg.com/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz#7137e69b3298bb342247a1bbee3881c80e2fd78b" - dependencies: - is-stream "^1.0.1" - readable-stream "^2.0.1" - -os-homedir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-homedir/-/os-homedir-1.0.2.tgz#ffbc4988336e0e833de0c168c7ef152121aa7fb3" - -os-locale@^1.4.0: - version "1.4.0" - resolved "https://registry.yarnpkg.com/os-locale/-/os-locale-1.4.0.tgz#20f9f17ae29ed345e8bde583b13d2009803c14d9" - dependencies: - lcid "^1.0.0" - -os-tmpdir@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" - -osenv@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/osenv/-/osenv-0.1.4.tgz#42fe6d5953df06c8064be6f176c3d05aaaa34644" - dependencies: - os-homedir "^1.0.0" - os-tmpdir "^1.0.0" - -package-json@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/package-json/-/package-json-4.0.1.tgz#8869a0401253661c4c4ca3da6c2121ed555f5eed" - dependencies: - got "^6.7.1" - registry-auth-token "^3.0.1" - registry-url "^3.0.3" - semver "^5.1.0" - -parse-glob@^3.0.4: - version "3.0.4" - resolved "https://registry.yarnpkg.com/parse-glob/-/parse-glob-3.0.4.tgz#b2c376cfb11f35513badd173ef0bb6e3a388391c" - dependencies: - glob-base "^0.3.0" - is-dotfile "^1.0.0" - is-extglob "^1.0.0" - is-glob "^2.0.0" - -parse-json@^2.2.0: - version "2.2.0" - resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-2.2.0.tgz#f480f40434ef80741f8469099f8dea18f55a4dc9" - dependencies: - error-ex "^1.2.0" - -path-dirname@^1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz#cc33d24d525e099a5388c0336c6e32b9160609e0" - -path-exists@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz#0feb6c64f0fc518d9a754dd5efb62c7022761f4b" - dependencies: - pinkie-promise "^2.0.0" - -path-is-absolute@^1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz#174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f" - -path-is-inside@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz#365417dede44430d1c11af61027facf074bdfc53" - -path-key@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/path-key/-/path-key-1.0.0.tgz#5d53d578019646c0d68800db4e146e6bdc2ac7af" - -path-parse@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.5.tgz#3c1adf871ea9cd6c9431b6ea2bd74a0ff055c4c1" - -path-to-regexp@^1.7.0: - version "1.7.0" - resolved "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-1.7.0.tgz#59fde0f435badacba103a84e9d3bc64e96b9937d" - dependencies: - isarray "0.0.1" - -path-type@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/path-type/-/path-type-1.1.0.tgz#59c44f7ee491da704da415da5a4070ba4f8fe441" - dependencies: - graceful-fs "^4.1.2" - pify "^2.0.0" - pinkie-promise "^2.0.0" - -pathval@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/pathval/-/pathval-1.1.0.tgz#b942e6d4bde653005ef6b71361def8727d0645e0" - -pause-stream@0.0.11: - version "0.0.11" - resolved "https://registry.yarnpkg.com/pause-stream/-/pause-stream-0.0.11.tgz#fe5a34b0cbce12b5aa6a2b403ee2e73b602f1445" - dependencies: - through "~2.3" - -pend@~1.2.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/pend/-/pend-1.2.0.tgz#7a57eb550a6783f9115331fcf4663d5c8e007a50" - -performance-now@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/performance-now/-/performance-now-0.2.0.tgz#33ef30c5c77d4ea21c5a53869d91b56d8f2555e5" - -pify@^2.0.0, pify@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz#ed141a6ac043a849ea588498e7dca8b15330e90c" - -pinkie-promise@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz#2135d6dfa7a358c069ac9b178776288228450ffa" - dependencies: - pinkie "^2.0.0" - -pinkie@^2.0.0: - version "2.0.4" - resolved "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz#72556b80cfa0d48a974e80e77248e80ed4f7f870" - -prepend-http@^1.0.1: - version "1.0.4" - resolved "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz#d4f4562b0ce3696e41ac52d0e002e57a635dc6dc" - -preserve@^0.2.0: - version "0.2.0" - resolved "https://registry.yarnpkg.com/preserve/-/preserve-0.2.0.tgz#815ed1f6ebc65926f865b310c0713bcb3315ce4b" - -process-nextick-args@^1.0.6, process-nextick-args@~1.0.6: - version "1.0.7" - resolved "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-1.0.7.tgz#150e20b756590ad3f91093f25a4f2ad8bff30ba3" - -pseudomap@^1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz#f052a28da70e618917ef0a8ac34c1ae5a68286b3" - -punycode@^1.4.1: - version "1.4.1" - resolved "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz#c0d5a63b2718800ad8e1eb0fa5269c84dd41845e" - -qs@~6.3.0: - version "6.3.2" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.3.2.tgz#e75bd5f6e268122a2a0e0bda630b2550c166502c" - -qs@~6.4.0: - version "6.4.0" - resolved "https://registry.yarnpkg.com/qs/-/qs-6.4.0.tgz#13e26d28ad6b0ffaa91312cd3bf708ed351e7233" - -queue@^3.0.10, queue@^3.1.0: - version "3.1.0" - resolved "https://registry.yarnpkg.com/queue/-/queue-3.1.0.tgz#6c49d01f009e2256788789f2bffac6b8b9990585" - dependencies: - inherits "~2.0.0" - -randomatic@^1.1.3: - version "1.1.6" - resolved "https://registry.yarnpkg.com/randomatic/-/randomatic-1.1.6.tgz#110dcabff397e9dcff7c0789ccc0a49adf1ec5bb" - dependencies: - is-number "^2.0.2" - kind-of "^3.0.2" - -rc@^1.0.1, rc@^1.1.6, rc@^1.1.7: - version "1.2.1" - resolved "https://registry.yarnpkg.com/rc/-/rc-1.2.1.tgz#2e03e8e42ee450b8cb3dce65be1bf8974e1dfd95" - dependencies: - deep-extend "~0.4.0" - ini "~1.3.0" - minimist "^1.2.0" - strip-json-comments "~2.0.1" - -read-pkg-up@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/read-pkg-up/-/read-pkg-up-1.0.1.tgz#9d63c13276c065918d57f002a57f40a1b643fb02" - dependencies: - find-up "^1.0.0" - read-pkg "^1.0.0" - -read-pkg@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/read-pkg/-/read-pkg-1.1.0.tgz#f5ffaa5ecd29cb31c0474bca7d756b6bb29e3f28" - dependencies: - load-json-file "^1.0.0" - normalize-package-data "^2.3.2" - path-type "^1.0.0" - -"readable-stream@>=1.0.33-1 <1.1.0-0": - version "1.0.34" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.0.34.tgz#125820e34bc842d2f2aaafafe4c2916ee32c157c" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readable-stream@^2.0.0, readable-stream@^2.0.1, readable-stream@^2.0.2, readable-stream@^2.0.4, readable-stream@^2.0.5, readable-stream@^2.0.6, readable-stream@^2.1.4, readable-stream@^2.1.5: - version "2.2.9" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.2.9.tgz#cf78ec6f4a6d1eb43d26488cac97f042e74b7fc8" - dependencies: - buffer-shims "~1.0.0" - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "~1.0.0" - process-nextick-args "~1.0.6" - string_decoder "~1.0.0" - util-deprecate "~1.0.1" - -readable-stream@~1.1.9: - version "1.1.14" - resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9" - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -readdirp@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/readdirp/-/readdirp-2.1.0.tgz#4ed0ad060df3073300c48440373f72d1cc642d78" - dependencies: - graceful-fs "^4.1.2" - minimatch "^3.0.2" - readable-stream "^2.0.2" - set-immediate-shim "^1.0.1" - -redent@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde" - dependencies: - indent-string "^2.1.0" - strip-indent "^1.0.1" - -reflect-metadata@^0.1.9: - version "0.1.10" - resolved "https://registry.yarnpkg.com/reflect-metadata/-/reflect-metadata-0.1.10.tgz#b4f83704416acad89988c9b15635d47e03b9344a" - -regex-cache@^0.4.2: - version "0.4.3" - resolved "https://registry.yarnpkg.com/regex-cache/-/regex-cache-0.4.3.tgz#9b1a6c35d4d0dfcef5711ae651e8e9d3d7114145" - dependencies: - is-equal-shallow "^0.1.3" - is-primitive "^2.0.0" - -registry-auth-token@^3.0.1: - version "3.3.1" - resolved "https://registry.yarnpkg.com/registry-auth-token/-/registry-auth-token-3.3.1.tgz#fb0d3289ee0d9ada2cbb52af5dfe66cb070d3006" - dependencies: - rc "^1.1.6" - safe-buffer "^5.0.1" - -registry-url@^3.0.3: - version "3.1.0" - resolved "https://registry.yarnpkg.com/registry-url/-/registry-url-3.1.0.tgz#3d4ef870f73dde1d77f0cf9a381432444e174942" - dependencies: - rc "^1.0.1" - -remove-trailing-separator@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.0.1.tgz#615ebb96af559552d4bf4057c8436d486ab63cc4" - -repeat-element@^1.1.2: - version "1.1.2" - resolved "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.2.tgz#ef089a178d1483baae4d93eb98b4f9e4e11d990a" - -repeat-string@^1.5.2: - version "1.6.1" - resolved "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz#8dcae470e1c88abc2d600fff4a776286da75e637" - -repeating@^2.0.0: - version "2.0.1" - resolved "https://registry.yarnpkg.com/repeating/-/repeating-2.0.1.tgz#5214c53a926d3552707527fbab415dbc08d06dda" - dependencies: - is-finite "^1.0.0" - -replace-ext@0.0.1: - version "0.0.1" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-0.0.1.tgz#29bbd92078a739f0bcce2b4ee41e837953522924" - -replace-ext@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/replace-ext/-/replace-ext-1.0.0.tgz#de63128373fcbf7c3ccfa4de5a480c45a67958eb" - -request@2.79.0, request@^2.79.0, request@~2.79.0: - version "2.79.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.79.0.tgz#4dfe5bf6be8b8cdc37fcf93e04b65577722710de" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.11.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~2.0.6" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - qs "~6.3.0" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "~0.4.1" - uuid "^3.0.0" - -request@^2.81.0: - version "2.81.0" - resolved "https://registry.yarnpkg.com/request/-/request-2.81.0.tgz#c6928946a0e06c5f8d6f8a9333469ffda46298a0" - dependencies: - aws-sign2 "~0.6.0" - aws4 "^1.2.1" - caseless "~0.12.0" - combined-stream "~1.0.5" - extend "~3.0.0" - forever-agent "~0.6.1" - form-data "~2.1.1" - har-validator "~4.2.1" - hawk "~3.1.3" - http-signature "~1.1.0" - is-typedarray "~1.0.0" - isstream "~0.1.2" - json-stringify-safe "~5.0.1" - mime-types "~2.1.7" - oauth-sign "~0.8.1" - performance-now "^0.2.0" - qs "~6.4.0" - safe-buffer "^5.0.1" - stringstream "~0.0.4" - tough-cookie "~2.3.0" - tunnel-agent "^0.6.0" - uuid "^3.0.0" - -resolve@^1.3.2: - version "1.3.3" - resolved "https://registry.yarnpkg.com/resolve/-/resolve-1.3.3.tgz#655907c3469a8680dc2de3a275a8fdd69691f0e5" - dependencies: - path-parse "^1.0.5" - -rimraf@2, rimraf@^2.2.8, rimraf@^2.5.1, rimraf@^2.6.1: - version "2.6.1" - resolved "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.1.tgz#c2338ec643df7a1b7fe5c54fa86f57428a55f33d" - dependencies: - glob "^7.0.5" - -safe-buffer@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.0.1.tgz#d263ca54696cd8a306b5ca6551e92de57918fbe7" - -samsam@1.x, samsam@^1.1.3: - version "1.2.1" - resolved "https://registry.yarnpkg.com/samsam/-/samsam-1.2.1.tgz#edd39093a3184370cb859243b2bdf255e7d8ea67" - -semver-diff@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/semver-diff/-/semver-diff-2.1.0.tgz#4bbb8437c8d37e4b0cf1a68fd726ec6d645d6d36" - dependencies: - semver "^5.0.3" - -"semver@2 || 3 || 4 || 5", semver@^5.0.3, semver@^5.1.0, semver@^5.3.0: - version "5.3.0" - resolved "https://registry.yarnpkg.com/semver/-/semver-5.3.0.tgz#9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f" - -set-blocking@~2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz#045f9782d011ae9a6803ddd382b24392b3d890f7" - -set-immediate-shim@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz#4b2b1b27eb808a9f8dcc481a58e5e56f599f3f61" - -shell-quote@^1.4.3: - version "1.6.1" - resolved "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.6.1.tgz#f4781949cce402697127430ea3b3c5476f481767" - dependencies: - array-filter "~0.0.0" - array-map "~0.0.0" - array-reduce "~0.0.0" - jsonify "~0.0.0" - -signal-exit@^3.0.0: - version "3.0.2" - resolved "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.2.tgz#b5fdc08f1287ea1178628e415e25132b73646c6d" - -sinon-chai@^2.8.0: - version "2.10.0" - resolved "https://registry.yarnpkg.com/sinon-chai/-/sinon-chai-2.10.0.tgz#6ab3008bb8cae9929e744d766574b4cf35f34b5b" - -sinon@^2.3.2: - version "2.3.2" - resolved "https://registry.yarnpkg.com/sinon/-/sinon-2.3.2.tgz#c43a9c570f32baac1159505cfeed19108855df89" - dependencies: - diff "^3.1.0" - formatio "1.2.0" - lolex "^1.6.0" - native-promise-only "^0.8.1" - path-to-regexp "^1.7.0" - samsam "^1.1.3" - text-encoding "0.6.4" - type-detect "^4.0.0" - -slide@^1.1.5: - version "1.1.6" - resolved "https://registry.yarnpkg.com/slide/-/slide-1.1.6.tgz#56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707" - -sntp@1.x.x: - version "1.0.9" - resolved "https://registry.yarnpkg.com/sntp/-/sntp-1.0.9.tgz#6541184cc90aeea6c6e7b35e2659082443c66198" - dependencies: - hoek "2.x.x" - -source-map-support@^0.4.11: - version "0.4.15" - resolved "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.4.15.tgz#03202df65c06d2bd8c7ec2362a193056fef8d3b1" - dependencies: - source-map "^0.5.6" - -source-map@^0.5.6: - version "0.5.6" - resolved "https://registry.yarnpkg.com/source-map/-/source-map-0.5.6.tgz#75ce38f52bf0733c5a7f0c118d81334a2bb5f412" - -sparkles@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/sparkles/-/sparkles-1.0.0.tgz#1acbbfb592436d10bbe8f785b7cc6f82815012c3" - -spdx-correct@~1.0.0: - version "1.0.2" - resolved "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-1.0.2.tgz#4b3073d933ff51f3912f03ac5519498a4150db40" - dependencies: - spdx-license-ids "^1.0.2" - -spdx-expression-parse@~1.0.0: - version "1.0.4" - resolved "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz#9bdf2f20e1f40ed447fbe273266191fced51626c" - -spdx-license-ids@^1.0.2: - version "1.2.2" - resolved "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz#c9df7a3424594ade6bd11900d596696dc06bac57" - -split@0.3: - version "0.3.3" - resolved "https://registry.yarnpkg.com/split/-/split-0.3.3.tgz#cd0eea5e63a211dfff7eb0f091c4133e2d0dd28f" - dependencies: - through "2" - -sprintf-js@~1.0.2: - version "1.0.3" - resolved "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz#04e6926f662895354f3dd015203633b857297e2c" - -sshpk@^1.7.0: - version "1.13.0" - resolved "https://registry.yarnpkg.com/sshpk/-/sshpk-1.13.0.tgz#ff2a3e4fd04497555fed97b39a0fd82fafb3a33c" - dependencies: - asn1 "~0.2.3" - assert-plus "^1.0.0" - dashdash "^1.12.0" - getpass "^0.1.1" - optionalDependencies: - bcrypt-pbkdf "^1.0.0" - ecc-jsbn "~0.1.1" - jodid25519 "^1.0.0" - jsbn "~0.1.0" - tweetnacl "~0.14.0" - -stat-mode@^0.2.0: - version "0.2.2" - resolved "https://registry.yarnpkg.com/stat-mode/-/stat-mode-0.2.2.tgz#e6c80b623123d7d80cf132ce538f346289072502" - -stream-combiner@~0.0.4: - version "0.0.4" - resolved "https://registry.yarnpkg.com/stream-combiner/-/stream-combiner-0.0.4.tgz#4d5e433c185261dde623ca3f44c586bcf5c4ad14" - dependencies: - duplexer "~0.1.1" - -stream-shift@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.0.tgz#d5c752825e5367e786f78e18e445ea223a155952" - -streamfilter@^1.0.5: - version "1.0.5" - resolved "https://registry.yarnpkg.com/streamfilter/-/streamfilter-1.0.5.tgz#87507111beb8e298451717b511cfed8f002abf53" - dependencies: - readable-stream "^2.0.2" - -streamifier@~0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/streamifier/-/streamifier-0.1.1.tgz#97e98d8fa4d105d62a2691d1dc07e820db8dfc4f" - -string-width@^1.0.1, string-width@^1.0.2: - version "1.0.2" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-1.0.2.tgz#118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3" - dependencies: - code-point-at "^1.0.0" - is-fullwidth-code-point "^1.0.0" - strip-ansi "^3.0.0" - -string-width@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/string-width/-/string-width-2.0.0.tgz#635c5436cc72a6e0c387ceca278d4e2eec52687e" - dependencies: - is-fullwidth-code-point "^2.0.0" - strip-ansi "^3.0.0" - -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94" - -string_decoder@~1.0.0: - version "1.0.1" - resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.0.1.tgz#62e200f039955a6810d8df0a33ffc0f013662d98" - dependencies: - safe-buffer "^5.0.1" - -stringstream@~0.0.4: - version "0.0.5" - resolved "https://registry.yarnpkg.com/stringstream/-/stringstream-0.0.5.tgz#4e484cd4de5a0bbbee18e46307710a8a81621878" - -strip-ansi@^3.0.0, strip-ansi@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz#6a385fb8853d952d5ff05d0e8aaf94278dc63dcf" - dependencies: - ansi-regex "^2.0.0" - -strip-bom-stream@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz#e7144398577d51a6bed0fa1994fa05f43fd988ee" - dependencies: - first-chunk-stream "^1.0.0" - strip-bom "^2.0.0" - -strip-bom@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-2.0.0.tgz#6219a85616520491f35788bdbf1447a99c7e6b0e" - dependencies: - is-utf8 "^0.2.0" - -strip-eof@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz#bb43ff5598a6eb05d89b59fcd129c983313606bf" - -strip-indent@^1.0.1: - version "1.0.1" - resolved "https://registry.yarnpkg.com/strip-indent/-/strip-indent-1.0.1.tgz#0c7962a6adefa7bbd4ac366460a638552ae1a0a2" - dependencies: - get-stdin "^4.0.1" - -strip-json-comments@~2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-2.0.1.tgz#3c531942e908c2697c0ec344858c286c7ca0a60a" - -supports-color@3.1.2: - version "3.1.2" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-3.1.2.tgz#72a262894d9d408b956ca05ff37b2ed8a6e2a2d5" - dependencies: - has-flag "^1.0.0" - -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz#535d045ce6b6363fa40117084629995e9df324c7" - -tar-pack@^3.4.0: - version "3.4.0" - resolved "https://registry.yarnpkg.com/tar-pack/-/tar-pack-3.4.0.tgz#23be2d7f671a8339376cbdb0b8fe3fdebf317984" - dependencies: - debug "^2.2.0" - fstream "^1.0.10" - fstream-ignore "^1.0.5" - once "^1.3.3" - readable-stream "^2.1.4" - rimraf "^2.5.1" - tar "^2.2.1" - uid-number "^0.0.6" - -tar@^2.2.1: - version "2.2.1" - resolved "https://registry.yarnpkg.com/tar/-/tar-2.2.1.tgz#8e4d2a256c0e2185c6b18ad694aec968b83cb1d1" - dependencies: - block-stream "*" - fstream "^1.0.2" - inherits "2" - -term-size@^0.1.0: - version "0.1.1" - resolved "https://registry.yarnpkg.com/term-size/-/term-size-0.1.1.tgz#87360b96396cab5760963714cda0d0cbeecad9ca" - dependencies: - execa "^0.4.0" - -text-encoding@0.6.4: - version "0.6.4" - resolved "https://registry.yarnpkg.com/text-encoding/-/text-encoding-0.6.4.tgz#e399a982257a276dae428bb92845cb71bdc26d19" - -through2-filter@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/through2-filter/-/through2-filter-2.0.0.tgz#60bc55a0dacb76085db1f9dae99ab43f83d622ec" - dependencies: - through2 "~2.0.0" - xtend "~4.0.0" - -through2@^0.6.0, through2@^0.6.1, through2@^0.6.3, through2@~0.6.5: - version "0.6.5" - resolved "https://registry.yarnpkg.com/through2/-/through2-0.6.5.tgz#41ab9c67b29d57209071410e1d7a7a968cd3ad48" - dependencies: - readable-stream ">=1.0.33-1 <1.1.0-0" - xtend ">=4.0.0 <4.1.0-0" - -through2@^2.0.0, through2@^2.0.1, through2@~2.0.0, through2@~2.0.3: - version "2.0.3" - resolved "https://registry.yarnpkg.com/through2/-/through2-2.0.3.tgz#0004569b37c7c74ba39c43f3ced78d1ad94140be" - dependencies: - readable-stream "^2.1.5" - xtend "~4.0.1" - -through@2, through@~2.3, through@~2.3.1: - version "2.3.8" - resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5" - -time-stamp@^1.0.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/time-stamp/-/time-stamp-1.1.0.tgz#764a5a11af50561921b133f3b44e618687e0f5c3" - -timed-out@^4.0.0: - version "4.0.1" - resolved "https://registry.yarnpkg.com/timed-out/-/timed-out-4.0.1.tgz#f32eacac5a175bea25d7fab565ab3ed8741ef56f" - -to-absolute-glob@^0.1.1: - version "0.1.1" - resolved "https://registry.yarnpkg.com/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz#1cdfa472a9ef50c239ee66999b662ca0eb39937f" - dependencies: - extend-shallow "^2.0.1" - -tough-cookie@~2.3.0: - version "2.3.2" - resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.3.2.tgz#f081f76e4c85720e6c37a5faced737150d84072a" - dependencies: - punycode "^1.4.1" - -trim-newlines@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/trim-newlines/-/trim-newlines-1.0.0.tgz#5887966bb582a4503a41eb524f7d35011815a613" - -ts-json-serializer@^1.2.4: - version "1.2.4" - resolved "https://registry.yarnpkg.com/ts-json-serializer/-/ts-json-serializer-1.2.4.tgz#66d4f5e8d292a2d43b1a478bbdcae427af217c45" - dependencies: - coveralls "^2.11.9" - reflect-metadata "^0.1.9" - tslib "^1.5.0" - -tslib@^1.0.0, tslib@^1.5.0, tslib@^1.7.1: - version "1.7.1" - resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.7.1.tgz#bc8004164691923a79fe8378bbeb3da2017538ec" - -tslint-config-airbnb@^5.0.1: - version "5.0.1" - resolved "https://registry.yarnpkg.com/tslint-config-airbnb/-/tslint-config-airbnb-5.0.1.tgz#07048c4125debc6c05898b3085e0079e04f16b86" - dependencies: - tslint-eslint-rules "^4.0.0" - tslint-microsoft-contrib "^5.0.0" - vrsource-tslint-rules "^5.1.0" - -tslint-eslint-rules@^4.0.0: - version "4.1.1" - resolved "https://registry.yarnpkg.com/tslint-eslint-rules/-/tslint-eslint-rules-4.1.1.tgz#7c30e7882f26bc276bff91d2384975c69daf88ba" - dependencies: - doctrine "^0.7.2" - tslib "^1.0.0" - tsutils "^1.4.0" - -tslint-microsoft-contrib@^5.0.0: - version "5.0.0" - resolved "https://registry.yarnpkg.com/tslint-microsoft-contrib/-/tslint-microsoft-contrib-5.0.0.tgz#0ff6389ce3dbc5ea103782900a7806fffa1450ff" - -tslint@^5.4.2: - version "5.4.2" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.4.2.tgz#609b6640cc0424f4a395a9adf68c375563c549c7" - dependencies: - babel-code-frame "^6.22.0" - colors "^1.1.2" - commander "^2.9.0" - diff "^3.2.0" - glob "^7.1.1" - minimatch "^3.0.4" - resolve "^1.3.2" - semver "^5.3.0" - tslib "^1.7.1" - tsutils "^2.3.0" - -tslint@~5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/tslint/-/tslint-5.1.0.tgz#51a47baeeb58956fcd617bd2cf00e2ef0eea2ed9" - dependencies: - babel-code-frame "^6.22.0" - colors "^1.1.2" - diff "^3.2.0" - findup-sync "~0.3.0" - glob "^7.1.1" - optimist "~0.6.0" - resolve "^1.3.2" - semver "^5.3.0" - tsutils "^1.4.0" - -tsutils@^1.4.0: - version "1.9.1" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-1.9.1.tgz#b9f9ab44e55af9681831d5f28d0aeeaf5c750cb0" - -tsutils@^2.3.0: - version "2.3.0" - resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.3.0.tgz#96e661d7c2363f31adc8992ac67bbe7b7fc175e5" - -tunnel-agent@^0.6.0: - version "0.6.0" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd" - dependencies: - safe-buffer "^5.0.1" - -tunnel-agent@~0.4.1: - version "0.4.3" - resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.4.3.tgz#6373db76909fe570e08d73583365ed828a74eeeb" - -tweetnacl@^0.14.3, tweetnacl@~0.14.0: - version "0.14.5" - resolved "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz#5ae68177f192d4456269d108afa93ff8743f4f64" - -type-detect@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-3.0.0.tgz#46d0cc8553abb7b13a352b0d6dea2fd58f2d9b55" - -type-detect@^4.0.0: - version "4.0.3" - resolved "https://registry.yarnpkg.com/type-detect/-/type-detect-4.0.3.tgz#0e3f2670b44099b0b46c284d136a7ef49c74c2ea" - -typescript@^2.3.4: - version "2.3.4" - resolved "https://registry.yarnpkg.com/typescript/-/typescript-2.3.4.tgz#3d38321828231e434f287514959c37a82b629f42" - -uid-number@^0.0.6: - version "0.0.6" - resolved "https://registry.yarnpkg.com/uid-number/-/uid-number-0.0.6.tgz#0ea10e8035e8eb5b8e4449f06da1c730663baa81" - -unique-stream@^2.0.2: - version "2.2.1" - resolved "https://registry.yarnpkg.com/unique-stream/-/unique-stream-2.2.1.tgz#5aa003cfbe94c5ff866c4e7d668bb1c4dbadb369" - dependencies: - json-stable-stringify "^1.0.0" - through2-filter "^2.0.0" - -unique-string@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/unique-string/-/unique-string-1.0.0.tgz#9e1057cca851abb93398f8b33ae187b99caec11a" - dependencies: - crypto-random-string "^1.0.0" - -unzip-response@^2.0.1: - version "2.0.1" - resolved "https://registry.yarnpkg.com/unzip-response/-/unzip-response-2.0.1.tgz#d2f0f737d16b0615e72a6935ed04214572d56f97" - -update-notifier@^2.1.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/update-notifier/-/update-notifier-2.1.0.tgz#ec0c1e53536b76647a24b77cb83966d9315123d9" - dependencies: - boxen "^1.0.0" - chalk "^1.0.0" - configstore "^3.0.0" - is-npm "^1.0.0" - latest-version "^3.0.0" - lazy-req "^2.0.0" - semver-diff "^2.0.0" - xdg-basedir "^3.0.0" - -url-parse-lax@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/url-parse-lax/-/url-parse-lax-1.0.0.tgz#7af8f303645e9bd79a272e7a14ac68bc0609da73" - dependencies: - prepend-http "^1.0.1" - -util-deprecate@~1.0.1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf" - -uuid@^3.0.0: - version "3.0.1" - resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.0.1.tgz#6544bba2dfda8c1cf17e629a3a305e2bb1fee6c1" - -vali-date@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/vali-date/-/vali-date-1.0.0.tgz#1b904a59609fb328ef078138420934f6b86709a6" - -validate-npm-package-license@^3.0.1: - version "3.0.1" - resolved "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz#2804babe712ad3379459acfbe24746ab2c303fbc" - dependencies: - spdx-correct "~1.0.0" - spdx-expression-parse "~1.0.0" - -verror@1.3.6: - version "1.3.6" - resolved "https://registry.yarnpkg.com/verror/-/verror-1.3.6.tgz#cff5df12946d297d2baaefaa2689e25be01c005c" - dependencies: - extsprintf "1.0.2" - -vinyl-fs@^2.0.0, vinyl-fs@^2.4.3: - version "2.4.4" - resolved "https://registry.yarnpkg.com/vinyl-fs/-/vinyl-fs-2.4.4.tgz#be6ff3270cb55dfd7d3063640de81f25d7532239" - dependencies: - duplexify "^3.2.0" - glob-stream "^5.3.2" - graceful-fs "^4.0.0" - gulp-sourcemaps "1.6.0" - is-valid-glob "^0.3.0" - lazystream "^1.0.0" - lodash.isequal "^4.0.0" - merge-stream "^1.0.0" - mkdirp "^0.5.0" - object-assign "^4.0.0" - readable-stream "^2.0.4" - strip-bom "^2.0.0" - strip-bom-stream "^1.0.0" - through2 "^2.0.0" - through2-filter "^2.0.0" - vali-date "^1.0.0" - vinyl "^1.0.0" - -vinyl-source-stream@^1.1.0: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vinyl-source-stream/-/vinyl-source-stream-1.1.0.tgz#44cbe5108205279deb0c5653c094a2887938b1ab" - dependencies: - through2 "^0.6.1" - vinyl "^0.4.3" - -vinyl@^0.4.3, vinyl@^0.4.6, vinyl@~0.4.6: - version "0.4.6" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.4.6.tgz#2f356c87a550a255461f36bbeb2a5ba8bf784847" - dependencies: - clone "^0.2.0" - clone-stats "^0.0.1" - -vinyl@^0.5.0: - version "0.5.3" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-0.5.3.tgz#b0455b38fc5e0cf30d4325132e461970c2091cde" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@^1.0.0: - version "1.2.0" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-1.2.0.tgz#5c88036cf565e5df05558bfc911f8656df218884" - dependencies: - clone "^1.0.0" - clone-stats "^0.0.1" - replace-ext "0.0.1" - -vinyl@~2.0.1: - version "2.0.2" - resolved "https://registry.yarnpkg.com/vinyl/-/vinyl-2.0.2.tgz#0a3713d8d4e9221c58f10ca16c0116c9e25eda7c" - dependencies: - clone "^1.0.0" - clone-buffer "^1.0.0" - clone-stats "^1.0.0" - cloneable-readable "^1.0.0" - is-stream "^1.1.0" - remove-trailing-separator "^1.0.1" - replace-ext "^1.0.0" - -vrsource-tslint-rules@^5.1.0: - version "5.1.0" - resolved "https://registry.yarnpkg.com/vrsource-tslint-rules/-/vrsource-tslint-rules-5.1.0.tgz#45f7817af6d0490996bf00c19cf7a5af30c797a4" - dependencies: - chokidar-cli "~1.2.0" - tslint "~5.1.0" - -vscode-jsonrpc@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vscode-jsonrpc/-/vscode-jsonrpc-3.2.0.tgz#c92b946ac385c8b41439b842b6bd07d517b64a7d" - -vscode-languageclient@^3.0.4: - version "3.2.2" - resolved "https://registry.yarnpkg.com/vscode-languageclient/-/vscode-languageclient-3.2.2.tgz#7843839614aa099f172b4e5f8967d42b58d77f0d" - dependencies: - vscode-jsonrpc "^3.2.0" - vscode-languageserver-types "^3.2.0" - -vscode-languageserver-types@^3.0.3, vscode-languageserver-types@^3.2.0: - version "3.2.0" - resolved "https://registry.yarnpkg.com/vscode-languageserver-types/-/vscode-languageserver-types-3.2.0.tgz#8874ed92dbfa66df5fb0e2bf73f614cf9483be8f" - -vscode-languageserver@^3.0.5: - version "3.2.2" - resolved "https://registry.yarnpkg.com/vscode-languageserver/-/vscode-languageserver-3.2.2.tgz#9a7b66e1252838ea51a0061145089a2b88a9516a" - dependencies: - vscode-jsonrpc "^3.2.0" - vscode-languageserver-types "^3.2.0" - -vscode@^1.0.3: - version "1.1.0" - resolved "https://registry.yarnpkg.com/vscode/-/vscode-1.1.0.tgz#b04c2399b6ec768135c9688e7873d776e28dcb95" - dependencies: - glob "^7.1.1" - gulp-chmod "^2.0.0" - gulp-filter "^5.0.0" - gulp-gunzip "0.0.3" - gulp-remote-src "^0.4.2" - gulp-symdest "^1.1.0" - gulp-untar "^0.0.6" - gulp-vinyl-zip "^1.4.0" - mocha "^3.2.0" - request "^2.79.0" - semver "^5.3.0" - source-map-support "^0.4.11" - vinyl-source-stream "^1.1.0" - -which@^1.2.8: - version "1.2.14" - resolved "https://registry.yarnpkg.com/which/-/which-1.2.14.tgz#9a87c4378f03e827cecaf1acdf56c736c01c14e5" - dependencies: - isexe "^2.0.0" - -wide-align@^1.1.0: - version "1.1.2" - resolved "https://registry.yarnpkg.com/wide-align/-/wide-align-1.1.2.tgz#571e0f1b0604636ebc0dfc21b0339bbe31341710" - dependencies: - string-width "^1.0.2" - -widest-line@^1.0.0: - version "1.0.0" - resolved "https://registry.yarnpkg.com/widest-line/-/widest-line-1.0.0.tgz#0c09c85c2a94683d0d7eaf8ee097d564bf0e105c" - dependencies: - string-width "^1.0.1" - -window-size@^0.1.4: - version "0.1.4" - resolved "https://registry.yarnpkg.com/window-size/-/window-size-0.1.4.tgz#f8e1aa1ee5a53ec5bf151ffa09742a6ad7697876" - -wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.yarnpkg.com/wordwrap/-/wordwrap-0.0.3.tgz#a3d5da6cd5c0bc0008d37234bbaf1bed63059107" - -wrap-ansi@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-2.1.0.tgz#d8fc3d284dd05794fe84973caecdd1cf824fdd85" - dependencies: - string-width "^1.0.1" - strip-ansi "^3.0.1" - -wrappy@1: - version "1.0.2" - resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f" - -write-file-atomic@^2.0.0: - version "2.1.0" - resolved "https://registry.yarnpkg.com/write-file-atomic/-/write-file-atomic-2.1.0.tgz#1769f4b551eedce419f0505deae2e26763542d37" - dependencies: - graceful-fs "^4.1.11" - imurmurhash "^0.1.4" - slide "^1.1.5" - -xdg-basedir@^3.0.0: - version "3.0.0" - resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-3.0.0.tgz#496b2cc109eca8dbacfe2dc72b603c17c5870ad4" - -"xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@~4.0.0, xtend@~4.0.1: - version "4.0.1" - resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af" - -y18n@^3.2.0: - version "3.2.1" - resolved "https://registry.yarnpkg.com/y18n/-/y18n-3.2.1.tgz#6d15fba884c08679c0d77e88e7759e811e07fa41" - -yallist@^2.0.0: - version "2.1.2" - resolved "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz#1c11f9218f076089a47dd512f93c6699a6a81d52" - -yargs@^3.7.2: - version "3.32.0" - resolved "https://registry.yarnpkg.com/yargs/-/yargs-3.32.0.tgz#03088e9ebf9e756b69751611d2a5ef591482c995" - dependencies: - camelcase "^2.0.1" - cliui "^3.0.3" - decamelize "^1.1.1" - os-locale "^1.4.0" - string-width "^1.0.1" - window-size "^0.1.4" - y18n "^3.2.0" - -yauzl@^2.2.1: - version "2.8.0" - resolved "https://registry.yarnpkg.com/yauzl/-/yauzl-2.8.0.tgz#79450aff22b2a9c5a41ef54e02db907ccfbf9ee2" - dependencies: - buffer-crc32 "~0.2.3" - fd-slicer "~1.0.1" - -yazl@^2.2.1: - version "2.4.2" - resolved "https://registry.yarnpkg.com/yazl/-/yazl-2.4.2.tgz#14cb19083e1e25a70092c1588aabe0f4e4dd4d88" - dependencies: - buffer-crc32 "~0.2.3"