@knocklabs/node 0.6.3 → 0.6.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/package.json +1 -1
- package/dist/src/common/fetchClient.js +22 -10
- package/dist/src/common/userTokens.d.ts +1 -1
- package/dist/src/common/userTokens.js +1 -1
- package/dist/src/index.d.ts +1 -0
- package/dist/src/index.js +1 -0
- package/dist/src/knock.d.ts +2 -0
- package/dist/src/knock.js +3 -1
- package/dist/src/resources/slack/index.d.ts +9 -0
- package/dist/src/resources/slack/index.js +75 -0
- package/dist/src/resources/slack/interfaces.d.ts +30 -0
- package/dist/src/resources/slack/interfaces.js +2 -0
- package/package.json +1 -1
package/dist/package.json
CHANGED
|
@@ -69,18 +69,30 @@ class FetchClient {
|
|
|
69
69
|
}
|
|
70
70
|
buildUrl(path, params) {
|
|
71
71
|
const url = new URL(this.config.baseURL + path);
|
|
72
|
-
|
|
73
|
-
|
|
72
|
+
function appendParams(key, value, parentKey) {
|
|
73
|
+
const fullKey = parentKey ? `${parentKey}[${key}]` : key;
|
|
74
|
+
if (typeof value === "object" &&
|
|
75
|
+
value !== null &&
|
|
76
|
+
!(value instanceof Date) &&
|
|
77
|
+
!(value instanceof Array)) {
|
|
78
|
+
// If value is an object, recurse
|
|
79
|
+
Object.entries(value).forEach(([nestedKey, nestedValue]) => {
|
|
80
|
+
appendParams(nestedKey, nestedValue, fullKey);
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
else if (Array.isArray(value)) {
|
|
74
84
|
// Send array values as individual values instead of a comma separated list
|
|
75
85
|
// e.g. key[]=1&key[]=2&key[]=3 instead of key=1,2,3
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
86
|
+
value.forEach((val) => url.searchParams.append(`${fullKey}[]`, val));
|
|
87
|
+
}
|
|
88
|
+
else {
|
|
89
|
+
// For primitive values, simply append them
|
|
90
|
+
url.searchParams.append(fullKey, value);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
if (params) {
|
|
94
|
+
Object.entries(params).forEach(([key, value]) => {
|
|
95
|
+
appendParams(key, value);
|
|
84
96
|
});
|
|
85
97
|
}
|
|
86
98
|
return url;
|
|
@@ -3,7 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.Grants = void 0;
|
|
4
4
|
var Grants;
|
|
5
5
|
(function (Grants) {
|
|
6
|
-
Grants["SlackChannelsRead"] = "
|
|
6
|
+
Grants["SlackChannelsRead"] = "slack/channels_read";
|
|
7
7
|
Grants["ChannelDataRead"] = "channel_data/read";
|
|
8
8
|
Grants["ChannelDataWrite"] = "channel_data/write";
|
|
9
9
|
})(Grants || (exports.Grants = Grants = {}));
|
package/dist/src/index.d.ts
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
export * from "./resources/workflows/interfaces";
|
|
2
2
|
export * from "./resources/users/interfaces";
|
|
3
3
|
export * from "./resources/preferences/interfaces";
|
|
4
|
+
export * from "./resources/slack/interfaces";
|
|
4
5
|
export * from "./common/interfaces";
|
|
5
6
|
export { Knock } from "./knock";
|
package/dist/src/index.js
CHANGED
|
@@ -18,6 +18,7 @@ exports.Knock = void 0;
|
|
|
18
18
|
__exportStar(require("./resources/workflows/interfaces"), exports);
|
|
19
19
|
__exportStar(require("./resources/users/interfaces"), exports);
|
|
20
20
|
__exportStar(require("./resources/preferences/interfaces"), exports);
|
|
21
|
+
__exportStar(require("./resources/slack/interfaces"), exports);
|
|
21
22
|
__exportStar(require("./common/interfaces"), exports);
|
|
22
23
|
var knock_1 = require("./knock");
|
|
23
24
|
Object.defineProperty(exports, "Knock", { enumerable: true, get: function () { return knock_1.Knock; } });
|
package/dist/src/knock.d.ts
CHANGED
|
@@ -8,6 +8,7 @@ import { Messages } from "./resources/messages";
|
|
|
8
8
|
import { Tenants } from "./resources/tenants";
|
|
9
9
|
import { FetchResponse } from "./common/fetchClient";
|
|
10
10
|
import { TokenEntity, TokenGrant, TokenGrantOptions } from "./common/userTokens";
|
|
11
|
+
import { Slack } from "./resources/slack";
|
|
11
12
|
declare class Knock {
|
|
12
13
|
readonly key?: string | undefined;
|
|
13
14
|
readonly options: KnockOptions;
|
|
@@ -19,6 +20,7 @@ declare class Knock {
|
|
|
19
20
|
readonly objects: Objects;
|
|
20
21
|
readonly messages: Messages;
|
|
21
22
|
readonly tenants: Tenants;
|
|
23
|
+
readonly slack: Slack;
|
|
22
24
|
constructor(key?: string | undefined, options?: KnockOptions);
|
|
23
25
|
notify(workflowKey: string, properties: TriggerWorkflowProperties, options?: MethodOptions): Promise<import("./resources/workflows/interfaces").WorkflowRun>;
|
|
24
26
|
/**
|
package/dist/src/knock.js
CHANGED
|
@@ -23,6 +23,7 @@ const objects_1 = require("./resources/objects");
|
|
|
23
23
|
const messages_1 = require("./resources/messages");
|
|
24
24
|
const tenants_1 = require("./resources/tenants");
|
|
25
25
|
const fetchClient_1 = __importDefault(require("./common/fetchClient"));
|
|
26
|
+
const slack_1 = require("./resources/slack");
|
|
26
27
|
const DEFAULT_HOSTNAME = "https://api.knock.app";
|
|
27
28
|
class Knock {
|
|
28
29
|
constructor(key, options = {}) {
|
|
@@ -35,6 +36,7 @@ class Knock {
|
|
|
35
36
|
this.objects = new objects_1.Objects(this);
|
|
36
37
|
this.messages = new messages_1.Messages(this);
|
|
37
38
|
this.tenants = new tenants_1.Tenants(this);
|
|
39
|
+
this.slack = new slack_1.Slack(this);
|
|
38
40
|
if (!key) {
|
|
39
41
|
this.key = process.env.KNOCK_API_KEY;
|
|
40
42
|
if (!this.key) {
|
|
@@ -221,7 +223,7 @@ function maybePrepareUserTokenGrants(grants) {
|
|
|
221
223
|
if (!grants)
|
|
222
224
|
return undefined;
|
|
223
225
|
// Given a list of token grants, flattens them into a single object
|
|
224
|
-
// like: { "entity": { "
|
|
226
|
+
// like: { "entity": { "slack/channels_read": [] } }
|
|
225
227
|
return grants.reduce((acc, grant) => {
|
|
226
228
|
if (acc[grant.entity]) {
|
|
227
229
|
const currentGrants = acc[grant.entity];
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { Knock } from "../../knock";
|
|
2
|
+
import { AuthCheckInput, GetSlackChannelsInput, PaginatedSlackChannelResponse, RevokeAccessTokenInput } from "./interfaces";
|
|
3
|
+
export declare class Slack {
|
|
4
|
+
readonly knock: Knock;
|
|
5
|
+
constructor(knock: Knock);
|
|
6
|
+
getChannels(input: GetSlackChannelsInput): Promise<PaginatedSlackChannelResponse>;
|
|
7
|
+
authCheck({ tenant, knockChannelId }: AuthCheckInput): Promise<any>;
|
|
8
|
+
revokeAccessToken({ tenant, knockChannelId }: RevokeAccessTokenInput): Promise<any>;
|
|
9
|
+
}
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.Slack = void 0;
|
|
13
|
+
const TENANT_COLLECTION = "$tenants";
|
|
14
|
+
function removeNullKeys(obj) {
|
|
15
|
+
Object.keys(obj).forEach((key) => {
|
|
16
|
+
if (obj[key] === null) {
|
|
17
|
+
delete obj[key];
|
|
18
|
+
}
|
|
19
|
+
});
|
|
20
|
+
return obj;
|
|
21
|
+
}
|
|
22
|
+
class Slack {
|
|
23
|
+
constructor(knock) {
|
|
24
|
+
this.knock = knock;
|
|
25
|
+
}
|
|
26
|
+
getChannels(input) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
const { knockChannelId, tenant } = input;
|
|
29
|
+
const queryOptions = input.queryOptions || {};
|
|
30
|
+
const params = {
|
|
31
|
+
access_token_object: {
|
|
32
|
+
object_id: tenant,
|
|
33
|
+
collection: TENANT_COLLECTION,
|
|
34
|
+
},
|
|
35
|
+
channel_id: knockChannelId,
|
|
36
|
+
query_options: removeNullKeys({
|
|
37
|
+
cursor: queryOptions.cursor || null,
|
|
38
|
+
limit: queryOptions.limit || null,
|
|
39
|
+
exclude_archived: queryOptions.excludeArchived || null,
|
|
40
|
+
team_id: queryOptions.teamId || null,
|
|
41
|
+
types: queryOptions.types || null,
|
|
42
|
+
}),
|
|
43
|
+
};
|
|
44
|
+
const { data } = yield this.knock.get(`/v1/providers/slack/${knockChannelId}/channels`, params);
|
|
45
|
+
return data;
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
authCheck({ tenant, knockChannelId }) {
|
|
49
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
50
|
+
const params = {
|
|
51
|
+
access_token_object: {
|
|
52
|
+
object_id: tenant,
|
|
53
|
+
collection: TENANT_COLLECTION,
|
|
54
|
+
},
|
|
55
|
+
channel_id: knockChannelId,
|
|
56
|
+
};
|
|
57
|
+
const { data } = yield this.knock.get(`/v1/providers/slack/${knockChannelId}/auth_check`, params);
|
|
58
|
+
return data;
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
revokeAccessToken({ tenant, knockChannelId }) {
|
|
62
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
63
|
+
const params = {
|
|
64
|
+
access_token_object: {
|
|
65
|
+
object_id: tenant,
|
|
66
|
+
collection: TENANT_COLLECTION,
|
|
67
|
+
},
|
|
68
|
+
channel_id: knockChannelId,
|
|
69
|
+
};
|
|
70
|
+
const { data } = yield this.knock.get(`/v1/providers/slack/${knockChannelId}/revoke_access`, params);
|
|
71
|
+
return data;
|
|
72
|
+
});
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
exports.Slack = Slack;
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
export type GetSlackChannelsInput = {
|
|
2
|
+
tenant: string;
|
|
3
|
+
knockChannelId: string;
|
|
4
|
+
queryOptions?: {
|
|
5
|
+
limit?: number;
|
|
6
|
+
cursor?: string;
|
|
7
|
+
excludeArchived?: boolean;
|
|
8
|
+
teamId?: string;
|
|
9
|
+
types?: string;
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
export type SlackChannel = {
|
|
13
|
+
name: string;
|
|
14
|
+
id: string;
|
|
15
|
+
is_private: boolean;
|
|
16
|
+
is_im: boolean;
|
|
17
|
+
context_team_id: boolean;
|
|
18
|
+
};
|
|
19
|
+
export type PaginatedSlackChannelResponse = {
|
|
20
|
+
slack_channels: SlackChannel[];
|
|
21
|
+
next_cursor: string;
|
|
22
|
+
};
|
|
23
|
+
export type AuthCheckInput = {
|
|
24
|
+
tenant: string;
|
|
25
|
+
knockChannelId: string;
|
|
26
|
+
};
|
|
27
|
+
export type RevokeAccessTokenInput = {
|
|
28
|
+
tenant: string;
|
|
29
|
+
knockChannelId: string;
|
|
30
|
+
};
|