@vercel/slack-bolt 1.2.5 → 1.3.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 +8 -5
- package/dist/{chunk-RCI377NU.js → chunk-JFHLS5RC.js} +57 -11
- package/dist/chunk-JFHLS5RC.js.map +1 -0
- package/dist/{chunk-BTCCJT7U.mjs → chunk-VNXFT255.mjs} +55 -11
- package/dist/chunk-VNXFT255.mjs.map +1 -0
- package/dist/cli.js +85 -48
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +46 -9
- package/dist/cli.mjs.map +1 -1
- package/dist/preview.d.mts +1 -0
- package/dist/preview.d.ts +1 -0
- package/dist/preview.js +3 -3
- package/dist/preview.mjs +2 -2
- package/package.json +2 -1
- package/dist/chunk-BTCCJT7U.mjs.map +0 -1
- package/dist/chunk-RCI377NU.js.map +0 -1
package/dist/cli.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
'use strict';
|
|
3
3
|
|
|
4
|
-
var
|
|
4
|
+
var chunkJFHLS5RC_js = require('./chunk-JFHLS5RC.js');
|
|
5
5
|
var chunkQHMZVK6J_js = require('./chunk-QHMZVK6J.js');
|
|
6
6
|
var zod = require('zod');
|
|
7
7
|
var fs = require('fs');
|
|
@@ -56,6 +56,7 @@ https://vercel.com/account/settings/tokens`
|
|
|
56
56
|
automationBypassSecret: systemResult.data.VERCEL_AUTOMATION_BYPASS_SECRET,
|
|
57
57
|
slackAppId: slackResult.data.SLACK_APP_ID,
|
|
58
58
|
slackConfigurationToken: slackResult.data.SLACK_CONFIGURATION_TOKEN,
|
|
59
|
+
slackConfigRefreshToken: slackResult.data.SLACK_CONFIG_REFRESH_TOKEN,
|
|
59
60
|
slackServiceToken: slackResult.data.SLACK_SERVICE_TOKEN,
|
|
60
61
|
manifestPath: slackResult.data.MANIFEST_PATH,
|
|
61
62
|
vercelApiToken: vercelResult.data.VERCEL_API_TOKEN
|
|
@@ -98,12 +99,12 @@ async function cleanupOrphanedApps({
|
|
|
98
99
|
teamId,
|
|
99
100
|
slackConfigurationToken
|
|
100
101
|
}) {
|
|
101
|
-
const activeBranches = await
|
|
102
|
+
const activeBranches = await chunkJFHLS5RC_js.getActiveBranches({
|
|
102
103
|
projectId,
|
|
103
104
|
token: vercelApiToken,
|
|
104
105
|
teamId
|
|
105
106
|
});
|
|
106
|
-
const envs = await
|
|
107
|
+
const envs = await chunkJFHLS5RC_js.getEnvironmentVariables({
|
|
107
108
|
projectId,
|
|
108
109
|
token: vercelApiToken,
|
|
109
110
|
teamId
|
|
@@ -115,65 +116,65 @@ async function cleanupOrphanedApps({
|
|
|
115
116
|
}
|
|
116
117
|
}
|
|
117
118
|
if (staleBranches.size === 0) {
|
|
118
|
-
|
|
119
|
+
chunkJFHLS5RC_js.log.info("No orphaned preview apps found");
|
|
119
120
|
return;
|
|
120
121
|
}
|
|
121
|
-
|
|
122
|
+
chunkJFHLS5RC_js.log.step(
|
|
122
123
|
`Found ${staleBranches.size} orphaned ${staleBranches.size === 1 ? "branch" : "branches"}`
|
|
123
124
|
);
|
|
124
125
|
for (const [branch, envId] of staleBranches) {
|
|
125
126
|
let appId = null;
|
|
126
127
|
try {
|
|
127
|
-
appId = await
|
|
128
|
+
appId = await chunkJFHLS5RC_js.getEnvironmentVariable({
|
|
128
129
|
projectId,
|
|
129
130
|
envId,
|
|
130
131
|
token: vercelApiToken,
|
|
131
132
|
teamId
|
|
132
133
|
});
|
|
133
134
|
} catch {
|
|
134
|
-
|
|
135
|
+
chunkJFHLS5RC_js.log.warning(`Failed to decrypt SLACK_APP_ID for branch ${branch}`);
|
|
135
136
|
}
|
|
136
137
|
if (appId) {
|
|
137
138
|
try {
|
|
138
|
-
await
|
|
139
|
+
await chunkJFHLS5RC_js.deleteSlackApp({
|
|
139
140
|
token: slackConfigurationToken,
|
|
140
141
|
appId
|
|
141
142
|
});
|
|
142
|
-
|
|
143
|
+
chunkJFHLS5RC_js.log.info(`${appId} deleted (branch: ${branch})`);
|
|
143
144
|
} catch (error) {
|
|
144
145
|
const msg = error instanceof Error ? error.message : String(error);
|
|
145
146
|
if (msg.includes("app_not_found")) {
|
|
146
|
-
|
|
147
|
+
chunkJFHLS5RC_js.log.info(`${appId} already deleted (branch: ${branch})`);
|
|
147
148
|
} else {
|
|
148
|
-
|
|
149
|
+
chunkJFHLS5RC_js.log.warning(`Failed to delete app ${appId}: ${msg}`);
|
|
149
150
|
}
|
|
150
151
|
}
|
|
151
152
|
}
|
|
152
153
|
for (const env of envs) {
|
|
153
154
|
if (env.id && env.gitBranch === branch && SLACK_ENV_VAR_KEYS.includes(env.key)) {
|
|
154
155
|
try {
|
|
155
|
-
await
|
|
156
|
+
await chunkJFHLS5RC_js.deleteEnvironmentVariable({
|
|
156
157
|
projectId,
|
|
157
158
|
envId: env.id,
|
|
158
159
|
token: vercelApiToken,
|
|
159
160
|
teamId
|
|
160
161
|
});
|
|
161
162
|
} catch (error) {
|
|
162
|
-
|
|
163
|
+
chunkJFHLS5RC_js.log.warning(
|
|
163
164
|
`Failed to delete env var ${env.key} for branch ${branch}: ${error instanceof Error ? error.message : error}`
|
|
164
165
|
);
|
|
165
166
|
}
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
169
|
}
|
|
169
|
-
|
|
170
|
+
chunkJFHLS5RC_js.log.success("Orphan cleanup completed");
|
|
170
171
|
}
|
|
171
172
|
var SLACK_ENV_VAR_KEYS;
|
|
172
173
|
var init_cleanup = chunkQHMZVK6J_js.__esm({
|
|
173
174
|
"src/cleanup.ts"() {
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
175
|
+
chunkJFHLS5RC_js.init_slack();
|
|
176
|
+
chunkJFHLS5RC_js.init_vercel();
|
|
177
|
+
chunkJFHLS5RC_js.init_logger();
|
|
177
178
|
SLACK_ENV_VAR_KEYS = [
|
|
178
179
|
"SLACK_APP_ID",
|
|
179
180
|
"SLACK_CLIENT_ID",
|
|
@@ -183,29 +184,64 @@ var init_cleanup = chunkQHMZVK6J_js.__esm({
|
|
|
183
184
|
];
|
|
184
185
|
}
|
|
185
186
|
});
|
|
186
|
-
async function executeBuild(params,
|
|
187
|
+
async function executeBuild(params, options) {
|
|
187
188
|
if (!params.slackConfigurationToken) {
|
|
188
189
|
throw new Error(
|
|
189
190
|
"Slack Configuration Token is not set. Generate a configuration token and add it as SLACK_CONFIGURATION_TOKEN in your Vercel project:\nhttps://api.slack.com/apps"
|
|
190
191
|
);
|
|
191
192
|
}
|
|
192
193
|
try {
|
|
193
|
-
await
|
|
194
|
+
await chunkJFHLS5RC_js.authTest({ token: params.slackConfigurationToken });
|
|
194
195
|
} catch (error) {
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
196
|
+
if (!params.slackConfigRefreshToken) {
|
|
197
|
+
throw new Error(
|
|
198
|
+
"Slack configuration token is invalid or expired. Provide SLACK_CONFIG_REFRESH_TOKEN for automatic rotation, or generate a new token:\nhttps://api.slack.com/apps",
|
|
199
|
+
{ cause: error }
|
|
200
|
+
);
|
|
201
|
+
}
|
|
202
|
+
chunkJFHLS5RC_js.log.step("Refreshing SLACK_CONFIGURATION_TOKEN");
|
|
203
|
+
try {
|
|
204
|
+
const rotated = await chunkJFHLS5RC_js.rotateConfigToken({
|
|
205
|
+
refreshToken: params.slackConfigRefreshToken
|
|
206
|
+
});
|
|
207
|
+
params.slackConfigurationToken = rotated.token;
|
|
208
|
+
params.slackConfigRefreshToken = rotated.refreshToken;
|
|
209
|
+
await chunkJFHLS5RC_js.addEnvironmentVariables({
|
|
210
|
+
projectId: params.projectId,
|
|
211
|
+
token: params.vercelApiToken,
|
|
212
|
+
teamId: params.teamId,
|
|
213
|
+
envs: [
|
|
214
|
+
{
|
|
215
|
+
key: "SLACK_CONFIGURATION_TOKEN",
|
|
216
|
+
value: rotated.token,
|
|
217
|
+
type: "encrypted",
|
|
218
|
+
target: ["production", "preview", "development"]
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
key: "SLACK_CONFIG_REFRESH_TOKEN",
|
|
222
|
+
value: rotated.refreshToken,
|
|
223
|
+
type: "encrypted",
|
|
224
|
+
target: ["production", "preview", "development"]
|
|
225
|
+
}
|
|
226
|
+
]
|
|
227
|
+
});
|
|
228
|
+
chunkJFHLS5RC_js.log.success("Configuration token rotated and persisted");
|
|
229
|
+
} catch (rotateError) {
|
|
230
|
+
throw new Error(
|
|
231
|
+
"Failed to rotate configuration token \u2014 refresh token may be invalid. Generate new tokens:\nhttps://api.slack.com/apps",
|
|
232
|
+
{ cause: rotateError }
|
|
233
|
+
);
|
|
234
|
+
}
|
|
199
235
|
}
|
|
200
236
|
if (params.slackServiceToken) {
|
|
201
237
|
try {
|
|
202
|
-
await
|
|
238
|
+
await chunkJFHLS5RC_js.authTest({ token: params.slackServiceToken });
|
|
203
239
|
} catch (error) {
|
|
204
|
-
|
|
240
|
+
chunkJFHLS5RC_js.log.warning(
|
|
205
241
|
"SLACK_SERVICE_TOKEN is invalid \u2014 app must be installed manually"
|
|
206
242
|
);
|
|
207
|
-
|
|
208
|
-
|
|
243
|
+
chunkJFHLS5RC_js.log.info("https://docs.slack.dev/authentication/tokens/#service");
|
|
244
|
+
chunkJFHLS5RC_js.log.debug(error);
|
|
209
245
|
}
|
|
210
246
|
}
|
|
211
247
|
if (!params.branch) {
|
|
@@ -214,7 +250,7 @@ async function executeBuild(params, version, options) {
|
|
|
214
250
|
);
|
|
215
251
|
}
|
|
216
252
|
try {
|
|
217
|
-
await
|
|
253
|
+
await chunkJFHLS5RC_js.getProject({
|
|
218
254
|
projectId: params.projectId,
|
|
219
255
|
token: params.vercelApiToken,
|
|
220
256
|
teamId: params.teamId
|
|
@@ -228,12 +264,12 @@ async function executeBuild(params, version, options) {
|
|
|
228
264
|
const manifestFullPath = path__default.default.join(process.cwd(), params.manifestPath);
|
|
229
265
|
if (!fs__default.default.existsSync(manifestFullPath)) {
|
|
230
266
|
throw new Error(
|
|
231
|
-
`No manifest found at ${params.manifestPath}. Create a manifest.json file with your Slack app configuration:
|
|
267
|
+
`No manifest found at ${params.manifestPath}. Create a manifest.json (or manifest.yaml) file with your Slack app configuration:
|
|
232
268
|
https://docs.slack.dev/reference/manifests`
|
|
233
269
|
);
|
|
234
270
|
}
|
|
235
271
|
if (options?.cleanup) {
|
|
236
|
-
|
|
272
|
+
chunkJFHLS5RC_js.log.step("Cleaning up orphaned preview apps");
|
|
237
273
|
try {
|
|
238
274
|
await cleanupOrphanedApps({
|
|
239
275
|
projectId: params.projectId,
|
|
@@ -243,23 +279,23 @@ https://docs.slack.dev/reference/manifests`
|
|
|
243
279
|
slackConfigurationToken: params.slackConfigurationToken
|
|
244
280
|
});
|
|
245
281
|
} catch (error) {
|
|
246
|
-
|
|
282
|
+
chunkJFHLS5RC_js.log.warning(
|
|
247
283
|
`Orphan cleanup failed: ${error instanceof Error ? error.message : error}`
|
|
248
284
|
);
|
|
249
285
|
}
|
|
250
286
|
}
|
|
251
|
-
const result = await
|
|
287
|
+
const result = await chunkJFHLS5RC_js.preview(params, "cli");
|
|
252
288
|
if (result.isNew && params.deploymentId) {
|
|
253
|
-
|
|
254
|
-
const { id, url } = await
|
|
289
|
+
chunkJFHLS5RC_js.log.step("Creating new deployment to pick up new environment variables");
|
|
290
|
+
const { id, url } = await chunkJFHLS5RC_js.createDeployment({
|
|
255
291
|
deploymentId: params.deploymentId,
|
|
256
292
|
projectId: params.projectId,
|
|
257
293
|
token: params.vercelApiToken,
|
|
258
294
|
teamId: params.teamId
|
|
259
295
|
});
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
await
|
|
296
|
+
chunkJFHLS5RC_js.log.success(`New deployment created: ${url} (${id})`);
|
|
297
|
+
chunkJFHLS5RC_js.log.step("Cancelling current deployment");
|
|
298
|
+
await chunkJFHLS5RC_js.cancelDeployment({
|
|
263
299
|
deploymentId: params.deploymentId,
|
|
264
300
|
token: params.vercelApiToken,
|
|
265
301
|
teamId: params.teamId
|
|
@@ -269,10 +305,10 @@ https://docs.slack.dev/reference/manifests`
|
|
|
269
305
|
var init_build = chunkQHMZVK6J_js.__esm({
|
|
270
306
|
"src/cli/build.ts"() {
|
|
271
307
|
init_cleanup();
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
308
|
+
chunkJFHLS5RC_js.init_slack();
|
|
309
|
+
chunkJFHLS5RC_js.init_vercel();
|
|
310
|
+
chunkJFHLS5RC_js.init_logger();
|
|
311
|
+
chunkJFHLS5RC_js.init_preview();
|
|
276
312
|
}
|
|
277
313
|
});
|
|
278
314
|
|
|
@@ -336,12 +372,12 @@ function run(version) {
|
|
|
336
372
|
const debug = program.opts().debug === true || process.env.VERCEL_SLACK_DEBUG === "1" || process.env.VERCEL_SLACK_DEBUG === "true";
|
|
337
373
|
if (debug) {
|
|
338
374
|
process.env.VERCEL_SLACK_DEBUG = "1";
|
|
339
|
-
|
|
375
|
+
chunkJFHLS5RC_js.enableFetchDebugLogging();
|
|
340
376
|
}
|
|
341
377
|
const cleanup = options.cleanup === true;
|
|
342
378
|
const env = resolveEnv(options);
|
|
343
379
|
console.log(
|
|
344
|
-
|
|
380
|
+
chunkJFHLS5RC_js.startMessage(
|
|
345
381
|
version,
|
|
346
382
|
env.VERCEL_GIT_COMMIT_REF,
|
|
347
383
|
env.VERCEL_GIT_COMMIT_SHA,
|
|
@@ -353,22 +389,22 @@ function run(version) {
|
|
|
353
389
|
const isProd = env.VERCEL_ENV === "production";
|
|
354
390
|
if (isLocal || isDev || isProd) {
|
|
355
391
|
const reason = isLocal ? "local" : isDev ? "development" : "production";
|
|
356
|
-
|
|
392
|
+
chunkJFHLS5RC_js.log.info(`Environment: ${reason} (skipped)
|
|
357
393
|
`);
|
|
358
394
|
return;
|
|
359
395
|
}
|
|
360
396
|
const params = validateAndBuildParams(env);
|
|
361
|
-
await executeBuild(params,
|
|
397
|
+
await executeBuild(params, { cleanup });
|
|
362
398
|
});
|
|
363
399
|
program.parseAsync().catch((error) => {
|
|
364
|
-
|
|
400
|
+
chunkJFHLS5RC_js.log.error(error instanceof Error ? error.message : String(error));
|
|
365
401
|
console.log();
|
|
366
402
|
});
|
|
367
403
|
}
|
|
368
404
|
var init_cli = chunkQHMZVK6J_js.__esm({
|
|
369
405
|
"src/cli/index.ts"() {
|
|
370
406
|
init_schemas();
|
|
371
|
-
|
|
407
|
+
chunkJFHLS5RC_js.init_logger();
|
|
372
408
|
init_build();
|
|
373
409
|
init_env();
|
|
374
410
|
}
|
|
@@ -379,7 +415,7 @@ var require_package = chunkQHMZVK6J_js.__commonJS({
|
|
|
379
415
|
"package.json"(exports$1, module) {
|
|
380
416
|
module.exports = {
|
|
381
417
|
name: "@vercel/slack-bolt",
|
|
382
|
-
version: "1.
|
|
418
|
+
version: "1.3.0",
|
|
383
419
|
description: "A Vercel receiver for building Slack apps with Bolt and deploying them to Vercel",
|
|
384
420
|
main: "./dist/index.js",
|
|
385
421
|
types: "./dist/index.d.ts",
|
|
@@ -443,6 +479,7 @@ var require_package = chunkQHMZVK6J_js.__commonJS({
|
|
|
443
479
|
"@slack/logger": "^4.0.0",
|
|
444
480
|
"@vercel/functions": "^3.4.3",
|
|
445
481
|
commander: "^14.0.3",
|
|
482
|
+
yaml: "^2.8.2",
|
|
446
483
|
zod: "^4.3.6"
|
|
447
484
|
},
|
|
448
485
|
devDependencies: {
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/internal/schemas.ts","../src/cleanup.ts","../src/cli/build.ts","../src/cli/env.ts","../src/cli/index.ts","../package.json","../src/cli.ts"],"names":["__esm","z","getActiveBranches","getEnvironmentVariables","log","getEnvironmentVariable","deleteSlackApp","deleteEnvironmentVariable","init_slack","init_vercel","init_logger","authTest","getProject","path","fs","preview","createDeployment","cancelDeployment","init_preview","Command","enableFetchDebugLogging","startMessage","__commonJS","exports"],"mappings":"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","file":"cli.js","sourcesContent":["import { z } from \"zod\";\nimport type { PreviewParams } from \"../preview\";\n\nexport function formatMissingKeys(error: z.ZodError): string {\n return error.issues.map((i) => i.path.join(\".\")).join(\", \");\n}\n\nexport const systemEnvSchema = z.object({\n VERCEL_ENV: z.enum([\"production\", \"preview\", \"development\"]),\n VERCEL_GIT_COMMIT_REF: z.string(),\n VERCEL_PROJECT_ID: z.string(),\n VERCEL_URL: z.string(),\n VERCEL_BRANCH_URL: z.string().optional(),\n VERCEL_TEAM_ID: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_DEPLOYMENT_ID: z.string().optional(),\n VERCEL_AUTOMATION_BYPASS_SECRET: z.string().optional(),\n});\n\nexport const slackEnvSchema = z.object({\n SLACK_APP_ID: z.string().optional(),\n SLACK_CONFIGURATION_TOKEN: z.string(),\n SLACK_SERVICE_TOKEN: z.string().optional(),\n SLACK_CONFIG_REFRESH_TOKEN: z.string().optional(),\n MANIFEST_PATH: z.string().default(\"manifest.json\"),\n});\n\nexport const vercelEnvSchema = z.object({\n VERCEL_API_TOKEN: z.string(),\n});\n\nexport function validateAndBuildParams(\n env: Record<string, string | undefined>,\n): PreviewParams {\n const systemResult = systemEnvSchema.safeParse(env);\n if (!systemResult.success) {\n const missing = formatMissingKeys(systemResult.error);\n throw new Error(\n `Missing Vercel system environment variables: ${missing}\\nEnable 'Automatically expose System Environment Variables' in your Vercel project settings:\\nhttps://vercel.com/docs/projects/environment-variables/system-environment-variables`,\n );\n }\n\n const slackResult = slackEnvSchema.safeParse(env);\n if (!slackResult.success) {\n const missing = formatMissingKeys(slackResult.error);\n throw new Error(\n `Missing Slack environment variables: ${missing}\\nAdd them as environment variables in your Vercel project.`,\n );\n }\n\n const vercelResult = vercelEnvSchema.safeParse(env);\n if (!vercelResult.success) {\n const missing = formatMissingKeys(vercelResult.error);\n throw new Error(\n `Missing Vercel environment variables: ${missing}\\nCreate a new token and add it as VERCEL_API_TOKEN in your Vercel project:\\nhttps://vercel.com/account/settings/tokens`,\n );\n }\n\n return {\n branch: systemResult.data.VERCEL_GIT_COMMIT_REF,\n projectId: systemResult.data.VERCEL_PROJECT_ID,\n deploymentUrl: systemResult.data.VERCEL_URL,\n branchUrl: systemResult.data.VERCEL_BRANCH_URL,\n teamId: systemResult.data.VERCEL_TEAM_ID,\n commitSha: systemResult.data.VERCEL_GIT_COMMIT_SHA,\n commitMessage: systemResult.data.VERCEL_GIT_COMMIT_MESSAGE,\n commitAuthor: systemResult.data.VERCEL_GIT_COMMIT_AUTHOR_LOGIN,\n deploymentId: systemResult.data.VERCEL_DEPLOYMENT_ID,\n automationBypassSecret: systemResult.data.VERCEL_AUTOMATION_BYPASS_SECRET,\n slackAppId: slackResult.data.SLACK_APP_ID,\n slackConfigurationToken: slackResult.data.SLACK_CONFIGURATION_TOKEN,\n slackServiceToken: slackResult.data.SLACK_SERVICE_TOKEN,\n manifestPath: slackResult.data.MANIFEST_PATH,\n vercelApiToken: vercelResult.data.VERCEL_API_TOKEN,\n };\n}\n","import { deleteSlackApp } from \"./internal/slack\";\nimport {\n deleteEnvironmentVariable,\n getActiveBranches,\n getEnvironmentVariable,\n getEnvironmentVariables,\n} from \"./internal/vercel\";\nimport { log } from \"./logger\";\n\nconst SLACK_ENV_VAR_KEYS = [\n \"SLACK_APP_ID\",\n \"SLACK_CLIENT_ID\",\n \"SLACK_CLIENT_SECRET\",\n \"SLACK_SIGNING_SECRET\",\n \"SLACK_BOT_TOKEN\",\n];\n\nexport async function cleanupOrphanedApps({\n projectId,\n currentBranch,\n vercelApiToken,\n teamId,\n slackConfigurationToken,\n}: {\n projectId: string;\n currentBranch: string;\n vercelApiToken: string;\n teamId?: string;\n slackConfigurationToken: string;\n}): Promise<void> {\n const activeBranches = await getActiveBranches({\n projectId,\n token: vercelApiToken,\n teamId,\n });\n\n const envs = await getEnvironmentVariables({\n projectId,\n token: vercelApiToken,\n teamId,\n });\n\n const staleBranches = new Map<string, string>();\n for (const env of envs) {\n if (\n env.key === \"SLACK_APP_ID\" &&\n env.gitBranch &&\n env.gitBranch !== currentBranch &&\n !activeBranches.has(env.gitBranch)\n ) {\n staleBranches.set(env.gitBranch, env.id);\n }\n }\n\n if (staleBranches.size === 0) {\n log.info(\"No orphaned preview apps found\");\n return;\n }\n\n log.step(\n `Found ${staleBranches.size} orphaned ${staleBranches.size === 1 ? \"branch\" : \"branches\"}`,\n );\n\n for (const [branch, envId] of staleBranches) {\n let appId: string | null = null;\n try {\n appId = await getEnvironmentVariable({\n projectId,\n envId,\n token: vercelApiToken,\n teamId,\n });\n } catch {\n log.warning(`Failed to decrypt SLACK_APP_ID for branch ${branch}`);\n }\n\n if (appId) {\n try {\n await deleteSlackApp({\n token: slackConfigurationToken,\n appId,\n });\n log.info(`${appId} deleted (branch: ${branch})`);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"app_not_found\")) {\n log.info(`${appId} already deleted (branch: ${branch})`);\n } else {\n log.warning(`Failed to delete app ${appId}: ${msg}`);\n }\n }\n }\n\n for (const env of envs) {\n if (\n env.id &&\n env.gitBranch === branch &&\n SLACK_ENV_VAR_KEYS.includes(env.key)\n ) {\n try {\n await deleteEnvironmentVariable({\n projectId,\n envId: env.id,\n token: vercelApiToken,\n teamId,\n });\n } catch (error) {\n log.warning(\n `Failed to delete env var ${env.key} for branch ${branch}: ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n }\n }\n\n log.success(\"Orphan cleanup completed\");\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { cleanupOrphanedApps } from \"../cleanup\";\nimport { authTest } from \"../internal/slack\";\nimport {\n cancelDeployment,\n createDeployment,\n getProject,\n} from \"../internal/vercel\";\nimport { log } from \"../logger\";\nimport { type PreviewParams, preview } from \"../preview\";\n\nexport async function executeBuild(\n params: PreviewParams,\n version: string,\n options?: { cleanup?: boolean },\n): Promise<void> {\n if (!params.slackConfigurationToken) {\n throw new Error(\n \"Slack Configuration Token is not set. Generate a configuration token and add it as SLACK_CONFIGURATION_TOKEN in your Vercel project:\\nhttps://api.slack.com/apps\",\n );\n }\n\n try {\n await authTest({ token: params.slackConfigurationToken });\n } catch (error) {\n throw new Error(\n \"Slack configuration token is invalid or expired. Generate a new configuration token and add it as SLACK_CONFIGURATION_TOKEN in your Vercel project:\\nhttps://api.slack.com/apps\",\n { cause: error },\n );\n }\n\n if (params.slackServiceToken) {\n try {\n await authTest({ token: params.slackServiceToken });\n } catch (error) {\n log.warning(\n \"SLACK_SERVICE_TOKEN is invalid — app must be installed manually\",\n );\n log.info(\"https://docs.slack.dev/authentication/tokens/#service\");\n log.debug(error);\n }\n }\n\n if (!params.branch) {\n throw new Error(\n \"VERCEL_GIT_COMMIT_REF is not set — connect your Git repository in your Vercel project settings.\\nhttps://vercel.com/docs/git\",\n );\n }\n\n try {\n await getProject({\n projectId: params.projectId,\n token: params.vercelApiToken,\n teamId: params.teamId,\n });\n } catch (error) {\n throw new Error(\n \"Vercel API token cannot access this project. Ensure VERCEL_API_TOKEN is valid and has access to this team:\\nhttps://vercel.com/account/settings/tokens\",\n { cause: error },\n );\n }\n\n const manifestFullPath = path.join(process.cwd(), params.manifestPath);\n if (!fs.existsSync(manifestFullPath)) {\n throw new Error(\n `No manifest found at ${params.manifestPath}. Create a manifest.json file with your Slack app configuration:\\nhttps://docs.slack.dev/reference/manifests`,\n );\n }\n\n if (options?.cleanup) {\n log.step(\"Cleaning up orphaned preview apps\");\n try {\n await cleanupOrphanedApps({\n projectId: params.projectId,\n currentBranch: params.branch,\n vercelApiToken: params.vercelApiToken,\n teamId: params.teamId,\n slackConfigurationToken: params.slackConfigurationToken,\n });\n } catch (error) {\n log.warning(\n `Orphan cleanup failed: ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n\n const result = await preview(params, \"cli\");\n\n if (result.isNew && params.deploymentId) {\n log.step(\"Creating new deployment to pick up new environment variables\");\n const { id, url } = await createDeployment({\n deploymentId: params.deploymentId,\n projectId: params.projectId,\n token: params.vercelApiToken,\n teamId: params.teamId,\n });\n log.success(`New deployment created: ${url} (${id})`);\n\n log.step(\"Cancelling current deployment\");\n await cancelDeployment({\n deploymentId: params.deploymentId,\n token: params.vercelApiToken,\n teamId: params.teamId,\n });\n }\n}\n","export const ENV_KEYS = [\n \"VERCEL_ENV\",\n \"VERCEL_GIT_COMMIT_REF\",\n \"VERCEL_PROJECT_ID\",\n \"VERCEL_URL\",\n \"VERCEL_BRANCH_URL\",\n \"VERCEL_TEAM_ID\",\n \"VERCEL_GIT_COMMIT_SHA\",\n \"VERCEL_GIT_COMMIT_MESSAGE\",\n \"VERCEL_GIT_COMMIT_AUTHOR_LOGIN\",\n \"VERCEL_DEPLOYMENT_ID\",\n \"VERCEL_AUTOMATION_BYPASS_SECRET\",\n \"SLACK_APP_ID\",\n \"SLACK_CONFIGURATION_TOKEN\",\n \"SLACK_SERVICE_TOKEN\",\n \"SLACK_CONFIG_REFRESH_TOKEN\",\n \"MANIFEST_PATH\",\n \"VERCEL_API_TOKEN\",\n] as const;\n\nexport function envKeyToFlag(key: string): string {\n return key.toLowerCase().replace(/_/g, \"-\");\n}\n\nfunction flagToCamelCase(flag: string): string {\n return flag.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\nexport function resolveEnv(\n options: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n const overrides: Record<string, string> = {};\n for (const key of ENV_KEYS) {\n const camelKey = flagToCamelCase(envKeyToFlag(key));\n const value = options[camelKey];\n if (typeof value === \"string\") {\n overrides[key] = value;\n }\n }\n return { ...process.env, ...overrides };\n}\n","import { Command } from \"commander\";\nimport { validateAndBuildParams } from \"../internal/schemas\";\nimport { enableFetchDebugLogging, log, startMessage } from \"../logger\";\nimport { executeBuild } from \"./build\";\nimport { ENV_KEYS, envKeyToFlag, resolveEnv } from \"./env\";\n\nexport function run(version: string): void {\n const program = new Command()\n .name(\"vercel-slack\")\n .description(\n \"Build and configure Slack apps for Vercel preview deployments\",\n )\n .version(version)\n .option(\"--debug\", \"Enable verbose debug logging for all HTTP requests\");\n\n const cmd = program\n .command(\"build\")\n .description(\n \"Build and configure the Slack app for a Vercel preview deployment\",\n );\n\n for (const key of ENV_KEYS) {\n cmd.option(`--${envKeyToFlag(key)} <value>`, `Override ${key}`);\n }\n\n cmd.option(\n \"--cleanup\",\n \"Clean up Slack apps and env vars for inactive preview branches\",\n );\n\n cmd.action(async (options: Record<string, string | boolean | undefined>) => {\n const debug =\n program.opts().debug === true ||\n process.env.VERCEL_SLACK_DEBUG === \"1\" ||\n process.env.VERCEL_SLACK_DEBUG === \"true\";\n if (debug) {\n process.env.VERCEL_SLACK_DEBUG = \"1\";\n enableFetchDebugLogging();\n }\n\n const cleanup = options.cleanup === true;\n const env = resolveEnv(options as Record<string, string | undefined>);\n\n console.log(\n startMessage(\n version,\n env.VERCEL_GIT_COMMIT_REF,\n env.VERCEL_GIT_COMMIT_SHA,\n env.SLACK_APP_ID,\n ),\n );\n\n const isLocal = !env.VERCEL_ENV;\n const isDev =\n env.VERCEL_ENV === \"development\" || env.NODE_ENV === \"development\";\n const isProd = env.VERCEL_ENV === \"production\";\n\n if (isLocal || isDev || isProd) {\n const reason = isLocal ? \"local\" : isDev ? \"development\" : \"production\";\n log.info(`Environment: ${reason} (skipped)\\n`);\n return;\n }\n\n const params = validateAndBuildParams(env);\n await executeBuild(params, version, { cleanup });\n });\n\n program.parseAsync().catch((error: unknown) => {\n log.error(error instanceof Error ? error.message : String(error));\n console.log();\n });\n}\n","{\n\t\"name\": \"@vercel/slack-bolt\",\n\t\"version\": \"1.2.5\",\n\t\"description\": \"A Vercel receiver for building Slack apps with Bolt and deploying them to Vercel\",\n\t\"main\": \"./dist/index.js\",\n\t\"types\": \"./dist/index.d.ts\",\n\t\"type\": \"commonjs\",\n\t\"bin\": {\n\t\t\"vercel-slack\": \"./bin/vercel-slack.js\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/index.d.ts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"require\": \"./dist/index.js\"\n\t\t},\n\t\t\"./preview\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/preview.d.mts\",\n\t\t\t\t\"require\": \"./dist/preview.d.ts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/preview.mjs\",\n\t\t\t\"require\": \"./dist/preview.js\"\n\t\t}\n\t},\n\t\"typesVersions\": {\n\t\t\"*\": {\n\t\t\t\"preview\": [\n\t\t\t\t\"./dist/preview.d.ts\"\n\t\t\t]\n\t\t}\n\t},\n\t\"files\": [\n\t\t\"bin\",\n\t\t\"dist\"\n\t],\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/vercel-labs/slack-bolt\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/vercel-labs/slack-bolt/issues\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"tsup\",\n\t\t\"dev\": \"tsup --watch\",\n\t\t\"test\": \"vitest run\",\n\t\t\"test:watch\": \"vitest watch\",\n\t\t\"lint\": \"biome check .\",\n\t\t\"lint:fix\": \"biome check . --write\",\n\t\t\"attw\": \"attw --pack .\"\n\t},\n\t\"keywords\": [\n\t\t\"vercel\",\n\t\t\"bolt\",\n\t\t\"slack\"\n\t],\n\t\"author\": \"Vercel\",\n\t\"license\": \"MIT\",\n\t\"dependencies\": {\n\t\t\"@slack/logger\": \"^4.0.0\",\n\t\t\"@vercel/functions\": \"^3.4.3\",\n\t\t\"commander\": \"^14.0.3\",\n\t\t\"zod\": \"^4.3.6\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@arethetypeswrong/cli\": \"^0.18.2\",\n\t\t\"@biomejs/biome\": \"2.2.2\",\n\t\t\"@types/node\": \"^20.19.35\",\n\t\t\"@vitest/coverage-v8\": \"4.0.18\",\n\t\t\"tsup\": \"^8.5.1\",\n\t\t\"tsx\": \"^4.21.0\",\n\t\t\"typescript\": \"^5.9.3\",\n\t\t\"vitest\": \"^4.0.18\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@slack/bolt\": \"^4.4.0\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"@slack/bolt\": {\n\t\t\t\"optional\": false\n\t\t}\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=20.0.0\"\n\t},\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t}\n}\n","#!/usr/bin/env node\nimport { run } from \"./cli/index\";\n\nconst { version } = require(\"../package.json\") as { version: string };\n\nrun(version);\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/internal/schemas.ts","../src/cleanup.ts","../src/cli/build.ts","../src/cli/env.ts","../src/cli/index.ts","../package.json","../src/cli.ts"],"names":["__esm","z","getActiveBranches","getEnvironmentVariables","log","getEnvironmentVariable","deleteSlackApp","deleteEnvironmentVariable","init_slack","init_vercel","init_logger","authTest","rotateConfigToken","addEnvironmentVariables","getProject","path","fs","preview","createDeployment","cancelDeployment","init_preview","Command","enableFetchDebugLogging","startMessage","__commonJS","exports"],"mappings":"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","file":"cli.js","sourcesContent":["import { z } from \"zod\";\nimport type { PreviewParams } from \"../preview\";\n\nexport function formatMissingKeys(error: z.ZodError): string {\n return error.issues.map((i) => i.path.join(\".\")).join(\", \");\n}\n\nexport const systemEnvSchema = z.object({\n VERCEL_ENV: z.enum([\"production\", \"preview\", \"development\"]),\n VERCEL_GIT_COMMIT_REF: z.string(),\n VERCEL_PROJECT_ID: z.string(),\n VERCEL_URL: z.string(),\n VERCEL_BRANCH_URL: z.string().optional(),\n VERCEL_TEAM_ID: z.string().optional(),\n VERCEL_GIT_COMMIT_SHA: z.string().optional(),\n VERCEL_GIT_COMMIT_MESSAGE: z.string().optional(),\n VERCEL_GIT_COMMIT_AUTHOR_LOGIN: z.string().optional(),\n VERCEL_DEPLOYMENT_ID: z.string().optional(),\n VERCEL_AUTOMATION_BYPASS_SECRET: z.string().optional(),\n});\n\nexport const slackEnvSchema = z.object({\n SLACK_APP_ID: z.string().optional(),\n SLACK_CONFIGURATION_TOKEN: z.string(),\n SLACK_SERVICE_TOKEN: z.string().optional(),\n SLACK_CONFIG_REFRESH_TOKEN: z.string().optional(),\n MANIFEST_PATH: z.string().default(\"manifest.json\"),\n});\n\nexport const vercelEnvSchema = z.object({\n VERCEL_API_TOKEN: z.string(),\n});\n\nexport function validateAndBuildParams(\n env: Record<string, string | undefined>,\n): PreviewParams {\n const systemResult = systemEnvSchema.safeParse(env);\n if (!systemResult.success) {\n const missing = formatMissingKeys(systemResult.error);\n throw new Error(\n `Missing Vercel system environment variables: ${missing}\\nEnable 'Automatically expose System Environment Variables' in your Vercel project settings:\\nhttps://vercel.com/docs/projects/environment-variables/system-environment-variables`,\n );\n }\n\n const slackResult = slackEnvSchema.safeParse(env);\n if (!slackResult.success) {\n const missing = formatMissingKeys(slackResult.error);\n throw new Error(\n `Missing Slack environment variables: ${missing}\\nAdd them as environment variables in your Vercel project.`,\n );\n }\n\n const vercelResult = vercelEnvSchema.safeParse(env);\n if (!vercelResult.success) {\n const missing = formatMissingKeys(vercelResult.error);\n throw new Error(\n `Missing Vercel environment variables: ${missing}\\nCreate a new token and add it as VERCEL_API_TOKEN in your Vercel project:\\nhttps://vercel.com/account/settings/tokens`,\n );\n }\n\n return {\n branch: systemResult.data.VERCEL_GIT_COMMIT_REF,\n projectId: systemResult.data.VERCEL_PROJECT_ID,\n deploymentUrl: systemResult.data.VERCEL_URL,\n branchUrl: systemResult.data.VERCEL_BRANCH_URL,\n teamId: systemResult.data.VERCEL_TEAM_ID,\n commitSha: systemResult.data.VERCEL_GIT_COMMIT_SHA,\n commitMessage: systemResult.data.VERCEL_GIT_COMMIT_MESSAGE,\n commitAuthor: systemResult.data.VERCEL_GIT_COMMIT_AUTHOR_LOGIN,\n deploymentId: systemResult.data.VERCEL_DEPLOYMENT_ID,\n automationBypassSecret: systemResult.data.VERCEL_AUTOMATION_BYPASS_SECRET,\n slackAppId: slackResult.data.SLACK_APP_ID,\n slackConfigurationToken: slackResult.data.SLACK_CONFIGURATION_TOKEN,\n slackConfigRefreshToken: slackResult.data.SLACK_CONFIG_REFRESH_TOKEN,\n slackServiceToken: slackResult.data.SLACK_SERVICE_TOKEN,\n manifestPath: slackResult.data.MANIFEST_PATH,\n vercelApiToken: vercelResult.data.VERCEL_API_TOKEN,\n };\n}\n","import { deleteSlackApp } from \"./internal/slack\";\nimport {\n deleteEnvironmentVariable,\n getActiveBranches,\n getEnvironmentVariable,\n getEnvironmentVariables,\n} from \"./internal/vercel\";\nimport { log } from \"./logger\";\n\nconst SLACK_ENV_VAR_KEYS = [\n \"SLACK_APP_ID\",\n \"SLACK_CLIENT_ID\",\n \"SLACK_CLIENT_SECRET\",\n \"SLACK_SIGNING_SECRET\",\n \"SLACK_BOT_TOKEN\",\n];\n\nexport async function cleanupOrphanedApps({\n projectId,\n currentBranch,\n vercelApiToken,\n teamId,\n slackConfigurationToken,\n}: {\n projectId: string;\n currentBranch: string;\n vercelApiToken: string;\n teamId?: string;\n slackConfigurationToken: string;\n}): Promise<void> {\n const activeBranches = await getActiveBranches({\n projectId,\n token: vercelApiToken,\n teamId,\n });\n\n const envs = await getEnvironmentVariables({\n projectId,\n token: vercelApiToken,\n teamId,\n });\n\n const staleBranches = new Map<string, string>();\n for (const env of envs) {\n if (\n env.key === \"SLACK_APP_ID\" &&\n env.gitBranch &&\n env.gitBranch !== currentBranch &&\n !activeBranches.has(env.gitBranch)\n ) {\n staleBranches.set(env.gitBranch, env.id);\n }\n }\n\n if (staleBranches.size === 0) {\n log.info(\"No orphaned preview apps found\");\n return;\n }\n\n log.step(\n `Found ${staleBranches.size} orphaned ${staleBranches.size === 1 ? \"branch\" : \"branches\"}`,\n );\n\n for (const [branch, envId] of staleBranches) {\n let appId: string | null = null;\n try {\n appId = await getEnvironmentVariable({\n projectId,\n envId,\n token: vercelApiToken,\n teamId,\n });\n } catch {\n log.warning(`Failed to decrypt SLACK_APP_ID for branch ${branch}`);\n }\n\n if (appId) {\n try {\n await deleteSlackApp({\n token: slackConfigurationToken,\n appId,\n });\n log.info(`${appId} deleted (branch: ${branch})`);\n } catch (error) {\n const msg = error instanceof Error ? error.message : String(error);\n if (msg.includes(\"app_not_found\")) {\n log.info(`${appId} already deleted (branch: ${branch})`);\n } else {\n log.warning(`Failed to delete app ${appId}: ${msg}`);\n }\n }\n }\n\n for (const env of envs) {\n if (\n env.id &&\n env.gitBranch === branch &&\n SLACK_ENV_VAR_KEYS.includes(env.key)\n ) {\n try {\n await deleteEnvironmentVariable({\n projectId,\n envId: env.id,\n token: vercelApiToken,\n teamId,\n });\n } catch (error) {\n log.warning(\n `Failed to delete env var ${env.key} for branch ${branch}: ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n }\n }\n\n log.success(\"Orphan cleanup completed\");\n}\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { cleanupOrphanedApps } from \"../cleanup\";\nimport { authTest, rotateConfigToken } from \"../internal/slack\";\nimport {\n addEnvironmentVariables,\n cancelDeployment,\n createDeployment,\n getProject,\n} from \"../internal/vercel\";\nimport { log } from \"../logger\";\nimport { type PreviewParams, preview } from \"../preview\";\n\nexport async function executeBuild(\n params: PreviewParams,\n options?: { cleanup?: boolean },\n): Promise<void> {\n if (!params.slackConfigurationToken) {\n throw new Error(\n \"Slack Configuration Token is not set. Generate a configuration token and add it as SLACK_CONFIGURATION_TOKEN in your Vercel project:\\nhttps://api.slack.com/apps\",\n );\n }\n\n try {\n await authTest({ token: params.slackConfigurationToken });\n } catch (error) {\n if (!params.slackConfigRefreshToken) {\n throw new Error(\n \"Slack configuration token is invalid or expired. Provide SLACK_CONFIG_REFRESH_TOKEN for automatic rotation, or generate a new token:\\nhttps://api.slack.com/apps\",\n { cause: error },\n );\n }\n\n log.step(\"Refreshing SLACK_CONFIGURATION_TOKEN\");\n try {\n const rotated = await rotateConfigToken({\n refreshToken: params.slackConfigRefreshToken,\n });\n params.slackConfigurationToken = rotated.token;\n params.slackConfigRefreshToken = rotated.refreshToken;\n\n await addEnvironmentVariables({\n projectId: params.projectId,\n token: params.vercelApiToken,\n teamId: params.teamId,\n envs: [\n {\n key: \"SLACK_CONFIGURATION_TOKEN\",\n value: rotated.token,\n type: \"encrypted\",\n target: [\"production\", \"preview\", \"development\"],\n },\n {\n key: \"SLACK_CONFIG_REFRESH_TOKEN\",\n value: rotated.refreshToken,\n type: \"encrypted\",\n target: [\"production\", \"preview\", \"development\"],\n },\n ],\n });\n log.success(\"Configuration token rotated and persisted\");\n } catch (rotateError) {\n throw new Error(\n \"Failed to rotate configuration token — refresh token may be invalid. Generate new tokens:\\nhttps://api.slack.com/apps\",\n { cause: rotateError },\n );\n }\n }\n\n if (params.slackServiceToken) {\n try {\n await authTest({ token: params.slackServiceToken });\n } catch (error) {\n log.warning(\n \"SLACK_SERVICE_TOKEN is invalid — app must be installed manually\",\n );\n log.info(\"https://docs.slack.dev/authentication/tokens/#service\");\n log.debug(error);\n }\n }\n\n if (!params.branch) {\n throw new Error(\n \"VERCEL_GIT_COMMIT_REF is not set — connect your Git repository in your Vercel project settings.\\nhttps://vercel.com/docs/git\",\n );\n }\n\n try {\n await getProject({\n projectId: params.projectId,\n token: params.vercelApiToken,\n teamId: params.teamId,\n });\n } catch (error) {\n throw new Error(\n \"Vercel API token cannot access this project. Ensure VERCEL_API_TOKEN is valid and has access to this team:\\nhttps://vercel.com/account/settings/tokens\",\n { cause: error },\n );\n }\n\n const manifestFullPath = path.join(process.cwd(), params.manifestPath);\n if (!fs.existsSync(manifestFullPath)) {\n throw new Error(\n `No manifest found at ${params.manifestPath}. Create a manifest.json (or manifest.yaml) file with your Slack app configuration:\\nhttps://docs.slack.dev/reference/manifests`,\n );\n }\n\n if (options?.cleanup) {\n log.step(\"Cleaning up orphaned preview apps\");\n try {\n await cleanupOrphanedApps({\n projectId: params.projectId,\n currentBranch: params.branch,\n vercelApiToken: params.vercelApiToken,\n teamId: params.teamId,\n slackConfigurationToken: params.slackConfigurationToken,\n });\n } catch (error) {\n log.warning(\n `Orphan cleanup failed: ${error instanceof Error ? error.message : error}`,\n );\n }\n }\n\n const result = await preview(params, \"cli\");\n\n if (result.isNew && params.deploymentId) {\n log.step(\"Creating new deployment to pick up new environment variables\");\n const { id, url } = await createDeployment({\n deploymentId: params.deploymentId,\n projectId: params.projectId,\n token: params.vercelApiToken,\n teamId: params.teamId,\n });\n log.success(`New deployment created: ${url} (${id})`);\n\n log.step(\"Cancelling current deployment\");\n await cancelDeployment({\n deploymentId: params.deploymentId,\n token: params.vercelApiToken,\n teamId: params.teamId,\n });\n }\n}\n","export const ENV_KEYS = [\n \"VERCEL_ENV\",\n \"VERCEL_GIT_COMMIT_REF\",\n \"VERCEL_PROJECT_ID\",\n \"VERCEL_URL\",\n \"VERCEL_BRANCH_URL\",\n \"VERCEL_TEAM_ID\",\n \"VERCEL_GIT_COMMIT_SHA\",\n \"VERCEL_GIT_COMMIT_MESSAGE\",\n \"VERCEL_GIT_COMMIT_AUTHOR_LOGIN\",\n \"VERCEL_DEPLOYMENT_ID\",\n \"VERCEL_AUTOMATION_BYPASS_SECRET\",\n \"SLACK_APP_ID\",\n \"SLACK_CONFIGURATION_TOKEN\",\n \"SLACK_SERVICE_TOKEN\",\n \"SLACK_CONFIG_REFRESH_TOKEN\",\n \"MANIFEST_PATH\",\n \"VERCEL_API_TOKEN\",\n] as const;\n\nexport function envKeyToFlag(key: string): string {\n return key.toLowerCase().replace(/_/g, \"-\");\n}\n\nfunction flagToCamelCase(flag: string): string {\n return flag.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase());\n}\n\nexport function resolveEnv(\n options: Record<string, string | undefined>,\n): Record<string, string | undefined> {\n const overrides: Record<string, string> = {};\n for (const key of ENV_KEYS) {\n const camelKey = flagToCamelCase(envKeyToFlag(key));\n const value = options[camelKey];\n if (typeof value === \"string\") {\n overrides[key] = value;\n }\n }\n return { ...process.env, ...overrides };\n}\n","import { Command } from \"commander\";\nimport { validateAndBuildParams } from \"../internal/schemas\";\nimport { enableFetchDebugLogging, log, startMessage } from \"../logger\";\nimport { executeBuild } from \"./build\";\nimport { ENV_KEYS, envKeyToFlag, resolveEnv } from \"./env\";\n\nexport function run(version: string): void {\n const program = new Command()\n .name(\"vercel-slack\")\n .description(\n \"Build and configure Slack apps for Vercel preview deployments\",\n )\n .version(version)\n .option(\"--debug\", \"Enable verbose debug logging for all HTTP requests\");\n\n const cmd = program\n .command(\"build\")\n .description(\n \"Build and configure the Slack app for a Vercel preview deployment\",\n );\n\n for (const key of ENV_KEYS) {\n cmd.option(`--${envKeyToFlag(key)} <value>`, `Override ${key}`);\n }\n\n cmd.option(\n \"--cleanup\",\n \"Clean up Slack apps and env vars for inactive preview branches\",\n );\n\n cmd.action(async (options: Record<string, string | boolean | undefined>) => {\n const debug =\n program.opts().debug === true ||\n process.env.VERCEL_SLACK_DEBUG === \"1\" ||\n process.env.VERCEL_SLACK_DEBUG === \"true\";\n if (debug) {\n process.env.VERCEL_SLACK_DEBUG = \"1\";\n enableFetchDebugLogging();\n }\n\n const cleanup = options.cleanup === true;\n const env = resolveEnv(options as Record<string, string | undefined>);\n\n console.log(\n startMessage(\n version,\n env.VERCEL_GIT_COMMIT_REF,\n env.VERCEL_GIT_COMMIT_SHA,\n env.SLACK_APP_ID,\n ),\n );\n\n const isLocal = !env.VERCEL_ENV;\n const isDev =\n env.VERCEL_ENV === \"development\" || env.NODE_ENV === \"development\";\n const isProd = env.VERCEL_ENV === \"production\";\n\n if (isLocal || isDev || isProd) {\n const reason = isLocal ? \"local\" : isDev ? \"development\" : \"production\";\n log.info(`Environment: ${reason} (skipped)\\n`);\n return;\n }\n\n const params = validateAndBuildParams(env);\n await executeBuild(params, { cleanup });\n });\n\n program.parseAsync().catch((error: unknown) => {\n log.error(error instanceof Error ? error.message : String(error));\n console.log();\n });\n}\n","{\n\t\"name\": \"@vercel/slack-bolt\",\n\t\"version\": \"1.3.0\",\n\t\"description\": \"A Vercel receiver for building Slack apps with Bolt and deploying them to Vercel\",\n\t\"main\": \"./dist/index.js\",\n\t\"types\": \"./dist/index.d.ts\",\n\t\"type\": \"commonjs\",\n\t\"bin\": {\n\t\t\"vercel-slack\": \"./bin/vercel-slack.js\"\n\t},\n\t\"exports\": {\n\t\t\".\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/index.d.mts\",\n\t\t\t\t\"require\": \"./dist/index.d.ts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/index.mjs\",\n\t\t\t\"require\": \"./dist/index.js\"\n\t\t},\n\t\t\"./preview\": {\n\t\t\t\"types\": {\n\t\t\t\t\"import\": \"./dist/preview.d.mts\",\n\t\t\t\t\"require\": \"./dist/preview.d.ts\"\n\t\t\t},\n\t\t\t\"import\": \"./dist/preview.mjs\",\n\t\t\t\"require\": \"./dist/preview.js\"\n\t\t}\n\t},\n\t\"typesVersions\": {\n\t\t\"*\": {\n\t\t\t\"preview\": [\n\t\t\t\t\"./dist/preview.d.ts\"\n\t\t\t]\n\t\t}\n\t},\n\t\"files\": [\n\t\t\"bin\",\n\t\t\"dist\"\n\t],\n\t\"repository\": {\n\t\t\"type\": \"git\",\n\t\t\"url\": \"https://github.com/vercel-labs/slack-bolt\"\n\t},\n\t\"bugs\": {\n\t\t\"url\": \"https://github.com/vercel-labs/slack-bolt/issues\"\n\t},\n\t\"scripts\": {\n\t\t\"build\": \"tsup\",\n\t\t\"dev\": \"tsup --watch\",\n\t\t\"test\": \"vitest run\",\n\t\t\"test:watch\": \"vitest watch\",\n\t\t\"lint\": \"biome check .\",\n\t\t\"lint:fix\": \"biome check . --write\",\n\t\t\"attw\": \"attw --pack .\"\n\t},\n\t\"keywords\": [\n\t\t\"vercel\",\n\t\t\"bolt\",\n\t\t\"slack\"\n\t],\n\t\"author\": \"Vercel\",\n\t\"license\": \"MIT\",\n\t\"dependencies\": {\n\t\t\"@slack/logger\": \"^4.0.0\",\n\t\t\"@vercel/functions\": \"^3.4.3\",\n\t\t\"commander\": \"^14.0.3\",\n\t\t\"yaml\": \"^2.8.2\",\n\t\t\"zod\": \"^4.3.6\"\n\t},\n\t\"devDependencies\": {\n\t\t\"@arethetypeswrong/cli\": \"^0.18.2\",\n\t\t\"@biomejs/biome\": \"2.2.2\",\n\t\t\"@types/node\": \"^20.19.35\",\n\t\t\"@vitest/coverage-v8\": \"4.0.18\",\n\t\t\"tsup\": \"^8.5.1\",\n\t\t\"tsx\": \"^4.21.0\",\n\t\t\"typescript\": \"^5.9.3\",\n\t\t\"vitest\": \"^4.0.18\"\n\t},\n\t\"peerDependencies\": {\n\t\t\"@slack/bolt\": \"^4.4.0\"\n\t},\n\t\"peerDependenciesMeta\": {\n\t\t\"@slack/bolt\": {\n\t\t\t\"optional\": false\n\t\t}\n\t},\n\t\"engines\": {\n\t\t\"node\": \">=20.0.0\"\n\t},\n\t\"publishConfig\": {\n\t\t\"access\": \"public\"\n\t}\n}\n","#!/usr/bin/env node\nimport { run } from \"./cli/index\";\n\nconst { version } = require(\"../package.json\") as { version: string };\n\nrun(version);\n"]}
|
package/dist/cli.mjs
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
import { init_slack, init_vercel, init_logger, init_preview, enableFetchDebugLogging, startMessage, log, authTest, getProject, preview, createDeployment, cancelDeployment, getActiveBranches, getEnvironmentVariables, getEnvironmentVariable, deleteSlackApp, deleteEnvironmentVariable } from './chunk-
|
|
2
|
+
import { init_slack, init_vercel, init_logger, init_preview, enableFetchDebugLogging, startMessage, log, authTest, rotateConfigToken, addEnvironmentVariables, getProject, preview, createDeployment, cancelDeployment, getActiveBranches, getEnvironmentVariables, getEnvironmentVariable, deleteSlackApp, deleteEnvironmentVariable } from './chunk-VNXFT255.mjs';
|
|
3
3
|
import { __esm, __commonJS } from './chunk-B5E7QPZP.mjs';
|
|
4
4
|
import { z } from 'zod';
|
|
5
5
|
import fs from 'fs';
|
|
@@ -49,6 +49,7 @@ https://vercel.com/account/settings/tokens`
|
|
|
49
49
|
automationBypassSecret: systemResult.data.VERCEL_AUTOMATION_BYPASS_SECRET,
|
|
50
50
|
slackAppId: slackResult.data.SLACK_APP_ID,
|
|
51
51
|
slackConfigurationToken: slackResult.data.SLACK_CONFIGURATION_TOKEN,
|
|
52
|
+
slackConfigRefreshToken: slackResult.data.SLACK_CONFIG_REFRESH_TOKEN,
|
|
52
53
|
slackServiceToken: slackResult.data.SLACK_SERVICE_TOKEN,
|
|
53
54
|
manifestPath: slackResult.data.MANIFEST_PATH,
|
|
54
55
|
vercelApiToken: vercelResult.data.VERCEL_API_TOKEN
|
|
@@ -176,7 +177,7 @@ var init_cleanup = __esm({
|
|
|
176
177
|
];
|
|
177
178
|
}
|
|
178
179
|
});
|
|
179
|
-
async function executeBuild(params,
|
|
180
|
+
async function executeBuild(params, options) {
|
|
180
181
|
if (!params.slackConfigurationToken) {
|
|
181
182
|
throw new Error(
|
|
182
183
|
"Slack Configuration Token is not set. Generate a configuration token and add it as SLACK_CONFIGURATION_TOKEN in your Vercel project:\nhttps://api.slack.com/apps"
|
|
@@ -185,10 +186,45 @@ async function executeBuild(params, version, options) {
|
|
|
185
186
|
try {
|
|
186
187
|
await authTest({ token: params.slackConfigurationToken });
|
|
187
188
|
} catch (error) {
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
189
|
+
if (!params.slackConfigRefreshToken) {
|
|
190
|
+
throw new Error(
|
|
191
|
+
"Slack configuration token is invalid or expired. Provide SLACK_CONFIG_REFRESH_TOKEN for automatic rotation, or generate a new token:\nhttps://api.slack.com/apps",
|
|
192
|
+
{ cause: error }
|
|
193
|
+
);
|
|
194
|
+
}
|
|
195
|
+
log.step("Refreshing SLACK_CONFIGURATION_TOKEN");
|
|
196
|
+
try {
|
|
197
|
+
const rotated = await rotateConfigToken({
|
|
198
|
+
refreshToken: params.slackConfigRefreshToken
|
|
199
|
+
});
|
|
200
|
+
params.slackConfigurationToken = rotated.token;
|
|
201
|
+
params.slackConfigRefreshToken = rotated.refreshToken;
|
|
202
|
+
await addEnvironmentVariables({
|
|
203
|
+
projectId: params.projectId,
|
|
204
|
+
token: params.vercelApiToken,
|
|
205
|
+
teamId: params.teamId,
|
|
206
|
+
envs: [
|
|
207
|
+
{
|
|
208
|
+
key: "SLACK_CONFIGURATION_TOKEN",
|
|
209
|
+
value: rotated.token,
|
|
210
|
+
type: "encrypted",
|
|
211
|
+
target: ["production", "preview", "development"]
|
|
212
|
+
},
|
|
213
|
+
{
|
|
214
|
+
key: "SLACK_CONFIG_REFRESH_TOKEN",
|
|
215
|
+
value: rotated.refreshToken,
|
|
216
|
+
type: "encrypted",
|
|
217
|
+
target: ["production", "preview", "development"]
|
|
218
|
+
}
|
|
219
|
+
]
|
|
220
|
+
});
|
|
221
|
+
log.success("Configuration token rotated and persisted");
|
|
222
|
+
} catch (rotateError) {
|
|
223
|
+
throw new Error(
|
|
224
|
+
"Failed to rotate configuration token \u2014 refresh token may be invalid. Generate new tokens:\nhttps://api.slack.com/apps",
|
|
225
|
+
{ cause: rotateError }
|
|
226
|
+
);
|
|
227
|
+
}
|
|
192
228
|
}
|
|
193
229
|
if (params.slackServiceToken) {
|
|
194
230
|
try {
|
|
@@ -221,7 +257,7 @@ async function executeBuild(params, version, options) {
|
|
|
221
257
|
const manifestFullPath = path.join(process.cwd(), params.manifestPath);
|
|
222
258
|
if (!fs.existsSync(manifestFullPath)) {
|
|
223
259
|
throw new Error(
|
|
224
|
-
`No manifest found at ${params.manifestPath}. Create a manifest.json file with your Slack app configuration:
|
|
260
|
+
`No manifest found at ${params.manifestPath}. Create a manifest.json (or manifest.yaml) file with your Slack app configuration:
|
|
225
261
|
https://docs.slack.dev/reference/manifests`
|
|
226
262
|
);
|
|
227
263
|
}
|
|
@@ -351,7 +387,7 @@ function run(version) {
|
|
|
351
387
|
return;
|
|
352
388
|
}
|
|
353
389
|
const params = validateAndBuildParams(env);
|
|
354
|
-
await executeBuild(params,
|
|
390
|
+
await executeBuild(params, { cleanup });
|
|
355
391
|
});
|
|
356
392
|
program.parseAsync().catch((error) => {
|
|
357
393
|
log.error(error instanceof Error ? error.message : String(error));
|
|
@@ -372,7 +408,7 @@ var require_package = __commonJS({
|
|
|
372
408
|
"package.json"(exports$1, module) {
|
|
373
409
|
module.exports = {
|
|
374
410
|
name: "@vercel/slack-bolt",
|
|
375
|
-
version: "1.
|
|
411
|
+
version: "1.3.0",
|
|
376
412
|
description: "A Vercel receiver for building Slack apps with Bolt and deploying them to Vercel",
|
|
377
413
|
main: "./dist/index.js",
|
|
378
414
|
types: "./dist/index.d.ts",
|
|
@@ -436,6 +472,7 @@ var require_package = __commonJS({
|
|
|
436
472
|
"@slack/logger": "^4.0.0",
|
|
437
473
|
"@vercel/functions": "^3.4.3",
|
|
438
474
|
commander: "^14.0.3",
|
|
475
|
+
yaml: "^2.8.2",
|
|
439
476
|
zod: "^4.3.6"
|
|
440
477
|
},
|
|
441
478
|
devDependencies: {
|