@slates/provider-handler 1.0.0-rc.35 → 1.0.0-rc.37

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/index.cjs CHANGED
@@ -113,6 +113,7 @@ var mapAuthMethod = (slate, m) => ({
113
113
  description: s.description
114
114
  })) : void 0,
115
115
  adapters: "adapters" in m ? m.adapters : void 0,
116
+ ..."syncTokensAcrossConnections" in m && m.syncTokensAcrossConnections ? { syncTokensAcrossConnections: true } : {},
116
117
  inputSchema: toJsonSchema(m.inputSchema ?? import_zod.default.object({})),
117
118
  outputSchema: toJsonSchema(slate.spec.auth.outputSchema),
118
119
  capabilities: {
@@ -128,14 +129,14 @@ var mapAuthMethod = (slate, m) => ({
128
129
  docs: m.docs ?? []
129
130
  });
130
131
  var getAction = (slate, actionId) => {
131
- let action = slate.actions.find((m) => m.key === actionId);
132
+ let action = (slate.actions ?? []).find((m) => m.key === actionId);
132
133
  if (!action) {
133
134
  throw new import_error2.ServiceError((0, import_error2.notFoundError)(`action`, actionId));
134
135
  }
135
136
  return action;
136
137
  };
137
138
  var getAdapter = (slate, adapterId) => {
138
- let adapter = slate.adapters.find((m) => m.id === adapterId);
139
+ let adapter = (slate.adapters ?? []).find((m) => m.id === adapterId);
139
140
  if (!adapter) {
140
141
  throw new import_error2.ServiceError((0, import_error2.notFoundError)(`adapter`, adapterId));
141
142
  }
@@ -144,7 +145,7 @@ var getAdapter = (slate, adapterId) => {
144
145
  var mapAdapter = (adapter) => ({
145
146
  id: adapter.id,
146
147
  name: adapter.name,
147
- capabilities: adapter.capabilities
148
+ capabilities: adapter.capabilities ?? []
148
149
  });
149
150
  var getActionWithType = (slate, type, actionId) => {
150
151
  let action = getAction(slate, actionId);
@@ -196,7 +197,7 @@ var getMappableAction = (slate, actionId) => {
196
197
  }
197
198
  return action;
198
199
  };
199
- var getExposedActions = (slate, includeAdapterActions) => slate.actions.filter(
200
+ var getExposedActions = (slate, includeAdapterActions) => (slate.actions ?? []).filter(
200
201
  (action) => isMappableTrigger(action) && (includeAdapterActions || !action.adapter)
201
202
  );
202
203
  var getExposedAction = (slate, actionId, includeAdapterActions) => {
@@ -207,13 +208,13 @@ var getExposedAction = (slate, actionId, includeAdapterActions) => {
207
208
  return action;
208
209
  };
209
210
  var getTriggerGroup = (slate, triggerGroupId) => {
210
- let group = slate.triggerGroups.find((g) => g.key === triggerGroupId);
211
+ let group = (slate.triggerGroups ?? []).find((g) => g.key === triggerGroupId);
211
212
  if (!group) {
212
213
  throw new import_error2.ServiceError((0, import_error2.notFoundError)(`trigger_group`, triggerGroupId));
213
214
  }
214
215
  return group;
215
216
  };
216
- var getTriggersForGroup = (slate, triggerGroupId) => slate.actions.filter(
217
+ var getTriggersForGroup = (slate, triggerGroupId) => (slate.actions ?? []).filter(
217
218
  (action) => action.type === "trigger" && action.triggerGroup?.key === triggerGroupId
218
219
  );
219
220
  var getExposedTriggerGroups = (slate, includeAdapterActions) => {
@@ -222,7 +223,7 @@ var getExposedTriggerGroups = (slate, includeAdapterActions) => {
222
223
  (action) => action.type === "trigger" && action.triggerGroup ? [action.triggerGroup.key] : []
223
224
  )
224
225
  );
225
- return slate.triggerGroups.filter((group) => triggerGroupIds.has(group.key));
226
+ return (slate.triggerGroups ?? []).filter((group) => triggerGroupIds.has(group.key));
226
227
  };
227
228
  var evaluateTriggerMatches = (slate, triggerGroupId, payload) => getTriggersForGroup(slate, triggerGroupId).filter((trigger) => trigger.matches(payload)).map((trigger) => trigger.key);
228
229
  var getWebhookAutoRegistration = (group) => {
@@ -1014,7 +1015,7 @@ var createProviderHandler = (slate, listeners) => (0, import_proto.createSlatesP
1014
1015
  manager.onRequest("slates/adapters.list", async () => {
1015
1016
  getContextBasic();
1016
1017
  return {
1017
- adapters: supportsAdapters() ? slate.adapters.map(mapAdapter) : []
1018
+ adapters: supportsAdapters() ? (slate.adapters ?? []).map(mapAdapter) : []
1018
1019
  };
1019
1020
  });
1020
1021
  manager.onRequest("slates/adapter.get", async ({ params }) => {
@@ -1401,7 +1402,8 @@ var createProviderHandler = (slate, listeners) => (0, import_proto.createSlatesP
1401
1402
  },
1402
1403
  onSuccess: (result) => ({
1403
1404
  eventCount: result.events.length,
1404
- hasResponse: result.response !== void 0
1405
+ hasResponse: result.response !== void 0,
1406
+ skipped: !!result.skipped
1405
1407
  })
1406
1408
  },
1407
1409
  () => (0, import_provider2.runWithContext)(context, () => group.webhook.process(context))
@@ -1423,7 +1425,8 @@ var createProviderHandler = (slate, listeners) => (0, import_proto.createSlatesP
1423
1425
  idempotencyKey: event.idempotencyKey,
1424
1426
  triggerIds: evaluateTriggerMatches(slate, group.key, event.payload)
1425
1427
  })),
1426
- response
1428
+ response,
1429
+ skipped: res.skipped ?? null
1427
1430
  });
1428
1431
  });
1429
1432
  manager.onRequest("slates/trigger_group.routing_matchers.get", async ({ params }) => {
@@ -96,6 +96,7 @@ var mapAuthMethod = (slate, m) => ({
96
96
  description: s.description
97
97
  })) : void 0,
98
98
  adapters: "adapters" in m ? m.adapters : void 0,
99
+ ..."syncTokensAcrossConnections" in m && m.syncTokensAcrossConnections ? { syncTokensAcrossConnections: true } : {},
99
100
  inputSchema: toJsonSchema(m.inputSchema ?? z.object({})),
100
101
  outputSchema: toJsonSchema(slate.spec.auth.outputSchema),
101
102
  capabilities: {
@@ -111,14 +112,14 @@ var mapAuthMethod = (slate, m) => ({
111
112
  docs: m.docs ?? []
112
113
  });
113
114
  var getAction = (slate, actionId) => {
114
- let action = slate.actions.find((m) => m.key === actionId);
115
+ let action = (slate.actions ?? []).find((m) => m.key === actionId);
115
116
  if (!action) {
116
117
  throw new ServiceError2(notFoundError(`action`, actionId));
117
118
  }
118
119
  return action;
119
120
  };
120
121
  var getAdapter = (slate, adapterId) => {
121
- let adapter = slate.adapters.find((m) => m.id === adapterId);
122
+ let adapter = (slate.adapters ?? []).find((m) => m.id === adapterId);
122
123
  if (!adapter) {
123
124
  throw new ServiceError2(notFoundError(`adapter`, adapterId));
124
125
  }
@@ -127,7 +128,7 @@ var getAdapter = (slate, adapterId) => {
127
128
  var mapAdapter = (adapter) => ({
128
129
  id: adapter.id,
129
130
  name: adapter.name,
130
- capabilities: adapter.capabilities
131
+ capabilities: adapter.capabilities ?? []
131
132
  });
132
133
  var getActionWithType = (slate, type, actionId) => {
133
134
  let action = getAction(slate, actionId);
@@ -179,7 +180,7 @@ var getMappableAction = (slate, actionId) => {
179
180
  }
180
181
  return action;
181
182
  };
182
- var getExposedActions = (slate, includeAdapterActions) => slate.actions.filter(
183
+ var getExposedActions = (slate, includeAdapterActions) => (slate.actions ?? []).filter(
183
184
  (action) => isMappableTrigger(action) && (includeAdapterActions || !action.adapter)
184
185
  );
185
186
  var getExposedAction = (slate, actionId, includeAdapterActions) => {
@@ -190,13 +191,13 @@ var getExposedAction = (slate, actionId, includeAdapterActions) => {
190
191
  return action;
191
192
  };
192
193
  var getTriggerGroup = (slate, triggerGroupId) => {
193
- let group = slate.triggerGroups.find((g) => g.key === triggerGroupId);
194
+ let group = (slate.triggerGroups ?? []).find((g) => g.key === triggerGroupId);
194
195
  if (!group) {
195
196
  throw new ServiceError2(notFoundError(`trigger_group`, triggerGroupId));
196
197
  }
197
198
  return group;
198
199
  };
199
- var getTriggersForGroup = (slate, triggerGroupId) => slate.actions.filter(
200
+ var getTriggersForGroup = (slate, triggerGroupId) => (slate.actions ?? []).filter(
200
201
  (action) => action.type === "trigger" && action.triggerGroup?.key === triggerGroupId
201
202
  );
202
203
  var getExposedTriggerGroups = (slate, includeAdapterActions) => {
@@ -205,7 +206,7 @@ var getExposedTriggerGroups = (slate, includeAdapterActions) => {
205
206
  (action) => action.type === "trigger" && action.triggerGroup ? [action.triggerGroup.key] : []
206
207
  )
207
208
  );
208
- return slate.triggerGroups.filter((group) => triggerGroupIds.has(group.key));
209
+ return (slate.triggerGroups ?? []).filter((group) => triggerGroupIds.has(group.key));
209
210
  };
210
211
  var evaluateTriggerMatches = (slate, triggerGroupId, payload) => getTriggersForGroup(slate, triggerGroupId).filter((trigger) => trigger.matches(payload)).map((trigger) => trigger.key);
211
212
  var getWebhookAutoRegistration = (group) => {
@@ -997,7 +998,7 @@ var createProviderHandler = (slate, listeners) => createSlatesProviderProtoHandl
997
998
  manager.onRequest("slates/adapters.list", async () => {
998
999
  getContextBasic();
999
1000
  return {
1000
- adapters: supportsAdapters() ? slate.adapters.map(mapAdapter) : []
1001
+ adapters: supportsAdapters() ? (slate.adapters ?? []).map(mapAdapter) : []
1001
1002
  };
1002
1003
  });
1003
1004
  manager.onRequest("slates/adapter.get", async ({ params }) => {
@@ -1384,7 +1385,8 @@ var createProviderHandler = (slate, listeners) => createSlatesProviderProtoHandl
1384
1385
  },
1385
1386
  onSuccess: (result) => ({
1386
1387
  eventCount: result.events.length,
1387
- hasResponse: result.response !== void 0
1388
+ hasResponse: result.response !== void 0,
1389
+ skipped: !!result.skipped
1388
1390
  })
1389
1391
  },
1390
1392
  () => runWithContext(context, () => group.webhook.process(context))
@@ -1406,7 +1408,8 @@ var createProviderHandler = (slate, listeners) => createSlatesProviderProtoHandl
1406
1408
  idempotencyKey: event.idempotencyKey,
1407
1409
  triggerIds: evaluateTriggerMatches(slate, group.key, event.payload)
1408
1410
  })),
1409
- response
1411
+ response,
1412
+ skipped: res.skipped ?? null
1410
1413
  });
1411
1414
  });
1412
1415
  manager.onRequest("slates/trigger_group.routing_matchers.get", async ({ params }) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@slates/provider-handler",
3
- "version": "1.0.0-rc.35",
3
+ "version": "1.0.0-rc.37",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -32,8 +32,8 @@
32
32
  },
33
33
  "dependencies": {
34
34
  "@lowerdeck/error": "^1.1.0",
35
- "@slates/proto": "1.0.0-rc.21",
36
- "@slates/provider": "1.0.0-rc.25",
35
+ "@slates/proto": "1.0.0-rc.23",
36
+ "@slates/provider": "1.0.0-rc.27",
37
37
  "p-queue": "^6.6.2",
38
38
  "zod": "^4.2.1"
39
39
  },
@@ -158,4 +158,59 @@ describe('adapter capability exposure', () => {
158
158
  }
159
159
  });
160
160
  });
