@superblocksteam/sdk-api 2.0.105 → 2.0.106-next.1

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.
Files changed (182) hide show
  1. package/README.md +439 -89
  2. package/dist/api/definition.d.ts +11 -6
  3. package/dist/api/definition.d.ts.map +1 -1
  4. package/dist/api/definition.js +19 -12
  5. package/dist/api/definition.js.map +1 -1
  6. package/dist/api/definition.test.js +39 -15
  7. package/dist/api/definition.test.js.map +1 -1
  8. package/dist/errors.d.ts +1 -1
  9. package/dist/errors.js +1 -1
  10. package/dist/index.d.ts +10 -11
  11. package/dist/index.d.ts.map +1 -1
  12. package/dist/index.js +9 -5
  13. package/dist/index.js.map +1 -1
  14. package/dist/integrations/base/index.d.ts +2 -1
  15. package/dist/integrations/base/index.d.ts.map +1 -1
  16. package/dist/integrations/base/index.js +1 -0
  17. package/dist/integrations/base/index.js.map +1 -1
  18. package/dist/integrations/base/rest-api-client-base.d.ts +48 -0
  19. package/dist/integrations/base/rest-api-client-base.d.ts.map +1 -0
  20. package/dist/integrations/base/rest-api-client-base.js +98 -0
  21. package/dist/integrations/base/rest-api-client-base.js.map +1 -0
  22. package/dist/integrations/base/rest-api-integration-client.d.ts +10 -20
  23. package/dist/integrations/base/rest-api-integration-client.d.ts.map +1 -1
  24. package/dist/integrations/base/rest-api-integration-client.js +10 -65
  25. package/dist/integrations/base/rest-api-integration-client.js.map +1 -1
  26. package/dist/integrations/box/types.d.ts +1 -1
  27. package/dist/integrations/declarations.d.ts +5 -73
  28. package/dist/integrations/declarations.d.ts.map +1 -1
  29. package/dist/integrations/declarations.js +5 -68
  30. package/dist/integrations/declarations.js.map +1 -1
  31. package/dist/integrations/documentation.test.js +0 -2
  32. package/dist/integrations/documentation.test.js.map +1 -1
  33. package/dist/integrations/googledrive/types.d.ts +1 -1
  34. package/dist/integrations/index.d.ts +1 -11
  35. package/dist/integrations/index.d.ts.map +1 -1
  36. package/dist/integrations/index.js +1 -7
  37. package/dist/integrations/index.js.map +1 -1
  38. package/dist/integrations/registry.d.ts +1 -11
  39. package/dist/integrations/registry.d.ts.map +1 -1
  40. package/dist/integrations/registry.js +0 -29
  41. package/dist/integrations/registry.js.map +1 -1
  42. package/dist/integrations/slack/client.d.ts +13 -9
  43. package/dist/integrations/slack/client.d.ts.map +1 -1
  44. package/dist/integrations/slack/client.js +60 -8
  45. package/dist/integrations/slack/client.js.map +1 -1
  46. package/dist/integrations/slack/client.test.d.ts +11 -0
  47. package/dist/integrations/slack/client.test.d.ts.map +1 -0
  48. package/dist/integrations/slack/client.test.js +368 -0
  49. package/dist/integrations/slack/client.test.js.map +1 -0
  50. package/dist/integrations/slack/index.d.ts +2 -1
  51. package/dist/integrations/slack/index.d.ts.map +1 -1
  52. package/dist/integrations/slack/index.js +1 -0
  53. package/dist/integrations/slack/index.js.map +1 -1
  54. package/dist/integrations/slack/types.d.ts +127 -28
  55. package/dist/integrations/slack/types.d.ts.map +1 -1
  56. package/dist/integrations/slack/types.js +27 -1
  57. package/dist/integrations/slack/types.js.map +1 -1
  58. package/dist/integrations/snowflake/client.d.ts +2 -2
  59. package/dist/integrations/snowflake/client.js +2 -2
  60. package/dist/runtime/context.d.ts +1 -1
  61. package/dist/runtime/executor.d.ts +2 -2
  62. package/dist/types.d.ts +15 -6
  63. package/dist/types.d.ts.map +1 -1
  64. package/package.json +2 -2
  65. package/src/api/definition.test.ts +40 -15
  66. package/src/api/definition.ts +19 -12
  67. package/src/errors.ts +1 -1
  68. package/src/index.ts +13 -33
  69. package/src/integrations/asana/README.md +12 -12
  70. package/src/integrations/base/index.ts +2 -1
  71. package/src/integrations/base/rest-api-client-base.ts +134 -0
  72. package/src/integrations/base/rest-api-integration-client.ts +12 -89
  73. package/src/integrations/bitbucket/README.md +19 -19
  74. package/src/integrations/box/README.md +24 -24
  75. package/src/integrations/box/types.ts +1 -1
  76. package/src/integrations/circleci/README.md +18 -18
  77. package/src/integrations/declarations.ts +5 -105
  78. package/src/integrations/documentation.test.ts +0 -2
  79. package/src/integrations/googledrive/README.md +25 -22
  80. package/src/integrations/googledrive/types.ts +1 -1
  81. package/src/integrations/graphql/README.md +2 -2
  82. package/src/integrations/groq/README.md +8 -8
  83. package/src/integrations/index.ts +0 -51
  84. package/src/integrations/mongodb/README.md +65 -12
  85. package/src/integrations/perplexity/README.md +39 -48
  86. package/src/integrations/registry.ts +1 -39
  87. package/src/integrations/salesforce/README.md +11 -9
  88. package/src/integrations/slack/README.md +62 -19
  89. package/src/integrations/slack/client.test.ts +553 -0
  90. package/src/integrations/slack/client.ts +92 -12
  91. package/src/integrations/slack/index.ts +6 -1
  92. package/src/integrations/slack/types.ts +142 -29
  93. package/src/integrations/snowflake/client.ts +2 -2
  94. package/src/integrations/zoom/README.md +15 -15
  95. package/src/runtime/context.ts +1 -1
  96. package/src/runtime/executor.ts +2 -2
  97. package/src/types.ts +15 -6
  98. package/dist/integrations/couchbase/client.d.ts +0 -36
  99. package/dist/integrations/couchbase/client.d.ts.map +0 -1
  100. package/dist/integrations/couchbase/client.js +0 -148
  101. package/dist/integrations/couchbase/client.js.map +0 -1
  102. package/dist/integrations/couchbase/index.d.ts +0 -8
  103. package/dist/integrations/couchbase/index.d.ts.map +0 -1
  104. package/dist/integrations/couchbase/index.js +0 -7
  105. package/dist/integrations/couchbase/index.js.map +0 -1
  106. package/dist/integrations/couchbase/types.d.ts +0 -100
  107. package/dist/integrations/couchbase/types.d.ts.map +0 -1
  108. package/dist/integrations/couchbase/types.js +0 -5
  109. package/dist/integrations/couchbase/types.js.map +0 -1
  110. package/dist/integrations/kafka/client.d.ts +0 -25
  111. package/dist/integrations/kafka/client.d.ts.map +0 -1
  112. package/dist/integrations/kafka/client.js +0 -124
  113. package/dist/integrations/kafka/client.js.map +0 -1
  114. package/dist/integrations/kafka/index.d.ts +0 -8
  115. package/dist/integrations/kafka/index.d.ts.map +0 -1
  116. package/dist/integrations/kafka/index.js +0 -7
  117. package/dist/integrations/kafka/index.js.map +0 -1
  118. package/dist/integrations/kafka/types.d.ts +0 -113
  119. package/dist/integrations/kafka/types.d.ts.map +0 -1
  120. package/dist/integrations/kafka/types.js +0 -5
  121. package/dist/integrations/kafka/types.js.map +0 -1
  122. package/dist/integrations/kinesis/client.d.ts +0 -31
  123. package/dist/integrations/kinesis/client.d.ts.map +0 -1
  124. package/dist/integrations/kinesis/client.js +0 -101
  125. package/dist/integrations/kinesis/client.js.map +0 -1
  126. package/dist/integrations/kinesis/index.d.ts +0 -8
  127. package/dist/integrations/kinesis/index.d.ts.map +0 -1
  128. package/dist/integrations/kinesis/index.js +0 -7
  129. package/dist/integrations/kinesis/index.js.map +0 -1
  130. package/dist/integrations/kinesis/types.d.ts +0 -97
  131. package/dist/integrations/kinesis/types.d.ts.map +0 -1
  132. package/dist/integrations/kinesis/types.js +0 -7
  133. package/dist/integrations/kinesis/types.js.map +0 -1
  134. package/dist/integrations/python/client.d.ts +0 -42
  135. package/dist/integrations/python/client.d.ts.map +0 -1
  136. package/dist/integrations/python/client.js +0 -89
  137. package/dist/integrations/python/client.js.map +0 -1
  138. package/dist/integrations/python/client.test.d.ts +0 -5
  139. package/dist/integrations/python/client.test.d.ts.map +0 -1
  140. package/dist/integrations/python/client.test.js +0 -214
  141. package/dist/integrations/python/client.test.js.map +0 -1
  142. package/dist/integrations/python/index.d.ts +0 -6
  143. package/dist/integrations/python/index.d.ts.map +0 -1
  144. package/dist/integrations/python/index.js +0 -5
  145. package/dist/integrations/python/index.js.map +0 -1
  146. package/dist/integrations/python/types.d.ts +0 -85
  147. package/dist/integrations/python/types.d.ts.map +0 -1
  148. package/dist/integrations/python/types.js +0 -5
  149. package/dist/integrations/python/types.js.map +0 -1
  150. package/dist/integrations/redis/client.d.ts +0 -43
  151. package/dist/integrations/redis/client.d.ts.map +0 -1
  152. package/dist/integrations/redis/client.js +0 -142
  153. package/dist/integrations/redis/client.js.map +0 -1
  154. package/dist/integrations/redis/index.d.ts +0 -8
  155. package/dist/integrations/redis/index.d.ts.map +0 -1
  156. package/dist/integrations/redis/index.js +0 -7
  157. package/dist/integrations/redis/index.js.map +0 -1
  158. package/dist/integrations/redis/types.d.ts +0 -137
  159. package/dist/integrations/redis/types.d.ts.map +0 -1
  160. package/dist/integrations/redis/types.js +0 -5
  161. package/dist/integrations/redis/types.js.map +0 -1
  162. package/src/integrations/couchbase/README.md +0 -138
  163. package/src/integrations/couchbase/client.ts +0 -225
  164. package/src/integrations/couchbase/index.ts +0 -8
  165. package/src/integrations/couchbase/types.ts +0 -126
  166. package/src/integrations/kafka/README.md +0 -144
  167. package/src/integrations/kafka/client.ts +0 -216
  168. package/src/integrations/kafka/index.ts +0 -14
  169. package/src/integrations/kafka/types.ts +0 -128
  170. package/src/integrations/kinesis/README.md +0 -153
  171. package/src/integrations/kinesis/client.ts +0 -146
  172. package/src/integrations/kinesis/index.ts +0 -14
  173. package/src/integrations/kinesis/types.ts +0 -114
  174. package/src/integrations/python/README.md +0 -566
  175. package/src/integrations/python/client.test.ts +0 -341
  176. package/src/integrations/python/client.ts +0 -136
  177. package/src/integrations/python/index.ts +0 -6
  178. package/src/integrations/python/types.ts +0 -92
  179. package/src/integrations/redis/README.md +0 -200
  180. package/src/integrations/redis/client.ts +0 -208
  181. package/src/integrations/redis/index.ts +0 -8
  182. package/src/integrations/redis/types.ts +0 -167
