diff --git a/README.md b/README.md index 6b7c889..5e9779e 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,10 @@ Here is a brief list, of what TypeScript Hero is capable of (more at the end): - "Light bulb feature" that fixes code you wrote - Sort and organize your imports (sort and remove unused) - Code outline view of your open TS / TSX document +- All the cool stuff for JavaScript as well! (experimental stage though, better description below.) + - Add imports from javascript files + - Code outline for JS / JSX files + - Intellisense for JS / JSX files ## Commands @@ -83,6 +87,7 @@ The following settings do have the prefix `resolver`. So an example setting coul | disableImportSorting | Disable sorting during organize imports action | | importGroups | The groups that are used for sorting the imports (description below) | | ignoreImportsForOrganize | Imports that are never removed during organize import (e.g. react) | +| resolverMode | Which files should be considered to index for TypeScript Hero | ### Code outline view @@ -213,6 +218,16 @@ see what's in them. If you click on an element, the editor will jump to the loca By now, only typescript / typescript-react is supported. Maybe this will wander in it's own extension to support more languages than those two. +### ES6 / JavaScript support + +As of now, this is kind of an experimental stage. TypeScript Hero can be set into an `ES6` or `Both` mode, instead +of only `TypeScript`. With one of either modes, it will scan for javascript files in the workspace. + +Right now, only files in the workspace are considered "worth", because of the immense amount of javascript files +in the `node_modules`. So if you set TSH to `ES6` it will scan all typescript declarations in the `node_modules`, and +your javascript files in the workspace. If you set it to `Both`, it will scan all typescript files and the javascript +files in the workspace (as well as the declarations). + ## Known Issues Please visit [the issue list](https://github.com/buehler/typescript-hero/issues) :-) diff --git a/package-lock.json b/package-lock.json index d725ab7..aa84285 100644 --- a/package-lock.json +++ b/package-lock.json @@ -88,9 +88,9 @@ } }, "@types/chai": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.1.tgz", - "integrity": "sha512-DWrdkraJO+KvBB7+Jc6AuDd2+fwV6Z9iK8cqEEoYpcurYrH7GiUZmwjFuQIIWj5HhFz6NsSxdN72YMIHT7Fy2Q==", + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.0.2.tgz", + "integrity": "sha512-0pHNZTD0SpQhz1kUM4Muhgdn4acxq21kp726pZfWMmKYGbmmv8XkGTt3k/0QDklhTUYBD6hknZ/1YFokyP/G7Q==", "dev": true }, "@types/mocha": { @@ -100,9 +100,9 @@ "dev": true }, "@types/node": { - "version": "8.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.13.tgz", - "integrity": "sha512-Y3EAG7VA7NVNbZek/fjJtILnmTk/ZfpJuWZGDBqDZ1dVIxgJJJ82fXPW7pKnqyV9CD/9bcPOCi7eErUqGMHOrA==", + "version": "8.0.20", + "resolved": "https://registry.npmjs.org/@types/node/-/node-8.0.20.tgz", + "integrity": "sha512-MnB7YEpmLUyEWRVRhKpRs4swwqITnY8BcVFPoTuCl99SCplI/lLUiU5vcJ/OANDqwkpdIg0pDEM38K22KQT2RA==", "dev": true }, "@types/reflect-metadata": { @@ -112,9 +112,9 @@ "dev": true }, "@types/sinon": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.2.tgz", - "integrity": "sha512-92DKsC/9bnsfyBLdY5AP8Zk7LDbwVF0hBHsfQ3IY3kHXEo3NdJA57090wGmzcnITxupyvR3lXk278tPktM6OJw==", + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/sinon/-/sinon-2.3.3.tgz", + "integrity": "sha512-bnoHhhCsx0p0yhLOywFg6T7Le37JjtnzLcWal6cuSPvIZUBzKRIsqM6E5OsKUIRVErCaBCghHIZmqtyGk5uXyA==", "dev": true }, "@types/sinon-chai": { @@ -123,8 +123,8 @@ "integrity": "sha512-qh9K/XtXzdHWiUqvFFjw3jQ5ZNrw0wzHaCWTcgBfSn7KwbjZHywinAdinSpUXeHBv+4cojk/9WSrPwVPYiITTA==", "dev": true, "requires": { - "@types/chai": "4.0.1", - "@types/sinon": "2.3.2" + "@types/chai": "4.0.2", + "@types/sinon": "2.3.3" } }, "abbrev": { @@ -544,9 +544,9 @@ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" }, "chai": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.0.tgz", - "integrity": "sha1-MxoDkbVcOvh0CunDt0WLwcOAXm0=", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.1.1.tgz", + "integrity": "sha1-ZuISeebzxkFf+CMYeCJ5AOIXGzk=", "dev": true, "requires": { "assertion-error": "1.0.2", @@ -583,6 +583,7 @@ "requires": { "anymatch": "1.3.0", "async-each": "1.0.1", + "fsevents": "1.1.2", "glob-parent": "2.0.0", "inherits": "2.0.3", "is-binary-path": "1.0.1", @@ -1411,6 +1412,1018 @@ "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, + "requires": { + "nan": "2.6.2", + "node-pre-gyp": "0.6.36" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": 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=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "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, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "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, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": 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 + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "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 + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "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 + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "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, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "optional": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "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=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "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, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "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=", + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "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, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.36", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.36.tgz", + "integrity": "sha1-22BBEst04NR3VU6bUFsXq936t4Y=", + "dev": true, + "optional": true, + "requires": { + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "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 + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": 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 + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "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 + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": 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, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "optional": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": 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, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "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, + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": 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=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, "fstream": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", @@ -2143,9 +3156,9 @@ "dev": true }, "inversify": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/inversify/-/inversify-4.2.0.tgz", - "integrity": "sha512-+9yj+0BBk+XJy+o0JdHa95uQK1J1zGv7NE3Dj2MwCaoKoX1qqB/zlxcv9dFsWLC2XDRZNAQ3flVbx87KfD8Hmg==" + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/inversify/-/inversify-4.3.0.tgz", + "integrity": "sha512-BbKzOP4nLl7DSHx31vN5KgUkkJc759+OLocDGryldXPjogixzOs/n4qvT25lbNN67uB6aWlFF84NS/zI5j8pfg==" }, "inversify-inject-decorators": { "version": "3.0.1", @@ -3008,6 +4021,13 @@ "duplexer2": "0.0.2" } }, + "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", @@ -3896,9 +4916,9 @@ "dev": true }, "sinon": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.0.0.tgz", - "integrity": "sha512-oGoqOflgmoKm+lHkGsUw5IjxOu3Nat0WfoJpWFj8sklC1KDCGamkg/nDJGJAv9hXLY5KiflDoY/7ewgfsbNLTA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/sinon/-/sinon-3.1.0.tgz", + "integrity": "sha512-cuR8dtB/EPuBzIyLrhONxEjbnkLm8EqtQ8IBCJa9+BdoDESCVMgFuF8I7I3+R8Lgq69PjyII3iPaIlWpwZd1ug==", "dev": true, "requires": { "diff": "3.3.0", @@ -3913,9 +4933,9 @@ } }, "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==", + "version": "2.12.0", + "resolved": "https://registry.npmjs.org/sinon-chai/-/sinon-chai-2.12.0.tgz", + "integrity": "sha512-/J38xAWY5ppvRKuSrdnpVv7rWmxjfma9lL/iYaqn+ge/JynkhM9w8PaFAoGvGv+Tj2nEQWkkS8S4Syt4Lw1K6Q==", "dev": true }, "slash": { @@ -4365,9 +5385,9 @@ "integrity": "sha1-vIAEFkaRkjp5/oN4u+s9ogF1OOw=" }, "tslint": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.5.0.tgz", - "integrity": "sha1-EOjas+MGH6YelELozuOYKs8gpqo=", + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/tslint/-/tslint-5.6.0.tgz", + "integrity": "sha1-CIqmxgJmIzOGULKQCCirPt9Z9s8=", "dev": true, "requires": { "babel-code-frame": "6.22.0", @@ -4379,7 +5399,7 @@ "resolve": "1.3.3", "semver": "5.3.0", "tslib": "1.7.1", - "tsutils": "2.7.1" + "tsutils": "2.8.0" } }, "tslint-config-airbnb": { @@ -4401,7 +5421,7 @@ "dev": true, "requires": { "tslib": "1.7.1", - "tsutils": "2.7.1" + "tsutils": "2.8.0" } }, "tslint-eslint-rules": { @@ -4441,9 +5461,9 @@ } }, "tsutils": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.7.1.tgz", - "integrity": "sha1-QRoOlGZSWisoaSYKVWINcpIVXiQ=", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-2.8.0.tgz", + "integrity": "sha1-AWAXNymzvxOGKN0UoVN+AIUdgUo=", "dev": true, "requires": { "tslib": "1.7.1" @@ -4473,19 +5493,19 @@ "dev": true }, "typescript": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.1.tgz", - "integrity": "sha1-w8yxbdqgsjFN4DHn5v7onlujRrw=" + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.4.2.tgz", + "integrity": "sha1-+DlfhdRZJ2BnyYiqQYN6j4KHCEQ=" }, "typescript-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/typescript-parser/-/typescript-parser-1.2.1.tgz", - "integrity": "sha512-Nuomi2vdwm2vjAHW10ebEZ/N1u9hcrn5PzAbRmUPu4uxTmcS8TwAD6xc3k1Y3kj4aC/RpFaHcYArkH1H+nrxig==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/typescript-parser/-/typescript-parser-1.3.0.tgz", + "integrity": "sha512-jS7gnlmylFeJLJpjnl3MhjQ7wjb6a/v6H4e5bkV3ecZ1JmyeyQUG2w/wNrGRWqagcRoX9Jwo0nl8nUsykHgYkQ==", "requires": { "coveralls": "2.13.1", "lodash": "4.17.4", "tslib": "1.7.1", - "typescript": "2.4.1" + "typescript": "2.4.2" } }, "uid-number": { diff --git a/package.json b/package.json index 32eec42..fc8f40f 100644 --- a/package.json +++ b/package.json @@ -89,36 +89,38 @@ "semantic-release": "npm run semantic-release-pre && vsce package && vsce publish -p $VSCE_TOKEN && npm install && semantic-release post" }, "devDependencies": { - "@types/chai": "^4.0.1", + "@types/chai": "^4.0.2", "@types/mocha": "^2.2.41", - "@types/node": "^8.0.13", + "@types/node": "^8.0.20", "@types/reflect-metadata": "0.0.5", - "@types/sinon": "^2.3.2", + "@types/sinon": "^2.3.3", "@types/sinon-chai": "^2.7.28", - "chai": "^4.0.2", + "chai": "^4.1.1", "del-cli": "^1.1.0", "filewalker": "^0.1.3", "mocha-testdata": "^1.2.0", "semantic-release": "^6.3.6", "semantic-release-visualstudio-marketplace-version": "^1.0.0", - "sinon": "^3.0.0", - "sinon-chai": "^2.11.0", - "tslint": "^5.5.0", + "sinon": "^3.1.0", + "sinon-chai": "^2.12.0", + "tslint": "^5.6.0", "tslint-config-airbnb": "^5.2.1", - "tsutils": "^2.7.1", + "tsutils": "^2.8.0", "vscode": "^1.1.4" }, "dependencies": { - "inversify": "^4.2.0", + "inversify": "^4.3.0", "inversify-inject-decorators": "^3.0.1", "reflect-metadata": "^0.1.10", "tslib": "^1.7.1", - "typescript": "^2.4.1", - "typescript-parser": "^1.2.1" + "typescript": "^2.4.2", + "typescript-parser": "^1.3.0" }, "activationEvents": [ "onLanguage:typescript", - "onLanguage:typescriptreact" + "onLanguage:typescriptreact", + "onLanguage:javascript", + "onLanguage:javascriptreact" ], "contributes": { "commands": [ @@ -327,6 +329,15 @@ ], "description": "Defines the groups of the imports ordering. Multiple groups possible, see readme for instructions." }, + "typescriptHero.resolver.resolverMode": { + "enum": [ + "TypeScript", + "ES6", + "Both" + ], + "default": "TypeScript", + "description": "Defines the mode of the symbol resolver (i.e. if JavaScript files should be indexed as well (experimental)." + }, "typescriptHero.codeOutline.enabled": { "type": "boolean", "default": true, diff --git a/src/common/config/ResolverConfig.ts b/src/common/config/ResolverConfig.ts index a4ddc6e..18cdce1 100644 --- a/src/common/config/ResolverConfig.ts +++ b/src/common/config/ResolverConfig.ts @@ -1,6 +1,7 @@ import { TypescriptGenerationOptions } from 'typescript-parser'; import { ImportGroup } from '../../extension/import-grouping'; +import { ResolverMode } from '../enums'; /** * Configuration interface for the resolver extension. @@ -112,4 +113,37 @@ export interface ResolverConfig { * @memberof ResolverConfig */ generationOptions: TypescriptGenerationOptions; + + /** + * Current mode of the resolver. + * + * @type {ResolverMode} + * @memberof ResolverConfig + */ + resolverMode: ResolverMode; + + /** + * Returns a list of file globs for the actual set resolver mode. + * + * @example `TypeScript` + * Will return: ['\*\*\/\*.ts', '\*\*\/\*.tsx'] + * + * @example `ES6` + * Will return: ['\*\*\/\*.js', '\*\*\/\*.jsx'] + * + * @type {string[]} + * @memberof ResolverConfig + */ + resolverModeFileGlobs: string[]; + + /** + * Returns a list of usable languages for the set resolver mode. + * + * @example `TypeScript` + * Will return: ['typescript', 'typescriptreact'] + * + * @type {string[]} + * @memberof ResolverConfig + */ + resolverModeLanguages: string[]; } diff --git a/src/common/enums.ts b/src/common/enums.ts new file mode 100644 index 0000000..fbd393d --- /dev/null +++ b/src/common/enums.ts @@ -0,0 +1,11 @@ +/** + * Enum to describe the actual mode that the symbol resolver is set in. + * + * @export + * @enum {number} + */ +export enum ResolverMode { + TypeScript, + ES6, + Both, +} diff --git a/src/extension/IoC.ts b/src/extension/IoC.ts index 1311775..eec8da9 100644 --- a/src/extension/IoC.ts +++ b/src/extension/IoC.ts @@ -48,8 +48,8 @@ container // Extensions container.bind(iocSymbols.extensions).to(ImportResolveExtension).inSingletonScope(); container.bind(iocSymbols.extensions).to(CodeCompletionExtension).inSingletonScope(); -container.bind(iocSymbols.extensions).to(CodeActionExtension).inSingletonScope(); container.bind(iocSymbols.extensions).to(DocumentSymbolStructureExtension).inSingletonScope(); +container.bind(iocSymbols.extensions).to(CodeActionExtension).inSingletonScope(); // Logging container diff --git a/src/extension/VscodeExtensionConfig.ts b/src/extension/VscodeExtensionConfig.ts index 3dd49cf..416bd5c 100644 --- a/src/extension/VscodeExtensionConfig.ts +++ b/src/extension/VscodeExtensionConfig.ts @@ -1,6 +1,7 @@ +import { ResolverMode } from '../common/enums'; import { injectable } from 'inversify'; import { TypescriptGenerationOptions } from 'typescript-parser'; -import { workspace } from 'vscode'; +import { workspace, WorkspaceConfiguration } from 'vscode'; import { ExtensionConfig, ResolverConfig } from '../common/config'; import { CodeOutlineConfig } from '../common/config/CodeOutlineConfig'; @@ -20,6 +21,10 @@ export class VscodeExtensionConfig implements ExtensionConfig { private resolverConfig: ResolverConfig = new VscodeResolverConfig(); private codeOutlineConfig: CodeOutlineConfig = new VscodeCodeOutlineConfig(); + private get workspaceSection(): WorkspaceConfiguration { + return workspace.getConfiguration(sectionKey); + } + /** * The actual log level. * @@ -28,7 +33,7 @@ export class VscodeExtensionConfig implements ExtensionConfig { * @memberof VscodeExtensionConfig */ public get verbosity(): string { - return workspace.getConfiguration(sectionKey).get('verbosity') || 'Warning'; + return this.workspaceSection.get('verbosity') || 'Warning'; } /** @@ -60,6 +65,10 @@ export class VscodeExtensionConfig implements ExtensionConfig { * @class VscodeResolverConfig */ class VscodeResolverConfig implements ResolverConfig { + private get workspaceSection(): WorkspaceConfiguration { + return workspace.getConfiguration(sectionKey); + } + /** * Defines, if there should be a space between the brace and the import specifiers. * {Symbol} vs { Symbol } @@ -69,7 +78,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get insertSpaceBeforeAndAfterImportBraces(): boolean { - const value = workspace.getConfiguration(sectionKey).get('resolver.insertSpaceBeforeAndAfterImportBraces'); + const value = this.workspaceSection.get('resolver.insertSpaceBeforeAndAfterImportBraces'); return value !== undefined ? value : true; } @@ -82,7 +91,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get insertSemicolons(): boolean { - const value = workspace.getConfiguration(sectionKey).get('resolver.insertSemicolons'); + const value = this.workspaceSection.get('resolver.insertSemicolons'); return value !== undefined ? value : true; } @@ -94,7 +103,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get stringQuoteStyle(): string { - return workspace.getConfiguration(sectionKey).get('resolver.stringQuoteStyle') || `'`; + return this.workspaceSection.get('resolver.stringQuoteStyle') || `'`; } /** @@ -106,7 +115,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get ignorePatterns(): string[] { - return workspace.getConfiguration(sectionKey).get('resolver.ignorePatterns') || [ + return this.workspaceSection.get('resolver.ignorePatterns') || [ 'build', 'out', 'dist', @@ -121,7 +130,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get multiLineWrapThreshold(): number { - return workspace.getConfiguration(sectionKey).get('resolver.multiLineWrapThreshold') || 125; + return this.workspaceSection.get('resolver.multiLineWrapThreshold') || 125; } /** @@ -138,7 +147,7 @@ class VscodeResolverConfig implements ResolverConfig { * } from 'whatever'; */ public get multiLineTrailingComma(): boolean { - const value = workspace.getConfiguration(sectionKey).get('resolver.multiLineTrailingComma'); + const value = this.workspaceSection.get('resolver.multiLineTrailingComma'); return value !== undefined ? value : true; } @@ -150,7 +159,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof ResolverConfig */ public get disableImportSorting(): boolean { - const value = workspace.getConfiguration(sectionKey).get('resolver.disableImportsSorting'); + const value = this.workspaceSection.get('resolver.disableImportsSorting'); return value !== undefined ? value : false; } @@ -173,7 +182,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get ignoreImportsForOrganize(): string[] { - return workspace.getConfiguration(sectionKey).get('resolver.ignoreImportsForOrganize') || []; + return this.workspaceSection.get('resolver.ignoreImportsForOrganize') || []; } /** @@ -183,7 +192,7 @@ class VscodeResolverConfig implements ResolverConfig { * @memberof VscodeResolverConfig */ public get importGroups(): ImportGroup[] { - const groups = workspace.getConfiguration(sectionKey).get('resolver.importGroups'); + const groups = this.workspaceSection.get('resolver.importGroups'); let importGroups: ImportGroup[] = []; try { @@ -219,6 +228,74 @@ class VscodeResolverConfig implements ResolverConfig { tabSize: this.tabSize, }; } + + /** + * Current mode of the resolver. + * + * @readonly + * @type {ResolverMode} + * @memberof VscodeResolverConfig + */ + public get resolverMode(): ResolverMode { + const mode = this.workspaceSection.get('resolver.resolverMode', 'TypeScript'); + return ResolverMode[mode] || ResolverMode.TypeScript; + } + + /** + * Returns a list of file globs for the actual set resolver mode. + * + * @example `TypeScript` + * Will return: ['\*\*\/\*.ts', '\*\*\/\*.tsx'] + * + * @example `ES6` + * Will return: ['\*\*\/\*.js', '\*\*\/\*.jsx'] + * + * @type {string[]} + * @memberof VscodeResolverConfig + */ + public get resolverModeFileGlobs(): string[] { + const mode = this.resolverMode; + const globs: string[] = []; + + if (mode === ResolverMode.TypeScript || mode === ResolverMode.Both) { + globs.push('**/*.ts'); + globs.push('**/*.tsx'); + } + + if (mode === ResolverMode.ES6 || mode === ResolverMode.Both) { + globs.push('**/*.js'); + globs.push('**/*.jsx'); + } + + return globs; + } + + /** + * Returns a list of usable languages for the set resolver mode. + * + * @example `TypeScript` + * Will return: ['typescript', 'typescriptreact'] + * + * @readonly + * @type {string[]} + * @memberof VscodeResolverConfig + */ + public get resolverModeLanguages(): string[] { + const mode = this.resolverMode; + const languages: string[] = []; + + if (mode === ResolverMode.TypeScript || mode === ResolverMode.Both) { + languages.push('typescript'); + languages.push('typescriptreact'); + } + + if (mode === ResolverMode.ES6 || mode === ResolverMode.Both) { + languages.push('javascript'); + languages.push('javascriptreact'); + } + + return languages; + } } /** @@ -228,6 +305,9 @@ class VscodeResolverConfig implements ResolverConfig { * @implements {CodeOutlineConfig} */ class VscodeCodeOutlineConfig implements CodeOutlineConfig { + private get workspaceSection(): WorkspaceConfiguration { + return workspace.getConfiguration(sectionKey); + } /** * Defined if the code outline feature is enabled or not. @@ -237,7 +317,7 @@ class VscodeCodeOutlineConfig implements CodeOutlineConfig { * @memberof VscodeCodeOutlineConfig */ public get outlineEnabled(): boolean { - const value = workspace.getConfiguration(sectionKey).get('codeOutline.enabled'); + const value = this.workspaceSection.get('codeOutline.enabled'); return value !== undefined ? value : true; } } diff --git a/src/extension/extensions/CodeCompletionExtension.ts b/src/extension/extensions/CodeCompletionExtension.ts index 1ac667f..51de553 100644 --- a/src/extension/extensions/CodeCompletionExtension.ts +++ b/src/extension/extensions/CodeCompletionExtension.ts @@ -9,8 +9,11 @@ import { languages, Position, TextDocument, + Disposable, + workspace, } from 'vscode'; +import { ExtensionConfig } from '../../common/config'; import { getDeclarationsFilteredByImports } from '../../common/helpers'; import { Logger, LoggerFactory } from '../../common/utilities'; import { iocSymbols } from '../IoCSymbols'; @@ -29,6 +32,7 @@ import { BaseExtension } from './BaseExtension'; @injectable() export class CodeCompletionExtension extends BaseExtension implements CompletionItemProvider { private logger: Logger; + private languageRegisters: Disposable[] = []; constructor( @inject(iocSymbols.extensionContext) context: ExtensionContext, @@ -36,6 +40,7 @@ export class CodeCompletionExtension extends BaseExtension implements Completion @inject(iocSymbols.typescriptParser) private parser: TypescriptParser, @inject(iocSymbols.declarationIndex) private index: DeclarationIndex, @inject(iocSymbols.rootPath) private rootPath: string, + @inject(iocSymbols.configuration) private config: ExtensionConfig, ) { super(context); this.logger = loggerFactory('CodeCompletionExtension'); @@ -47,8 +52,22 @@ export class CodeCompletionExtension extends BaseExtension implements Completion * @memberof CodeCompletionExtension */ public initialize(): void { - this.context.subscriptions.push(languages.registerCompletionItemProvider('typescript', this)); - this.context.subscriptions.push(languages.registerCompletionItemProvider('typescriptreact', this)); + for (const lang of this.config.resolver.resolverModeLanguages) { + this.languageRegisters.push(languages.registerCompletionItemProvider(lang, this)); + } + + this.context.subscriptions.push(workspace.onDidChangeConfiguration(() => { + if (this.languageRegisters.length !== this.config.resolver.resolverModeLanguages.length) { + this.logger.info('ResolverMode has changed, registering to new configuration languages'); + for (const register of this.languageRegisters) { + register.dispose(); + } + this.languageRegisters = []; + for (const lang of this.config.resolver.resolverModeLanguages) { + this.languageRegisters.push(languages.registerCompletionItemProvider(lang, this)); + } + } + })); this.context.subscriptions.push( commands.registerCommand( @@ -67,6 +86,9 @@ export class CodeCompletionExtension extends BaseExtension implements Completion * @memberof CodeCompletionExtension */ public dispose(): void { + for (const register of this.languageRegisters) { + register.dispose(); + } this.logger.info('Disposed'); } diff --git a/src/extension/extensions/DocumentSymbolStructureExtension.ts b/src/extension/extensions/DocumentSymbolStructureExtension.ts index 031d37a..e9bee7c 100644 --- a/src/extension/extensions/DocumentSymbolStructureExtension.ts +++ b/src/extension/extensions/DocumentSymbolStructureExtension.ts @@ -93,7 +93,9 @@ export class DocumentSymbolStructureExtension extends BaseExtension implements T return []; } - if (!['typescript', 'typescriptreact'].some(lang => lang === window.activeTextEditor!.document.languageId)) { + if (!this.config.resolver.resolverModeLanguages.some( + lang => lang === window.activeTextEditor!.document.languageId, + )) { return [new NotParseableStructureTreeItem()]; } diff --git a/src/extension/extensions/ImportResolveExtension.ts b/src/extension/extensions/ImportResolveExtension.ts index f1a1375..d835278 100644 --- a/src/extension/extensions/ImportResolveExtension.ts +++ b/src/extension/extensions/ImportResolveExtension.ts @@ -15,6 +15,7 @@ import { } from 'vscode'; import { ExtensionConfig } from '../../common/config'; +import { ResolverMode } from '../../common/enums'; import { getDeclarationsFilteredByImports } from '../../common/helpers'; import { ResolveQuickPickItem } from '../../common/quick-pick-items'; import { Logger, LoggerFactory } from '../../common/utilities'; @@ -59,11 +60,13 @@ function compareIgnorePatterns(local: string[], config: string[]): boolean { export async function findFiles(config: ExtensionConfig, rootPath: string): Promise { const searches: PromiseLike[] = [ workspace.findFiles( - '{**/*.ts,**/*.tsx}', + `{${config.resolver.resolverModeFileGlobs.join(',')}}`, '{**/node_modules/**,**/typings/**}', ), ]; + // TODO: check the package json and index javascript file in node_modules (?) + let globs: string[] = []; let ignores = ['**/typings/**']; @@ -127,9 +130,8 @@ export class ImportResolveExtension extends BaseExtension { private logger: Logger; private statusBarItem: StatusBarItem = window.createStatusBarItem(StatusBarAlignment.Left, 4); private ignorePatterns: string[]; - private fileWatcher: FileSystemWatcher = workspace.createFileSystemWatcher( - '{**/*.ts,**/*.tsx,**/package.json,**/typings.json}', - ); + private fileWatcher: FileSystemWatcher; + private actualMode: ResolverMode; constructor( @inject(iocSymbols.extensionContext) context: ExtensionContext, @@ -149,21 +151,40 @@ export class ImportResolveExtension extends BaseExtension { * @memberof ImportResolveExtension */ public initialize(): void { + this.actualMode = this.config.resolver.resolverMode; + this.ignorePatterns = this.config.resolver.ignorePatterns; + + this.fileWatcher = workspace.createFileSystemWatcher( + `{${this.config.resolver.resolverModeFileGlobs.join(',')},**/package.json,**/typings.json}`, + ); + this.context.subscriptions.push(this.statusBarItem); this.context.subscriptions.push(this.fileWatcher); this.statusBarItem.text = resolverOk; - this.statusBarItem.tooltip = 'Click to manually reindex all files.'; + this.statusBarItem.tooltip = + `Click to manually reindex all files; Actual mode: ${ResolverMode[this.config.resolver.resolverMode]}`; this.statusBarItem.command = 'typescriptHero.resolve.rebuildCache'; this.statusBarItem.show(); this.commandRegistrations(); this.context.subscriptions.push(workspace.onDidChangeConfiguration(() => { + let build = false; if (!compareIgnorePatterns(this.ignorePatterns, this.config.resolver.ignorePatterns)) { this.logger.info('The typescriptHero.resolver.ignorePatterns setting was modified, reload the index.'); - this.buildIndex(); this.ignorePatterns = this.config.resolver.ignorePatterns; + build = true; + } + if (this.actualMode !== this.config.resolver.resolverMode) { + this.logger.info('The typescriptHero.resolver.resolverMode setting was modified, reload the index.'); + this.statusBarItem.tooltip = + `Click to manually reindex all files; Actual mode: ${ResolverMode[this.config.resolver.resolverMode]}`; + this.actualMode = this.config.resolver.resolverMode; + build = true; + } + if (build) { + this.buildIndex(); } })); diff --git a/test/_workspace/extension/extensions/importResolveExtension/addImportToDocument.js b/test/_workspace/extension/extensions/importResolveExtension/addImportToDocument.js new file mode 100644 index 0000000..e69de29 diff --git a/test/_workspace/extension/extensions/importResolveExtension/jsfile.js b/test/_workspace/extension/extensions/importResolveExtension/jsfile.js new file mode 100644 index 0000000..fbfae0d --- /dev/null +++ b/test/_workspace/extension/extensions/importResolveExtension/jsfile.js @@ -0,0 +1,9 @@ +export class JSFoobar { + constructor() { + this.blub = ''; + } + + getIt() { + return ''; + } +} diff --git a/test/_workspace/extension/extensions/importResolveExtension/jsxfile.jsx b/test/_workspace/extension/extensions/importResolveExtension/jsxfile.jsx new file mode 100644 index 0000000..3a9ebd3 --- /dev/null +++ b/test/_workspace/extension/extensions/importResolveExtension/jsxfile.jsx @@ -0,0 +1,15 @@ +export function JSXFunction() { + return ( +
+ +
+ ); +} + +export class JSXClass { + render() { + return ( + + ); + } +} diff --git a/test/extension/extensions/CodeCompletionExtension.test.ts b/test/extension/extensions/CodeCompletionExtension.test.ts index cff8905..6f939f2 100644 --- a/test/extension/extensions/CodeCompletionExtension.test.ts +++ b/test/extension/extensions/CodeCompletionExtension.test.ts @@ -3,6 +3,7 @@ import { join } from 'path'; import { DeclarationIndex, TypescriptParser } from 'typescript-parser'; import * as vscode from 'vscode'; +import { ExtensionConfig } from '../../../src/common/config'; import { LoggerFactory } from '../../../src/common/utilities'; import { CodeCompletionExtension } from '../../../src/extension/extensions/CodeCompletionExtension'; import { Container } from '../../../src/extension/IoC'; @@ -27,6 +28,7 @@ describe('CodeCompletionExtension', () => { await vscode.window.showTextDocument(document); const ctx = Container.get(iocSymbols.extensionContext); + const config = Container.get(iocSymbols.configuration); const logger = Container.get(iocSymbols.loggerFactory); const parser = Container.get(iocSymbols.typescriptParser); const index = Container.get(iocSymbols.declarationIndex); @@ -44,7 +46,7 @@ describe('CodeCompletionExtension', () => { ], ); - extension = new CodeCompletionExtension(ctx, logger, parser, index as any, rootPath); + extension = new CodeCompletionExtension(ctx, logger, parser, index as any, rootPath, config); }); it('shoud resolve to null if typing in a string', async () => { diff --git a/test/extension/extensions/ImportResolveExtension.test.ts b/test/extension/extensions/ImportResolveExtension.test.ts index 0bfd96b..d0622f9 100644 --- a/test/extension/extensions/ImportResolveExtension.test.ts +++ b/test/extension/extensions/ImportResolveExtension.test.ts @@ -13,7 +13,7 @@ chai.should(); const rootPath = Container.get(iocSymbols.rootPath); -describe('ImportResolveExtension', () => { +describe('TypeScript Mode: ImportResolveExtension', () => { let extension: any; @@ -186,3 +186,249 @@ describe('ImportResolveExtension', () => { }); }); + +describe('JavaScript Mode: ImportResolveExtension', () => { + + let extension: any; + + before(async () => { + const file = join( + rootPath, + 'extension/extensions/importResolveExtension/addImportToDocument.js', + ); + const document = await vscode.workspace.openTextDocument(file); + + await vscode.window.showTextDocument(document); + + const ctx = Container.get(iocSymbols.extensionContext); + const logger = Container.get(iocSymbols.loggerFactory); + const config = Container.get(iocSymbols.configuration); + const parser = Container.get(iocSymbols.typescriptParser); + + const index = Container.get(iocSymbols.declarationIndex); + await index.buildIndex( + [ + join( + rootPath, + 'typings/globals/body-parser/index.d.ts', + ), + join( + rootPath, + 'extension/extensions/importResolveExtension/jsfile.js', + ), + join( + rootPath, + 'extension/extensions/importResolveExtension/jsxfile.jsx', + ), + ], + ); + + extension = new ImportResolveExtension(ctx, logger, config, parser, index, rootPath); + }); + + describe('addImportToDocument', () => { + const file = join( + rootPath, + 'extension/extensions/importResolveExtension/addImportToDocument.js', + ); + let document: vscode.TextDocument; + + before(async () => { + document = await vscode.workspace.openTextDocument(file); + await vscode.window.showTextDocument(document); + }); + + afterEach(async () => { + await vscode.window.activeTextEditor!.edit((builder) => { + builder.delete(new vscode.Range( + new vscode.Position(0, 0), + document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, + )); + }); + }); + + it('shoud write a module / namespace import correctly', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'bodyParser', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import * as bodyParser from 'body-parser';\n`); + }); + + it('shoud write a named import correctly', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'JSFoobar', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import { JSFoobar } from './jsfile';\n`); + }); + + it('shoud update a named import correcty', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'JSX', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + await extension.addImportToDocument(items[1]); + document.getText().should.equal(`import { JSXClass, JSXFunction } from './jsxfile';\n`); + }); + + }); + +}); + +describe('Mixed Mode: ImportResolveExtension', () => { + + let extension: any; + + before(async () => { + const file = join( + rootPath, + 'extension/extensions/importResolveExtension/addImportToDocument.ts', + ); + const document = await vscode.workspace.openTextDocument(file); + + await vscode.window.showTextDocument(document); + + const ctx = Container.get(iocSymbols.extensionContext); + const logger = Container.get(iocSymbols.loggerFactory); + const config = Container.get(iocSymbols.configuration); + const parser = Container.get(iocSymbols.typescriptParser); + + const index = Container.get(iocSymbols.declarationIndex); + await index.buildIndex( + [ + join( + rootPath, + 'typings/globals/body-parser/index.d.ts', + ), + join( + rootPath, + 'extension/extensions/importResolveExtension/jsfile.js', + ), + join( + rootPath, + 'extension/extensions/importResolveExtension/jsxfile.jsx', + ), + join( + rootPath, + 'extension/extensions/importResolveExtension/sameDirectory.ts', + ), + ], + ); + + extension = new ImportResolveExtension(ctx, logger, config, parser, index, rootPath); + }); + + describe('addImportToDocument in .js file', () => { + const file = join( + rootPath, + 'extension/extensions/importResolveExtension/addImportToDocument.js', + ); + let document: vscode.TextDocument; + + before(async () => { + document = await vscode.workspace.openTextDocument(file); + await vscode.window.showTextDocument(document); + }); + + afterEach(async () => { + await vscode.window.activeTextEditor!.edit((builder) => { + builder.delete(new vscode.Range( + new vscode.Position(0, 0), + document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, + )); + }); + }); + + it('shoud write a module / namespace import correctly', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'bodyParser', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import * as bodyParser from 'body-parser';\n`); + }); + + it('shoud write a named import correctly (JS)', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'JSFoobar', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import { JSFoobar } from './jsfile';\n`); + }); + + it('shoud write a named import correctly (TS)', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'AddImportSameDirectory', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import { AddImportSameDirectory } from './sameDirectory';\n`); + }); + + }); + + describe('addImportToDocument in .ts file', () => { + const file = join( + rootPath, + 'extension/extensions/importResolveExtension/addImportToDocument.ts', + ); + let document: vscode.TextDocument; + + before(async () => { + document = await vscode.workspace.openTextDocument(file); + await vscode.window.showTextDocument(document); + }); + + afterEach(async () => { + await vscode.window.activeTextEditor!.edit((builder) => { + builder.delete(new vscode.Range( + new vscode.Position(0, 0), + document.lineAt(document.lineCount - 1).rangeIncludingLineBreak.end, + )); + }); + }); + + it('shoud write a module / namespace import correctly', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'bodyParser', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import * as bodyParser from 'body-parser';\n`); + }); + + it('shoud write a named import correctly (JS)', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'JSFoobar', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import { JSFoobar } from './jsfile';\n`); + }); + + it('shoud write a named import correctly (TS)', async () => { + const items = await extension.getDeclarationsForImport({ + cursorSymbol: 'AddImportSameDirectory', + documentSource: '', + docuemntPath: document.fileName, + }); + await extension.addImportToDocument(items[0]); + document.getText().should.equal(`import { AddImportSameDirectory } from './sameDirectory';\n`); + }); + + }); + +});