From 4bacf809a88b595327a3dbe69a5173479a211eda Mon Sep 17 00:00:00 2001 From: niahmiah Date: Fri, 19 May 2017 11:04:33 -0400 Subject: [PATCH] Babel + flow + documentation.js (#5) * Refactor to use babel + flow + documentation.js --- .babelrc | 16 + .eslintignore | 6 +- .eslintrc | 1 + .flowconfig | 8 + .nvmrc | 2 +- API.md | 245 ++ flow-typed/npm/amqplib_vx.x.x.js | 417 +++ flow-typed/npm/babel-cli_vx.x.x.js | 108 + flow-typed/npm/babel-eslint_vx.x.x.js | 80 + .../babel-plugin-add-module-exports_vx.x.x.js | 39 + flow-typed/npm/babel-preset-env_vx.x.x.js | 74 + flow-typed/npm/babel-preset-flow_vx.x.x.js | 32 + flow-typed/npm/chai_v3.5.x.js | 216 ++ flow-typed/npm/coveralls_vx.x.x.js | 143 + flow-typed/npm/debug_v2.x.x.js | 30 + flow-typed/npm/documentation_vx.x.x.js | 431 ++++ flow-typed/npm/eslint_vx.x.x.js | 2293 +++++++++++++++++ flow-typed/npm/express_v4.x.x.js | 189 ++ flow-typed/npm/flow-bin_v0.x.x.js | 6 + flow-typed/npm/flow-typed_vx.x.x.js | 193 ++ flow-typed/npm/istanbul_vx.x.x.js | 353 +++ flow-typed/npm/mocha_v3.1.x.js | 25 + flow-typed/npm/rxjs_v5.0.x.js | 795 ++++++ flow-typed/npm/sinon_vx.x.x.js | 375 +++ flow-typed/npm/uuid_v3.x.x.js | 15 + flow-typed/npm/uws_vx.x.x.js | 32 + lib/amqp.js | 323 +-- lib/message.js | 164 +- lib/messenger.js | 194 +- lib/websocket.js | 240 +- package.json | 23 +- src/amqp.js | 174 ++ src/message.js | 137 + src/messenger.js | 121 + src/websocket.js | 153 ++ test/index.js | 62 +- 36 files changed, 7332 insertions(+), 383 deletions(-) create mode 100644 .babelrc create mode 100644 .flowconfig create mode 100644 API.md create mode 100644 flow-typed/npm/amqplib_vx.x.x.js create mode 100644 flow-typed/npm/babel-cli_vx.x.x.js create mode 100644 flow-typed/npm/babel-eslint_vx.x.x.js create mode 100644 flow-typed/npm/babel-plugin-add-module-exports_vx.x.x.js create mode 100644 flow-typed/npm/babel-preset-env_vx.x.x.js create mode 100644 flow-typed/npm/babel-preset-flow_vx.x.x.js create mode 100644 flow-typed/npm/chai_v3.5.x.js create mode 100644 flow-typed/npm/coveralls_vx.x.x.js create mode 100644 flow-typed/npm/debug_v2.x.x.js create mode 100644 flow-typed/npm/documentation_vx.x.x.js create mode 100644 flow-typed/npm/eslint_vx.x.x.js create mode 100644 flow-typed/npm/express_v4.x.x.js create mode 100644 flow-typed/npm/flow-bin_v0.x.x.js create mode 100644 flow-typed/npm/flow-typed_vx.x.x.js create mode 100644 flow-typed/npm/istanbul_vx.x.x.js create mode 100644 flow-typed/npm/mocha_v3.1.x.js create mode 100644 flow-typed/npm/rxjs_v5.0.x.js create mode 100644 flow-typed/npm/sinon_vx.x.x.js create mode 100644 flow-typed/npm/uuid_v3.x.x.js create mode 100644 flow-typed/npm/uws_vx.x.x.js create mode 100644 src/amqp.js create mode 100644 src/message.js create mode 100644 src/messenger.js create mode 100644 src/websocket.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..41de6f3 --- /dev/null +++ b/.babelrc @@ -0,0 +1,16 @@ +{ + "presets": [ + [ + "env", + { + "targets": { + "node": "current" + } + } + ], + "flow" + ], + "plugins": [ + "add-module-exports" + ] +} diff --git a/.eslintignore b/.eslintignore index ba2a97b..001fce8 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,4 @@ -node_modules -coverage +node_modules/ +coverage/ +lib/ +flow-typed/ diff --git a/.eslintrc b/.eslintrc index 38e116d..73cf3c0 100644 --- a/.eslintrc +++ b/.eslintrc @@ -7,6 +7,7 @@ "jquery": true, "browser": true }, + "parser": "babel-eslint", "parserOptions": { "ecmaVersion": 6, "sourceType": "module" diff --git a/.flowconfig b/.flowconfig new file mode 100644 index 0000000..a7f3812 --- /dev/null +++ b/.flowconfig @@ -0,0 +1,8 @@ +[ignore] +.*/node_modules/stylelint.* +.*/node_modules/documentation.* +[include] + +[libs] + +[options] diff --git a/.nvmrc b/.nvmrc index b8626c4..1e8b314 100644 --- a/.nvmrc +++ b/.nvmrc @@ -1 +1 @@ -4 +6 diff --git a/API.md b/API.md new file mode 100644 index 0000000..6043636 --- /dev/null +++ b/API.md @@ -0,0 +1,245 @@ + + +### Table of Contents + +- [AmqpMessenger](#amqpmessenger) + - [constructor](#constructor) + - [start](#start) + - [stop](#stop) + - [publish](#publish) + - [\_createObservable](#_createobservable) + - [createNotificationObservable](#createnotificationobservable) + - [createWorkObservable](#createworkobservable) +- [Message](#message) + - [constructor](#constructor-1) + - [toString](#tostring) + - [toWS](#tows) + - [toAmqp](#toamqp) + - [getTopic](#gettopic) + - [ack](#ack) + - [nack](#nack) + - [fromAmqp](#fromamqp) +- [Messenger](#messenger) + - [constructor](#constructor-2) + - [start](#start-1) + - [stop](#stop-1) + - [publish](#publish-1) + - [createNotificationObservable](#createnotificationobservable-1) + - [createWorkObservable](#createworkobservable-1) +- [WebsocketRelay](#websocketrelay) + - [constructor](#constructor-3) + +## AmqpMessenger + +**Extends Messenger** + +A messenger that can use amqp topic exchanges and queues + +**Parameters** + +- `params` **{amqp: {connectionString: [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), exchangeName: [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)}, port: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)}** + +### constructor + +Create a new amqp messenger instance + +**Parameters** + +- `params` **{amqp: {connectionString: [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String), exchangeName: [string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)}, port: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)}** + +### start + +start the service + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<any>** + +### stop + +stop the service + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<any>** + +### publish + +publish a message to a topic + +**Parameters** + +- `topic` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** +- `message` **[Message](#message)** + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<any>** + +### \_createObservable + +create an observable for a given topic, type, and queue + +**Parameters** + +- `topic` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** +- `type` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** +- `queue` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<Rx.Observable<any>>** + +### createNotificationObservable + +create an observable for a given topic, that is meant for multiple recipients per message + +**Parameters** + +- `topic` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<Rx.Observable<any>>** + +### createWorkObservable + +create an observable for a given topic, that is meant for a single recipient per message + +**Parameters** + +- `topic` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** +- `queue` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<Rx.Observable<any>>** + +## Message + +A Message object + +**Parameters** + +- `message` **MessageData** + +### constructor + +create a new instance of Message + +**Parameters** + +- `message` **MessageData** + +### toString + +Stringify the message + +Returns **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +### toWS + +Convert the message for websocket delivery + +Returns **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +### toAmqp + +Convert the message for amqp delivery + +Returns **[Buffer](https://nodejs.org/api/buffer.html)** + +### getTopic + +Get the preferred topic name from the message context + +Returns **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +### ack + +Ack a work message (mark it as completed) + +Returns **void** + +### nack + +Nack a work message (mark it as failed, for redelivery) + +Returns **void** + +### fromAmqp + +Convert a raw amqp message into an instance of Message + +**Parameters** + +- `rawMessage` +- `channel` + +Returns **[Message](#message)** + +## Messenger + +**Extends events.EventEmitter** + +An in-memory messenger, providing pub/sub like features + +**Parameters** + +- `params` **{port: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)}** + +### constructor + +Create a new messenger instance + +**Parameters** + +- `params` **{port: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)}** + +### start + +start the service + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<any>** + +### stop + +stop the service + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<any>** + +### publish + +publish a message to a topic + +**Parameters** + +- `topic` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** +- `message` **[Message](#message)** + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<any>** + +### createNotificationObservable + +create an observable for a given topic, that is meant for multiple recipients per message + +**Parameters** + +- `topic` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<Rx.Observable<any>>** + +### createWorkObservable + +create an observable for a given topic, that is meant for a single recipient per message + +**Parameters** + +- `topic` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** +- `sharedQueue` **[string](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)** + +Returns **[Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)<Rx.Observable<any>>** + +## WebsocketRelay + +A performant websocket relay for messenger + +**Parameters** + +- `params` **{messenger: [Messenger](#messenger), port: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number), pingInterval: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)}** + +### constructor + +create a new instance of websocket relay + +**Parameters** + +- `params` **{messenger: [Messenger](#messenger), port: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number), pingInterval: [number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)}** diff --git a/flow-typed/npm/amqplib_vx.x.x.js b/flow-typed/npm/amqplib_vx.x.x.js new file mode 100644 index 0000000..5339b45 --- /dev/null +++ b/flow-typed/npm/amqplib_vx.x.x.js @@ -0,0 +1,417 @@ +// flow-typed signature: c31122192232525b9b6acf284d12129a +// flow-typed version: <>/amqplib_v^0.5.1/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'amqplib' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'amqplib' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'amqplib/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/examples/headers' { + declare module.exports: any; +} + +declare module 'amqplib/examples/send_generators' { + declare module.exports: any; +} + +declare module 'amqplib/examples/ssl' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/callback_api/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/emit_log' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/new_task' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_direct' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs_topic' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive_logs' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/receive' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_client' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/rpc_server' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/send' { + declare module.exports: any; +} + +declare module 'amqplib/examples/tutorials/worker' { + declare module.exports: any; +} + +declare module 'amqplib/examples/waitForConfirms' { + declare module.exports: any; +} + +declare module 'amqplib/lib/api_args' { + declare module.exports: any; +} + +declare module 'amqplib/lib/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/lib/callback_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel_model' { + declare module.exports: any; +} + +declare module 'amqplib/lib/channel' { + declare module.exports: any; +} + +declare module 'amqplib/lib/codec' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connect' { + declare module.exports: any; +} + +declare module 'amqplib/lib/connection' { + declare module.exports: any; +} + +declare module 'amqplib/lib/credentials' { + declare module.exports: any; +} + +declare module 'amqplib/lib/defs' { + declare module.exports: any; +} + +declare module 'amqplib/lib/error' { + declare module.exports: any; +} + +declare module 'amqplib/lib/format' { + declare module.exports: any; +} + +declare module 'amqplib/lib/frame' { + declare module.exports: any; +} + +declare module 'amqplib/lib/heartbeat' { + declare module.exports: any; +} + +declare module 'amqplib/lib/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/bitset' { + declare module.exports: any; +} + +declare module 'amqplib/test/callback_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel_api' { + declare module.exports: any; +} + +declare module 'amqplib/test/channel' { + declare module.exports: any; +} + +declare module 'amqplib/test/codec' { + declare module.exports: any; +} + +declare module 'amqplib/test/connect' { + declare module.exports: any; +} + +declare module 'amqplib/test/connection' { + declare module.exports: any; +} + +declare module 'amqplib/test/data' { + declare module.exports: any; +} + +declare module 'amqplib/test/frame' { + declare module.exports: any; +} + +declare module 'amqplib/test/mux' { + declare module.exports: any; +} + +declare module 'amqplib/test/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'amqplib/callback_api.js' { + declare module.exports: $Exports<'amqplib/callback_api'>; +} +declare module 'amqplib/channel_api.js' { + declare module.exports: $Exports<'amqplib/channel_api'>; +} +declare module 'amqplib/examples/headers.js' { + declare module.exports: $Exports<'amqplib/examples/headers'>; +} +declare module 'amqplib/examples/send_generators.js' { + declare module.exports: $Exports<'amqplib/examples/send_generators'>; +} +declare module 'amqplib/examples/ssl.js' { + declare module.exports: $Exports<'amqplib/examples/ssl'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/emit_log'>; +} +declare module 'amqplib/examples/tutorials/callback_api/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/new_task'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/callback_api/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/receive'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/callback_api/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/callback_api/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/send'>; +} +declare module 'amqplib/examples/tutorials/callback_api/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/callback_api/worker'>; +} +declare module 'amqplib/examples/tutorials/emit_log_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_direct'>; +} +declare module 'amqplib/examples/tutorials/emit_log_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log_topic'>; +} +declare module 'amqplib/examples/tutorials/emit_log.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/emit_log'>; +} +declare module 'amqplib/examples/tutorials/new_task.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/new_task'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_direct.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_direct'>; +} +declare module 'amqplib/examples/tutorials/receive_logs_topic.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs_topic'>; +} +declare module 'amqplib/examples/tutorials/receive_logs.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive_logs'>; +} +declare module 'amqplib/examples/tutorials/receive.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/receive'>; +} +declare module 'amqplib/examples/tutorials/rpc_client.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_client'>; +} +declare module 'amqplib/examples/tutorials/rpc_server.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/rpc_server'>; +} +declare module 'amqplib/examples/tutorials/send.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/send'>; +} +declare module 'amqplib/examples/tutorials/worker.js' { + declare module.exports: $Exports<'amqplib/examples/tutorials/worker'>; +} +declare module 'amqplib/examples/waitForConfirms.js' { + declare module.exports: $Exports<'amqplib/examples/waitForConfirms'>; +} +declare module 'amqplib/lib/api_args.js' { + declare module.exports: $Exports<'amqplib/lib/api_args'>; +} +declare module 'amqplib/lib/bitset.js' { + declare module.exports: $Exports<'amqplib/lib/bitset'>; +} +declare module 'amqplib/lib/callback_model.js' { + declare module.exports: $Exports<'amqplib/lib/callback_model'>; +} +declare module 'amqplib/lib/channel_model.js' { + declare module.exports: $Exports<'amqplib/lib/channel_model'>; +} +declare module 'amqplib/lib/channel.js' { + declare module.exports: $Exports<'amqplib/lib/channel'>; +} +declare module 'amqplib/lib/codec.js' { + declare module.exports: $Exports<'amqplib/lib/codec'>; +} +declare module 'amqplib/lib/connect.js' { + declare module.exports: $Exports<'amqplib/lib/connect'>; +} +declare module 'amqplib/lib/connection.js' { + declare module.exports: $Exports<'amqplib/lib/connection'>; +} +declare module 'amqplib/lib/credentials.js' { + declare module.exports: $Exports<'amqplib/lib/credentials'>; +} +declare module 'amqplib/lib/defs.js' { + declare module.exports: $Exports<'amqplib/lib/defs'>; +} +declare module 'amqplib/lib/error.js' { + declare module.exports: $Exports<'amqplib/lib/error'>; +} +declare module 'amqplib/lib/format.js' { + declare module.exports: $Exports<'amqplib/lib/format'>; +} +declare module 'amqplib/lib/frame.js' { + declare module.exports: $Exports<'amqplib/lib/frame'>; +} +declare module 'amqplib/lib/heartbeat.js' { + declare module.exports: $Exports<'amqplib/lib/heartbeat'>; +} +declare module 'amqplib/lib/mux.js' { + declare module.exports: $Exports<'amqplib/lib/mux'>; +} +declare module 'amqplib/test/bitset.js' { + declare module.exports: $Exports<'amqplib/test/bitset'>; +} +declare module 'amqplib/test/callback_api.js' { + declare module.exports: $Exports<'amqplib/test/callback_api'>; +} +declare module 'amqplib/test/channel_api.js' { + declare module.exports: $Exports<'amqplib/test/channel_api'>; +} +declare module 'amqplib/test/channel.js' { + declare module.exports: $Exports<'amqplib/test/channel'>; +} +declare module 'amqplib/test/codec.js' { + declare module.exports: $Exports<'amqplib/test/codec'>; +} +declare module 'amqplib/test/connect.js' { + declare module.exports: $Exports<'amqplib/test/connect'>; +} +declare module 'amqplib/test/connection.js' { + declare module.exports: $Exports<'amqplib/test/connection'>; +} +declare module 'amqplib/test/data.js' { + declare module.exports: $Exports<'amqplib/test/data'>; +} +declare module 'amqplib/test/frame.js' { + declare module.exports: $Exports<'amqplib/test/frame'>; +} +declare module 'amqplib/test/mux.js' { + declare module.exports: $Exports<'amqplib/test/mux'>; +} +declare module 'amqplib/test/util.js' { + declare module.exports: $Exports<'amqplib/test/util'>; +} diff --git a/flow-typed/npm/babel-cli_vx.x.x.js b/flow-typed/npm/babel-cli_vx.x.x.js new file mode 100644 index 0000000..6298f44 --- /dev/null +++ b/flow-typed/npm/babel-cli_vx.x.x.js @@ -0,0 +1,108 @@ +// flow-typed signature: 8615cf6c39596ff7ba27c4a0377fe299 +// flow-typed version: <>/babel-cli_v^6.24.1/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-cli' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-cli' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-cli/bin/babel-doctor' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/bin/babel' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/_babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-external-helpers' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel-node' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/dir' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/file' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/index' { + declare module.exports: any; +} + +declare module 'babel-cli/lib/babel/util' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-cli/bin/babel-doctor.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-doctor'>; +} +declare module 'babel-cli/bin/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-external-helpers'>; +} +declare module 'babel-cli/bin/babel-node.js' { + declare module.exports: $Exports<'babel-cli/bin/babel-node'>; +} +declare module 'babel-cli/bin/babel.js' { + declare module.exports: $Exports<'babel-cli/bin/babel'>; +} +declare module 'babel-cli/index' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/index.js' { + declare module.exports: $Exports<'babel-cli'>; +} +declare module 'babel-cli/lib/_babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/_babel-node'>; +} +declare module 'babel-cli/lib/babel-external-helpers.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-external-helpers'>; +} +declare module 'babel-cli/lib/babel-node.js' { + declare module.exports: $Exports<'babel-cli/lib/babel-node'>; +} +declare module 'babel-cli/lib/babel/dir.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/dir'>; +} +declare module 'babel-cli/lib/babel/file.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/file'>; +} +declare module 'babel-cli/lib/babel/index.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/index'>; +} +declare module 'babel-cli/lib/babel/util.js' { + declare module.exports: $Exports<'babel-cli/lib/babel/util'>; +} diff --git a/flow-typed/npm/babel-eslint_vx.x.x.js b/flow-typed/npm/babel-eslint_vx.x.x.js new file mode 100644 index 0000000..cc4f6c8 --- /dev/null +++ b/flow-typed/npm/babel-eslint_vx.x.x.js @@ -0,0 +1,80 @@ +// flow-typed signature: f3c3dd3c4bea413962ad456458ec0804 +// flow-typed version: <>/babel-eslint_v^7.2.3/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-eslint' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-eslint' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-eslint/babylon-to-espree/attachComments' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/convertComments' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/convertTemplateType' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/index' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/toAST' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/toToken' { + declare module.exports: any; +} + +declare module 'babel-eslint/babylon-to-espree/toTokens' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-eslint/babylon-to-espree/attachComments.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/attachComments'>; +} +declare module 'babel-eslint/babylon-to-espree/convertComments.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/convertComments'>; +} +declare module 'babel-eslint/babylon-to-espree/convertTemplateType.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/convertTemplateType'>; +} +declare module 'babel-eslint/babylon-to-espree/index.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/index'>; +} +declare module 'babel-eslint/babylon-to-espree/toAST.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toAST'>; +} +declare module 'babel-eslint/babylon-to-espree/toToken.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toToken'>; +} +declare module 'babel-eslint/babylon-to-espree/toTokens.js' { + declare module.exports: $Exports<'babel-eslint/babylon-to-espree/toTokens'>; +} +declare module 'babel-eslint/index' { + declare module.exports: $Exports<'babel-eslint'>; +} +declare module 'babel-eslint/index.js' { + declare module.exports: $Exports<'babel-eslint'>; +} diff --git a/flow-typed/npm/babel-plugin-add-module-exports_vx.x.x.js b/flow-typed/npm/babel-plugin-add-module-exports_vx.x.x.js new file mode 100644 index 0000000..dad9379 --- /dev/null +++ b/flow-typed/npm/babel-plugin-add-module-exports_vx.x.x.js @@ -0,0 +1,39 @@ +// flow-typed signature: 59a88fee1bbc005a0d55059507e4f194 +// flow-typed version: <>/babel-plugin-add-module-exports_v^0.2.1/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-plugin-add-module-exports' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-plugin-add-module-exports' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-plugin-add-module-exports/changelog' { + declare module.exports: any; +} + +declare module 'babel-plugin-add-module-exports/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-plugin-add-module-exports/changelog.js' { + declare module.exports: $Exports<'babel-plugin-add-module-exports/changelog'>; +} +declare module 'babel-plugin-add-module-exports/lib/index.js' { + declare module.exports: $Exports<'babel-plugin-add-module-exports/lib/index'>; +} diff --git a/flow-typed/npm/babel-preset-env_vx.x.x.js b/flow-typed/npm/babel-preset-env_vx.x.x.js new file mode 100644 index 0000000..ca1a90b --- /dev/null +++ b/flow-typed/npm/babel-preset-env_vx.x.x.js @@ -0,0 +1,74 @@ +// flow-typed signature: f12875965303032e2f229e46f5734514 +// flow-typed version: <>/babel-preset-env_v^1.4.0/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-env' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-env' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-env/data/built-in-features' { + declare module.exports: any; +} + +declare module 'babel-preset-env/data/plugin-features' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/default-includes' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/index' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/module-transformations' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/normalize-options' { + declare module.exports: any; +} + +declare module 'babel-preset-env/lib/transform-polyfill-require-plugin' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-env/data/built-in-features.js' { + declare module.exports: $Exports<'babel-preset-env/data/built-in-features'>; +} +declare module 'babel-preset-env/data/plugin-features.js' { + declare module.exports: $Exports<'babel-preset-env/data/plugin-features'>; +} +declare module 'babel-preset-env/lib/default-includes.js' { + declare module.exports: $Exports<'babel-preset-env/lib/default-includes'>; +} +declare module 'babel-preset-env/lib/index.js' { + declare module.exports: $Exports<'babel-preset-env/lib/index'>; +} +declare module 'babel-preset-env/lib/module-transformations.js' { + declare module.exports: $Exports<'babel-preset-env/lib/module-transformations'>; +} +declare module 'babel-preset-env/lib/normalize-options.js' { + declare module.exports: $Exports<'babel-preset-env/lib/normalize-options'>; +} +declare module 'babel-preset-env/lib/transform-polyfill-require-plugin.js' { + declare module.exports: $Exports<'babel-preset-env/lib/transform-polyfill-require-plugin'>; +} diff --git a/flow-typed/npm/babel-preset-flow_vx.x.x.js b/flow-typed/npm/babel-preset-flow_vx.x.x.js new file mode 100644 index 0000000..80530ae --- /dev/null +++ b/flow-typed/npm/babel-preset-flow_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 76bb465b2bfa57b0d98f5ec2f8633ee5 +// flow-typed version: <>/babel-preset-flow_v^6.23.0/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'babel-preset-flow' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'babel-preset-flow' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'babel-preset-flow/lib/index' { + declare module.exports: any; +} + +// Filename aliases +declare module 'babel-preset-flow/lib/index.js' { + declare module.exports: $Exports<'babel-preset-flow/lib/index'>; +} diff --git a/flow-typed/npm/chai_v3.5.x.js b/flow-typed/npm/chai_v3.5.x.js new file mode 100644 index 0000000..b920857 --- /dev/null +++ b/flow-typed/npm/chai_v3.5.x.js @@ -0,0 +1,216 @@ +// flow-typed signature: bad3c03afed474d4fb576a7afe069701 +// flow-typed version: 731a6ee6c3/chai_v3.5.x/flow_>=v0.24.0 + +declare module "chai" { + + declare type ExpectChain = { + and: ExpectChain, + at: ExpectChain, + be: ExpectChain, + been: ExpectChain, + have: ExpectChain, + has: ExpectChain, + is: ExpectChain, + of: ExpectChain, + same: ExpectChain, + that: ExpectChain, + to: ExpectChain, + which: ExpectChain, + with: ExpectChain, + + not: ExpectChain, + deep: ExpectChain, + any: ExpectChain, + all: ExpectChain, + + a: ExpectChain & (type: string) => ExpectChain, + an: ExpectChain & (type: string) => ExpectChain, + + include: ExpectChain & (value: mixed) => ExpectChain, + includes: ExpectChain & (value: mixed) => ExpectChain, + contain: ExpectChain & (value: mixed) => ExpectChain, + contains: ExpectChain & (value: mixed) => ExpectChain, + + eql: (value: T) => ExpectChain, + equal: (value: T) => ExpectChain, + equals: (value: T) => ExpectChain, + + above: (value: T & number) => ExpectChain, + least: (value: T & number) => ExpectChain, + below: (value: T & number) => ExpectChain, + most: (value: T & number) => ExpectChain, + within: (start: T & number, finish: T & number) => ExpectChain, + + instanceof: (constructor: mixed) => ExpectChain, + property: ( +

(name: string, value?: P) => ExpectChain

+ & (name: string) => ExpectChain + ), + + length: (value: number) => ExpectChain | ExpectChain, + lengthOf: (value: number) => ExpectChain, + + match: (regex: RegExp) => ExpectChain, + string: (string: string) => ExpectChain, + + key: (key: string) => ExpectChain, + keys: (key: string | Array, ...keys: Array) => ExpectChain, + + throw: ( + err: Class | Error | RegExp | string, + errMsgMatcher?: RegExp | string, + msg?: string) => ExpectChain, + + respondTo: (method: string) => ExpectChain, + itself: ExpectChain, + + satisfy: (method: (value: T) => bool) => ExpectChain, + + closeTo: (expected: T & number, delta: number) => ExpectChain, + + members: (set: mixed) => ExpectChain, + oneOf: (list: Array) => ExpectChain, + + change: (obj: mixed, key: string) => ExpectChain, + increase: (obj: mixed, key: string) => ExpectChain, + decrease: (obj: mixed, key: string) => ExpectChain, + + // dirty-chai + ok: () => ExpectChain, + true: () => ExpectChain, + false: () => ExpectChain, + null: () => ExpectChain, + undefined: () => ExpectChain, + exist: () => ExpectChain, + empty: () => ExpectChain, + + // chai-immutable + size: (n: number) => ExpectChain, + + // sinon-chai + called: () => ExpectChain, + callCount: (n: number) => ExpectChain, + calledOnce: () => ExpectChain, + calledBefore: (spy: mixed) => ExpectChain, + calledAfter: (spy: mixed) => ExpectChain, + calledWith: (...args: Array) => ExpectChain, + calledWithMatch: (...args: Array) => ExpectChain, + calledWithExactly: (...args: Array) => ExpectChain, + + // chai-as-promised + eventually: ExpectChain, + resolvedWith: (value: mixed) => Promise & ExpectChain, + resolved: () => Promise & ExpectChain, + rejectedWith: (value: mixed) => Promise & ExpectChain, + rejected: () => Promise & ExpectChain, + notify: (callback: () => mixed) => ExpectChain, + + // chai-subset + containSubset: (obj: Object | Object[]) => ExpectChain + }; + + declare function expect(actual: T): ExpectChain; + + declare function use(plugin: (chai: Object, utils: Object) => void): void; + + declare class assert { + static(expression: mixed, message?: string): void; + static fail(actual: mixed, expected: mixed, message?: string, operator?: string): void; + + static isOk(object: mixed, message?: string): void; + static isNotOk(object: mixed, message?: string): void; + + static equal(actual: mixed, expected: mixed, message?: string): void; + static notEqual(actual: mixed, expected: mixed, message?: string): void; + + static strictEqual(act: mixed, exp: mixed, msg?: string): void; + static notStrictEqual(act: mixed, exp: mixed, msg?: string): void; + + static deepEqual(act: mixed, exp: mixed, msg?: string): void; + static notDeepEqual(act: mixed, exp: mixed, msg?: string): void; + + static ok(val: mixed, msg?: string): void; + static isTrue(val: mixed, msg?: string): void; + static isNotTrue(val: mixed, msg?: string): void; + static isFalse(val: mixed, msg?: string): void; + static isNotFalse(val: mixed, msg?: string): void; + + static isNull(val: mixed, msg?: string): void; + static isNotNull(val: mixed, msg?: string): void; + + static isUndefined(val: mixed, msg?: string): void; + static isDefined(val: mixed, msg?: string): void; + + static isNaN(val: mixed, msg?: string): void; + static isNotNaN(val: mixed, msg?: string): void; + + static isAbove(val: number, abv: number, msg?: string): void; + static isBelow(val: number, blw: number, msg?: string): void; + + static isAtMost(val: number, atmst: number, msg?: string): void; + static isAtLeast(val: number, atlst: number, msg?: string): void; + + static isFunction(val: mixed, msg?: string): void; + static isNotFunction(val: mixed, msg?: string): void; + + static isObject(val: mixed, msg?: string): void; + static isNotObject(val: mixed, msg?: string): void; + + static isArray(val: mixed, msg?: string): void; + static isNotArray(val: mixed, msg?: string): void; + + static isString(val: mixed, msg?: string): void; + static isNotString(val: mixed, msg?: string): void; + + static isNumber(val: mixed, msg?: string): void; + static isNotNumber(val: mixed, msg?: string): void; + + static isBoolean(val: mixed, msg?: string): void; + static isNotBoolean(val: mixed, msg?: string): void; + + static typeOf(val: mixed, type: string, msg?: string): void; + static notTypeOf(val: mixed, type: string, msg?: string): void; + + static instanceOf(val: mixed, constructor: Function, msg?: string): void; + static notInstanceOf(val: mixed, constructor: Function, msg?: string): void; + + static include(exp: string, inc: mixed, msg?: string): void; + static include(exp: Array, inc: T, msg?: string): void; + + static notInclude(exp: string, inc: mixed, msg?: string): void; + static notInclude(exp: Array, inc: T, msg?: string): void; + + static match(exp: mixed, re: RegExp, msg?: string): void; + static notMatch(exp: mixed, re: RegExp, msg?: string): void; + + static property(obj: Object, prop: string, msg?: string): void; + static notProperty(obj: Object, prop: string, msg?: string): void; + static deepProperty(obj: Object, prop: string, msg?: string): void; + static notDeepProperty(obj: Object, prop: string, msg?: string): void; + + static propertyVal(obj: Object, prop: string, val: mixed, msg?: string): void; + static propertyNotVal(obj: Object, prop: string, val: mixed, msg?: string): void; + + static deepPropertyVal(obj: Object, prop: string, val: mixed, msg?: string): void; + static deepPropertyNotVal(obj: Object, prop: string, val: mixed, msg?: string): void; + + static lengthOf(exp: mixed, len: number, msg?: string): void; + + static throws( + func: () => any, + err?: Class | Error | RegExp | string, + errorMsgMatcher?: string | RegExp, + msg?: string): void; + static doesNotThrow( + func: () => any, + err?: Class | Error | RegExp | string, + errorMsgMatcher?: string | RegExp, + msg?: string): void; + } + + declare var config: { + includeStack: boolean, + showDiff: boolean, + truncateThreshold: number + }; +} diff --git a/flow-typed/npm/coveralls_vx.x.x.js b/flow-typed/npm/coveralls_vx.x.x.js new file mode 100644 index 0000000..ad24f18 --- /dev/null +++ b/flow-typed/npm/coveralls_vx.x.x.js @@ -0,0 +1,143 @@ +// flow-typed signature: f70c62a8f0c9a2e2479d9746ec034602 +// flow-typed version: <>/coveralls_v^2.13.0/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'coveralls' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'coveralls' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'coveralls/bin/coveralls' { + declare module.exports: any; +} + +declare module 'coveralls/fixtures/lib/index' { + declare module.exports: any; +} + +declare module 'coveralls/lib/convertLcovToCoveralls' { + declare module.exports: any; +} + +declare module 'coveralls/lib/detectLocalGit' { + declare module.exports: any; +} + +declare module 'coveralls/lib/fetchGitData' { + declare module.exports: any; +} + +declare module 'coveralls/lib/getOptions' { + declare module.exports: any; +} + +declare module 'coveralls/lib/handleInput' { + declare module.exports: any; +} + +declare module 'coveralls/lib/logger' { + declare module.exports: any; +} + +declare module 'coveralls/lib/sendToCoveralls' { + declare module.exports: any; +} + +declare module 'coveralls/test/convertLcovToCoveralls' { + declare module.exports: any; +} + +declare module 'coveralls/test/detectLocalGit' { + declare module.exports: any; +} + +declare module 'coveralls/test/fetchGitData' { + declare module.exports: any; +} + +declare module 'coveralls/test/getOptions' { + declare module.exports: any; +} + +declare module 'coveralls/test/handleInput' { + declare module.exports: any; +} + +declare module 'coveralls/test/logger' { + declare module.exports: any; +} + +declare module 'coveralls/test/sendToCoveralls' { + declare module.exports: any; +} + +// Filename aliases +declare module 'coveralls/bin/coveralls.js' { + declare module.exports: $Exports<'coveralls/bin/coveralls'>; +} +declare module 'coveralls/fixtures/lib/index.js' { + declare module.exports: $Exports<'coveralls/fixtures/lib/index'>; +} +declare module 'coveralls/index' { + declare module.exports: $Exports<'coveralls'>; +} +declare module 'coveralls/index.js' { + declare module.exports: $Exports<'coveralls'>; +} +declare module 'coveralls/lib/convertLcovToCoveralls.js' { + declare module.exports: $Exports<'coveralls/lib/convertLcovToCoveralls'>; +} +declare module 'coveralls/lib/detectLocalGit.js' { + declare module.exports: $Exports<'coveralls/lib/detectLocalGit'>; +} +declare module 'coveralls/lib/fetchGitData.js' { + declare module.exports: $Exports<'coveralls/lib/fetchGitData'>; +} +declare module 'coveralls/lib/getOptions.js' { + declare module.exports: $Exports<'coveralls/lib/getOptions'>; +} +declare module 'coveralls/lib/handleInput.js' { + declare module.exports: $Exports<'coveralls/lib/handleInput'>; +} +declare module 'coveralls/lib/logger.js' { + declare module.exports: $Exports<'coveralls/lib/logger'>; +} +declare module 'coveralls/lib/sendToCoveralls.js' { + declare module.exports: $Exports<'coveralls/lib/sendToCoveralls'>; +} +declare module 'coveralls/test/convertLcovToCoveralls.js' { + declare module.exports: $Exports<'coveralls/test/convertLcovToCoveralls'>; +} +declare module 'coveralls/test/detectLocalGit.js' { + declare module.exports: $Exports<'coveralls/test/detectLocalGit'>; +} +declare module 'coveralls/test/fetchGitData.js' { + declare module.exports: $Exports<'coveralls/test/fetchGitData'>; +} +declare module 'coveralls/test/getOptions.js' { + declare module.exports: $Exports<'coveralls/test/getOptions'>; +} +declare module 'coveralls/test/handleInput.js' { + declare module.exports: $Exports<'coveralls/test/handleInput'>; +} +declare module 'coveralls/test/logger.js' { + declare module.exports: $Exports<'coveralls/test/logger'>; +} +declare module 'coveralls/test/sendToCoveralls.js' { + declare module.exports: $Exports<'coveralls/test/sendToCoveralls'>; +} diff --git a/flow-typed/npm/debug_v2.x.x.js b/flow-typed/npm/debug_v2.x.x.js new file mode 100644 index 0000000..d62ded4 --- /dev/null +++ b/flow-typed/npm/debug_v2.x.x.js @@ -0,0 +1,30 @@ +// flow-typed signature: 405987958aa5512d6259ff42e56f7ecb +// flow-typed version: 94e9f7e0a4/debug_v2.x.x/flow_>=v0.28.x + +declare module 'debug' { + declare type Debugger = { + (...args: Array): void, + (formatter: string, ...args: Array): void, + (err: Error, ...args: Array): void, + enabled: boolean, + log: () => {}, + namespace: string; + }; + + declare function exports(namespace: string): Debugger; + + declare var names: Array; + declare var skips: Array; + declare var colors: Array; + + declare function disable(): void; + declare function enable(namespaces: string): void; + declare function enabled(name: string): boolean; + declare function humanize(): void; + declare function useColors(): boolean; + declare function log(): void; + + declare var formatters: { + [formatter: string]: () => {} + }; +}; diff --git a/flow-typed/npm/documentation_vx.x.x.js b/flow-typed/npm/documentation_vx.x.x.js new file mode 100644 index 0000000..e8060f0 --- /dev/null +++ b/flow-typed/npm/documentation_vx.x.x.js @@ -0,0 +1,431 @@ +// flow-typed signature: ec1cb3582a35c14b6fdd56c1bc722d9d +// flow-typed version: <>/documentation_v^4.0.0-rc.1/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'documentation' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'documentation' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'documentation/bin/documentation' { + declare module.exports: any; +} + +declare module 'documentation/declarations/comment' { + declare module.exports: any; +} + +declare module 'documentation/default_theme/assets/anchor' { + declare module.exports: any; +} + +declare module 'documentation/default_theme/assets/site' { + declare module.exports: any; +} + +declare module 'documentation/default_theme/index' { + declare module.exports: any; +} + +declare module 'documentation/lib/commands/build' { + declare module.exports: any; +} + +declare module 'documentation/lib/commands/index' { + declare module.exports: any; +} + +declare module 'documentation/lib/commands/lint' { + declare module.exports: any; +} + +declare module 'documentation/lib/commands/readme' { + declare module.exports: any; +} + +declare module 'documentation/lib/commands/serve' { + declare module.exports: any; +} + +declare module 'documentation/lib/commands/shared_options' { + declare module.exports: any; +} + +declare module 'documentation/lib/extractors/comments' { + declare module.exports: any; +} + +declare module 'documentation/lib/extractors/exported' { + declare module.exports: any; +} + +declare module 'documentation/lib/filter_access' { + declare module.exports: any; +} + +declare module 'documentation/lib/flow_doctrine' { + declare module.exports: any; +} + +declare module 'documentation/lib/garbage_collect' { + declare module.exports: any; +} + +declare module 'documentation/lib/git/find_git' { + declare module.exports: any; +} + +declare module 'documentation/lib/git/url_prefix' { + declare module.exports: any; +} + +declare module 'documentation/lib/github' { + declare module.exports: any; +} + +declare module 'documentation/lib/hierarchy' { + declare module.exports: any; +} + +declare module 'documentation/lib/index' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/access' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/augments' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/finders' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/kind' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/membership' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/name' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/params' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/properties' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/return' { + declare module.exports: any; +} + +declare module 'documentation/lib/infer/type' { + declare module.exports: any; +} + +declare module 'documentation/lib/inline_tokenizer' { + declare module.exports: any; +} + +declare module 'documentation/lib/input/dependency' { + declare module.exports: any; +} + +declare module 'documentation/lib/input/shallow' { + declare module.exports: any; +} + +declare module 'documentation/lib/is_jsdoc_comment' { + declare module.exports: any; +} + +declare module 'documentation/lib/lint' { + declare module.exports: any; +} + +declare module 'documentation/lib/merge_config' { + declare module.exports: any; +} + +declare module 'documentation/lib/module_filters' { + declare module.exports: any; +} + +declare module 'documentation/lib/nest' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/highlighter' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/html' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/json' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/markdown_ast' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/markdown' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/util/format_type' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/util/formatters' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/util/linker_stack' { + declare module.exports: any; +} + +declare module 'documentation/lib/output/util/reroute_links' { + declare module.exports: any; +} + +declare module 'documentation/lib/parse_markdown' { + declare module.exports: any; +} + +declare module 'documentation/lib/parse' { + declare module.exports: any; +} + +declare module 'documentation/lib/parsers/javascript' { + declare module.exports: any; +} + +declare module 'documentation/lib/parsers/parse_to_ast' { + declare module.exports: any; +} + +declare module 'documentation/lib/parsers/polyglot' { + declare module.exports: any; +} + +declare module 'documentation/lib/serve/error_page' { + declare module.exports: any; +} + +declare module 'documentation/lib/serve/server' { + declare module.exports: any; +} + +declare module 'documentation/lib/smart_glob' { + declare module.exports: any; +} + +declare module 'documentation/lib/sort' { + declare module.exports: any; +} + +declare module 'documentation/lib/walk' { + declare module.exports: any; +} + +// Filename aliases +declare module 'documentation/bin/documentation.js' { + declare module.exports: $Exports<'documentation/bin/documentation'>; +} +declare module 'documentation/declarations/comment.js' { + declare module.exports: $Exports<'documentation/declarations/comment'>; +} +declare module 'documentation/default_theme/assets/anchor.js' { + declare module.exports: $Exports<'documentation/default_theme/assets/anchor'>; +} +declare module 'documentation/default_theme/assets/site.js' { + declare module.exports: $Exports<'documentation/default_theme/assets/site'>; +} +declare module 'documentation/default_theme/index.js' { + declare module.exports: $Exports<'documentation/default_theme/index'>; +} +declare module 'documentation/lib/commands/build.js' { + declare module.exports: $Exports<'documentation/lib/commands/build'>; +} +declare module 'documentation/lib/commands/index.js' { + declare module.exports: $Exports<'documentation/lib/commands/index'>; +} +declare module 'documentation/lib/commands/lint.js' { + declare module.exports: $Exports<'documentation/lib/commands/lint'>; +} +declare module 'documentation/lib/commands/readme.js' { + declare module.exports: $Exports<'documentation/lib/commands/readme'>; +} +declare module 'documentation/lib/commands/serve.js' { + declare module.exports: $Exports<'documentation/lib/commands/serve'>; +} +declare module 'documentation/lib/commands/shared_options.js' { + declare module.exports: $Exports<'documentation/lib/commands/shared_options'>; +} +declare module 'documentation/lib/extractors/comments.js' { + declare module.exports: $Exports<'documentation/lib/extractors/comments'>; +} +declare module 'documentation/lib/extractors/exported.js' { + declare module.exports: $Exports<'documentation/lib/extractors/exported'>; +} +declare module 'documentation/lib/filter_access.js' { + declare module.exports: $Exports<'documentation/lib/filter_access'>; +} +declare module 'documentation/lib/flow_doctrine.js' { + declare module.exports: $Exports<'documentation/lib/flow_doctrine'>; +} +declare module 'documentation/lib/garbage_collect.js' { + declare module.exports: $Exports<'documentation/lib/garbage_collect'>; +} +declare module 'documentation/lib/git/find_git.js' { + declare module.exports: $Exports<'documentation/lib/git/find_git'>; +} +declare module 'documentation/lib/git/url_prefix.js' { + declare module.exports: $Exports<'documentation/lib/git/url_prefix'>; +} +declare module 'documentation/lib/github.js' { + declare module.exports: $Exports<'documentation/lib/github'>; +} +declare module 'documentation/lib/hierarchy.js' { + declare module.exports: $Exports<'documentation/lib/hierarchy'>; +} +declare module 'documentation/lib/index.js' { + declare module.exports: $Exports<'documentation/lib/index'>; +} +declare module 'documentation/lib/infer/access.js' { + declare module.exports: $Exports<'documentation/lib/infer/access'>; +} +declare module 'documentation/lib/infer/augments.js' { + declare module.exports: $Exports<'documentation/lib/infer/augments'>; +} +declare module 'documentation/lib/infer/finders.js' { + declare module.exports: $Exports<'documentation/lib/infer/finders'>; +} +declare module 'documentation/lib/infer/kind.js' { + declare module.exports: $Exports<'documentation/lib/infer/kind'>; +} +declare module 'documentation/lib/infer/membership.js' { + declare module.exports: $Exports<'documentation/lib/infer/membership'>; +} +declare module 'documentation/lib/infer/name.js' { + declare module.exports: $Exports<'documentation/lib/infer/name'>; +} +declare module 'documentation/lib/infer/params.js' { + declare module.exports: $Exports<'documentation/lib/infer/params'>; +} +declare module 'documentation/lib/infer/properties.js' { + declare module.exports: $Exports<'documentation/lib/infer/properties'>; +} +declare module 'documentation/lib/infer/return.js' { + declare module.exports: $Exports<'documentation/lib/infer/return'>; +} +declare module 'documentation/lib/infer/type.js' { + declare module.exports: $Exports<'documentation/lib/infer/type'>; +} +declare module 'documentation/lib/inline_tokenizer.js' { + declare module.exports: $Exports<'documentation/lib/inline_tokenizer'>; +} +declare module 'documentation/lib/input/dependency.js' { + declare module.exports: $Exports<'documentation/lib/input/dependency'>; +} +declare module 'documentation/lib/input/shallow.js' { + declare module.exports: $Exports<'documentation/lib/input/shallow'>; +} +declare module 'documentation/lib/is_jsdoc_comment.js' { + declare module.exports: $Exports<'documentation/lib/is_jsdoc_comment'>; +} +declare module 'documentation/lib/lint.js' { + declare module.exports: $Exports<'documentation/lib/lint'>; +} +declare module 'documentation/lib/merge_config.js' { + declare module.exports: $Exports<'documentation/lib/merge_config'>; +} +declare module 'documentation/lib/module_filters.js' { + declare module.exports: $Exports<'documentation/lib/module_filters'>; +} +declare module 'documentation/lib/nest.js' { + declare module.exports: $Exports<'documentation/lib/nest'>; +} +declare module 'documentation/lib/output/highlighter.js' { + declare module.exports: $Exports<'documentation/lib/output/highlighter'>; +} +declare module 'documentation/lib/output/html.js' { + declare module.exports: $Exports<'documentation/lib/output/html'>; +} +declare module 'documentation/lib/output/json.js' { + declare module.exports: $Exports<'documentation/lib/output/json'>; +} +declare module 'documentation/lib/output/markdown_ast.js' { + declare module.exports: $Exports<'documentation/lib/output/markdown_ast'>; +} +declare module 'documentation/lib/output/markdown.js' { + declare module.exports: $Exports<'documentation/lib/output/markdown'>; +} +declare module 'documentation/lib/output/util/format_type.js' { + declare module.exports: $Exports<'documentation/lib/output/util/format_type'>; +} +declare module 'documentation/lib/output/util/formatters.js' { + declare module.exports: $Exports<'documentation/lib/output/util/formatters'>; +} +declare module 'documentation/lib/output/util/linker_stack.js' { + declare module.exports: $Exports<'documentation/lib/output/util/linker_stack'>; +} +declare module 'documentation/lib/output/util/reroute_links.js' { + declare module.exports: $Exports<'documentation/lib/output/util/reroute_links'>; +} +declare module 'documentation/lib/parse_markdown.js' { + declare module.exports: $Exports<'documentation/lib/parse_markdown'>; +} +declare module 'documentation/lib/parse.js' { + declare module.exports: $Exports<'documentation/lib/parse'>; +} +declare module 'documentation/lib/parsers/javascript.js' { + declare module.exports: $Exports<'documentation/lib/parsers/javascript'>; +} +declare module 'documentation/lib/parsers/parse_to_ast.js' { + declare module.exports: $Exports<'documentation/lib/parsers/parse_to_ast'>; +} +declare module 'documentation/lib/parsers/polyglot.js' { + declare module.exports: $Exports<'documentation/lib/parsers/polyglot'>; +} +declare module 'documentation/lib/serve/error_page.js' { + declare module.exports: $Exports<'documentation/lib/serve/error_page'>; +} +declare module 'documentation/lib/serve/server.js' { + declare module.exports: $Exports<'documentation/lib/serve/server'>; +} +declare module 'documentation/lib/smart_glob.js' { + declare module.exports: $Exports<'documentation/lib/smart_glob'>; +} +declare module 'documentation/lib/sort.js' { + declare module.exports: $Exports<'documentation/lib/sort'>; +} +declare module 'documentation/lib/walk.js' { + declare module.exports: $Exports<'documentation/lib/walk'>; +} diff --git a/flow-typed/npm/eslint_vx.x.x.js b/flow-typed/npm/eslint_vx.x.x.js new file mode 100644 index 0000000..753d677 --- /dev/null +++ b/flow-typed/npm/eslint_vx.x.x.js @@ -0,0 +1,2293 @@ +// flow-typed signature: 9354e7847cf55f354b2ca85525e8513a +// flow-typed version: <>/eslint_v^3.19.0/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'eslint' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'eslint' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'eslint/bin/eslint' { + declare module.exports: any; +} + +declare module 'eslint/conf/cli-options' { + declare module.exports: any; +} + +declare module 'eslint/conf/environments' { + declare module.exports: any; +} + +declare module 'eslint/conf/eslint-all' { + declare module.exports: any; +} + +declare module 'eslint/conf/eslint-recommended' { + declare module.exports: any; +} + +declare module 'eslint/lib/api' { + declare module.exports: any; +} + +declare module 'eslint/lib/ast-utils' { + declare module.exports: any; +} + +declare module 'eslint/lib/cli-engine' { + declare module.exports: any; +} + +declare module 'eslint/lib/cli' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path-analyzer' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path-segment' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path-state' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/code-path' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/debug-helpers' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/fork-context' { + declare module.exports: any; +} + +declare module 'eslint/lib/code-path-analysis/id-generator' { + declare module.exports: any; +} + +declare module 'eslint/lib/config' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/autoconfig' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-file' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-initializer' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-ops' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-rule' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/config-validator' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/environments' { + declare module.exports: any; +} + +declare module 'eslint/lib/config/plugins' { + declare module.exports: any; +} + +declare module 'eslint/lib/eslint' { + declare module.exports: any; +} + +declare module 'eslint/lib/file-finder' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/checkstyle' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/codeframe' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/compact' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/html' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/jslint-xml' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/json' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/junit' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/stylish' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/table' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/tap' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/unix' { + declare module.exports: any; +} + +declare module 'eslint/lib/formatters/visualstudio' { + declare module.exports: any; +} + +declare module 'eslint/lib/ignored-paths' { + declare module.exports: any; +} + +declare module 'eslint/lib/internal-rules/internal-consistent-docs-description' { + declare module.exports: any; +} + +declare module 'eslint/lib/internal-rules/internal-no-invalid-meta' { + declare module.exports: any; +} + +declare module 'eslint/lib/load-rules' { + declare module.exports: any; +} + +declare module 'eslint/lib/logging' { + declare module.exports: any; +} + +declare module 'eslint/lib/options' { + declare module.exports: any; +} + +declare module 'eslint/lib/rule-context' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/accessor-pairs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/array-bracket-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/array-callback-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/arrow-body-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/arrow-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/arrow-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/block-scoped-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/block-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/brace-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/callback-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/camelcase' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/capitalized-comments' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/class-methods-use-this' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/comma-dangle' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/comma-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/comma-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/complexity' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/computed-property-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/consistent-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/consistent-this' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/constructor-super' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/curly' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/default-case' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/dot-location' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/dot-notation' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/eol-last' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/eqeqeq' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-call-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-name-matching' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-names' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/func-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/generator-star-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/global-require' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/guard-for-in' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/handle-callback-err' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/id-blacklist' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/id-length' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/id-match' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/indent' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/init-declarations' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/jsx-quotes' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/key-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/keyword-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/line-comment-position' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/linebreak-style' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/lines-around-comment' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/lines-around-directive' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-depth' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-len' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-lines' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-nested-callbacks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-params' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-statements-per-line' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/max-statements' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/multiline-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/new-cap' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/new-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/newline-after-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/newline-before-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/newline-per-chained-call' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-alert' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-array-constructor' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-await-in-loop' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-bitwise' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-caller' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-case-declarations' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-catch-shadow' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-class-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-compare-neg-zero' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-cond-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-confusing-arrow' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-console' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-const-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-constant-condition' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-continue' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-control-regex' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-debugger' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-delete-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-div-regex' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-dupe-args' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-dupe-class-members' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-dupe-keys' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-duplicate-case' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-duplicate-imports' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-else-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty-character-class' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty-function' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty-pattern' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-empty' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-eq-null' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-eval' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-ex-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extend-native' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-bind' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-boolean-cast' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-label' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-extra-semi' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-fallthrough' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-floating-decimal' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-func-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-global-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-implicit-coercion' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-implicit-globals' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-implied-eval' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-inline-comments' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-inner-declarations' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-invalid-regexp' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-invalid-this' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-irregular-whitespace' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-iterator' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-label-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-labels' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-lone-blocks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-lonely-if' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-loop-func' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-magic-numbers' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-mixed-operators' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-mixed-requires' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-mixed-spaces-and-tabs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multi-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multi-spaces' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multi-str' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-multiple-empty-lines' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-native-reassign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-negated-condition' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-negated-in-lhs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-nested-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-func' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-object' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-require' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-symbol' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new-wrappers' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-new' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-obj-calls' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-octal-escape' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-octal' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-param-reassign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-path-concat' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-plusplus' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-process-env' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-process-exit' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-proto' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-prototype-builtins' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-redeclare' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-regex-spaces' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-globals' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-imports' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-modules' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-properties' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-restricted-syntax' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-return-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-return-await' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-script-url' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-self-assign' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-self-compare' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-sequences' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-shadow-restricted-names' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-shadow' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-spaced-func' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-sparse-arrays' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-sync' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-tabs' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-template-curly-in-string' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-this-before-super' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-throw-literal' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-trailing-spaces' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-undef-init' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-undef' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-undefined' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-underscore-dangle' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unexpected-multiline' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unmodified-loop-condition' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unneeded-ternary' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unreachable' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unsafe-finally' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unsafe-negation' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unused-expressions' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unused-labels' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-unused-vars' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-use-before-define' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-call' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-computed-key' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-concat' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-constructor' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-escape' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-rename' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-useless-return' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-void' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-warning-comments' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-whitespace-before-property' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/no-with' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/nonblock-statement-body-position' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-curly-newline' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-curly-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-property-newline' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/object-shorthand' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/one-var-declaration-per-line' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/one-var' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/operator-assignment' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/operator-linebreak' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/padded-blocks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-arrow-callback' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-const' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-destructuring' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-numeric-literals' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-promise-reject-errors' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-reflect' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-rest-params' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-spread' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/prefer-template' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/quote-props' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/quotes' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/radix' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/require-await' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/require-jsdoc' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/require-yield' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/rest-spread-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/semi-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/semi' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/sort-imports' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/sort-keys' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/sort-vars' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-before-blocks' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-before-function-paren' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-in-parens' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-infix-ops' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/space-unary-ops' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/spaced-comment' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/strict' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/symbol-description' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/template-curly-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/template-tag-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/unicode-bom' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/use-isnan' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/valid-jsdoc' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/valid-typeof' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/vars-on-top' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/wrap-iife' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/wrap-regex' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/yield-star-spacing' { + declare module.exports: any; +} + +declare module 'eslint/lib/rules/yoda' { + declare module.exports: any; +} + +declare module 'eslint/lib/testers/event-generator-tester' { + declare module.exports: any; +} + +declare module 'eslint/lib/testers/rule-tester' { + declare module.exports: any; +} + +declare module 'eslint/lib/timing' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/backward-token-comment-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/backward-token-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/cursors' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/decorative-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/filter-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/forward-token-comment-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/forward-token-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/index' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/limit-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/padded-token-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/skip-cursor' { + declare module.exports: any; +} + +declare module 'eslint/lib/token-store/utils' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/comment-event-generator' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/fix-tracker' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/glob-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/glob' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/hash' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/keywords' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/module-resolver' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/node-event-generator' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/npm-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/path-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/patterns/letters' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/rule-fixer' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/source-code-fixer' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/source-code-util' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/source-code' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/traverser' { + declare module.exports: any; +} + +declare module 'eslint/lib/util/xml-escape' { + declare module.exports: any; +} + +// Filename aliases +declare module 'eslint/bin/eslint.js' { + declare module.exports: $Exports<'eslint/bin/eslint'>; +} +declare module 'eslint/conf/cli-options.js' { + declare module.exports: $Exports<'eslint/conf/cli-options'>; +} +declare module 'eslint/conf/environments.js' { + declare module.exports: $Exports<'eslint/conf/environments'>; +} +declare module 'eslint/conf/eslint-all.js' { + declare module.exports: $Exports<'eslint/conf/eslint-all'>; +} +declare module 'eslint/conf/eslint-recommended.js' { + declare module.exports: $Exports<'eslint/conf/eslint-recommended'>; +} +declare module 'eslint/lib/api.js' { + declare module.exports: $Exports<'eslint/lib/api'>; +} +declare module 'eslint/lib/ast-utils.js' { + declare module.exports: $Exports<'eslint/lib/ast-utils'>; +} +declare module 'eslint/lib/cli-engine.js' { + declare module.exports: $Exports<'eslint/lib/cli-engine'>; +} +declare module 'eslint/lib/cli.js' { + declare module.exports: $Exports<'eslint/lib/cli'>; +} +declare module 'eslint/lib/code-path-analysis/code-path-analyzer.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-analyzer'>; +} +declare module 'eslint/lib/code-path-analysis/code-path-segment.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-segment'>; +} +declare module 'eslint/lib/code-path-analysis/code-path-state.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path-state'>; +} +declare module 'eslint/lib/code-path-analysis/code-path.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/code-path'>; +} +declare module 'eslint/lib/code-path-analysis/debug-helpers.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/debug-helpers'>; +} +declare module 'eslint/lib/code-path-analysis/fork-context.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/fork-context'>; +} +declare module 'eslint/lib/code-path-analysis/id-generator.js' { + declare module.exports: $Exports<'eslint/lib/code-path-analysis/id-generator'>; +} +declare module 'eslint/lib/config.js' { + declare module.exports: $Exports<'eslint/lib/config'>; +} +declare module 'eslint/lib/config/autoconfig.js' { + declare module.exports: $Exports<'eslint/lib/config/autoconfig'>; +} +declare module 'eslint/lib/config/config-file.js' { + declare module.exports: $Exports<'eslint/lib/config/config-file'>; +} +declare module 'eslint/lib/config/config-initializer.js' { + declare module.exports: $Exports<'eslint/lib/config/config-initializer'>; +} +declare module 'eslint/lib/config/config-ops.js' { + declare module.exports: $Exports<'eslint/lib/config/config-ops'>; +} +declare module 'eslint/lib/config/config-rule.js' { + declare module.exports: $Exports<'eslint/lib/config/config-rule'>; +} +declare module 'eslint/lib/config/config-validator.js' { + declare module.exports: $Exports<'eslint/lib/config/config-validator'>; +} +declare module 'eslint/lib/config/environments.js' { + declare module.exports: $Exports<'eslint/lib/config/environments'>; +} +declare module 'eslint/lib/config/plugins.js' { + declare module.exports: $Exports<'eslint/lib/config/plugins'>; +} +declare module 'eslint/lib/eslint.js' { + declare module.exports: $Exports<'eslint/lib/eslint'>; +} +declare module 'eslint/lib/file-finder.js' { + declare module.exports: $Exports<'eslint/lib/file-finder'>; +} +declare module 'eslint/lib/formatters/checkstyle.js' { + declare module.exports: $Exports<'eslint/lib/formatters/checkstyle'>; +} +declare module 'eslint/lib/formatters/codeframe.js' { + declare module.exports: $Exports<'eslint/lib/formatters/codeframe'>; +} +declare module 'eslint/lib/formatters/compact.js' { + declare module.exports: $Exports<'eslint/lib/formatters/compact'>; +} +declare module 'eslint/lib/formatters/html.js' { + declare module.exports: $Exports<'eslint/lib/formatters/html'>; +} +declare module 'eslint/lib/formatters/jslint-xml.js' { + declare module.exports: $Exports<'eslint/lib/formatters/jslint-xml'>; +} +declare module 'eslint/lib/formatters/json.js' { + declare module.exports: $Exports<'eslint/lib/formatters/json'>; +} +declare module 'eslint/lib/formatters/junit.js' { + declare module.exports: $Exports<'eslint/lib/formatters/junit'>; +} +declare module 'eslint/lib/formatters/stylish.js' { + declare module.exports: $Exports<'eslint/lib/formatters/stylish'>; +} +declare module 'eslint/lib/formatters/table.js' { + declare module.exports: $Exports<'eslint/lib/formatters/table'>; +} +declare module 'eslint/lib/formatters/tap.js' { + declare module.exports: $Exports<'eslint/lib/formatters/tap'>; +} +declare module 'eslint/lib/formatters/unix.js' { + declare module.exports: $Exports<'eslint/lib/formatters/unix'>; +} +declare module 'eslint/lib/formatters/visualstudio.js' { + declare module.exports: $Exports<'eslint/lib/formatters/visualstudio'>; +} +declare module 'eslint/lib/ignored-paths.js' { + declare module.exports: $Exports<'eslint/lib/ignored-paths'>; +} +declare module 'eslint/lib/internal-rules/internal-consistent-docs-description.js' { + declare module.exports: $Exports<'eslint/lib/internal-rules/internal-consistent-docs-description'>; +} +declare module 'eslint/lib/internal-rules/internal-no-invalid-meta.js' { + declare module.exports: $Exports<'eslint/lib/internal-rules/internal-no-invalid-meta'>; +} +declare module 'eslint/lib/load-rules.js' { + declare module.exports: $Exports<'eslint/lib/load-rules'>; +} +declare module 'eslint/lib/logging.js' { + declare module.exports: $Exports<'eslint/lib/logging'>; +} +declare module 'eslint/lib/options.js' { + declare module.exports: $Exports<'eslint/lib/options'>; +} +declare module 'eslint/lib/rule-context.js' { + declare module.exports: $Exports<'eslint/lib/rule-context'>; +} +declare module 'eslint/lib/rules.js' { + declare module.exports: $Exports<'eslint/lib/rules'>; +} +declare module 'eslint/lib/rules/accessor-pairs.js' { + declare module.exports: $Exports<'eslint/lib/rules/accessor-pairs'>; +} +declare module 'eslint/lib/rules/array-bracket-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/array-bracket-spacing'>; +} +declare module 'eslint/lib/rules/array-callback-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/array-callback-return'>; +} +declare module 'eslint/lib/rules/arrow-body-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/arrow-body-style'>; +} +declare module 'eslint/lib/rules/arrow-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/arrow-parens'>; +} +declare module 'eslint/lib/rules/arrow-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/arrow-spacing'>; +} +declare module 'eslint/lib/rules/block-scoped-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/block-scoped-var'>; +} +declare module 'eslint/lib/rules/block-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/block-spacing'>; +} +declare module 'eslint/lib/rules/brace-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/brace-style'>; +} +declare module 'eslint/lib/rules/callback-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/callback-return'>; +} +declare module 'eslint/lib/rules/camelcase.js' { + declare module.exports: $Exports<'eslint/lib/rules/camelcase'>; +} +declare module 'eslint/lib/rules/capitalized-comments.js' { + declare module.exports: $Exports<'eslint/lib/rules/capitalized-comments'>; +} +declare module 'eslint/lib/rules/class-methods-use-this.js' { + declare module.exports: $Exports<'eslint/lib/rules/class-methods-use-this'>; +} +declare module 'eslint/lib/rules/comma-dangle.js' { + declare module.exports: $Exports<'eslint/lib/rules/comma-dangle'>; +} +declare module 'eslint/lib/rules/comma-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/comma-spacing'>; +} +declare module 'eslint/lib/rules/comma-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/comma-style'>; +} +declare module 'eslint/lib/rules/complexity.js' { + declare module.exports: $Exports<'eslint/lib/rules/complexity'>; +} +declare module 'eslint/lib/rules/computed-property-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/computed-property-spacing'>; +} +declare module 'eslint/lib/rules/consistent-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/consistent-return'>; +} +declare module 'eslint/lib/rules/consistent-this.js' { + declare module.exports: $Exports<'eslint/lib/rules/consistent-this'>; +} +declare module 'eslint/lib/rules/constructor-super.js' { + declare module.exports: $Exports<'eslint/lib/rules/constructor-super'>; +} +declare module 'eslint/lib/rules/curly.js' { + declare module.exports: $Exports<'eslint/lib/rules/curly'>; +} +declare module 'eslint/lib/rules/default-case.js' { + declare module.exports: $Exports<'eslint/lib/rules/default-case'>; +} +declare module 'eslint/lib/rules/dot-location.js' { + declare module.exports: $Exports<'eslint/lib/rules/dot-location'>; +} +declare module 'eslint/lib/rules/dot-notation.js' { + declare module.exports: $Exports<'eslint/lib/rules/dot-notation'>; +} +declare module 'eslint/lib/rules/eol-last.js' { + declare module.exports: $Exports<'eslint/lib/rules/eol-last'>; +} +declare module 'eslint/lib/rules/eqeqeq.js' { + declare module.exports: $Exports<'eslint/lib/rules/eqeqeq'>; +} +declare module 'eslint/lib/rules/func-call-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-call-spacing'>; +} +declare module 'eslint/lib/rules/func-name-matching.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-name-matching'>; +} +declare module 'eslint/lib/rules/func-names.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-names'>; +} +declare module 'eslint/lib/rules/func-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/func-style'>; +} +declare module 'eslint/lib/rules/generator-star-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/generator-star-spacing'>; +} +declare module 'eslint/lib/rules/global-require.js' { + declare module.exports: $Exports<'eslint/lib/rules/global-require'>; +} +declare module 'eslint/lib/rules/guard-for-in.js' { + declare module.exports: $Exports<'eslint/lib/rules/guard-for-in'>; +} +declare module 'eslint/lib/rules/handle-callback-err.js' { + declare module.exports: $Exports<'eslint/lib/rules/handle-callback-err'>; +} +declare module 'eslint/lib/rules/id-blacklist.js' { + declare module.exports: $Exports<'eslint/lib/rules/id-blacklist'>; +} +declare module 'eslint/lib/rules/id-length.js' { + declare module.exports: $Exports<'eslint/lib/rules/id-length'>; +} +declare module 'eslint/lib/rules/id-match.js' { + declare module.exports: $Exports<'eslint/lib/rules/id-match'>; +} +declare module 'eslint/lib/rules/indent.js' { + declare module.exports: $Exports<'eslint/lib/rules/indent'>; +} +declare module 'eslint/lib/rules/init-declarations.js' { + declare module.exports: $Exports<'eslint/lib/rules/init-declarations'>; +} +declare module 'eslint/lib/rules/jsx-quotes.js' { + declare module.exports: $Exports<'eslint/lib/rules/jsx-quotes'>; +} +declare module 'eslint/lib/rules/key-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/key-spacing'>; +} +declare module 'eslint/lib/rules/keyword-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/keyword-spacing'>; +} +declare module 'eslint/lib/rules/line-comment-position.js' { + declare module.exports: $Exports<'eslint/lib/rules/line-comment-position'>; +} +declare module 'eslint/lib/rules/linebreak-style.js' { + declare module.exports: $Exports<'eslint/lib/rules/linebreak-style'>; +} +declare module 'eslint/lib/rules/lines-around-comment.js' { + declare module.exports: $Exports<'eslint/lib/rules/lines-around-comment'>; +} +declare module 'eslint/lib/rules/lines-around-directive.js' { + declare module.exports: $Exports<'eslint/lib/rules/lines-around-directive'>; +} +declare module 'eslint/lib/rules/max-depth.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-depth'>; +} +declare module 'eslint/lib/rules/max-len.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-len'>; +} +declare module 'eslint/lib/rules/max-lines.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-lines'>; +} +declare module 'eslint/lib/rules/max-nested-callbacks.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-nested-callbacks'>; +} +declare module 'eslint/lib/rules/max-params.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-params'>; +} +declare module 'eslint/lib/rules/max-statements-per-line.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-statements-per-line'>; +} +declare module 'eslint/lib/rules/max-statements.js' { + declare module.exports: $Exports<'eslint/lib/rules/max-statements'>; +} +declare module 'eslint/lib/rules/multiline-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/multiline-ternary'>; +} +declare module 'eslint/lib/rules/new-cap.js' { + declare module.exports: $Exports<'eslint/lib/rules/new-cap'>; +} +declare module 'eslint/lib/rules/new-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/new-parens'>; +} +declare module 'eslint/lib/rules/newline-after-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/newline-after-var'>; +} +declare module 'eslint/lib/rules/newline-before-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/newline-before-return'>; +} +declare module 'eslint/lib/rules/newline-per-chained-call.js' { + declare module.exports: $Exports<'eslint/lib/rules/newline-per-chained-call'>; +} +declare module 'eslint/lib/rules/no-alert.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-alert'>; +} +declare module 'eslint/lib/rules/no-array-constructor.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-array-constructor'>; +} +declare module 'eslint/lib/rules/no-await-in-loop.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-await-in-loop'>; +} +declare module 'eslint/lib/rules/no-bitwise.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-bitwise'>; +} +declare module 'eslint/lib/rules/no-caller.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-caller'>; +} +declare module 'eslint/lib/rules/no-case-declarations.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-case-declarations'>; +} +declare module 'eslint/lib/rules/no-catch-shadow.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-catch-shadow'>; +} +declare module 'eslint/lib/rules/no-class-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-class-assign'>; +} +declare module 'eslint/lib/rules/no-compare-neg-zero.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-compare-neg-zero'>; +} +declare module 'eslint/lib/rules/no-cond-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-cond-assign'>; +} +declare module 'eslint/lib/rules/no-confusing-arrow.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-confusing-arrow'>; +} +declare module 'eslint/lib/rules/no-console.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-console'>; +} +declare module 'eslint/lib/rules/no-const-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-const-assign'>; +} +declare module 'eslint/lib/rules/no-constant-condition.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-constant-condition'>; +} +declare module 'eslint/lib/rules/no-continue.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-continue'>; +} +declare module 'eslint/lib/rules/no-control-regex.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-control-regex'>; +} +declare module 'eslint/lib/rules/no-debugger.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-debugger'>; +} +declare module 'eslint/lib/rules/no-delete-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-delete-var'>; +} +declare module 'eslint/lib/rules/no-div-regex.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-div-regex'>; +} +declare module 'eslint/lib/rules/no-dupe-args.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-dupe-args'>; +} +declare module 'eslint/lib/rules/no-dupe-class-members.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-dupe-class-members'>; +} +declare module 'eslint/lib/rules/no-dupe-keys.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-dupe-keys'>; +} +declare module 'eslint/lib/rules/no-duplicate-case.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-case'>; +} +declare module 'eslint/lib/rules/no-duplicate-imports.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-duplicate-imports'>; +} +declare module 'eslint/lib/rules/no-else-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-else-return'>; +} +declare module 'eslint/lib/rules/no-empty-character-class.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty-character-class'>; +} +declare module 'eslint/lib/rules/no-empty-function.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty-function'>; +} +declare module 'eslint/lib/rules/no-empty-pattern.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty-pattern'>; +} +declare module 'eslint/lib/rules/no-empty.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-empty'>; +} +declare module 'eslint/lib/rules/no-eq-null.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-eq-null'>; +} +declare module 'eslint/lib/rules/no-eval.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-eval'>; +} +declare module 'eslint/lib/rules/no-ex-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-ex-assign'>; +} +declare module 'eslint/lib/rules/no-extend-native.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extend-native'>; +} +declare module 'eslint/lib/rules/no-extra-bind.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-bind'>; +} +declare module 'eslint/lib/rules/no-extra-boolean-cast.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-boolean-cast'>; +} +declare module 'eslint/lib/rules/no-extra-label.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-label'>; +} +declare module 'eslint/lib/rules/no-extra-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-parens'>; +} +declare module 'eslint/lib/rules/no-extra-semi.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-extra-semi'>; +} +declare module 'eslint/lib/rules/no-fallthrough.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-fallthrough'>; +} +declare module 'eslint/lib/rules/no-floating-decimal.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-floating-decimal'>; +} +declare module 'eslint/lib/rules/no-func-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-func-assign'>; +} +declare module 'eslint/lib/rules/no-global-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-global-assign'>; +} +declare module 'eslint/lib/rules/no-implicit-coercion.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-implicit-coercion'>; +} +declare module 'eslint/lib/rules/no-implicit-globals.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-implicit-globals'>; +} +declare module 'eslint/lib/rules/no-implied-eval.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-implied-eval'>; +} +declare module 'eslint/lib/rules/no-inline-comments.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-inline-comments'>; +} +declare module 'eslint/lib/rules/no-inner-declarations.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-inner-declarations'>; +} +declare module 'eslint/lib/rules/no-invalid-regexp.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-invalid-regexp'>; +} +declare module 'eslint/lib/rules/no-invalid-this.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-invalid-this'>; +} +declare module 'eslint/lib/rules/no-irregular-whitespace.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-irregular-whitespace'>; +} +declare module 'eslint/lib/rules/no-iterator.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-iterator'>; +} +declare module 'eslint/lib/rules/no-label-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-label-var'>; +} +declare module 'eslint/lib/rules/no-labels.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-labels'>; +} +declare module 'eslint/lib/rules/no-lone-blocks.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-lone-blocks'>; +} +declare module 'eslint/lib/rules/no-lonely-if.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-lonely-if'>; +} +declare module 'eslint/lib/rules/no-loop-func.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-loop-func'>; +} +declare module 'eslint/lib/rules/no-magic-numbers.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-magic-numbers'>; +} +declare module 'eslint/lib/rules/no-mixed-operators.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-mixed-operators'>; +} +declare module 'eslint/lib/rules/no-mixed-requires.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-mixed-requires'>; +} +declare module 'eslint/lib/rules/no-mixed-spaces-and-tabs.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-mixed-spaces-and-tabs'>; +} +declare module 'eslint/lib/rules/no-multi-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multi-assign'>; +} +declare module 'eslint/lib/rules/no-multi-spaces.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multi-spaces'>; +} +declare module 'eslint/lib/rules/no-multi-str.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multi-str'>; +} +declare module 'eslint/lib/rules/no-multiple-empty-lines.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-multiple-empty-lines'>; +} +declare module 'eslint/lib/rules/no-native-reassign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-native-reassign'>; +} +declare module 'eslint/lib/rules/no-negated-condition.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-negated-condition'>; +} +declare module 'eslint/lib/rules/no-negated-in-lhs.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-negated-in-lhs'>; +} +declare module 'eslint/lib/rules/no-nested-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-nested-ternary'>; +} +declare module 'eslint/lib/rules/no-new-func.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-func'>; +} +declare module 'eslint/lib/rules/no-new-object.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-object'>; +} +declare module 'eslint/lib/rules/no-new-require.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-require'>; +} +declare module 'eslint/lib/rules/no-new-symbol.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-symbol'>; +} +declare module 'eslint/lib/rules/no-new-wrappers.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new-wrappers'>; +} +declare module 'eslint/lib/rules/no-new.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-new'>; +} +declare module 'eslint/lib/rules/no-obj-calls.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-obj-calls'>; +} +declare module 'eslint/lib/rules/no-octal-escape.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-octal-escape'>; +} +declare module 'eslint/lib/rules/no-octal.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-octal'>; +} +declare module 'eslint/lib/rules/no-param-reassign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-param-reassign'>; +} +declare module 'eslint/lib/rules/no-path-concat.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-path-concat'>; +} +declare module 'eslint/lib/rules/no-plusplus.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-plusplus'>; +} +declare module 'eslint/lib/rules/no-process-env.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-process-env'>; +} +declare module 'eslint/lib/rules/no-process-exit.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-process-exit'>; +} +declare module 'eslint/lib/rules/no-proto.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-proto'>; +} +declare module 'eslint/lib/rules/no-prototype-builtins.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-prototype-builtins'>; +} +declare module 'eslint/lib/rules/no-redeclare.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-redeclare'>; +} +declare module 'eslint/lib/rules/no-regex-spaces.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-regex-spaces'>; +} +declare module 'eslint/lib/rules/no-restricted-globals.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-globals'>; +} +declare module 'eslint/lib/rules/no-restricted-imports.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-imports'>; +} +declare module 'eslint/lib/rules/no-restricted-modules.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-modules'>; +} +declare module 'eslint/lib/rules/no-restricted-properties.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-properties'>; +} +declare module 'eslint/lib/rules/no-restricted-syntax.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-restricted-syntax'>; +} +declare module 'eslint/lib/rules/no-return-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-return-assign'>; +} +declare module 'eslint/lib/rules/no-return-await.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-return-await'>; +} +declare module 'eslint/lib/rules/no-script-url.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-script-url'>; +} +declare module 'eslint/lib/rules/no-self-assign.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-self-assign'>; +} +declare module 'eslint/lib/rules/no-self-compare.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-self-compare'>; +} +declare module 'eslint/lib/rules/no-sequences.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-sequences'>; +} +declare module 'eslint/lib/rules/no-shadow-restricted-names.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-shadow-restricted-names'>; +} +declare module 'eslint/lib/rules/no-shadow.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-shadow'>; +} +declare module 'eslint/lib/rules/no-spaced-func.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-spaced-func'>; +} +declare module 'eslint/lib/rules/no-sparse-arrays.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-sparse-arrays'>; +} +declare module 'eslint/lib/rules/no-sync.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-sync'>; +} +declare module 'eslint/lib/rules/no-tabs.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-tabs'>; +} +declare module 'eslint/lib/rules/no-template-curly-in-string.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-template-curly-in-string'>; +} +declare module 'eslint/lib/rules/no-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-ternary'>; +} +declare module 'eslint/lib/rules/no-this-before-super.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-this-before-super'>; +} +declare module 'eslint/lib/rules/no-throw-literal.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-throw-literal'>; +} +declare module 'eslint/lib/rules/no-trailing-spaces.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-trailing-spaces'>; +} +declare module 'eslint/lib/rules/no-undef-init.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-undef-init'>; +} +declare module 'eslint/lib/rules/no-undef.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-undef'>; +} +declare module 'eslint/lib/rules/no-undefined.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-undefined'>; +} +declare module 'eslint/lib/rules/no-underscore-dangle.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-underscore-dangle'>; +} +declare module 'eslint/lib/rules/no-unexpected-multiline.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unexpected-multiline'>; +} +declare module 'eslint/lib/rules/no-unmodified-loop-condition.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unmodified-loop-condition'>; +} +declare module 'eslint/lib/rules/no-unneeded-ternary.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unneeded-ternary'>; +} +declare module 'eslint/lib/rules/no-unreachable.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unreachable'>; +} +declare module 'eslint/lib/rules/no-unsafe-finally.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-finally'>; +} +declare module 'eslint/lib/rules/no-unsafe-negation.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unsafe-negation'>; +} +declare module 'eslint/lib/rules/no-unused-expressions.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unused-expressions'>; +} +declare module 'eslint/lib/rules/no-unused-labels.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unused-labels'>; +} +declare module 'eslint/lib/rules/no-unused-vars.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-unused-vars'>; +} +declare module 'eslint/lib/rules/no-use-before-define.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-use-before-define'>; +} +declare module 'eslint/lib/rules/no-useless-call.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-call'>; +} +declare module 'eslint/lib/rules/no-useless-computed-key.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-computed-key'>; +} +declare module 'eslint/lib/rules/no-useless-concat.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-concat'>; +} +declare module 'eslint/lib/rules/no-useless-constructor.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-constructor'>; +} +declare module 'eslint/lib/rules/no-useless-escape.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-escape'>; +} +declare module 'eslint/lib/rules/no-useless-rename.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-rename'>; +} +declare module 'eslint/lib/rules/no-useless-return.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-useless-return'>; +} +declare module 'eslint/lib/rules/no-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-var'>; +} +declare module 'eslint/lib/rules/no-void.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-void'>; +} +declare module 'eslint/lib/rules/no-warning-comments.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-warning-comments'>; +} +declare module 'eslint/lib/rules/no-whitespace-before-property.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-whitespace-before-property'>; +} +declare module 'eslint/lib/rules/no-with.js' { + declare module.exports: $Exports<'eslint/lib/rules/no-with'>; +} +declare module 'eslint/lib/rules/nonblock-statement-body-position.js' { + declare module.exports: $Exports<'eslint/lib/rules/nonblock-statement-body-position'>; +} +declare module 'eslint/lib/rules/object-curly-newline.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-curly-newline'>; +} +declare module 'eslint/lib/rules/object-curly-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-curly-spacing'>; +} +declare module 'eslint/lib/rules/object-property-newline.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-property-newline'>; +} +declare module 'eslint/lib/rules/object-shorthand.js' { + declare module.exports: $Exports<'eslint/lib/rules/object-shorthand'>; +} +declare module 'eslint/lib/rules/one-var-declaration-per-line.js' { + declare module.exports: $Exports<'eslint/lib/rules/one-var-declaration-per-line'>; +} +declare module 'eslint/lib/rules/one-var.js' { + declare module.exports: $Exports<'eslint/lib/rules/one-var'>; +} +declare module 'eslint/lib/rules/operator-assignment.js' { + declare module.exports: $Exports<'eslint/lib/rules/operator-assignment'>; +} +declare module 'eslint/lib/rules/operator-linebreak.js' { + declare module.exports: $Exports<'eslint/lib/rules/operator-linebreak'>; +} +declare module 'eslint/lib/rules/padded-blocks.js' { + declare module.exports: $Exports<'eslint/lib/rules/padded-blocks'>; +} +declare module 'eslint/lib/rules/prefer-arrow-callback.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-arrow-callback'>; +} +declare module 'eslint/lib/rules/prefer-const.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-const'>; +} +declare module 'eslint/lib/rules/prefer-destructuring.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-destructuring'>; +} +declare module 'eslint/lib/rules/prefer-numeric-literals.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-numeric-literals'>; +} +declare module 'eslint/lib/rules/prefer-promise-reject-errors.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-promise-reject-errors'>; +} +declare module 'eslint/lib/rules/prefer-reflect.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-reflect'>; +} +declare module 'eslint/lib/rules/prefer-rest-params.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-rest-params'>; +} +declare module 'eslint/lib/rules/prefer-spread.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-spread'>; +} +declare module 'eslint/lib/rules/prefer-template.js' { + declare module.exports: $Exports<'eslint/lib/rules/prefer-template'>; +} +declare module 'eslint/lib/rules/quote-props.js' { + declare module.exports: $Exports<'eslint/lib/rules/quote-props'>; +} +declare module 'eslint/lib/rules/quotes.js' { + declare module.exports: $Exports<'eslint/lib/rules/quotes'>; +} +declare module 'eslint/lib/rules/radix.js' { + declare module.exports: $Exports<'eslint/lib/rules/radix'>; +} +declare module 'eslint/lib/rules/require-await.js' { + declare module.exports: $Exports<'eslint/lib/rules/require-await'>; +} +declare module 'eslint/lib/rules/require-jsdoc.js' { + declare module.exports: $Exports<'eslint/lib/rules/require-jsdoc'>; +} +declare module 'eslint/lib/rules/require-yield.js' { + declare module.exports: $Exports<'eslint/lib/rules/require-yield'>; +} +declare module 'eslint/lib/rules/rest-spread-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/rest-spread-spacing'>; +} +declare module 'eslint/lib/rules/semi-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/semi-spacing'>; +} +declare module 'eslint/lib/rules/semi.js' { + declare module.exports: $Exports<'eslint/lib/rules/semi'>; +} +declare module 'eslint/lib/rules/sort-imports.js' { + declare module.exports: $Exports<'eslint/lib/rules/sort-imports'>; +} +declare module 'eslint/lib/rules/sort-keys.js' { + declare module.exports: $Exports<'eslint/lib/rules/sort-keys'>; +} +declare module 'eslint/lib/rules/sort-vars.js' { + declare module.exports: $Exports<'eslint/lib/rules/sort-vars'>; +} +declare module 'eslint/lib/rules/space-before-blocks.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-before-blocks'>; +} +declare module 'eslint/lib/rules/space-before-function-paren.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-before-function-paren'>; +} +declare module 'eslint/lib/rules/space-in-parens.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-in-parens'>; +} +declare module 'eslint/lib/rules/space-infix-ops.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-infix-ops'>; +} +declare module 'eslint/lib/rules/space-unary-ops.js' { + declare module.exports: $Exports<'eslint/lib/rules/space-unary-ops'>; +} +declare module 'eslint/lib/rules/spaced-comment.js' { + declare module.exports: $Exports<'eslint/lib/rules/spaced-comment'>; +} +declare module 'eslint/lib/rules/strict.js' { + declare module.exports: $Exports<'eslint/lib/rules/strict'>; +} +declare module 'eslint/lib/rules/symbol-description.js' { + declare module.exports: $Exports<'eslint/lib/rules/symbol-description'>; +} +declare module 'eslint/lib/rules/template-curly-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/template-curly-spacing'>; +} +declare module 'eslint/lib/rules/template-tag-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/template-tag-spacing'>; +} +declare module 'eslint/lib/rules/unicode-bom.js' { + declare module.exports: $Exports<'eslint/lib/rules/unicode-bom'>; +} +declare module 'eslint/lib/rules/use-isnan.js' { + declare module.exports: $Exports<'eslint/lib/rules/use-isnan'>; +} +declare module 'eslint/lib/rules/valid-jsdoc.js' { + declare module.exports: $Exports<'eslint/lib/rules/valid-jsdoc'>; +} +declare module 'eslint/lib/rules/valid-typeof.js' { + declare module.exports: $Exports<'eslint/lib/rules/valid-typeof'>; +} +declare module 'eslint/lib/rules/vars-on-top.js' { + declare module.exports: $Exports<'eslint/lib/rules/vars-on-top'>; +} +declare module 'eslint/lib/rules/wrap-iife.js' { + declare module.exports: $Exports<'eslint/lib/rules/wrap-iife'>; +} +declare module 'eslint/lib/rules/wrap-regex.js' { + declare module.exports: $Exports<'eslint/lib/rules/wrap-regex'>; +} +declare module 'eslint/lib/rules/yield-star-spacing.js' { + declare module.exports: $Exports<'eslint/lib/rules/yield-star-spacing'>; +} +declare module 'eslint/lib/rules/yoda.js' { + declare module.exports: $Exports<'eslint/lib/rules/yoda'>; +} +declare module 'eslint/lib/testers/event-generator-tester.js' { + declare module.exports: $Exports<'eslint/lib/testers/event-generator-tester'>; +} +declare module 'eslint/lib/testers/rule-tester.js' { + declare module.exports: $Exports<'eslint/lib/testers/rule-tester'>; +} +declare module 'eslint/lib/timing.js' { + declare module.exports: $Exports<'eslint/lib/timing'>; +} +declare module 'eslint/lib/token-store/backward-token-comment-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/backward-token-comment-cursor'>; +} +declare module 'eslint/lib/token-store/backward-token-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/backward-token-cursor'>; +} +declare module 'eslint/lib/token-store/cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/cursor'>; +} +declare module 'eslint/lib/token-store/cursors.js' { + declare module.exports: $Exports<'eslint/lib/token-store/cursors'>; +} +declare module 'eslint/lib/token-store/decorative-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/decorative-cursor'>; +} +declare module 'eslint/lib/token-store/filter-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/filter-cursor'>; +} +declare module 'eslint/lib/token-store/forward-token-comment-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/forward-token-comment-cursor'>; +} +declare module 'eslint/lib/token-store/forward-token-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/forward-token-cursor'>; +} +declare module 'eslint/lib/token-store/index.js' { + declare module.exports: $Exports<'eslint/lib/token-store/index'>; +} +declare module 'eslint/lib/token-store/limit-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/limit-cursor'>; +} +declare module 'eslint/lib/token-store/padded-token-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/padded-token-cursor'>; +} +declare module 'eslint/lib/token-store/skip-cursor.js' { + declare module.exports: $Exports<'eslint/lib/token-store/skip-cursor'>; +} +declare module 'eslint/lib/token-store/utils.js' { + declare module.exports: $Exports<'eslint/lib/token-store/utils'>; +} +declare module 'eslint/lib/util/comment-event-generator.js' { + declare module.exports: $Exports<'eslint/lib/util/comment-event-generator'>; +} +declare module 'eslint/lib/util/fix-tracker.js' { + declare module.exports: $Exports<'eslint/lib/util/fix-tracker'>; +} +declare module 'eslint/lib/util/glob-util.js' { + declare module.exports: $Exports<'eslint/lib/util/glob-util'>; +} +declare module 'eslint/lib/util/glob.js' { + declare module.exports: $Exports<'eslint/lib/util/glob'>; +} +declare module 'eslint/lib/util/hash.js' { + declare module.exports: $Exports<'eslint/lib/util/hash'>; +} +declare module 'eslint/lib/util/keywords.js' { + declare module.exports: $Exports<'eslint/lib/util/keywords'>; +} +declare module 'eslint/lib/util/module-resolver.js' { + declare module.exports: $Exports<'eslint/lib/util/module-resolver'>; +} +declare module 'eslint/lib/util/node-event-generator.js' { + declare module.exports: $Exports<'eslint/lib/util/node-event-generator'>; +} +declare module 'eslint/lib/util/npm-util.js' { + declare module.exports: $Exports<'eslint/lib/util/npm-util'>; +} +declare module 'eslint/lib/util/path-util.js' { + declare module.exports: $Exports<'eslint/lib/util/path-util'>; +} +declare module 'eslint/lib/util/patterns/letters.js' { + declare module.exports: $Exports<'eslint/lib/util/patterns/letters'>; +} +declare module 'eslint/lib/util/rule-fixer.js' { + declare module.exports: $Exports<'eslint/lib/util/rule-fixer'>; +} +declare module 'eslint/lib/util/source-code-fixer.js' { + declare module.exports: $Exports<'eslint/lib/util/source-code-fixer'>; +} +declare module 'eslint/lib/util/source-code-util.js' { + declare module.exports: $Exports<'eslint/lib/util/source-code-util'>; +} +declare module 'eslint/lib/util/source-code.js' { + declare module.exports: $Exports<'eslint/lib/util/source-code'>; +} +declare module 'eslint/lib/util/traverser.js' { + declare module.exports: $Exports<'eslint/lib/util/traverser'>; +} +declare module 'eslint/lib/util/xml-escape.js' { + declare module.exports: $Exports<'eslint/lib/util/xml-escape'>; +} diff --git a/flow-typed/npm/express_v4.x.x.js b/flow-typed/npm/express_v4.x.x.js new file mode 100644 index 0000000..920158d --- /dev/null +++ b/flow-typed/npm/express_v4.x.x.js @@ -0,0 +1,189 @@ +// flow-typed signature: 9231683897fa28932f1aecb9dd7a6e24 +// flow-typed version: e6aa8b0b44/express_v4.x.x/flow_>=v0.32.x + +import type { Server } from 'http'; + +declare type express$RouterOptions = { + caseSensitive?: boolean, + mergeParams?: boolean, + strict?: boolean +}; + +declare class express$RequestResponseBase { + app: express$Application; + get(field: string): string | void; +} + +declare class express$Request extends http$IncomingMessage mixins express$RequestResponseBase { + baseUrl: string; + body: any; + cookies: {[cookie: string]: string}; + fresh: boolean; + hostname: string; + ip: string; + ips: Array; + method: string; + originalUrl: string; + params: {[param: string]: string}; + path: string; + protocol: 'https' | 'http'; + query: {[name: string]: string}; + route: string; + secure: boolean; + signedCookies: {[signedCookie: string]: string}; + stale: boolean; + subdomains: Array; + xhr: boolean; + accepts(types: string): string | false; + acceptsCharsets(...charsets: Array): string | false; + acceptsEncodings(...encoding: Array): string | false; + acceptsLanguages(...lang: Array): string | false; + header(field: string): string | void; + is(type: string): boolean; + param(name: string, defaultValue?: string): string | void; +} + +declare type express$CookieOptions = { + domain?: string, + encode?: (value: string) => string, + expires?: Date, + httpOnly?: boolean, + maxAge?: number, + path?: string, + secure?: boolean, + signed?: boolean +}; + +declare type express$RenderCallback = (err: Error | null, html?: string) => mixed; + +declare type express$SendFileOptions = { + maxAge?: number, + root?: string, + lastModified?: boolean, + headers?: {[name: string]: string}, + dotfiles?: 'allow' | 'deny' | 'ignore' +}; + +declare class express$Response extends http$ServerResponse mixins express$RequestResponseBase { + headersSent: boolean; + locals: {[name: string]: mixed}; + append(field: string, value?: string): this; + attachment(filename?: string): this; + cookie(name: string, value: string, options?: express$CookieOptions): this; + clearCookie(name: string, options?: express$CookieOptions): this; + download(path: string, filename?: string, callback?: (err?: ?Error) => void): this; + format(typesObject: {[type: string]: Function}): this; + json(body?: mixed): this; + jsonp(body?: mixed): this; + links(links: {[name: string]: string}): this; + location(path: string): this; + redirect(url: string, ...args: Array): this; + redirect(status: number, url: string, ...args: Array): this; + render(view: string, locals?: {[name: string]: mixed}, callback?: express$RenderCallback): this; + send(body?: mixed): this; + sendFile(path: string, options?: express$SendFileOptions, callback?: (err?: ?Error) => mixed): this; + sendStatus(statusCode: number): this; + header(field: string, value?: string): this; + header(headers: {[name: string]: string}): this; + set(field: string, value?: string): this; + set(headers: {[name: string]: string}): this; + status(statusCode: number): this; + type(type: string): this; + vary(field: string): this; +} + +declare type express$NextFunction = (err?: ?Error | 'route') => mixed; +declare type express$Middleware = + ((req: express$Request, res: express$Response, next: express$NextFunction) => mixed) | + ((error: ?Error, req: express$Request, res: express$Response, next: express$NextFunction) => mixed); +declare interface express$RouteMethodType { + (middleware: express$Middleware): T; + (...middleware: Array): T; + (path: string|RegExp|string[], ...middleware: Array): T; +} +declare class express$Route { + all: express$RouteMethodType; + get: express$RouteMethodType; + post: express$RouteMethodType; + put: express$RouteMethodType; + head: express$RouteMethodType; + delete: express$RouteMethodType; + options: express$RouteMethodType; + trace: express$RouteMethodType; + copy: express$RouteMethodType; + lock: express$RouteMethodType; + mkcol: express$RouteMethodType; + move: express$RouteMethodType; + purge: express$RouteMethodType; + propfind: express$RouteMethodType; + proppatch: express$RouteMethodType; + unlock: express$RouteMethodType; + report: express$RouteMethodType; + mkactivity: express$RouteMethodType; + checkout: express$RouteMethodType; + merge: express$RouteMethodType; + + // @TODO Missing 'm-search' but get flow illegal name error. + + notify: express$RouteMethodType; + subscribe: express$RouteMethodType; + unsubscribe: express$RouteMethodType; + patch: express$RouteMethodType; + search: express$RouteMethodType; + connect: express$RouteMethodType; +} + +declare class express$Router extends express$Route { + constructor(options?: express$RouterOptions): void; + route(path: string): express$Route; + static (): express$Router; + use(middleware: express$Middleware): this; + use(...middleware: Array): this; + use(path: string|RegExp|string[], ...middleware: Array): this; + use(path: string, router: express$Router): this; + handle(req: http$IncomingMessage, res: http$ServerResponse, next: express$NextFunction): void; + + // Can't use regular callable signature syntax due to https://github.com/facebook/flow/issues/3084 + $call: (req: http$IncomingMessage, res: http$ServerResponse, next?: ?express$NextFunction) => void; +} + +declare class express$Application extends express$Router mixins events$EventEmitter { + constructor(): void; + locals: {[name: string]: mixed}; + mountpath: string; + listen(port: number, hostname?: string, backlog?: number, callback?: (err?: ?Error) => mixed): Server; + listen(port: number, hostname?: string, callback?: (err?: ?Error) => mixed): Server; + listen(port: number, callback?: (err?: ?Error) => mixed): Server; + listen(path: string, callback?: (err?: ?Error) => mixed): Server; + listen(handle: Object, callback?: (err?: ?Error) => mixed): Server; + disable(name: string): void; + disabled(name: string): boolean; + enable(name: string): void; + enabled(name: string): boolean; + engine(name: string, callback: Function): void; + /** + * Mixed will not be taken as a value option. Issue around using the GET http method name and the get for settings. + */ + // get(name: string): mixed; + set(name: string, value: mixed): mixed; + render(name: string, optionsOrFunction: {[name: string]: mixed}, callback: express$RenderCallback): void; + handle(req: http$IncomingMessage, res: http$ServerResponse, next?: ?express$NextFunction): void; +} + +declare module 'express' { + declare function serveStatic(root: string, options?: Object): express$Middleware; + + declare type RouterOptions = express$RouterOptions; + declare type CookieOptions = express$CookieOptions; + declare type Middleware = express$Middleware; + declare type NextFunction = express$NextFunction; + declare type $Response = express$Response; + declare type $Request = express$Request; + declare type $Application = express$Application; + + declare module.exports: { + (): express$Application, // If you try to call like a function, it will use this signature + static: serveStatic, // `static` property on the function + Router: typeof express$Router, // `Router` property on the function + }; +} diff --git a/flow-typed/npm/flow-bin_v0.x.x.js b/flow-typed/npm/flow-bin_v0.x.x.js new file mode 100644 index 0000000..c538e20 --- /dev/null +++ b/flow-typed/npm/flow-bin_v0.x.x.js @@ -0,0 +1,6 @@ +// flow-typed signature: 6a5610678d4b01e13bbfbbc62bdaf583 +// flow-typed version: 3817bc6980/flow-bin_v0.x.x/flow_>=v0.25.x + +declare module "flow-bin" { + declare module.exports: string; +} diff --git a/flow-typed/npm/flow-typed_vx.x.x.js b/flow-typed/npm/flow-typed_vx.x.x.js new file mode 100644 index 0000000..80d4d09 --- /dev/null +++ b/flow-typed/npm/flow-typed_vx.x.x.js @@ -0,0 +1,193 @@ +// flow-typed signature: 8898603ed592b58f9cb89fd30a371a09 +// flow-typed version: <>/flow-typed_v^2.1.2/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'flow-typed' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'flow-typed' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'flow-typed/dist/cli' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/create-stub' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/install' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/runTests' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/search' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/update-cache' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/update' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/validateDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/commands/version' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/cacheRepoUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/codeSign' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/fileUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/flowProjectUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/flowVersion' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/git' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/github' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/isInFlowTypedRepo' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/libDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/node' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/npm/npmLibDefs' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/npm/npmProjectUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/semver' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/stubUtils' { + declare module.exports: any; +} + +declare module 'flow-typed/dist/lib/validationErrors' { + declare module.exports: any; +} + +// Filename aliases +declare module 'flow-typed/dist/cli.js' { + declare module.exports: $Exports<'flow-typed/dist/cli'>; +} +declare module 'flow-typed/dist/commands/create-stub.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/create-stub'>; +} +declare module 'flow-typed/dist/commands/install.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/install'>; +} +declare module 'flow-typed/dist/commands/runTests.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/runTests'>; +} +declare module 'flow-typed/dist/commands/search.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/search'>; +} +declare module 'flow-typed/dist/commands/update-cache.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/update-cache'>; +} +declare module 'flow-typed/dist/commands/update.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/update'>; +} +declare module 'flow-typed/dist/commands/validateDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/validateDefs'>; +} +declare module 'flow-typed/dist/commands/version.js' { + declare module.exports: $Exports<'flow-typed/dist/commands/version'>; +} +declare module 'flow-typed/dist/lib/cacheRepoUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/cacheRepoUtils'>; +} +declare module 'flow-typed/dist/lib/codeSign.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/codeSign'>; +} +declare module 'flow-typed/dist/lib/fileUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/fileUtils'>; +} +declare module 'flow-typed/dist/lib/flowProjectUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/flowProjectUtils'>; +} +declare module 'flow-typed/dist/lib/flowVersion.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/flowVersion'>; +} +declare module 'flow-typed/dist/lib/git.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/git'>; +} +declare module 'flow-typed/dist/lib/github.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/github'>; +} +declare module 'flow-typed/dist/lib/isInFlowTypedRepo.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/isInFlowTypedRepo'>; +} +declare module 'flow-typed/dist/lib/libDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/libDefs'>; +} +declare module 'flow-typed/dist/lib/node.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/node'>; +} +declare module 'flow-typed/dist/lib/npm/npmLibDefs.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmLibDefs'>; +} +declare module 'flow-typed/dist/lib/npm/npmProjectUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/npm/npmProjectUtils'>; +} +declare module 'flow-typed/dist/lib/semver.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/semver'>; +} +declare module 'flow-typed/dist/lib/stubUtils.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/stubUtils'>; +} +declare module 'flow-typed/dist/lib/validationErrors.js' { + declare module.exports: $Exports<'flow-typed/dist/lib/validationErrors'>; +} diff --git a/flow-typed/npm/istanbul_vx.x.x.js b/flow-typed/npm/istanbul_vx.x.x.js new file mode 100644 index 0000000..2b1e986 --- /dev/null +++ b/flow-typed/npm/istanbul_vx.x.x.js @@ -0,0 +1,353 @@ +// flow-typed signature: 48a469e436cec0618296e25bbc2bd2a9 +// flow-typed version: <>/istanbul_v^0.4.5/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'istanbul' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'istanbul' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'istanbul/lib/assets/sorter' { + declare module.exports: any; +} + +declare module 'istanbul/lib/assets/vendor/prettify' { + declare module.exports: any; +} + +declare module 'istanbul/lib/cli' { + declare module.exports: any; +} + +declare module 'istanbul/lib/collector' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/check-coverage' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/common/run-with-cover' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/cover' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/help' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/index' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/instrument' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/report' { + declare module.exports: any; +} + +declare module 'istanbul/lib/command/test' { + declare module.exports: any; +} + +declare module 'istanbul/lib/config' { + declare module.exports: any; +} + +declare module 'istanbul/lib/hook' { + declare module.exports: any; +} + +declare module 'istanbul/lib/instrumenter' { + declare module.exports: any; +} + +declare module 'istanbul/lib/object-utils' { + declare module.exports: any; +} + +declare module 'istanbul/lib/register-plugins' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/clover' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/cobertura' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/common/defaults' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/html' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/index' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/json-summary' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/json' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/lcov' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/lcovonly' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/none' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/teamcity' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/text-lcov' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/text-summary' { + declare module.exports: any; +} + +declare module 'istanbul/lib/report/text' { + declare module.exports: any; +} + +declare module 'istanbul/lib/reporter' { + declare module.exports: any; +} + +declare module 'istanbul/lib/store/fslookup' { + declare module.exports: any; +} + +declare module 'istanbul/lib/store/index' { + declare module.exports: any; +} + +declare module 'istanbul/lib/store/memory' { + declare module.exports: any; +} + +declare module 'istanbul/lib/store/tmp' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/factory' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/file-matcher' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/file-writer' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/help-formatter' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/input-error' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/insertion-text' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/meta' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/tree-summarizer' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/writer' { + declare module.exports: any; +} + +declare module 'istanbul/lib/util/yui-load-hook' { + declare module.exports: any; +} + +// Filename aliases +declare module 'istanbul/index' { + declare module.exports: $Exports<'istanbul'>; +} +declare module 'istanbul/index.js' { + declare module.exports: $Exports<'istanbul'>; +} +declare module 'istanbul/lib/assets/sorter.js' { + declare module.exports: $Exports<'istanbul/lib/assets/sorter'>; +} +declare module 'istanbul/lib/assets/vendor/prettify.js' { + declare module.exports: $Exports<'istanbul/lib/assets/vendor/prettify'>; +} +declare module 'istanbul/lib/cli.js' { + declare module.exports: $Exports<'istanbul/lib/cli'>; +} +declare module 'istanbul/lib/collector.js' { + declare module.exports: $Exports<'istanbul/lib/collector'>; +} +declare module 'istanbul/lib/command/check-coverage.js' { + declare module.exports: $Exports<'istanbul/lib/command/check-coverage'>; +} +declare module 'istanbul/lib/command/common/run-with-cover.js' { + declare module.exports: $Exports<'istanbul/lib/command/common/run-with-cover'>; +} +declare module 'istanbul/lib/command/cover.js' { + declare module.exports: $Exports<'istanbul/lib/command/cover'>; +} +declare module 'istanbul/lib/command/help.js' { + declare module.exports: $Exports<'istanbul/lib/command/help'>; +} +declare module 'istanbul/lib/command/index.js' { + declare module.exports: $Exports<'istanbul/lib/command/index'>; +} +declare module 'istanbul/lib/command/instrument.js' { + declare module.exports: $Exports<'istanbul/lib/command/instrument'>; +} +declare module 'istanbul/lib/command/report.js' { + declare module.exports: $Exports<'istanbul/lib/command/report'>; +} +declare module 'istanbul/lib/command/test.js' { + declare module.exports: $Exports<'istanbul/lib/command/test'>; +} +declare module 'istanbul/lib/config.js' { + declare module.exports: $Exports<'istanbul/lib/config'>; +} +declare module 'istanbul/lib/hook.js' { + declare module.exports: $Exports<'istanbul/lib/hook'>; +} +declare module 'istanbul/lib/instrumenter.js' { + declare module.exports: $Exports<'istanbul/lib/instrumenter'>; +} +declare module 'istanbul/lib/object-utils.js' { + declare module.exports: $Exports<'istanbul/lib/object-utils'>; +} +declare module 'istanbul/lib/register-plugins.js' { + declare module.exports: $Exports<'istanbul/lib/register-plugins'>; +} +declare module 'istanbul/lib/report/clover.js' { + declare module.exports: $Exports<'istanbul/lib/report/clover'>; +} +declare module 'istanbul/lib/report/cobertura.js' { + declare module.exports: $Exports<'istanbul/lib/report/cobertura'>; +} +declare module 'istanbul/lib/report/common/defaults.js' { + declare module.exports: $Exports<'istanbul/lib/report/common/defaults'>; +} +declare module 'istanbul/lib/report/html.js' { + declare module.exports: $Exports<'istanbul/lib/report/html'>; +} +declare module 'istanbul/lib/report/index.js' { + declare module.exports: $Exports<'istanbul/lib/report/index'>; +} +declare module 'istanbul/lib/report/json-summary.js' { + declare module.exports: $Exports<'istanbul/lib/report/json-summary'>; +} +declare module 'istanbul/lib/report/json.js' { + declare module.exports: $Exports<'istanbul/lib/report/json'>; +} +declare module 'istanbul/lib/report/lcov.js' { + declare module.exports: $Exports<'istanbul/lib/report/lcov'>; +} +declare module 'istanbul/lib/report/lcovonly.js' { + declare module.exports: $Exports<'istanbul/lib/report/lcovonly'>; +} +declare module 'istanbul/lib/report/none.js' { + declare module.exports: $Exports<'istanbul/lib/report/none'>; +} +declare module 'istanbul/lib/report/teamcity.js' { + declare module.exports: $Exports<'istanbul/lib/report/teamcity'>; +} +declare module 'istanbul/lib/report/text-lcov.js' { + declare module.exports: $Exports<'istanbul/lib/report/text-lcov'>; +} +declare module 'istanbul/lib/report/text-summary.js' { + declare module.exports: $Exports<'istanbul/lib/report/text-summary'>; +} +declare module 'istanbul/lib/report/text.js' { + declare module.exports: $Exports<'istanbul/lib/report/text'>; +} +declare module 'istanbul/lib/reporter.js' { + declare module.exports: $Exports<'istanbul/lib/reporter'>; +} +declare module 'istanbul/lib/store/fslookup.js' { + declare module.exports: $Exports<'istanbul/lib/store/fslookup'>; +} +declare module 'istanbul/lib/store/index.js' { + declare module.exports: $Exports<'istanbul/lib/store/index'>; +} +declare module 'istanbul/lib/store/memory.js' { + declare module.exports: $Exports<'istanbul/lib/store/memory'>; +} +declare module 'istanbul/lib/store/tmp.js' { + declare module.exports: $Exports<'istanbul/lib/store/tmp'>; +} +declare module 'istanbul/lib/util/factory.js' { + declare module.exports: $Exports<'istanbul/lib/util/factory'>; +} +declare module 'istanbul/lib/util/file-matcher.js' { + declare module.exports: $Exports<'istanbul/lib/util/file-matcher'>; +} +declare module 'istanbul/lib/util/file-writer.js' { + declare module.exports: $Exports<'istanbul/lib/util/file-writer'>; +} +declare module 'istanbul/lib/util/help-formatter.js' { + declare module.exports: $Exports<'istanbul/lib/util/help-formatter'>; +} +declare module 'istanbul/lib/util/input-error.js' { + declare module.exports: $Exports<'istanbul/lib/util/input-error'>; +} +declare module 'istanbul/lib/util/insertion-text.js' { + declare module.exports: $Exports<'istanbul/lib/util/insertion-text'>; +} +declare module 'istanbul/lib/util/meta.js' { + declare module.exports: $Exports<'istanbul/lib/util/meta'>; +} +declare module 'istanbul/lib/util/tree-summarizer.js' { + declare module.exports: $Exports<'istanbul/lib/util/tree-summarizer'>; +} +declare module 'istanbul/lib/util/writer.js' { + declare module.exports: $Exports<'istanbul/lib/util/writer'>; +} +declare module 'istanbul/lib/util/yui-load-hook.js' { + declare module.exports: $Exports<'istanbul/lib/util/yui-load-hook'>; +} diff --git a/flow-typed/npm/mocha_v3.1.x.js b/flow-typed/npm/mocha_v3.1.x.js new file mode 100644 index 0000000..6c4d8c7 --- /dev/null +++ b/flow-typed/npm/mocha_v3.1.x.js @@ -0,0 +1,25 @@ +// flow-typed signature: 6b82cf8c1da27b4f0fa7a58e5ed5babf +// flow-typed version: edf70dde46/mocha_v3.1.x/flow_>=v0.22.x + +type TestFunction = ((done: () => void) => void | Promise); + +declare var describe : { + (name:string, spec:() => void): void; + only(description:string, spec:() => void): void; + skip(description:string, spec:() => void): void; + timeout(ms:number): void; +}; + +declare var context : typeof describe; + +declare var it : { + (name:string, spec?:TestFunction): void; + only(description:string, spec:TestFunction): void; + skip(description:string, spec:TestFunction): void; + timeout(ms:number): void; +}; + +declare function before(method : TestFunction):void; +declare function beforeEach(method : TestFunction):void; +declare function after(method : TestFunction):void; +declare function afterEach(method : TestFunction):void; diff --git a/flow-typed/npm/rxjs_v5.0.x.js b/flow-typed/npm/rxjs_v5.0.x.js new file mode 100644 index 0000000..b3781fd --- /dev/null +++ b/flow-typed/npm/rxjs_v5.0.x.js @@ -0,0 +1,795 @@ +// flow-typed signature: 8bc27ef0ed168765f4241cf75bfb2160 +// flow-typed version: d9c17ab8e9/rxjs_v5.0.x/flow_>=v0.34.x + +// FIXME(samgoldman) Remove top-level interface once Babel supports +// `declare interface` syntax. +// FIXME(samgoldman) Remove this once rxjs$Subject can mixin rxjs$Observer +interface rxjs$IObserver<-T> { + next(value: T): mixed; + error(error: any): mixed; + complete(): mixed; +} + +type rxjs$PartialObserver<-T> = + | { + +next: (value: T) => mixed; + +error?: (error: any) => mixed; + +complete?: () => mixed; + } + | { + +next?: (value: T) => mixed; + +error: (error: any) => mixed; + +complete?: () => mixed; + } + | { + +next?: (value: T) => mixed; + +error?: (error: any) => mixed; + +complete: () => mixed; + } + +interface rxjs$ISubscription { + unsubscribe(): void; +} + +type rxjs$TeardownLogic = rxjs$ISubscription | () => void; + +type rxjs$EventListenerOptions = { + capture?: boolean; + passive?: boolean; + once?: boolean; +} | boolean; + +declare class rxjs$Observable<+T> { + static bindCallback(callbackFunc: (callback: (_: void) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): () => rxjs$Observable; + static bindCallback(callbackFunc: (callback: (result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): () => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, callback: (result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, callback: (result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, callback: (result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, callback: (result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, callback: (result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, callback: (result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => rxjs$Observable; + static bindCallback(callbackFunc: (callback: (...args: Array) => any) => any, selector: (...args: Array) => U, scheduler?: rxjs$SchedulerClass): () => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, callback: (...args: Array) => any) => any, selector: (...args: Array) => U, scheduler?: rxjs$SchedulerClass): (v1: T) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, callback: (...args: Array) => any) => any, selector: (...args: Array) => U, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, callback: (...args: Array) => any) => any, selector: (...args: Array) => U, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, callback: (...args: Array) => any) => any, selector: (...args: Array) => U, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, callback: (...args: Array) => any) => any, selector: (...args: Array) => U, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => rxjs$Observable; + static bindCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, callback: (...args: Array) => any) => any, selector: (...args: Array) => U, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => rxjs$Observable; + static bindCallback(callbackFunc: Function, selector?: void, scheduler?: rxjs$SchedulerClass): (...args: Array) => rxjs$Observable; + static bindCallback(callbackFunc: Function, selector?: (...args: Array) => T, scheduler?: rxjs$SchedulerClass): (...args: Array) => rxjs$Observable; + + static bindNodeCallback(callbackFunc: (callback: (err: any, result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): () => rxjs$Observable; + static bindNodeCallback(callbackFunc: (v1: T, callback: (err: any, result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T) => rxjs$Observable; + static bindNodeCallback(callbackFunc: (v1: T, v2: T2, callback: (err: any, result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2) => rxjs$Observable; + static bindNodeCallback(callbackFunc: (v1: T, v2: T2, v3: T3, callback: (err: any, result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3) => rxjs$Observable; + static bindNodeCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, callback: (err: any, result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4) => rxjs$Observable; + static bindNodeCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, callback: (err: any, result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5) => rxjs$Observable; + static bindNodeCallback(callbackFunc: (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6, callback: (err: any, result: U) => any) => any, selector?: void, scheduler?: rxjs$SchedulerClass): (v1: T, v2: T2, v3: T3, v4: T4, v5: T5, v6: T6) => rxjs$Observable; + static bindNodeCallback(callbackFunc: Function, selector?: void, scheduler?: rxjs$SchedulerClass): (...args: Array) => rxjs$Observable; + static bindNodeCallback(callbackFunc: Function, selector?: (...args: Array) => T, scheduler?: rxjs$SchedulerClass): (...args: Array) => rxjs$Observable; + + static concat(...sources: rxjs$Observable[]): rxjs$Observable; + + static create( + subscribe: (observer: rxjs$Observer) => rxjs$ISubscription | Function | void + ): rxjs$Observable; + + static defer(observableFactory: () => rxjs$Observable | Promise): rxjs$Observable; + + static from(iterable: Iterable): rxjs$Observable; + + static fromEvent(element: any, eventName: string, ...none: Array): rxjs$Observable; + static fromEvent( + element: any, + eventName: string, + options: rxjs$EventListenerOptions, + ...none: Array + ): rxjs$Observable; + static fromEvent( + element: any, + eventName: string, + selector: () => T, + ...none: Array + ): rxjs$Observable; + static fromEvent( + element: any, + eventName: string, + options: rxjs$EventListenerOptions, + selector: () => T, + ): rxjs$Observable; + + static fromEventPattern( + addHandler: (handler: (item: T) => void) => void, + removeHandler: (handler: (item: T) => void) => void, + selector?: () => T, + ): rxjs$Observable; + + static fromPromise(promise: Promise): rxjs$Observable; + + static empty(): rxjs$Observable; + + static interval(period: number): rxjs$Observable; + + static timer(initialDelay: (number | Date), period?: number, scheduler?: rxjs$SchedulerClass): rxjs$Observable; + + static merge( + source0: rxjs$Observable, + source1: rxjs$Observable, + ): rxjs$Observable; + static merge( + source0: rxjs$Observable, + source1: rxjs$Observable, + source2: rxjs$Observable, + ): rxjs$Observable; + static merge(...sources: rxjs$Observable[]): rxjs$Observable; + + static never(): rxjs$Observable; + + static of(...values: T[]): rxjs$Observable; + + static throw(error: any): rxjs$Observable; + + audit(durationSelector: (value: T) => rxjs$Observable | Promise): rxjs$Observable; + + race(other: rxjs$Observable): rxjs$Observable; + + repeat(): rxjs$Observable; + + buffer(bufferBoundaries: rxjs$Observable): rxjs$Observable>; + + catch(selector: (err: any, caught: rxjs$Observable) => rxjs$Observable): rxjs$Observable; + + concat(...sources: rxjs$Observable[]): rxjs$Observable; + + concatAll(): rxjs$Observable; + + concatMap( + f: (value: T) => rxjs$Observable | Promise | Iterable + ): rxjs$Observable; + + debounceTime(dueTime: number, scheduler?: rxjs$SchedulerClass): rxjs$Observable; + + delay(dueTime: number, scheduler?: rxjs$SchedulerClass): rxjs$Observable; + + distinctUntilChanged(compare?: (x: T, y: T) => boolean): rxjs$Observable; + + distinct(keySelector?: (value: T) => U, flushes?: rxjs$Observable): rxjs$Observable; + + distinctUntilKeyChanged(key: string, compare?: (x: mixed, y: mixed) => boolean): rxjs$Observable; + + elementAt(index: number, defaultValue?: T): rxjs$Observable; + + filter(predicate: (value: T, index: number) => boolean, thisArg?: any): rxjs$Observable; + + finally(f: () => mixed): rxjs$Observable; + + first( + predicate?: (value: T, index: number, source: rxjs$Observable) => boolean, + ): rxjs$Observable; + first( + predicate: ?(value: T, index: number, source: rxjs$Observable) => boolean, + resultSelector: (value: T, index: number) => U, + ): rxjs$Observable; + first( + predicate: ?(value: T, index: number, source: rxjs$Observable) => boolean, + resultSelector: ?(value: T, index: number) => U, + defaultValue: U, + ): rxjs$Observable; + + groupBy( + keySelector: (value: T) => mixed, + elementSelector?: (value: T) => T, + compare?: (x: T, y: T) => boolean, + ): rxjs$Observable>; + + ignoreElements(): rxjs$Observable; + + let(project: (self: rxjs$Observable) => rxjs$Observable): rxjs$Observable; + + // Alias for `let` + letBind(project: (self: rxjs$Observable) => rxjs$Observable): rxjs$Observable; + + switch(): T; // assumption: T is Observable + + // Alias for `mergeMap` + flatMap( + project: (value: T) => rxjs$Observable | Promise | Iterable, + index?: number, + ): rxjs$Observable; + + flatMapTo( + innerObservable: rxjs$Observable + ): rxjs$Observable; + + flatMapTo( + innerObservable: rxjs$Observable < U >, + resultSelector: (outerValue: T, innerValue: U, outerIndex: number, innerIndex: number) => V, + concurrent ?: number + ): rxjs$Observable; + + switchMap( + project: (value: T) => rxjs$Observable | Promise | Iterable, + index?: number, + ): rxjs$Observable; + + switchMapTo( + innerObservable: rxjs$Observable, + ): rxjs$Observable; + + map(f: (value: T) => U): rxjs$Observable; + + mapTo(value: U): rxjs$Observable; + + merge(other: rxjs$Observable): rxjs$Observable; + + mergeAll(): rxjs$Observable; + + mergeMap( + project: (value: T, index?: number) => rxjs$Observable | Promise | Iterable, + index?: number, + ): rxjs$Observable; + + mergeMapTo( + innerObservable: rxjs$Observable + ): rxjs$Observable; + + mergeMapTo( + innerObservable: rxjs$Observable < U >, + resultSelector: (outerValue: T, innerValue: U, outerIndex: number, innerIndex: number) => V, + concurrent ?: number + ): rxjs$Observable; + + multicast( + subjectOrSubjectFactory: rxjs$Subject | () => rxjs$Subject, + ): rxjs$ConnectableObservable; + + observeOn(scheduler: rxjs$SchedulerClass): rxjs$Observable; + + pairwise(): rxjs$Observable<[T, T]>; + + publish(): rxjs$ConnectableObservable; + + publishLast(): rxjs$ConnectableObservable; + + reduce( + accumulator: ( + acc: U, + currentValue: T, + index: number, + source: rxjs$Observable, + ) => U, + seed: U, + ): rxjs$Observable; + + sample(notifier: rxjs$Observable): rxjs$Observable; + + sampleTime(delay: number): rxjs$Observable; + + publishReplay(bufferSize?: number, windowTime?: number, scheduler?: rxjs$SchedulerClass): rxjs$ConnectableObservable; + + retry(retryCount: number): rxjs$Observable; + + retryWhen(notifier: (errors: rxjs$Observable) => rxjs$Observable): rxjs$Observable; + + scan( + f: (acc: U, value: T) => U, + initialValue: U, + ): rxjs$Observable; + + share(): rxjs$Observable; + + skip(count: number): rxjs$Observable; + + skipUntil(other: rxjs$Observable | Promise): rxjs$Observable; + + skipWhile(predicate: (value: T, index: number) => boolean): rxjs$Observable; + + startWith(...values: Array): rxjs$Observable; + + subscribeOn(scheduler: rxjs$SchedulerClass): rxjs$Observable; + + take(count: number): rxjs$Observable; + + takeUntil(other: rxjs$Observable): rxjs$Observable; + + takeWhile(predicate: (value: T, index: number) => boolean): rxjs$Observable; + + do( + onNext?: (value: T) => mixed, + onError?: (error: any) => mixed, + onCompleted?: () => mixed, + ): rxjs$Observable; + do(observer: { + next?: (value: T) => mixed; + error?: (error: any) => mixed; + complete?: () => mixed; + }): rxjs$Observable; + + throttleTime(duration: number): rxjs$Observable; + + timeout(due: number | Date, _: void): rxjs$Observable; + + toArray(): rxjs$Observable; + + toPromise(): Promise; + + subscribe(observer: rxjs$PartialObserver): rxjs$Subscription; + subscribe( + onNext: ?(value: T) => mixed, + onError: ?(error: any) => mixed, + onCompleted: ?() => mixed, + ): rxjs$Subscription; + + static combineLatest( + a: rxjs$Observable, + resultSelector: (a: A) => B, + ): rxjs$Observable; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + resultSelector: (a: A, b: B) => C, + ): rxjs$Observable; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + resultSelector: (a: A, b: B, c: C) => D, + ): rxjs$Observable; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D) => E, + ): rxjs$Observable; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E) => F, + ): rxjs$Observable; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G, + ): rxjs$Observable; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H, + ): rxjs$Observable; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B]>; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C]>; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D]>; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E]>; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E, F]>; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E, F, G]>; + + static combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + h: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E, F, G, H]>; + + combineLatest( + a: rxjs$Observable, + _: void, + ): rxjs$Observable<[T, A]>; + + combineLatest( + a: rxjs$Observable, + resultSelector: (a: A) => B, + ): rxjs$Observable; + + combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + resultSelector: (a: A, b: B) => C, + ): rxjs$Observable; + + combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + resultSelector: (a: A, b: B, c: C) => D, + ): rxjs$Observable; + + combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D) => E, + ): rxjs$Observable; + + combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E) => F, + ): rxjs$Observable; + + combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G, + ): rxjs$Observable; + + combineLatest( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + resultSelector: (a: A) => B, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + resultSelector: (a: A, b: B) => C, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + resultSelector: (a: A, b: B, c: C) => D, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D) => E, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E) => F, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H, + ): rxjs$Observable; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B]>; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C]>; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D]>; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E]>; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E, F]>; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E, F, G]>; + + static forkJoin( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + h: rxjs$Observable, + _: void, + ): rxjs$Observable<[A, B, C, D, E, F, G, H]>; + + withLatestFrom( + a: rxjs$Observable, + _: void, + ): rxjs$Observable<[T, A]>; + + withLatestFrom( + a: rxjs$Observable, + resultSelector: (a: A) => B, + ): rxjs$Observable; + + withLatestFrom( + a: rxjs$Observable, + b: rxjs$Observable, + resultSelector: (a: A, b: B) => C, + ): rxjs$Observable; + + withLatestFrom( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + resultSelector: (a: A, b: B, c: C) => D, + ): rxjs$Observable; + + withLatestFrom( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D) => E, + ): rxjs$Observable; + + withLatestFrom( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E) => F, + ): rxjs$Observable; + + withLatestFrom( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F) => G, + ): rxjs$Observable; + + withLatestFrom( + a: rxjs$Observable, + b: rxjs$Observable, + c: rxjs$Observable, + d: rxjs$Observable, + e: rxjs$Observable, + f: rxjs$Observable, + g: rxjs$Observable, + resultSelector: (a: A, b: B, c: C, d: D, e: E, f: F, g: G) => H, + ): rxjs$Observable; + + static using( + resourceFactory: () => ?R, + observableFactory: (resource: R) => rxjs$Observable | Promise | void, + ): rxjs$Observable; +} + +declare class rxjs$ConnectableObservable extends rxjs$Observable { + connect(): rxjs$Subscription; + refCount(): rxjs$Observable; +} + +declare class rxjs$Observer { + next(value: T): mixed; + + error(error: any): mixed; + + complete(): mixed; +} + +// FIXME(samgoldman) should be `mixins rxjs$Observable, rxjs$Observer` +// once Babel parsing support exists: https://phabricator.babeljs.io/T6821 +declare class rxjs$Subject extends rxjs$Observable { + asObservable(): rxjs$Observable; + + observers: Array>; + + unsubscribe(): void; + + // Copied from rxjs$Observer + next(value: T): mixed; + error(error: any): mixed; + complete(): mixed; + + // For use in subclasses only: + _next(value: T): void; + _subscribe(observer: rxjs$PartialObserver): rxjs$Subscription; +} + +declare class rxjs$BehaviorSubject extends rxjs$Subject { + constructor(initialValue: T): void; + + getValue(): T; +} + +declare class rxjs$ReplaySubject extends rxjs$Subject { + constructor(bufferSize?: number, windowTime?: number, scheduler?: rxjs$SchedulerClass): void; +} + +declare class rxjs$Subscription { + unsubscribe(): void; + add(teardown: rxjs$TeardownLogic): rxjs$Subscription; +} + +declare class rxjs$SchedulerClass { + schedule(work: (state?: T) => void, delay?: number, state?: T): rxjs$Subscription; +} + +declare class rxjs$TimeoutError extends Error { +} + +declare module 'rxjs' { + declare module.exports: { + Observable: typeof rxjs$Observable, + ConnectableObservable: typeof rxjs$ConnectableObservable, + Subject: typeof rxjs$Subject, + BehaviorSubject: typeof rxjs$BehaviorSubject, + ReplaySubject: typeof rxjs$ReplaySubject, + Scheduler: { + asap: rxjs$SchedulerClass, + queue: rxjs$SchedulerClass, + animationFrame: rxjs$SchedulerClass, + async: rxjs$SchedulerClass, + }, + Subscription: typeof rxjs$Subscription, + TimeoutError: typeof rxjs$TimeoutError, + } +} + +declare module 'rxjs/Observable' { + declare module.exports: { + Observable: typeof rxjs$Observable + } +} + +declare module 'rxjs/Observer' { + declare module.exports: { + Observer: typeof rxjs$Observer + } +} + +declare module 'rxjs/BehaviorSubject' { + declare module.exports: { + BehaviorSubject: typeof rxjs$BehaviorSubject + } +} + +declare module 'rxjs/ReplaySubject' { + declare module.exports: { + ReplaySubject: typeof rxjs$ReplaySubject + } +} + +declare module 'rxjs/Subject' { + declare module.exports: { + Subject: typeof rxjs$Subject + } +} + +declare module 'rxjs/Subscription' { + declare module.exports: { + Subscription: typeof rxjs$Subscription + } +} diff --git a/flow-typed/npm/sinon_vx.x.x.js b/flow-typed/npm/sinon_vx.x.x.js new file mode 100644 index 0000000..c0a12e7 --- /dev/null +++ b/flow-typed/npm/sinon_vx.x.x.js @@ -0,0 +1,375 @@ +// flow-typed signature: 793e31492adbe3b106003d622d9b4c60 +// flow-typed version: <>/sinon_v^2.1.0/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'sinon' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'sinon' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'sinon/lib/sinon' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/assert' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/behavior' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/blob' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/call' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/collect-own-methods' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/collection' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/color' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/default-behaviors' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/match' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/mock-expectation' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/mock' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/sandbox' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/spy-formatters' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/spy' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/stub-descriptor' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/stub-entire-object' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/stub-non-function-property' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/stub' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/throw-on-falsy-object' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/called-in-order' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/deep-equal' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/default-config' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/deprecated' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/every' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/extend' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/format' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/function-name' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/function-to-string' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/get-config' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/get-property-descriptor' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/index' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/iterable-to-string' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/log_error' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/order-by-first-call' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/restore' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/times-in-words' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/typeOf' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/value-to-string' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/walk' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/core/wrap-method' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/event' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/fake_server_with_clock' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/fake_server' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/fake_timers' { + declare module.exports: any; +} + +declare module 'sinon/lib/sinon/util/fake_xml_http_request' { + declare module.exports: any; +} + +declare module 'sinon/pkg/sinon-2.2.0' { + declare module.exports: any; +} + +declare module 'sinon/pkg/sinon-no-sourcemaps-2.2.0' { + declare module.exports: any; +} + +declare module 'sinon/pkg/sinon-no-sourcemaps' { + declare module.exports: any; +} + +declare module 'sinon/pkg/sinon' { + declare module.exports: any; +} + +// Filename aliases +declare module 'sinon/lib/sinon.js' { + declare module.exports: $Exports<'sinon/lib/sinon'>; +} +declare module 'sinon/lib/sinon/assert.js' { + declare module.exports: $Exports<'sinon/lib/sinon/assert'>; +} +declare module 'sinon/lib/sinon/behavior.js' { + declare module.exports: $Exports<'sinon/lib/sinon/behavior'>; +} +declare module 'sinon/lib/sinon/blob.js' { + declare module.exports: $Exports<'sinon/lib/sinon/blob'>; +} +declare module 'sinon/lib/sinon/call.js' { + declare module.exports: $Exports<'sinon/lib/sinon/call'>; +} +declare module 'sinon/lib/sinon/collect-own-methods.js' { + declare module.exports: $Exports<'sinon/lib/sinon/collect-own-methods'>; +} +declare module 'sinon/lib/sinon/collection.js' { + declare module.exports: $Exports<'sinon/lib/sinon/collection'>; +} +declare module 'sinon/lib/sinon/color.js' { + declare module.exports: $Exports<'sinon/lib/sinon/color'>; +} +declare module 'sinon/lib/sinon/default-behaviors.js' { + declare module.exports: $Exports<'sinon/lib/sinon/default-behaviors'>; +} +declare module 'sinon/lib/sinon/match.js' { + declare module.exports: $Exports<'sinon/lib/sinon/match'>; +} +declare module 'sinon/lib/sinon/mock-expectation.js' { + declare module.exports: $Exports<'sinon/lib/sinon/mock-expectation'>; +} +declare module 'sinon/lib/sinon/mock.js' { + declare module.exports: $Exports<'sinon/lib/sinon/mock'>; +} +declare module 'sinon/lib/sinon/sandbox.js' { + declare module.exports: $Exports<'sinon/lib/sinon/sandbox'>; +} +declare module 'sinon/lib/sinon/spy-formatters.js' { + declare module.exports: $Exports<'sinon/lib/sinon/spy-formatters'>; +} +declare module 'sinon/lib/sinon/spy.js' { + declare module.exports: $Exports<'sinon/lib/sinon/spy'>; +} +declare module 'sinon/lib/sinon/stub-descriptor.js' { + declare module.exports: $Exports<'sinon/lib/sinon/stub-descriptor'>; +} +declare module 'sinon/lib/sinon/stub-entire-object.js' { + declare module.exports: $Exports<'sinon/lib/sinon/stub-entire-object'>; +} +declare module 'sinon/lib/sinon/stub-non-function-property.js' { + declare module.exports: $Exports<'sinon/lib/sinon/stub-non-function-property'>; +} +declare module 'sinon/lib/sinon/stub.js' { + declare module.exports: $Exports<'sinon/lib/sinon/stub'>; +} +declare module 'sinon/lib/sinon/throw-on-falsy-object.js' { + declare module.exports: $Exports<'sinon/lib/sinon/throw-on-falsy-object'>; +} +declare module 'sinon/lib/sinon/util/core/called-in-order.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/called-in-order'>; +} +declare module 'sinon/lib/sinon/util/core/deep-equal.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/deep-equal'>; +} +declare module 'sinon/lib/sinon/util/core/default-config.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/default-config'>; +} +declare module 'sinon/lib/sinon/util/core/deprecated.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/deprecated'>; +} +declare module 'sinon/lib/sinon/util/core/every.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/every'>; +} +declare module 'sinon/lib/sinon/util/core/extend.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/extend'>; +} +declare module 'sinon/lib/sinon/util/core/format.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/format'>; +} +declare module 'sinon/lib/sinon/util/core/function-name.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/function-name'>; +} +declare module 'sinon/lib/sinon/util/core/function-to-string.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/function-to-string'>; +} +declare module 'sinon/lib/sinon/util/core/get-config.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/get-config'>; +} +declare module 'sinon/lib/sinon/util/core/get-property-descriptor.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/get-property-descriptor'>; +} +declare module 'sinon/lib/sinon/util/core/index.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/index'>; +} +declare module 'sinon/lib/sinon/util/core/iterable-to-string.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/iterable-to-string'>; +} +declare module 'sinon/lib/sinon/util/core/log_error.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/log_error'>; +} +declare module 'sinon/lib/sinon/util/core/order-by-first-call.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/order-by-first-call'>; +} +declare module 'sinon/lib/sinon/util/core/restore.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/restore'>; +} +declare module 'sinon/lib/sinon/util/core/times-in-words.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/times-in-words'>; +} +declare module 'sinon/lib/sinon/util/core/typeOf.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/typeOf'>; +} +declare module 'sinon/lib/sinon/util/core/value-to-string.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/value-to-string'>; +} +declare module 'sinon/lib/sinon/util/core/walk.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/walk'>; +} +declare module 'sinon/lib/sinon/util/core/wrap-method.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/core/wrap-method'>; +} +declare module 'sinon/lib/sinon/util/event.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/event'>; +} +declare module 'sinon/lib/sinon/util/fake_server_with_clock.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/fake_server_with_clock'>; +} +declare module 'sinon/lib/sinon/util/fake_server.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/fake_server'>; +} +declare module 'sinon/lib/sinon/util/fake_timers.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/fake_timers'>; +} +declare module 'sinon/lib/sinon/util/fake_xml_http_request.js' { + declare module.exports: $Exports<'sinon/lib/sinon/util/fake_xml_http_request'>; +} +declare module 'sinon/pkg/sinon-2.2.0.js' { + declare module.exports: $Exports<'sinon/pkg/sinon-2.2.0'>; +} +declare module 'sinon/pkg/sinon-no-sourcemaps-2.2.0.js' { + declare module.exports: $Exports<'sinon/pkg/sinon-no-sourcemaps-2.2.0'>; +} +declare module 'sinon/pkg/sinon-no-sourcemaps.js' { + declare module.exports: $Exports<'sinon/pkg/sinon-no-sourcemaps'>; +} +declare module 'sinon/pkg/sinon.js' { + declare module.exports: $Exports<'sinon/pkg/sinon'>; +} diff --git a/flow-typed/npm/uuid_v3.x.x.js b/flow-typed/npm/uuid_v3.x.x.js new file mode 100644 index 0000000..0bf9195 --- /dev/null +++ b/flow-typed/npm/uuid_v3.x.x.js @@ -0,0 +1,15 @@ +// flow-typed signature: c07f382c8238bb78e545b60dd4f097a6 +// flow-typed version: 27f92307d3/uuid_v3.x.x/flow_>=v0.33.x + +declare module 'uuid' { + declare function v1(options?: {| + node?: number[], + clockseq?: number, + msecs?: number | Date, + nsecs?: number, + |}, buffer?: number[] | Buffer, offset?: number): string; + declare function v4(options?: {| + random?: number[], + rng?: () => number[] | Buffer, + |}, buffer?: number[] | Buffer, offset?: number): string; +} diff --git a/flow-typed/npm/uws_vx.x.x.js b/flow-typed/npm/uws_vx.x.x.js new file mode 100644 index 0000000..0423455 --- /dev/null +++ b/flow-typed/npm/uws_vx.x.x.js @@ -0,0 +1,32 @@ +// flow-typed signature: 391df0c85bb3b70a3bd9c43cd4063842 +// flow-typed version: <>/uws_v^0.14.5/flow_v0.46.0 + +/** + * This is an autogenerated libdef stub for: + * + * 'uws' + * + * Fill this stub out by replacing all the `any` types. + * + * Once filled out, we encourage you to share your work with the + * community by sending a pull request to: + * https://github.com/flowtype/flow-typed + */ + +declare module 'uws' { + declare module.exports: any; +} + +/** + * We include stubs for each file inside this npm package in case you need to + * require those files directly. Feel free to delete any files that aren't + * needed. + */ +declare module 'uws/uws' { + declare module.exports: any; +} + +// Filename aliases +declare module 'uws/uws.js' { + declare module.exports: $Exports<'uws/uws'>; +} diff --git a/lib/amqp.js b/lib/amqp.js index 2e08807..60ffc8c 100644 --- a/lib/amqp.js +++ b/lib/amqp.js @@ -1,178 +1,207 @@ 'use strict'; -const amqplib = require('amqplib'); -const debug = require('debug')('cnn-messaging:amqp'); -const util = require('util'); -const Messenger = require('./messenger'); -const Message = require('./message'); -const Rx = require('rxjs'); - -function AmqpMessenger(params) { - if (!(this instanceof AmqpMessenger)) { - return new AmqpMessenger(params); - } - Messenger.call(this, params); - this.params = params.amqp; - if (!this.params.connectionString || !this.params.exchangeName) { - throw new Error('Not properly paramsured for AMQP. See the README.'); +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _amqplib = require('amqplib'); + +var _amqplib2 = _interopRequireDefault(_amqplib); + +var _messenger = require('./messenger'); + +var _messenger2 = _interopRequireDefault(_messenger); + +var _message = require('./message'); + +var _message2 = _interopRequireDefault(_message); + +var _rxjs = require('rxjs'); + +var _rxjs2 = _interopRequireDefault(_rxjs); + +var _debug = require('debug'); + +var _debug2 = _interopRequireDefault(_debug); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } + +const debug = (0, _debug2.default)('cnn-messaging:messenger:amqp'); + +/** +A messenger that can use amqp topic exchanges and queues +*/ +class AmqpMessenger extends _messenger2.default { + + /** + Create a new amqp messenger instance + */ + constructor(params) { + super(params); + this.params = params.amqp; + if (!this.params.connectionString || !this.params.exchangeName) { + throw new Error('Not properly configured for AMQP. See the README.'); + } } - this.subscriptions = { - notification: {}, - work: {} - }; - this.observables = { - notification: {}, - work: {} - }; -} -util.inherits(AmqpMessenger, Messenger); + /** + start the service + */ + start() { + var _this = this; + + return _asyncToGenerator(function* () { + if (_this.state !== _this.states[0]) { + return Promise.reject(new Error(`Cannot start when in state: ${_this.state}`)); + } + _this.state = _this.states[1]; + debug('starting'); -AmqpMessenger.prototype.start = function start() { - return Messenger.prototype.start.call(this) - .then(() => { - return amqplib.connect(this.params.connectionString); - }) - .then((conn) => { - this.connection = conn; + const conn = yield _amqplib2.default.connect(_this.params.connectionString); + _this.connection = conn; debug('created connection'); - return Promise.all([conn.createChannel(), conn.createChannel()]); - }, (err) => { - return Promise.reject(err); - }) - .then((channels) => { - this.channel = { - private: channels[0], - work: channels[1] + + _this.channel = { + notification: yield conn.createChannel(), + work: yield conn.createChannel() }; - this.channel.work.prefetch(1, true); + _this.channel.work.prefetch(1, true); debug('created channels'); - return this.channel.private.assertExchange(this.params.exchangeName, 'topic', {durable: true}); - }) - .then(() => { - debug('exchange is ready'); - this.state = this.states[2]; + + yield _this.channel.notification.assertExchange(_this.params.exchangeName, 'topic', { durable: true }); + _this.state = _this.states[2]; + debug('started'); + return Promise.resolve(); - }); -}; - -AmqpMessenger.prototype.stop = function stop() { - return Messenger.prototype.stop.call(this) - .then(() => { - return this.channel.private.close(); - }) - .then(() => { - return this.channel.work.close(); - }) - .then(() => { - return this.connection.close(); - }) - .then(() => { - this.state = this.states[0]; + })(); + } + + /** + stop the service + */ + stop() { + var _this2 = this; + + return _asyncToGenerator(function* () { + if (_this2.state !== _this2.states[2]) { + return Promise.reject(new Error(`Cannot stop when in state: ${_this2.state}`)); + } + _this2.state = _this2.states[3]; + debug('stopping'); + + yield _this2.channel.work.close(); + yield _this2.channel.notification.close(); + debug('closed channels'); + + yield _this2.connection.close(); + debug('closed connection'); + + _this2.state = _this2.states[0]; + debug('stopped'); + return Promise.resolve(); - }); -}; - -AmqpMessenger.prototype.publish = function publish(topic, message) { - return Messenger.prototype.publish.call(this, topic, message) - .then(() => { - return new Promise((resolve, reject) => { - if (this.channel.private.publish(this.params.exchangeName, topic, message.toAmqp())) { + })(); + } + + /** + publish a message to a topic + */ + publish(topic, message) { + var _this3 = this; + + return _asyncToGenerator(function* () { + debug(`publish to topic: ${topic}, message: ${JSON.stringify(message)}`); + if (!(message instanceof _message2.default)) { + return Promise.reject(new Error('provided message is not an instance of Message')); + } + + return new Promise(function (resolve, reject) { + if (_this3.channel.notification.publish(_this3.params.exchangeName, topic, message.toAmqp())) { debug('amqp sent message'); return resolve(); } return reject(new Error('Publish failure. Queue may be full.')); }); - }); -}; - -AmqpMessenger.prototype.createNotificationObservable = function createNotificationObservable(topic) { - // assert a private queue into existance and then bind it to the topic - if (this.observables.notification[topic]) { - return this.observables.notification[topic]; + })(); } - this.observables.notification[topic] = Messenger.prototype.createNotificationObservable.call(this, topic) - .then(() => { - const queueparams = { + /** + create an observable for a given topic, type, and queue + */ + _createObservable(topic, type, queue) { + var _this4 = this; + + return _asyncToGenerator(function* () { + if (_this4.observables[type][topic]) { + return _this4.observables[type][topic]; + } + debug(`creating ${type} observable for topic: ${topic}`); + let queueparams = { durable: false, exclusive: true }; - return this.channel.private.assertQueue('', queueparams); - }, (err) => { - console.error(err); - }) - .then((q) => { - this.subscriptions.notification[topic] = q.queue; - return this.channel.private.bindQueue(q.queue, this.params.exchangeName, topic); - }, (err) => { - console.error(err); - }) - .then(() => { - debug(`created notification subscription to topic: ${topic}, queue: ${this.subscriptions.notification[topic]}`); + let noAck = true; + if (type === 'work') { + queueparams = { + durable: true, + exclusive: false + }; + noAck = false; + } + debug('using', type, 'params', queueparams, 'noAck', noAck); + const q = yield _this4.channel[type].assertQueue(queue, queueparams); + _this4.subscriptions[type][topic] = q.queue; + yield _this4.channel[type].bindQueue(q.queue, _this4.params.exchangeName, topic); + debug(`created ${type} subscription to topic: ${topic}, queue: ${_this4.subscriptions[type][topic]}`); let consTag; - return new Rx.Observable.create((observer) => { - this.channel.private.consume(this.subscriptions.notification[topic], (msg) => { - observer.next(Message.fromAmqp(msg, this.channel.notification)); - }, {noAck: true}) - .then((res) => { + _this4.observables[type][topic] = new _rxjs2.default.Observable.create(function (observer) { + // start consuming from the amqp queue + _this4.channel[type].consume(_this4.subscriptions[type][topic], function (msg) { + observer.next(_message2.default.fromAmqp(msg, _this4.channel[type])); + }, { noAck }).then(function (res) { consTag = res.consumerTag; }); - return () => { + + // return the function that handles unsubscribe here + return function () { debug(`stop consuming from ${topic}`); - // unbind the private queue from the topic to stop routing at the amqp server - this.channel.private.unbindQueue(this.subscriptions.notification[topic], this.params.exchangeName, topic); - this.channel.private.cancel(consTag); - debug(`stopped receiving new messages from ${topic}`); - delete this.subscriptions.notification[topic]; - delete this.observables.notification[topic]; + if (type !== 'work') { + // unbind the queue from the topic to stop routing at the amqp server + _this4.channel[type].unbindQueue(_this4.subscriptions[type][topic], _this4.params.exchangeName, topic); + } + _this4.channel[type].cancel(consTag); + debug(`stopped receiving new ${type} messages from ${topic}`); + delete _this4.subscriptions[type][topic]; + delete _this4.observables[type][topic]; }; }); - }); + return _this4.observables[type][topic]; + })(); + } - return this.observables.notification[topic]; -}; + /** + create an observable for a given topic, that is meant for multiple recipients per message + */ + createNotificationObservable(topic) { + var _this5 = this; -AmqpMessenger.prototype.createWorkObservable = function createWorkObservable(topic, queue) { - // assert a private queue into existance and then bind it to the topic - if (this.observables.work[topic]) { - return this.observables.work[topic]; + return _asyncToGenerator(function* () { + return _this5._createObservable(topic, 'notification', ''); + })(); } - this.observables.work[topic] = Messenger.prototype.createWorkObservable.call(this, topic) - .then(() => { - const queueparams = { - durable: true, - exclusive: false - }; - return this.channel.private.assertQueue(queue, queueparams); - }) - .then((q) => { - this.subscriptions.work[topic] = q.queue; - return this.channel.work.bindQueue(q.queue, this.params.exchangeName, topic); - }) - .then(() => { - debug(`created work subscription to topic: ${topic}, queue: ${this.subscriptions.work[topic]}`); - let consTag; - return new Rx.Observable.create((observer) => { - this.channel.work.consume(this.subscriptions.work[topic], (msg) => { - observer.next(Message.fromAmqp(msg, this.channel.work)); - }, {noAck: false}) - .then((res) => { - consTag = res.consumerTag; - }); - return () => { - debug(`stop consuming from ${topic} on ${consTag}`); - // do NOT unbind the work queue from the topic - this.channel.work.cancel(consTag); - debug(`stopped receiving new messages from ${topic}`); - delete this.subscriptions.work[topic]; - delete this.observables.work[topic]; - }; - }); - }); - - return this.observables.work[topic]; -}; + /** + create an observable for a given topic, that is meant for a single recipient per message + */ + createWorkObservable(topic, queue) { + var _this6 = this; -module.exports = AmqpMessenger; + return _asyncToGenerator(function* () { + return _this6._createObservable(topic, 'work', queue); + })(); + } +} +exports.default = AmqpMessenger; +module.exports = exports['default']; \ No newline at end of file diff --git a/lib/message.js b/lib/message.js index b1fa1ac..cdb6ab6 100644 --- a/lib/message.js +++ b/lib/message.js @@ -1,67 +1,121 @@ 'use strict'; -const debug = require('debug')('cnn-messaging:message'); -const _ = require('lodash'); -const uuidV1 = require('uuid/v1'); -const Joi = require('joi'); - -const messageSchema = Joi.object().keys({ - id: Joi.string(), - timestamp: Joi.date(), - context: Joi.object().keys({ - systemId: Joi.string(), - environment: Joi.string(), - userId: Joi.string(), - requestId: Joi.string(), - model: Joi.string(), - objectId: [Joi.string(), Joi.number()], - action: Joi.string(), - objectVersion: [Joi.string(), Joi.number(), Joi.date()] - }), - event: Joi.object() +Object.defineProperty(exports, "__esModule", { + value: true }); -function Message(messageObject) { - if (!(this instanceof Message)) { - return new Message(messageObject); +var _v = require('uuid/v1'); + +var _v2 = _interopRequireDefault(_v); + +var _debug = require('debug'); + +var _debug2 = _interopRequireDefault(_debug); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const debug = (0, _debug2.default)('cnn-messaging:message'); + +const defaults = { + systemId: 'unknownSystemId', + environment: 'unknownEnvironment', + model: 'unknownModel', + objectId: 'unknownObjectId', + action: 'unknownAction' +}; + +/** +A Message object +*/ +class Message { + + /** + create a new instance of Message + */ + constructor(message) { + debug('new message', message); + message = message || { context: {} }; + this.context = message.context; + this.event = message.event; + this.id = message.id || (0, _v2.default)(); + this.timestamp = message.timestamp || new Date().toISOString(); } - const validate = Joi.validate(messageObject, messageSchema); - if (validate.error) { - throw validate.error; + + /** + Stringify the message + */ + toString() { + const shadow = { + id: this.id, + timestamp: this.timestamp, + context: this.context, + event: this.event + }; + return JSON.stringify(shadow); } - if (!this.id) { - this.id = uuidV1(); + + /** + Convert the message for websocket delivery + */ + toWS() { + return this.toString(); } - if (!this.timestamp) { - this.timestamp = (new Date()).toISOString(); + + /** + Convert the message for amqp delivery + */ + toAmqp() { + return Buffer.from(this.toString()); } - _.assign(this, messageObject); -} -Message.fromAmqp = function fromAmqp(rawMessage, channel) { - debug(`from amqp: ${JSON.stringify(rawMessage)}`); - const messageString = rawMessage.content.toString(); - const messageObject = JSON.parse(messageString); - const message = new Message(messageObject); - message.ack = function ack() { - debug('Ack message'); - channel.ack(rawMessage); - }; - message.nack = function nack() { - debug('Nack message'); - channel.nack(rawMessage); - }; - return message; -}; + /** + Get the preferred topic name from the message context + */ + getTopic() { + const topic = []; + const context = this.context || {}; + topic.push(context.systemId || defaults['systemId']); + topic.push(context.environment || defaults['environment']); + topic.push(context.model || defaults['model']); + topic.push(context.objectId || defaults['objectId']); + topic.push(context.action || defaults['action']); + return topic.join('.'); + } -Message.prototype.toWS = function toWS() { - // convert 'this' to a message that can be published to kafka - return JSON.stringify(this); -}; + /** + Ack a work message (mark it as completed) + */ + ack() { + if (this.meta && this.meta.rawMessage && this.meta.channel) { + debug('Ack message', this.meta.rawMessage); + this.meta.channel.ack(this.meta.rawMessage); + } + } -Message.prototype.toAmqp = function toAmqp() { - // convert 'this' to a message that can be published to amqp - return Buffer.from(JSON.stringify(this)); -}; + /** + Nack a work message (mark it as failed, for redelivery) + */ + nack() { + if (this.meta && this.meta.rawMessage && this.meta.channel) { + debug('Nack message', this.meta.rawMessage); + this.meta.channel.nack(this.meta.rawMessage); + } + } -module.exports = Message; + /** + Convert a raw amqp message into an instance of Message + */ + static fromAmqp(rawMessage, channel) { + debug(`from amqp: ${JSON.stringify(rawMessage)}`); + const messageString = rawMessage.content.toString(); + const messageObject = JSON.parse(messageString); + const message = new Message(messageObject); + message.meta = { + rawMessage, + channel + }; + return message; + } +} +exports.default = Message; +module.exports = exports['default']; \ No newline at end of file diff --git a/lib/messenger.js b/lib/messenger.js index dfb07b0..e802ea3 100644 --- a/lib/messenger.js +++ b/lib/messenger.js @@ -1,71 +1,143 @@ 'use strict'; -const debug = require('debug')('cnn-messaging:messenger'); -const EventEmitter = require('events').EventEmitter; -const util = require('util'); -const Rx = require('rxjs'); -const Message = require('./message'); -const WebsocketRelay = require('./websocket'); - -function Messenger(params) { - if (!(this instanceof Messenger)) { - return new Messenger(params); - } - EventEmitter.call(this); - params = params || {}; - this.states = { - 0: 'STOPPED', - 1: 'STARTING', - 2: 'STARTED', - 3: 'STOPPING', - 4: 'ERROR' - }; - this.state = this.states[0]; - if (params.port) { - debug('got port, creating websocket relay'); - WebsocketRelay({ - port: params.port, - messenger: this - }); - } -} +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _events = require('events'); + +var _events2 = _interopRequireDefault(_events); + +var _rxjs = require('rxjs'); + +var _rxjs2 = _interopRequireDefault(_rxjs); + +var _message = require('./message'); + +var _message2 = _interopRequireDefault(_message); + +var _websocket = require('./websocket'); + +var _websocket2 = _interopRequireDefault(_websocket); + +var _debug = require('debug'); + +var _debug2 = _interopRequireDefault(_debug); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } -util.inherits(Messenger, EventEmitter); +function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } -Messenger.prototype.start = function start() { - if (this.state !== this.states[0]) { - return Promise.reject(new Error(`Cannot start when in state: ${this.state}`)); +const debug = (0, _debug2.default)('cnn-messaging:messenger'); + +/** +An in-memory messenger, providing pub/sub like features +*/ +class Messenger extends _events2.default.EventEmitter { + + /** + Create a new messenger instance + */ + constructor(params) { + super(); + params = params || {}; + this.states = ['STOPPED', 'STARTING', 'STARTED', 'STOPPING', 'ERROR']; + this.state = this.states[0]; + this.subscriptions = { + notification: {}, + work: {} + }; + this.observables = { + notification: {}, + work: {} + }; + if (params.port) { + const interval = process.env.PINGINTERVAL && parseInt(process.env.PINGINTERVAL) || 30000; + debug('got port, creating websocket relay with ping interval', interval); + this.websocketRelay = new _websocket2.default({ + port: params.port, + messenger: this, + pingInterval: interval + }); + } } - this.state = this.states[1]; - debug('starting'); - return Promise.resolve(); -}; - -Messenger.prototype.stop = function stop() { - if (this.state !== this.states[2]) { - return Promise.reject(new Error(`Cannot stop when in state: ${this.state}`)); + + /** + start the service + */ + start() { + var _this = this; + + return _asyncToGenerator(function* () { + return new Promise(function (resolve, reject) { + if (_this.state !== _this.states[0]) { + return reject(new Error(`Cannot start when in state: ${_this.state}`)); + } + _this.state = _this.states[1]; + debug('starting'); + + _this.state = _this.states[2]; + debug('started'); + + resolve(); + }); + })(); } - this.state = this.states[3]; - debug('stopping'); - return Promise.resolve(); -}; - -Messenger.prototype.publish = function publish(topic, message) { - debug(`publish to topic: ${topic}, message: ${JSON.stringify(message)}`); - if (!(message instanceof Message)) { - return Promise.reject(new Error('provided message is not an instance of Message')); + + /** + stop the service + */ + stop() { + var _this2 = this; + + return _asyncToGenerator(function* () { + return new Promise(function (resolve, reject) { + if (_this2.state !== _this2.states[2]) { + return reject(new Error(`Cannot stop when in state: ${_this2.state}`)); + } + _this2.state = _this2.states[3]; + debug('stopping'); + + _this2.state = _this2.states[0]; + debug('stopped'); + + resolve(); + }); + })(); } - return Promise.resolve(); -}; -Messenger.prototype.createNotificationObservable = function createNotificationObservable(topic) { - debug(`creating observable for topic: ${topic}`); - return Promise.resolve(new Rx.Subject()); -}; + /** + publish a message to a topic + */ + publish(topic, message) { + return _asyncToGenerator(function* () { + debug(`publish to topic: ${topic}, message: ${JSON.stringify(message)}`); + if (!(message instanceof _message2.default)) { + return Promise.reject(new Error('provided message is not an instance of Message')); + } + return Promise.resolve(); + })(); + } -Messenger.prototype.createWorkObservable = function createWorkObservable(topic, sharedQueue) { - debug(`creating observable for: ${sharedQueue} to topic: ${topic}`); - return Promise.resolve(new Rx.Subject()); -}; + /** + create an observable for a given topic, that is meant for multiple recipients per message + */ + createNotificationObservable(topic) { + return _asyncToGenerator(function* () { + debug(`creating observable for topic: ${topic}`); + return Promise.resolve(new _rxjs2.default.Subject()); + })(); + } -module.exports = Messenger; + /** + create an observable for a given topic, that is meant for a single recipient per message + */ + createWorkObservable(topic, sharedQueue) { + return _asyncToGenerator(function* () { + debug(`creating observable for: ${sharedQueue} to topic: ${topic}`); + return Promise.resolve(new _rxjs2.default.Subject()); + })(); + } +} +exports.default = Messenger; +module.exports = exports['default']; \ No newline at end of file diff --git a/lib/websocket.js b/lib/websocket.js index 6839d8c..d64d291 100644 --- a/lib/websocket.js +++ b/lib/websocket.js @@ -1,27 +1,78 @@ 'use strict'; -const debug = require('debug')('cnn-messaging:websocket'); -const WebSocket = require('uws'); +Object.defineProperty(exports, "__esModule", { + value: true +}); -function WebsocketRelay(params) { - if (!(this instanceof WebsocketRelay)) { - return new WebsocketRelay(params); +var _uws = require('uws'); + +var _uws2 = _interopRequireDefault(_uws); + +var _messenger = require('./messenger'); + +var _messenger2 = _interopRequireDefault(_messenger); + +var _debug = require('debug'); + +var _debug2 = _interopRequireDefault(_debug); + +function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } + +const debug = (0, _debug2.default)('cnn-messaging:messenger:websocket'); + +/** +A performant websocket relay for messenger +*/ + + +class WebsocketRelay { + /** + create a new instance of websocket relay + */ + constructor(params) { + params = params || {}; + if (!params.messenger || !params.port) { + throw new Error('You must provide an instance of a messenger and a port for web socket server'); + } + this.io = new _uws2.default.Server({ + perMessageDeflate: false, + port: params.port + }); + this.messenger = params.messenger; + this.messenger.websocketRelay = this; + this.connectionCount = 0; + this.connections = 0; + this.observables = {}; + this.subscriptions = {}; + this.pingInterval = params.pingInterval; + + this.io.on('connection', socket => { + this.handleSocketConnection(socket); + }); + + this.pingService = setInterval(() => { + this.sendPing(); + }, this.pingInterval); + // $FlowFixMe (flow does not understand the next line) + this.pingService.unref(); // allows graceful shutdown } - params = params || {}; - if (!params.messenger || !params.port) { - throw new Error('You must provide an instance of a messenger and a port for web socket server'); + + sendPing() { + this.io.clients.forEach(ws => { + if (ws.isAlive === false) { + return ws.terminate(); + } + + ws.isAlive = false; + ws.ping('', false, true); + }); } - this.io = new WebSocket.Server({ - perMessageDeflate: false, - port: params.port - }); - this.messenger = params.messenger; - this.messenger.websocketRelay = this; - this.connectionCount = 0; - - this.io.on('connection', (socket) => { - socket.id = this.connectionCount; + + handleSocketConnection(socket) { this.connectionCount++; + this.connections++; + + socket.id = this.connectionCount; debug(`socket ${socket.id} connected`); socket.isAlive = true; @@ -29,95 +80,84 @@ function WebsocketRelay(params) { socket.isAlive = true; }); - socket.on('message', (msg) => { - let request; - try { - request = JSON.parse(msg); - } catch (e) { - debug(`Error parsing request ${msg}`); - return; - } - - debug(`Got message ${msg}`); - - switch (request.action) { - case 'subscribe': - debug(`got subscribe request for ${request.topic}`); - if (!this.observables[request.topic]) { - this.messenger.createNotificationObservable(request.topic) - .then((o) => { - this.observables[request.topic] = o.subscribe((message) => { - this.sendToTopic(request.topic, message.toWS()); - }, (err) => { - debug(err); - }, () => { - debug('observable ended'); - }); - }); - } - if (!this.subscriptions[request.topic]) { - this.subscriptions[request.topic] = {}; - } - this.subscriptions[request.topic][socket.id] = socket; - break; - case 'unsubscribe': - if (this.subscriptions[request.topic][socket.id]) { - delete this.subscriptions[request.topic][socket.id]; - if (!Object.keys(this.subscriptions[request.topic]).length) { - delete this.subscriptions[request.topic]; - } - } - if (!this.subscriptions[request.topic] && this.observables[request.topic]) { - debug(`closing observable for ${request.topic}`); - this.observables[request.topic].unsubscribe(); - delete this.observables[request.topic]; - } - break; - default: - debug(`Got unknown request action: ${request.action}`); - } + socket.on('message', msg => { + this.handleSocketMessage(socket, msg); }); socket.on('close', () => { - debug(`socket ${socket.id} disconnected`); - Object.keys(this.subscriptions).forEach((topic) => { - if (this.subscriptions[topic][socket.id]) { - delete this.subscriptions[topic][socket.id]; - if (!Object.keys(this.subscriptions[topic]).length) { - delete this.subscriptions[topic]; - } - } - if (!this.subscriptions[topic] && this.observables[topic]) { - debug(`closing observable for ${topic}`); - this.observables[topic].unsubscribe(); - delete this.observables[topic]; - } - }); + this.handleSocketClose(socket); }); - }); + } - const interval = setInterval(() => { - this.io.clients.forEach((ws) => { - if (ws.isAlive === false) { - return ws.terminate(); + handleSocketMessage(socket, msg) { + let request; + try { + request = JSON.parse(msg); + } catch (e) { + debug(`Error parsing request ${msg}`); + return; + } + + switch (request.action) { + case 'subscribe': + this.subscribe(request.topic, socket); + break; + case 'unsubscribe': + this.unsubscribe(request.topic, socket.id); + break; + default: + debug(`Got unknown request action: ${request.action}`); + } + } + + subscribe(topic, socket) { + debug(`got subscribe request for ${topic}`); + if (!this.observables[topic]) { + this.messenger.createNotificationObservable(topic).then(o => { + this.observables[topic] = o.subscribe(message => { + this.sendToTopic(topic, message.toWS()); + }, err => { + debug(err); + }, () => { + debug('observable ended'); + }); + }); + } + if (!this.subscriptions[topic]) { + this.subscriptions[topic] = {}; + } + this.subscriptions[topic][socket.id] = socket; + } + + unsubscribe(topic, socketId) { + if (this.subscriptions[topic][socketId]) { + delete this.subscriptions[topic][socketId]; + if (!Object.keys(this.subscriptions[topic]).length) { + delete this.subscriptions[topic]; } + } + if (!this.subscriptions[topic] && this.observables[topic]) { + debug(`closing observable for ${topic}`); + this.observables[topic].unsubscribe(); + delete this.observables[topic]; + } + } - ws.isAlive = false; - ws.ping('', false, true); + handleSocketClose(socket) { + this.connections--; + debug(`socket ${socket.id} disconnected`); + Object.keys(this.subscriptions).forEach(topic => { + this.unsubscribe(topic, socket.id); }); - }, 30000); - interval.unref(); + } - this.observables = {}; - this.subscriptions = {}; + sendToTopic(topic, msg) { + Object.keys(this.subscriptions[topic]).forEach(socketId => { + const socket = this.subscriptions[topic][socketId]; + debug('sending to websocket', socketId, topic, msg); + socket.send(msg); + }); + } } - -WebsocketRelay.prototype.sendToTopic = function sendToTopic(topic, msg) { - Object.keys(this.subscriptions[topic]).forEach((socketId) => { - const socket = this.subscriptions[topic][socketId]; - debug('sending to websocket', socketId, topic, msg); - socket.send(msg); - }); -}; - -module.exports = WebsocketRelay; +exports.default = WebsocketRelay; +module.exports = exports['default']; \ No newline at end of file diff --git a/package.json b/package.json index af26e54..8dbabf6 100644 --- a/package.json +++ b/package.json @@ -1,13 +1,18 @@ { "name": "cnn-messaging", - "version": "2.0.0", + "version": "2.1.0", "description": "A module for message publishing and subscription", "main": "index.js", "scripts": { - "coverage": "istanbul cover _mocha -- --recursive test/ --timeout 10000", + "build": "babel src -d lib", + "docs": "documentation build src/** -f md > API.md", + "flow": "flow", + "flowcov": "flow coverage", + "flowtypes": "flow-typed install", + "coverage": "PINGINTERVAL=1000 istanbul cover _mocha -- --recursive test/ --timeout 10000", "lint": "eslint .", - "test": "_mocha --no-timeouts", - "ci": "npm run lint && npm run test", + "test": "PINGINTERVAL=1000 _mocha --no-timeouts", + "ci": "npm run lint && npm run flowtypes && npm run flow && npm run build && npm run test", "example": "DEBUG=cnn* PORT=3000 node example/server.js", "loadtest": "node example/loadserver.js" }, @@ -19,10 +24,18 @@ "author": "Ian Patton ", "license": "Apache-2.0", "devDependencies": { + "babel-cli": "^6.24.1", + "babel-eslint": "^7.2.3", + "babel-plugin-add-module-exports": "^0.2.1", + "babel-preset-env": "^1.4.0", + "babel-preset-flow": "^6.23.0", "chai": "^3.5.0", "coveralls": "^2.13.0", + "documentation": "^4.0.0-rc.1", "eslint": "^3.19.0", "express": "^4.15.2", + "flow-bin": "^0.46.0", + "flow-typed": "^2.1.2", "istanbul": "^0.4.5", "mocha": "^3.2.0", "sinon": "^2.1.0" @@ -33,8 +46,6 @@ "dependencies": { "amqplib": "^0.5.1", "debug": "^2.6.3", - "joi": "^10.4.1", - "lodash": "^4.17.4", "rxjs": "^5.3.0", "uuid": "^3.0.1", "uws": "^0.14.5" diff --git a/src/amqp.js b/src/amqp.js new file mode 100644 index 0000000..04f7557 --- /dev/null +++ b/src/amqp.js @@ -0,0 +1,174 @@ +// @flow + +import amqplib from 'amqplib'; +import Messenger from './messenger'; +import Message from './message'; +import Rx from 'rxjs'; +import Debug from 'debug'; +const debug = Debug('cnn-messaging:messenger:amqp'); + +/** +A messenger that can use amqp topic exchanges and queues +*/ +export default class AmqpMessenger extends Messenger { + params: { + connectionString: string; + exchangeName: string; + }; + channel: { + notification: any; + work: any; + }; + connection: any; + + /** + Create a new amqp messenger instance + */ + constructor(params: { + amqp: { + connectionString: string; + exchangeName: string; + }; + port: number; + }) { + super(params); + this.params = params.amqp; + if (!this.params.connectionString || !this.params.exchangeName) { + throw new Error('Not properly configured for AMQP. See the README.'); + } + } + + /** + start the service + */ + async start(): Promise<*> { + if (this.state !== this.states[0]) { + return Promise.reject(new Error(`Cannot start when in state: ${this.state}`)); + } + this.state = this.states[1]; + debug('starting'); + + const conn = await amqplib.connect(this.params.connectionString); + this.connection = conn; + debug('created connection'); + + this.channel = { + notification: await conn.createChannel(), + work: await conn.createChannel() + }; + this.channel.work.prefetch(1, true); + debug('created channels'); + + await this.channel.notification.assertExchange(this.params.exchangeName, 'topic', {durable: true}); + this.state = this.states[2]; + debug('started'); + + return Promise.resolve(); + } + + /** + stop the service + */ + async stop(): Promise<*> { + if (this.state !== this.states[2]) { + return Promise.reject(new Error(`Cannot stop when in state: ${this.state}`)); + } + this.state = this.states[3]; + debug('stopping'); + + await this.channel.work.close(); + await this.channel.notification.close(); + debug('closed channels'); + + await this.connection.close(); + debug('closed connection'); + + this.state = this.states[0]; + debug('stopped'); + + return Promise.resolve(); + } + + /** + publish a message to a topic + */ + async publish(topic: string, message: Message): Promise<*> { + debug(`publish to topic: ${topic}, message: ${JSON.stringify(message)}`); + if (!(message instanceof Message)) { + return Promise.reject(new Error('provided message is not an instance of Message')); + } + + return new Promise((resolve, reject) => { + if (this.channel.notification.publish(this.params.exchangeName, topic, message.toAmqp())) { + debug('amqp sent message'); + return resolve(); + } + return reject(new Error('Publish failure. Queue may be full.')); + }); + } + + /** + create an observable for a given topic, type, and queue + */ + async _createObservable(topic: string, type: string, queue: string): Promise> { + if (this.observables[type][topic]) { + return this.observables[type][topic]; + } + debug(`creating ${type} observable for topic: ${topic}`); + let queueparams = { + durable: false, + exclusive: true + }; + let noAck = true; + if (type === 'work') { + queueparams = { + durable: true, + exclusive: false + }; + noAck = false; + } + debug('using', type, 'params', queueparams, 'noAck', noAck); + const q = await this.channel[type].assertQueue(queue, queueparams); + this.subscriptions[type][topic] = q.queue; + await this.channel[type].bindQueue(q.queue, this.params.exchangeName, topic); + debug(`created ${type} subscription to topic: ${topic}, queue: ${this.subscriptions[type][topic]}`); + let consTag; + this.observables[type][topic] = new Rx.Observable.create((observer) => { + // start consuming from the amqp queue + this.channel[type].consume(this.subscriptions[type][topic], (msg) => { + observer.next(Message.fromAmqp(msg, this.channel[type])); + }, {noAck}) + .then((res) => { + consTag = res.consumerTag; + }); + + // return the function that handles unsubscribe here + return () => { + debug(`stop consuming from ${topic}`); + if (type !== 'work') { + // unbind the queue from the topic to stop routing at the amqp server + this.channel[type].unbindQueue(this.subscriptions[type][topic], this.params.exchangeName, topic); + } + this.channel[type].cancel(consTag); + debug(`stopped receiving new ${type} messages from ${topic}`); + delete this.subscriptions[type][topic]; + delete this.observables[type][topic]; + }; + }); + return this.observables[type][topic]; + } + + /** + create an observable for a given topic, that is meant for multiple recipients per message + */ + async createNotificationObservable(topic: string): Promise> { + return this._createObservable(topic, 'notification', ''); + } + + /** + create an observable for a given topic, that is meant for a single recipient per message + */ + async createWorkObservable(topic: string, queue: string): Promise> { + return this._createObservable(topic, 'work', queue); + } +} diff --git a/src/message.js b/src/message.js new file mode 100644 index 0000000..75db183 --- /dev/null +++ b/src/message.js @@ -0,0 +1,137 @@ +// @flow + +import uuidV1 from 'uuid/v1'; +import Debug from 'debug'; +const debug = Debug('cnn-messaging:message'); + +const defaults = { + systemId: 'unknownSystemId', + environment: 'unknownEnvironment', + model: 'unknownModel', + objectId: 'unknownObjectId', + action: 'unknownAction' +}; + +type MessageData = { + id?: string, + timestamp?: string, + context: { + systemId: string, + environment: string, + model: string, + objectId: string | number, + action: string, + objectVersion: string | number, + requestId?: string, + userId?: string + }, + event?: any +} + +/** +A Message object +*/ +export default class Message { + id: string; + timestamp: string; + context: { + systemId: string; + environment: string; + model: string; + objectId: string | number; + action: string; + objectVersion: string | number; + requestId?: string; + userId?: string; + }; + event: any; + meta: any; + + /** + create a new instance of Message + */ + constructor(message: MessageData) { + debug('new message', message); + message = message || {context: {}}; + this.context = message.context; + this.event = message.event; + this.id = (message.id || uuidV1()); + this.timestamp = (message.timestamp || (new Date()).toISOString()); + } + + /** + Stringify the message + */ + toString(): string { + const shadow = { + id: this.id, + timestamp: this.timestamp, + context: this.context, + event: this.event + }; + return JSON.stringify(shadow); + } + + /** + Convert the message for websocket delivery + */ + toWS(): string { + return this.toString(); + } + + /** + Convert the message for amqp delivery + */ + toAmqp(): Buffer { + return Buffer.from(this.toString()); + } + + /** + Get the preferred topic name from the message context + */ + getTopic(): string { + const topic = []; + const context = this.context || {}; + topic.push((context.systemId || defaults['systemId'])); + topic.push((context.environment || defaults['environment'])); + topic.push((context.model || defaults['model'])); + topic.push((context.objectId || defaults['objectId'])); + topic.push((context.action || defaults['action'])); + return topic.join('.'); + } + + /** + Ack a work message (mark it as completed) + */ + ack(): void { + if (this.meta && this.meta.rawMessage && this.meta.channel) { + debug('Ack message', this.meta.rawMessage); + this.meta.channel.ack(this.meta.rawMessage); + } + } + + /** + Nack a work message (mark it as failed, for redelivery) + */ + nack(): void { + if (this.meta && this.meta.rawMessage && this.meta.channel) { + debug('Nack message', this.meta.rawMessage); + this.meta.channel.nack(this.meta.rawMessage); + } + } + + /** + Convert a raw amqp message into an instance of Message + */ + static fromAmqp(rawMessage, channel): Message { + debug(`from amqp: ${JSON.stringify(rawMessage)}`); + const messageString = rawMessage.content.toString(); + const messageObject = JSON.parse(messageString); + const message = new Message(messageObject); + message.meta = { + rawMessage, + channel + }; + return message; + } +} diff --git a/src/messenger.js b/src/messenger.js new file mode 100644 index 0000000..c7f120e --- /dev/null +++ b/src/messenger.js @@ -0,0 +1,121 @@ +// @flow + +import events from 'events'; +import Rx from 'rxjs'; +import Message from './message'; +import WebsocketRelay from './websocket'; +import Debug from 'debug'; +const debug = Debug('cnn-messaging:messenger'); + +/** +An in-memory messenger, providing pub/sub like features +*/ +export default class Messenger extends events.EventEmitter { + state: string; + subscriptions: { + notification: Object; + work: Object; + } + observables: { + notification: Object; + work: Object; + } + states: Array; + websocketRelay: WebsocketRelay; + + /** + Create a new messenger instance + */ + constructor(params: {port: number}) { + super(); + params = params || {}; + this.states = [ + 'STOPPED', + 'STARTING', + 'STARTED', + 'STOPPING', + 'ERROR' + ]; + this.state = this.states[0]; + this.subscriptions = { + notification: {}, + work: {} + }; + this.observables = { + notification: {}, + work: {} + }; + if (params.port) { + const interval = (process.env.PINGINTERVAL && parseInt(process.env.PINGINTERVAL)) || 30000; + debug('got port, creating websocket relay with ping interval', interval); + this.websocketRelay = new WebsocketRelay({ + port: params.port, + messenger: this, + pingInterval: interval + }); + } + } + + /** + start the service + */ + async start(): Promise<*> { + return new Promise((resolve, reject) => { + if (this.state !== this.states[0]) { + return reject(new Error(`Cannot start when in state: ${this.state}`)); + } + this.state = this.states[1]; + debug('starting'); + + this.state = this.states[2]; + debug('started'); + + resolve(); + }); + } + + /** + stop the service + */ + async stop(): Promise<*> { + return new Promise((resolve, reject) => { + if (this.state !== this.states[2]) { + return reject(new Error(`Cannot stop when in state: ${this.state}`)); + } + this.state = this.states[3]; + debug('stopping'); + + this.state = this.states[0]; + debug('stopped'); + + resolve(); + }); + } + + /** + publish a message to a topic + */ + async publish(topic: string, message: Message): Promise<*> { + debug(`publish to topic: ${topic}, message: ${JSON.stringify(message)}`); + if (!(message instanceof Message)) { + return Promise.reject(new Error('provided message is not an instance of Message')); + } + return Promise.resolve(); + } + + /** + create an observable for a given topic, that is meant for multiple recipients per message + */ + async createNotificationObservable(topic: string): Promise> { + debug(`creating observable for topic: ${topic}`); + return Promise.resolve(new Rx.Subject()); + } + + /** + create an observable for a given topic, that is meant for a single recipient per message + */ + async createWorkObservable(topic: string, sharedQueue: string): Promise> { + debug(`creating observable for: ${sharedQueue} to topic: ${topic}`); + return Promise.resolve(new Rx.Subject()); + } +} diff --git a/src/websocket.js b/src/websocket.js new file mode 100644 index 0000000..00bc21b --- /dev/null +++ b/src/websocket.js @@ -0,0 +1,153 @@ +// @flow + +import WebSocket from 'uws'; +import Messenger from './messenger'; +import Debug from 'debug'; +const debug = Debug('cnn-messaging:messenger:websocket'); + +/** +A performant websocket relay for messenger +*/ +export default class WebsocketRelay { + io: WebSocket.Server; + messenger: Messenger; + connectionCount: number; + connections: number; + observables: Object; + subscriptions: Object; + pingInterval: number; + pingService: number; + /** + create a new instance of websocket relay + */ + constructor(params: {messenger: Messenger, port: number, pingInterval: number}) { + params = params || {}; + if (!params.messenger || !params.port) { + throw new Error('You must provide an instance of a messenger and a port for web socket server'); + } + this.io = new WebSocket.Server({ + perMessageDeflate: false, + port: params.port + }); + this.messenger = params.messenger; + this.messenger.websocketRelay = this; + this.connectionCount = 0; + this.connections = 0; + this.observables = {}; + this.subscriptions = {}; + this.pingInterval = params.pingInterval; + + this.io.on('connection', (socket) => { + this.handleSocketConnection(socket); + }); + + this.pingService = setInterval(() => { + this.sendPing(); + }, this.pingInterval); + // $FlowFixMe (flow does not understand the next line) + this.pingService.unref(); // allows graceful shutdown + } + + sendPing(): void { + this.io.clients.forEach((ws) => { + if (ws.isAlive === false) { + return ws.terminate(); + } + + ws.isAlive = false; + ws.ping('', false, true); + }); + } + + handleSocketConnection(socket: Object): void { + this.connectionCount++; + this.connections++; + + socket.id = this.connectionCount; + debug(`socket ${socket.id} connected`); + + socket.isAlive = true; + socket.on('pong', () => { + socket.isAlive = true; + }); + + socket.on('message', (msg) => { + this.handleSocketMessage(socket, msg); + }); + + socket.on('close', () => { + this.handleSocketClose(socket); + }); + } + + handleSocketMessage(socket: Object, msg: string): void { + let request; + try { + request = JSON.parse(msg); + } catch (e) { + debug(`Error parsing request ${msg}`); + return; + } + + switch (request.action) { + case 'subscribe': + this.subscribe(request.topic, socket); + break; + case 'unsubscribe': + this.unsubscribe(request.topic, socket.id); + break; + default: + debug(`Got unknown request action: ${request.action}`); + } + } + + subscribe(topic: string, socket: Object): void { + debug(`got subscribe request for ${topic}`); + if (!this.observables[topic]) { + this.messenger.createNotificationObservable(topic) + .then((o) => { + this.observables[topic] = o.subscribe((message) => { + this.sendToTopic(topic, message.toWS()); + }, (err) => { + debug(err); + }, () => { + debug('observable ended'); + }); + }); + } + if (!this.subscriptions[topic]) { + this.subscriptions[topic] = {}; + } + this.subscriptions[topic][socket.id] = socket; + } + + unsubscribe(topic: string, socketId: string): void { + if (this.subscriptions[topic][socketId]) { + delete this.subscriptions[topic][socketId]; + if (!Object.keys(this.subscriptions[topic]).length) { + delete this.subscriptions[topic]; + } + } + if (!this.subscriptions[topic] && this.observables[topic]) { + debug(`closing observable for ${topic}`); + this.observables[topic].unsubscribe(); + delete this.observables[topic]; + } + } + + handleSocketClose(socket: Object): void { + this.connections--; + debug(`socket ${socket.id} disconnected`); + Object.keys(this.subscriptions).forEach((topic) => { + this.unsubscribe(topic, socket.id); + }); + } + + sendToTopic(topic: string, msg: string): void { + Object.keys(this.subscriptions[topic]).forEach((socketId) => { + const socket = this.subscriptions[topic][socketId]; + debug('sending to websocket', socketId, topic, msg); + socket.send(msg); + }); + } +} diff --git a/test/index.js b/test/index.js index 307c7ab..7f5c050 100644 --- a/test/index.js +++ b/test/index.js @@ -66,11 +66,11 @@ describe('Basic Functionality', function () { }); }); it('should publish instance of Message', function () { - const publisher = Messenger(amqpTestConfig); + const publisher = new Messenger(amqpTestConfig); return publisher.publish('test.message', new Message()); }); it('should not publish otherwise', function () { - const publisher = Messenger(amqpTestConfig); + const publisher = new Messenger(amqpTestConfig); return publisher.publish('test.message', 'blah') .then(() => { return Promise.reject(new Error('This should fail')); @@ -80,9 +80,17 @@ describe('Basic Functionality', function () { }); }); +describe('Message', function () { + it('should provide a getTopic method', function () { + const msg = new Message({event: {blah: 1}}); + const topic = msg.getTopic(); + topic.should.exist; + }); +}); + describe('AmqpMessenger', function () { it('should start and stop', function () { - const messenger = AmqpMessenger(amqpTestConfig); + const messenger = new AmqpMessenger(amqpTestConfig); return messenger.start() .then(() => { return messenger.stop(); @@ -90,9 +98,9 @@ describe('AmqpMessenger', function () { }); it('multiple notification subscribers should get a notification', function () { - const publisher = AmqpMessenger(amqpTestConfig); - const subscriber1 = AmqpMessenger(amqpTestConfig); - const subscriber2 = AmqpMessenger(amqpTestConfig); + const publisher = new AmqpMessenger(amqpTestConfig); + const subscriber1 = new AmqpMessenger(amqpTestConfig); + const subscriber2 = new AmqpMessenger(amqpTestConfig); let observable1; let observable2; return Promise.all([publisher.start(), subscriber1.start(), subscriber2.start()]) @@ -110,7 +118,7 @@ describe('AmqpMessenger', function () { text: 'test' } }; - return publisher.publish('test.message', Message(message)); + return publisher.publish('test.message', new Message(message)); }) .then(() => { let messageCount = 0; @@ -136,9 +144,9 @@ describe('AmqpMessenger', function () { }); it('only a single work subscriber should get work', function () { - const publisher = AmqpMessenger(amqpTestConfig); - const subscriber1 = AmqpMessenger(amqpTestConfig); - const subscriber2 = AmqpMessenger(amqpTestConfig); + const publisher = new AmqpMessenger(amqpTestConfig); + const subscriber1 = new AmqpMessenger(amqpTestConfig); + const subscriber2 = new AmqpMessenger(amqpTestConfig); let observable1; let observable2; return Promise.all([publisher.start(), subscriber1.start(), subscriber2.start()]) @@ -156,7 +164,7 @@ describe('AmqpMessenger', function () { text: 'test' } }; - return publisher.publish('work.message', Message(message)); + return publisher.publish('work.message', new Message(message)); }) .then(() => { let messageCount = 0; @@ -266,4 +274,36 @@ describe('WebsocketRelay', function () { }); }); }); + + it('should ignore unknown messages', function () { + return new Promise((resolve, reject) => { + const WebSocket = require('uws'); + const ws = new WebSocket('ws://localhost:13000/', { + perMessageDeflate: false + }); + ws.on('open', () => { + ws.send(JSON.stringify({action: 'blah', topic: 'test.message2.*'})); + }); + setTimeout(() => { + resolve(); + }, 1000); + ws.on('message', () => { + ws.close(); + reject(); + }); + }); + }); + + it('should send ping messages', function () { + return new Promise((resolve) => { + const WebSocket = require('uws'); + const ws = new WebSocket('ws://localhost:13000/', { + perMessageDeflate: false + }); + + ws.on('ping', () => { + resolve(); + }); + }); + }); });