@@ -0,0 +1,368 @@
1
+ /**
2
+ * Tests for SlackClientImpl.
3
+ *
4
+ * Validates the SlackResponse<T> discriminated union contract:
5
+ * - ok:false from Slack → SlackErrorResponse (no throw)
6
+ * - ok:true from Slack → Zod-validated success data
7
+ * - ok:true but schema mismatch → RestApiValidationError (thrown)
8
+ * - Body validation failures still throw RestApiValidationError
9
+ */
10
+ import { describe, it, expect, vi } from "vitest";
11
+ import { z } from "zod";
12
+ import { RestApiValidationError } from "../../errors.js";
13
+ import { SlackClientImpl } from "./client.js";
14
+ const TEST_CONFIG = {
15
+ id: "slack-test-id",
16
+ name: "Test Slack",
17
+ pluginId: "slack",
18
+ configuration: {},
19
+ };
20
+ function createClient(mockResult) {
21
+ const executeQuery = vi.fn().mockResolvedValue(mockResult);
22
+ const client = new SlackClientImpl(TEST_CONFIG, executeQuery);
23
+ return { client, executeQuery };
24
+ }
25
+ const ChannelsSchema = z.object({
26
+ channels: z.array(z.object({ id: z.string(), name: z.string() })),
27
+ });
28
+ const PostMessageSchema = z.object({
29
+ channel: z.string(),
30
+ ts: z.string(),
31
+ });
32
+ describe("SlackClientImpl", () => {
33
+ // ── Success responses ──────────────────────────────────────────
34
+ describe("success responses (ok: true)", () => {
35
+ it("returns validated data with ok: true", async () => {
36
+ const { client } = createClient({
37
+ ok: true,
38
+ channels: [{ id: "C123", name: "general" }],
39
+ });
40
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema });
41
+ expect(result.ok).toBe(true);
42
+ if (result.ok) {
43
+ expect(result.channels).toHaveLength(1);
44
+ expect(result.channels[0]).toEqual({ id: "C123", name: "general" });
45
+ }
46
+ });
47
+ it("strips unknown keys via Zod strip mode", async () => {
48
+ const { client } = createClient({
49
+ ok: true,
50
+ channels: [{ id: "C1", name: "test", extra: true }],
51
+ response_metadata: { next_cursor: "" },
52
+ });
53
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema });
54
+ expect(result.ok).toBe(true);
55
+ if (result.ok) {
56
+ expect(result).not.toHaveProperty("response_metadata");
57
+ expect(result.channels[0]).not.toHaveProperty("extra");
58
+ }
59
+ });
60
+ it("validates a post message success response", async () => {
61
+ const { client } = createClient({
62
+ ok: true,
63
+ channel: "C123",
64
+ ts: "1234567890.123456",
65
+ });
66
+ const result = await client.apiRequest({
67
+ method: "POST",
68
+ path: "/chat.postMessage",
69
+ body: { channel: "C123", text: "hello" },
70
+ }, { response: PostMessageSchema });
71
+ expect(result.ok).toBe(true);
72
+ if (result.ok) {
73
+ expect(result.ts).toBe("1234567890.123456");
74
+ expect(result.channel).toBe("C123");
75
+ }
76
+ });
77
+ });
78
+ // ── Error responses (ok: false) ────────────────────────────────
79
+ describe("error responses (ok: false)", () => {
80
+ it("returns SlackErrorResponse instead of throwing", async () => {
81
+ const { client } = createClient({
82
+ ok: false,
83
+ error: "channel_not_found",
84
+ });
85
+ const result = await client.apiRequest({
86
+ method: "POST",
87
+ path: "/chat.postMessage",
88
+ body: { channel: "C000", text: "hi" },
89
+ }, { response: PostMessageSchema });
90
+ expect(result.ok).toBe(false);
91
+ if (!result.ok) {
92
+ expect(result.error).toBe("channel_not_found");
93
+ }
94
+ });
95
+ it("includes needed scopes on missing_scope errors", async () => {
96
+ const { client } = createClient({
97
+ ok: false,
98
+ error: "missing_scope",
99
+ needed: "channels:read",
100
+ provided: "identify,bot",
101
+ });
102
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema });
103
+ expect(result.ok).toBe(false);
104
+ if (!result.ok) {
105
+ expect(result.error).toBe("missing_scope");
106
+ expect(result.needed).toBe("channels:read");
107
+ expect(result.provided).toBe("identify,bot");
108
+ }
109
+ });
110
+ it("throws when ok: false but no error string (invalid Slack error)", async () => {
111
+ const { client } = createClient({ ok: false });
112
+ // { ok: false } without an error string doesn't match SlackErrorSchema,
113
+ // and also doesn't match the success schema → RestApiValidationError.
114
+ await expect(client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema })).rejects.toThrow(RestApiValidationError);
115
+ });
116
+ it.each(["not_authed", "invalid_auth", "ratelimited"])("handles %s error", async (errorCode) => {
117
+ const { client } = createClient({ ok: false, error: errorCode });
118
+ const result = await client.apiRequest({ method: "GET", path: "/auth.test" }, { response: z.object({}) });
119
+ expect(result.ok).toBe(false);
120
+ if (!result.ok) {
121
+ expect(result.error).toBe(errorCode);
122
+ }
123
+ });
124
+ it("omits needed/provided when not present in Slack response", async () => {
125
+ const { client } = createClient({
126
+ ok: false,
127
+ error: "channel_not_found",
128
+ });
129
+ const result = await client.apiRequest({ method: "POST", path: "/chat.postMessage" }, { response: PostMessageSchema });
130
+ expect(result.ok).toBe(false);
131
+ if (!result.ok) {
132
+ expect(result).not.toHaveProperty("needed");
133
+ expect(result).not.toHaveProperty("provided");
134
+ }
135
+ });
136
+ it("throws when needed/provided are non-string (invalid Slack error)", async () => {
137
+ const { client } = createClient({
138
+ ok: false,
139
+ error: "missing_scope",
140
+ needed: 123,
141
+ provided: true,
142
+ });
143
+ // Zod rejects non-string needed/provided. Since raw response has ok:false,
144
+ // SlackClient rejects it before success payload validation.
145
+ await expect(client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema })).rejects.toThrow(RestApiValidationError);
146
+ });
147
+ });
148
+ // ── Validation errors (still thrown) ───────────────────────────
149
+ describe("validation errors", () => {
150
+ it("throws RestApiValidationError when ok:true but schema does not match", async () => {
151
+ // Slack says ok:true but response is missing required fields
152
+ const { client } = createClient({
153
+ ok: true,
154
+ // Missing 'channels' field
155
+ });
156
+ await expect(client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema })).rejects.toThrow(RestApiValidationError);
157
+ });
158
+ it("includes raw data and Zod error in validation error details", async () => {
159
+ const badResponse = { ok: true };
160
+ const { client } = createClient(badResponse);
161
+ try {
162
+ await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema });
163
+ expect.fail("Expected RestApiValidationError");
164
+ }
165
+ catch (e) {
166
+ expect(e).toBeInstanceOf(RestApiValidationError);
167
+ const err = e;
168
+ expect(err.details.data).toEqual(badResponse);
169
+ expect(err.details.zodError).toBeDefined();
170
+ }
171
+ });
172
+ it("throws RestApiValidationError when request body fails validation", async () => {
173
+ const { client } = createClient({ ok: true });
174
+ const BodySchema = z.object({
175
+ channel: z.string(),
176
+ text: z.string(),
177
+ });
178
+ await expect(client.apiRequest({
179
+ method: "POST",
180
+ path: "/chat.postMessage",
181
+ body: { channel: 123, text: "hello" },
182
+ }, { body: BodySchema, response: PostMessageSchema })).rejects.toThrow(RestApiValidationError);
183
+ });
184
+ });
185
+ // ── Request building ───────────────────────────────────────────
186
+ describe("request building", () => {
187
+ it("sends correct proto structure to executeQuery", async () => {
188
+ const { client, executeQuery } = createClient({
189
+ ok: true,
190
+ channel: "C123",
191
+ ts: "1234567890.123456",
192
+ });
193
+ await client.apiRequest({
194
+ method: "POST",
195
+ path: "/chat.postMessage",
196
+ body: { channel: "#general", text: "hello" },
197
+ headers: { "X-Custom": "value" },
198
+ params: { unfurl_links: false },
199
+ }, { response: PostMessageSchema });
200
+ expect(executeQuery).toHaveBeenCalledOnce();
201
+ const request = executeQuery.mock.calls[0][0];
202
+ expect(request.openApiAction).toBe("genericHttpRequest");
203
+ expect(request.httpMethod).toBe("POST");
204
+ expect(request.urlPath).toBe("/chat.postMessage");
205
+ expect(request.responseType).toBe("json");
206
+ expect(request.body).toBe(JSON.stringify({ channel: "#general", text: "hello" }));
207
+ expect(request.bodyType).toBe("jsonBody");
208
+ expect(request.headers).toEqual([{ key: "X-Custom", value: "value" }]);
209
+ expect(request.params).toEqual([{ key: "unfurl_links", value: "false" }]);
210
+ });
211
+ it("passes trace metadata to executeQuery", async () => {
212
+ const { client, executeQuery } = createClient({
213
+ ok: true,
214
+ channel: "C1",
215
+ ts: "1.1",
216
+ });
217
+ await client.apiRequest({ method: "POST", path: "/chat.postMessage" }, { response: PostMessageSchema }, { label: "slack.postMessage", description: "Post a message" });
218
+ expect(executeQuery).toHaveBeenCalledWith(expect.any(Object), undefined, {
219
+ label: "slack.postMessage",
220
+ description: "Post a message",
221
+ });
222
+ });
223
+ it("propagates executeQuery rejections as transport errors", async () => {
224
+ const executeQuery = vi
225
+ .fn()
226
+ .mockRejectedValue(new Error("network timeout"));
227
+ const client = new SlackClientImpl(TEST_CONFIG, executeQuery);
228
+ await expect(client.apiRequest({ method: "GET", path: "/auth.test" }, { response: z.object({}) })).rejects.toThrow("network timeout");
229
+ });
230
+ });
231
+ // ── Edge cases ─────────────────────────────────────────────────
232
+ describe("edge cases", () => {
233
+ it("falls through to schema validation when response has no ok field", async () => {
234
+ const { client } = createClient({ data: [1, 2, 3] });
235
+ // No ok field → not Slack error, and missing success envelope.
236
+ await expect(client.apiRequest({ method: "GET", path: "/some.endpoint" }, { response: ChannelsSchema })).rejects.toThrow(RestApiValidationError);
237
+ });
238
+ it("falls through to schema validation when ok is not a boolean", async () => {
239
+ const { client } = createClient({ ok: "false", error: "nope" });
240
+ // ok is a string, so it is neither a valid Slack error envelope
241
+ // nor a valid success envelope.
242
+ await expect(client.apiRequest({ method: "GET", path: "/some.endpoint" }, { response: ChannelsSchema })).rejects.toThrow(RestApiValidationError);
243
+ });
244
+ it("handles response surviving JSON round-trip (protobuf simulation)", async () => {
245
+ const original = {
246
+ ok: true,
247
+ channels: [{ id: "C123", name: "general" }],
248
+ nested: { count: 42 },
249
+ };
250
+ const roundTripped = JSON.parse(JSON.stringify(original));
251
+ const { client } = createClient(roundTripped);
252
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema });
253
+ expect(result.ok).toBe(true);
254
+ if (result.ok) {
255
+ expect(result.channels[0].id).toBe("C123");
256
+ }
257
+ });
258
+ it("injects ok: true when schema omits the ok field", async () => {
259
+ const NoOkSchema = z.object({
260
+ channels: z.array(z.object({ id: z.string(), name: z.string() })),
261
+ });
262
+ const { client } = createClient({
263
+ ok: true,
264
+ channels: [{ id: "C1", name: "test" }],
265
+ });
266
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: NoOkSchema });
267
+ expect(result.ok).toBe(true);
268
+ if (result.ok) {
269
+ expect(result.channels).toHaveLength(1);
270
+ }
271
+ });
272
+ it("validates payload schema after removing envelope field for strict schemas", async () => {
273
+ const StrictSchema = z
274
+ .object({
275
+ channels: z.array(z.object({ id: z.string(), name: z.string() })),
276
+ })
277
+ .strict();
278
+ const { client } = createClient({
279
+ ok: true,
280
+ channels: [{ id: "C1", name: "test" }],
281
+ });
282
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: StrictSchema });
283
+ expect(result.ok).toBe(true);
284
+ if (result.ok) {
285
+ expect(result.channels).toHaveLength(1);
286
+ }
287
+ });
288
+ it("supports passthrough schemas and still enforces literal ok discriminant", async () => {
289
+ const PassthroughSchema = z
290
+ .object({
291
+ channels: z.array(z.object({ id: z.string(), name: z.string() })),
292
+ })
293
+ .passthrough();
294
+ const { client } = createClient({
295
+ ok: true,
296
+ channels: [{ id: "C1", name: "test" }],
297
+ response_metadata: { next_cursor: "abc" },
298
+ });
299
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: PassthroughSchema });
300
+ expect(result.ok).toBe(true);
301
+ if (result.ok) {
302
+ expect(result.channels).toHaveLength(1);
303
+ expect(result).toHaveProperty("response_metadata");
304
+ }
305
+ });
306
+ it("throws when ok:false and loose payload schema would otherwise accept", async () => {
307
+ const LooseSchema = z.object({});
308
+ const { client } = createClient({ ok: false });
309
+ await expect(client.apiRequest({ method: "GET", path: "/auth.test" }, { response: LooseSchema })).rejects.toThrow(RestApiValidationError);
310
+ });
311
+ it("routes to error branch when response matches both schemas", async () => {
312
+ // Response matches SlackErrorSchema AND a loose success schema.
313
+ // Error branch must win because it's checked first.
314
+ const FlexibleSchema = z.object({
315
+ error: z.string().optional(),
316
+ });
317
+ const { client } = createClient({
318
+ ok: false,
319
+ error: "channel_not_found",
320
+ });
321
+ const result = await client.apiRequest({ method: "POST", path: "/chat.postMessage" }, { response: FlexibleSchema });
322
+ expect(result.ok).toBe(false);
323
+ if (!result.ok) {
324
+ expect(result.error).toBe("channel_not_found");
325
+ }
326
+ });
327
+ it("does not treat ok: 0 as a Slack error (only strict false)", async () => {
328
+ // ok: 0 is not === false, so it is NOT detected as a Slack error.
329
+ // It fails success envelope validation because ok must be literal true.
330
+ const { client } = createClient({
331
+ ok: 0,
332
+ channels: [{ id: "C1", name: "test" }],
333
+ });
334
+ await expect(client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema })).rejects.toThrow(RestApiValidationError);
335
+ });
336
+ });
337
+ // ── Type narrowing (compile-time verification) ─────────────────
338
+ describe("type narrowing", () => {
339
+ it("narrows to error response fields when ok is false", async () => {
340
+ const { client } = createClient({
341
+ ok: false,
342
+ error: "missing_scope",
343
+ needed: "channels:read",
344
+ });
345
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema });
346
+ // This block exercises the SlackErrorResponse branch
347
+ if (!result.ok) {
348
+ const errorResult = result;
349
+ expect(errorResult.error).toBe("missing_scope");
350
+ expect(errorResult.needed).toBe("channels:read");
351
+ }
352
+ });
353
+ it("narrows to success response fields when ok is true", async () => {
354
+ const { client } = createClient({
355
+ ok: true,
356
+ channels: [{ id: "C1", name: "general" }],
357
+ });
358
+ const result = await client.apiRequest({ method: "GET", path: "/conversations.list" }, { response: ChannelsSchema });
359
+ // This block exercises the T & { ok: true } branch
360
+ if (result.ok) {
361
+ // TypeScript narrows: result.channels is accessible
362
+ expect(result.channels).toHaveLength(1);
363
+ expect(result.channels[0].name).toBe("general");
364
+ }
365
+ });
366
+ });
367
+ });
368
+ //# sourceMappingURL=client.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.test.js","sourceRoot":"","sources":["../../../src/integrations/slack/client.test.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  /**
2
2
  * Slack integration module.
