@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 CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knocklabs/node",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "description": "Library for interacting with the Knock API",
5
5
  "homepage": "https://github.com/knocklabs/knock-node",
6
6
  "author": "@knocklabs",
@@ -69,18 +69,30 @@ class FetchClient {
69
69
  }
70
70
  buildUrl(path, params) {
71
71
  const url = new URL(this.config.baseURL + path);
72
- if (params) {
73
- Object.entries(params).forEach(([key, value]) => {
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
- if (Array.isArray(value)) {
77
- for (const val of value) {
78
- url.searchParams.append(`${key}[]`, val);
79
- }
80
- }
81
- else {
82
- url.searchParams.append(key, value);
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;
@@ -1,5 +1,5 @@
1
1
  export declare enum Grants {
2
- SlackChannelsRead = "slack_channels/read",
2
+ SlackChannelsRead = "slack/channels_read",
3
3
  ChannelDataRead = "channel_data/read",
4
4
  ChannelDataWrite = "channel_data/write"
5
5
  }
@@ -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"] = "slack_channels/read";
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 = {}));
@@ -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; } });
@@ -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": { "slack_channels/read": [] } }
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
+ };
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@knocklabs/node",
3
- "version": "0.6.3",
3
+ "version": "0.6.5",
4
4
  "description": "Library for interacting with the Knock API",
5
5
  "homepage": "https://github.com/knocklabs/knock-node",
6
6
  "author": "@knocklabs",