161
+
162
+ it('returns empty adapter and trigger group lists for older slates that omit those collections', async () => {
163
+ let manager = await createProviderHandler(
164
+ {
165
+ spec: { key: 'legacy', name: 'Legacy' },
166
+ actions: [
167
+ {
168
+ key: 'provider_tool',
169
+ type: 'tool',
170
+ name: 'Action',
171
+ description: undefined,
172
+ instructions: undefined,
173
+ constraints: undefined,
174
+ tags: [],
175
+ metadata: {},
176
+ scopes: [],
177
+ authMethods: [],
178
+ docs: [],
179
+ inputSchema: z.object({}),
180
+ outputSchema: z.object({}),
181
+ isPublic: false
182
+ }
183
+ ]
184
+ } as any,
185
+ []
186
+ ).run();
187
+
188
+ await SlatesProviderProtoHandlerManager.handleInput(manager, {
189
+ jsonrpc: '2.0',
190
+ method: 'slates/hello',
191
+ params: { protocol: SLATES_PROTOCOL_VERSION }
192
+ });
193
+ await SlatesProviderProtoHandlerManager.handleInput(manager, {
194
+ jsonrpc: '2.0',
195
+ method: 'slates/participant.set',
196
+ params: { participants: [] }
197
+ });
198
+ await SlatesProviderProtoHandlerManager.handleInput(manager, {
199
+ jsonrpc: '2.0',
200
+ method: 'slates/hub.capabilities.set',
201
+ params: { capabilities: { adapters: true, triggers: true } }
202
+ });
203
+
204
+ expect(await request(manager, 'slates/adapters.list')).toMatchObject({
205
+ result: { adapters: [] }
206
+ });
207
+ expect(await request(manager, 'slates/trigger_groups.list')).toMatchObject({
208
+ result: { triggerGroups: [] }
209
+ });
210
+ expect(
211
+ await request(manager, 'slates/actions.list', { includeAdapterActions: true })
212
+ ).toMatchObject({
213
+ result: { actions: [{ id: 'provider_tool' }] }
214
+ });
215
+ });
161
216
  });