3
3
  */
4
- export type { SlackClient } from "./types.js";
4
+ export type { SlackClient, SlackResponse, SlackErrorResponse, } from "./types.js";
5
+ export { SlackErrorSchema } from "./types.js";
5
6
  export { SlackClientImpl } from "./client.js";
6
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/integrations/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,YAAY,EACV,WAAW,EACX,aAAa,EACb,kBAAkB,GACnB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -1,5 +1,6 @@
1
1
  /**
2
2
  * Slack integration module.
3
3
  */
4
+ export { SlackErrorSchema } from "./types.js";
4
5
  export { SlackClientImpl } from "./client.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAOH,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC"}
@@ -1,48 +1,147 @@
1
1
  /**
2
2
  * Slack client types.
3
+ *
4
+ * Defines the SlackResponse<T> discriminated union that wraps every
5
+ * Slack API call, plus the SlackClient interface consumers interact with.
3
6
  */
7
+ import { z } from "zod";
4
8
  import type { BaseIntegrationClient } from "../../types.js";
5
- import type { SupportsApiRequest } from "../base/index.js";
9
+ import type { ApiRequestOptions, TraceMetadata } from "../base/types.js";
6
10
  /**
7
- * Slack client for API interactions.
11
+ * Zod schema for Slack API error responses.
12
+ *
13
+ * Slack returns errors as HTTP 200 with `{ ok: false, error: "..." }`.
14
+ * For `missing_scope` errors, `needed` and `provided` list the
15
+ * required vs current OAuth scopes.
16
+ */
17
+ export declare const SlackErrorSchema: z.ZodObject<{
18
+ ok: z.ZodLiteral<false>;
19
+ error: z.ZodString;
20
+ needed: z.ZodOptional<z.ZodString>;
21
+ provided: z.ZodOptional<z.ZodString>;
22
+ }, "strip", z.ZodTypeAny, {
23
+ ok: false;
24
+ error: string;
25
+ needed?: string | undefined;
26
+ provided?: string | undefined;
27
+ }, {
28
+ ok: false;
29
+ error: string;
30
+ needed?: string | undefined;
31
+ provided?: string | undefined;
32
+ }>;
33
+ /** Slack API error response, derived from {@link SlackErrorSchema}. */
34
+ export type SlackErrorResponse = z.infer<typeof SlackErrorSchema>;
35
+ /**
36
+ * Zod schema for Slack success envelopes.
37
+ *
38
+ * Success responses from Slack include `{ ok: true, ...payload }`.
39
+ * Callers provide schemas for the payload fields only; the SDK validates
40
+ * this envelope separately and injects `ok: true` in the returned type.
41
+ */
42
+ export declare const SlackSuccessEnvelopeSchema: z.ZodObject<{
43
+ ok: z.ZodLiteral<true>;
44
+ }, "strip", z.ZodTypeAny, {
45
+ ok: true;
46
+ }, {
47
+ ok: true;
48
+ }>;
49
+ /**
50
+ * Enforce that caller-provided success schemas do not define `ok`.
51
+ *
52
+ * The `ok` field belongs to the Slack envelope and is injected by the SDK.
53
+ */
54
+ type SlackSuccessSchemaHasExplicitOkKey<TSchema extends z.AnyZodObject> = TSchema extends z.ZodObject<infer TShape, z.UnknownKeysParam, z.ZodTypeAny, unknown, unknown> ? "ok" extends keyof TShape ? true : false : false;
55
+ export type SlackSuccessSchema<TSchema extends z.AnyZodObject> = SlackSuccessSchemaHasExplicitOkKey<TSchema> extends true ? never : TSchema;
56
+ /**
57
+ * Schema configuration for Slack API requests.
58
+ *
59
+ * Response schema must be an object payload schema (without `ok`).
60
+ */
61
+ export interface SlackApiRequestSchema<TBody, TResponseSchema extends z.AnyZodObject> {
62
+ body?: z.ZodSchema<TBody>;
63
+ response: SlackSuccessSchema<TResponseSchema>;
64
+ }
65
+ /** Slack success response shape with injected discriminant. */
66
+ export type SlackSuccessResponse<T extends Record<string, unknown>> = T & {
67
+ readonly ok: true;
68
+ };
69
+ /**
70
+ * Discriminated union of a Slack success response and error response.
8
71
  *
9
- * Provides generic API request method for interacting with Slack's API.
10
- * Use apiRequest() to make calls to any Slack API endpoint.
72
+ * On success (`ok: true`), the type is `T & { ok: true }` — the
73
+ * validated schema output intersected with a literal `true` discriminant.
74
+ * On failure (`ok: false`), the type is {@link SlackErrorResponse}.
75
+ *
76
+ * Use the `ok` field as a discriminant for type narrowing:
11
77
  *
12
78
  * @example
13
79
  * ```typescript
14
- * // Declare in api(): integrations: { slack: slack(INTEGRATION_ID) }
15
- * // In run(), access via: ctx.integrations.slack
16
- * await ctx.integrations.slack.apiRequest(
17
- * {
18
- * method: 'POST',
19
- * path: '/chat.postMessage',
20
- * body: {
21
- * channel: '#alerts',
22
- * text: 'Deployment completed!',
23
- * },
24
- * },
25
- * { response: PostMessageResponseSchema }
80
+ * const result = await ctx.integrations.slack.apiRequest(
81
+ * { method: "GET", path: "/conversations.list", params: { limit: 100 } },
82
+ * { response: ListChannelsSchema },
26
83
  * );
27
84
  *
28
- * // List channels
29
- * const ListChannelsResponseSchema = z.object({
30
- * channels: z.array(z.object({
31
- * id: z.string(),
32
- * name: z.string(),
33
- * })),
34
- * });
85
+ * if (!result.ok) {
86
+ * // TypeScript narrows to SlackErrorResponse
87
+ * console.error(`Slack error: ${result.error}`);
88
+ * return;
89
+ * }
35
90
  *
91
+ * // TypeScript narrows to T & { ok: true }
92
+ * result.channels.forEach(ch => console.log(ch.name));
93
+ * ```
94
+ */
95
+ export type SlackResponse<T extends Record<string, unknown>> = SlackSuccessResponse<T> | SlackErrorResponse;
96
+ /**
97
+ * Slack client for API interactions.
98
+ *
99
+ * Returns {@link SlackResponse}<T> from `apiRequest` — a discriminated
100
+ * union that encapsulates both Slack success and error responses. This
101
+ * avoids confusing Zod validation errors when Slack returns `ok: false`
102
+ * (which is an HTTP 200 with no success-specific fields).
103
+ *
104
+ * Note: SlackClient intentionally does not extend `SupportsApiRequest`.
105
+ * `SupportsApiRequest.apiRequest` returns `Promise<TResponse>`, while
106
+ * Slack returns `Promise<SlackResponse<T>>` by design.
107
+ *
108
+ * @example
109
+ * ```typescript
36
110
  * const result = await ctx.integrations.slack.apiRequest(
37
111
  * {
38
- * method: 'GET',
39
- * path: '/conversations.list',
40
- * params: { limit: 100 },
112
+ * method: "POST",
113
+ * path: "/chat.postMessage",
114
+ * body: { channel: "#alerts", text: "Deployed!" },
41
115
  * },
42
- * { response: ListChannelsResponseSchema }
116
+ * { response: PostMessageResponseSchema },
43
117
  * );
118
+ *
119
+ * if (!result.ok) {
120
+ * throw new Error(`Slack API error: ${result.error}`);
121
+ * }
122
+ *
123
+ * console.log(`Message sent: ${result.ts}`);
44
124
  * ```
45
125
  */
