@vercel/slack-bolt 1.2.4 → 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/dist/cli.js CHANGED
@@ -1,7 +1,7 @@
1
1
  #!/usr/bin/env node
2
2
  'use strict';
3
3
 
4
- var chunkRCI377NU_js = require('./chunk-RCI377NU.js');
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 chunkRCI377NU_js.getActiveBranches({
102
+ const activeBranches = await chunkJFHLS5RC_js.getActiveBranches({
102
103
  projectId,
103
104
  token: vercelApiToken,
104
105
  teamId
105
106
  });
106
- const envs = await chunkRCI377NU_js.getEnvironmentVariables({
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
- chunkRCI377NU_js.log.info("No orphaned preview apps found");
119
+ chunkJFHLS5RC_js.log.info("No orphaned preview apps found");
119
120
  return;
120
121
  }
121
- chunkRCI377NU_js.log.step(
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 chunkRCI377NU_js.getEnvironmentVariable({
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
- chunkRCI377NU_js.log.warning(`Failed to decrypt SLACK_APP_ID for branch ${branch}`);
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 chunkRCI377NU_js.deleteSlackApp({
139
+ await chunkJFHLS5RC_js.deleteSlackApp({
139
140
  token: slackConfigurationToken,
140
141
  appId
141
142
  });
142
- chunkRCI377NU_js.log.info(`${appId} deleted (branch: ${branch})`);
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
- chunkRCI377NU_js.log.info(`${appId} already deleted (branch: ${branch})`);
147
+ chunkJFHLS5RC_js.log.info(`${appId} already deleted (branch: ${branch})`);
147
148
  } else {
148
- chunkRCI377NU_js.log.warning(`Failed to delete app ${appId}: ${msg}`);
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 chunkRCI377NU_js.deleteEnvironmentVariable({
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
- chunkRCI377NU_js.log.warning(
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
- chunkRCI377NU_js.log.success("Orphan cleanup completed");
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
- chunkRCI377NU_js.init_slack();
175
- chunkRCI377NU_js.init_vercel();
176
- chunkRCI377NU_js.init_logger();
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,33 +184,73 @@ var init_cleanup = chunkQHMZVK6J_js.__esm({
183
184
  ];
184
185
  }
185
186
  });
186
- async function executeBuild(params, version, options) {
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 chunkRCI377NU_js.authTest({ token: params.slackConfigurationToken });
194
+ await chunkJFHLS5RC_js.authTest({ token: params.slackConfigurationToken });
194
195
  } catch (error) {
195
- throw new Error(
196
- "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",
197
- { cause: error }
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 chunkRCI377NU_js.authTest({ token: params.slackServiceToken });
238
+ await chunkJFHLS5RC_js.authTest({ token: params.slackServiceToken });
203
239
  } catch (error) {
204
- chunkRCI377NU_js.log.warning(
240
+ chunkJFHLS5RC_js.log.warning(
205
241
  "SLACK_SERVICE_TOKEN is invalid \u2014 app must be installed manually"
206
242
  );
207
- chunkRCI377NU_js.log.info("https://docs.slack.dev/authentication/tokens/#service");
208
- chunkRCI377NU_js.log.debug(error);
243
+ chunkJFHLS5RC_js.log.info("https://docs.slack.dev/authentication/tokens/#service");
244
+ chunkJFHLS5RC_js.log.debug(error);
209
245
  }
210
246
  }
247
+ if (!params.branch) {
248
+ throw new Error(
249
+ "VERCEL_GIT_COMMIT_REF is not set \u2014 connect your Git repository in your Vercel project settings.\nhttps://vercel.com/docs/git"
250
+ );
251
+ }
211
252
  try {
212
- await chunkRCI377NU_js.getProject({
253
+ await chunkJFHLS5RC_js.getProject({
213
254
  projectId: params.projectId,
214
255
  token: params.vercelApiToken,
215
256
  teamId: params.teamId
@@ -223,12 +264,12 @@ async function executeBuild(params, version, options) {
223
264
  const manifestFullPath = path__default.default.join(process.cwd(), params.manifestPath);
224
265
  if (!fs__default.default.existsSync(manifestFullPath)) {
225
266
  throw new Error(
226
- `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:
227
268
  https://docs.slack.dev/reference/manifests`
228
269
  );
229
270
  }
230
271
  if (options?.cleanup) {
231
- chunkRCI377NU_js.log.step("Cleaning up orphaned preview apps");
272
+ chunkJFHLS5RC_js.log.step("Cleaning up orphaned preview apps");
232
273
  try {
233
274
  await cleanupOrphanedApps({
234
275
  projectId: params.projectId,
@@ -238,23 +279,23 @@ https://docs.slack.dev/reference/manifests`
238
279
  slackConfigurationToken: params.slackConfigurationToken
239
280
  });
240
281
  } catch (error) {
241
- chunkRCI377NU_js.log.warning(
282
+ chunkJFHLS5RC_js.log.warning(
242
283
  `Orphan cleanup failed: ${error instanceof Error ? error.message : error}`
243
284
  );
244
285
  }
245
286
  }
246
- const result = await chunkRCI377NU_js.preview(params, "cli");
287
+ const result = await chunkJFHLS5RC_js.preview(params, "cli");
247
288
  if (result.isNew && params.deploymentId) {
248
- chunkRCI377NU_js.log.step("Creating new deployment to pick up new environment variables");
249
- const { id, url } = await chunkRCI377NU_js.createDeployment({
289
+ chunkJFHLS5RC_js.log.step("Creating new deployment to pick up new environment variables");
290
+ const { id, url } = await chunkJFHLS5RC_js.createDeployment({
250
291
  deploymentId: params.deploymentId,
251
292
  projectId: params.projectId,
252
293
  token: params.vercelApiToken,
253
294
  teamId: params.teamId
254
295
  });
255
- chunkRCI377NU_js.log.success(`New deployment created: ${url} (${id})`);
256
- chunkRCI377NU_js.log.step("Cancelling current deployment");
257
- await chunkRCI377NU_js.cancelDeployment({
296
+ chunkJFHLS5RC_js.log.success(`New deployment created: ${url} (${id})`);
297
+ chunkJFHLS5RC_js.log.step("Cancelling current deployment");
298
+ await chunkJFHLS5RC_js.cancelDeployment({
258
299
  deploymentId: params.deploymentId,
259
300
  token: params.vercelApiToken,
260
301
  teamId: params.teamId
@@ -264,10 +305,10 @@ https://docs.slack.dev/reference/manifests`
264
305
  var init_build = chunkQHMZVK6J_js.__esm({
265
306
  "src/cli/build.ts"() {
266
307
  init_cleanup();
267
- chunkRCI377NU_js.init_slack();
268
- chunkRCI377NU_js.init_vercel();
269
- chunkRCI377NU_js.init_logger();
270
- chunkRCI377NU_js.init_preview();
308
+ chunkJFHLS5RC_js.init_slack();
309
+ chunkJFHLS5RC_js.init_vercel();
310
+ chunkJFHLS5RC_js.init_logger();
311
+ chunkJFHLS5RC_js.init_preview();
271
312
  }
272
313
  });
273
314
 
@@ -331,12 +372,12 @@ function run(version) {
331
372
  const debug = program.opts().debug === true || process.env.VERCEL_SLACK_DEBUG === "1" || process.env.VERCEL_SLACK_DEBUG === "true";
332
373
  if (debug) {
333
374
  process.env.VERCEL_SLACK_DEBUG = "1";
334
- chunkRCI377NU_js.enableFetchDebugLogging();
375
+ chunkJFHLS5RC_js.enableFetchDebugLogging();
335
376
  }
336
377
  const cleanup = options.cleanup === true;
337
378
  const env = resolveEnv(options);
338
379
  console.log(
339
- chunkRCI377NU_js.startMessage(
380
+ chunkJFHLS5RC_js.startMessage(
340
381
  version,
341
382
  env.VERCEL_GIT_COMMIT_REF,
342
383
  env.VERCEL_GIT_COMMIT_SHA,
@@ -348,22 +389,22 @@ function run(version) {
348
389
  const isProd = env.VERCEL_ENV === "production";
349
390
  if (isLocal || isDev || isProd) {
350
391
  const reason = isLocal ? "local" : isDev ? "development" : "production";
351
- chunkRCI377NU_js.log.info(`Environment: ${reason} (skipped)
392
+ chunkJFHLS5RC_js.log.info(`Environment: ${reason} (skipped)
352
393
  `);
353
394
  return;
354
395
  }
355
396
  const params = validateAndBuildParams(env);
356
- await executeBuild(params, version, { cleanup });
397
+ await executeBuild(params, { cleanup });
357
398
  });
358
399
  program.parseAsync().catch((error) => {
359
- chunkRCI377NU_js.log.error(error instanceof Error ? error.message : String(error));
400
+ chunkJFHLS5RC_js.log.error(error instanceof Error ? error.message : String(error));
360
401
  console.log();
361
402
  });
362
403
  }
363
404
  var init_cli = chunkQHMZVK6J_js.__esm({
364
405
  "src/cli/index.ts"() {
365
406
  init_schemas();
366
- chunkRCI377NU_js.init_logger();
407
+ chunkJFHLS5RC_js.init_logger();
367
408
  init_build();
368
409
  init_env();
369
410
  }
@@ -374,7 +415,7 @@ var require_package = chunkQHMZVK6J_js.__commonJS({
374
415
  "package.json"(exports$1, module) {
375
416
  module.exports = {
376
417
  name: "@vercel/slack-bolt",
377
- version: "1.2.4",
418
+ version: "1.3.0",
378
419
  description: "A Vercel receiver for building Slack apps with Bolt and deploying them to Vercel",
379
420
  main: "./dist/index.js",
380
421
  types: "./dist/index.d.ts",
@@ -438,6 +479,7 @@ var require_package = chunkQHMZVK6J_js.__commonJS({
438
479
  "@slack/logger": "^4.0.0",
439
480
  "@vercel/functions": "^3.4.3",
440
481
  commander: "^14.0.3",
482
+ yaml: "^2.8.2",
441
483
  zod: "^4.3.6"
442
484
  },
443
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 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.4\",\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-BTCCJT7U.mjs';
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, version, options) {
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
- throw new Error(
189
- "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",
190
- { cause: error }
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 {
@@ -201,6 +237,11 @@ async function executeBuild(params, version, options) {
201
237
  log.debug(error);
202
238
  }
203
239
  }
240
+ if (!params.branch) {
241
+ throw new Error(
242
+ "VERCEL_GIT_COMMIT_REF is not set \u2014 connect your Git repository in your Vercel project settings.\nhttps://vercel.com/docs/git"
243
+ );
244
+ }
204
245
  try {
205
246
  await getProject({
206
247
  projectId: params.projectId,
@@ -216,7 +257,7 @@ async function executeBuild(params, version, options) {
216
257
  const manifestFullPath = path.join(process.cwd(), params.manifestPath);
217
258
  if (!fs.existsSync(manifestFullPath)) {
218
259
  throw new Error(
219
- `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:
220
261
  https://docs.slack.dev/reference/manifests`
221
262
  );
222
263
  }
@@ -346,7 +387,7 @@ function run(version) {
346
387
  return;
347
388
  }
348
389
  const params = validateAndBuildParams(env);
349
- await executeBuild(params, version, { cleanup });
390
+ await executeBuild(params, { cleanup });
350
391
  });
351
392
  program.parseAsync().catch((error) => {
352
393
  log.error(error instanceof Error ? error.message : String(error));
@@ -367,7 +408,7 @@ var require_package = __commonJS({
367
408
  "package.json"(exports$1, module) {
368
409
  module.exports = {
369
410
  name: "@vercel/slack-bolt",
370
- version: "1.2.4",
411
+ version: "1.3.0",
371
412
  description: "A Vercel receiver for building Slack apps with Bolt and deploying them to Vercel",
372
413
  main: "./dist/index.js",
373
414
  types: "./dist/index.d.ts",
@@ -431,6 +472,7 @@ var require_package = __commonJS({
431
472
  "@slack/logger": "^4.0.0",
432
473
  "@vercel/functions": "^3.4.3",
433
474
  commander: "^14.0.3",
475
+ yaml: "^2.8.2",
434
476
  zod: "^4.3.6"
435
477
  },
436
478
  devDependencies: {