package/src/index.ts CHANGED
@@ -894,7 +894,7 @@ export let createProviderHandler = <ConfigType extends {}, AuthType extends {}>(
894
894
  getContextBasic();
895
895
 
896
896
  return {
897
- adapters: supportsAdapters() ? slate.adapters.map(mapAdapter) : []
897
+ adapters: supportsAdapters() ? (slate.adapters ?? []).map(mapAdapter) : []
898
898
  };
899
899
  });
900
900
 
@@ -1337,7 +1337,8 @@ export let createProviderHandler = <ConfigType extends {}, AuthType extends {}>(
1337
1337
  },
1338
1338
  onSuccess: result => ({
1339
1339
  eventCount: result.events.length,
1340
- hasResponse: result.response !== undefined
1340
+ hasResponse: result.response !== undefined,
1341
+ skipped: !!result.skipped
1341
1342
  })
1342
1343
  },
1343
1344
  () => runWithContext(context, () => group.webhook!.process(context))
@@ -1365,7 +1366,8 @@ export let createProviderHandler = <ConfigType extends {}, AuthType extends {}>(
1365
1366
  idempotencyKey: event.idempotencyKey,
1366
1367
  triggerIds: evaluateTriggerMatches(slate, group.key, event.payload)
1367
1368
  })),
