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