46
- export interface SlackClient extends BaseIntegrationClient, SupportsApiRequest {
126
+ export interface SlackClient extends BaseIntegrationClient {
127
+ /**
128
+ * Execute a Slack API request with type-safe response handling.
129
+ *
130
+ * Returns a {@link SlackResponse}<TResponse> discriminated union:
131
+ * - On success: the Zod-validated payload with injected `ok: true`
132
+ * - On failure: a {@link SlackErrorResponse} with `ok: false` and the Slack error code
133
+ *
134
+ * Body validation still throws {@link RestApiValidationError} if the
135
+ * request body fails its Zod schema.
136
+ *
137
+ * @param options - Request configuration (method, path, params, body, headers)
138
+ * @param schema - Zod schemas for body and response validation (response REQUIRED)
139
+ * - `response` must be `z.object(...)`
140
+ * - `response` should define payload fields only (MUST NOT define `ok`)
141
+ * @param metadata - Optional trace metadata for observability
142
+ * @returns Discriminated union — check `result.ok` before accessing fields
143
+ */
144
+ apiRequest<TBody, TResponseSchema extends z.AnyZodObject>(options: ApiRequestOptions<TBody>, schema: SlackApiRequestSchema<TBody, TResponseSchema>, metadata?: TraceMetadata): Promise<SlackResponse<z.output<TResponseSchema>>>;
47
145
  }
146
+ export {};
48
147
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/integrations/slack/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE3D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuCG;AACH,MAAM,WAAW,WAAY,SAAQ,qBAAqB,EAAE,kBAAkB;CAE7E"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/integrations/slack/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AAC5D,OAAO,KAAK,EAAE,iBAAiB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAEzE;;;;;;GAMG;AACH,eAAO,MAAM,gBAAgB;;;;;;;;;;;;;;;EAK3B,CAAC;AAEH,uEAAuE;AACvE,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC;AAElE;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B;;;;;;EAErC,CAAC;AAEH;;;;GAIG;AACH,KAAK,kCAAkC,CAAC,OAAO,SAAS,CAAC,CAAC,YAAY,IACpE,OAAO,SAAS,CAAC,CAAC,SAAS,CACzB,MAAM,MAAM,EACZ,CAAC,CAAC,gBAAgB,EAClB,CAAC,CAAC,UAAU,EACZ,OAAO,EACP,OAAO,CACR,GACG,IAAI,SAAS,MAAM,MAAM,GACvB,IAAI,GACJ,KAAK,GACP,KAAK,CAAC;AAEZ,MAAM,MAAM,kBAAkB,CAAC,OAAO,SAAS,CAAC,CAAC,YAAY,IAC3D,kCAAkC,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,KAAK,GAAG,OAAO,CAAC;AAE7E;;;;GAIG;AACH,MAAM,WAAW,qBAAqB,CACpC,KAAK,EACL,eAAe,SAAS,CAAC,CAAC,YAAY;IAEtC,IAAI,CAAC,EAAE,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC1B,QAAQ,EAAE,kBAAkB,CAAC,eAAe,CAAC,CAAC;CAC/C;AAED,+DAA+D;AAC/D,MAAM,MAAM,oBAAoB,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IAAI,CAAC,GAAG;IACxE,QAAQ,CAAC,EAAE,EAAE,IAAI,CAAC;CACnB,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,IACvD,oBAAoB,CAAC,CAAC,CAAC,GACvB,kBAAkB,CAAC;AAEvB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,WAAY,SAAQ,qBAAqB;IACxD;;;;;;;;;;;;;;;;OAgBG;IACH,UAAU,CAAC,KAAK,EAAE,eAAe,SAAS,CAAC,CAAC,YAAY,EACtD,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC,EACjC,MAAM,EAAE,qBAAqB,CAAC,KAAK,EAAE,eAAe,CAAC,EACrD,QAAQ,CAAC,EAAE,aAAa,GACvB,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;CACtD"}
@@ -1,5 +1,31 @@
1
1
  /**
2
2
  * Slack client types.
3
+ *
4
+ * Defines the SlackResponse<T> discriminated union that wraps every
5
+ * Slack API call, plus the SlackClient interface consumers interact with.
3
6
  */