1368
- response
1369
+ response,
1370
+ skipped: res.skipped ?? null
1369
1371
  });
1370
1372
  });
1371
1373
 
package/src/spec.test.ts CHANGED
@@ -8,7 +8,9 @@ import {
8
8
  getMappableAction,
9
9
  getTriggersForGroup,
10
10
  isMappableTrigger,
11
- mapAction
11
+ mapAction,
12
+ mapAdapter,
13
+ mapAuthMethod
12
14
  } from './spec';
13
15
 
14
16
  let baseAction = {
@@ -131,4 +133,38 @@ describe('adapter exposure', () => {
131
133
  expect(getExposedTriggerGroups(slate, false)).toEqual([providerGroup]);
132
134
  expect(getExposedTriggerGroups(slate, true)).toEqual([providerGroup, adapterGroup]);
133
135
  });
136
+
137
+ it('treats missing adapters and trigger groups as empty collections', () => {
138
+ let legacySlate = { actions: [providerTool, providerTrigger] } as any;
139
+
140
+ expect(getExposedActions(legacySlate, true)).toEqual([providerTool, providerTrigger]);
141
+ expect(getExposedTriggerGroups(legacySlate, true)).toEqual([]);
142
+ expect(mapAdapter({ id: 'chat', name: 'Chat' } as any)).toEqual({
143
+ id: 'chat',
144
+ name: 'Chat',
145
+ capabilities: []
146
+ });
147
+ });
148
+ });
149
+
150
+ describe('mapAuthMethod', () => {
151
+ let slate: any = { spec: { auth: { outputSchema: z.object({ token: z.string() }) } } };
152
+ let oauthMethod: any = {
153
+ type: 'auth.oauth',
154
+ key: 'oauth',
155
+ name: 'OAuth',
156
+ scopes: [],
157
+ getAuthorizationUrl: async () => ({ url: '' }),
158
+ handleCallback: async () => ({ output: { token: '' } })
159
+ };
160
+
161
+ it('emits syncTokensAcrossConnections only when the method opts in', () => {
162
+ expect(
163
+ mapAuthMethod(slate, { ...oauthMethod, syncTokensAcrossConnections: true })
164
+ ).toMatchObject({ syncTokensAcrossConnections: true });
165
+
166
+ for (let method of [oauthMethod, { ...oauthMethod, syncTokensAcrossConnections: false }]) {
167
+ expect(mapAuthMethod(slate, method)).not.toHaveProperty('syncTokensAcrossConnections');
168
+ }
169
+ });
134
170
  });
