@superblocksteam/sdk-api 2.0.105 → 2.0.106-next.0
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/README.md +439 -89
- package/dist/api/definition.d.ts +11 -6
- package/dist/api/definition.d.ts.map +1 -1
- package/dist/api/definition.js +19 -12
- package/dist/api/definition.js.map +1 -1
- package/dist/api/definition.test.js +39 -15
- package/dist/api/definition.test.js.map +1 -1
- package/dist/errors.d.ts +1 -1
- package/dist/errors.js +1 -1
- package/dist/index.d.ts +10 -11
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +9 -5
- package/dist/index.js.map +1 -1
- package/dist/integrations/base/index.d.ts +2 -1
- package/dist/integrations/base/index.d.ts.map +1 -1
- package/dist/integrations/base/index.js +1 -0
- package/dist/integrations/base/index.js.map +1 -1
- package/dist/integrations/base/rest-api-client-base.d.ts +48 -0
- package/dist/integrations/base/rest-api-client-base.d.ts.map +1 -0
- package/dist/integrations/base/rest-api-client-base.js +98 -0
- package/dist/integrations/base/rest-api-client-base.js.map +1 -0
- package/dist/integrations/base/rest-api-integration-client.d.ts +10 -20
- package/dist/integrations/base/rest-api-integration-client.d.ts.map +1 -1
- package/dist/integrations/base/rest-api-integration-client.js +10 -65
- package/dist/integrations/base/rest-api-integration-client.js.map +1 -1
- package/dist/integrations/box/types.d.ts +1 -1
- package/dist/integrations/declarations.d.ts +5 -73
- package/dist/integrations/declarations.d.ts.map +1 -1
- package/dist/integrations/declarations.js +5 -68
- package/dist/integrations/declarations.js.map +1 -1
- package/dist/integrations/documentation.test.js +0 -2
- package/dist/integrations/documentation.test.js.map +1 -1
- package/dist/integrations/googledrive/types.d.ts +1 -1
- package/dist/integrations/index.d.ts +1 -11
- package/dist/integrations/index.d.ts.map +1 -1
- package/dist/integrations/index.js +1 -7
- package/dist/integrations/index.js.map +1 -1
- package/dist/integrations/registry.d.ts +1 -11
- package/dist/integrations/registry.d.ts.map +1 -1
- package/dist/integrations/registry.js +0 -29
- package/dist/integrations/registry.js.map +1 -1
- package/dist/integrations/slack/client.d.ts +13 -9
- package/dist/integrations/slack/client.d.ts.map +1 -1
- package/dist/integrations/slack/client.js +60 -8
- package/dist/integrations/slack/client.js.map +1 -1
- package/dist/integrations/slack/client.test.d.ts +11 -0
- package/dist/integrations/slack/client.test.d.ts.map +1 -0
- package/dist/integrations/slack/client.test.js +368 -0
- package/dist/integrations/slack/client.test.js.map +1 -0
- package/dist/integrations/slack/index.d.ts +2 -1
- package/dist/integrations/slack/index.d.ts.map +1 -1
- package/dist/integrations/slack/index.js +1 -0
- package/dist/integrations/slack/index.js.map +1 -1
- package/dist/integrations/slack/types.d.ts +127 -28
- package/dist/integrations/slack/types.d.ts.map +1 -1
- package/dist/integrations/slack/types.js +27 -1
- package/dist/integrations/slack/types.js.map +1 -1
- package/dist/integrations/snowflake/client.d.ts +2 -2
- package/dist/integrations/snowflake/client.js +2 -2
- package/dist/runtime/context.d.ts +1 -1
- package/dist/runtime/executor.d.ts +2 -2
- package/dist/types.d.ts +15 -6
- package/dist/types.d.ts.map +1 -1
- package/package.json +2 -2
- package/src/api/definition.test.ts +40 -15
- package/src/api/definition.ts +19 -12
- package/src/errors.ts +1 -1
- package/src/index.ts +13 -33
- package/src/integrations/asana/README.md +12 -12
- package/src/integrations/base/index.ts +2 -1
- package/src/integrations/base/rest-api-client-base.ts +134 -0
- package/src/integrations/base/rest-api-integration-client.ts +12 -89
- package/src/integrations/bitbucket/README.md +19 -19
- package/src/integrations/box/README.md +24 -24
- package/src/integrations/box/types.ts +1 -1
- package/src/integrations/circleci/README.md +18 -18
- package/src/integrations/declarations.ts +5 -105
- package/src/integrations/documentation.test.ts +0 -2
- package/src/integrations/googledrive/README.md +25 -22
- package/src/integrations/googledrive/types.ts +1 -1
- package/src/integrations/graphql/README.md +2 -2
- package/src/integrations/groq/README.md +8 -8
- package/src/integrations/index.ts +0 -51
- package/src/integrations/perplexity/README.md +39 -48
- package/src/integrations/registry.ts +1 -39
- package/src/integrations/salesforce/README.md +11 -9
- package/src/integrations/slack/README.md +62 -19
- package/src/integrations/slack/client.test.ts +553 -0
- package/src/integrations/slack/client.ts +92 -12
- package/src/integrations/slack/index.ts +6 -1
- package/src/integrations/slack/types.ts +142 -29
- package/src/integrations/snowflake/client.ts +2 -2
- package/src/integrations/zoom/README.md +15 -15
- package/src/runtime/context.ts +1 -1
- package/src/runtime/executor.ts +2 -2
- package/src/types.ts +15 -6
- package/dist/integrations/couchbase/client.d.ts +0 -36
- package/dist/integrations/couchbase/client.d.ts.map +0 -1
- package/dist/integrations/couchbase/client.js +0 -148
- package/dist/integrations/couchbase/client.js.map +0 -1
- package/dist/integrations/couchbase/index.d.ts +0 -8
- package/dist/integrations/couchbase/index.d.ts.map +0 -1
- package/dist/integrations/couchbase/index.js +0 -7
- package/dist/integrations/couchbase/index.js.map +0 -1
- package/dist/integrations/couchbase/types.d.ts +0 -100
- package/dist/integrations/couchbase/types.d.ts.map +0 -1
- package/dist/integrations/couchbase/types.js +0 -5
- package/dist/integrations/couchbase/types.js.map +0 -1
- package/dist/integrations/kafka/client.d.ts +0 -25
- package/dist/integrations/kafka/client.d.ts.map +0 -1
- package/dist/integrations/kafka/client.js +0 -124
- package/dist/integrations/kafka/client.js.map +0 -1
- package/dist/integrations/kafka/index.d.ts +0 -8
- package/dist/integrations/kafka/index.d.ts.map +0 -1
- package/dist/integrations/kafka/index.js +0 -7
- package/dist/integrations/kafka/index.js.map +0 -1
- package/dist/integrations/kafka/types.d.ts +0 -113
- package/dist/integrations/kafka/types.d.ts.map +0 -1
- package/dist/integrations/kafka/types.js +0 -5
- package/dist/integrations/kafka/types.js.map +0 -1
- package/dist/integrations/kinesis/client.d.ts +0 -31
- package/dist/integrations/kinesis/client.d.ts.map +0 -1
- package/dist/integrations/kinesis/client.js +0 -101
- package/dist/integrations/kinesis/client.js.map +0 -1
- package/dist/integrations/kinesis/index.d.ts +0 -8
- package/dist/integrations/kinesis/index.d.ts.map +0 -1
- package/dist/integrations/kinesis/index.js +0 -7
- package/dist/integrations/kinesis/index.js.map +0 -1
- package/dist/integrations/kinesis/types.d.ts +0 -97
- package/dist/integrations/kinesis/types.d.ts.map +0 -1
- package/dist/integrations/kinesis/types.js +0 -7
- package/dist/integrations/kinesis/types.js.map +0 -1
- package/dist/integrations/python/client.d.ts +0 -42
- package/dist/integrations/python/client.d.ts.map +0 -1
- package/dist/integrations/python/client.js +0 -89
- package/dist/integrations/python/client.js.map +0 -1
- package/dist/integrations/python/client.test.d.ts +0 -5
- package/dist/integrations/python/client.test.d.ts.map +0 -1
- package/dist/integrations/python/client.test.js +0 -214
- package/dist/integrations/python/client.test.js.map +0 -1
- package/dist/integrations/python/index.d.ts +0 -6
- package/dist/integrations/python/index.d.ts.map +0 -1
- package/dist/integrations/python/index.js +0 -5
- package/dist/integrations/python/index.js.map +0 -1
- package/dist/integrations/python/types.d.ts +0 -85
- package/dist/integrations/python/types.d.ts.map +0 -1
- package/dist/integrations/python/types.js +0 -5
- package/dist/integrations/python/types.js.map +0 -1
- package/dist/integrations/redis/client.d.ts +0 -43
- package/dist/integrations/redis/client.d.ts.map +0 -1
- package/dist/integrations/redis/client.js +0 -142
- package/dist/integrations/redis/client.js.map +0 -1
- package/dist/integrations/redis/index.d.ts +0 -8
- package/dist/integrations/redis/index.d.ts.map +0 -1
- package/dist/integrations/redis/index.js +0 -7
- package/dist/integrations/redis/index.js.map +0 -1
- package/dist/integrations/redis/types.d.ts +0 -137
- package/dist/integrations/redis/types.d.ts.map +0 -1
- package/dist/integrations/redis/types.js +0 -5
- package/dist/integrations/redis/types.js.map +0 -1
- package/src/integrations/couchbase/README.md +0 -138
- package/src/integrations/couchbase/client.ts +0 -225
- package/src/integrations/couchbase/index.ts +0 -8
- package/src/integrations/couchbase/types.ts +0 -126
- package/src/integrations/kafka/README.md +0 -144
- package/src/integrations/kafka/client.ts +0 -216
- package/src/integrations/kafka/index.ts +0 -14
- package/src/integrations/kafka/types.ts +0 -128
- package/src/integrations/kinesis/README.md +0 -153
- package/src/integrations/kinesis/client.ts +0 -146
- package/src/integrations/kinesis/index.ts +0 -14
- package/src/integrations/kinesis/types.ts +0 -114
- package/src/integrations/python/README.md +0 -566
- package/src/integrations/python/client.test.ts +0 -341
- package/src/integrations/python/client.ts +0 -136
- package/src/integrations/python/index.ts +0 -6
- package/src/integrations/python/types.ts +0 -92
- package/src/integrations/redis/README.md +0 -200
- package/src/integrations/redis/client.ts +0 -208
- package/src/integrations/redis/index.ts +0 -8
- 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,
|
|
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 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/integrations/slack/index.ts"],"names":[],"mappings":"AAAA;;GAEG;
|
|
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 {
|
|
9
|
+
import type { ApiRequestOptions, TraceMetadata } from "../base/types.js";
|
|
6
10
|
/**
|
|
7
|
-
*
|
|
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
|
-
*
|
|
10
|
-
*
|
|
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
|
-
*
|
|
15
|
-
*
|
|
16
|
-
*
|
|
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
|
-
*
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
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:
|
|
39
|
-
* path:
|
|
40
|
-
*
|
|
112
|
+
* method: "POST",
|
|
113
|
+
* path: "/chat.postMessage",
|
|
114
|
+
* body: { channel: "#alerts", text: "Deployed!" },
|
|
41
115
|
* },
|
|
42
|
-
* { response:
|
|
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
|
|
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
|
|
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
|
-
|
|
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
|
|
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"}
|