diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..8c8220a
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,4 @@
+out
+node_modules
+.vscode-test/
+.vsix
diff --git a/.vscode/launch.json b/.vscode/launch.json
new file mode 100644
index 0000000..b49d1a8
--- /dev/null
+++ b/.vscode/launch.json
@@ -0,0 +1,39 @@
+// A launch configuration that compiles the extension and then opens it inside a new window
+{
+ "version": "0.1.0",
+ "configurations": [
+ {
+ "name": "Extension",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": ["--extensionDevelopmentPath=${workspaceRoot}" ],
+ "stopOnEntry": false,
+ "sourceMaps": true,
+ "outFiles": [ "${workspaceRoot}/out/**/*.js" ],
+ "preLaunchTask": "npm: watch"
+ },
+ {
+ "name": "Extension Tests",
+ "type": "extensionHost",
+ "request": "launch",
+ "runtimeExecutable": "${execPath}",
+ "args": ["--extensionDevelopmentPath=${workspaceRoot}", "--extensionTestsPath=${workspaceRoot}/out/test" ],
+ "stopOnEntry": false,
+ "sourceMaps": true,
+ "outFiles": [ "${workspaceRoot}/out/test/**/*.js" ],
+ "preLaunchTask": "npm: watch"
+ },
+ {
+ "type": "node",
+ "request": "attach",
+ "name": "Attach to Langauge Server",
+ "protocol": "inspector",
+ "port": 6005,
+ "sourceMaps": true,
+ "outFiles": [
+ "${workspaceRoot}/out/**/*.js"
+ ]
+ }
+ ]
+}
diff --git a/.vscode/settings.json b/.vscode/settings.json
new file mode 100644
index 0000000..d137133
--- /dev/null
+++ b/.vscode/settings.json
@@ -0,0 +1,9 @@
+// Place your settings in this file to overwrite default and user settings.
+{
+ "files.exclude": {
+ "out": false // set this to true to hide the "out" folder with the compiled JS files
+ },
+ "search.exclude": {
+ "out": true // set this to false to include "out" folder in search results
+ }
+}
\ No newline at end of file
diff --git a/.vscode/tasks.json b/.vscode/tasks.json
new file mode 100644
index 0000000..604e38f
--- /dev/null
+++ b/.vscode/tasks.json
@@ -0,0 +1,20 @@
+// See https://go.microsoft.com/fwlink/?LinkId=733558
+// for the documentation about the tasks.json format
+{
+ "version": "2.0.0",
+ "tasks": [
+ {
+ "type": "npm",
+ "script": "watch",
+ "problemMatcher": "$tsc-watch",
+ "isBackground": true,
+ "presentation": {
+ "reveal": "never"
+ },
+ "group": {
+ "kind": "build",
+ "isDefault": true
+ }
+ }
+ ]
+}
\ No newline at end of file
diff --git a/.vscodeignore b/.vscodeignore
new file mode 100644
index 0000000..ea75c67
--- /dev/null
+++ b/.vscodeignore
@@ -0,0 +1,8 @@
+.vscode/**
+.vscode-test/**
+out/test/**
+out/**/*.map
+src/**
+.gitignore
+tsconfig.json
+vsc-extension-quickstart.md
diff --git a/CHANGELOG.md b/CHANGELOG.md
new file mode 100644
index 0000000..07c96a3
--- /dev/null
+++ b/CHANGELOG.md
@@ -0,0 +1,7 @@
+# Change Log
+All notable changes to the "vscode-postgres" extension will be documented in this file.
+
+Check [Keep a Changelog](http://keepachangelog.com/) for recommendations on how to structure this file.
+
+## [Unreleased]
+- Initial release
\ No newline at end of file
diff --git a/README.md b/README.md
new file mode 100644
index 0000000..47967a0
--- /dev/null
+++ b/README.md
@@ -0,0 +1,65 @@
+# vscode-postgres README
+
+This is the README for your extension "vscode-postgres". After writing up a brief description, we recommend including the following sections.
+
+## Features
+
+Describe specific features of your extension including screenshots of your extension in action. Image paths are relative to this README file.
+
+For example if there is an image subfolder under your extension project workspace:
+
+\!\[feature X\]\(images/feature-x.png\)
+
+> Tip: Many popular extensions utilize animations. This is an excellent way to show off your extension! We recommend short, focused animations that are easy to follow.
+
+## Requirements
+
+If you have any requirements or dependencies, add a section describing those and how to install and configure them.
+
+## Extension Settings
+
+Include if your extension adds any VS Code settings through the `contributes.configuration` extension point.
+
+For example:
+
+This extension contributes the following settings:
+
+* `myExtension.enable`: enable/disable this extension
+* `myExtension.thing`: set to `blah` to do something
+
+## Known Issues
+
+Calling out known issues can help limit users opening duplicate issues against your extension.
+
+## Release Notes
+
+Users appreciate release notes as you update your extension.
+
+### 1.0.0
+
+Initial release of ...
+
+### 1.0.1
+
+Fixed issue #.
+
+### 1.1.0
+
+Added features X, Y, and Z.
+
+-----------------------------------------------------------------------------------------------------------
+
+## Working with Markdown
+
+**Note:** You can author your README using Visual Studio Code. Here are some useful editor keyboard shortcuts:
+
+* Split the editor (`Cmd+\` on OSX or `Ctrl+\` on Windows and Linux)
+* Toggle preview (`Shift+CMD+V` on OSX or `Shift+Ctrl+V` on Windows and Linux)
+* Press `Ctrl+Space` (Windows, Linux) or `Cmd+Space` (OSX) to see a list of Markdown snippets
+
+### For more information
+
+* [Visual Studio Code's Markdown Support](http://code.visualstudio.com/docs/languages/markdown)
+* [Markdown Syntax Reference](https://help.github.com/articles/markdown-basics/)
+
+**Enjoy!**
\ No newline at end of file
diff --git a/language-configuration.json b/language-configuration.json
new file mode 100644
index 0000000..9b989de
--- /dev/null
+++ b/language-configuration.json
@@ -0,0 +1,25 @@
+{
+ "comments": {
+ "blockComment": [ "/*", "*/" ],
+ "lineComment": "--"
+ },
+ "brackets": [
+ [ "(", ")" ],
+ [ "[", "]" ],
+ [ "{", "}" ]
+ ],
+ "autoClosingPairs": [
+ [ "(", ")" ],
+ [ "[", "]" ],
+ [ "{", "}" ],
+ [ "\"", "\"" ],
+ [ "'", "'" ]
+ ],
+ "surroundingPairs": [
+ [ "(", ")" ],
+ [ "[", "]" ],
+ [ "{", "}" ],
+ [ "\"", "\"" ],
+ [ "'", "'" ]
+ ]
+}
\ No newline at end of file
diff --git a/package-lock.json b/package-lock.json
new file mode 100644
index 0000000..3c8eacb
--- /dev/null
+++ b/package-lock.json
@@ -0,0 +1,2895 @@
+{
+ "name": "vscode-postgres",
+ "version": "0.0.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "@types/events": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/@types/events/-/events-1.2.0.tgz",
+ "integrity": "sha512-KEIlhXnIutzKwRbQkGWb/I4HFqBuUykAdHgDED6xqwXJfONCjF5VoE0cXEiurh3XauygxzeDzgtXUqvLkxFzzA==",
+ "dev": true
+ },
+ "@types/keytar": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/@types/keytar/-/keytar-4.0.1.tgz",
+ "integrity": "sha512-loKBID6UL4QjhD2scuvv6oAPlQ/WAY7aYTDyKlKo7fIgriLS8EZExqT567cHL5CY6si51MRoX1+r3mitD3eYrA==",
+ "dev": true
+ },
+ "@types/mocha": {
+ "version": "2.2.48",
+ "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-2.2.48.tgz",
+ "integrity": "sha512-nlK/iyETgafGli8Zh9zJVCTicvU3iajSkRwOh3Hhiva598CMqNJ4NcVCGMTGKpGpTYj/9R8RLzS9NAykSSCqGw==",
+ "dev": true
+ },
+ "@types/node": {
+ "version": "7.0.61",
+ "resolved": "https://registry.npmjs.org/@types/node/-/node-7.0.61.tgz",
+ "integrity": "sha512-X4MNN+Z36OmVPv7n08wxq46/t61/rauW4+xeyxGPueDQ9t7SetHnuEPS0p9n6wU/15HvJLGjzfLTc/RwN7id3A==",
+ "dev": true
+ },
+ "@types/pg": {
+ "version": "7.4.8",
+ "resolved": "https://registry.npmjs.org/@types/pg/-/pg-7.4.8.tgz",
+ "integrity": "sha512-naSYLMOIBU+/BddUlQUyQuba9reG5yN0MR7g4EcN/AEt3zll48fGozX8s7xjaXuKmFOS1qqOrr/ZeF6SSOjKCw==",
+ "dev": true,
+ "requires": {
+ "@types/events": "1.2.0",
+ "@types/node": "7.0.61",
+ "@types/pg-types": "1.11.4"
+ }
+ },
+ "@types/pg-types": {
+ "version": "1.11.4",
+ "resolved": "https://registry.npmjs.org/@types/pg-types/-/pg-types-1.11.4.tgz",
+ "integrity": "sha512-WdIiQmE347LGc1Vq3Ki8sk3iyCuLgnccqVzgxek6gEHp2H0p3MQ3jniIHt+bRODXKju4kNQ+mp53lmP5+/9moQ==",
+ "dev": true,
+ "requires": {
+ "moment": "2.22.1"
+ }
+ },
+ "@types/uuid": {
+ "version": "3.4.3",
+ "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-3.4.3.tgz",
+ "integrity": "sha512-5fRLCYhLtDb3hMWqQyH10qtF+Ud2JnNCXTCZ+9ktNdCcgslcuXkDTkFcJNk++MT29yDntDnlF1+jD+uVGumsbw==",
+ "dev": true,
+ "requires": {
+ "@types/node": "7.0.61"
+ }
+ },
+ "ajv": {
+ "version": "5.5.2",
+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz",
+ "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=",
+ "dev": true,
+ "requires": {
+ "co": "4.6.0",
+ "fast-deep-equal": "1.1.0",
+ "fast-json-stable-stringify": "2.0.0",
+ "json-schema-traverse": "0.3.1"
+ }
+ },
+ "ansi-cyan": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz",
+ "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-gray": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz",
+ "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-red": {
+ "version": "0.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz",
+ "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=",
+ "dev": true,
+ "requires": {
+ "ansi-wrap": "0.1.0"
+ }
+ },
+ "ansi-regex": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
+ "dev": true
+ },
+ "ansi-styles": {
+ "version": "2.2.1",
+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
+ "dev": true
+ },
+ "ansi-wrap": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz",
+ "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=",
+ "dev": true
+ },
+ "arr-diff": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz",
+ "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0",
+ "array-slice": "0.2.3"
+ }
+ },
+ "arr-flatten": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
+ "dev": true
+ },
+ "arr-union": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz",
+ "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=",
+ "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-slice": {
+ "version": "0.2.3",
+ "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz",
+ "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=",
+ "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,
+ "requires": {
+ "array-uniq": "1.0.3"
+ }
+ },
+ "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=",
+ "dev": 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
+ },
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": 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
+ },
+ "aws4": {
+ "version": "1.7.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz",
+ "integrity": "sha512-32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==",
+ "dev": true
+ },
+ "balanced-match": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
+ "dev": true
+ },
+ "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"
+ }
+ },
+ "beeper": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz",
+ "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=",
+ "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,
+ "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.11",
+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
+ "dev": true,
+ "requires": {
+ "balanced-match": "1.0.0",
+ "concat-map": "0.0.1"
+ }
+ },
+ "braces": {
+ "version": "1.8.5",
+ "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz",
+ "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=",
+ "dev": true,
+ "requires": {
+ "expand-range": "1.8.2",
+ "preserve": "0.2.0",
+ "repeat-element": "1.1.2"
+ }
+ },
+ "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
+ },
+ "buffer-from": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
+ "integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
+ "dev": true
+ },
+ "buffer-writer": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/buffer-writer/-/buffer-writer-1.0.1.tgz",
+ "integrity": "sha1-Iqk2kB4wKa/NdUfrRIfOtpejvwg="
+ },
+ "caseless": {
+ "version": "0.11.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz",
+ "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=",
+ "dev": true
+ },
+ "chalk": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
+ "dev": true,
+ "requires": {
+ "ansi-styles": "2.2.1",
+ "escape-string-regexp": "1.0.5",
+ "has-ansi": "2.0.0",
+ "strip-ansi": "3.0.1",
+ "supports-color": "2.0.0"
+ }
+ },
+ "clone": {
+ "version": "0.2.0",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz",
+ "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=",
+ "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.1.2",
+ "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.1.2.tgz",
+ "integrity": "sha512-Bq6+4t+lbM8vhTs/Bef5c5AdEMtapp/iFb6+s4/Hh9MVTt8OLKH7ZOOZSCT+Ys7hsHvqv0GuMPJ1lnQJVHvxpg==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3",
+ "process-nextick-args": "2.0.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "color-support": {
+ "version": "1.1.3",
+ "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz",
+ "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "1.0.0"
+ }
+ },
+ "commander": {
+ "version": "2.15.1",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz",
+ "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==",
+ "dev": true
+ },
+ "concat-map": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
+ "dev": true
+ },
+ "convert-source-map": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz",
+ "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=",
+ "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,
+ "requires": {
+ "boom": "2.10.1"
+ }
+ },
+ "csv-stringify": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/csv-stringify/-/csv-stringify-3.0.0.tgz",
+ "integrity": "sha512-My0hdeq8dhDOa68KgsvJzCeK3306TpYffOB5evSG1HBaRf7RzpUgfUkYVsELbfFo9fUsAKtVGFdsdRGjkUuW1A==",
+ "requires": {
+ "lodash.get": "4.4.2"
+ }
+ },
+ "dashdash": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
+ "dev": 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
+ }
+ }
+ },
+ "dateformat": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz",
+ "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=",
+ "dev": true
+ },
+ "debug": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
+ "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "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,
+ "requires": {
+ "is-obj": "1.0.1"
+ }
+ },
+ "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
+ },
+ "diff": {
+ "version": "3.3.1",
+ "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz",
+ "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==",
+ "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,
+ "requires": {
+ "readable-stream": "1.1.14"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "1.1.14",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz",
+ "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "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
+ }
+ }
+ },
+ "duplexify": {
+ "version": "3.5.4",
+ "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.4.tgz",
+ "integrity": "sha512-JzYSLYMhoVVBe8+mbHQ4KgpvHpm0DZpJuL8PY93Vyv1fW7jYJ90LoXa1di/CVbJM+TgMs91rbDapE/RNIfnJsA==",
+ "dev": true,
+ "requires": {
+ "end-of-stream": "1.4.1",
+ "inherits": "2.0.3",
+ "readable-stream": "2.3.6",
+ "stream-shift": "1.0.0"
+ }
+ },
+ "easyxml": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/easyxml/-/easyxml-2.0.1.tgz",
+ "integrity": "sha1-7qCShCyREwCox4GRPL5b04pQcRw=",
+ "requires": {
+ "elementtree": "0.1.7",
+ "inflect": "0.3.0"
+ }
+ },
+ "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"
+ }
+ },
+ "elementtree": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/elementtree/-/elementtree-0.1.7.tgz",
+ "integrity": "sha1-mskb5uUvtuYkTE5UpKw+2K6OKcA=",
+ "requires": {
+ "sax": "1.1.4"
+ }
+ },
+ "end-of-stream": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz",
+ "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==",
+ "dev": true,
+ "requires": {
+ "once": "1.4.0"
+ }
+ },
+ "escape-string-regexp": {
+ "version": "1.0.5",
+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
+ "dev": true
+ },
+ "event-stream": {
+ "version": "3.3.4",
+ "resolved": "http://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz",
+ "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=",
+ "dev": true,
+ "requires": {
+ "duplexer": "0.1.1",
+ "from": "0.1.7",
+ "map-stream": "0.1.0",
+ "pause-stream": "0.0.11",
+ "split": "0.3.3",
+ "stream-combiner": "0.0.4",
+ "through": "2.3.8"
+ }
+ },
+ "expand-brackets": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz",
+ "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=",
+ "dev": true,
+ "requires": {
+ "is-posix-bracket": "0.1.1"
+ }
+ },
+ "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,
+ "requires": {
+ "fill-range": "2.2.3"
+ }
+ },
+ "extend": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz",
+ "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=",
+ "dev": true
+ },
+ "extend-shallow": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz",
+ "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=",
+ "dev": true,
+ "requires": {
+ "kind-of": "1.1.0"
+ }
+ },
+ "extglob": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz",
+ "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ },
+ "dependencies": {
+ "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
+ }
+ }
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "fancy-log": {
+ "version": "1.3.2",
+ "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz",
+ "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=",
+ "dev": true,
+ "requires": {
+ "ansi-gray": "0.1.1",
+ "color-support": "1.1.3",
+ "time-stamp": "1.1.0"
+ }
+ },
+ "fast-deep-equal": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.1.0.tgz",
+ "integrity": "sha1-wFNHeBfIa1HaqFPIHgWbcz0CNhQ=",
+ "dev": true
+ },
+ "fast-json-stable-stringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz",
+ "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "pend": "1.2.0"
+ }
+ },
+ "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
+ },
+ "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,
+ "requires": {
+ "is-number": "2.1.0",
+ "isobject": "2.1.0",
+ "randomatic": "1.1.7",
+ "repeat-element": "1.1.2",
+ "repeat-string": "1.6.1"
+ }
+ },
+ "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,
+ "requires": {
+ "for-in": "1.0.2"
+ }
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": 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,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "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
+ },
+ "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.2"
+ }
+ },
+ "generate-function": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz",
+ "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=",
+ "dev": true
+ },
+ "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=",
+ "dev": true,
+ "requires": {
+ "is-property": "1.0.2"
+ }
+ },
+ "getpass": {
+ "version": "0.1.7",
+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
+ "dev": 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
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "glob-base": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz",
+ "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=",
+ "dev": true,
+ "requires": {
+ "glob-parent": "2.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "glob-parent": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz",
+ "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=",
+ "dev": true,
+ "requires": {
+ "is-glob": "2.0.1"
+ }
+ },
+ "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-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "glob-parent": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
+ "dev": true,
+ "requires": {
+ "is-glob": "3.1.0",
+ "path-dirname": "1.0.2"
+ }
+ },
+ "glob-stream": {
+ "version": "5.3.5",
+ "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz",
+ "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=",
+ "dev": true,
+ "requires": {
+ "extend": "3.0.1",
+ "glob": "5.0.15",
+ "glob-parent": "3.1.0",
+ "micromatch": "2.3.11",
+ "ordered-read-streams": "0.3.0",
+ "through2": "0.6.5",
+ "to-absolute-glob": "0.1.1",
+ "unique-stream": "2.2.1"
+ },
+ "dependencies": {
+ "glob": {
+ "version": "5.0.15",
+ "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz",
+ "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=",
+ "dev": true,
+ "requires": {
+ "inflight": "1.0.6",
+ "inherits": "2.0.3",
+ "minimatch": "3.0.4",
+ "once": "1.4.0",
+ "path-is-absolute": "1.0.1"
+ }
+ },
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "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,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "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,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "glogg": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz",
+ "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==",
+ "dev": true,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "graceful-fs": {
+ "version": "4.1.11",
+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz",
+ "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=",
+ "dev": true
+ },
+ "growl": {
+ "version": "1.10.3",
+ "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz",
+ "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==",
+ "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,
+ "requires": {
+ "deep-assign": "1.0.0",
+ "stat-mode": "0.2.2",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-filter": {
+ "version": "5.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz",
+ "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=",
+ "dev": true,
+ "requires": {
+ "multimatch": "2.1.0",
+ "plugin-error": "0.1.2",
+ "streamfilter": "1.0.7"
+ }
+ },
+ "gulp-gunzip": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz",
+ "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=",
+ "dev": true,
+ "requires": {
+ "through2": "0.6.5",
+ "vinyl": "0.4.6"
+ },
+ "dependencies": {
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=",
+ "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,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "0.0.1",
+ "string_decoder": "0.10.31"
+ }
+ },
+ "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,
+ "requires": {
+ "readable-stream": "1.0.34",
+ "xtend": "4.0.1"
+ }
+ }
+ }
+ },
+ "gulp-remote-src": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz",
+ "integrity": "sha1-VyjP1kNDPdSEXd7wlp8PlxoqtKE=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.3.4",
+ "node.extend": "1.1.6",
+ "request": "2.79.0",
+ "through2": "2.0.3",
+ "vinyl": "2.0.2"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "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
+ },
+ "request": {
+ "version": "2.79.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz",
+ "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.6.0",
+ "aws4": "1.7.0",
+ "caseless": "0.11.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.1.4",
+ "har-validator": "2.0.6",
+ "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.18",
+ "oauth-sign": "0.8.2",
+ "qs": "6.3.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.4.3",
+ "uuid": "3.2.1"
+ }
+ },
+ "vinyl": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz",
+ "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "is-stream": "1.1.0",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ }
+ }
+ },
+ "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,
+ "requires": {
+ "convert-source-map": "1.5.1",
+ "graceful-fs": "4.1.11",
+ "strip-bom": "2.0.0",
+ "through2": "2.0.3",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "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
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "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,
+ "requires": {
+ "event-stream": "3.3.4",
+ "mkdirp": "0.5.1",
+ "queue": "3.1.0",
+ "vinyl-fs": "2.4.4"
+ }
+ },
+ "gulp-untar": {
+ "version": "0.0.6",
+ "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz",
+ "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.3.4",
+ "gulp-util": "3.0.8",
+ "streamifier": "0.1.1",
+ "tar": "2.2.1",
+ "through2": "2.0.3"
+ }
+ },
+ "gulp-util": {
+ "version": "3.0.8",
+ "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz",
+ "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-uniq": "1.0.3",
+ "beeper": "1.1.1",
+ "chalk": "1.1.3",
+ "dateformat": "2.2.0",
+ "fancy-log": "1.3.2",
+ "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.6.2",
+ "minimist": "1.2.0",
+ "multipipe": "0.1.2",
+ "object-assign": "3.0.0",
+ "replace-ext": "0.0.1",
+ "through2": "2.0.3",
+ "vinyl": "0.5.3"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "dev": true
+ },
+ "minimist": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz",
+ "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=",
+ "dev": true
+ },
+ "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
+ },
+ "replace-ext": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz",
+ "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=",
+ "dev": true
+ },
+ "vinyl": {
+ "version": "0.5.3",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz",
+ "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "gulp-vinyl-zip": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz",
+ "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=",
+ "dev": true,
+ "requires": {
+ "event-stream": "3.3.4",
+ "queue": "4.4.2",
+ "through2": "2.0.3",
+ "vinyl": "2.1.0",
+ "vinyl-fs": "2.4.4",
+ "yauzl": "2.9.1",
+ "yazl": "2.4.3"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz",
+ "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=",
+ "dev": true
+ },
+ "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
+ },
+ "queue": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz",
+ "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "vinyl": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz",
+ "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=",
+ "dev": true,
+ "requires": {
+ "clone": "2.1.1",
+ "clone-buffer": "1.0.0",
+ "clone-stats": "1.0.0",
+ "cloneable-readable": "1.1.2",
+ "remove-trailing-separator": "1.1.0",
+ "replace-ext": "1.0.0"
+ }
+ }
+ }
+ },
+ "gulplog": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz",
+ "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=",
+ "dev": true,
+ "requires": {
+ "glogg": "1.0.1"
+ }
+ },
+ "har-schema": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=",
+ "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=",
+ "dev": true,
+ "requires": {
+ "chalk": "1.1.3",
+ "commander": "2.15.1",
+ "is-my-json-valid": "2.17.2",
+ "pinkie-promise": "2.0.1"
+ }
+ },
+ "has-ansi": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
+ "dev": true,
+ "requires": {
+ "ansi-regex": "2.1.1"
+ }
+ },
+ "has-flag": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz",
+ "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=",
+ "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,
+ "requires": {
+ "sparkles": "1.0.0"
+ }
+ },
+ "hawk": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz",
+ "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=",
+ "dev": true,
+ "requires": {
+ "boom": "2.10.1",
+ "cryptiles": "2.0.5",
+ "hoek": "2.16.3",
+ "sntp": "1.0.9"
+ }
+ },
+ "he": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz",
+ "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "assert-plus": "0.2.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "inflect": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/inflect/-/inflect-0.3.0.tgz",
+ "integrity": "sha1-gdDqqja1CmAjC3UQBIs5xBQv5So="
+ },
+ "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
+ },
+ "is": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz",
+ "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=",
+ "dev": true
+ },
+ "is-buffer": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
+ "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,
+ "requires": {
+ "is-primitive": "2.0.0"
+ }
+ },
+ "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": "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,
+ "requires": {
+ "is-extglob": "2.1.1"
+ }
+ },
+ "is-my-ip-valid": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz",
+ "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==",
+ "dev": true
+ },
+ "is-my-json-valid": {
+ "version": "2.17.2",
+ "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz",
+ "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==",
+ "dev": true,
+ "requires": {
+ "generate-function": "2.0.0",
+ "generate-object-property": "1.2.0",
+ "is-my-ip-valid": "1.0.0",
+ "jsonpointer": "4.0.1",
+ "xtend": "4.0.1"
+ }
+ },
+ "is-number": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz",
+ "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "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-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=",
+ "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=",
+ "dev": true
+ },
+ "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": "1.0.0",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
+ "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,
+ "requires": {
+ "isarray": "1.0.0"
+ }
+ },
+ "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
+ },
+ "js-string-escape": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/js-string-escape/-/js-string-escape-1.0.1.tgz",
+ "integrity": "sha1-4mJbrbwNZ8dTPp7cEGjFh65BN+8="
+ },
+ "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
+ },
+ "json-schema-traverse": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz",
+ "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=",
+ "dev": 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,
+ "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
+ },
+ "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=",
+ "dev": true
+ },
+ "jsprim": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "extsprintf": "1.3.0",
+ "json-schema": "0.2.3",
+ "verror": "1.10.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
+ }
+ }
+ },
+ "kind-of": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz",
+ "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=",
+ "dev": true
+ },
+ "lazystream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz",
+ "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "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._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.escape": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz",
+ "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=",
+ "dev": true,
+ "requires": {
+ "lodash._root": "3.0.1"
+ }
+ },
+ "lodash.get": {
+ "version": "4.4.2",
+ "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz",
+ "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk="
+ },
+ "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,
+ "requires": {
+ "lodash._getnative": "3.9.1",
+ "lodash.isarguments": "3.1.0",
+ "lodash.isarray": "3.0.4"
+ }
+ },
+ "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,
+ "requires": {
+ "lodash._basecopy": "3.0.1",
+ "lodash._basetostring": "3.0.1",
+ "lodash._basevalues": "3.0.0",
+ "lodash._isiterateecall": "3.0.9",
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0",
+ "lodash.keys": "3.1.2",
+ "lodash.restparam": "3.6.1",
+ "lodash.templatesettings": "3.1.1"
+ }
+ },
+ "lodash.templatesettings": {
+ "version": "3.1.1",
+ "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz",
+ "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=",
+ "dev": true,
+ "requires": {
+ "lodash._reinterpolate": "3.0.0",
+ "lodash.escape": "3.2.0"
+ }
+ },
+ "map-stream": {
+ "version": "0.1.0",
+ "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz",
+ "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=",
+ "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,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "micromatch": {
+ "version": "2.3.11",
+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz",
+ "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=",
+ "dev": true,
+ "requires": {
+ "arr-diff": "2.0.0",
+ "array-unique": "0.2.1",
+ "braces": "1.8.5",
+ "expand-brackets": "0.1.5",
+ "extglob": "0.3.2",
+ "filename-regex": "2.0.1",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1",
+ "kind-of": "3.2.2",
+ "normalize-path": "2.1.1",
+ "object.omit": "2.0.1",
+ "parse-glob": "3.0.4",
+ "regex-cache": "0.4.4"
+ },
+ "dependencies": {
+ "arr-diff": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz",
+ "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=",
+ "dev": true,
+ "requires": {
+ "arr-flatten": "1.1.0"
+ }
+ },
+ "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-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ },
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "mime-db": {
+ "version": "1.33.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz",
+ "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.18",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz",
+ "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==",
+ "dev": true,
+ "requires": {
+ "mime-db": "1.33.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.11"
+ }
+ },
+ "minimist": {
+ "version": "0.0.8",
+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz",
+ "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=",
+ "dev": true
+ },
+ "mkdirp": {
+ "version": "0.5.1",
+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz",
+ "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=",
+ "dev": true,
+ "requires": {
+ "minimist": "0.0.8"
+ }
+ },
+ "mocha": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz",
+ "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==",
+ "dev": true,
+ "requires": {
+ "browser-stdout": "1.3.0",
+ "commander": "2.11.0",
+ "debug": "3.1.0",
+ "diff": "3.3.1",
+ "escape-string-regexp": "1.0.5",
+ "glob": "7.1.2",
+ "growl": "1.10.3",
+ "he": "1.1.1",
+ "mkdirp": "0.5.1",
+ "supports-color": "4.4.0"
+ },
+ "dependencies": {
+ "commander": {
+ "version": "2.11.0",
+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz",
+ "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==",
+ "dev": true
+ },
+ "supports-color": {
+ "version": "4.4.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz",
+ "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==",
+ "dev": true,
+ "requires": {
+ "has-flag": "2.0.0"
+ }
+ }
+ }
+ },
+ "moment": {
+ "version": "2.22.1",
+ "resolved": "https://registry.npmjs.org/moment/-/moment-2.22.1.tgz",
+ "integrity": "sha512-shJkRTSebXvsVqk56I+lkb2latjBs8I+pc2TzWc545y2iFnSjm7Wg0QMh+ZWcdSLQyGEau5jI8ocnmkyTgr9YQ==",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "multimatch": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz",
+ "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=",
+ "dev": true,
+ "requires": {
+ "array-differ": "1.0.0",
+ "array-union": "1.0.2",
+ "arrify": "1.0.1",
+ "minimatch": "3.0.4"
+ }
+ },
+ "multipipe": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz",
+ "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=",
+ "dev": true,
+ "requires": {
+ "duplexer2": "0.0.2"
+ }
+ },
+ "node.extend": {
+ "version": "1.1.6",
+ "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz",
+ "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=",
+ "dev": true,
+ "requires": {
+ "is": "3.2.1"
+ }
+ },
+ "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,
+ "requires": {
+ "remove-trailing-separator": "1.1.0"
+ }
+ },
+ "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
+ },
+ "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,
+ "requires": {
+ "for-own": "0.1.5",
+ "is-extendable": "0.1.1"
+ }
+ },
+ "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"
+ }
+ },
+ "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,
+ "requires": {
+ "is-stream": "1.1.0",
+ "readable-stream": "2.3.6"
+ }
+ },
+ "packet-reader": {
+ "version": "0.3.1",
+ "resolved": "https://registry.npmjs.org/packet-reader/-/packet-reader-0.3.1.tgz",
+ "integrity": "sha1-zWLmCvjX/qinBexP+ZCHHEaHHyc="
+ },
+ "parse-glob": {
+ "version": "3.0.4",
+ "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz",
+ "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=",
+ "dev": true,
+ "requires": {
+ "glob-base": "0.3.0",
+ "is-dotfile": "1.0.3",
+ "is-extglob": "1.0.0",
+ "is-glob": "2.0.1"
+ },
+ "dependencies": {
+ "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-glob": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz",
+ "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=",
+ "dev": true,
+ "requires": {
+ "is-extglob": "1.0.0"
+ }
+ }
+ }
+ },
+ "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-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
+ },
+ "pause-stream": {
+ "version": "0.0.11",
+ "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz",
+ "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "pend": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz",
+ "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=",
+ "dev": true
+ },
+ "performance-now": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=",
+ "dev": true
+ },
+ "pg": {
+ "version": "7.4.1",
+ "resolved": "https://registry.npmjs.org/pg/-/pg-7.4.1.tgz",
+ "integrity": "sha512-Pi5qYuXro5PAD9xXx8h7bFtmHgAQEG6/SCNyi7gS3rvb/ZQYDmxKchfB0zYtiSJNWq9iXTsYsHjrM+21eBcN1A==",
+ "requires": {
+ "buffer-writer": "1.0.1",
+ "js-string-escape": "1.0.1",
+ "packet-reader": "0.3.1",
+ "pg-connection-string": "0.1.3",
+ "pg-pool": "2.0.3",
+ "pg-types": "1.12.1",
+ "pgpass": "1.0.2",
+ "semver": "4.3.2"
+ },
+ "dependencies": {
+ "semver": {
+ "version": "4.3.2",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.2.tgz",
+ "integrity": "sha1-x6BxWKgL7dBSNVt3DYLWZA+AO+c="
+ }
+ }
+ },
+ "pg-connection-string": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-0.1.3.tgz",
+ "integrity": "sha1-2hhHsglA5C7hSSvq9l1J2RskXfc="
+ },
+ "pg-pool": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-2.0.3.tgz",
+ "integrity": "sha1-wCIDLIlJ8xKk+R+2QJzgQHa+Mlc="
+ },
+ "pg-types": {
+ "version": "1.12.1",
+ "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-1.12.1.tgz",
+ "integrity": "sha1-1kCH45A7WP+q0nnnWVxSIIoUw9I=",
+ "requires": {
+ "postgres-array": "1.0.2",
+ "postgres-bytea": "1.0.0",
+ "postgres-date": "1.0.3",
+ "postgres-interval": "1.1.1"
+ }
+ },
+ "pgpass": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.2.tgz",
+ "integrity": "sha1-Knu0G2BltnkH6R2hsHwYR8h3swY=",
+ "requires": {
+ "split": "1.0.1"
+ },
+ "dependencies": {
+ "split": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz",
+ "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==",
+ "requires": {
+ "through": "2.3.8"
+ }
+ }
+ }
+ },
+ "pinkie": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz",
+ "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=",
+ "dev": true
+ },
+ "pinkie-promise": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz",
+ "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=",
+ "dev": true,
+ "requires": {
+ "pinkie": "2.0.4"
+ }
+ },
+ "plugin-error": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz",
+ "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=",
+ "dev": true,
+ "requires": {
+ "ansi-cyan": "0.1.1",
+ "ansi-red": "0.1.1",
+ "arr-diff": "1.1.0",
+ "arr-union": "2.1.0",
+ "extend-shallow": "1.1.4"
+ }
+ },
+ "postgres-array": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-1.0.2.tgz",
+ "integrity": "sha1-jgsy6wO/d6XAp4UeBEHBaaJWojg="
+ },
+ "postgres-bytea": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz",
+ "integrity": "sha1-AntTPAqokOJtFy1Hz5zOzFIazTU="
+ },
+ "postgres-date": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.3.tgz",
+ "integrity": "sha1-4tiXAu/bJY/52c7g/pG9BpdSV6g="
+ },
+ "postgres-interval": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.1.1.tgz",
+ "integrity": "sha512-OkuCi9t/3CZmeQreutGgx/OVNv9MKHGIT5jH8KldQ4NLYXkvmT9nDVxEuCENlNwhlGPE374oA/xMqn05G49pHA==",
+ "requires": {
+ "xtend": "4.0.1"
+ }
+ },
+ "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": "2.0.0",
+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz",
+ "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==",
+ "dev": true
+ },
+ "punycode": {
+ "version": "1.4.1",
+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.3.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz",
+ "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=",
+ "dev": true
+ },
+ "querystringify": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.0.0.tgz",
+ "integrity": "sha512-eTPo5t/4bgaMNZxyjWx6N2a6AuE0mq51KWvpc7nU/MAqixcI6v6KrGUKES0HaomdnolQBBXU/++X6/QQ9KL4tw==",
+ "dev": true
+ },
+ "queue": {
+ "version": "3.1.0",
+ "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz",
+ "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.3"
+ }
+ },
+ "randomatic": {
+ "version": "1.1.7",
+ "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz",
+ "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==",
+ "dev": true,
+ "requires": {
+ "is-number": "3.0.0",
+ "kind-of": "4.0.0"
+ },
+ "dependencies": {
+ "is-number": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
+ "dev": true,
+ "requires": {
+ "kind-of": "3.2.2"
+ },
+ "dependencies": {
+ "kind-of": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "kind-of": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
+ "dev": true,
+ "requires": {
+ "is-buffer": "1.1.6"
+ }
+ }
+ }
+ },
+ "readable-stream": {
+ "version": "2.3.6",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz",
+ "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==",
+ "dev": true,
+ "requires": {
+ "core-util-is": "1.0.2",
+ "inherits": "2.0.3",
+ "isarray": "1.0.0",
+ "process-nextick-args": "2.0.0",
+ "safe-buffer": "5.1.2",
+ "string_decoder": "1.1.1",
+ "util-deprecate": "1.0.2"
+ }
+ },
+ "regex-cache": {
+ "version": "0.4.4",
+ "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz",
+ "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==",
+ "dev": true,
+ "requires": {
+ "is-equal-shallow": "0.1.3"
+ }
+ },
+ "remove-trailing-separator": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
+ "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
+ },
+ "replace-ext": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz",
+ "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=",
+ "dev": true
+ },
+ "request": {
+ "version": "2.85.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.85.0.tgz",
+ "integrity": "sha512-8H7Ehijd4js+s6wuVPLjwORxD4zeuyjYugprdOXlPSqaApmL/QOy+EB/beICHVCHkGMKNh5rvihb5ov+IDw4mg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "0.7.0",
+ "aws4": "1.7.0",
+ "caseless": "0.12.0",
+ "combined-stream": "1.0.6",
+ "extend": "3.0.1",
+ "forever-agent": "0.6.1",
+ "form-data": "2.3.2",
+ "har-validator": "5.0.3",
+ "hawk": "6.0.2",
+ "http-signature": "1.2.0",
+ "is-typedarray": "1.0.0",
+ "isstream": "0.1.2",
+ "json-stringify-safe": "5.0.1",
+ "mime-types": "2.1.18",
+ "oauth-sign": "0.8.2",
+ "performance-now": "2.1.0",
+ "qs": "6.5.1",
+ "safe-buffer": "5.1.2",
+ "stringstream": "0.0.5",
+ "tough-cookie": "2.3.4",
+ "tunnel-agent": "0.6.0",
+ "uuid": "3.2.1"
+ },
+ "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
+ },
+ "aws-sign2": {
+ "version": "0.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "boom": {
+ "version": "4.3.1",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz",
+ "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "cryptiles": {
+ "version": "3.1.2",
+ "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz",
+ "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=",
+ "dev": true,
+ "requires": {
+ "boom": "5.2.0"
+ },
+ "dependencies": {
+ "boom": {
+ "version": "5.2.0",
+ "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz",
+ "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.1"
+ }
+ }
+ }
+ },
+ "form-data": {
+ "version": "2.3.2",
+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz",
+ "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=",
+ "dev": true,
+ "requires": {
+ "asynckit": "0.4.0",
+ "combined-stream": "1.0.6",
+ "mime-types": "2.1.18"
+ }
+ },
+ "har-validator": {
+ "version": "5.0.3",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz",
+ "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=",
+ "dev": true,
+ "requires": {
+ "ajv": "5.5.2",
+ "har-schema": "2.0.0"
+ }
+ },
+ "hawk": {
+ "version": "6.0.2",
+ "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz",
+ "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==",
+ "dev": true,
+ "requires": {
+ "boom": "4.3.1",
+ "cryptiles": "3.1.2",
+ "hoek": "4.2.1",
+ "sntp": "2.1.0"
+ }
+ },
+ "hoek": {
+ "version": "4.2.1",
+ "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz",
+ "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==",
+ "dev": true
+ },
+ "http-signature": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "jsprim": "1.4.1",
+ "sshpk": "1.14.1"
+ }
+ },
+ "qs": {
+ "version": "6.5.1",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz",
+ "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==",
+ "dev": true
+ },
+ "sntp": {
+ "version": "2.1.0",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz",
+ "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==",
+ "dev": true,
+ "requires": {
+ "hoek": "4.2.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,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ }
+ }
+ },
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=",
+ "dev": true
+ },
+ "rimraf": {
+ "version": "2.6.2",
+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz",
+ "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2"
+ }
+ },
+ "safe-buffer": {
+ "version": "5.1.2",
+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==",
+ "dev": true
+ },
+ "sax": {
+ "version": "1.1.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.1.4.tgz",
+ "integrity": "sha1-dLbTPJrh4AFRDxeakRaFiPGu2qk="
+ },
+ "semver": {
+ "version": "5.5.0",
+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
+ "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==",
+ "dev": true
+ },
+ "sntp": {
+ "version": "1.0.9",
+ "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz",
+ "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=",
+ "dev": true,
+ "requires": {
+ "hoek": "2.16.3"
+ }
+ },
+ "source-map": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
+ "dev": true
+ },
+ "source-map-support": {
+ "version": "0.5.5",
+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.5.tgz",
+ "integrity": "sha512-mR7/Nd5l1z6g99010shcXJiNEaf3fEtmLhRB/sBcQVJGodcHCULPp2y4Sfa43Kv2zq7T+Izmfp/WHCR6dYkQCA==",
+ "dev": true,
+ "requires": {
+ "buffer-from": "1.0.0",
+ "source-map": "0.6.1"
+ }
+ },
+ "sparkles": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz",
+ "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=",
+ "dev": true
+ },
+ "split": {
+ "version": "0.3.3",
+ "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz",
+ "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=",
+ "dev": true,
+ "requires": {
+ "through": "2.3.8"
+ }
+ },
+ "sshpk": {
+ "version": "1.14.1",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.1.tgz",
+ "integrity": "sha1-Ew9Zde3a2WPx1W+SuaxsUfqfg+s=",
+ "dev": 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",
+ "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
+ }
+ }
+ },
+ "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,
+ "requires": {
+ "duplexer": "0.1.1"
+ }
+ },
+ "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.7",
+ "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz",
+ "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6"
+ }
+ },
+ "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.1.1",
+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "5.1.2"
+ }
+ },
+ "stringstream": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz",
+ "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=",
+ "dev": 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-bom": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz",
+ "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=",
+ "dev": true,
+ "requires": {
+ "is-utf8": "0.2.1"
+ }
+ },
+ "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,
+ "requires": {
+ "first-chunk-stream": "1.0.0",
+ "strip-bom": "2.0.0"
+ }
+ },
+ "supports-color": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
+ "dev": 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"
+ }
+ },
+ "through": {
+ "version": "2.3.8",
+ "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz",
+ "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU="
+ },
+ "through2": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz",
+ "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=",
+ "dev": true,
+ "requires": {
+ "readable-stream": "2.3.6",
+ "xtend": "4.0.1"
+ }
+ },
+ "through2-filter": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz",
+ "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "xtend": "4.0.1"
+ }
+ },
+ "time-stamp": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz",
+ "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=",
+ "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,
+ "requires": {
+ "extend-shallow": "2.0.1"
+ },
+ "dependencies": {
+ "extend-shallow": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
+ "dev": true,
+ "requires": {
+ "is-extendable": "0.1.1"
+ }
+ }
+ }
+ },
+ "tough-cookie": {
+ "version": "2.3.4",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz",
+ "integrity": "sha512-TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==",
+ "dev": true,
+ "requires": {
+ "punycode": "1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.4.3",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz",
+ "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=",
+ "dev": true
+ },
+ "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
+ },
+ "typescript": {
+ "version": "2.8.3",
+ "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.8.3.tgz",
+ "integrity": "sha512-K7g15Bb6Ra4lKf7Iq2l/I5/En+hLIHmxWZGq3D4DIRNFxMNV6j2SHSvDOqs2tGd4UvD/fJvrwopzQXjLrT7Itw==",
+ "dev": true
+ },
+ "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,
+ "requires": {
+ "json-stable-stringify": "1.0.1",
+ "through2-filter": "2.0.0"
+ }
+ },
+ "url-parse": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.4.0.tgz",
+ "integrity": "sha512-ERuGxDiQ6Xw/agN4tuoCRbmwRuZP0cJ1lJxJubXr5Q/5cDa78+Dc4wfvtxzhzhkm5VvmW6Mf8EVj9SPGN4l8Lg==",
+ "dev": true,
+ "requires": {
+ "querystringify": "2.0.0",
+ "requires-port": "1.0.0"
+ }
+ },
+ "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.2.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz",
+ "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA=="
+ },
+ "vali-date": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz",
+ "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=",
+ "dev": true
+ },
+ "verror": {
+ "version": "1.10.0",
+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
+ "dev": true,
+ "requires": {
+ "assert-plus": "1.0.0",
+ "core-util-is": "1.0.2",
+ "extsprintf": "1.3.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
+ }
+ }
+ },
+ "vinyl": {
+ "version": "0.4.6",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz",
+ "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=",
+ "dev": true,
+ "requires": {
+ "clone": "0.2.0",
+ "clone-stats": "0.0.1"
+ }
+ },
+ "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,
+ "requires": {
+ "duplexify": "3.5.4",
+ "glob-stream": "5.3.5",
+ "graceful-fs": "4.1.11",
+ "gulp-sourcemaps": "1.6.0",
+ "is-valid-glob": "0.3.0",
+ "lazystream": "1.0.0",
+ "lodash.isequal": "4.5.0",
+ "merge-stream": "1.0.1",
+ "mkdirp": "0.5.1",
+ "object-assign": "4.1.1",
+ "readable-stream": "2.3.6",
+ "strip-bom": "2.0.0",
+ "strip-bom-stream": "1.0.0",
+ "through2": "2.0.3",
+ "through2-filter": "2.0.0",
+ "vali-date": "1.0.0",
+ "vinyl": "1.2.0"
+ },
+ "dependencies": {
+ "clone": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
+ "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
+ },
+ "vinyl": {
+ "version": "1.2.0",
+ "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz",
+ "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=",
+ "dev": true,
+ "requires": {
+ "clone": "1.0.4",
+ "clone-stats": "0.0.1",
+ "replace-ext": "0.0.1"
+ }
+ }
+ }
+ },
+ "vinyl-source-stream": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz",
+ "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=",
+ "dev": true,
+ "requires": {
+ "through2": "2.0.3",
+ "vinyl": "0.4.6"
+ }
+ },
+ "vscode": {
+ "version": "1.1.16",
+ "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.16.tgz",
+ "integrity": "sha512-nNsfYANLqqNfa2+flHyrIrqSIumIoV7R+R9H3gn0SAzZL3RGPEy8db3EYjXKPW5NEfssj/HZhSMI3J3pMNmhPA==",
+ "dev": true,
+ "requires": {
+ "glob": "7.1.2",
+ "gulp-chmod": "2.0.0",
+ "gulp-filter": "5.1.0",
+ "gulp-gunzip": "1.0.0",
+ "gulp-remote-src": "0.4.3",
+ "gulp-symdest": "1.1.0",
+ "gulp-untar": "0.0.6",
+ "gulp-vinyl-zip": "2.1.0",
+ "mocha": "4.1.0",
+ "request": "2.85.0",
+ "semver": "5.5.0",
+ "source-map-support": "0.5.5",
+ "url-parse": "1.4.0",
+ "vinyl-source-stream": "1.1.2"
+ }
+ },
+ "vscode-jsonrpc": {
+ "version": "3.6.1",
+ "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-3.6.1.tgz",
+ "integrity": "sha512-+Eb+Dxf2kC2h079msx61hkblxAKE0S2j78+8QpnigLAO2aIIjkCwTIH34etBrU8E8VItRinec7YEwULx9at5bQ=="
+ },
+ "vscode-languageclient": {
+ "version": "4.1.3",
+ "resolved": "https://registry.npmjs.org/vscode-languageclient/-/vscode-languageclient-4.1.3.tgz",
+ "integrity": "sha512-3tu79B56apocobPGkHm7YWobjhNKCU7H4cUk+rkVFCNoOSAm2wZlN2J6HdC15/ONALY4ai25BeyQ+aQaFmM1Jg==",
+ "requires": {
+ "vscode-languageserver-protocol": "3.7.1"
+ }
+ },
+ "vscode-languageserver": {
+ "version": "4.1.2",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver/-/vscode-languageserver-4.1.2.tgz",
+ "integrity": "sha512-3iej2tuMaI9yirPXF7/fVyIvBhSzbwZ3EWFRb8bP6lc3tGv9SJHDaJLNyQMgo9J8CNpXil6dWarpJvGSA60v/w==",
+ "requires": {
+ "vscode-languageserver-protocol": "3.7.1",
+ "vscode-uri": "1.0.3"
+ }
+ },
+ "vscode-languageserver-protocol": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.7.1.tgz",
+ "integrity": "sha512-AKX9XQ49m/lpiDLZJBypFNc5eAXNlSecunYU5m4o5WIwGgW86TWnXVdziuFm47W2SdigDa/jVbxLPSNUeut9fQ==",
+ "requires": {
+ "vscode-jsonrpc": "3.6.1",
+ "vscode-languageserver-types": "3.7.1"
+ }
+ },
+ "vscode-languageserver-types": {
+ "version": "3.7.1",
+ "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.7.1.tgz",
+ "integrity": "sha512-ftGfU79AnnI3OHCG7kzCCN47jNI7BjECPAH2yhddtYTiQk0bnFbuFeQKvpXQcyNI3GsKEx5b6kSiBYshTiep6w=="
+ },
+ "vscode-uri": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-1.0.3.tgz",
+ "integrity": "sha1-Yxvb9xbcyrDmUpGo3CXCMjIIWlI="
+ },
+ "wrappy": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
+ "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
+ "dev": true
+ },
+ "xtend": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz",
+ "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68="
+ },
+ "yauzl": {
+ "version": "2.9.1",
+ "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz",
+ "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13",
+ "fd-slicer": "1.0.1"
+ }
+ },
+ "yazl": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz",
+ "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=",
+ "dev": true,
+ "requires": {
+ "buffer-crc32": "0.2.13"
+ }
+ }
+ }
+}
diff --git a/package.json b/package.json
new file mode 100644
index 0000000..35248ce
--- /dev/null
+++ b/package.json
@@ -0,0 +1,190 @@
+{
+ "name": "vscode-postgres",
+ "displayName": "PostgreSQL",
+ "description": "PostgreSQL Management Tool",
+ "version": "0.0.1",
+ "publisher": "ckolkman",
+ "engines": {
+ "vscode": "^1.22.0"
+ },
+ "categories": [
+ "Other"
+ ],
+ "activationEvents": [
+ "onCommand:vscode-postgres.addConnection",
+ "onLanguage:postgres",
+ "onView:postgres"
+ ],
+ "main": "./out/extension",
+ "contributes": {
+ "languages": [
+ {
+ "id": "postgres",
+ "extensions": [
+ ".pgsql",
+ ".psql"
+ ],
+ "aliases": [
+ "Postgres"
+ ],
+ "configuration": "./language-configuration.json"
+ }
+ ],
+ "configuration": {
+ "type": "object",
+ "title": "PostgreSQL",
+ "properties": {
+ "vscode-postgres.showExplorer": {
+ "type": "boolean",
+ "default": true,
+ "description": "Show or hide the database explorer."
+ },
+ "vscode-postgres.prettyPrintJSONfields": {
+ "type": "boolean",
+ "default": false,
+ "description": "Turns on/off pretty printing of JSON fields"
+ }
+ }
+ },
+ "commands": [
+ {
+ "command": "vscode-postgres.addConnection",
+ "title": "Add Connection",
+ "icon": {
+ "light": "resources/light/add.svg",
+ "dark": "resources/dark/add.svg"
+ },
+ "category": "PostgreSQL"
+ },
+ {
+ "command": "vscode-postgres.deleteConnection",
+ "title": "Delete Connection",
+ "category": "PostgreSQL"
+ },
+ {
+ "command": "vscode-postgres.newQuery",
+ "title": "New Query",
+ "category": "PostgreSQL"
+ },
+ {
+ "command": "vscode-postgres.refresh",
+ "title": "Refresh Items",
+ "category": "PostgreSQL"
+ },
+ {
+ "command": "vscode-postgres.selectTop",
+ "title": "Select Top...",
+ "category": "PostgreSQL"
+ },
+ {
+ "command": "vscode-postgres.selectTop1000",
+ "title": "Select Top 1000",
+ "category": "PostgreSQL"
+ }
+ ],
+ "menus": {
+ "view/title": [
+ {
+ "command": "vscode-postgres.addConnection",
+ "when": "view == postgres",
+ "group": "navigation@1"
+ }
+ ],
+ "commandPalette": [
+ {
+ "command": "vscode-postgres.selectTop",
+ "when": "config.vscode-postgres.never"
+ },
+ {
+ "command": "vscode-postgres.selectTop1000",
+ "when": "config.vscode-postgres.never"
+ }
+ ],
+ "view/item/context": [
+ {
+ "command": "vscode-postgres.deleteConnection",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.connection",
+ "group": "postgres@2"
+ },
+ {
+ "command": "vscode-postgres.refresh",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.connection",
+ "group": "postgres@1"
+ },
+ {
+ "command": "vscode-postgres.refresh",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.database",
+ "group": "postgres@1"
+ },
+ {
+ "command": "vscode-postgres.refresh",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.table",
+ "group": "postgres@1"
+ },
+ {
+ "command": "vscode-postgres.newQuery",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.connection",
+ "group": "postgres@1"
+ },
+ {
+ "command": "vscode-postgres.newQuery",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.database",
+ "group": "postgres@1"
+ },
+ {
+ "command": "vscode-postgres.newQuery",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.table",
+ "group": "postgres@1"
+ },
+ {
+ "command": "vscode-postgres.newQuery",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.column",
+ "group": "postgres@1"
+ },
+ {
+ "command": "vscode-postgres.selectTop",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.table",
+ "group": "postgres@2"
+ },
+ {
+ "command": "vscode-postgres.selectTop1000",
+ "when": "view == postgres && viewItem == vscode-postgres.tree.table",
+ "group": "postgres@2"
+ }
+ ]
+ },
+ "views": {
+ "explorer": [
+ {
+ "id": "postgres",
+ "name": "PostgreSQL",
+ "when": "config.vscode-postgres.showExplorer == true"
+ }
+ ]
+ }
+ },
+ "scripts": {
+ "vscode:prepublish": "npm run compile",
+ "compile": "tsc -p ./",
+ "watch": "tsc -watch -p ./",
+ "postinstall": "node ./node_modules/vscode/bin/install",
+ "test": "npm run compile && node ./node_modules/vscode/bin/test"
+ },
+ "devDependencies": {
+ "@types/keytar": "^4.0.1",
+ "@types/mocha": "^2.2.42",
+ "@types/node": "^7.0.43",
+ "@types/pg": "^7.4.8",
+ "@types/uuid": "^3.4.3",
+ "typescript": "^2.6.1",
+ "vscode": "^1.1.6"
+ },
+ "dependencies": {
+ "csv-stringify": "^3.0.0",
+ "easyxml": "^2.0.1",
+ "pg": "^7.4.1",
+ "uuid": "^3.2.1",
+ "vscode-languageclient": "^4.1.3",
+ "vscode-languageserver": "^4.1.2"
+ }
+}
diff --git a/resources/dark/add.svg b/resources/dark/add.svg
new file mode 100644
index 0000000..3475c1e
--- /dev/null
+++ b/resources/dark/add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/dark/column.svg b/resources/dark/column.svg
new file mode 100644
index 0000000..cab8d92
--- /dev/null
+++ b/resources/dark/column.svg
@@ -0,0 +1,53 @@
+
+
\ No newline at end of file
diff --git a/resources/dark/database.svg b/resources/dark/database.svg
new file mode 100644
index 0000000..aec1f99
--- /dev/null
+++ b/resources/dark/database.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/resources/dark/p-key.svg b/resources/dark/p-key.svg
new file mode 100644
index 0000000..0f475a9
--- /dev/null
+++ b/resources/dark/p-key.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/resources/dark/save.svg b/resources/dark/save.svg
new file mode 100644
index 0000000..2a63abd
--- /dev/null
+++ b/resources/dark/save.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/resources/dark/server.svg b/resources/dark/server.svg
new file mode 100644
index 0000000..420ad2a
--- /dev/null
+++ b/resources/dark/server.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/resources/dark/table.svg b/resources/dark/table.svg
new file mode 100644
index 0000000..b06efd8
--- /dev/null
+++ b/resources/dark/table.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/resources/light/add.svg b/resources/light/add.svg
new file mode 100644
index 0000000..bdecdb0
--- /dev/null
+++ b/resources/light/add.svg
@@ -0,0 +1 @@
+
\ No newline at end of file
diff --git a/resources/light/column.svg b/resources/light/column.svg
new file mode 100644
index 0000000..5a97b1d
--- /dev/null
+++ b/resources/light/column.svg
@@ -0,0 +1,53 @@
+
+
\ No newline at end of file
diff --git a/resources/light/database.svg b/resources/light/database.svg
new file mode 100644
index 0000000..65a294a
--- /dev/null
+++ b/resources/light/database.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/resources/light/p-key.svg b/resources/light/p-key.svg
new file mode 100644
index 0000000..528567f
--- /dev/null
+++ b/resources/light/p-key.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/resources/light/save.svg b/resources/light/save.svg
new file mode 100644
index 0000000..c0ead1d
--- /dev/null
+++ b/resources/light/save.svg
@@ -0,0 +1,55 @@
+
+
diff --git a/resources/light/server.svg b/resources/light/server.svg
new file mode 100644
index 0000000..eb93be2
--- /dev/null
+++ b/resources/light/server.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/resources/light/table.svg b/resources/light/table.svg
new file mode 100644
index 0000000..c05505a
--- /dev/null
+++ b/resources/light/table.svg
@@ -0,0 +1,11 @@
+
\ No newline at end of file
diff --git a/src/commands/addConnection.ts b/src/commands/addConnection.ts
new file mode 100644
index 0000000..63f23b0
--- /dev/null
+++ b/src/commands/addConnection.ts
@@ -0,0 +1,43 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { PostgreSQLTreeDataProvider } from "../tree/treeProvider";
+import { IConnection } from "../common/IConnection";
+import { Constants } from "../common/constants";
+import * as uuidv1 from "uuid/v1";
+import { Global } from "../common/global";
+
+'use strict';
+
+export class addConnectionCommand extends BaseCommand {
+ async run() {
+ const tree = PostgreSQLTreeDataProvider.getInstance();
+
+ const host = await vscode.window.showInputBox({ prompt: "The hostname of the database", placeHolder: "host", ignoreFocusOut: true });
+ if (!host) return;
+
+ const user = await vscode.window.showInputBox({ prompt: "The PostgreSQL user to authenticate as", placeHolder: "user", ignoreFocusOut: true });
+ if (!user) return;
+
+ const password = await vscode.window.showInputBox({ prompt: "The password of the PostgreSQL user", placeHolder: "password", ignoreFocusOut: true, password: true });
+ if (password === undefined) return;
+
+ const port = await vscode.window.showInputBox({ prompt: "The port number to connect to", placeHolder: "port", ignoreFocusOut: true, value: "5432" });
+ if (!port) return;
+
+ const certPath = await vscode.window.showInputBox({ prompt: "[Optional] SSL certificate path. Leave empty to ignore", placeHolder: "certificate file path", ignoreFocusOut: true });
+ if (certPath === undefined) return;
+
+ let connections = tree.context.globalState.get<{ [key: string]: IConnection }>(Constants.GlobalStateKey);
+ if (!connections) connections = {};
+
+ const id = uuidv1();
+ connections[id] = { host, user, port, certPath };
+
+ if (password) {
+ await Global.keytar.setPassword(Constants.ExtensionId, id, password);
+ }
+
+ await tree.context.globalState.update(Constants.GlobalStateKey, connections);
+ tree.refresh();
+ }
+}
\ No newline at end of file
diff --git a/src/commands/deleteConnection.ts b/src/commands/deleteConnection.ts
new file mode 100644
index 0000000..f5d0934
--- /dev/null
+++ b/src/commands/deleteConnection.ts
@@ -0,0 +1,47 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { ConnectionNode } from "../tree/connectionNode";
+import { PostgreSQLTreeDataProvider } from "../tree/treeProvider";
+import { IConnection } from "../common/IConnection";
+import { Constants } from "../common/constants";
+import { Global } from "../common/global";
+import { ConnectionQuickPickItem } from "../common/IConnQuickPick";
+
+'use strict';
+
+export class deleteConnectionCommand extends BaseCommand {
+ async run(connectionNode: ConnectionNode) {
+ let connections = Global.context.globalState.get<{ [key: string]: IConnection }>(Constants.GlobalStateKey);
+ if (!connections) connections = {};
+
+ if (connectionNode) {
+ await deleteConnectionCommand.deleteConnection(connections, connectionNode.id);
+ return;
+ }
+
+ let hosts: ConnectionQuickPickItem[] = [];
+ for (const k in connections) {
+ if (connections.hasOwnProperty(k)) {
+ hosts.push({
+ label: connections[k].host,
+ connection_key: k
+ });
+ }
+ }
+
+ const hostToDelete = await vscode.window.showQuickPick(hosts, {placeHolder: 'Select a connection to delete', matchOnDetail: false});
+ if (!hostToDelete) return;
+
+ await deleteConnectionCommand.deleteConnection(connections, hostToDelete.connection_key);
+ }
+
+ private static async deleteConnection(connections: { [key: string]: IConnection }, key: string) {
+ delete connections[key];
+
+ await Global.context.globalState.update(Constants.GlobalStateKey, connections);
+ await Global.keytar.deletePassword(Constants.ExtensionId, key);
+
+ PostgreSQLTreeDataProvider.getInstance().refresh();
+ vscode.window.showInformationMessage('Connection Deleted');
+ }
+}
\ No newline at end of file
diff --git a/src/commands/newQuery.ts b/src/commands/newQuery.ts
new file mode 100644
index 0000000..08457d7
--- /dev/null
+++ b/src/commands/newQuery.ts
@@ -0,0 +1,16 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { IConnection } from "../common/IConnection";
+import { EditorState } from "../common/editorState";
+
+'use strict';
+
+export class newQueryCommand extends BaseCommand {
+ async run(treeNode: any) {
+ // should have a connection object on it
+ const textDocument = await vscode.workspace.openTextDocument({content: '', language: 'postgres'});
+ await vscode.window.showTextDocument(textDocument);
+ if (treeNode && treeNode.connection)
+ EditorState.connection = treeNode.connection;
+ }
+}
\ No newline at end of file
diff --git a/src/commands/refresh.ts b/src/commands/refresh.ts
new file mode 100644
index 0000000..a9eaeaf
--- /dev/null
+++ b/src/commands/refresh.ts
@@ -0,0 +1,11 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { PostgreSQLTreeDataProvider } from "../tree/treeProvider";
+import { INode } from "../tree/INode";
+
+export class refreshCommand extends BaseCommand {
+ async run(treeNode: INode) {
+ const tree = PostgreSQLTreeDataProvider.getInstance();
+ tree.refresh(treeNode);
+ }
+}
\ No newline at end of file
diff --git a/src/commands/selectDatabase.ts b/src/commands/selectDatabase.ts
new file mode 100644
index 0000000..9c08037
--- /dev/null
+++ b/src/commands/selectDatabase.ts
@@ -0,0 +1,30 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { IConnection } from "../common/IConnection";
+import { EditorState } from "../common/editorState";
+import { Database } from "../common/database";
+
+'use strict';
+
+export class selectDatabaseCommand extends BaseCommand {
+ async run() {
+ // vscode.window.showInformationMessage('Select Database!');
+ let connectionDetails: IConnection = EditorState.connection;
+ if (!connectionDetails) return;
+
+ const connection = await Database.createConnection(connectionDetails, 'postgres');
+
+ let databases: string[] = [];
+ try {
+ const res = await connection.query('SELECT datname FROM pg_database WHERE datistemplate = false;');
+ databases = res.rows.map(database => database.datname);
+ } finally {
+ await connection.end();
+ }
+
+ //vscode.window.showInputBox
+ const db = await vscode.window.showQuickPick(databases, {placeHolder: 'Select a database'});
+ if (!db) return;
+ EditorState.connection = Database.getConnectionWithDB(connectionDetails, db);
+ }
+}
\ No newline at end of file
diff --git a/src/commands/selectTop.ts b/src/commands/selectTop.ts
new file mode 100644
index 0000000..7d309dc
--- /dev/null
+++ b/src/commands/selectTop.ts
@@ -0,0 +1,25 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { PostgreSQLTreeDataProvider } from "../tree/treeProvider";
+import { TableNode } from "../tree/tableNode";
+import { EditorState } from "../common/editorState";
+
+export class selectTopCommand extends BaseCommand {
+ async run(treeNode: TableNode) {
+ // prompt for count
+ const countInput: string = await vscode.window.showInputBox({ prompt: "Select how many?", placeHolder: "port" });
+ if (!countInput) return;
+
+ const count: number = parseInt(countInput);
+ if (Number.isNaN(count)) {
+ vscode.window.showErrorMessage('Invalid quantity for selection - should be a number');
+ return;
+ }
+
+ const sql = `SELECT * FROM ${treeNode.table} LIMIT ${count};`
+ const textDocument = await vscode.workspace.openTextDocument({content: sql, language: 'postgres'});
+ await vscode.window.showTextDocument(textDocument);
+ EditorState.connection = treeNode.connection;
+ // TODO: Execute Query
+ }
+}
\ No newline at end of file
diff --git a/src/commands/selectTop1000.ts b/src/commands/selectTop1000.ts
new file mode 100644
index 0000000..0af08c3
--- /dev/null
+++ b/src/commands/selectTop1000.ts
@@ -0,0 +1,15 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { PostgreSQLTreeDataProvider } from "../tree/treeProvider";
+import { TableNode } from "../tree/tableNode";
+import { EditorState } from "../common/editorState";
+
+export class selectTop1000Command extends BaseCommand {
+ async run(treeNode: TableNode) {
+ const sql = `SELECT * FROM ${treeNode.table} LIMIT 1000;`
+ const textDocument = await vscode.workspace.openTextDocument({content: sql, language: 'postgres'});
+ await vscode.window.showTextDocument(textDocument);
+ EditorState.connection = treeNode.connection;
+ // TODO: Execute Query
+ }
+}
\ No newline at end of file
diff --git a/src/commands/setActiveConnection.ts b/src/commands/setActiveConnection.ts
new file mode 100644
index 0000000..e912eb6
--- /dev/null
+++ b/src/commands/setActiveConnection.ts
@@ -0,0 +1,12 @@
+import BaseCommand from "../common/baseCommand";
+import * as vscode from 'vscode';
+import { IConnection } from "../common/IConnection";
+import { EditorState } from "../common/editorState";
+
+'use strict';
+
+export class setActiveConnectionCommand extends BaseCommand {
+ run(connection: IConnection) {
+ EditorState.connection = connection;
+ }
+}
\ No newline at end of file
diff --git a/src/common/IConnQuickPick.ts b/src/common/IConnQuickPick.ts
new file mode 100644
index 0000000..1cedb58
--- /dev/null
+++ b/src/common/IConnQuickPick.ts
@@ -0,0 +1,5 @@
+import { QuickPickItem } from "vscode";
+
+export interface ConnectionQuickPickItem extends QuickPickItem {
+ readonly connection_key: string;
+}
\ No newline at end of file
diff --git a/src/common/IConnection.ts b/src/common/IConnection.ts
new file mode 100644
index 0000000..a449532
--- /dev/null
+++ b/src/common/IConnection.ts
@@ -0,0 +1,9 @@
+export interface IConnection {
+ readonly host: string;
+ readonly user: string;
+ password?: string;
+ readonly port: string;
+ readonly database?: string;
+ multipleStatements?: boolean;
+ readonly certPath?: string;
+}
\ No newline at end of file
diff --git a/src/common/baseCommand.ts b/src/common/baseCommand.ts
new file mode 100644
index 0000000..c0c903d
--- /dev/null
+++ b/src/common/baseCommand.ts
@@ -0,0 +1,14 @@
+'use strict';
+
+import * as vscode from 'vscode';
+
+export default abstract class BaseCommand {
+
+ constructor(context: vscode.ExtensionContext) {
+ let commandName = this.constructor.name.replace(/Command$/, '');
+ let disposable = vscode.commands.registerCommand('vscode-postgres.' + commandName, this.run);
+ context.subscriptions.push(disposable);
+ }
+
+ abstract run(...args: any[]) : void;
+}
\ No newline at end of file
diff --git a/src/common/constants.ts b/src/common/constants.ts
new file mode 100644
index 0000000..dbb3512
--- /dev/null
+++ b/src/common/constants.ts
@@ -0,0 +1,6 @@
+'use strict';
+
+export class Constants {
+ public static ExtensionId = 'vscode-postgres';
+ public static GlobalStateKey = 'postgresql.connections';
+}
\ No newline at end of file
diff --git a/src/common/database.ts b/src/common/database.ts
new file mode 100644
index 0000000..886f4cf
--- /dev/null
+++ b/src/common/database.ts
@@ -0,0 +1,33 @@
+import * as fs from 'fs';
+import {Pool, Client, types } from 'pg';
+import { IConnection } from "./IConnection";
+
+export class Database {
+
+ static getConnectionWithDB(connection:IConnection, dbname?: string): IConnection {
+ if (!dbname) return connection;
+ return {
+ host: connection.host,
+ user: connection.user,
+ password: connection.password,
+ port: connection.port,
+ database: dbname,
+ multipleStatements: connection.multipleStatements,
+ certPath: connection.certPath
+ };
+ }
+
+ public static async createConnection(connection: IConnection, dbname?: string): Promise {
+ const connectionOptions: any = Object.assign({}, connection);
+ connectionOptions.database = dbname ? dbname : connection.database;
+ if (connectionOptions.certPath && fs.existsSync(connectionOptions.certPath)) {
+ connectionOptions.ssl = {
+ ca: fs.readFileSync(connectionOptions.certPath).toString()
+ }
+ }
+
+ let client = new Client(connectionOptions);
+ await client.connect();
+ return client;
+ }
+}
\ No newline at end of file
diff --git a/src/common/editorState.ts b/src/common/editorState.ts
new file mode 100644
index 0000000..38f7af3
--- /dev/null
+++ b/src/common/editorState.ts
@@ -0,0 +1,95 @@
+import * as vscode from 'vscode';
+import { IConnection } from './IConnection';
+import PostgreSQLLanguageClient from '../language/client';
+
+export class EditorState {
+
+ private metadata: Map = new Map();
+ private static _instance: EditorState = null;
+ private statusBarDatabase: vscode.StatusBarItem;
+ private statusBarServer: vscode.StatusBarItem;
+
+ constructor(private readonly languageClient: PostgreSQLLanguageClient) {
+ vscode.window.onDidChangeActiveTextEditor(this.onDidChangeActiveTextEditor, this);
+ vscode.workspace.onDidCloseTextDocument(this.onDidCloseTextDocument, this);
+ vscode.workspace.onDidOpenTextDocument(this.onDidOpenTextDocument, this);
+ }
+
+ static getInstance(languageClient?: PostgreSQLLanguageClient) {
+ if (!EditorState._instance && languageClient) EditorState._instance = new EditorState(languageClient);
+ return EditorState._instance;
+ }
+
+ public static get connection(): IConnection {
+ let window = vscode.window;
+ let te = window ? window.activeTextEditor : null;
+ let doc = te ? te.document : null;
+ let uri = doc ? doc.uri : null;
+
+ if (!uri) return null;
+ return EditorState.getInstance().metadata.get(uri.toString());
+ }
+
+ public static set connection(newConn: IConnection) {
+ let window = vscode.window;
+ let te = window ? window.activeTextEditor : null;
+ let doc = te ? te.document : null;
+ let uri = doc ? doc.uri : null;
+
+ if (!uri) return;
+ EditorState.getInstance().metadata.set(uri.toString(), newConn);
+ EditorState.getInstance().onDidChangeActiveTextEditor(te);
+ }
+
+ onDidChangeActiveTextEditor(e: vscode.TextEditor) {
+ let conn: IConnection = e && e.document && e.document.uri ? this.metadata.get(e.document.uri.toString()) : null;
+ this.languageClient.setConnection(conn);
+ if (conn) {
+ // set the status buttons
+ this.setStatusButtons(conn);
+ } else {
+ // clear the status buttons
+ this.removeStatusButtons();
+ }
+ }
+
+ setStatusButtons(conn: IConnection) {
+ if (!this.statusBarServer) {
+ this.statusBarServer = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
+ this.statusBarServer.tooltip = 'Change Active Server';
+ }
+
+ this.statusBarServer.text = `$(server) ${conn.host}`;
+ this.statusBarServer.command = 'vscode-postgres.selectDatabase';
+ this.statusBarServer.show();
+
+ if (!conn.database) {
+ if (this.statusBarDatabase)
+ this.statusBarDatabase.hide();
+ return;
+ }
+
+ if (!this.statusBarDatabase) {
+ this.statusBarDatabase = vscode.window.createStatusBarItem(vscode.StatusBarAlignment.Left);
+ this.statusBarDatabase.tooltip = 'Change Active Database';
+ }
+
+ this.statusBarDatabase.text = `$(database) ${conn.database}`;
+ this.statusBarDatabase.command = 'vscode-postgres.selectDatabase';
+ this.statusBarDatabase.show();
+ }
+
+ removeStatusButtons() {
+ if (this.statusBarDatabase) this.statusBarDatabase.hide();
+ if (this.statusBarServer) this.statusBarServer.hide();
+ }
+
+ onDidCloseTextDocument(e: vscode.TextDocument) {
+ this.metadata.delete(e.uri.toString());
+ }
+
+ onDidOpenTextDocument(e: vscode.TextDocument) {
+ this.metadata.set(e.uri.toString(), null);
+ }
+
+}
\ No newline at end of file
diff --git a/src/common/global.ts b/src/common/global.ts
new file mode 100644
index 0000000..4490fcb
--- /dev/null
+++ b/src/common/global.ts
@@ -0,0 +1,26 @@
+'use strict';
+import * as keytarType from 'keytar';
+import * as vscode from 'vscode';
+import { IConnection } from './IConnection';
+import { Constants } from './constants';
+
+export class Global {
+ public static keytar: typeof keytarType = getCoreNodeModule('keytar');
+ public static context: vscode.ExtensionContext = null;
+
+ public static get Configuration(): vscode.WorkspaceConfiguration {
+ return vscode.workspace.getConfiguration(Constants.ExtensionId);
+ }
+}
+
+function getCoreNodeModule(moduleName: string) {
+ try {
+ return require(`${vscode.env.appRoot}/node_modules.asar/${moduleName}`);
+ } catch(err) { }
+
+ try {
+ return require(`${vscode.env.appRoot}/node_modules/${moduleName}`);
+ } catch(err) { }
+
+ return null;
+}
\ No newline at end of file
diff --git a/src/extension.ts b/src/extension.ts
new file mode 100644
index 0000000..b1d775e
--- /dev/null
+++ b/src/extension.ts
@@ -0,0 +1,45 @@
+'use strict';
+// The module 'vscode' contains the VS Code extensibility API
+// Import the module and reference it with the alias vscode in your code below
+import * as vscode from 'vscode';
+import * as fs from 'fs';
+import * as path from 'path';
+import PostgreSQLLanguageClient from './language/client';
+import { PostgreSQLTreeDataProvider } from './tree/treeProvider';
+import { Global } from './common/global';
+import { EditorState } from './common/editorState';
+
+
+// this method is called when your extension is activated
+// your extension is activated the very first time the command is executed
+export function activate(context: vscode.ExtensionContext) {
+
+ // Use the console to output diagnostic information (console.log) and errors (console.error)
+ // This line of code will only be executed once when your extension is activated
+ console.log('Congratulations, your extension "vscode-postgres" is now active!');
+ let languageClient: PostgreSQLLanguageClient = new PostgreSQLLanguageClient(context);
+ let treeProvider: PostgreSQLTreeDataProvider = PostgreSQLTreeDataProvider.getInstance(context);
+ Global.context = context;
+ EditorState.getInstance(languageClient);
+
+ try {
+ let commandPath = context.asAbsolutePath(path.join('out', 'commands'));
+ let files = fs.readdirSync(commandPath);
+ for (const file of files) {
+ if (path.extname(file) === '.map') continue;
+ let className = path.basename(file, '.js') + 'Command';
+
+ let commandClass = require(path.join(commandPath, file));
+ new commandClass[className](context);
+ }
+ }
+ catch (err) {
+ console.error('Command loading error:', err);
+ }
+
+
+}
+
+// this method is called when your extension is deactivated
+export function deactivate() {
+}
\ No newline at end of file
diff --git a/src/language/client.ts b/src/language/client.ts
new file mode 100644
index 0000000..eaea9f5
--- /dev/null
+++ b/src/language/client.ts
@@ -0,0 +1,34 @@
+import * as path from 'path';
+import { LanguageClient, ServerOptions, TransportKind, LanguageClientOptions } from 'vscode-languageclient';
+import { ExtensionContext } from 'vscode';
+import { IConnection } from '../common/IConnection';
+
+export default class PostgreSQLLanguageClient {
+
+ public client: LanguageClient;
+
+ constructor(context: ExtensionContext) {
+ let serverModule = context.asAbsolutePath(path.join('out', 'language', 'server.js'));
+ let debugOptions = { execArgv: ['--nolazy', '--debug=6005', '--inspect'] };
+
+ let serverOptions: ServerOptions = {
+ run: { module: serverModule, transport: TransportKind.ipc },
+ debug: { module: serverModule, transport: TransportKind.ipc, options: debugOptions },
+ };
+
+ let clientOptions: LanguageClientOptions = {
+ documentSelector: [
+ { language: 'postgres', scheme: 'file' },
+ { language: 'postgres', scheme: 'untitled' }
+ ]
+ };
+
+ this.client = new LanguageClient('postgres', 'PostgreSQL', serverOptions, clientOptions);
+ let disposable = this.client.start();
+ context.subscriptions.push(disposable);
+ }
+
+ setConnection(connection: IConnection) {
+ this.client.sendRequest('set_connection', connection);
+ }
+}
\ No newline at end of file
diff --git a/src/language/server.ts b/src/language/server.ts
new file mode 100644
index 0000000..5365d48
--- /dev/null
+++ b/src/language/server.ts
@@ -0,0 +1,190 @@
+import {
+ IPCMessageReader, IPCMessageWriter, createConnection, IConnection,
+ TextDocuments, TextDocument, InitializeResult,
+ Diagnostic, DiagnosticSeverity, TextDocumentPositionParams,
+ CompletionItem, CompletionItemKind
+} from 'vscode-languageserver';
+
+/**
+ * To Debug the language server
+ *
+ * 1. Start the extension via F5
+ * 2. Under vscode Debug pane, switch to "Attach to Language Server"
+ * 3. F5
+ */
+
+let connection: IConnection = createConnection(new IPCMessageReader(process), new IPCMessageWriter(process));
+
+console.log = connection.console.log.bind(connection.console);
+console.error = connection.console.error.bind(connection.console);
+
+let documents: TextDocuments = new TextDocuments();
+documents.listen(connection);
+
+let shouldSendDiagnosticRelatedInformation: boolean = false;
+
+connection.onInitialize((_params) : InitializeResult => {
+ shouldSendDiagnosticRelatedInformation = _params.capabilities && _params.capabilities.textDocument && _params.capabilities.textDocument.publishDiagnostics && _params.capabilities.textDocument.publishDiagnostics.relatedInformation;
+ return {
+ capabilities: {
+ textDocumentSync: documents.syncKind,
+ completionProvider: {
+ resolveProvider: true,
+
+ }
+ }
+ }
+});
+
+connection.onRequest('set_connection', function() {
+ console.log('Set Connection on server:', arguments);
+});
+
+documents.onDidChangeContent((change) => {
+ validateTextDocument(change.document);
+});
+
+function validateTextDocument(textDocument: TextDocument): void {
+ let diagnostics: Diagnostic[] = [];
+ // parse and find issues
+ connection.sendDiagnostics({uri: textDocument.uri, diagnostics});
+}
+
+connection.onCompletion((_textDocumentPosition: TextDocumentPositionParams): CompletionItem[] => {
+ return [
+ {
+ label: 'Text',
+ kind: CompletionItemKind.Text,
+ data: 1
+ },
+ {
+ label: 'Method',
+ kind: CompletionItemKind.Method,
+ data: 2
+ },
+ {
+ label: 'Function',
+ kind: CompletionItemKind.Function,
+ data: 3
+ },
+ {
+ label: 'Constructor',
+ kind: CompletionItemKind.Constructor,
+ data: 4
+ },
+ {
+ label: 'Field',
+ kind: CompletionItemKind.Field,
+ data: 5
+ },
+ {
+ label: 'Variable',
+ kind: CompletionItemKind.Variable,
+ data: 6
+ },
+ {
+ label: 'Class',
+ kind: CompletionItemKind.Class,
+ data: 7
+ },
+ {
+ label: 'Interface',
+ kind: CompletionItemKind.Interface,
+ data: 8
+ },
+ {
+ label: 'Module',
+ kind: CompletionItemKind.Module,
+ data: 9
+ },
+ {
+ label: 'Property',
+ kind: CompletionItemKind.Property,
+ data: 10
+ },
+ {
+ label: 'Unit',
+ kind: CompletionItemKind.Unit,
+ data: 11
+ },
+ {
+ label: 'Value',
+ kind: CompletionItemKind.Value,
+ data: 12
+ },
+ {
+ label: 'Enum',
+ kind: CompletionItemKind.Enum,
+ data: 13
+ },
+ {
+ label: 'Keyword',
+ kind: CompletionItemKind.Keyword,
+ data: 14
+ },
+ {
+ label: 'Snippet',
+ kind: CompletionItemKind.Snippet,
+ data: 15
+ },
+ {
+ label: 'Color',
+ kind: CompletionItemKind.Color,
+ data: 16
+ },
+ {
+ label: 'File',
+ kind: CompletionItemKind.File,
+ data: 17
+ },
+ {
+ label: 'Reference',
+ kind: CompletionItemKind.Reference,
+ data: 18
+ },
+ {
+ label: 'Folder',
+ kind: CompletionItemKind.Folder,
+ data: 19
+ },
+ {
+ label: 'EnumMember',
+ kind: CompletionItemKind.EnumMember,
+ data: 20
+ },
+ {
+ label: 'Constant',
+ kind: CompletionItemKind.Constant,
+ data: 21
+ },
+ {
+ label: 'Struct',
+ kind: CompletionItemKind.Struct,
+ data: 22
+ },
+ {
+ label: 'Event',
+ kind: CompletionItemKind.Event,
+ data: 23
+ },
+ {
+ label: 'Operator',
+ kind: CompletionItemKind.Operator,
+ data: 24
+ },
+ {
+ label: 'TypeParameter',
+ kind: CompletionItemKind.TypeParameter,
+ data: 25
+ },
+ ]
+});
+
+connection.onCompletionResolve((item: CompletionItem): CompletionItem => {
+ item.detail = `${item.label} details`;
+ item.documentation = `${item.label} documentation`;
+ return item;
+});
+
+// setup the language service
+connection.listen();
\ No newline at end of file
diff --git a/src/test/extension.test.ts b/src/test/extension.test.ts
new file mode 100644
index 0000000..fc71c5d
--- /dev/null
+++ b/src/test/extension.test.ts
@@ -0,0 +1,22 @@
+//
+// Note: This example test is leveraging the Mocha test framework.
+// Please refer to their documentation on https://mochajs.org/ for help.
+//
+
+// The module 'assert' provides assertion methods from node
+import * as assert from 'assert';
+
+// You can import and use all API from the 'vscode' module
+// as well as import your extension to test it
+import * as vscode from 'vscode';
+import * as myExtension from '../extension';
+
+// Defines a Mocha test suite to group tests of similar kind together
+suite("Extension Tests", () => {
+
+ // Defines a Mocha unit test
+ test("Something 1", () => {
+ assert.equal(-1, [1, 2, 3].indexOf(5));
+ assert.equal(-1, [1, 2, 3].indexOf(0));
+ });
+});
\ No newline at end of file
diff --git a/src/test/index.ts b/src/test/index.ts
new file mode 100644
index 0000000..9fa2ea0
--- /dev/null
+++ b/src/test/index.ts
@@ -0,0 +1,22 @@
+//
+// PLEASE DO NOT MODIFY / DELETE UNLESS YOU KNOW WHAT YOU ARE DOING
+//
+// This file is providing the test runner to use when running extension tests.
+// By default the test runner in use is Mocha based.
+//
+// You can provide your own test runner if you want to override it by exporting
+// a function run(testRoot: string, clb: (error:Error) => void) that the extension
+// host can call to run the tests. The test runner is expected to use console.log
+// to report the results back to the caller. When the tests are finished, return
+// a possible error to the callback or null if none.
+
+import * as testRunner from 'vscode/lib/testrunner';
+
+// You can directly control Mocha options by uncommenting the following lines
+// See https://github.com/mochajs/mocha/wiki/Using-mocha-programmatically#set-options for more info
+testRunner.configure({
+ ui: 'tdd', // the TDD UI is being used in extension.test.ts (suite, test, etc.)
+ useColors: true // colored output from test results
+});
+
+module.exports = testRunner;
\ No newline at end of file
diff --git a/src/tree/IColumn.ts b/src/tree/IColumn.ts
new file mode 100644
index 0000000..68da466
--- /dev/null
+++ b/src/tree/IColumn.ts
@@ -0,0 +1,5 @@
+export interface IColumn {
+ column_name: string;
+ data_type: string;
+ primary_key: boolean;
+}
\ No newline at end of file
diff --git a/src/tree/INode.ts b/src/tree/INode.ts
new file mode 100644
index 0000000..36fb693
--- /dev/null
+++ b/src/tree/INode.ts
@@ -0,0 +1,6 @@
+import * as vscode from 'vscode';
+
+export interface INode {
+ getTreeItem(): Promise | vscode.TreeItem;
+ getChildren(): Promise | INode[];
+}
\ No newline at end of file
diff --git a/src/tree/columnNode.ts b/src/tree/columnNode.ts
new file mode 100644
index 0000000..a29b8a7
--- /dev/null
+++ b/src/tree/columnNode.ts
@@ -0,0 +1,25 @@
+import * as path from 'path';
+import { INode } from "./INode";
+import { IConnection } from "../common/IConnection";
+import { IColumn } from "./IColumn";
+import { TreeItem, TreeItemCollapsibleState } from "vscode";
+
+export class ColumnNode implements INode {
+
+ constructor(private readonly connection: IConnection, private readonly tablename: string, private readonly column: IColumn) {}
+
+ public async getChildren(): Promise { return []; }
+ public getTreeItem(): TreeItem {
+ let icon = this.column.primary_key ? 'p-key' : 'column';
+ return {
+ label: `${this.column.column_name} : ${this.column.data_type}`,
+ collapsibleState: TreeItemCollapsibleState.None,
+ contextValue: 'vscode-postgres.tree.column',
+ iconPath: {
+ light: path.join(__dirname, `../../resources/light/${icon}.svg`),
+ dark: path.join(__dirname, `../../resources/dark/${icon}.svg`)
+ }
+ };
+ }
+
+}
\ No newline at end of file
diff --git a/src/tree/connectionNode.ts b/src/tree/connectionNode.ts
new file mode 100644
index 0000000..bd98b4e
--- /dev/null
+++ b/src/tree/connectionNode.ts
@@ -0,0 +1,45 @@
+import * as vscode from 'vscode';
+import * as path from 'path';
+import { INode } from './INode';
+import { IConnection } from '../common/IConnection';
+import { Database } from '../common/database';
+import { DatabaseNode } from './databaseNode';
+import { InfoNode } from './infoNode';
+
+export class ConnectionNode implements INode {
+
+ constructor(public readonly id: string, private readonly connection: IConnection) {}
+
+ public getTreeItem(): vscode.TreeItem {
+ return {
+ label: this.connection.host,
+ collapsibleState: vscode.TreeItemCollapsibleState.Collapsed,
+ contextValue: "vscode-postgres.tree.connection",
+ command: {
+ title: 'select-database',
+ command: 'vscode-postgres.setActiveConnection',
+ arguments: [ this.connection ]
+ },
+ iconPath: {
+ light: path.join(__dirname, '../../resources/light/server.svg'),
+ dark: path.join(__dirname, '../../resources/dark/server.svg')
+ }
+ };
+ }
+
+ public async getChildren(): Promise {
+ const connection = await Database.createConnection(this.connection, 'postgres');
+
+ try {
+ const res = await connection.query('SELECT datname FROM pg_database WHERE datistemplate = false;');
+
+ return res.rows.map(database => {
+ return new DatabaseNode(Database.getConnectionWithDB(this.connection, database.datname));
+ });
+ } catch(err) {
+ return [new InfoNode(err)];
+ } finally {
+ await connection.end();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/tree/databaseNode.ts b/src/tree/databaseNode.ts
new file mode 100644
index 0000000..7d03a53
--- /dev/null
+++ b/src/tree/databaseNode.ts
@@ -0,0 +1,45 @@
+import * as path from 'path';
+import { INode } from "./INode";
+import { IConnection } from "../common/IConnection";
+import { TreeItem, TreeItemCollapsibleState } from "vscode";
+import { Database } from '../common/database';
+import { TableNode } from './tableNode';
+import { InfoNode } from './infoNode';
+
+export class DatabaseNode implements INode {
+
+ constructor(private readonly connection: IConnection) {}
+
+ public getTreeItem(): TreeItem {
+ return {
+ label: this.connection.database,
+ collapsibleState: TreeItemCollapsibleState.Collapsed,
+ contextValue: 'vscode-postgres.tree.database',
+ command: {
+ title: 'select-database',
+ command: 'vscode-postgres.setActiveConnection',
+ arguments: [ this.connection ]
+ },
+ iconPath: {
+ light: path.join(__dirname, '../../resources/light/database.svg'),
+ dark: path.join(__dirname, '../../resources/dark/database.svg')
+ }
+ }
+ }
+
+ public async getChildren(): Promise {
+ const connection = await Database.createConnection(this.connection);
+
+ try {
+ const res = await connection.query(`SELECT tablename FROM pg_tables WHERE schemaname not in ('information_schema', 'pg_catalog') ORDER BY tablename;`);
+
+ return res.rows.map(table => {
+ return new TableNode(this.connection, table.tablename);
+ });
+ } catch(err) {
+ return [new InfoNode(err)];
+ } finally {
+ await connection.end();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/tree/infoNode.ts b/src/tree/infoNode.ts
new file mode 100644
index 0000000..b403a5f
--- /dev/null
+++ b/src/tree/infoNode.ts
@@ -0,0 +1,9 @@
+import * as vscode from 'vscode';
+import { INode } from './INode';
+
+export class InfoNode implements INode {
+ constructor(private readonly label: string) {}
+
+ public getTreeItem(): vscode.TreeItem { return { label: this.label }; }
+ public getChildren(): INode[] { return []; }
+}
\ No newline at end of file
diff --git a/src/tree/tableNode.ts b/src/tree/tableNode.ts
new file mode 100644
index 0000000..1d872cd
--- /dev/null
+++ b/src/tree/tableNode.ts
@@ -0,0 +1,52 @@
+import * as path from 'path';
+import { INode } from "./INode";
+import { IConnection } from "../common/IConnection";
+import { TreeItem, TreeItemCollapsibleState } from "vscode";
+import { Database } from '../common/database';
+import { InfoNode } from './infoNode';
+import { ColumnNode } from './columnNode';
+
+export class TableNode implements INode {
+
+ constructor(public readonly connection: IConnection, public readonly table: string) {}
+
+ public getTreeItem(): TreeItem {
+ return {
+ label: this.table,
+ collapsibleState: TreeItemCollapsibleState.Collapsed,
+ contextValue: 'vscode-postgres.tree.table',
+ iconPath: {
+ light: path.join(__dirname, '../../resources/light/table.svg'),
+ dark: path.join(__dirname, '../../resources/dark/table.svg')
+ }
+ };
+ }
+
+ public async getChildren(): Promise {
+ const connection = await Database.createConnection(this.connection);
+
+ try {
+ const res = await connection.query(`
+ SELECT
+ a.attname as column_name,
+ format_type(a.atttypid, a.atttypmod) as data_type,
+ coalesce(primaryIndex.indisprimary, false) as primary_key
+ FROM
+ pg_attribute a
+ LEFT JOIN pg_index primaryIndex ON primaryIndex.indrelid = a.attrelid AND a.attnum = ANY(primaryIndex.indkey) AND primaryIndex.indisprimary = true
+ WHERE
+ a.attrelid = $1::regclass AND
+ a.attnum > 0 AND
+ NOT a.attisdropped
+ ORDER BY a.attnum;`, [this.table]);
+
+ return res.rows.map(column => {
+ return new ColumnNode(this.connection, this.table, column);
+ });
+ } catch(err) {
+ return [new InfoNode(err)];
+ } finally {
+ await connection.end();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/tree/treeProvider.ts b/src/tree/treeProvider.ts
new file mode 100644
index 0000000..b3bf35e
--- /dev/null
+++ b/src/tree/treeProvider.ts
@@ -0,0 +1,72 @@
+import * as vscode from 'vscode';
+import { INode } from './INode';
+import { Constants } from '../common/constants';
+import { Global } from '../common/global';
+import { IConnection } from '../common/IConnection';
+import { ConnectionNode } from './connectionNode';
+
+export class PostgreSQLTreeDataProvider implements vscode.TreeDataProvider {
+
+ public _onDidChangeTreeData: vscode.EventEmitter = new vscode.EventEmitter();
+ public readonly onDidChangeTreeData: vscode.Event = this._onDidChangeTreeData.event;
+ private static _instance: PostgreSQLTreeDataProvider = null;
+
+ constructor(public context: vscode.ExtensionContext){ this.refresh(); }
+
+ public static getInstance(context?: vscode.ExtensionContext): PostgreSQLTreeDataProvider {
+ if (context && !this._instance) {
+ this._instance = new PostgreSQLTreeDataProvider(context);
+ context.subscriptions.push(vscode.window.registerTreeDataProvider("postgres", this._instance));
+ }
+ return this._instance;
+ }
+
+ public refresh(element?: INode): void {
+ this._onDidChangeTreeData.fire(element);
+ }
+
+ public getTreeItem(element: INode): Promise | vscode.TreeItem {
+ return element.getTreeItem();
+ }
+
+ public getChildren(element?: INode): Promise | INode[] {
+ if (!element) {
+ return this.getConnectionNodes();
+ }
+ return element.getChildren();
+ }
+
+ // private async getConnectionNodes(): Promise {
+ // const connections = this.context.globalState.get<{[key: string]: IConnection}>(Constants.GlobalStatePostgresSQLConectionsKey);
+ // const ConnectionNodes = [];
+ // if (connections) {
+ // for (const id of Object.keys(connections)) {
+ // const password = await Global.keytar.getPassword(Constants.ExtensionId, id);
+ // ConnectionNodes.push(new ConnectionNode(id, connections[id].host, connections[id].user, password, connections[id].port, connections[id].certPath));
+ // if (!Global.activeConnection) {
+ // Global.activeConnection = {
+ // host: connections[id].host,
+ // user: connections[id].user,
+ // password,
+ // port: connections[id].port,
+ // certPath: connections[id].certPath
+ // };
+ // }
+ // }
+ // }
+ // return ConnectionNodes;
+ // }
+ private async getConnectionNodes(): Promise {
+ const connections = this.context.globalState.get<{[key: string]: IConnection}>(Constants.GlobalStateKey);
+ const ConnectionNodes = [];
+ if (connections) {
+ for (const id of Object.keys(connections)) {
+ const password = await Global.keytar.getPassword(Constants.ExtensionId, id);
+ let connection: IConnection = Object.assign({}, connections[id]);
+ connection.password = password;
+ ConnectionNodes.push(new ConnectionNode(id, connection));
+ }
+ }
+ return ConnectionNodes;
+ }
+}
\ No newline at end of file
diff --git a/tsconfig.json b/tsconfig.json
new file mode 100644
index 0000000..500217e
--- /dev/null
+++ b/tsconfig.json
@@ -0,0 +1,16 @@
+{
+ "compilerOptions": {
+ "module": "commonjs",
+ "target": "es6",
+ "outDir": "out",
+ "lib": [
+ "es6"
+ ],
+ "sourceMap": true,
+ "rootDir": "src"
+ },
+ "exclude": [
+ "node_modules",
+ ".vscode-test"
+ ]
+}
\ No newline at end of file
diff --git a/vsc-extension-quickstart.md b/vsc-extension-quickstart.md
new file mode 100644
index 0000000..8a91f63
--- /dev/null
+++ b/vsc-extension-quickstart.md
@@ -0,0 +1,33 @@
+# Welcome to your VS Code Extension
+
+## What's in the folder
+* This folder contains all of the files necessary for your extension.
+* `package.json` - this is the manifest file in which you declare your extension and command.
+The sample plugin registers a command and defines its title and command name. With this information
+VS Code can show the command in the command palette. It doesn’t yet need to load the plugin.
+* `src/extension.ts` - this is the main file where you will provide the implementation of your command.
+The file exports one function, `activate`, which is called the very first time your extension is
+activated (in this case by executing the command). Inside the `activate` function we call `registerCommand`.
+We pass the function containing the implementation of the command as the second parameter to
+`registerCommand`.
+
+## Get up and running straight away
+* Press `F5` to open a new window with your extension loaded.
+* Run your command from the command palette by pressing (`Ctrl+Shift+P` or `Cmd+Shift+P` on Mac) and typing `Hello World`.
+* Set breakpoints in your code inside `src/extension.ts` to debug your extension.
+* Find output from your extension in the debug console.
+
+## Make changes
+* You can relaunch the extension from the debug toolbar after changing code in `src/extension.ts`.
+* You can also reload (`Ctrl+R` or `Cmd+R` on Mac) the VS Code window with your extension to load your changes.
+
+## Explore the API
+* You can open the full set of our API when you open the file `node_modules/vscode/vscode.d.ts`.
+
+## Run tests
+* Open the debug viewlet (`Ctrl+Shift+D` or `Cmd+Shift+D` on Mac) and from the launch configuration dropdown pick `Launch Tests`.
+* Press `F5` to run the tests in a new window with your extension loaded.
+* See the output of the test result in the debug console.
+* Make changes to `test/extension.test.ts` or create new test files inside the `test` folder.
+ * By convention, the test runner will only consider files matching the name pattern `**.test.ts`.
+ * You can create folders inside the `test` folder to structure your tests any way you want.