diff --git a/.github/maintainers_guide.md b/.github/maintainers_guide.md
index 77647d334..296b78086 100644
--- a/.github/maintainers_guide.md
+++ b/.github/maintainers_guide.md
@@ -33,7 +33,8 @@ script. These two commands should be run each time an API changes to keep the do
### Releasing
0. Update generated content
- * Reference docs are updated using `npm run docs:jsdoc`, `npm run docs`
+ * Reference docs are updated using `npm run docs:jsdoc`, delete the `@property` tagged method aliases from
+ `support/jsdoc/@slack-client.js`, then `npm run docs`
1. Create the commit for the release:
* Bump the version number in adherence to [Semantic Versioning](http://semver.org/) in `package.json`.
diff --git a/docs/_posts/2018-03-23-v4.1.0.md b/docs/_posts/2018-03-23-v4.1.0.md
new file mode 100644
index 000000000..ccb5033f2
--- /dev/null
+++ b/docs/_posts/2018-03-23-v4.1.0.md
@@ -0,0 +1,12 @@
+---
+layout: changelog
+---
+
+- `IncomingWebhook.send()` works with both callbacks and Promises (#508) - thanks @clavin
+- Completes type defintions for all `WebClient` method arguments (#512) - thanks @clavin
+- Allows `files.upload` to work with Buffers (in addition to ReadableStreams) (#500) - thanks @KharitonOff
+- Allows any WebClient methods argument to work with binary types (#519) - thanks @clavin and @aoberoi
+- Fails when `WebClient.apiCall()` options don't look like the right type (#522) - thanks @aoberoi
+- Fixes TypeScript compile errors in node >=6 <=8 related to `callbackify` (#518) - thanks @aoberoi
+- Fixes mismatched parenthesis in RTMClient usage example documentation (#511) - thanks @parthsr
+- Adds `examples` directory back to the repository (#520) - thanks @aoberoi
diff --git a/docs/_reference/IncomingWebhook.md b/docs/_reference/IncomingWebhook.md
index 8587d03ee..305f90fe7 100644
--- a/docs/_reference/IncomingWebhook.md
+++ b/docs/_reference/IncomingWebhook.md
@@ -6,9 +6,15 @@ permalink: /reference/IncomingWebhook
A client for Slack's Incoming Webhooks
**Kind**: static class of [@slack/client
](#module_@slack/client)
+
+* [.IncomingWebhook](#module_@slack/client.IncomingWebhook)
+ * [.send(message)](#module_@slack/client.IncomingWebhook+send) ⇒ Promise.<module:@slack/client/dist/IncomingWebhook.IncomingWebhookResult>
+ * [.send(message, callback)](#module_@slack/client.IncomingWebhook+send)
+ * [.send(message, callback)](#module_@slack/client.IncomingWebhook+send)
+
-### incomingWebhook.send(message, callback)
+### incomingWebhook.send(message) ⇒ Promise.<module:@slack/client/dist/IncomingWebhook.IncomingWebhookResult>
Send a notification to a conversation
**Kind**: instance method of [IncomingWebhook
](#module_@slack/client.IncomingWebhook)
@@ -16,5 +22,24 @@ Send a notification to a conversation
| Param | Type | Description |
| --- | --- | --- |
| message | string
\| [IncomingWebhookSendArguments
](#module_@slack/client.IncomingWebhookSendArguments) | the message (a simple string, or an object describing the message) |
-| callback | [IncomingWebhookResultCallback
](#module_@slack/client.IncomingWebhookResultCallback) | |
+
+
+
+### incomingWebhook.send(message, callback)
+**Kind**: instance method of [IncomingWebhook
](#module_@slack/client.IncomingWebhook)
+
+| Param | Type |
+| --- | --- |
+| message | string
\| [IncomingWebhookSendArguments
](#module_@slack/client.IncomingWebhookSendArguments) |
+| callback | [IncomingWebhookResultCallback
](#module_@slack/client.IncomingWebhookResultCallback) |
+
+
+
+### incomingWebhook.send(message, callback)
+**Kind**: instance method of [IncomingWebhook
](#module_@slack/client.IncomingWebhook)
+
+| Param | Type |
+| --- | --- |
+| message | string
\| [IncomingWebhookSendArguments
](#module_@slack/client.IncomingWebhookSendArguments) |
+| callback | [IncomingWebhookResultCallback
](#module_@slack/client.IncomingWebhookResultCallback) |
diff --git a/docs/_reference/RTMClient.md b/docs/_reference/RTMClient.md
index ab07aaf56..1c7c94fe2 100644
--- a/docs/_reference/RTMClient.md
+++ b/docs/_reference/RTMClient.md
@@ -155,7 +155,7 @@ be sent or received.
| Param | Type |
| --- | --- |
-| options | module:@slack/client/dist/methods.TokenOverridable
\| module:@slack/client/dist/methods.TokenOverridable
|
+| options | module:@slack/client/dist/methods.TokenOverridable
\| module:@slack/client/dist/methods.LocaleAware
\| module:@slack/client/dist/methods.__type
\| module:@slack/client/dist/methods.TokenOverridable
\| module:@slack/client/dist/methods.__type
|
diff --git a/package.json b/package.json
index f01ad26fe..14de9e3ab 100644
--- a/package.json
+++ b/package.json
@@ -1,6 +1,6 @@
{
"name": "@slack/client",
- "version": "4.0.1",
+ "version": "4.1.0",
"description": "Slack Developer Kit - official clients for the Web API, RTM API, and Incoming Webhooks",
"author": "Slack Technologies, Inc.",
"license": "MIT",
diff --git a/support/jsdoc/@slack-client-dist-IncomingWebhook.js b/support/jsdoc/@slack-client-dist-IncomingWebhook.js
new file mode 100644
index 000000000..2a90acb00
--- /dev/null
+++ b/support/jsdoc/@slack-client-dist-IncomingWebhook.js
@@ -0,0 +1,38 @@
+/**
+ * @module @slack/client/dist/IncomingWebhook
+ */
+
+/**
+ * @interface module:@slack/client/dist/IncomingWebhook.IncomingWebhookHTTPError
+ * @extends module:@slack/client.CodedError
+ * @property {"slackclient_incomingwebhook_http_error"} code
+ * @property {Error} original
+ */
+export class IncomingWebhookHTTPError {
+}
+
+/**
+ * @interface module:@slack/client/dist/IncomingWebhook.IncomingWebhookReadError
+ * @extends module:@slack/client.CodedError
+ * @property {"slackclient_incomingwebhook_read_error"} code
+ * @property {Error} original
+ */
+export class IncomingWebhookReadError {
+}
+
+/**
+ * @interface module:@slack/client/dist/IncomingWebhook.IncomingWebhookRequestError
+ * @extends module:@slack/client.CodedError
+ * @property {"slackclient_incomingwebhook_request_error"} code
+ * @property {Error} original
+ */
+export class IncomingWebhookRequestError {
+}
+
+/**
+ * @interface module:@slack/client/dist/IncomingWebhook.IncomingWebhookResult
+ * @property {string} text
+ */
+export class IncomingWebhookResult {
+}
+
diff --git a/support/jsdoc/@slack-client-dist-methods.js b/support/jsdoc/@slack-client-dist-methods.js
index 81a422971..00ca0e0b1 100644
--- a/support/jsdoc/@slack-client-dist-methods.js
+++ b/support/jsdoc/@slack-client-dist-methods.js
@@ -16,6 +16,16 @@ export class AuxiliaryArguments {
export class CursorPaginationEnabled {
}
+/**
+ * @interface module:@slack/client/dist/methods.Dialog
+ * @property {string} title
+ * @property {string} callback_id
+ * @property {Array} elements
+ * @property {string} [submit_label]
+ */
+export class Dialog {
+}
+
/**
* @interface module:@slack/client/dist/methods.LinkUnfurls
*/
diff --git a/support/jsdoc/@slack-client.js b/support/jsdoc/@slack-client.js
index eded26636..66ac330b4 100644
--- a/support/jsdoc/@slack-client.js
+++ b/support/jsdoc/@slack-client.js
@@ -18,6 +18,9 @@
* @property KeepAliveConfigError
* @property KeepAliveClientNotConnected
* @property KeepAliveInconsistentState
+ * @property IncomingWebhookRequestError
+ * @property IncomingWebhookReadError
+ * @property IncomingWebhookHTTPError
*/
export var ErrorCode
/**
@@ -46,6 +49,20 @@ export class IncomingWebhook {
/**
* Send a notification to a conversation
* @param {string | module:@slack/client.IncomingWebhookSendArguments} message the message (a simple string, or an object describing the message)
+ * @function module:@slack/client.IncomingWebhook#send
+ * @returns {Promise}
+ */
+ send() {}
+
+ /**
+ * @param {string | module:@slack/client.IncomingWebhookSendArguments} message
+ * @param {module:@slack/client.IncomingWebhookResultCallback} callback
+ * @function module:@slack/client.IncomingWebhook#send
+ */
+ send() {}
+
+ /**
+ * @param {string | module:@slack/client.IncomingWebhookSendArguments} message
* @param {module:@slack/client.IncomingWebhookResultCallback} callback
* @function module:@slack/client.IncomingWebhook#send
*/
@@ -215,7 +232,7 @@ Promise.
/**
* Begin an RTM session using the provided options. This method must be called before any messages can
* be sent or received.
- * @param {module:@slack/client/dist/methods.TokenOverridable | module:@slack/client/dist/methods.TokenOverridable} options
+ * @param {module:@slack/client/dist/methods.TokenOverridable | module:@slack/client/dist/methods.LocaleAware | module:@slack/client/dist/methods.__type | module:@slack/client/dist/methods.TokenOverridable | module:@slack/client/dist/methods.__type} options
* @function module:@slack/client.RTMClient#start
*/
start() {}