package/src/spec.ts CHANGED
@@ -49,6 +49,10 @@ export let mapAuthMethod = <ConfigType extends {}, AuthType extends {}>(
49
49
 
50
50
  adapters: 'adapters' in m ? m.adapters : undefined,
51
51
 
52
+ ...('syncTokensAcrossConnections' in m && m.syncTokensAcrossConnections
53
+ ? { syncTokensAcrossConnections: true }
54
+ : {}),
55
+
52
56
  inputSchema: toJsonSchema(m.inputSchema ?? z.object({})),
53
57
  outputSchema: toJsonSchema(slate.spec.auth.outputSchema),
54
58
 
@@ -70,7 +74,7 @@ export let getAction = <ConfigType extends {}, AuthType extends {}>(
70
74
  slate: Slate<ConfigType, AuthType>,
71
75
  actionId: string
72
76
  ) => {
73
- let action = slate.actions.find(m => m.key === actionId);
77
+ let action = (slate.actions ?? []).find(m => m.key === actionId);
74
78
  if (!action) {
75
79
  throw new ServiceError(notFoundError(`action`, actionId));
76
80
  }
@@ -82,7 +86,7 @@ export let getAdapter = <ConfigType extends {}, AuthType extends {}>(
82
86
  slate: Slate<ConfigType, AuthType>,
83
87
  adapterId: string
84
88
  ) => {
85
- let adapter = slate.adapters.find(m => m.id === adapterId);
89
+ let adapter = (slate.adapters ?? []).find(m => m.id === adapterId);
86
90
  if (!adapter) {
87
91
  throw new ServiceError(notFoundError(`adapter`, adapterId));
88
92
  }
@@ -95,7 +99,7 @@ export let mapAdapter = <ConfigType extends {}, AuthType extends {}>(
95
99
  ): SlatesAdapter => ({
96
100
  id: adapter.id,
97
101
  name: adapter.name,
98
- capabilities: adapter.capabilities
102
+ capabilities: adapter.capabilities ?? []
99
103
  });
100
104
 
101
105
  export let getActionWithType = <
@@ -177,7 +181,7 @@ export let getExposedActions = <ConfigType extends {}, AuthType extends {}>(
177
181
  slate: Slate<ConfigType, AuthType>,
178
182
  includeAdapterActions: boolean
179
183
  ) =>
180
- slate.actions.filter(
184
+ (slate.actions ?? []).filter(
181
185
  action => isMappableTrigger(action) && (includeAdapterActions || !action.adapter)
182
186
  );
183
187
 
@@ -198,7 +202,7 @@ export let getTriggerGroup = <ConfigType extends {}, AuthType extends {}>(
198
202
  slate: Slate<ConfigType, AuthType>,
199
203
  triggerGroupId: string
200
204
  ) => {
201
- let group = slate.triggerGroups.find(g => g.key === triggerGroupId);
205
+ let group = (slate.triggerGroups ?? []).find(g => g.key === triggerGroupId);
202
206
  if (!group) {
203
207
  throw new ServiceError(notFoundError(`trigger_group`, triggerGroupId));
204
208
  }
@@ -210,7 +214,7 @@ export let getTriggersForGroup = <ConfigType extends {}, AuthType extends {}>(
210
214
  slate: Slate<ConfigType, AuthType>,
211
215
  triggerGroupId: string
212
216
  ): SlateTrigger<ConfigType, AuthType, any, any>[] =>
213
- slate.actions.filter(
217
+ (slate.actions ?? []).filter(
214
218
  (action): action is SlateTrigger<ConfigType, AuthType, any, any> =>
215
219
  action.type === 'trigger' && action.triggerGroup?.key === triggerGroupId
216
220
  );
@@ -225,7 +229,7 @@ export let getExposedTriggerGroups = <ConfigType extends {}, AuthType extends {}
225
229
  )
226
230
  );
227
231
 
228
- return slate.triggerGroups.filter(group => triggerGroupIds.has(group.key));
232
+ return (slate.triggerGroups ?? []).filter(group => triggerGroupIds.has(group.key));
229
233
  };
230
234
 
231
235
  export let evaluateTriggerMatches = <ConfigType extends {}, AuthType extends {}>(
@@ -0,0 +1,99 @@
1
+ import { SLATES_PROTOCOL_VERSION, SlatesProviderProtoHandlerManager } from '@slates/proto';
2
+ import { describe, expect, it } from 'vitest';
3
+ import { createProviderHandler } from './index';
4
+
5
+ let createManager = async (
6
+ process: () => Promise<{
7
+ events: any[];
8
+ response?: { status?: number; body?: string };
9
+ skipped?: { reason: string };
10
+ }>
11
+ ) => {
12
+ let webhookGroup = {
13
+ key: 'webhook_group',
14
+ name: 'Webhook Group',
15
+ description: undefined,
16
+ metadata: {},
17
+ source: 'webhook',
18
+ webhook: {
19
+ autoRegistration: {
20
+ webhookTargetList: async () => ({ targets: [], nextPageToken: null }),
21
+ webhookRegister: async () => ({
22
+ webhookRegistrationIdentifier: 'reg',
23
+ webhookRegistrationPayload: {}
24
+ }),
25
+ webhookUnregister: async () => {}
26
+ },
27
+ process
28
+ }
29
+ };
30
+ let slate = {
31
+ spec: { key: 'test', name: 'Test' },
32
+ adapters: [],
33
+ actions: [],
34
+ triggerGroups: [webhookGroup]
35
+ };
36
+ let manager = await createProviderHandler(slate as any, []).run();
37
+
38
+ await SlatesProviderProtoHandlerManager.handleInput(manager, {
39
+ jsonrpc: '2.0',
40
+ method: 'slates/hello',
41
+ params: { protocol: SLATES_PROTOCOL_VERSION }
42
+ });
43
+ await SlatesProviderProtoHandlerManager.handleInput(manager, {
44
+ jsonrpc: '2.0',
45
+ method: 'slates/participant.set',
46
+ params: { participants: [] }
47
+ });
48
+ await SlatesProviderProtoHandlerManager.handleInput(manager, {
49
+ jsonrpc: '2.0',
50
+ method: 'slates/hub.capabilities.set',
51
+ params: { capabilities: { triggers: true } }
52
+ });
53
+
54
+ return manager;
55
+ };
56
+
57
+ let processWebhook = (manager: SlatesProviderProtoHandlerManager) =>
58
+ SlatesProviderProtoHandlerManager.handleInput(manager, {
59
+ jsonrpc: '2.0',
60
+ id: 'process',
61
+ method: 'slates/trigger_group.webhook.process',
62
+ params: {
63
+ triggerGroupId: 'webhook_group',
64
+ url: 'https://hub.example/receive/key',
65
+ method: 'POST',
66
+ headers: {},
67
+ body: null,
68
+ webhookRegistrationPayload: {}
69
+ }
70
+ } as any);
71
+
72
+ describe('slates/trigger_group.webhook.process', () => {
73
+ it('passes the skipped marker through to the hub', async () => {
74
+ let manager = await createManager(async () => ({
75
+ events: [],
76
+ response: { status: 401, body: 'Invalid webhook signature.' },
77
+ skipped: { reason: 'invalid_signature' }
78
+ }));
79
+
80
+ expect(await processWebhook(manager)).toMatchObject({
81
+ result: {
82
+ events: [],
83
+ response: { status: 401 },
84
+ skipped: { reason: 'invalid_signature' }
85
+ }
86
+ });
87
+ });
88
+
89
+ it('reports null skipped when the handler did not skip', async () => {
90
+ let manager = await createManager(async () => ({
91
+ events: [],
92
+ response: { status: 200, body: '' }
93
+ }));
94
+
95
+ expect(await processWebhook(manager)).toMatchObject({
96
+ result: { events: [], skipped: null }
97
+ });
98
+ });
99
+ });