4
- export {};
7
+ import { z } from "zod";
8
+ /**
9
+ * Zod schema for Slack API error responses.
10
+ *
11
+ * Slack returns errors as HTTP 200 with `{ ok: false, error: "..." }`.
12
+ * For `missing_scope` errors, `needed` and `provided` list the
13
+ * required vs current OAuth scopes.
14
+ */
15
+ export const SlackErrorSchema = z.object({
16
+ ok: z.literal(false),
17
+ error: z.string(),
18
+ needed: z.string().optional(),
19
+ provided: z.string().optional(),
20
+ });
21
+ /**
22
+ * Zod schema for Slack success envelopes.
23
+ *
24
+ * Success responses from Slack include `{ ok: true, ...payload }`.
25
+ * Callers provide schemas for the payload fields only; the SDK validates
26
+ * this envelope separately and injects `ok: true` in the returned type.
27
+ */
28
+ export const SlackSuccessEnvelopeSchema = z.object({
29
+ ok: z.literal(true),
30
+ });
5
31
  //# sourceMappingURL=types.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/integrations/slack/types.ts"],"names":[],"mappings":"AAAA;;GAEG"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/integrations/slack/types.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC;IACpB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE;IACjB,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAC7B,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;CAChC,CAAC,CAAC;AAKH;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG,CAAC,CAAC,MAAM,CAAC;IACjD,EAAE,EAAE,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC;CACpB,CAAC,CAAC"}