From aa4276f110278dad22aeb4f518c9c470b1d3a223 Mon Sep 17 00:00:00 2001
From: David Luecke
Date: Fri, 21 Sep 2018 10:31:19 -0700
Subject: [PATCH] packages: Adding @feathersjs/client package (#1013)
---
.codeclimate.yml | 39 +
.gitignore | 3 +
.travis.yml | 1 +
Gruntfile.js | 53 +
package.json | 6 +-
packages/client/.babelrc | 8 +
packages/client/.npmignore | 4 +
packages/client/CHANGELOG.md | 735 ++++++++
packages/client/LICENSE | 22 +
packages/client/README.md | 51 +
packages/client/authentication.js | 1 +
packages/client/browser/index.html | 51 +
packages/client/browser/test.dist.js | 1617 +++++++++++++++++
packages/client/browser/test.js | 80 +
packages/client/browser/webpack.config.js | 13 +
packages/client/core.js | 1 +
packages/client/index.js | 1 +
packages/client/package-lock.json | 1241 +++++++++++++
packages/client/package.json | 66 +
packages/client/primus.js | 1 +
packages/client/rest.js | 1 +
packages/client/socketio.js | 1 +
packages/client/src/authentication.js | 1 +
packages/client/src/core.js | 1 +
packages/client/src/index.js | 16 +
packages/client/src/primus.js | 1 +
packages/client/src/rest.js | 1 +
packages/client/src/socketio.js | 1 +
packages/client/test/fixture.js | 78 +
packages/client/test/rest/fetch.test.js | 21 +
packages/client/test/rest/jquery.test.js | 32 +
packages/client/test/rest/request.test.js | 21 +
packages/client/test/rest/superagent.test.js | 21 +
packages/client/test/server.js | 7 +
packages/client/test/sockets/primus.test.js | 29 +
packages/client/test/sockets/socketio.test.js | 28 +
packages/client/webpack.config.js | 68 +
packages/rest-client/package-lock.json | 394 +++-
readme.md | 2 +
39 files changed, 4716 insertions(+), 2 deletions(-)
create mode 100644 .codeclimate.yml
create mode 100644 Gruntfile.js
create mode 100644 packages/client/.babelrc
create mode 100644 packages/client/.npmignore
create mode 100644 packages/client/CHANGELOG.md
create mode 100644 packages/client/LICENSE
create mode 100644 packages/client/README.md
create mode 100644 packages/client/authentication.js
create mode 100644 packages/client/browser/index.html
create mode 100644 packages/client/browser/test.dist.js
create mode 100644 packages/client/browser/test.js
create mode 100644 packages/client/browser/webpack.config.js
create mode 100644 packages/client/core.js
create mode 100644 packages/client/index.js
create mode 100644 packages/client/package-lock.json
create mode 100644 packages/client/package.json
create mode 100644 packages/client/primus.js
create mode 100644 packages/client/rest.js
create mode 100644 packages/client/socketio.js
create mode 100644 packages/client/src/authentication.js
create mode 100644 packages/client/src/core.js
create mode 100644 packages/client/src/index.js
create mode 100644 packages/client/src/primus.js
create mode 100644 packages/client/src/rest.js
create mode 100644 packages/client/src/socketio.js
create mode 100644 packages/client/test/fixture.js
create mode 100644 packages/client/test/rest/fetch.test.js
create mode 100644 packages/client/test/rest/jquery.test.js
create mode 100644 packages/client/test/rest/request.test.js
create mode 100644 packages/client/test/rest/superagent.test.js
create mode 100644 packages/client/test/server.js
create mode 100644 packages/client/test/sockets/primus.test.js
create mode 100644 packages/client/test/sockets/socketio.test.js
create mode 100644 packages/client/webpack.config.js
diff --git a/.codeclimate.yml b/.codeclimate.yml
new file mode 100644
index 0000000000..961258e7cf
--- /dev/null
+++ b/.codeclimate.yml
@@ -0,0 +1,39 @@
+version: "2" # required to adjust maintainability checks
+checks:
+ argument-count:
+ config:
+ threshold: 6
+ complex-logic:
+ config:
+ threshold: 6
+ file-lines:
+ config:
+ threshold: 250
+ method-complexity:
+ config:
+ threshold: 6
+ method-count:
+ config:
+ threshold: 20
+ method-lines:
+ config:
+ threshold: 80
+ nested-control-flow:
+ config:
+ threshold: 6
+ return-statements:
+ config:
+ threshold: 6
+ similar-code:
+ config:
+ threshold: 3
+ identical-code:
+ config:
+ threshold: 3
+exclude_patterns:
+ - "lib/foundation.js"
+ - "**/test/*"
+ - "**/dist/*"
+ - "**/*.dist.js"
+ - "**/templates/*"
+
\ No newline at end of file
diff --git a/.gitignore b/.gitignore
index bd0e142052..1bf0ba3997 100644
--- a/.gitignore
+++ b/.gitignore
@@ -31,3 +31,6 @@ node_modules
# IDEs
.idea
+
+# Distributables
+dist/
diff --git a/.travis.yml b/.travis.yml
index 0964a71955..884f105105 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -4,6 +4,7 @@ install: npm install
script:
- npm test
- npm run test:generators
+ - npm run test:client
services: mongodb
node_js:
- node
diff --git a/Gruntfile.js b/Gruntfile.js
new file mode 100644
index 0000000000..dac2337833
--- /dev/null
+++ b/Gruntfile.js
@@ -0,0 +1,53 @@
+const server = require('./packages/client/test/server');
+
+module.exports = function (grunt) {
+ const browsers = [{
+ browserName: 'firefox',
+ platform: 'Windows 10'
+ }, {
+ browserName: 'googlechrome',
+ platform: 'linux'
+ }, {
+ browserName: 'safari',
+ platform: 'OS X 10.11',
+ version: '9.0'
+ }, {
+ browserName: 'internet explorer',
+ platform: 'Windows 8',
+ version: '10'
+ }, {
+ browserName: 'internet explorer',
+ platform: 'Windows 10',
+ version: '11'
+ }];
+
+ grunt.registerTask('server', 'Start the test server', function () {
+ server.on('listening', () => {
+ console.log('Test server listening on port 3000');
+ });
+ });
+
+ grunt.initConfig({
+ pkg: grunt.file.readJSON('package.json'),
+ server: {},
+
+ 'saucelabs-mocha': {
+ all: {
+ options: {
+ urls: [
+ 'http://127.0.0.1:3000/packages/client/browser/index.html'
+ ],
+ browsers: browsers,
+ build: process.env.TRAVIS_JOB_ID,
+ testname: 'feathers-client mocha tests',
+ throttled: 1
+ }
+ }
+ },
+ watch: {}
+ });
+
+ grunt.loadNpmTasks('grunt-saucelabs');
+
+ grunt.registerTask('default', [ 'server', 'saucelabs-mocha' ]);
+};
diff --git a/package.json b/package.json
index 55c2ad0ede..82523f55aa 100644
--- a/package.json
+++ b/package.json
@@ -22,6 +22,7 @@
"install": "lerna bootstrap",
"lint": "semistandard packages/**/*.js --fix",
"test": "npm run lint && nyc lerna run test --ignore generator-**",
+ "test:client": "grunt",
"test:generators": "lerna run test --scope generator-** --stream --concurrency 1"
},
"semistandard": {
@@ -33,6 +34,9 @@
"lerna": "^3.4.0",
"mocha": "^5.2.0",
"nyc": "^13.0.1",
- "semistandard": "^12.0.1"
+ "semistandard": "^12.0.1",
+ "grunt": "^1.0.3",
+ "grunt-cli": "^1.3.1",
+ "grunt-saucelabs": "^9.0.0"
}
}
diff --git a/packages/client/.babelrc b/packages/client/.babelrc
new file mode 100644
index 0000000000..ddafe9d618
--- /dev/null
+++ b/packages/client/.babelrc
@@ -0,0 +1,8 @@
+{
+ "presets": [
+ [
+ "@babel/preset-env",
+ { "loose": true }
+ ]
+ ]
+}
diff --git a/packages/client/.npmignore b/packages/client/.npmignore
new file mode 100644
index 0000000000..d2e82e5d67
--- /dev/null
+++ b/packages/client/.npmignore
@@ -0,0 +1,4 @@
+src/
+test/
+browser/
+!dist/
\ No newline at end of file
diff --git a/packages/client/CHANGELOG.md b/packages/client/CHANGELOG.md
new file mode 100644
index 0000000000..bc2f8be820
--- /dev/null
+++ b/packages/client/CHANGELOG.md
@@ -0,0 +1,735 @@
+# Change Log
+
+## [v3.7.1](https://github.com/feathersjs/client/tree/v3.7.1) (2018-09-21)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.7.0...v3.7.1)
+
+## [v3.7.0](https://github.com/feathersjs/client/tree/v3.7.0) (2018-09-18)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.6.0...v3.7.0)
+
+**Closed issues:**
+
+- Cannot patch multiple items [\#267](https://github.com/feathersjs/client/issues/267)
+
+**Merged pull requests:**
+
+- Update all dependencies and build to Babel 8 [\#294](https://github.com/feathersjs/client/pull/294) ([daffl](https://github.com/daffl))
+- Update uglifyjs-webpack-plugin to the latest version 🚀 [\#287](https://github.com/feathersjs/client/pull/287) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.6.0](https://github.com/feathersjs/client/tree/v3.6.0) (2018-09-03)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.6...v3.6.0)
+
+**Merged pull requests:**
+
+- Update all dependencies [\#285](https://github.com/feathersjs/client/pull/285) ([daffl](https://github.com/daffl))
+- Update all dependencies [\#278](https://github.com/feathersjs/client/pull/278) ([daffl](https://github.com/daffl))
+- Update @feathersjs/errors to the latest version 🚀 [\#272](https://github.com/feathersjs/client/pull/272) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.5.6](https://github.com/feathersjs/client/tree/v3.5.6) (2018-08-13)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.5...v3.5.6)
+
+## [v3.5.5](https://github.com/feathersjs/client/tree/v3.5.5) (2018-08-02)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.4...v3.5.5)
+
+**Closed issues:**
+
+- IE11: TypeError: Object doesn't support property or method 'from' [\#270](https://github.com/feathersjs/client/issues/270)
+
+**Merged pull requests:**
+
+- Update ws to the latest version 🚀 [\#269](https://github.com/feathersjs/client/pull/269) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.5.4](https://github.com/feathersjs/client/tree/v3.5.4) (2018-07-19)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.3...v3.5.4)
+
+**Merged pull requests:**
+
+- Update all dependencies to latest [\#268](https://github.com/feathersjs/client/pull/268) ([daffl](https://github.com/daffl))
+
+## [v3.5.3](https://github.com/feathersjs/client/tree/v3.5.3) (2018-06-28)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.2...v3.5.3)
+
+**Merged pull requests:**
+
+- Update @feathersjs/rest-client to the latest version 🚀 [\#266](https://github.com/feathersjs/client/pull/266) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.5.2](https://github.com/feathersjs/client/tree/v3.5.2) (2018-06-16)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.1...v3.5.2)
+
+**Closed issues:**
+
+- service times out when sending any request to the server, not on localhost [\#264](https://github.com/feathersjs/client/issues/264)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#265](https://github.com/feathersjs/client/pull/265) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update shx to the latest version 🚀 [\#263](https://github.com/feathersjs/client/pull/263) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.5.1](https://github.com/feathersjs/client/tree/v3.5.1) (2018-06-03)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.5.0...v3.5.1)
+
+**Closed issues:**
+
+- 'exports' is undefined [\#261](https://github.com/feathersjs/client/issues/261)
+- I got error from NuxtJS when I use FeathersJS client V3 [\#260](https://github.com/feathersjs/client/issues/260)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#262](https://github.com/feathersjs/client/pull/262) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.5.0](https://github.com/feathersjs/client/tree/v3.5.0) (2018-05-17)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.5...v3.5.0)
+
+**Merged pull requests:**
+
+- Update @feathersjs/rest-client to the latest version 🚀 [\#259](https://github.com/feathersjs/client/pull/259) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.4.5](https://github.com/feathersjs/client/tree/v3.4.5) (2018-05-04)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.4...v3.4.5)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#258](https://github.com/feathersjs/client/pull/258) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.4.4](https://github.com/feathersjs/client/tree/v3.4.4) (2018-03-27)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.3...v3.4.4)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#257](https://github.com/feathersjs/client/pull/257) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/rest-client to the latest version 🚀 [\#256](https://github.com/feathersjs/client/pull/256) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.4.3](https://github.com/feathersjs/client/tree/v3.4.3) (2018-03-07)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.2...v3.4.3)
+
+**Closed issues:**
+
+- Can't capture event on client side [\#253](https://github.com/feathersjs/client/issues/253)
+
+**Merged pull requests:**
+
+- Update ws to the latest version 🚀 [\#255](https://github.com/feathersjs/client/pull/255) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update webpack to the latest version 🚀 [\#254](https://github.com/feathersjs/client/pull/254) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.4.2](https://github.com/feathersjs/client/tree/v3.4.2) (2018-02-16)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.1...v3.4.2)
+
+**Closed issues:**
+
+- Feathers client now working with HTTPS self signed certs [\#250](https://github.com/feathersjs/client/issues/250)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#252](https://github.com/feathersjs/client/pull/252) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/errors to the latest version 🚀 [\#251](https://github.com/feathersjs/client/pull/251) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.4.1](https://github.com/feathersjs/client/tree/v3.4.1) (2018-02-10)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.4.0...v3.4.1)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#249](https://github.com/feathersjs/client/pull/249) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.4.0](https://github.com/feathersjs/client/tree/v3.4.0) (2018-02-09)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.3.2...v3.4.0)
+
+**Merged pull requests:**
+
+- Update @feathersjs/primus-client to the latest version 🚀 [\#248](https://github.com/feathersjs/client/pull/248) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/socketio-client to the latest version 🚀 [\#247](https://github.com/feathersjs/client/pull/247) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.3.2](https://github.com/feathersjs/client/tree/v3.3.2) (2018-02-09)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.3.1...v3.3.2)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#246](https://github.com/feathersjs/client/pull/246) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- delete slack link [\#245](https://github.com/feathersjs/client/pull/245) ([vodniciarv](https://github.com/vodniciarv))
+
+## [v3.3.1](https://github.com/feathersjs/client/tree/v3.3.1) (2018-02-05)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.3.0...v3.3.1)
+
+**Merged pull requests:**
+
+- Update @feathersjs/socketio-client to the latest version 🚀 [\#244](https://github.com/feathersjs/client/pull/244) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/primus-client to the latest version 🚀 [\#243](https://github.com/feathersjs/client/pull/243) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update node-fetch to the latest version 🚀 [\#242](https://github.com/feathersjs/client/pull/242) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.3.0](https://github.com/feathersjs/client/tree/v3.3.0) (2018-01-26)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.2.0...v3.3.0)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#241](https://github.com/feathersjs/client/pull/241) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.2.0](https://github.com/feathersjs/client/tree/v3.2.0) (2018-01-24)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.1.2...v3.2.0)
+
+**Closed issues:**
+
+- Index.d.ts has a lack of return-type annotation [\#238](https://github.com/feathersjs/client/issues/238)
+- feathers rest client call get but server execute find [\#237](https://github.com/feathersjs/client/issues/237)
+- EventEmitter memory leak detected [\#236](https://github.com/feathersjs/client/issues/236)
+
+**Merged pull requests:**
+
+- Update @feathersjs/errors to the latest version 🚀 [\#240](https://github.com/feathersjs/client/pull/240) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update mocha to the latest version 🚀 [\#239](https://github.com/feathersjs/client/pull/239) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update ws to the latest version 🚀 [\#235](https://github.com/feathersjs/client/pull/235) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/feathers to the latest version 🚀 [\#234](https://github.com/feathersjs/client/pull/234) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/rest-client to the latest version 🚀 [\#233](https://github.com/feathersjs/client/pull/233) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/feathers to the latest version 🚀 [\#232](https://github.com/feathersjs/client/pull/232) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/authentication-client to the latest version 🚀 [\#231](https://github.com/feathersjs/client/pull/231) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/socketio-client to the latest version 🚀 [\#230](https://github.com/feathersjs/client/pull/230) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/primus-client to the latest version 🚀 [\#229](https://github.com/feathersjs/client/pull/229) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/errors to the latest version 🚀 [\#228](https://github.com/feathersjs/client/pull/228) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.1.2](https://github.com/feathersjs/client/tree/v3.1.2) (2018-01-02)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.1.1...v3.1.2)
+
+**Closed issues:**
+
+- Socket.io on iOS and Firefox don't work [\#225](https://github.com/feathersjs/client/issues/225)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#227](https://github.com/feathersjs/client/pull/227) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update semistandard to the latest version 🚀 [\#226](https://github.com/feathersjs/client/pull/226) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.1.1](https://github.com/feathersjs/client/tree/v3.1.1) (2017-12-05)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.1.0...v3.1.1)
+
+**Merged pull requests:**
+
+- Update @feathersjs/feathers to the latest version 🚀 [\#224](https://github.com/feathersjs/client/pull/224) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-memory to the latest version 🚀 [\#223](https://github.com/feathersjs/client/pull/223) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/errors to the latest version 🚀 [\#222](https://github.com/feathersjs/client/pull/222) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update @feathersjs/errors to the latest version 🚀 [\#221](https://github.com/feathersjs/client/pull/221) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v3.1.0](https://github.com/feathersjs/client/tree/v3.1.0) (2017-11-16)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.0.0...v3.1.0)
+
+**Merged pull requests:**
+
+- Link client packages directly to builds and update all dependencies [\#219](https://github.com/feathersjs/client/pull/219) ([daffl](https://github.com/daffl))
+- Update @feathersjs/feathers to the latest version 🚀 [\#217](https://github.com/feathersjs/client/pull/217) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update package.json [\#215](https://github.com/feathersjs/client/pull/215) ([frank-dspeed](https://github.com/frank-dspeed))
+
+## [v3.0.0](https://github.com/feathersjs/client/tree/v3.0.0) (2017-11-01)
+[Full Changelog](https://github.com/feathersjs/client/compare/v3.0.0-pre.1...v3.0.0)
+
+**Merged pull requests:**
+
+- Update dependencies for release [\#214](https://github.com/feathersjs/client/pull/214) ([daffl](https://github.com/daffl))
+
+## [v3.0.0-pre.1](https://github.com/feathersjs/client/tree/v3.0.0-pre.1) (2017-10-30)
+[Full Changelog](https://github.com/feathersjs/client/compare/v2.4.0...v3.0.0-pre.1)
+
+**Closed issues:**
+
+- help data - angularjs [\#210](https://github.com/feathersjs/client/issues/210)
+- npm packages are installed even if they already exist when creating a new sequelize mysql service [\#209](https://github.com/feathersjs/client/issues/209)
+- Do you need feathers setup on the server to use feathers on the client? [\#196](https://github.com/feathersjs/client/issues/196)
+- Reorganization of client-side repositories [\#137](https://github.com/feathersjs/client/issues/137)
+
+**Merged pull requests:**
+
+- Upgrade to Feathers v3 \(Buzzard\) and new builds [\#213](https://github.com/feathersjs/client/pull/213) ([daffl](https://github.com/daffl))
+- Update dependencies to enable Greenkeeper 🌴 [\#212](https://github.com/feathersjs/client/pull/212) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-hooks to the latest version 🚀 [\#208](https://github.com/feathersjs/client/pull/208) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers to the latest version 🚀 [\#207](https://github.com/feathersjs/client/pull/207) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update mocha to the latest version 🚀 [\#206](https://github.com/feathersjs/client/pull/206) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- update script src deps example [\#205](https://github.com/feathersjs/client/pull/205) ([crobinson42](https://github.com/crobinson42))
+- Update feathers to the latest version 🚀 [\#204](https://github.com/feathersjs/client/pull/204) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-hooks to the latest version 🚀 [\#203](https://github.com/feathersjs/client/pull/203) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-hooks to the latest version 🚀 [\#202](https://github.com/feathersjs/client/pull/202) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers to the latest version 🚀 [\#201](https://github.com/feathersjs/client/pull/201) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-hooks to the latest version 🚀 [\#200](https://github.com/feathersjs/client/pull/200) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update TypeScript definition for service.patch [\#199](https://github.com/feathersjs/client/pull/199) ([kfatehi](https://github.com/kfatehi))
+- Update feathers-errors to the latest version 🚀 [\#197](https://github.com/feathersjs/client/pull/197) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v2.4.0](https://github.com/feathersjs/client/tree/v2.4.0) (2017-09-02)
+[Full Changelog](https://github.com/feathersjs/client/compare/v2.3.0...v2.4.0)
+
+**Closed issues:**
+
+- Feathers Authentication returning NotFound: Page not found [\#188](https://github.com/feathersjs/client/issues/188)
+- Typescript import build error [\#179](https://github.com/feathersjs/client/issues/179)
+
+**Merged pull requests:**
+
+- Update feathers to the latest version 🚀 [\#195](https://github.com/feathersjs/client/pull/195) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Add default export to TypeScript definition [\#194](https://github.com/feathersjs/client/pull/194) ([jonlambert](https://github.com/jonlambert))
+- Update ws to the latest version 🚀 [\#193](https://github.com/feathersjs/client/pull/193) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-errors to the latest version 🚀 [\#192](https://github.com/feathersjs/client/pull/192) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-errors to the latest version 🚀 [\#191](https://github.com/feathersjs/client/pull/191) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- fix\(package\): update feathers to version 2.1.7 [\#190](https://github.com/feathersjs/client/pull/190) ([daffl](https://github.com/daffl))
+- Update feathers-hooks to the latest version 🚀 [\#187](https://github.com/feathersjs/client/pull/187) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-errors to the latest version 🚀 [\#186](https://github.com/feathersjs/client/pull/186) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v2.3.0](https://github.com/feathersjs/client/tree/v2.3.0) (2017-07-04)
+[Full Changelog](https://github.com/feathersjs/client/compare/v2.2.0...v2.3.0)
+
+**Closed issues:**
+
+- An in-range update of socket.io-client is breaking the build 🚨 [\#181](https://github.com/feathersjs/client/issues/181)
+- Drop socket.io [\#177](https://github.com/feathersjs/client/issues/177)
+- Providing client connection metadata for service event filtering purpose [\#172](https://github.com/feathersjs/client/issues/172)
+- Support offline mode [\#29](https://github.com/feathersjs/client/issues/29)
+
+**Merged pull requests:**
+
+- Update feathers-rest to the latest version 🚀 [\#185](https://github.com/feathersjs/client/pull/185) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-rest to the latest version 🚀 [\#184](https://github.com/feathersjs/client/pull/184) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Remove IE edge again since it does not seem to be running on Saucelabs [\#183](https://github.com/feathersjs/client/pull/183) ([daffl](https://github.com/daffl))
+- Update feathers to the latest version 🚀 [\#182](https://github.com/feathersjs/client/pull/182) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-rest to the latest version 🚀 [\#180](https://github.com/feathersjs/client/pull/180) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-errors to the latest version 🚀 [\#178](https://github.com/feathersjs/client/pull/178) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers to the latest version 🚀 [\#176](https://github.com/feathersjs/client/pull/176) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-primus to the latest version 🚀 [\#175](https://github.com/feathersjs/client/pull/175) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-socketio to the latest version 🚀 [\#173](https://github.com/feathersjs/client/pull/173) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers to the latest version 🚀 [\#171](https://github.com/feathersjs/client/pull/171) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update socket.io-client to the latest version 🚀 [\#170](https://github.com/feathersjs/client/pull/170) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-errors to the latest version 🚀 [\#169](https://github.com/feathersjs/client/pull/169) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-errors to the latest version 🚀 [\#168](https://github.com/feathersjs/client/pull/168) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update feathers-hooks to the latest version 🚀 [\#167](https://github.com/feathersjs/client/pull/167) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Add IE Edge instead of IE 9 [\#166](https://github.com/feathersjs/client/pull/166) ([daffl](https://github.com/daffl))
+
+## [v2.2.0](https://github.com/feathersjs/client/tree/v2.2.0) (2017-04-25)
+[Full Changelog](https://github.com/feathersjs/client/compare/v2.1.0...v2.2.0)
+
+**Merged pull requests:**
+
+- Update feathers-errors to the latest version 🚀 [\#165](https://github.com/feathersjs/client/pull/165) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Add feathers-errors test [\#164](https://github.com/feathersjs/client/pull/164) ([christopherjbaker](https://github.com/christopherjbaker))
+- Update semistandard to the latest version 🚀 [\#163](https://github.com/feathersjs/client/pull/163) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+
+## [v2.1.0](https://github.com/feathersjs/client/tree/v2.1.0) (2017-04-18)
+[Full Changelog](https://github.com/feathersjs/client/compare/v2.0.0...v2.1.0)
+
+**Closed issues:**
+
+- implementation of feathers client in angular-2 [\#135](https://github.com/feathersjs/client/issues/135)
+
+**Merged pull requests:**
+
+- Update feathers-hooks to the latest version 🚀 [\#162](https://github.com/feathersjs/client/pull/162) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Update dependencies to enable Greenkeeper 🌴 [\#161](https://github.com/feathersjs/client/pull/161) ([greenkeeper[bot]](https://github.com/marketplace/greenkeeper))
+- Added generics to typescript definition. [\#158](https://github.com/feathersjs/client/pull/158) ([noah79](https://github.com/noah79))
+
+## [v2.0.0](https://github.com/feathersjs/client/tree/v2.0.0) (2017-04-11)
+[Full Changelog](https://github.com/feathersjs/client/compare/v2.0.0-pre.2...v2.0.0)
+
+**Closed issues:**
+
+- Bundled feathers.js - Socket Authentication with Local Strategy Always Times Out [\#155](https://github.com/feathersjs/client/issues/155)
+
+**Merged pull requests:**
+
+- Update feathers-rest to version 1.7.2 🚀 [\#160](https://github.com/feathersjs/client/pull/160) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v2.0.0-pre.2](https://github.com/feathersjs/client/tree/v2.0.0-pre.2) (2017-03-08)
+[Full Changelog](https://github.com/feathersjs/client/compare/v2.0.0-pre.1...v2.0.0-pre.2)
+
+**Closed issues:**
+
+- Authentication should be removed [\#136](https://github.com/feathersjs/client/issues/136)
+
+**Merged pull requests:**
+
+- Lock package.json versions [\#153](https://github.com/feathersjs/client/pull/153) ([daffl](https://github.com/daffl))
+- Add feathers-errors to the client export [\#152](https://github.com/feathersjs/client/pull/152) ([daffl](https://github.com/daffl))
+- Update feathers to version 2.1.1 🚀 [\#151](https://github.com/feathersjs/client/pull/151) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-socketio to version 1.5.2 🚀 [\#150](https://github.com/feathersjs/client/pull/150) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.8.1 🚀 [\#149](https://github.com/feathersjs/client/pull/149) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-rest to version 1.7.1 🚀 [\#148](https://github.com/feathersjs/client/pull/148) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-socketio to version 1.5.1 🚀 [\#147](https://github.com/feathersjs/client/pull/147) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-socketio to version 1.5.0 🚀 [\#146](https://github.com/feathersjs/client/pull/146) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-rest to version 1.7.0 🚀 [\#145](https://github.com/feathersjs/client/pull/145) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-primus to version 2.1.0 🚀 [\#144](https://github.com/feathersjs/client/pull/144) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.8.0 🚀 [\#143](https://github.com/feathersjs/client/pull/143) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers to version 2.1.0 🚀 [\#142](https://github.com/feathersjs/client/pull/142) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-socketio to version 1.4.3 🚀 [\#141](https://github.com/feathersjs/client/pull/141) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update browserify to version 14.1.0 🚀 [\#140](https://github.com/feathersjs/client/pull/140) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update ws to version 2.0.0 🚀 [\#139](https://github.com/feathersjs/client/pull/139) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v2.0.0-pre.1](https://github.com/feathersjs/client/tree/v2.0.0-pre.1) (2017-01-11)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.9.0...v2.0.0-pre.1)
+
+**Closed issues:**
+
+- Socket.io timeout does nothing when there is JWT token available [\#129](https://github.com/feathersjs/client/issues/129)
+
+**Merged pull requests:**
+
+- Feathers Auth Update [\#131](https://github.com/feathersjs/client/pull/131) ([flyboarder](https://github.com/flyboarder))
+
+## [v1.9.0](https://github.com/feathersjs/client/tree/v1.9.0) (2016-12-31)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.8.0...v1.9.0)
+
+**Closed issues:**
+
+- Typings don't include configure method [\#130](https://github.com/feathersjs/client/issues/130)
+
+**Merged pull requests:**
+
+- Add .configure method to TypeScript definitions [\#134](https://github.com/feathersjs/client/pull/134) ([daffl](https://github.com/daffl))
+- Update feathers-rest to version 1.6.0 🚀 [\#133](https://github.com/feathersjs/client/pull/133) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-rest to version 1.5.3 🚀 [\#132](https://github.com/feathersjs/client/pull/132) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.7.1 🚀 [\#128](https://github.com/feathersjs/client/pull/128) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- socket.io-client@1.7.2 breaks build 🚨 [\#126](https://github.com/feathersjs/client/pull/126) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers to version 2.0.3 🚀 [\#125](https://github.com/feathersjs/client/pull/125) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Typings changes. [\#124](https://github.com/feathersjs/client/pull/124) ([ninachaubal](https://github.com/ninachaubal))
+- Update feathers-primus to version 2.0.0 🚀 [\#123](https://github.com/feathersjs/client/pull/123) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- feathers-commons@0.8.7 breaks build 🚨 [\#122](https://github.com/feathersjs/client/pull/122) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- superagent@3.1.0 breaks build 🚨 [\#121](https://github.com/feathersjs/client/pull/121) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.8.0](https://github.com/feathersjs/client/tree/v1.8.0) (2016-11-26)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.7.2...v1.8.0)
+
+**Closed issues:**
+
+- How to get `hooks` `socketio` etc from `feathers` object [\#118](https://github.com/feathersjs/client/issues/118)
+- send back to server additional fields in 'params' besides 'query' [\#115](https://github.com/feathersjs/client/issues/115)
+
+**Merged pull requests:**
+
+- Update feathers-hooks to version 1.7.0 🚀 [\#120](https://github.com/feathersjs/client/pull/120) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Remove reference to typings/index.d.ts [\#119](https://github.com/feathersjs/client/pull/119) ([ninachaubal](https://github.com/ninachaubal))
+- Update superagent to version 3.0.0 🚀 [\#116](https://github.com/feathersjs/client/pull/116) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Add TypeScript type definitions. [\#114](https://github.com/feathersjs/client/pull/114) ([ninachaubal](https://github.com/ninachaubal))
+- Update feathers-memory to version 1.0.0 🚀 [\#113](https://github.com/feathersjs/client/pull/113) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-authentication to version 0.7.12 🚀 [\#112](https://github.com/feathersjs/client/pull/112) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-commons to version 0.8.0 🚀 [\#111](https://github.com/feathersjs/client/pull/111) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.7.2](https://github.com/feathersjs/client/tree/v1.7.2) (2016-11-08)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.7.1...v1.7.2)
+
+**Merged pull requests:**
+
+- Update feathers-rest to version 1.5.2 🚀 [\#110](https://github.com/feathersjs/client/pull/110) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-socketio to version 1.4.2 🚀 [\#109](https://github.com/feathersjs/client/pull/109) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.7.1](https://github.com/feathersjs/client/tree/v1.7.1) (2016-11-02)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.7.0...v1.7.1)
+
+**Closed issues:**
+
+- Bower: Version mismatch [\#104](https://github.com/feathersjs/client/issues/104)
+
+**Merged pull requests:**
+
+- Update feathers-hooks to version 1.6.1 🚀 [\#108](https://github.com/feathersjs/client/pull/108) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Make sure Bower and NPM version are in sync [\#107](https://github.com/feathersjs/client/pull/107) ([daffl](https://github.com/daffl))
+
+## [v1.7.0](https://github.com/feathersjs/client/tree/v1.7.0) (2016-11-02)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.6.2...v1.7.0)
+
+**Closed issues:**
+
+- How to access feathers-client [\#102](https://github.com/feathersjs/client/issues/102)
+- Set up Saucelabs [\#97](https://github.com/feathersjs/client/issues/97)
+
+**Merged pull requests:**
+
+- 👻😱 Node.js 0.10 is unmaintained 😱👻 [\#106](https://github.com/feathersjs/client/pull/106) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.6.0 🚀 [\#105](https://github.com/feathersjs/client/pull/105) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Change variable naming from "app" to "feathersClient" [\#103](https://github.com/feathersjs/client/pull/103) ([nicoknoll](https://github.com/nicoknoll))
+- jshint —\> semistandard [\#101](https://github.com/feathersjs/client/pull/101) ([corymsmith](https://github.com/corymsmith))
+- Cross browser testing in Saucelabs [\#100](https://github.com/feathersjs/client/pull/100) ([daffl](https://github.com/daffl))
+
+## [v1.6.2](https://github.com/feathersjs/client/tree/v1.6.2) (2016-10-22)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.6.1...v1.6.2)
+
+**Closed issues:**
+
+- Browser Support [\#96](https://github.com/feathersjs/client/issues/96)
+- How to destroy feathers and socketio client? [\#95](https://github.com/feathersjs/client/issues/95)
+- Use tests from feathers-commons [\#26](https://github.com/feathersjs/client/issues/26)
+
+**Merged pull requests:**
+
+- Update feathers-rest to version 1.5.1 🚀 [\#99](https://github.com/feathersjs/client/pull/99) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Use tests from feathers-commons [\#98](https://github.com/feathersjs/client/pull/98) ([daffl](https://github.com/daffl))
+- Update feathers-authentication to version 0.7.11 🚀 [\#92](https://github.com/feathersjs/client/pull/92) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.5.8 🚀 [\#91](https://github.com/feathersjs/client/pull/91) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.6.1](https://github.com/feathersjs/client/tree/v1.6.1) (2016-09-15)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.6.0...v1.6.1)
+
+**Closed issues:**
+
+- documentation on how to build client [\#87](https://github.com/feathersjs/client/issues/87)
+
+**Merged pull requests:**
+
+- Update feathers to version 2.0.2 🚀 [\#90](https://github.com/feathersjs/client/pull/90) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.6.0](https://github.com/feathersjs/client/tree/v1.6.0) (2016-09-09)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.3...v1.6.0)
+
+**Closed issues:**
+
+- How to declare the app in a static way? [\#86](https://github.com/feathersjs/client/issues/86)
+- feathers client and requireJS [\#85](https://github.com/feathersjs/client/issues/85)
+- SocketIO timeout based on service [\#84](https://github.com/feathersjs/client/issues/84)
+
+**Merged pull requests:**
+
+- Update feathers-rest to version 1.5.0 🚀 [\#89](https://github.com/feathersjs/client/pull/89) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-memory to version 0.8.0 🚀 [\#88](https://github.com/feathersjs/client/pull/88) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.5.3](https://github.com/feathersjs/client/tree/v1.5.3) (2016-08-31)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.2...v1.5.3)
+
+**Closed issues:**
+
+- Use of feathers-client with es6 \(JSPM\) [\#78](https://github.com/feathersjs/client/issues/78)
+
+**Merged pull requests:**
+
+- Update feathers-authentication to version 0.7.10 🚀 [\#82](https://github.com/feathersjs/client/pull/82) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.5.7 🚀 [\#77](https://github.com/feathersjs/client/pull/77) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-rest to version 1.4.4 🚀 [\#76](https://github.com/feathersjs/client/pull/76) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.5.6 🚀 [\#75](https://github.com/feathersjs/client/pull/75) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.5.2](https://github.com/feathersjs/client/tree/v1.5.2) (2016-08-12)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.1...v1.5.2)
+
+**Closed issues:**
+
+- \[Question\] Large client-side bundle filesize when requiring feathers client [\#71](https://github.com/feathersjs/client/issues/71)
+
+**Merged pull requests:**
+
+- Update feathers-hooks to version 1.5.5 🚀 [\#73](https://github.com/feathersjs/client/pull/73) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update mocha to version 3.0.0 🚀 [\#72](https://github.com/feathersjs/client/pull/72) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.5.1](https://github.com/feathersjs/client/tree/v1.5.1) (2016-07-14)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.5.0...v1.5.1)
+
+**Merged pull requests:**
+
+- Update feathers-rest to version 1.4.3 🚀 [\#70](https://github.com/feathersjs/client/pull/70) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.5.0](https://github.com/feathersjs/client/tree/v1.5.0) (2016-07-05)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.4.1...v1.5.0)
+
+**Closed issues:**
+
+- Refresh browser [\#68](https://github.com/feathersjs/client/issues/68)
+
+## [v1.4.1](https://github.com/feathersjs/client/tree/v1.4.1) (2016-06-27)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.4.0...v1.4.1)
+
+## [v1.4.0](https://github.com/feathersjs/client/tree/v1.4.0) (2016-06-24)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.3.2...v1.4.0)
+
+**Closed issues:**
+
+- feathers.min.js? [\#64](https://github.com/feathersjs/client/issues/64)
+- Facebook login [\#62](https://github.com/feathersjs/client/issues/62)
+
+**Merged pull requests:**
+
+- Add dist/feathers.min.js [\#65](https://github.com/feathersjs/client/pull/65) ([daffl](https://github.com/daffl))
+- Update feathers-authentication to version 0.7.9 🚀 [\#63](https://github.com/feathersjs/client/pull/63) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.3.2](https://github.com/feathersjs/client/tree/v1.3.2) (2016-06-09)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.3.1...v1.3.2)
+
+**Merged pull requests:**
+
+- Update feathers-authentication to version 0.7.8 🚀 [\#61](https://github.com/feathersjs/client/pull/61) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.3.1](https://github.com/feathersjs/client/tree/v1.3.1) (2016-06-04)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.3.0...v1.3.1)
+
+**Merged pull requests:**
+
+- Update feathers-rest to version 1.4.2 🚀 [\#60](https://github.com/feathersjs/client/pull/60) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.3.0](https://github.com/feathersjs/client/tree/v1.3.0) (2016-05-30)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.2.1...v1.3.0)
+
+**Merged pull requests:**
+
+- Update feathers-rest to version 1.4.1 🚀 [\#59](https://github.com/feathersjs/client/pull/59) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-hooks to version 1.5.4 🚀 [\#57](https://github.com/feathersjs/client/pull/57) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update superagent to version 2.0.0 🚀 [\#56](https://github.com/feathersjs/client/pull/56) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-socketio to version 1.4.1 🚀 [\#53](https://github.com/feathersjs/client/pull/53) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-primus to version 1.4.1 🚀 [\#52](https://github.com/feathersjs/client/pull/52) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.2.1](https://github.com/feathersjs/client/tree/v1.2.1) (2016-05-19)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.2.0...v1.2.1)
+
+**Closed issues:**
+
+- Feathers-client not return correct error object. [\#44](https://github.com/feathersjs/client/issues/44)
+
+**Merged pull requests:**
+
+- Lock versions for Greenkeeper to make a PR for every release [\#50](https://github.com/feathersjs/client/pull/50) ([daffl](https://github.com/daffl))
+- Update babel-plugin-add-module-exports to version 0.2.0 🚀 [\#46](https://github.com/feathersjs/client/pull/46) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.2.0](https://github.com/feathersjs/client/tree/v1.2.0) (2016-04-29)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.1.0...v1.2.0)
+
+**Closed issues:**
+
+- Socket.io timeouts? [\#42](https://github.com/feathersjs/client/issues/42)
+- Add batch support [\#4](https://github.com/feathersjs/client/issues/4)
+
+**Merged pull requests:**
+
+- nsp@2.3.2 breaks build 🚨 [\#41](https://github.com/feathersjs/client/pull/41) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Fixing url for link in readme to feathers-authentication [\#39](https://github.com/feathersjs/client/pull/39) ([xiplias](https://github.com/xiplias))
+- feathers-primus@1.3.3 breaks build 🚨 [\#38](https://github.com/feathersjs/client/pull/38) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- ws@1.1.0 breaks build 🚨 [\#36](https://github.com/feathersjs/client/pull/36) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+- Update feathers-memory to version 0.7.0 🚀 [\#33](https://github.com/feathersjs/client/pull/33) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.1.0](https://github.com/feathersjs/client/tree/v1.1.0) (2016-04-03)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0...v1.1.0)
+
+**Merged pull requests:**
+
+- Update all dependencies 🌴 [\#31](https://github.com/feathersjs/client/pull/31) ([greenkeeperio-bot](https://github.com/greenkeeperio-bot))
+
+## [v1.0.0](https://github.com/feathersjs/client/tree/v1.0.0) (2016-03-14)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0-pre.3...v1.0.0)
+
+**Merged pull requests:**
+
+- Use a gcc version that can build bcrypt [\#30](https://github.com/feathersjs/client/pull/30) ([daffl](https://github.com/daffl))
+
+## [v1.0.0-pre.3](https://github.com/feathersjs/client/tree/v1.0.0-pre.3) (2016-03-14)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0-pre.2...v1.0.0-pre.3)
+
+## [v1.0.0-pre.2](https://github.com/feathersjs/client/tree/v1.0.0-pre.2) (2016-03-04)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.3...v1.0.0-pre.2)
+
+**Closed issues:**
+
+- Can't get $regex to work in find function with feathers-nedb in the background [\#28](https://github.com/feathersjs/client/issues/28)
+- feathers.fetch is undefined [\#27](https://github.com/feathersjs/client/issues/27)
+- Add documentation for using in React Native [\#10](https://github.com/feathersjs/client/issues/10)
+
+## [v0.5.3](https://github.com/feathersjs/client/tree/v0.5.3) (2016-02-12)
+[Full Changelog](https://github.com/feathersjs/client/compare/v1.0.0-pre.1...v0.5.3)
+
+## [v1.0.0-pre.1](https://github.com/feathersjs/client/tree/v1.0.0-pre.1) (2016-02-11)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.2...v1.0.0-pre.1)
+
+## [v0.5.2](https://github.com/feathersjs/client/tree/v0.5.2) (2016-02-09)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.1...v0.5.2)
+
+**Merged pull requests:**
+
+- Universal feathers [\#25](https://github.com/feathersjs/client/pull/25) ([daffl](https://github.com/daffl))
+- Adding nsp check [\#24](https://github.com/feathersjs/client/pull/24) ([marshallswain](https://github.com/marshallswain))
+
+## [v0.5.1](https://github.com/feathersjs/client/tree/v0.5.1) (2016-01-15)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.5.0...v0.5.1)
+
+**Closed issues:**
+
+- REST base.js missing ${options.base} leads to broken relative url [\#21](https://github.com/feathersjs/client/issues/21)
+- Add hook support [\#20](https://github.com/feathersjs/client/issues/20)
+- $sort does not work for find\(\) [\#19](https://github.com/feathersjs/client/issues/19)
+
+**Merged pull requests:**
+
+- fix issue \#21 [\#22](https://github.com/feathersjs/client/pull/22) ([wuyuanyi135](https://github.com/wuyuanyi135))
+
+## [v0.5.0](https://github.com/feathersjs/client/tree/v0.5.0) (2016-01-05)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.4.0...v0.5.0)
+
+**Closed issues:**
+
+- how to use in typescript [\#17](https://github.com/feathersjs/client/issues/17)
+
+**Merged pull requests:**
+
+- Added fetch support [\#18](https://github.com/feathersjs/client/pull/18) ([corymsmith](https://github.com/corymsmith))
+- Adding events and querystring dependencies. [\#16](https://github.com/feathersjs/client/pull/16) ([marshallswain](https://github.com/marshallswain))
+
+## [v0.4.0](https://github.com/feathersjs/client/tree/v0.4.0) (2015-12-11)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.3...v0.4.0)
+
+**Fixed bugs:**
+
+- Importing in ES6 is broken [\#14](https://github.com/feathersjs/client/issues/14)
+
+**Closed issues:**
+
+- .babelrc messes with react-native [\#15](https://github.com/feathersjs/client/issues/15)
+
+## [v0.3.3](https://github.com/feathersjs/client/tree/v0.3.3) (2015-11-27)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.2...v0.3.3)
+
+**Closed issues:**
+
+- npm package is broken. [\#12](https://github.com/feathersjs/client/issues/12)
+
+**Merged pull requests:**
+
+- Fix es6 build and add Steal compatibility. [\#13](https://github.com/feathersjs/client/pull/13) ([marshallswain](https://github.com/marshallswain))
+
+## [v0.3.2](https://github.com/feathersjs/client/tree/v0.3.2) (2015-11-26)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.1...v0.3.2)
+
+**Closed issues:**
+
+- Update lodash [\#11](https://github.com/feathersjs/client/issues/11)
+
+## [v0.3.1](https://github.com/feathersjs/client/tree/v0.3.1) (2015-11-26)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.3.0...v0.3.1)
+
+**Closed issues:**
+
+- Working with can-connect [\#8](https://github.com/feathersjs/client/issues/8)
+
+## [v0.3.0](https://github.com/feathersjs/client/tree/v0.3.0) (2015-11-15)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.2.1...v0.3.0)
+
+**Closed issues:**
+
+- Use Promises [\#7](https://github.com/feathersjs/client/issues/7)
+
+**Merged pull requests:**
+
+- Migration to ES6 and using Promises [\#9](https://github.com/feathersjs/client/pull/9) ([daffl](https://github.com/daffl))
+
+## [v0.2.1](https://github.com/feathersjs/client/tree/v0.2.1) (2015-10-06)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.2.0...v0.2.1)
+
+**Merged pull requests:**
+
+- Make client depend on feathers-commons, remove arguments.js [\#6](https://github.com/feathersjs/client/pull/6) ([daffl](https://github.com/daffl))
+
+## [v0.2.0](https://github.com/feathersjs/client/tree/v0.2.0) (2015-07-18)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.3...v0.2.0)
+
+## [v0.1.3](https://github.com/feathersjs/client/tree/v0.1.3) (2015-07-06)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.2...v0.1.3)
+
+**Merged pull requests:**
+
+- Fixing requires and missing deps. [\#5](https://github.com/feathersjs/client/pull/5) ([marshallswain](https://github.com/marshallswain))
+
+## [v0.1.2](https://github.com/feathersjs/client/tree/v0.1.2) (2015-06-22)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.1...v0.1.2)
+
+**Closed issues:**
+
+- Publish to NPM and Bower [\#1](https://github.com/feathersjs/client/issues/1)
+
+## [v0.1.1](https://github.com/feathersjs/client/tree/v0.1.1) (2015-06-21)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.0.1...v0.1.1)
+
+## [v0.0.1](https://github.com/feathersjs/client/tree/v0.0.1) (2015-06-21)
+[Full Changelog](https://github.com/feathersjs/client/compare/v0.1.0...v0.0.1)
+
+## [v0.1.0](https://github.com/feathersjs/client/tree/v0.1.0) (2015-06-06)
+
+
+\* *This Change Log was automatically generated by [github_changelog_generator](https://github.com/skywinder/Github-Changelog-Generator)*
\ No newline at end of file
diff --git a/packages/client/LICENSE b/packages/client/LICENSE
new file mode 100644
index 0000000000..40b7881afa
--- /dev/null
+++ b/packages/client/LICENSE
@@ -0,0 +1,22 @@
+The MIT License (MIT)
+
+Copyright (c) 2015 Feathers
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
+
diff --git a/packages/client/README.md b/packages/client/README.md
new file mode 100644
index 0000000000..d6a31203e8
--- /dev/null
+++ b/packages/client/README.md
@@ -0,0 +1,51 @@
+# @feathersjs/client
+
+[![Greenkeeper badge](https://badges.greenkeeper.io/feathersjs/client.svg)](https://greenkeeper.io/)
+
+[![Build Status](https://travis-ci.org/feathersjs/client.png?branch=master)](https://travis-ci.org/feathersjs/client)
+[![Dependency Status](https://img.shields.io/david/feathersjs/client.svg?style=flat-square)](https://david-dm.org/feathersjs/client)
+[![Download Status](https://img.shields.io/npm/dm/@feathersjs/client.svg?style=flat-square)](https://www.npmjs.com/package/@feathersjs/client)
+
+[![Sauce Test Status](https://saucelabs.com/browser-matrix/feathersjs.svg)](https://saucelabs.com/u/feathersjs)
+
+> A client for Feathers services supporting many different transport libraries.
+
+## About
+
+While Feathers and its modules can be used on the client with an NPM compatible module loader like [Browserify](http://browserify.org/), [Webpack](https://webpack.github.io/) or [StealJS](http://stealjs.com), `@feathersjs/client` consolidates a standard set of client plugins into a single distributable that can be used standalone in the browser or with other module loaders (like [RequireJS](http://requirejs.org/)) that don't support NPM. The following modules are included:
+
+- [@feathersjs/feathers](https://github.com/feathersjs/feathers) as `feathers` (or the default module export)
+- [@feathersjs/errors](https://github.com/feathersjs/errors) as `feathers.errors`
+- [@feathersjs/rest-client](https://github.com/feathersjs/rest-client) as `feathers.rest`
+- [@feathersjs/socketio-client](https://github.com/feathersjs/socketio-client) as `feathers.socketio`
+- [@feathers/primus-client](https://github.com/feathersjs/primus-client) as `feathers.primus`
+- [@feathersjs/authentication-client](https://github.com/feathersjs/authentication-client) as `feathers.authentication`
+
+In the browser a client that connects to the local server via websockets can be initialized like this:
+
+```html
+
+
+
+```
+
+For the full documentation see [the Feathers documentation](http://docs.feathersjs.com/clients/feathers.html).
+
+## License
+
+Copyright (c) 2018 [Feathers contributors](https://github.com/feathersjs/client/graphs/contributors)
+
+Licensed under the [MIT license](LICENSE).
diff --git a/packages/client/authentication.js b/packages/client/authentication.js
new file mode 100644
index 0000000000..0a7437e645
--- /dev/null
+++ b/packages/client/authentication.js
@@ -0,0 +1 @@
+module.exports = require('./dist/authentication');
\ No newline at end of file
diff --git a/packages/client/browser/index.html b/packages/client/browser/index.html
new file mode 100644
index 0000000000..c10b1fae0b
--- /dev/null
+++ b/packages/client/browser/index.html
@@ -0,0 +1,51 @@
+
+
+
+ Mocha
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/packages/client/browser/test.dist.js b/packages/client/browser/test.dist.js
new file mode 100644
index 0000000000..2f24ac3806
--- /dev/null
+++ b/packages/client/browser/test.dist.js
@@ -0,0 +1,1617 @@
+/******/ (function(modules) { // webpackBootstrap
+/******/ // The module cache
+/******/ var installedModules = {};
+/******/
+/******/ // The require function
+/******/ function __webpack_require__(moduleId) {
+/******/
+/******/ // Check if module is in cache
+/******/ if(installedModules[moduleId]) {
+/******/ return installedModules[moduleId].exports;
+/******/ }
+/******/ // Create a new module (and put it into the cache)
+/******/ var module = installedModules[moduleId] = {
+/******/ i: moduleId,
+/******/ l: false,
+/******/ exports: {}
+/******/ };
+/******/
+/******/ // Execute the module function
+/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
+/******/
+/******/ // Flag the module as loaded
+/******/ module.l = true;
+/******/
+/******/ // Return the exports of the module
+/******/ return module.exports;
+/******/ }
+/******/
+/******/
+/******/ // expose the modules object (__webpack_modules__)
+/******/ __webpack_require__.m = modules;
+/******/
+/******/ // expose the module cache
+/******/ __webpack_require__.c = installedModules;
+/******/
+/******/ // define getter function for harmony exports
+/******/ __webpack_require__.d = function(exports, name, getter) {
+/******/ if(!__webpack_require__.o(exports, name)) {
+/******/ Object.defineProperty(exports, name, {
+/******/ configurable: false,
+/******/ enumerable: true,
+/******/ get: getter
+/******/ });
+/******/ }
+/******/ };
+/******/
+/******/ // getDefaultExport function for compatibility with non-harmony modules
+/******/ __webpack_require__.n = function(module) {
+/******/ var getter = module && module.__esModule ?
+/******/ function getDefault() { return module['default']; } :
+/******/ function getModuleExports() { return module; };
+/******/ __webpack_require__.d(getter, 'a', getter);
+/******/ return getter;
+/******/ };
+/******/
+/******/ // Object.prototype.hasOwnProperty.call
+/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
+/******/
+/******/ // __webpack_public_path__
+/******/ __webpack_require__.p = "";
+/******/
+/******/ // Load entry module and return exports
+/******/ return __webpack_require__(__webpack_require__.s = 2);
+/******/ })
+/************************************************************************/
+/******/ ([
+/* 0 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+/* WEBPACK VAR INJECTION */(function(global) {
+
+// compare and isBuffer taken from https://github.com/feross/buffer/blob/680e9e5e488f22aac27599a57dc844a6315928dd/index.js
+// original notice:
+
+/*!
+ * The buffer module from node.js, for the browser.
+ *
+ * @author Feross Aboukhadijeh
+ * @license MIT
+ */
+function compare(a, b) {
+ if (a === b) {
+ return 0;
+ }
+
+ var x = a.length;
+ var y = b.length;
+
+ for (var i = 0, len = Math.min(x, y); i < len; ++i) {
+ if (a[i] !== b[i]) {
+ x = a[i];
+ y = b[i];
+ break;
+ }
+ }
+
+ if (x < y) {
+ return -1;
+ }
+ if (y < x) {
+ return 1;
+ }
+ return 0;
+}
+function isBuffer(b) {
+ if (global.Buffer && typeof global.Buffer.isBuffer === 'function') {
+ return global.Buffer.isBuffer(b);
+ }
+ return !!(b != null && b._isBuffer);
+}
+
+// based on node assert, original notice:
+
+// http://wiki.commonjs.org/wiki/Unit_Testing/1.0
+//
+// THIS IS NOT TESTED NOR LIKELY TO WORK OUTSIDE V8!
+//
+// Originally from narwhal.js (http://narwhaljs.org)
+// Copyright (c) 2009 Thomas Robinson <280north.com>
+//
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the 'Software'), to
+// deal in the Software without restriction, including without limitation the
+// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
+// sell copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+//
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
+// ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var util = __webpack_require__(3);
+var hasOwn = Object.prototype.hasOwnProperty;
+var pSlice = Array.prototype.slice;
+var functionsHaveNames = (function () {
+ return function foo() {}.name === 'foo';
+}());
+function pToString (obj) {
+ return Object.prototype.toString.call(obj);
+}
+function isView(arrbuf) {
+ if (isBuffer(arrbuf)) {
+ return false;
+ }
+ if (typeof global.ArrayBuffer !== 'function') {
+ return false;
+ }
+ if (typeof ArrayBuffer.isView === 'function') {
+ return ArrayBuffer.isView(arrbuf);
+ }
+ if (!arrbuf) {
+ return false;
+ }
+ if (arrbuf instanceof DataView) {
+ return true;
+ }
+ if (arrbuf.buffer && arrbuf.buffer instanceof ArrayBuffer) {
+ return true;
+ }
+ return false;
+}
+// 1. The assert module provides functions that throw
+// AssertionError's when particular conditions are not met. The
+// assert module must conform to the following interface.
+
+var assert = module.exports = ok;
+
+// 2. The AssertionError is defined in assert.
+// new assert.AssertionError({ message: message,
+// actual: actual,
+// expected: expected })
+
+var regex = /\s*function\s+([^\(\s]*)\s*/;
+// based on https://github.com/ljharb/function.prototype.name/blob/adeeeec8bfcc6068b187d7d9fb3d5bb1d3a30899/implementation.js
+function getName(func) {
+ if (!util.isFunction(func)) {
+ return;
+ }
+ if (functionsHaveNames) {
+ return func.name;
+ }
+ var str = func.toString();
+ var match = str.match(regex);
+ return match && match[1];
+}
+assert.AssertionError = function AssertionError(options) {
+ this.name = 'AssertionError';
+ this.actual = options.actual;
+ this.expected = options.expected;
+ this.operator = options.operator;
+ if (options.message) {
+ this.message = options.message;
+ this.generatedMessage = false;
+ } else {
+ this.message = getMessage(this);
+ this.generatedMessage = true;
+ }
+ var stackStartFunction = options.stackStartFunction || fail;
+ if (Error.captureStackTrace) {
+ Error.captureStackTrace(this, stackStartFunction);
+ } else {
+ // non v8 browsers so we can have a stacktrace
+ var err = new Error();
+ if (err.stack) {
+ var out = err.stack;
+
+ // try to strip useless frames
+ var fn_name = getName(stackStartFunction);
+ var idx = out.indexOf('\n' + fn_name);
+ if (idx >= 0) {
+ // once we have located the function frame
+ // we need to strip out everything before it (and its line)
+ var next_line = out.indexOf('\n', idx + 1);
+ out = out.substring(next_line + 1);
+ }
+
+ this.stack = out;
+ }
+ }
+};
+
+// assert.AssertionError instanceof Error
+util.inherits(assert.AssertionError, Error);
+
+function truncate(s, n) {
+ if (typeof s === 'string') {
+ return s.length < n ? s : s.slice(0, n);
+ } else {
+ return s;
+ }
+}
+function inspect(something) {
+ if (functionsHaveNames || !util.isFunction(something)) {
+ return util.inspect(something);
+ }
+ var rawname = getName(something);
+ var name = rawname ? ': ' + rawname : '';
+ return '[Function' + name + ']';
+}
+function getMessage(self) {
+ return truncate(inspect(self.actual), 128) + ' ' +
+ self.operator + ' ' +
+ truncate(inspect(self.expected), 128);
+}
+
+// At present only the three keys mentioned above are used and
+// understood by the spec. Implementations or sub modules can pass
+// other keys to the AssertionError's constructor - they will be
+// ignored.
+
+// 3. All of the following functions must throw an AssertionError
+// when a corresponding condition is not met, with a message that
+// may be undefined if not provided. All assertion methods provide
+// both the actual and expected values to the assertion error for
+// display purposes.
+
+function fail(actual, expected, message, operator, stackStartFunction) {
+ throw new assert.AssertionError({
+ message: message,
+ actual: actual,
+ expected: expected,
+ operator: operator,
+ stackStartFunction: stackStartFunction
+ });
+}
+
+// EXTENSION! allows for well behaved errors defined elsewhere.
+assert.fail = fail;
+
+// 4. Pure assertion tests whether a value is truthy, as determined
+// by !!guard.
+// assert.ok(guard, message_opt);
+// This statement is equivalent to assert.equal(true, !!guard,
+// message_opt);. To test strictly for the value true, use
+// assert.strictEqual(true, guard, message_opt);.
+
+function ok(value, message) {
+ if (!value) fail(value, true, message, '==', assert.ok);
+}
+assert.ok = ok;
+
+// 5. The equality assertion tests shallow, coercive equality with
+// ==.
+// assert.equal(actual, expected, message_opt);
+
+assert.equal = function equal(actual, expected, message) {
+ if (actual != expected) fail(actual, expected, message, '==', assert.equal);
+};
+
+// 6. The non-equality assertion tests for whether two objects are not equal
+// with != assert.notEqual(actual, expected, message_opt);
+
+assert.notEqual = function notEqual(actual, expected, message) {
+ if (actual == expected) {
+ fail(actual, expected, message, '!=', assert.notEqual);
+ }
+};
+
+// 7. The equivalence assertion tests a deep equality relation.
+// assert.deepEqual(actual, expected, message_opt);
+
+assert.deepEqual = function deepEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected, false)) {
+ fail(actual, expected, message, 'deepEqual', assert.deepEqual);
+ }
+};
+
+assert.deepStrictEqual = function deepStrictEqual(actual, expected, message) {
+ if (!_deepEqual(actual, expected, true)) {
+ fail(actual, expected, message, 'deepStrictEqual', assert.deepStrictEqual);
+ }
+};
+
+function _deepEqual(actual, expected, strict, memos) {
+ // 7.1. All identical values are equivalent, as determined by ===.
+ if (actual === expected) {
+ return true;
+ } else if (isBuffer(actual) && isBuffer(expected)) {
+ return compare(actual, expected) === 0;
+
+ // 7.2. If the expected value is a Date object, the actual value is
+ // equivalent if it is also a Date object that refers to the same time.
+ } else if (util.isDate(actual) && util.isDate(expected)) {
+ return actual.getTime() === expected.getTime();
+
+ // 7.3 If the expected value is a RegExp object, the actual value is
+ // equivalent if it is also a RegExp object with the same source and
+ // properties (`global`, `multiline`, `lastIndex`, `ignoreCase`).
+ } else if (util.isRegExp(actual) && util.isRegExp(expected)) {
+ return actual.source === expected.source &&
+ actual.global === expected.global &&
+ actual.multiline === expected.multiline &&
+ actual.lastIndex === expected.lastIndex &&
+ actual.ignoreCase === expected.ignoreCase;
+
+ // 7.4. Other pairs that do not both pass typeof value == 'object',
+ // equivalence is determined by ==.
+ } else if ((actual === null || typeof actual !== 'object') &&
+ (expected === null || typeof expected !== 'object')) {
+ return strict ? actual === expected : actual == expected;
+
+ // If both values are instances of typed arrays, wrap their underlying
+ // ArrayBuffers in a Buffer each to increase performance
+ // This optimization requires the arrays to have the same type as checked by
+ // Object.prototype.toString (aka pToString). Never perform binary
+ // comparisons for Float*Arrays, though, since e.g. +0 === -0 but their
+ // bit patterns are not identical.
+ } else if (isView(actual) && isView(expected) &&
+ pToString(actual) === pToString(expected) &&
+ !(actual instanceof Float32Array ||
+ actual instanceof Float64Array)) {
+ return compare(new Uint8Array(actual.buffer),
+ new Uint8Array(expected.buffer)) === 0;
+
+ // 7.5 For all other Object pairs, including Array objects, equivalence is
+ // determined by having the same number of owned properties (as verified
+ // with Object.prototype.hasOwnProperty.call), the same set of keys
+ // (although not necessarily the same order), equivalent values for every
+ // corresponding key, and an identical 'prototype' property. Note: this
+ // accounts for both named and indexed properties on Arrays.
+ } else if (isBuffer(actual) !== isBuffer(expected)) {
+ return false;
+ } else {
+ memos = memos || {actual: [], expected: []};
+
+ var actualIndex = memos.actual.indexOf(actual);
+ if (actualIndex !== -1) {
+ if (actualIndex === memos.expected.indexOf(expected)) {
+ return true;
+ }
+ }
+
+ memos.actual.push(actual);
+ memos.expected.push(expected);
+
+ return objEquiv(actual, expected, strict, memos);
+ }
+}
+
+function isArguments(object) {
+ return Object.prototype.toString.call(object) == '[object Arguments]';
+}
+
+function objEquiv(a, b, strict, actualVisitedObjects) {
+ if (a === null || a === undefined || b === null || b === undefined)
+ return false;
+ // if one is a primitive, the other must be same
+ if (util.isPrimitive(a) || util.isPrimitive(b))
+ return a === b;
+ if (strict && Object.getPrototypeOf(a) !== Object.getPrototypeOf(b))
+ return false;
+ var aIsArgs = isArguments(a);
+ var bIsArgs = isArguments(b);
+ if ((aIsArgs && !bIsArgs) || (!aIsArgs && bIsArgs))
+ return false;
+ if (aIsArgs) {
+ a = pSlice.call(a);
+ b = pSlice.call(b);
+ return _deepEqual(a, b, strict);
+ }
+ var ka = objectKeys(a);
+ var kb = objectKeys(b);
+ var key, i;
+ // having the same number of owned properties (keys incorporates
+ // hasOwnProperty)
+ if (ka.length !== kb.length)
+ return false;
+ //the same set of keys (although not necessarily the same order),
+ ka.sort();
+ kb.sort();
+ //~~~cheap key test
+ for (i = ka.length - 1; i >= 0; i--) {
+ if (ka[i] !== kb[i])
+ return false;
+ }
+ //equivalent values for every corresponding key, and
+ //~~~possibly expensive deep test
+ for (i = ka.length - 1; i >= 0; i--) {
+ key = ka[i];
+ if (!_deepEqual(a[key], b[key], strict, actualVisitedObjects))
+ return false;
+ }
+ return true;
+}
+
+// 8. The non-equivalence assertion tests for any deep inequality.
+// assert.notDeepEqual(actual, expected, message_opt);
+
+assert.notDeepEqual = function notDeepEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected, false)) {
+ fail(actual, expected, message, 'notDeepEqual', assert.notDeepEqual);
+ }
+};
+
+assert.notDeepStrictEqual = notDeepStrictEqual;
+function notDeepStrictEqual(actual, expected, message) {
+ if (_deepEqual(actual, expected, true)) {
+ fail(actual, expected, message, 'notDeepStrictEqual', notDeepStrictEqual);
+ }
+}
+
+
+// 9. The strict equality assertion tests strict equality, as determined by ===.
+// assert.strictEqual(actual, expected, message_opt);
+
+assert.strictEqual = function strictEqual(actual, expected, message) {
+ if (actual !== expected) {
+ fail(actual, expected, message, '===', assert.strictEqual);
+ }
+};
+
+// 10. The strict non-equality assertion tests for strict inequality, as
+// determined by !==. assert.notStrictEqual(actual, expected, message_opt);
+
+assert.notStrictEqual = function notStrictEqual(actual, expected, message) {
+ if (actual === expected) {
+ fail(actual, expected, message, '!==', assert.notStrictEqual);
+ }
+};
+
+function expectedException(actual, expected) {
+ if (!actual || !expected) {
+ return false;
+ }
+
+ if (Object.prototype.toString.call(expected) == '[object RegExp]') {
+ return expected.test(actual);
+ }
+
+ try {
+ if (actual instanceof expected) {
+ return true;
+ }
+ } catch (e) {
+ // Ignore. The instanceof check doesn't work for arrow functions.
+ }
+
+ if (Error.isPrototypeOf(expected)) {
+ return false;
+ }
+
+ return expected.call({}, actual) === true;
+}
+
+function _tryBlock(block) {
+ var error;
+ try {
+ block();
+ } catch (e) {
+ error = e;
+ }
+ return error;
+}
+
+function _throws(shouldThrow, block, expected, message) {
+ var actual;
+
+ if (typeof block !== 'function') {
+ throw new TypeError('"block" argument must be a function');
+ }
+
+ if (typeof expected === 'string') {
+ message = expected;
+ expected = null;
+ }
+
+ actual = _tryBlock(block);
+
+ message = (expected && expected.name ? ' (' + expected.name + ').' : '.') +
+ (message ? ' ' + message : '.');
+
+ if (shouldThrow && !actual) {
+ fail(actual, expected, 'Missing expected exception' + message);
+ }
+
+ var userProvidedMessage = typeof message === 'string';
+ var isUnwantedException = !shouldThrow && util.isError(actual);
+ var isUnexpectedException = !shouldThrow && actual && !expected;
+
+ if ((isUnwantedException &&
+ userProvidedMessage &&
+ expectedException(actual, expected)) ||
+ isUnexpectedException) {
+ fail(actual, expected, 'Got unwanted exception' + message);
+ }
+
+ if ((shouldThrow && actual && expected &&
+ !expectedException(actual, expected)) || (!shouldThrow && actual)) {
+ throw actual;
+ }
+}
+
+// 11. Expected to throw an error:
+// assert.throws(block, Error_opt, message_opt);
+
+assert.throws = function(block, /*optional*/error, /*optional*/message) {
+ _throws(true, block, error, message);
+};
+
+// EXTENSION! This is annoying to write outside this module.
+assert.doesNotThrow = function(block, /*optional*/error, /*optional*/message) {
+ _throws(false, block, error, message);
+};
+
+assert.ifError = function(err) { if (err) throw err; };
+
+var objectKeys = Object.keys || function (obj) {
+ var keys = [];
+ for (var key in obj) {
+ if (hasOwn.call(obj, key)) keys.push(key);
+ }
+ return keys;
+};
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1)))
+
+/***/ }),
+/* 1 */
+/***/ (function(module, exports) {
+
+var g;
+
+// This works in non-strict mode
+g = (function() {
+ return this;
+})();
+
+try {
+ // This works if eval is allowed (see CSP)
+ g = g || Function("return this")() || (1,eval)("this");
+} catch(e) {
+ // This works if the window reference is available
+ if(typeof window === "object")
+ g = window;
+}
+
+// g can still be undefined, but nothing to do about it...
+// We return undefined, instead of nothing here, so it's
+// easier to handle this case. if(!global) { ...}
+
+module.exports = g;
+
+
+/***/ }),
+/* 2 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+var assert = __webpack_require__(0);
+var baseTests = __webpack_require__(7);
+
+var feathers = window.feathers;
+var socket = window.io();
+
+describe('Universal Feathers client browser tests', function () {
+ var app = feathers().configure(feathers.socketio(socket)).use('/myservice', {
+ get: function get(id) {
+ return Promise.resolve({
+ id: id, description: 'You have to do ' + id + '!'
+ });
+ },
+ create: function create(data) {
+ return Promise.resolve(data);
+ }
+ });
+
+ app.service('myservice').hooks({
+ before: {
+ create: function create(hook) {
+ hook.data.hook = true;
+ }
+ },
+ after: {
+ get: function get(hook) {
+ hook.result.ran = true;
+ }
+ }
+ });
+
+ after(function () {
+ return app.service('todos').remove(null);
+ });
+
+ baseTests(app, 'todos');
+
+ describe('Client side hooks and services', function () {
+ it('initialized myservice and works with hooks', function (done) {
+ app.service('myservice').get('dishes').then(function (todo) {
+ assert.deepEqual(todo, {
+ id: 'dishes',
+ description: 'You have to do dishes!',
+ ran: true
+ });
+ done();
+ }).catch(done);
+ });
+
+ it('create and event with hook', function (done) {
+ var myservice = app.service('myservice');
+
+ myservice.once('created', function (data) {
+ assert.deepEqual(data, {
+ description: 'Test todo',
+ hook: true
+ });
+ done();
+ });
+
+ myservice.create({ description: 'Test todo' });
+ });
+
+ describe('Feathers Errors', function () {
+ describe('successful error creation', function () {
+ describe('without custom message', function () {
+ it('default error', function () {
+ var error = new feathers.errors.GeneralError();
+ assert.equal(error.code, 500);
+ assert.equal(error.message, 'Error');
+ assert.equal(error.className, 'general-error');
+ assert.equal(error instanceof feathers.errors.GeneralError, true);
+ assert.equal(error instanceof feathers.errors.FeathersError, true);
+ });
+ });
+ });
+ });
+ });
+});
+
+/***/ }),
+/* 3 */
+/***/ (function(module, exports, __webpack_require__) {
+
+/* WEBPACK VAR INJECTION */(function(global, process) {// Copyright Joyent, Inc. and other Node contributors.
+//
+// Permission is hereby granted, free of charge, to any person obtaining a
+// copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to permit
+// persons to whom the Software is furnished to do so, subject to the
+// following conditions:
+//
+// The above copyright notice and this permission notice shall be included
+// in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
+// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
+// USE OR OTHER DEALINGS IN THE SOFTWARE.
+
+var formatRegExp = /%[sdj%]/g;
+exports.format = function(f) {
+ if (!isString(f)) {
+ var objects = [];
+ for (var i = 0; i < arguments.length; i++) {
+ objects.push(inspect(arguments[i]));
+ }
+ return objects.join(' ');
+ }
+
+ var i = 1;
+ var args = arguments;
+ var len = args.length;
+ var str = String(f).replace(formatRegExp, function(x) {
+ if (x === '%%') return '%';
+ if (i >= len) return x;
+ switch (x) {
+ case '%s': return String(args[i++]);
+ case '%d': return Number(args[i++]);
+ case '%j':
+ try {
+ return JSON.stringify(args[i++]);
+ } catch (_) {
+ return '[Circular]';
+ }
+ default:
+ return x;
+ }
+ });
+ for (var x = args[i]; i < len; x = args[++i]) {
+ if (isNull(x) || !isObject(x)) {
+ str += ' ' + x;
+ } else {
+ str += ' ' + inspect(x);
+ }
+ }
+ return str;
+};
+
+
+// Mark that a method should not be used.
+// Returns a modified function which warns once by default.
+// If --no-deprecation is set, then it is a no-op.
+exports.deprecate = function(fn, msg) {
+ // Allow for deprecating things in the process of starting up.
+ if (isUndefined(global.process)) {
+ return function() {
+ return exports.deprecate(fn, msg).apply(this, arguments);
+ };
+ }
+
+ if (process.noDeprecation === true) {
+ return fn;
+ }
+
+ var warned = false;
+ function deprecated() {
+ if (!warned) {
+ if (process.throwDeprecation) {
+ throw new Error(msg);
+ } else if (process.traceDeprecation) {
+ console.trace(msg);
+ } else {
+ console.error(msg);
+ }
+ warned = true;
+ }
+ return fn.apply(this, arguments);
+ }
+
+ return deprecated;
+};
+
+
+var debugs = {};
+var debugEnviron;
+exports.debuglog = function(set) {
+ if (isUndefined(debugEnviron))
+ debugEnviron = process.env.NODE_DEBUG || '';
+ set = set.toUpperCase();
+ if (!debugs[set]) {
+ if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) {
+ var pid = process.pid;
+ debugs[set] = function() {
+ var msg = exports.format.apply(exports, arguments);
+ console.error('%s %d: %s', set, pid, msg);
+ };
+ } else {
+ debugs[set] = function() {};
+ }
+ }
+ return debugs[set];
+};
+
+
+/**
+ * Echos the value of a value. Trys to print the value out
+ * in the best way possible given the different types.
+ *
+ * @param {Object} obj The object to print out.
+ * @param {Object} opts Optional options object that alters the output.
+ */
+/* legacy: obj, showHidden, depth, colors*/
+function inspect(obj, opts) {
+ // default options
+ var ctx = {
+ seen: [],
+ stylize: stylizeNoColor
+ };
+ // legacy...
+ if (arguments.length >= 3) ctx.depth = arguments[2];
+ if (arguments.length >= 4) ctx.colors = arguments[3];
+ if (isBoolean(opts)) {
+ // legacy...
+ ctx.showHidden = opts;
+ } else if (opts) {
+ // got an "options" object
+ exports._extend(ctx, opts);
+ }
+ // set default options
+ if (isUndefined(ctx.showHidden)) ctx.showHidden = false;
+ if (isUndefined(ctx.depth)) ctx.depth = 2;
+ if (isUndefined(ctx.colors)) ctx.colors = false;
+ if (isUndefined(ctx.customInspect)) ctx.customInspect = true;
+ if (ctx.colors) ctx.stylize = stylizeWithColor;
+ return formatValue(ctx, obj, ctx.depth);
+}
+exports.inspect = inspect;
+
+
+// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics
+inspect.colors = {
+ 'bold' : [1, 22],
+ 'italic' : [3, 23],
+ 'underline' : [4, 24],
+ 'inverse' : [7, 27],
+ 'white' : [37, 39],
+ 'grey' : [90, 39],
+ 'black' : [30, 39],
+ 'blue' : [34, 39],
+ 'cyan' : [36, 39],
+ 'green' : [32, 39],
+ 'magenta' : [35, 39],
+ 'red' : [31, 39],
+ 'yellow' : [33, 39]
+};
+
+// Don't use 'blue' not visible on cmd.exe
+inspect.styles = {
+ 'special': 'cyan',
+ 'number': 'yellow',
+ 'boolean': 'yellow',
+ 'undefined': 'grey',
+ 'null': 'bold',
+ 'string': 'green',
+ 'date': 'magenta',
+ // "name": intentionally not styling
+ 'regexp': 'red'
+};
+
+
+function stylizeWithColor(str, styleType) {
+ var style = inspect.styles[styleType];
+
+ if (style) {
+ return '\u001b[' + inspect.colors[style][0] + 'm' + str +
+ '\u001b[' + inspect.colors[style][1] + 'm';
+ } else {
+ return str;
+ }
+}
+
+
+function stylizeNoColor(str, styleType) {
+ return str;
+}
+
+
+function arrayToHash(array) {
+ var hash = {};
+
+ array.forEach(function(val, idx) {
+ hash[val] = true;
+ });
+
+ return hash;
+}
+
+
+function formatValue(ctx, value, recurseTimes) {
+ // Provide a hook for user-specified inspect functions.
+ // Check that value is an object with an inspect function on it
+ if (ctx.customInspect &&
+ value &&
+ isFunction(value.inspect) &&
+ // Filter out the util module, it's inspect function is special
+ value.inspect !== exports.inspect &&
+ // Also filter out any prototype objects using the circular check.
+ !(value.constructor && value.constructor.prototype === value)) {
+ var ret = value.inspect(recurseTimes, ctx);
+ if (!isString(ret)) {
+ ret = formatValue(ctx, ret, recurseTimes);
+ }
+ return ret;
+ }
+
+ // Primitive types cannot have properties
+ var primitive = formatPrimitive(ctx, value);
+ if (primitive) {
+ return primitive;
+ }
+
+ // Look up the keys of the object.
+ var keys = Object.keys(value);
+ var visibleKeys = arrayToHash(keys);
+
+ if (ctx.showHidden) {
+ keys = Object.getOwnPropertyNames(value);
+ }
+
+ // IE doesn't make error fields non-enumerable
+ // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx
+ if (isError(value)
+ && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) {
+ return formatError(value);
+ }
+
+ // Some type of object without properties can be shortcutted.
+ if (keys.length === 0) {
+ if (isFunction(value)) {
+ var name = value.name ? ': ' + value.name : '';
+ return ctx.stylize('[Function' + name + ']', 'special');
+ }
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ }
+ if (isDate(value)) {
+ return ctx.stylize(Date.prototype.toString.call(value), 'date');
+ }
+ if (isError(value)) {
+ return formatError(value);
+ }
+ }
+
+ var base = '', array = false, braces = ['{', '}'];
+
+ // Make Array say that they are Array
+ if (isArray(value)) {
+ array = true;
+ braces = ['[', ']'];
+ }
+
+ // Make functions say that they are functions
+ if (isFunction(value)) {
+ var n = value.name ? ': ' + value.name : '';
+ base = ' [Function' + n + ']';
+ }
+
+ // Make RegExps say that they are RegExps
+ if (isRegExp(value)) {
+ base = ' ' + RegExp.prototype.toString.call(value);
+ }
+
+ // Make dates with properties first say the date
+ if (isDate(value)) {
+ base = ' ' + Date.prototype.toUTCString.call(value);
+ }
+
+ // Make error with message first say the error
+ if (isError(value)) {
+ base = ' ' + formatError(value);
+ }
+
+ if (keys.length === 0 && (!array || value.length == 0)) {
+ return braces[0] + base + braces[1];
+ }
+
+ if (recurseTimes < 0) {
+ if (isRegExp(value)) {
+ return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp');
+ } else {
+ return ctx.stylize('[Object]', 'special');
+ }
+ }
+
+ ctx.seen.push(value);
+
+ var output;
+ if (array) {
+ output = formatArray(ctx, value, recurseTimes, visibleKeys, keys);
+ } else {
+ output = keys.map(function(key) {
+ return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array);
+ });
+ }
+
+ ctx.seen.pop();
+
+ return reduceToSingleString(output, base, braces);
+}
+
+
+function formatPrimitive(ctx, value) {
+ if (isUndefined(value))
+ return ctx.stylize('undefined', 'undefined');
+ if (isString(value)) {
+ var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '')
+ .replace(/'/g, "\\'")
+ .replace(/\\"/g, '"') + '\'';
+ return ctx.stylize(simple, 'string');
+ }
+ if (isNumber(value))
+ return ctx.stylize('' + value, 'number');
+ if (isBoolean(value))
+ return ctx.stylize('' + value, 'boolean');
+ // For some reason typeof null is "object", so special case here.
+ if (isNull(value))
+ return ctx.stylize('null', 'null');
+}
+
+
+function formatError(value) {
+ return '[' + Error.prototype.toString.call(value) + ']';
+}
+
+
+function formatArray(ctx, value, recurseTimes, visibleKeys, keys) {
+ var output = [];
+ for (var i = 0, l = value.length; i < l; ++i) {
+ if (hasOwnProperty(value, String(i))) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ String(i), true));
+ } else {
+ output.push('');
+ }
+ }
+ keys.forEach(function(key) {
+ if (!key.match(/^\d+$/)) {
+ output.push(formatProperty(ctx, value, recurseTimes, visibleKeys,
+ key, true));
+ }
+ });
+ return output;
+}
+
+
+function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) {
+ var name, str, desc;
+ desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] };
+ if (desc.get) {
+ if (desc.set) {
+ str = ctx.stylize('[Getter/Setter]', 'special');
+ } else {
+ str = ctx.stylize('[Getter]', 'special');
+ }
+ } else {
+ if (desc.set) {
+ str = ctx.stylize('[Setter]', 'special');
+ }
+ }
+ if (!hasOwnProperty(visibleKeys, key)) {
+ name = '[' + key + ']';
+ }
+ if (!str) {
+ if (ctx.seen.indexOf(desc.value) < 0) {
+ if (isNull(recurseTimes)) {
+ str = formatValue(ctx, desc.value, null);
+ } else {
+ str = formatValue(ctx, desc.value, recurseTimes - 1);
+ }
+ if (str.indexOf('\n') > -1) {
+ if (array) {
+ str = str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n').substr(2);
+ } else {
+ str = '\n' + str.split('\n').map(function(line) {
+ return ' ' + line;
+ }).join('\n');
+ }
+ }
+ } else {
+ str = ctx.stylize('[Circular]', 'special');
+ }
+ }
+ if (isUndefined(name)) {
+ if (array && key.match(/^\d+$/)) {
+ return str;
+ }
+ name = JSON.stringify('' + key);
+ if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) {
+ name = name.substr(1, name.length - 2);
+ name = ctx.stylize(name, 'name');
+ } else {
+ name = name.replace(/'/g, "\\'")
+ .replace(/\\"/g, '"')
+ .replace(/(^"|"$)/g, "'");
+ name = ctx.stylize(name, 'string');
+ }
+ }
+
+ return name + ': ' + str;
+}
+
+
+function reduceToSingleString(output, base, braces) {
+ var numLinesEst = 0;
+ var length = output.reduce(function(prev, cur) {
+ numLinesEst++;
+ if (cur.indexOf('\n') >= 0) numLinesEst++;
+ return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1;
+ }, 0);
+
+ if (length > 60) {
+ return braces[0] +
+ (base === '' ? '' : base + '\n ') +
+ ' ' +
+ output.join(',\n ') +
+ ' ' +
+ braces[1];
+ }
+
+ return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1];
+}
+
+
+// NOTE: These type checking functions intentionally don't use `instanceof`
+// because it is fragile and can be easily faked with `Object.create()`.
+function isArray(ar) {
+ return Array.isArray(ar);
+}
+exports.isArray = isArray;
+
+function isBoolean(arg) {
+ return typeof arg === 'boolean';
+}
+exports.isBoolean = isBoolean;
+
+function isNull(arg) {
+ return arg === null;
+}
+exports.isNull = isNull;
+
+function isNullOrUndefined(arg) {
+ return arg == null;
+}
+exports.isNullOrUndefined = isNullOrUndefined;
+
+function isNumber(arg) {
+ return typeof arg === 'number';
+}
+exports.isNumber = isNumber;
+
+function isString(arg) {
+ return typeof arg === 'string';
+}
+exports.isString = isString;
+
+function isSymbol(arg) {
+ return typeof arg === 'symbol';
+}
+exports.isSymbol = isSymbol;
+
+function isUndefined(arg) {
+ return arg === void 0;
+}
+exports.isUndefined = isUndefined;
+
+function isRegExp(re) {
+ return isObject(re) && objectToString(re) === '[object RegExp]';
+}
+exports.isRegExp = isRegExp;
+
+function isObject(arg) {
+ return typeof arg === 'object' && arg !== null;
+}
+exports.isObject = isObject;
+
+function isDate(d) {
+ return isObject(d) && objectToString(d) === '[object Date]';
+}
+exports.isDate = isDate;
+
+function isError(e) {
+ return isObject(e) &&
+ (objectToString(e) === '[object Error]' || e instanceof Error);
+}
+exports.isError = isError;
+
+function isFunction(arg) {
+ return typeof arg === 'function';
+}
+exports.isFunction = isFunction;
+
+function isPrimitive(arg) {
+ return arg === null ||
+ typeof arg === 'boolean' ||
+ typeof arg === 'number' ||
+ typeof arg === 'string' ||
+ typeof arg === 'symbol' || // ES6 symbol
+ typeof arg === 'undefined';
+}
+exports.isPrimitive = isPrimitive;
+
+exports.isBuffer = __webpack_require__(5);
+
+function objectToString(o) {
+ return Object.prototype.toString.call(o);
+}
+
+
+function pad(n) {
+ return n < 10 ? '0' + n.toString(10) : n.toString(10);
+}
+
+
+var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep',
+ 'Oct', 'Nov', 'Dec'];
+
+// 26 Feb 16:19:34
+function timestamp() {
+ var d = new Date();
+ var time = [pad(d.getHours()),
+ pad(d.getMinutes()),
+ pad(d.getSeconds())].join(':');
+ return [d.getDate(), months[d.getMonth()], time].join(' ');
+}
+
+
+// log is just a thin wrapper to console.log that prepends a timestamp
+exports.log = function() {
+ console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments));
+};
+
+
+/**
+ * Inherit the prototype methods from one constructor into another.
+ *
+ * The Function.prototype.inherits from lang.js rewritten as a standalone
+ * function (not on Function.prototype). NOTE: If this file is to be loaded
+ * during bootstrapping this function needs to be rewritten using some native
+ * functions as prototype setup using normal JavaScript does not work as
+ * expected during bootstrapping (see mirror.js in r114903).
+ *
+ * @param {function} ctor Constructor function which needs to inherit the
+ * prototype.
+ * @param {function} superCtor Constructor function to inherit prototype from.
+ */
+exports.inherits = __webpack_require__(6);
+
+exports._extend = function(origin, add) {
+ // Don't do anything if add isn't an object
+ if (!add || !isObject(add)) return origin;
+
+ var keys = Object.keys(add);
+ var i = keys.length;
+ while (i--) {
+ origin[keys[i]] = add[keys[i]];
+ }
+ return origin;
+};
+
+function hasOwnProperty(obj, prop) {
+ return Object.prototype.hasOwnProperty.call(obj, prop);
+}
+
+/* WEBPACK VAR INJECTION */}.call(exports, __webpack_require__(1), __webpack_require__(4)))
+
+/***/ }),
+/* 4 */
+/***/ (function(module, exports) {
+
+// shim for using process in browser
+var process = module.exports = {};
+
+// cached from whatever global is present so that test runners that stub it
+// don't break things. But we need to wrap it in a try catch in case it is
+// wrapped in strict mode code which doesn't define any globals. It's inside a
+// function because try/catches deoptimize in certain engines.
+
+var cachedSetTimeout;
+var cachedClearTimeout;
+
+function defaultSetTimout() {
+ throw new Error('setTimeout has not been defined');
+}
+function defaultClearTimeout () {
+ throw new Error('clearTimeout has not been defined');
+}
+(function () {
+ try {
+ if (typeof setTimeout === 'function') {
+ cachedSetTimeout = setTimeout;
+ } else {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ } catch (e) {
+ cachedSetTimeout = defaultSetTimout;
+ }
+ try {
+ if (typeof clearTimeout === 'function') {
+ cachedClearTimeout = clearTimeout;
+ } else {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+ } catch (e) {
+ cachedClearTimeout = defaultClearTimeout;
+ }
+} ())
+function runTimeout(fun) {
+ if (cachedSetTimeout === setTimeout) {
+ //normal enviroments in sane situations
+ return setTimeout(fun, 0);
+ }
+ // if setTimeout wasn't available but was latter defined
+ if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) {
+ cachedSetTimeout = setTimeout;
+ return setTimeout(fun, 0);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedSetTimeout(fun, 0);
+ } catch(e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedSetTimeout.call(null, fun, 0);
+ } catch(e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error
+ return cachedSetTimeout.call(this, fun, 0);
+ }
+ }
+
+
+}
+function runClearTimeout(marker) {
+ if (cachedClearTimeout === clearTimeout) {
+ //normal enviroments in sane situations
+ return clearTimeout(marker);
+ }
+ // if clearTimeout wasn't available but was latter defined
+ if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) {
+ cachedClearTimeout = clearTimeout;
+ return clearTimeout(marker);
+ }
+ try {
+ // when when somebody has screwed with setTimeout but no I.E. maddness
+ return cachedClearTimeout(marker);
+ } catch (e){
+ try {
+ // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally
+ return cachedClearTimeout.call(null, marker);
+ } catch (e){
+ // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error.
+ // Some versions of I.E. have different rules for clearTimeout vs setTimeout
+ return cachedClearTimeout.call(this, marker);
+ }
+ }
+
+
+
+}
+var queue = [];
+var draining = false;
+var currentQueue;
+var queueIndex = -1;
+
+function cleanUpNextTick() {
+ if (!draining || !currentQueue) {
+ return;
+ }
+ draining = false;
+ if (currentQueue.length) {
+ queue = currentQueue.concat(queue);
+ } else {
+ queueIndex = -1;
+ }
+ if (queue.length) {
+ drainQueue();
+ }
+}
+
+function drainQueue() {
+ if (draining) {
+ return;
+ }
+ var timeout = runTimeout(cleanUpNextTick);
+ draining = true;
+
+ var len = queue.length;
+ while(len) {
+ currentQueue = queue;
+ queue = [];
+ while (++queueIndex < len) {
+ if (currentQueue) {
+ currentQueue[queueIndex].run();
+ }
+ }
+ queueIndex = -1;
+ len = queue.length;
+ }
+ currentQueue = null;
+ draining = false;
+ runClearTimeout(timeout);
+}
+
+process.nextTick = function (fun) {
+ var args = new Array(arguments.length - 1);
+ if (arguments.length > 1) {
+ for (var i = 1; i < arguments.length; i++) {
+ args[i - 1] = arguments[i];
+ }
+ }
+ queue.push(new Item(fun, args));
+ if (queue.length === 1 && !draining) {
+ runTimeout(drainQueue);
+ }
+};
+
+// v8 likes predictible objects
+function Item(fun, array) {
+ this.fun = fun;
+ this.array = array;
+}
+Item.prototype.run = function () {
+ this.fun.apply(null, this.array);
+};
+process.title = 'browser';
+process.browser = true;
+process.env = {};
+process.argv = [];
+process.version = ''; // empty string to avoid regexp issues
+process.versions = {};
+
+function noop() {}
+
+process.on = noop;
+process.addListener = noop;
+process.once = noop;
+process.off = noop;
+process.removeListener = noop;
+process.removeAllListeners = noop;
+process.emit = noop;
+process.prependListener = noop;
+process.prependOnceListener = noop;
+
+process.listeners = function (name) { return [] }
+
+process.binding = function (name) {
+ throw new Error('process.binding is not supported');
+};
+
+process.cwd = function () { return '/' };
+process.chdir = function (dir) {
+ throw new Error('process.chdir is not supported');
+};
+process.umask = function() { return 0; };
+
+
+/***/ }),
+/* 5 */
+/***/ (function(module, exports) {
+
+module.exports = function isBuffer(arg) {
+ return arg && typeof arg === 'object'
+ && typeof arg.copy === 'function'
+ && typeof arg.fill === 'function'
+ && typeof arg.readUInt8 === 'function';
+}
+
+/***/ }),
+/* 6 */
+/***/ (function(module, exports) {
+
+if (typeof Object.create === 'function') {
+ // implementation from standard node.js 'util' module
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ ctor.prototype = Object.create(superCtor.prototype, {
+ constructor: {
+ value: ctor,
+ enumerable: false,
+ writable: true,
+ configurable: true
+ }
+ });
+ };
+} else {
+ // old school shim for old browsers
+ module.exports = function inherits(ctor, superCtor) {
+ ctor.super_ = superCtor
+ var TempCtor = function () {}
+ TempCtor.prototype = superCtor.prototype
+ ctor.prototype = new TempCtor()
+ ctor.prototype.constructor = ctor
+ }
+}
+
+
+/***/ }),
+/* 7 */
+/***/ (function(module, exports, __webpack_require__) {
+
+"use strict";
+
+
+Object.defineProperty(exports, "__esModule", {
+ value: true
+});
+
+exports.default = function (app, name) {
+ var getService = function getService() {
+ return name && typeof app.service === 'function' ? app.service(name) : app;
+ };
+
+ describe('Service base tests', function () {
+ it('.find', function (done) {
+ getService().find().then(function (todos) {
+ return _assert2.default.deepEqual(todos, [{
+ text: 'some todo',
+ complete: false,
+ id: 0
+ }]);
+ }).then(function () {
+ return done();
+ }).catch(done);
+ });
+
+ it('.get and params passing', function (done) {
+ var query = {
+ some: 'thing',
+ other: ['one', 'two'],
+ nested: { a: { b: 'object' } }
+ };
+
+ getService().get(0, { query: query }).then(function (todo) {
+ return _assert2.default.deepEqual(todo, {
+ id: 0,
+ text: 'some todo',
+ complete: false,
+ query: query
+ });
+ }).then(function () {
+ return done();
+ }).catch(done);
+ });
+
+ it('.create and created event', function (done) {
+ getService().once('created', function (data) {
+ _assert2.default.equal(data.text, 'created todo');
+ _assert2.default.ok(data.complete);
+ done();
+ });
+
+ getService().create({ text: 'created todo', complete: true });
+ });
+
+ it('.update and updated event', function (done) {
+ getService().once('updated', function (data) {
+ _assert2.default.equal(data.text, 'updated todo');
+ _assert2.default.ok(data.complete);
+ done();
+ });
+
+ getService().create({ text: 'todo to update', complete: false }).then(function (todo) {
+ return getService().update(todo.id, {
+ text: 'updated todo',
+ complete: true
+ });
+ });
+ });
+
+ it('.patch and patched event', function (done) {
+ getService().once('patched', function (data) {
+ _assert2.default.equal(data.text, 'todo to patch');
+ _assert2.default.ok(data.complete);
+ done();
+ });
+
+ getService().create({ text: 'todo to patch', complete: false }).then(function (todo) {
+ return getService().patch(todo.id, { complete: true });
+ });
+ });
+
+ it('.remove and removed event', function (done) {
+ getService().once('removed', function (data) {
+ _assert2.default.equal(data.text, 'todo to remove');
+ _assert2.default.equal(data.complete, false);
+ done();
+ });
+
+ getService().create({ text: 'todo to remove', complete: false }).then(function (todo) {
+ return getService().remove(todo.id);
+ }).catch(done);
+ });
+
+ it('.get with error', function (done) {
+ var query = { error: true };
+ getService().get(0, { query: query }).then(done, function (error) {
+ _assert2.default.ok(error && error.message);
+ done();
+ });
+ });
+ });
+};
+
+var _assert = __webpack_require__(0);
+
+var _assert2 = _interopRequireDefault(_assert);
+
+function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
+
+module.exports = exports['default'];
+
+/***/ })
+/******/ ]);
\ No newline at end of file
diff --git a/packages/client/browser/test.js b/packages/client/browser/test.js
new file mode 100644
index 0000000000..9953df7b30
--- /dev/null
+++ b/packages/client/browser/test.js
@@ -0,0 +1,80 @@
+var assert = require('assert');
+var baseTests = require('feathers-commons/lib/test/client');
+
+var feathers = window.feathers;
+var socket = window.io();
+
+describe('Universal Feathers client browser tests', function () {
+ var app = feathers()
+ .configure(feathers.socketio(socket))
+ .use('/myservice', {
+ get (id) {
+ return Promise.resolve({
+ id, description: `You have to do ${id}!`
+ });
+ },
+
+ create (data) {
+ return Promise.resolve(data);
+ }
+ });
+
+ app.service('myservice').hooks({
+ before: {
+ create (hook) {
+ hook.data.hook = true;
+ }
+ },
+ after: {
+ get (hook) {
+ hook.result.ran = true;
+ }
+ }
+ });
+
+ after(() => app.service('todos').remove(null));
+
+ baseTests(app, 'todos');
+
+ describe('Client side hooks and services', () => {
+ it('initialized myservice and works with hooks', done => {
+ app.service('myservice').get('dishes').then(todo => {
+ assert.deepEqual(todo, {
+ id: 'dishes',
+ description: 'You have to do dishes!',
+ ran: true
+ });
+ done();
+ }).catch(done);
+ });
+
+ it('create and event with hook', done => {
+ var myservice = app.service('myservice');
+
+ myservice.once('created', data => {
+ assert.deepEqual(data, {
+ description: 'Test todo',
+ hook: true
+ });
+ done();
+ });
+
+ myservice.create({ description: 'Test todo' });
+ });
+
+ describe('Feathers Errors', () => {
+ describe('successful error creation', () => {
+ describe('without custom message', () => {
+ it('default error', () => {
+ var error = new feathers.errors.GeneralError();
+ assert.equal(error.code, 500);
+ assert.equal(error.message, 'Error');
+ assert.equal(error.className, 'general-error');
+ assert.equal(error instanceof feathers.errors.GeneralError, true);
+ assert.equal(error instanceof feathers.errors.FeathersError, true);
+ });
+ });
+ });
+ });
+ });
+});
diff --git a/packages/client/browser/webpack.config.js b/packages/client/browser/webpack.config.js
new file mode 100644
index 0000000000..5c28d58a07
--- /dev/null
+++ b/packages/client/browser/webpack.config.js
@@ -0,0 +1,13 @@
+module.exports = {
+ entry: './test.js',
+ output: {
+ filename: './test.dist.js'
+ },
+ module: {
+ rules: [{
+ test: /\.js/,
+ exclude: /node_modules\/(?!(@feathersjs))/,
+ loader: 'babel-loader'
+ }]
+ }
+};
diff --git a/packages/client/core.js b/packages/client/core.js
new file mode 100644
index 0000000000..b55021eddc
--- /dev/null
+++ b/packages/client/core.js
@@ -0,0 +1 @@
+module.exports = require('./dist/core');
diff --git a/packages/client/index.js b/packages/client/index.js
new file mode 100644
index 0000000000..8883ca3976
--- /dev/null
+++ b/packages/client/index.js
@@ -0,0 +1 @@
+module.exports = require('./dist/feathers');
diff --git a/packages/client/package-lock.json b/packages/client/package-lock.json
new file mode 100644
index 0000000000..a84c04ffa9
--- /dev/null
+++ b/packages/client/package-lock.json
@@ -0,0 +1,1241 @@
+{
+ "name": "@feathersjs/client",
+ "version": "3.7.1",
+ "lockfileVersion": 1,
+ "requires": true,
+ "dependencies": {
+ "body-parser": {
+ "version": "1.18.3",
+ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.18.3.tgz",
+ "integrity": "sha1-WykhmP/dVTs6DyDe0FkrlWlVyLQ=",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "content-type": "~1.0.4",
+ "debug": "2.6.9",
+ "depd": "~1.1.2",
+ "http-errors": "~1.6.3",
+ "iconv-lite": "0.4.23",
+ "on-finished": "~2.3.0",
+ "qs": "6.5.2",
+ "raw-body": "2.3.3",
+ "type-is": "~1.6.16"
+ },
+ "dependencies": {
+ "bytes": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz",
+ "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=",
+ "dev": true
+ },
+ "content-type": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz",
+ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "2.6.9",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
+ "dev": true,
+ "requires": {
+ "ms": "2.0.0"
+ }
+ },
+ "depd": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
+ "dev": true
+ },
+ "ee-first": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
+ "dev": true
+ },
+ "http-errors": {
+ "version": "1.6.3",
+ "resolved": "http://registry.npmjs.org/http-errors/-/http-errors-1.6.3.tgz",
+ "integrity": "sha1-i1VoC7S+KDoLW/TqLjhYC+HZMg0=",
+ "dev": true,
+ "requires": {
+ "depd": "~1.1.2",
+ "inherits": "2.0.3",
+ "setprototypeof": "1.1.0",
+ "statuses": ">= 1.4.0 < 2"
+ }
+ },
+ "iconv-lite": {
+ "version": "0.4.23",
+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.23.tgz",
+ "integrity": "sha512-neyTUVFtahjf0mB3dZT77u+8O0QB89jFdnBkd5P1JgYPbPaia3gXXOVL2fq8VyU2gMMD7SaN7QukTB/pmXYvDA==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": ">= 2.1.2 < 3"
+ }
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "media-typer": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz",
+ "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+ "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.20",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+ "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.36.0"
+ }
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "on-finished": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
+ "dev": true,
+ "requires": {
+ "ee-first": "1.1.1"
+ }
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "raw-body": {
+ "version": "2.3.3",
+ "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.3.3.tgz",
+ "integrity": "sha512-9esiElv1BrZoI3rCDuOuKCBRbuApGGaDPQfjSflGxdy4oyzqghxu6klEkkVIvBje+FF0BX9coEv8KqW6X/7njw==",
+ "dev": true,
+ "requires": {
+ "bytes": "3.0.0",
+ "http-errors": "1.6.3",
+ "iconv-lite": "0.4.23",
+ "unpipe": "1.0.0"
+ }
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "setprototypeof": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.0.tgz",
+ "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==",
+ "dev": true
+ },
+ "statuses": {
+ "version": "1.5.0",
+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
+ "dev": true
+ },
+ "type-is": {
+ "version": "1.6.16",
+ "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.16.tgz",
+ "integrity": "sha512-HRkVv/5qY2G6I8iab9cI7v1bOIdhm94dVjQCPFElW9W+3GeDOSHmy2EBYe4VTApuzolPcmgFTN3ftVJRKR2J9Q==",
+ "dev": true,
+ "requires": {
+ "media-typer": "0.3.0",
+ "mime-types": "~2.1.18"
+ }
+ },
+ "unpipe": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz",
+ "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=",
+ "dev": true
+ }
+ }
+ },
+ "feathers-memory": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/feathers-memory/-/feathers-memory-2.2.0.tgz",
+ "integrity": "sha512-rkx6oKBMbQbqtXUCS8GfC9wRubcNNBD0cHIU7Mesyg1Wsk0Dm7JftqrLz0fax1R1j2VMmMM8EZXuljhdtfdGLw==",
+ "dev": true,
+ "requires": {
+ "@feathersjs/commons": "^1.3.0",
+ "@feathersjs/errors": "^3.2.0",
+ "sift": "^6.0.0",
+ "uberproto": "^2.0.1"
+ },
+ "dependencies": {
+ "@feathersjs/commons": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/@feathersjs/commons/-/commons-1.4.4.tgz",
+ "integrity": "sha512-ZPpzyZA3CPfoa9AuFv3BJUI/ubzaaXixp8T/pqeMFPT6DOaU/6oF7lz1RxwimzfJNna4gy/HByt0EoLSI3BKWg==",
+ "dev": true
+ },
+ "@feathersjs/errors": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/@feathersjs/errors/-/errors-3.3.3.tgz",
+ "integrity": "sha512-TalUfLACYWc190USIX6gLhR9a+OKUKuql+pt7ZJSzljWdEtIYSP6SUCXttPC3JpDX0Qeqp+ccMjn+ncxAa+tGg==",
+ "dev": true,
+ "requires": {
+ "debug": "^4.0.0"
+ }
+ },
+ "debug": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz",
+ "integrity": "sha512-K23FHJ/Mt404FSlp6gSZCevIbTMLX0j3fmHhUEhQ3Wq0FMODW3+cUSoLdy1Gx4polAf4t/lphhmHH35BB8cLYw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.1"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "sift": {
+ "version": "6.0.0",
+ "resolved": "https://registry.npmjs.org/sift/-/sift-6.0.0.tgz",
+ "integrity": "sha1-+Tp3jly/BaUCTrw5HmsyURptH4I=",
+ "dev": true
+ },
+ "uberproto": {
+ "version": "2.0.4",
+ "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-2.0.4.tgz",
+ "integrity": "sha512-c/5xjTcztW9XVhrkCycHQRBIAxww5JpDKk/q0zc2tVdQn6ZQvnChWgLvQaWAT1Al5JvRyvloUI15ad41m6dYwg==",
+ "dev": true
+ }
+ }
+ },
+ "jsdom": {
+ "version": "8.1.0",
+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-8.1.0.tgz",
+ "integrity": "sha1-AH1rHSqCGG7s0C4UkDPpCD8QXlo=",
+ "dev": true,
+ "requires": {
+ "abab": "^1.0.0",
+ "acorn": "^2.4.0",
+ "acorn-globals": "^1.0.4",
+ "array-equal": "^1.0.0",
+ "cssom": ">= 0.3.0 < 0.4.0",
+ "cssstyle": ">= 0.2.34 < 0.3.0",
+ "escodegen": "^1.6.1",
+ "nwmatcher": ">= 1.3.7 < 2.0.0",
+ "parse5": "^1.5.1",
+ "request": "^2.55.0",
+ "sax": "^1.1.4",
+ "symbol-tree": ">= 3.1.0 < 4.0.0",
+ "tough-cookie": "^2.2.0",
+ "webidl-conversions": "^3.0.1",
+ "whatwg-url": "^1.0.0",
+ "xml-name-validator": ">= 2.0.1 < 3.0.0"
+ },
+ "dependencies": {
+ "abab": {
+ "version": "1.0.4",
+ "resolved": "https://registry.npmjs.org/abab/-/abab-1.0.4.tgz",
+ "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=",
+ "dev": true
+ },
+ "acorn": {
+ "version": "2.7.0",
+ "resolved": "http://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz",
+ "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=",
+ "dev": true
+ },
+ "acorn-globals": {
+ "version": "1.0.9",
+ "resolved": "http://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz",
+ "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=",
+ "dev": true,
+ "requires": {
+ "acorn": "^2.1.0"
+ }
+ },
+ "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.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "array-equal": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
+ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
+ "dev": true
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "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.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "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
+ },
+ "cssom": {
+ "version": "0.3.4",
+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.4.tgz",
+ "integrity": "sha512-+7prCSORpXNeR4/fUP3rL+TzqtiFfhMvTd7uEqMdgPvLPt4+uzFUeufx5RHjGTACCargg/DiEt/moMQmvnfkog==",
+ "dev": true
+ },
+ "cssstyle": {
+ "version": "0.2.37",
+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-0.2.37.tgz",
+ "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=",
+ "dev": true,
+ "requires": {
+ "cssom": "0.3.x"
+ }
+ },
+ "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"
+ }
+ },
+ "deep-is": {
+ "version": "0.1.3",
+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
+ "dev": true
+ },
+ "delayed-stream": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=",
+ "dev": true
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "escodegen": {
+ "version": "1.11.0",
+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz",
+ "integrity": "sha512-IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==",
+ "dev": true,
+ "requires": {
+ "esprima": "^3.1.3",
+ "estraverse": "^4.2.0",
+ "esutils": "^2.0.2",
+ "optionator": "^0.8.1",
+ "source-map": "~0.6.1"
+ }
+ },
+ "esprima": {
+ "version": "3.1.3",
+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
+ "dev": true
+ },
+ "estraverse": {
+ "version": "4.2.0",
+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz",
+ "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=",
+ "dev": true
+ },
+ "esutils": {
+ "version": "2.0.2",
+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz",
+ "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=",
+ "dev": true
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "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
+ },
+ "fast-levenshtein": {
+ "version": "2.0.6",
+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
+ "dev": true
+ },
+ "forever-agent": {
+ "version": "0.6.1",
+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=",
+ "dev": true
+ },
+ "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.12"
+ },
+ "dependencies": {
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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": "5.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+ "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.3.0",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "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.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "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-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
+ },
+ "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"
+ }
+ },
+ "levn": {
+ "version": "0.3.0",
+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2"
+ }
+ },
+ "mime-db": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+ "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.20",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+ "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.36.0"
+ }
+ },
+ "nwmatcher": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/nwmatcher/-/nwmatcher-1.4.4.tgz",
+ "integrity": "sha512-3iuY4N5dhgMpCUrOVnuAdGrgxVqV2cJpM+XNccjR2DKOB1RUP0aA+wGXEiNziG/UKboFyGBIoKOaNlJxx8bciQ==",
+ "dev": true
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "dev": true
+ },
+ "optionator": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz",
+ "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=",
+ "dev": true,
+ "requires": {
+ "deep-is": "~0.1.3",
+ "fast-levenshtein": "~2.0.4",
+ "levn": "~0.3.0",
+ "prelude-ls": "~1.1.2",
+ "type-check": "~0.3.2",
+ "wordwrap": "~1.0.0"
+ }
+ },
+ "parse5": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz",
+ "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=",
+ "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
+ },
+ "prelude-ls": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
+ "dev": true
+ },
+ "psl": {
+ "version": "1.1.29",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
+ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
+ "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.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.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
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sax": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
+ "dev": true
+ },
+ "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,
+ "optional": true
+ },
+ "sshpk": {
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
+ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "symbol-tree": {
+ "version": "3.2.2",
+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.2.tgz",
+ "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=",
+ "dev": true
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ },
+ "tr46": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz",
+ "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=",
+ "dev": true
+ },
+ "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.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "type-check": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
+ "dev": true,
+ "requires": {
+ "prelude-ls": "~1.1.2"
+ }
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "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.2.0"
+ }
+ },
+ "webidl-conversions": {
+ "version": "3.0.1",
+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz",
+ "integrity": "sha1-JFNCdeKnvGvnvIZhHMFq4KVlSHE=",
+ "dev": true
+ },
+ "whatwg-url": {
+ "version": "1.0.1",
+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-1.0.1.tgz",
+ "integrity": "sha1-KtdC/EGdZxAmN2+EyA/k9p9VzMc=",
+ "dev": true,
+ "requires": {
+ "tr46": "~0.0.3",
+ "webidl-conversions": "^3.0.0"
+ }
+ },
+ "wordwrap": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz",
+ "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=",
+ "dev": true
+ },
+ "xml-name-validator": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-2.0.1.tgz",
+ "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=",
+ "dev": true
+ }
+ }
+ },
+ "node-fetch": {
+ "version": "2.2.0",
+ "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.2.0.tgz",
+ "integrity": "sha512-OayFWziIxiHY8bCUyLX6sTpDH8Jsbp4FfYd1j1f7vZyfgkcOnAyM4oQR16f8a0s7Gl/viMGRey8eScYk4V4EZA==",
+ "dev": true
+ },
+ "socket.io-client": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-2.1.1.tgz",
+ "integrity": "sha512-jxnFyhAuFxYfjqIgduQlhzqTcOEQSn+OHKVfAxWaNWa7ecP7xSNk2Dx/3UEsDcY7NcFafxvNvKPmmO7HTwTxGQ==",
+ "dev": true,
+ "requires": {
+ "backo2": "1.0.2",
+ "base64-arraybuffer": "0.1.5",
+ "component-bind": "1.0.0",
+ "component-emitter": "1.2.1",
+ "debug": "~3.1.0",
+ "engine.io-client": "~3.2.0",
+ "has-binary2": "~1.0.2",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "object-component": "0.0.3",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "socket.io-parser": "~3.2.0",
+ "to-array": "0.1.4"
+ },
+ "dependencies": {
+ "after": {
+ "version": "0.8.2",
+ "resolved": "https://registry.npmjs.org/after/-/after-0.8.2.tgz",
+ "integrity": "sha1-/ts5T58OAqqXaOcCvaI7UF+ufh8=",
+ "dev": true
+ },
+ "arraybuffer.slice": {
+ "version": "0.0.7",
+ "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz",
+ "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==",
+ "dev": true
+ },
+ "async-limiter": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.0.tgz",
+ "integrity": "sha512-jp/uFnooOiO+L211eZOoSyzpOITMXx1rBITauYykG3BRYPu8h0UcxsPNB04RR5vo4Tyz3+ay17tR6JVf9qzYWg==",
+ "dev": true
+ },
+ "backo2": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz",
+ "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=",
+ "dev": true
+ },
+ "base64-arraybuffer": {
+ "version": "0.1.5",
+ "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.5.tgz",
+ "integrity": "sha1-c5JncZI7Whl0etZmqlzUv5xunOg=",
+ "dev": true
+ },
+ "better-assert": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz",
+ "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=",
+ "dev": true,
+ "requires": {
+ "callsite": "1.0.0"
+ }
+ },
+ "blob": {
+ "version": "0.0.4",
+ "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz",
+ "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=",
+ "dev": true
+ },
+ "callsite": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz",
+ "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=",
+ "dev": true
+ },
+ "component-bind": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz",
+ "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=",
+ "dev": true
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "component-inherit": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz",
+ "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=",
+ "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"
+ }
+ },
+ "engine.io-client": {
+ "version": "3.2.1",
+ "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-3.2.1.tgz",
+ "integrity": "sha512-y5AbkytWeM4jQr7m/koQLc5AxpRKC1hEVUb/s1FUAWEJq5AzJJ4NLvzuKPuxtDi5Mq755WuDvZ6Iv2rXj4PTzw==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "component-inherit": "0.0.3",
+ "debug": "~3.1.0",
+ "engine.io-parser": "~2.1.1",
+ "has-cors": "1.1.0",
+ "indexof": "0.0.1",
+ "parseqs": "0.0.5",
+ "parseuri": "0.0.5",
+ "ws": "~3.3.1",
+ "xmlhttprequest-ssl": "~1.5.4",
+ "yeast": "0.1.2"
+ }
+ },
+ "engine.io-parser": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-2.1.2.tgz",
+ "integrity": "sha512-dInLFzr80RijZ1rGpx1+56/uFoH7/7InhH3kZt+Ms6hT8tNx3NGW/WNSA/f8As1WkOfkuyb3tnRyuXGxusclMw==",
+ "dev": true,
+ "requires": {
+ "after": "0.8.2",
+ "arraybuffer.slice": "~0.0.7",
+ "base64-arraybuffer": "0.1.5",
+ "blob": "0.0.4",
+ "has-binary2": "~1.0.2"
+ }
+ },
+ "has-binary2": {
+ "version": "1.0.3",
+ "resolved": "https://registry.npmjs.org/has-binary2/-/has-binary2-1.0.3.tgz",
+ "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==",
+ "dev": true,
+ "requires": {
+ "isarray": "2.0.1"
+ }
+ },
+ "has-cors": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.1.0.tgz",
+ "integrity": "sha1-XkdHk/fqmEPRu5nCPu9J/xJv/zk=",
+ "dev": true
+ },
+ "indexof": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz",
+ "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=",
+ "dev": true
+ },
+ "isarray": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.1.tgz",
+ "integrity": "sha1-o32U7ZzaLVmGXJ92/llu4fM4dB4=",
+ "dev": true
+ },
+ "ms": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
+ "dev": true
+ },
+ "object-component": {
+ "version": "0.0.3",
+ "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz",
+ "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=",
+ "dev": true
+ },
+ "parseqs": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.5.tgz",
+ "integrity": "sha1-1SCKNzjkZ2bikbouoXNoSSGouJ0=",
+ "dev": true,
+ "requires": {
+ "better-assert": "~1.0.0"
+ }
+ },
+ "parseuri": {
+ "version": "0.0.5",
+ "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.5.tgz",
+ "integrity": "sha1-gCBKUNTbt3m/3G6+J3jZDkvOMgo=",
+ "dev": true,
+ "requires": {
+ "better-assert": "~1.0.0"
+ }
+ },
+ "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
+ },
+ "socket.io-parser": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-3.2.0.tgz",
+ "integrity": "sha512-FYiBx7rc/KORMJlgsXysflWx/RIvtqZbyGLlHZvjfmPTPeuD/I8MaW7cfFrj5tRltICJdgwflhfZ3NVVbVLFQA==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "1.2.1",
+ "debug": "~3.1.0",
+ "isarray": "2.0.1"
+ }
+ },
+ "to-array": {
+ "version": "0.1.4",
+ "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.4.tgz",
+ "integrity": "sha1-F+bBH3PdTz10zaek/zI46a2b+JA=",
+ "dev": true
+ },
+ "ultron": {
+ "version": "1.1.1",
+ "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.1.1.tgz",
+ "integrity": "sha512-UIEXBNeYmKptWH6z8ZnqTeS8fV74zG0/eRU9VGkpzz+LIJNs8W/zM/L+7ctCkRrgbNnnR0xxw4bKOr0cW0N0Og==",
+ "dev": true
+ },
+ "ws": {
+ "version": "3.3.3",
+ "resolved": "https://registry.npmjs.org/ws/-/ws-3.3.3.tgz",
+ "integrity": "sha512-nnWLa/NwZSt4KQJu51MYlCcSQ5g7INpOrOMt4XV8j4dqTXdmlUmSHQ8/oLC069ckre0fRsgfvsKwbTdtKLCDkA==",
+ "dev": true,
+ "requires": {
+ "async-limiter": "~1.0.0",
+ "safe-buffer": "~5.1.0",
+ "ultron": "~1.1.0"
+ }
+ },
+ "xmlhttprequest-ssl": {
+ "version": "1.5.5",
+ "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.5.5.tgz",
+ "integrity": "sha1-wodrBhaKrcQOV9l+gRkayPQ5iz4=",
+ "dev": true
+ },
+ "yeast": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/yeast/-/yeast-0.1.2.tgz",
+ "integrity": "sha1-AI4G2AlDIMNy28L47XagymyKxBk=",
+ "dev": true
+ }
+ }
+ },
+ "superagent": {
+ "version": "4.0.0-beta.5",
+ "resolved": "https://registry.npmjs.org/superagent/-/superagent-4.0.0-beta.5.tgz",
+ "integrity": "sha512-v4FTm6kg6zJOfLcot9kCTcWy/wjD/hvtUXWcv0Pd8TlUqxKDctif2rtDPRb4gW6Df9MMXU1BHB+1z5U2VFVsYg==",
+ "dev": true,
+ "requires": {
+ "component-emitter": "^1.2.0",
+ "cookiejar": "^2.1.2",
+ "debug": "^4.0.0",
+ "form-data": "^2.3.2",
+ "formidable": "^1.2.0",
+ "methods": "^1.1.1",
+ "mime": "^2.0.3",
+ "qs": "^6.5.1",
+ "readable-stream": "^3.0.3"
+ },
+ "dependencies": {
+ "asynckit": {
+ "version": "0.4.0",
+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "component-emitter": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz",
+ "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=",
+ "dev": true
+ },
+ "cookiejar": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.2.tgz",
+ "integrity": "sha512-Mw+adcfzPxcPeI+0WlvRrr/3lGVO0bD75SxX6811cxSh1Wbxx7xZBGK1eVtDf6si8rg2lhnUjsVLMFMfbRIuwA==",
+ "dev": true
+ },
+ "debug": {
+ "version": "4.0.1",
+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.0.1.tgz",
+ "integrity": "sha512-K23FHJ/Mt404FSlp6gSZCevIbTMLX0j3fmHhUEhQ3Wq0FMODW3+cUSoLdy1Gx4polAf4t/lphhmHH35BB8cLYw==",
+ "dev": true,
+ "requires": {
+ "ms": "^2.1.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
+ },
+ "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.12"
+ }
+ },
+ "formidable": {
+ "version": "1.2.1",
+ "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.2.1.tgz",
+ "integrity": "sha512-Fs9VRguL0gqGHkXS5GQiMCr1VhZBxz0JnJs4JmMp/2jL18Fmbzvv7vOFRU+U8TBkHEE/CX1qDXzJplVULgsLeg==",
+ "dev": true
+ },
+ "inherits": {
+ "version": "2.0.3",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
+ "dev": true
+ },
+ "methods": {
+ "version": "1.1.2",
+ "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz",
+ "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=",
+ "dev": true
+ },
+ "mime": {
+ "version": "2.3.1",
+ "resolved": "https://registry.npmjs.org/mime/-/mime-2.3.1.tgz",
+ "integrity": "sha512-OEUllcVoydBHGN1z84yfQDimn58pZNNNXgZlHXSboxMlFvgI6MXSWpWKpFRra7H1HxpVhHTkrghfRW49k6yjeg==",
+ "dev": true
+ },
+ "mime-db": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+ "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.20",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+ "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.36.0"
+ }
+ },
+ "ms": {
+ "version": "2.1.1",
+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
+ "dev": true
+ },
+ "qs": {
+ "version": "6.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "readable-stream": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.0.3.tgz",
+ "integrity": "sha512-CzN1eAu5Pmh4EaDlJp1g5E37LIHR24b82XlMWRQlPFjhvOYKa4HhClRsQO21zhdDWUpdWfiKt9/L/ZL2+vwxCw==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ },
+ "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
+ },
+ "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.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
+ }
+ }
+ }
+ }
+}
diff --git a/packages/client/package.json b/packages/client/package.json
new file mode 100644
index 0000000000..0a481d1c2a
--- /dev/null
+++ b/packages/client/package.json
@@ -0,0 +1,66 @@
+{
+ "name": "@feathersjs/client",
+ "description": "A module that consolidates Feathers client modules for REST (jQuery, Request, Superagent) and Websocket (Socket.io, Primus) connections",
+ "version": "3.7.1",
+ "repository": {
+ "type": "git",
+ "url": "https://github.com/feathersjs/feathers.git"
+ },
+ "license": "MIT",
+ "bugs": {
+ "url": "https://github.com/feathersjs/feathers/issues"
+ },
+ "homepage": "https://github.com/feathersjs/client",
+ "keywords": [
+ "feathers",
+ "feathers-plugin"
+ ],
+ "author": "Feathers contributors",
+ "engines": {
+ "node": ">= 6"
+ },
+ "main": "index.js",
+ "scripts": {
+ "clean": "shx rm -rf dist/ && shx mkdir -p dist",
+ "version": "npm run build",
+ "mocha": "../../node_modules/.bin/mocha --opts ../../mocha.opts",
+ "test": "npm run build && npm run mocha",
+ "build": "npm run clean && npm run webpack",
+ "build:test": "cd browser && webpack",
+ "webpack": "parallel-webpack"
+ },
+ "browserslist": [
+ "last 2 versions",
+ "IE 10"
+ ],
+ "greenkeeper": {
+ "ignore": "jsdom"
+ },
+ "devDependencies": {
+ "@feathersjs/authentication-client": "^1.0.5",
+ "@feathersjs/errors": "^3.3.3",
+ "@feathersjs/feathers": "^3.2.2",
+ "@feathersjs/primus-client": "^1.1.3",
+ "@feathersjs/rest-client": "^1.4.4",
+ "@feathersjs/socketio-client": "^1.1.3",
+ "@babel/core": "^7.0.0",
+ "@babel/polyfill": "^7.0.0",
+ "@babel/preset-env": "^7.0.0",
+ "@feathersjs/express": "^1.2.6",
+ "@feathersjs/primus": "^3.2.4",
+ "@feathersjs/socketio": "^3.2.5",
+ "babel-loader": "^8.0.0",
+ "body-parser": "^1.18.3",
+ "feathers-memory": "^2.2.0",
+ "jsdom": "8.1.0",
+ "node-fetch": "^2.2.0",
+ "parallel-webpack": "^2.3.0",
+ "request": "^2.88.0",
+ "socket.io-client": "^2.1.1",
+ "superagent": "^4.0.0-beta.5",
+ "uglifyjs-webpack-plugin": "^2.0.0",
+ "webpack": "^4.19.0",
+ "webpack-merge": "^4.1.4",
+ "ws": "^6.0.0"
+ }
+}
diff --git a/packages/client/primus.js b/packages/client/primus.js
new file mode 100644
index 0000000000..641235fc17
--- /dev/null
+++ b/packages/client/primus.js
@@ -0,0 +1 @@
+module.exports = require('./dist/primus');
\ No newline at end of file
diff --git a/packages/client/rest.js b/packages/client/rest.js
new file mode 100644
index 0000000000..c3445bd2f1
--- /dev/null
+++ b/packages/client/rest.js
@@ -0,0 +1 @@
+module.exports = require('./dist/rest');
\ No newline at end of file
diff --git a/packages/client/socketio.js b/packages/client/socketio.js
new file mode 100644
index 0000000000..6c172ee97e
--- /dev/null
+++ b/packages/client/socketio.js
@@ -0,0 +1 @@
+module.exports = require('./dist/socketio');
\ No newline at end of file
diff --git a/packages/client/src/authentication.js b/packages/client/src/authentication.js
new file mode 100644
index 0000000000..76c99b3129
--- /dev/null
+++ b/packages/client/src/authentication.js
@@ -0,0 +1 @@
+module.exports = require('@feathersjs/authentication-client');
\ No newline at end of file
diff --git a/packages/client/src/core.js b/packages/client/src/core.js
new file mode 100644
index 0000000000..827ca62cbb
--- /dev/null
+++ b/packages/client/src/core.js
@@ -0,0 +1 @@
+module.exports = require('@feathersjs/feathers');
diff --git a/packages/client/src/index.js b/packages/client/src/index.js
new file mode 100644
index 0000000000..806ad42dbd
--- /dev/null
+++ b/packages/client/src/index.js
@@ -0,0 +1,16 @@
+const feathers = require('@feathersjs/feathers');
+const errors = require('@feathersjs/errors');
+const authentication = require('@feathersjs/authentication-client');
+const rest = require('@feathersjs/rest-client');
+const socketio = require('@feathersjs/socketio-client');
+const primus = require('@feathersjs/primus-client');
+
+Object.assign(feathers, {
+ errors,
+ socketio,
+ primus,
+ rest,
+ authentication
+});
+
+module.exports = feathers;
diff --git a/packages/client/src/primus.js b/packages/client/src/primus.js
new file mode 100644
index 0000000000..87bf79c797
--- /dev/null
+++ b/packages/client/src/primus.js
@@ -0,0 +1 @@
+module.exports = require('@feathersjs/primus-client');
\ No newline at end of file
diff --git a/packages/client/src/rest.js b/packages/client/src/rest.js
new file mode 100644
index 0000000000..27df8f44dc
--- /dev/null
+++ b/packages/client/src/rest.js
@@ -0,0 +1 @@
+module.exports = require('@feathersjs/rest-client');
\ No newline at end of file
diff --git a/packages/client/src/socketio.js b/packages/client/src/socketio.js
new file mode 100644
index 0000000000..5e0b444378
--- /dev/null
+++ b/packages/client/src/socketio.js
@@ -0,0 +1 @@
+module.exports = require('@feathersjs/socketio-client');
\ No newline at end of file
diff --git a/packages/client/test/fixture.js b/packages/client/test/fixture.js
new file mode 100644
index 0000000000..0e5ebc813c
--- /dev/null
+++ b/packages/client/test/fixture.js
@@ -0,0 +1,78 @@
+const path = require('path');
+const feathers = require('@feathersjs/feathers');
+const express = require('@feathersjs/express');
+const rest = require('@feathersjs/express/rest');
+const memory = require('feathers-memory');
+
+// eslint-disable-next-line no-extend-native
+Object.defineProperty(Error.prototype, 'toJSON', {
+ value: function () {
+ var alt = {};
+
+ Object.getOwnPropertyNames(this).forEach(function (key) {
+ alt[key] = this[key];
+ }, this);
+
+ return alt;
+ },
+ configurable: true
+});
+
+module.exports = function (configurer) {
+ // Create an in-memory CRUD service for our Todos
+ var todoService = memory().extend({
+ get: function (id, params) {
+ if (params.query.error) {
+ return Promise.reject(new Error('Something went wrong'));
+ }
+
+ return this._super(id, params).then(data =>
+ Object.assign({ query: params.query }, data)
+ );
+ }
+ });
+
+ var app = express(feathers())
+ .configure(rest());
+
+ if (typeof configurer === 'function') {
+ configurer.call(app);
+ }
+
+ // Parse HTTP bodies
+ app.use(express.json())
+ .use(express.urlencoded({ extended: true }))
+ // Host the current directory (for index.html)
+ .use(express.static(process.cwd()))
+ // Host our Todos service on the /todos path
+ .use('/todos', todoService);
+
+ const testTodo = {
+ text: 'some todo',
+ complete: false
+ };
+ const service = app.service('todos');
+
+ service.create(testTodo);
+ service.hooks({
+ after: {
+ remove (hook) {
+ if (hook.id === null) {
+ service._uId = 0;
+ return service.create(testTodo)
+ .then(() => hook);
+ }
+ }
+ }
+ });
+
+ app.on('connection', connection =>
+ app.channel('general').join(connection)
+ );
+
+ if (service.publish) {
+ service.publish(() => app.channel('general'));
+ }
+
+ return app;
+};
diff --git a/packages/client/test/rest/fetch.test.js b/packages/client/test/rest/fetch.test.js
new file mode 100644
index 0000000000..f0478c7bbf
--- /dev/null
+++ b/packages/client/test/rest/fetch.test.js
@@ -0,0 +1,21 @@
+const fetch = require('node-fetch');
+const baseTests = require('@feathersjs/commons/lib/test/client');
+
+const app = require('../fixture');
+const feathers = require('../../index');
+
+describe('fetch REST connector', function () {
+ const rest = feathers.rest('http://localhost:8889');
+ const client = feathers()
+ .configure(rest.fetch(fetch));
+
+ before(function (done) {
+ this.server = app().listen(8889, done);
+ });
+
+ after(function (done) {
+ this.server.close(done);
+ });
+
+ baseTests(client, 'todos');
+});
diff --git a/packages/client/test/rest/jquery.test.js b/packages/client/test/rest/jquery.test.js
new file mode 100644
index 0000000000..c377d4895f
--- /dev/null
+++ b/packages/client/test/rest/jquery.test.js
@@ -0,0 +1,32 @@
+const jsdom = require('jsdom');
+const baseTests = require('@feathersjs/commons/lib/test/client');
+
+const app = require('../fixture');
+const feathers = require('../../');
+
+describe('jQuery REST connector', function () {
+ const rest = feathers.rest('http://localhost:7676');
+ const client = feathers();
+
+ before(function (done) {
+ this.server = app().listen(7676, function () {
+ jsdom.env({
+ html: '',
+ scripts: [
+ 'http://code.jquery.com/jquery-2.1.4.js'
+ ],
+ done: function (err, window) { // eslint-disable-line handle-callback-err
+ window.jQuery.support.cors = true;
+ client.configure(rest.jquery(window.jQuery));
+ done();
+ }
+ });
+ });
+ });
+
+ after(function () {
+ this.server.close();
+ });
+
+ baseTests(client, 'todos');
+});
diff --git a/packages/client/test/rest/request.test.js b/packages/client/test/rest/request.test.js
new file mode 100644
index 0000000000..d94c3b2ae6
--- /dev/null
+++ b/packages/client/test/rest/request.test.js
@@ -0,0 +1,21 @@
+const request = require('request');
+const baseTests = require('@feathersjs/commons/lib/test/client');
+
+const app = require('../fixture');
+const feathers = require('../../');
+
+describe('node-request REST connector', function () {
+ const rest = feathers.rest('http://localhost:6777');
+ const client = feathers()
+ .configure(rest.request(request));
+
+ before(function (done) {
+ this.server = app().listen(6777, done);
+ });
+
+ after(function (done) {
+ this.server.close(done);
+ });
+
+ baseTests(client, 'todos');
+});
diff --git a/packages/client/test/rest/superagent.test.js b/packages/client/test/rest/superagent.test.js
new file mode 100644
index 0000000000..c2f1e5cb4f
--- /dev/null
+++ b/packages/client/test/rest/superagent.test.js
@@ -0,0 +1,21 @@
+const superagent = require('superagent');
+const baseTests = require('@feathersjs/commons/lib/test/client');
+
+const app = require('../fixture');
+const feathers = require('../../');
+
+describe('Superagent REST connector', function () {
+ const rest = feathers.rest('http://localhost:8889');
+ const client = feathers()
+ .configure(rest.superagent(superagent));
+
+ before(function (done) {
+ this.server = app().listen(8889, done);
+ });
+
+ after(function (done) {
+ this.server.close(done);
+ });
+
+ baseTests(client, 'todos');
+});
diff --git a/packages/client/test/server.js b/packages/client/test/server.js
new file mode 100644
index 0000000000..c1f8d35897
--- /dev/null
+++ b/packages/client/test/server.js
@@ -0,0 +1,7 @@
+const socketio = require('@feathersjs/socketio');
+const createApp = require('./fixture');
+const app = createApp(function () {
+ this.configure(socketio());
+});
+
+module.exports = app.listen(3000);
diff --git a/packages/client/test/sockets/primus.test.js b/packages/client/test/sockets/primus.test.js
new file mode 100644
index 0000000000..c04fcd05ee
--- /dev/null
+++ b/packages/client/test/sockets/primus.test.js
@@ -0,0 +1,29 @@
+const primus = require('@feathersjs/primus');
+const baseTests = require('@feathersjs/commons/lib/test/client');
+
+const app = require('../fixture');
+const feathers = require('../../');
+
+describe('Primus connector', function () {
+ const client = feathers();
+
+ let socket;
+
+ before(function (done) {
+ this.server = app(function () {
+ this.configure(primus({
+ transformer: 'websockets'
+ }, function (primus) {
+ socket = new primus.Socket('http://localhost:12012');
+ client.configure(feathers.primus(socket));
+ }));
+ }).listen(12012, done);
+ });
+
+ after(function () {
+ socket.socket.close();
+ this.server.close();
+ });
+
+ baseTests(client, 'todos');
+});
diff --git a/packages/client/test/sockets/socketio.test.js b/packages/client/test/sockets/socketio.test.js
new file mode 100644
index 0000000000..e271ebc22f
--- /dev/null
+++ b/packages/client/test/sockets/socketio.test.js
@@ -0,0 +1,28 @@
+const io = require('socket.io-client');
+const socketio = require('@feathersjs/socketio');
+const baseTests = require('@feathersjs/commons/lib/test/client');
+
+const app = require('../fixture');
+const feathers = require('../../');
+
+describe('Socket.io connector', function () {
+ const socket = io('http://localhost:9988');
+ const client = feathers()
+ .configure(feathers.socketio(socket));
+
+ before(function (done) {
+ this.server = app(function () {
+ this.configure(socketio());
+ }).listen(9988, done);
+ });
+
+ after(function (done) {
+ socket.once('disconnect', () => {
+ this.server.close();
+ done();
+ });
+ socket.disconnect();
+ });
+
+ baseTests(client, 'todos');
+});
diff --git a/packages/client/webpack.config.js b/packages/client/webpack.config.js
new file mode 100644
index 0000000000..137839964f
--- /dev/null
+++ b/packages/client/webpack.config.js
@@ -0,0 +1,68 @@
+const path = require('path');
+const webpack = require('webpack');
+const merge = require('webpack-merge');
+const UglifyJSPlugin = require('uglifyjs-webpack-plugin');
+
+function createConfig (name, isProduction = false) {
+ const output = name === 'index' ? 'feathers' : name;
+ const commons = {
+ entry: `./src/${name}.js`,
+ output: {
+ library: 'feathers',
+ libraryTarget: 'umd',
+ globalObject: 'this',
+ path: path.resolve(__dirname, 'dist'),
+ filename: `${output}.js`
+ },
+ module: {
+ rules: [{
+ test: /\.js/,
+ exclude: /node_modules\/(?!(@feathersjs|debug))/,
+ loader: 'babel-loader',
+ options: {
+ presets: ['@babel/preset-env']
+ }
+ }]
+ }
+ };
+
+ const dev = {
+ mode: 'development',
+ devtool: 'source-map'
+ };
+ const production = {
+ mode: 'production',
+ output: {
+ filename: `${output}.min.js`
+ },
+ plugins: [
+ new UglifyJSPlugin({
+ uglifyOptions: {
+ ie8: false,
+ comments: false,
+ sourceMap: false
+ }
+ }),
+ new webpack.DefinePlugin({
+ 'process.env.NODE_ENV': JSON.stringify('production')
+ })
+ ]
+ };
+
+ return merge(commons, isProduction ? production : dev);
+}
+
+module.exports = [
+ createConfig('index'),
+ createConfig('index', true),
+ createConfig('core'),
+ createConfig('core', true),
+ createConfig('rest'),
+ createConfig('rest', true),
+ createConfig('socketio'),
+ createConfig('socketio', true),
+ createConfig('primus'),
+ createConfig('primus', true),
+ createConfig('authentication'),
+ createConfig('authentication', true)
+];
diff --git a/packages/rest-client/package-lock.json b/packages/rest-client/package-lock.json
index 52bf5240a5..6dcaf69337 100644
--- a/packages/rest-client/package-lock.json
+++ b/packages/rest-client/package-lock.json
@@ -1,6 +1,6 @@
{
"name": "@feathersjs/rest-client",
- "version": "1.4.3",
+ "version": "1.4.4",
"lockfileVersion": 1,
"requires": true,
"dependencies": {
@@ -171,6 +171,398 @@
"dev": true
}
}
+ },
+ "request": {
+ "version": "2.88.0",
+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.0.tgz",
+ "integrity": "sha512-NAqBSrijGLZdM0WZNsInLJpkJokL72XYjUpnB0iwsRgxh7dB6COrHnTBNwN0E+lHDAJzu7kLAkDeY08z2/A0hg==",
+ "dev": true,
+ "requires": {
+ "aws-sign2": "~0.7.0",
+ "aws4": "^1.8.0",
+ "caseless": "~0.12.0",
+ "combined-stream": "~1.0.6",
+ "extend": "~3.0.2",
+ "forever-agent": "~0.6.1",
+ "form-data": "~2.3.2",
+ "har-validator": "~5.1.0",
+ "http-signature": "~1.2.0",
+ "is-typedarray": "~1.0.0",
+ "isstream": "~0.1.2",
+ "json-stringify-safe": "~5.0.1",
+ "mime-types": "~2.1.19",
+ "oauth-sign": "~0.9.0",
+ "performance-now": "^2.1.0",
+ "qs": "~6.5.2",
+ "safe-buffer": "^5.1.2",
+ "tough-cookie": "~2.4.3",
+ "tunnel-agent": "^0.6.0",
+ "uuid": "^3.3.2"
+ },
+ "dependencies": {
+ "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.0.0",
+ "fast-json-stable-stringify": "^2.0.0",
+ "json-schema-traverse": "^0.3.0"
+ }
+ },
+ "asn1": {
+ "version": "0.2.4",
+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
+ "dev": true,
+ "requires": {
+ "safer-buffer": "~2.1.0"
+ }
+ },
+ "assert-plus": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=",
+ "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.7.0",
+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=",
+ "dev": true
+ },
+ "aws4": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz",
+ "integrity": "sha512-ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==",
+ "dev": true
+ },
+ "bcrypt-pbkdf": {
+ "version": "1.0.2",
+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "tweetnacl": "^0.14.3"
+ }
+ },
+ "caseless": {
+ "version": "0.12.0",
+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=",
+ "dev": true
+ },
+ "co": {
+ "version": "4.6.0",
+ "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz",
+ "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=",
+ "dev": true
+ },
+ "combined-stream": {
+ "version": "1.0.7",
+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz",
+ "integrity": "sha512-brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ },
+ "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
+ },
+ "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"
+ }
+ },
+ "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
+ },
+ "ecc-jsbn": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
+ "dev": true,
+ "optional": true,
+ "requires": {
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.1.0"
+ }
+ },
+ "extend": {
+ "version": "3.0.2",
+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==",
+ "dev": true
+ },
+ "extsprintf": {
+ "version": "1.3.0",
+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=",
+ "dev": true
+ },
+ "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
+ },
+ "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.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.12"
+ },
+ "dependencies": {
+ "combined-stream": {
+ "version": "1.0.6",
+ "resolved": "http://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz",
+ "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=",
+ "dev": true,
+ "requires": {
+ "delayed-stream": "~1.0.0"
+ }
+ }
+ }
+ },
+ "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"
+ }
+ },
+ "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": "5.1.0",
+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.0.tgz",
+ "integrity": "sha512-+qnmNjI4OfH2ipQ9VQOw23bBd/ibtfbVdK2fYbY4acTDqKTW/YDp9McimZdDbG8iV9fZizUqQMD5xvriB146TA==",
+ "dev": true,
+ "requires": {
+ "ajv": "^5.3.0",
+ "har-schema": "^2.0.0"
+ }
+ },
+ "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.2.2",
+ "sshpk": "^1.7.0"
+ }
+ },
+ "is-typedarray": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=",
+ "dev": true
+ },
+ "isstream": {
+ "version": "0.1.2",
+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=",
+ "dev": true
+ },
+ "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-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
+ },
+ "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"
+ }
+ },
+ "mime-db": {
+ "version": "1.36.0",
+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz",
+ "integrity": "sha512-L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==",
+ "dev": true
+ },
+ "mime-types": {
+ "version": "2.1.20",
+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz",
+ "integrity": "sha512-HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==",
+ "dev": true,
+ "requires": {
+ "mime-db": "~1.36.0"
+ }
+ },
+ "oauth-sign": {
+ "version": "0.9.0",
+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==",
+ "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
+ },
+ "psl": {
+ "version": "1.1.29",
+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.1.29.tgz",
+ "integrity": "sha512-AeUmQ0oLN02flVHXWh9sSJF7mcdFq0ppid/JkErufc3hGIV/AMa8Fo9VgDo/cT2jFdOWoFvHp90qqBH54W+gjQ==",
+ "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.5.2",
+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==",
+ "dev": true
+ },
+ "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
+ },
+ "safer-buffer": {
+ "version": "2.1.2",
+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==",
+ "dev": true
+ },
+ "sshpk": {
+ "version": "1.14.2",
+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz",
+ "integrity": "sha1-xvxhZIo9nE52T9P8306hBeSSupg=",
+ "dev": true,
+ "requires": {
+ "asn1": "~0.2.3",
+ "assert-plus": "^1.0.0",
+ "bcrypt-pbkdf": "^1.0.0",
+ "dashdash": "^1.12.0",
+ "ecc-jsbn": "~0.1.1",
+ "getpass": "^0.1.1",
+ "jsbn": "~0.1.0",
+ "safer-buffer": "^2.0.2",
+ "tweetnacl": "~0.14.0"
+ }
+ },
+ "tough-cookie": {
+ "version": "2.4.3",
+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.4.3.tgz",
+ "integrity": "sha512-Q5srk/4vDM54WJsJio3XNn6K2sCG+CQ8G5Wz6bZhRZoAe/+TxjWB/GlFAnYEbkYVlON9FMk/fE3h2RLpPXo4lQ==",
+ "dev": true,
+ "requires": {
+ "psl": "^1.1.24",
+ "punycode": "^1.4.1"
+ }
+ },
+ "tunnel-agent": {
+ "version": "0.6.0",
+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
+ "dev": true,
+ "requires": {
+ "safe-buffer": "^5.0.1"
+ }
+ },
+ "tweetnacl": {
+ "version": "0.14.5",
+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=",
+ "dev": true,
+ "optional": true
+ },
+ "uuid": {
+ "version": "3.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
+ "integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==",
+ "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.2.0"
+ }
+ }
+ }
}
}
}
diff --git a/readme.md b/readme.md
index 5ea637da74..8b02720b7f 100644
--- a/readme.md
+++ b/readme.md
@@ -11,6 +11,8 @@
[![Slack Status](http://slack.feathersjs.com/badge.svg)](http://slack.feathersjs.com)
[![Telegram Status](https://img.shields.io/badge/Telegram_RU_chat:-Feathers-216bc1.svg?style=flat)](https://t.me/featherjs)
+[![Sauce Test Status](https://saucelabs.com/browser-matrix/feathersjs.svg)](https://saucelabs.com/u/feathersjs)
+
Feathers is a real-time, micro-service web framework for NodeJS that gives you control over your data via RESTful resources, sockets and flexible plug-ins.
## Support