@vercel/slack-bolt 1.2.0 → 1.2.2

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 ADDED
@@ -0,0 +1,234 @@
1
+ # @vercel/slack-bolt
2
+
3
+ A custom [Slack Bolt](https://slack.dev/bolt-js/) receiver built for Vercel's [Fluid Compute](https://vercel.com/docs/fluid-compute).
4
+
5
+ ## Getting Started
6
+
7
+ Visit our [template](https://vercel.com/templates/backend/slack-bolt-with-nitro) to get started building a Slack app.
8
+
9
+ ## Installation
10
+
11
+ ```bash
12
+ npm install @vercel/slack-bolt
13
+ # or
14
+ yarn add @vercel/slack-bolt
15
+ # or
16
+ pnpm add @vercel/slack-bolt
17
+ # or
18
+ bun add @vercel/slack-bolt
19
+ ```
20
+
21
+ ## API Reference
22
+
23
+ ### `VercelReceiver`
24
+
25
+ Responsible for handling and parsing any incoming requests from Slack and then forwarding them to your Bolt app for event processing.
26
+
27
+ ```typescript
28
+ import { App } from "@slack/bolt";
29
+ import { VercelReceiver } from "@vercel/slack-bolt";
30
+
31
+ const receiver = new VercelReceiver();
32
+
33
+ const app = new App({
34
+ token: process.env.SLACK_BOT_TOKEN,
35
+ signingSecret: process.env.SLACK_SIGNING_SECRET,
36
+ receiver,
37
+ deferInitialization: true,
38
+ });
39
+
40
+ app.message(/^(hi|hello|hey).*/, async ({ say }) => {
41
+ await say("Hello, world!");
42
+ });
43
+
44
+ export { app, receiver };
45
+ ```
46
+
47
+ #### Parameters
48
+
49
+ | Name | Type | Default Value | Required | Description |
50
+ | --------------------------- | --------------------------------- | ---------------------------------- | -------------- | ---------------------------------------------------------------------- |
51
+ | `signingSecret` | `string` | `process.env.SLACK_SIGNING_SECRET` | No<sup>1</sup> | Signing secret for your Slack app used to verify requests. |
52
+ | `signatureVerification` | `boolean` | `true` | No | Enable or disable request signature verification. |
53
+ | `logger` | `Logger`<sup>2</sup> | `new ConsoleLogger()` | No | Logger used for diagnostics. |
54
+ | `logLevel` | `LogLevel`<sup>2</sup> | `LogLevel.INFO` | No | Minimum log level for the logger. |
55
+ | `customPropertiesExtractor` | `(req: Request) => StringIndexed` | `undefined` | No | Return value is merged into Bolt event `customProperties`<sup>2</sup>. |
56
+ | `ackTimeoutMs` | `number` | `3001` | No | Milliseconds to wait for `ack()` before returning a timeout error. |
57
+
58
+ <sup>1</sup> Optional if `process.env.SLACK_SIGNING_SECRET` is provided.
59
+
60
+ <sup>2</sup> Provided by the [`@slack/bolt`](https://www.npmjs.com/package/@slack/bolt) library. More information [here](https://docs.slack.dev/tools/bolt-js/reference#app-options).
61
+
62
+ ### `createHandler`
63
+
64
+ A function that returns a Vercel-compatible request handler that will initialize and start your Bolt app to process the event.
65
+
66
+ ```typescript
67
+ // An example using Next.js route handlers
68
+
69
+ import { createHandler } from "@vercel/slack-bolt";
70
+ import { app, receiver } from "./app";
71
+
72
+ export const POST = createHandler(app, receiver);
73
+ ```
74
+
75
+ #### Parameters
76
+
77
+ | Name | Type | Required | Description |
78
+ | ---------- | ----------------- | -------- | ------------------------------------------------------------ |
79
+ | `app` | `App`<sup>1</sup> | Yes | Your Bolt app |
80
+ | `receiver` | `VercelReceiver` | Yes | The Vercel receiver instance used to process Slack requests. |
81
+
82
+ <sup>1</sup> Provided by the [`@slack/bolt`](https://www.npmjs.com/package/@slack/bolt) library. More information [here](https://docs.slack.dev/tools/bolt-js/reference#app-options).
83
+
84
+ ### `preview`
85
+
86
+ Programmatic API for creating and configuring a Slack app for a Vercel preview deployment. This is the function that powers the `vercel-slack build` CLI. Imported from `@vercel/slack-bolt/preview`.
87
+
88
+ ```typescript
89
+ import { preview } from "@vercel/slack-bolt/preview";
90
+
91
+ const result = await preview({
92
+ branch: "feat/my-feature",
93
+ projectId: "prj_...",
94
+ deploymentUrl: "my-app-abc123.vercel.app",
95
+ manifestPath: "manifest.json",
96
+ slackConfigurationToken: process.env.SLACK_CONFIGURATION_TOKEN,
97
+ vercelApiToken: process.env.VERCEL_API_TOKEN,
98
+ });
99
+ ```
100
+
101
+ #### Parameters (`PreviewParams`)
102
+
103
+ | Name | Type | Required | Description |
104
+ | ------------------------- | -------- | -------- | ------------------------------------------------------------------ |
105
+ | `branch` | `string` | Yes | Git branch name for the preview deployment. |
106
+ | `projectId` | `string` | Yes | Vercel project ID. |
107
+ | `deploymentUrl` | `string` | Yes | URL of the current deployment. |
108
+ | `manifestPath` | `string` | Yes | Path to the Slack app `manifest.json` file. |
109
+ | `slackConfigurationToken` | `string` | Yes | Slack app configuration token. |
110
+ | `vercelApiToken` | `string` | Yes | Vercel API token with write access. |
111
+ | `branchUrl` | `string` | No | Branch-specific URL. Defaults to `deploymentUrl`. |
112
+ | `slackAppId` | `string` | No | Existing Slack app ID to update instead of creating a new one. |
113
+ | `slackServiceToken` | `string` | No | Service token for auto-installing the app. |
114
+ | `teamId` | `string` | No | Vercel team ID. |
115
+ | `deploymentId` | `string` | No | Current deployment ID (used for cancel-and-redeploy). |
116
+ | `automationBypassSecret` | `string` | No | Existing bypass secret. Generated automatically if not provided. |
117
+ | `commitSha` | `string` | No | Git commit SHA (displayed in the Slack app description). |
118
+ | `commitMessage` | `string` | No | Git commit message (displayed in the Slack app description). |
119
+ | `commitAuthor` | `string` | No | Git commit author (displayed in the Slack app description). |
120
+
121
+ #### Return value (`PreviewResult`)
122
+
123
+ | Name | Type | Description |
124
+ | --------------- | --------- | ------------------------------------------------------------- |
125
+ | `isNew` | `boolean` | `true` if a new Slack app was created, `false` if updated. |
126
+ | `installStatus` | `string` | Installation outcome (e.g. `installed`, `missing_service_token`). |
127
+ | `app` | `object` | Slack API response containing `app_id` and credentials. |
128
+
129
+ ## Preview Deployments
130
+
131
+ `@vercel/slack-bolt` can automatically create and manage a dedicated Slack app for each preview branch. On every preview build it will:
132
+
133
+ 1. Create a new Slack app (or update the existing one) from your `manifest.json`
134
+ 2. Rewrite manifest URLs to point to the preview deployment
135
+ 3. Store the app credentials (`SLACK_APP_ID`, `SLACK_CLIENT_ID`, `SLACK_CLIENT_SECRET`, `SLACK_SIGNING_SECRET`) as branch-scoped environment variables
136
+ 4. Optionally auto-install the app and persist `SLACK_BOT_TOKEN`
137
+ 5. Cancel and redeploy so the new environment variables take effect
138
+
139
+ On production and local/development builds, the preview step is skipped automatically.
140
+
141
+ ### Setup
142
+
143
+ #### 1. Add the CLI to your build script
144
+
145
+ ```json
146
+ {
147
+ "scripts": {
148
+ "build": "vercel-slack build --cleanup && next build"
149
+ }
150
+ }
151
+ ```
152
+
153
+ #### 2. Create a `manifest.json`
154
+
155
+ Place a [Slack app manifest](https://api.slack.com/reference/manifests) in your project root. URLs can use any placeholder domain — they will be rewritten to your preview deployment URL:
156
+
157
+ > **Note:** The manifest doesn't have to live in the project root. Set the `MANIFEST_PATH` environment variable or pass `--manifest-path <path>` to specify a custom location relative to the working directory.
158
+
159
+ ```json
160
+ {
161
+ "display_information": {
162
+ "name": "My Slack App"
163
+ },
164
+ "settings": {
165
+ "event_subscriptions": {
166
+ "request_url": "https://example.com/api/slack/events"
167
+ }
168
+ }
169
+ }
170
+ ```
171
+
172
+ #### 3. Configure environment variables
173
+
174
+ Add the following to your Vercel project:
175
+
176
+ | Variable | Required | Description |
177
+ | --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ |
178
+ | `SLACK_CONFIGURATION_TOKEN` | Yes | App configuration token. Generate at https://api.slack.com/apps |
179
+ | `VERCEL_API_TOKEN` | Yes | Vercel API token with write access. Create at https://vercel.com/account/settings/tokens |
180
+ | `SLACK_SERVICE_TOKEN` | No | Service token for auto-installing the app. Without this, the app must be installed manually. See https://docs.slack.dev/authentication/tokens/#service |
181
+
182
+ You must also enable **Automatically expose System Environment Variables** in your Vercel project settings.
183
+
184
+ ### How it works
185
+
186
+ ```
187
+ git push → Vercel preview build
188
+ └─ vercel-slack build --cleanup
189
+ ├─ Skips if production, development, or local
190
+ ├─ Validates Slack and Vercel tokens
191
+ ├─ Cleans up orphaned preview apps (--cleanup)
192
+ ├─ Reads manifest.json
193
+ ├─ Creates or updates Slack app via apps.manifest API
194
+ ├─ Rewrites manifest URLs → preview deployment URL
195
+ ├─ Stores credentials as branch-scoped env vars
196
+ ├─ Auto-installs app (if SLACK_SERVICE_TOKEN is set)
197
+ └─ Redeploys to pick up new env vars (only needed on first deploy for branch)
198
+ ```
199
+
200
+ #### Cleanup
201
+
202
+ When `--cleanup` is passed, the CLI removes Slack apps and branch-scoped environment variables for preview branches that are no longer active in the Vercel project. This runs before the main provisioning step and failures are non-fatal.
203
+
204
+ ### CLI Reference
205
+
206
+ ```
207
+ Usage: vercel-slack <command> [options]
208
+
209
+ Commands:
210
+ build Build and configure the Slack app for a Vercel preview deployment
211
+
212
+ Options:
213
+ --cleanup Clean up Slack apps and env vars for inactive preview branches
214
+ --help, -h Show help
215
+ --version, -v Show version
216
+ ```
217
+
218
+ All Vercel and Slack environment variables are read automatically. You can override any of them via CLI flags (e.g. `--vercel-env`, `--slack-app-id`).
219
+
220
+ ## Examples
221
+
222
+ Starter templates: [Next.js](https://github.com/vercel-labs/slack-bolt/tree/examples/examples/nextjs), [Hono](https://github.com/vercel-labs/slack-bolt/tree/examples/examples/hono), [Nitro](https://github.com/vercel-labs/slack-bolt/tree/examples/examples/nitro).
223
+
224
+ ## Contributing
225
+
226
+ Contributions are welcome! Please feel free to submit a Pull Request.
227
+
228
+ ## Support
229
+
230
+ For issues and questions:
231
+
232
+ - Check the [Slack Bolt documentation](https://slack.dev/bolt-js/)
233
+ - Review [Vercel Functions documentation](https://vercel.com/docs/functions)
234
+ - [Open an issue](https://github.com/vercel-labs/slack-bolt/issues) in this repository
@@ -377,7 +377,7 @@ async function updateProtectionBypass({
377
377
  token,
378
378
  teamId
379
379
  }) {
380
- const newSecret = crypto.randomBytes(32).toString("hex");
380
+ const newSecret = crypto.randomBytes(16).toString("hex");
381
381
  const note = "Created by @vercel/slack-bolt";
382
382
  const url = new URL(
383
383
  `https://api.vercel.com/v1/projects/${encodeURIComponent(projectId)}/protection-bypass`
@@ -806,5 +806,5 @@ var init_preview = __esm({
806
806
  });
807
807
 
808
808
  export { authTest, cancelDeployment, createDeployment, deleteEnvironmentVariable, deleteSlackApp, getActiveBranches, getEnvironmentVariable, getEnvironmentVariables, getProject, init_logger, init_preview, init_slack, init_vercel, log, logger, preview, startMessage };
809
- //# sourceMappingURL=chunk-XGRIXFBJ.mjs.map
810
- //# sourceMappingURL=chunk-XGRIXFBJ.mjs.map
809
+ //# sourceMappingURL=chunk-F7XGHLWN.mjs.map
810
+ //# sourceMappingURL=chunk-F7XGHLWN.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/internal/manifest/index.ts","../src/internal/vercel/errors.ts","../src/internal/slack/errors.ts","../src/internal/slack/index.ts","../src/internal/vercel/index.ts","../src/logger.ts","../src/preview.ts"],"names":["init_errors","app"],"mappings":"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","file":"chunk-XGRIXFBJ.mjs","sourcesContent":["import type { Manifest } from \"./types\";\n\nexport function rewriteUrl(\n originalUrl: string,\n branchUrl: string,\n bypassSecret?: string,\n): string {\n const pathStart = originalUrl.indexOf(\"/\", originalUrl.indexOf(\"//\") + 2);\n const pathAndQuery = pathStart !== -1 ? originalUrl.slice(pathStart) : \"/\";\n\n const url = new URL(pathAndQuery, `https://${branchUrl}`);\n if (bypassSecret) {\n url.searchParams.set(\"x-vercel-protection-bypass\", bypassSecret);\n }\n return url.toString();\n}\n\nfunction createManifestDescription(params: {\n existingDescription: string;\n existingName: string;\n branchUrl: string;\n branch: string;\n commitSha?: string;\n commitMessage?: string;\n commitAuthor?: string;\n}): { longDescription: string; displayName: string } {\n const shortSha = params.commitSha?.slice(0, 7) ?? \"unknown\";\n const safeCommitMsg = params.commitMessage ?? \"\";\n const safeCommitAuthor = params.commitAuthor ?? \"unknown\";\n\n const deploymentInfo = `\\n:globe_with_meridians: *Deployment URL:* ${params.branchUrl}\\n:seedling: *Branch:* ${params.branch}\\n:technologist: *Commit:* ${shortSha} ${safeCommitMsg}\\n:bust_in_silhouette: *Last updated by:* ${safeCommitAuthor}\\n\\n_Automatically created by ▲ Vercel_\\n`;\n\n const maxLongDesc = 4000;\n const combined = params.existingDescription + deploymentInfo;\n let longDescription: string;\n if (combined.length > maxLongDesc) {\n const available = Math.max(0, maxLongDesc - deploymentInfo.length);\n longDescription = (\n params.existingDescription.slice(0, available) + deploymentInfo\n ).slice(0, maxLongDesc);\n } else {\n longDescription = combined;\n }\n\n const maxDisplayName = 35;\n const cleanBranch = params.branch\n .replace(/^refs\\/heads\\//, \"\")\n .replace(/\\//g, \"-\");\n\n let displayName = `${params.existingName} (${cleanBranch})`;\n if (displayName.length > maxDisplayName) {\n const prefix = `${params.existingName} (`;\n const suffix = \")\";\n const availableForBranch = maxDisplayName - prefix.length - suffix.length;\n displayName =\n availableForBranch > 0\n ? `${prefix}${cleanBranch.slice(0, availableForBranch)}${suffix}`\n : displayName.slice(0, maxDisplayName);\n }\n\n return { longDescription, displayName };\n}\n\nexport function createNewManifest(params: {\n originalManifest: Manifest;\n branchUrl: string;\n bypassSecret: string;\n branch: string;\n commitSha?: string;\n commitMessage?: string;\n commitAuthor?: string;\n}): Manifest {\n const manifest = structuredClone(params.originalManifest);\n\n if (manifest.settings?.event_subscriptions?.request_url) {\n manifest.settings.event_subscriptions.request_url = rewriteUrl(\n manifest.settings.event_subscriptions.request_url,\n params.branchUrl,\n params.bypassSecret,\n );\n }\n\n if (manifest.settings?.interactivity?.request_url) {\n manifest.settings.interactivity.request_url = rewriteUrl(\n manifest.settings.interactivity.request_url,\n params.branchUrl,\n params.bypassSecret,\n );\n }\n\n if (manifest.features?.slash_commands) {\n for (const cmd of manifest.features.slash_commands) {\n if (cmd.url) {\n cmd.url = rewriteUrl(cmd.url, params.branchUrl, params.bypassSecret);\n }\n }\n }\n\n if (manifest.oauth_config?.redirect_urls) {\n manifest.oauth_config.redirect_urls =\n manifest.oauth_config.redirect_urls.map((originalUrl) =>\n rewriteUrl(originalUrl, params.branchUrl),\n );\n }\n\n const { longDescription, displayName } = createManifestDescription({\n existingDescription: manifest.display_information.long_description ?? \"\",\n existingName:\n manifest.features?.bot_user?.display_name ??\n manifest.display_information.name,\n branchUrl: params.branchUrl,\n branch: params.branch,\n commitSha: params.commitSha,\n commitMessage: params.commitMessage,\n commitAuthor: params.commitAuthor,\n });\n\n manifest.display_information.long_description = longDescription;\n manifest.display_information.name = displayName;\n if (manifest.features?.bot_user) {\n manifest.features.bot_user.display_name = displayName;\n }\n\n return manifest;\n}\n","export class HTTPError extends Error {\n constructor(\n message: string,\n public status: number,\n public statusText: string,\n public body?: string,\n ) {\n const parts = [`${message}: ${status} ${statusText}`];\n if (body) parts.push(body);\n super(parts.join(\" - \"));\n }\n\n static async fromResponse(\n message: string,\n response: Response,\n ): Promise<HTTPError> {\n let body: string | undefined;\n try {\n const text = await response.text();\n if (text) body = text;\n } catch {\n // body unreadable, that's fine\n }\n return new HTTPError(message, response.status, response.statusText, body);\n }\n}\n","export class SlackManifestCreateError extends Error {\n constructor(\n message: string,\n public errors?: { message: string; pointer: string }[],\n ) {\n super(message);\n }\n}\n\nexport class SlackManifestUpdateError extends Error {\n constructor(\n message: string,\n public errors?: { message: string; pointer: string }[],\n ) {\n super(message);\n }\n}\n\nexport class SlackManifestExportError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import type { Manifest } from \"../manifest/types\";\nimport { HTTPError } from \"../vercel/errors\";\nimport {\n SlackManifestCreateError,\n SlackManifestExportError,\n SlackManifestUpdateError,\n} from \"./errors\";\nimport type {\n InstallResponse,\n InstallResult,\n SlackManifestCreateResponse,\n SlackManifestExportResponse,\n SlackManifestUpdateResponse,\n} from \"./types\";\n\nexport {\n SlackManifestCreateError,\n SlackManifestExportError,\n SlackManifestUpdateError,\n} from \"./errors\";\nexport type {\n InstallResult,\n SlackManifestCreateResponse,\n SlackManifestExportResponse,\n SlackManifestUpdateResponse,\n} from \"./types\";\n\nexport async function createSlackApp({\n token,\n manifest,\n}: {\n token: string;\n manifest: Manifest;\n}): Promise<SlackManifestCreateResponse> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.create\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({ manifest: JSON.stringify(manifest) }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to create Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as SlackManifestCreateResponse;\n\n if (!data.ok) {\n throw new SlackManifestCreateError(\n data?.error ?? \"Unknown error\",\n data?.errors,\n );\n }\n\n return data;\n}\n\nexport async function updateSlackApp({\n token,\n appId,\n manifest,\n}: {\n token: string;\n appId: string;\n manifest: Manifest;\n}): Promise<SlackManifestUpdateResponse> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.update\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({\n app_id: appId,\n manifest: JSON.stringify(manifest),\n }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to update Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as SlackManifestUpdateResponse;\n\n if (!data.ok) {\n throw new SlackManifestUpdateError(\n data?.error ?? \"Unknown error\",\n data?.errors,\n );\n }\n\n return data;\n}\n\nexport async function exportSlackApp({\n token,\n appId,\n}: {\n token: string;\n appId: string;\n}): Promise<SlackManifestExportResponse> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.export\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({ app_id: appId }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to export Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as SlackManifestExportResponse;\n\n if (!data.ok) {\n throw new SlackManifestExportError(data?.error ?? \"Unknown error\");\n }\n\n return data;\n}\n\nexport async function upsertSlackApp({\n token,\n appId,\n manifest,\n}: {\n token: string;\n appId?: string;\n manifest: Manifest;\n}): Promise<\n | { isNew: true; app: SlackManifestCreateResponse }\n | { isNew: false; app: SlackManifestUpdateResponse }\n> {\n if (appId) {\n try {\n await exportSlackApp({ token, appId });\n const app = await updateSlackApp({ token, appId, manifest });\n return { isNew: false, app };\n } catch {\n // App doesn't exist or isn't accessible — fall through to create\n }\n }\n\n const app = await createSlackApp({ token, manifest });\n return { isNew: true, app };\n}\n\nexport async function deleteSlackApp({\n token,\n appId,\n}: {\n token: string;\n appId: string;\n}): Promise<void> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.delete\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({ app_id: appId }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to delete Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as { ok: boolean; error?: string };\n\n if (!data.ok) {\n throw new Error(data.error ?? \"Unknown error\");\n }\n}\n\nexport async function authTest({ token }: { token: string }): Promise<void> {\n const response = await fetch(\"https://slack.com/api/auth.test\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Auth test failed\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as { ok: boolean; error?: string };\n\n if (!data.ok) {\n throw new Error(data.error ?? \"Unknown error\");\n }\n}\n\nexport async function installApp(params: {\n serviceToken?: string;\n appId: string;\n botScopes: string[];\n outgoingDomains?: string[];\n}): Promise<InstallResult> {\n const { serviceToken, appId, botScopes, outgoingDomains } = params;\n\n if (!serviceToken) {\n return {\n status: \"missing_service_token\",\n };\n }\n\n const response = await fetch(\"https://slack.com/api/apps.developerInstall\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${serviceToken}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({\n app_id: appId,\n bot_scopes: botScopes,\n outgoing_domains: outgoingDomains ?? [],\n }),\n });\n\n if (!response.ok) {\n return {\n status: \"slack_api_error\",\n error: response.statusText,\n };\n }\n\n const data = (await response.json()) as InstallResponse;\n\n if (data.error) {\n switch (data.error) {\n case \"app_approval_request_eligible\":\n return {\n status: \"app_approval_request_eligible\",\n };\n case \"app_approval_request_pending\":\n return {\n status: \"app_approval_request_pending\",\n };\n case \"app_approval_request_denied\":\n return {\n status: \"app_approval_request_denied\",\n };\n default:\n return {\n status: \"unknown_error\",\n };\n }\n }\n\n return {\n status: \"installed\",\n botToken: data.api_access_tokens?.bot,\n appLevelToken: data.api_access_tokens?.app_level,\n userToken: data.api_access_tokens?.user,\n };\n}\n","import crypto from \"node:crypto\";\nimport { HTTPError } from \"./errors\";\nimport type {\n AddEnvironmentVariablesResult,\n CreateProjectEnv,\n EnvironmentVariable,\n} from \"./types\";\n\nexport async function getProject({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<void> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to access Vercel project\",\n response,\n );\n }\n}\n\nexport async function updateProtectionBypass({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<string> {\n const newSecret = crypto.randomBytes(32).toString(\"hex\");\n const note = \"Created by @vercel/slack-bolt\";\n\n const url = new URL(\n `https://api.vercel.com/v1/projects/${encodeURIComponent(projectId)}/protection-bypass`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n generate: {\n secret: newSecret,\n note: note,\n },\n }),\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to update protection bypass\",\n response,\n );\n }\n\n return newSecret;\n}\n\nexport async function addEnvironmentVariables({\n projectId,\n token,\n teamId,\n envs,\n upsert = true,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n envs: CreateProjectEnv | CreateProjectEnv[];\n upsert?: boolean;\n}): Promise<AddEnvironmentVariablesResult> {\n const url = new URL(\n `https://api.vercel.com/v10/projects/${encodeURIComponent(projectId)}/env`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n if (upsert) url.searchParams.set(\"upsert\", \"true\");\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(envs),\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to create environment variables\",\n response,\n );\n }\n\n return response.json();\n}\n\nexport async function cancelDeployment({\n deploymentId,\n token,\n teamId,\n}: {\n deploymentId: string;\n token: string;\n teamId?: string;\n}): Promise<void> {\n const url = new URL(\n `https://api.vercel.com/v12/deployments/${encodeURIComponent(deploymentId)}/cancel`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\"Failed to cancel deployment\", response);\n }\n}\n\nexport async function createDeployment({\n deploymentId,\n projectId,\n token,\n teamId,\n}: {\n deploymentId: string;\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<{ id: string; url: string }> {\n const url = new URL(\"https://api.vercel.com/v13/deployments\");\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n url.searchParams.set(\"forceNew\", \"1\");\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n deploymentId,\n name: projectId,\n project: projectId,\n }),\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\"Failed to create deployment\", response);\n }\n\n const data = await response.json();\n return { id: data.id, url: data.url };\n}\n\nexport async function getActiveBranches({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<Set<string>> {\n const params = new URLSearchParams({ active: \"1\", limit: \"100\" });\n if (teamId) params.set(\"teamId\", teamId);\n\n const response = await fetch(\n `https://api.vercel.com/v5/projects/${encodeURIComponent(projectId)}/branches?${params}`,\n { headers: { Authorization: `Bearer ${token}` } },\n );\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to fetch active branches\",\n response,\n );\n }\n\n const data: { branches?: { branch: string }[] } = await response.json();\n return new Set(data.branches?.map((b) => b.branch) ?? []);\n}\n\nexport async function getEnvironmentVariables({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<EnvironmentVariable[]> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}/env`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to fetch environment variables\",\n response,\n );\n }\n\n const data: { envs: EnvironmentVariable[] } = await response.json();\n return data.envs ?? [];\n}\n\nexport async function getEnvironmentVariable({\n projectId,\n envId,\n token,\n teamId,\n}: {\n projectId: string;\n envId: string;\n token: string;\n teamId?: string;\n}): Promise<string | null> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}/env/${encodeURIComponent(envId)}`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to fetch environment variable\",\n response,\n );\n }\n\n const data: { value?: string } = await response.json();\n return data.value ?? null;\n}\n\nexport async function deleteEnvironmentVariable({\n projectId,\n envId,\n token,\n teamId,\n}: {\n projectId: string;\n envId: string;\n token: string;\n teamId?: string;\n}): Promise<void> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}/env/${encodeURIComponent(envId)}`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to delete environment variable\",\n response,\n );\n }\n}\n","const isDebug =\n process.env.VERCEL_SLACK_DEBUG === \"1\" ||\n process.env.VERCEL_SLACK_DEBUG === \"true\";\n\nexport const logger = {\n info: (...args: unknown[]) => console.log(...args),\n warn: (...args: unknown[]) => console.warn(...args),\n error: (...args: unknown[]) => console.error(...args),\n debug: (...args: unknown[]) => {\n if (isDebug) console.debug(...args);\n },\n};\n\nconst BOLD = \"\\x1b[1m\";\nconst RESET = \"\\x1b[0m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\n\nexport const log = {\n step: (msg: string) => console.log(` ${msg} ...`),\n success: (msg: string) => console.log(`${GREEN}✓${RESET} ${msg}`),\n info: (msg: string) => console.log(` ${msg}`),\n warning: (msg: string) => console.log(`${YELLOW}⚠${RESET} ${msg}`),\n};\n\nexport const startMessage = (\n version?: string,\n branch?: string,\n commit?: string,\n appId?: string,\n) => {\n const lines = [`▲ @vercel/slack-bolt ${version ?? \"\"}`];\n if (branch) lines.push(` - Branch: ${branch}`);\n if (commit) lines.push(` - Commit: ${commit.slice(0, 7)}`);\n if (appId) lines.push(` - App ID: ${appId}`);\n return `${BOLD}${lines.join(\"\\n\")}${RESET}\\n`;\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createNewManifest } from \"./internal/manifest\";\nimport type { Manifest } from \"./internal/manifest/types\";\nimport { installApp, upsertSlackApp } from \"./internal/slack\";\nimport type {\n SlackManifestCreateResponse,\n SlackManifestUpdateResponse,\n} from \"./internal/slack/types\";\nimport {\n addEnvironmentVariables,\n updateProtectionBypass,\n} from \"./internal/vercel\";\nimport type { CreateProjectEnv } from \"./internal/vercel/types\";\nimport { log } from \"./logger\";\n\nexport type PreviewParams = {\n automationBypassSecret?: string;\n branch: string;\n branchUrl?: string;\n commitAuthor?: string;\n commitMessage?: string;\n commitSha?: string;\n deploymentId?: string;\n deploymentUrl: string;\n manifestPath: string;\n projectId: string;\n slackAppId?: string;\n slackConfigurationToken: string;\n slackServiceToken?: string;\n teamId?: string;\n vercelApiToken: string;\n};\n\nexport type PreviewResult = {\n isNew: boolean;\n installStatus: string;\n app: SlackManifestCreateResponse | SlackManifestUpdateResponse;\n};\n\nexport const preview = async (\n params: PreviewParams,\n context?: \"cli\",\n): Promise<PreviewResult> => {\n const {\n branch,\n projectId,\n deploymentUrl,\n teamId,\n commitAuthor,\n commitMessage: commitMsg,\n commitSha,\n slackAppId,\n slackConfigurationToken,\n slackServiceToken,\n manifestPath,\n vercelApiToken,\n } = params;\n\n const cli = context === \"cli\";\n const branchUrl = params.branchUrl ?? deploymentUrl;\n let bypassSecret = params.automationBypassSecret;\n\n if (!bypassSecret) {\n if (cli) log.step(\"Generating automation bypass secret\");\n bypassSecret = await updateProtectionBypass({\n projectId,\n token: vercelApiToken,\n teamId,\n });\n if (cli) log.success(\"Automation bypass secret generated\");\n }\n\n if (cli) log.step(`Reading manifest from ${manifestPath}`);\n const rawFileManifest = fs.readFileSync(\n path.join(process.cwd(), manifestPath),\n \"utf8\",\n );\n const manifest = JSON.parse(rawFileManifest) as Manifest;\n\n const newManifest = createNewManifest({\n originalManifest: manifest,\n branchUrl,\n bypassSecret,\n branch,\n commitSha,\n commitMessage: commitMsg,\n commitAuthor,\n });\n\n // write new manifest so user-land imports of manifest.json see the updated version\n fs.writeFileSync(\n path.join(process.cwd(), manifestPath),\n JSON.stringify(newManifest, null, 2),\n \"utf8\",\n );\n if (cli) log.success(`Manifest updated for ${branchUrl}`);\n\n if (cli) log.step(\"Creating or updating Slack app\");\n const { isNew, app } = await upsertSlackApp({\n token: slackConfigurationToken,\n appId: slackAppId,\n manifest: newManifest,\n });\n\n if (isNew) {\n const credentialEnvs: CreateProjectEnv[] = [];\n if (app.app_id) {\n credentialEnvs.push({\n key: \"SLACK_APP_ID\",\n value: app.app_id,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (app.credentials?.client_id) {\n credentialEnvs.push({\n key: \"SLACK_CLIENT_ID\",\n value: app.credentials.client_id,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (app.credentials?.client_secret) {\n credentialEnvs.push({\n key: \"SLACK_CLIENT_SECRET\",\n value: app.credentials.client_secret,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (app.credentials?.signing_secret) {\n credentialEnvs.push({\n key: \"SLACK_SIGNING_SECRET\",\n value: app.credentials.signing_secret,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (credentialEnvs.length > 0) {\n await addEnvironmentVariables({\n projectId,\n token: vercelApiToken,\n teamId,\n envs: credentialEnvs,\n });\n }\n }\n\n if (cli)\n log.success(`${isNew ? \"Created\" : \"Updated\"} Slack app ${app.app_id}`);\n\n if (cli) log.step(\"Installing Slack app\");\n const { status, botToken, appLevelToken, userToken } = await installApp({\n serviceToken: slackServiceToken,\n appId: app.app_id,\n botScopes: manifest.oauth_config?.scopes?.bot ?? [],\n });\n\n if (isNew) {\n const tokenEnvs: CreateProjectEnv[] = [];\n if (botToken) {\n tokenEnvs.push({\n key: \"SLACK_BOT_TOKEN\",\n value: botToken,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (appLevelToken) {\n tokenEnvs.push({\n key: \"SLACK_APP_LEVEL_TOKEN\",\n value: appLevelToken,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (userToken) {\n tokenEnvs.push({\n key: \"SLACK_USER_TOKEN\",\n value: userToken,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (tokenEnvs.length > 0) {\n await addEnvironmentVariables({\n projectId,\n token: vercelApiToken,\n teamId,\n envs: tokenEnvs,\n });\n }\n }\n\n if (cli) {\n switch (status) {\n case \"missing_service_token\":\n log.warning(\n \"SLACK_SERVICE_TOKEN is not set — app must be installed manually\",\n );\n log.info(\"https://docs.slack.dev/authentication/tokens/#service\");\n break;\n case \"installed\":\n log.success(`Installed Slack app ${app.app_id}`);\n break;\n case \"app_approval_request_eligible\":\n log.warning(\"App requires approval before it can be installed\");\n break;\n case \"app_approval_request_pending\":\n log.warning(\"App is pending approval before it can be installed\");\n break;\n case \"app_approval_request_denied\":\n log.warning(\"App approval request was denied\");\n break;\n case \"slack_api_error\":\n log.warning(\"Slack API error while installing the app\");\n break;\n case \"unknown_error\":\n log.warning(\"Unknown error while installing the app\");\n break;\n }\n console.log();\n if (app.app_id) {\n log.info(`View app: https://api.slack.com/apps/${app.app_id}`);\n }\n if (isNew && app.oauth_authorize_url) {\n log.info(`Install URL: ${app.oauth_authorize_url}`);\n }\n console.log();\n }\n\n return {\n isNew,\n installStatus: status,\n app,\n };\n};\n"]}
1
+ {"version":3,"sources":["../src/internal/manifest/index.ts","../src/internal/vercel/errors.ts","../src/internal/slack/errors.ts","../src/internal/slack/index.ts","../src/internal/vercel/index.ts","../src/logger.ts","../src/preview.ts"],"names":["init_errors","app"],"mappings":"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","file":"chunk-F7XGHLWN.mjs","sourcesContent":["import type { Manifest } from \"./types\";\n\nexport function rewriteUrl(\n originalUrl: string,\n branchUrl: string,\n bypassSecret?: string,\n): string {\n const pathStart = originalUrl.indexOf(\"/\", originalUrl.indexOf(\"//\") + 2);\n const pathAndQuery = pathStart !== -1 ? originalUrl.slice(pathStart) : \"/\";\n\n const url = new URL(pathAndQuery, `https://${branchUrl}`);\n if (bypassSecret) {\n url.searchParams.set(\"x-vercel-protection-bypass\", bypassSecret);\n }\n return url.toString();\n}\n\nfunction createManifestDescription(params: {\n existingDescription: string;\n existingName: string;\n branchUrl: string;\n branch: string;\n commitSha?: string;\n commitMessage?: string;\n commitAuthor?: string;\n}): { longDescription: string; displayName: string } {\n const shortSha = params.commitSha?.slice(0, 7) ?? \"unknown\";\n const safeCommitMsg = params.commitMessage ?? \"\";\n const safeCommitAuthor = params.commitAuthor ?? \"unknown\";\n\n const deploymentInfo = `\\n:globe_with_meridians: *Deployment URL:* ${params.branchUrl}\\n:seedling: *Branch:* ${params.branch}\\n:technologist: *Commit:* ${shortSha} ${safeCommitMsg}\\n:bust_in_silhouette: *Last updated by:* ${safeCommitAuthor}\\n\\n_Automatically created by ▲ Vercel_\\n`;\n\n const maxLongDesc = 4000;\n const combined = params.existingDescription + deploymentInfo;\n let longDescription: string;\n if (combined.length > maxLongDesc) {\n const available = Math.max(0, maxLongDesc - deploymentInfo.length);\n longDescription = (\n params.existingDescription.slice(0, available) + deploymentInfo\n ).slice(0, maxLongDesc);\n } else {\n longDescription = combined;\n }\n\n const maxDisplayName = 35;\n const cleanBranch = params.branch\n .replace(/^refs\\/heads\\//, \"\")\n .replace(/\\//g, \"-\");\n\n let displayName = `${params.existingName} (${cleanBranch})`;\n if (displayName.length > maxDisplayName) {\n const prefix = `${params.existingName} (`;\n const suffix = \")\";\n const availableForBranch = maxDisplayName - prefix.length - suffix.length;\n displayName =\n availableForBranch > 0\n ? `${prefix}${cleanBranch.slice(0, availableForBranch)}${suffix}`\n : displayName.slice(0, maxDisplayName);\n }\n\n return { longDescription, displayName };\n}\n\nexport function createNewManifest(params: {\n originalManifest: Manifest;\n branchUrl: string;\n bypassSecret: string;\n branch: string;\n commitSha?: string;\n commitMessage?: string;\n commitAuthor?: string;\n}): Manifest {\n const manifest = structuredClone(params.originalManifest);\n\n if (manifest.settings?.event_subscriptions?.request_url) {\n manifest.settings.event_subscriptions.request_url = rewriteUrl(\n manifest.settings.event_subscriptions.request_url,\n params.branchUrl,\n params.bypassSecret,\n );\n }\n\n if (manifest.settings?.interactivity?.request_url) {\n manifest.settings.interactivity.request_url = rewriteUrl(\n manifest.settings.interactivity.request_url,\n params.branchUrl,\n params.bypassSecret,\n );\n }\n\n if (manifest.features?.slash_commands) {\n for (const cmd of manifest.features.slash_commands) {\n if (cmd.url) {\n cmd.url = rewriteUrl(cmd.url, params.branchUrl, params.bypassSecret);\n }\n }\n }\n\n if (manifest.oauth_config?.redirect_urls) {\n manifest.oauth_config.redirect_urls =\n manifest.oauth_config.redirect_urls.map((originalUrl) =>\n rewriteUrl(originalUrl, params.branchUrl),\n );\n }\n\n const { longDescription, displayName } = createManifestDescription({\n existingDescription: manifest.display_information.long_description ?? \"\",\n existingName:\n manifest.features?.bot_user?.display_name ??\n manifest.display_information.name,\n branchUrl: params.branchUrl,\n branch: params.branch,\n commitSha: params.commitSha,\n commitMessage: params.commitMessage,\n commitAuthor: params.commitAuthor,\n });\n\n manifest.display_information.long_description = longDescription;\n manifest.display_information.name = displayName;\n if (manifest.features?.bot_user) {\n manifest.features.bot_user.display_name = displayName;\n }\n\n return manifest;\n}\n","export class HTTPError extends Error {\n constructor(\n message: string,\n public status: number,\n public statusText: string,\n public body?: string,\n ) {\n const parts = [`${message}: ${status} ${statusText}`];\n if (body) parts.push(body);\n super(parts.join(\" - \"));\n }\n\n static async fromResponse(\n message: string,\n response: Response,\n ): Promise<HTTPError> {\n let body: string | undefined;\n try {\n const text = await response.text();\n if (text) body = text;\n } catch {\n // body unreadable, that's fine\n }\n return new HTTPError(message, response.status, response.statusText, body);\n }\n}\n","export class SlackManifestCreateError extends Error {\n constructor(\n message: string,\n public errors?: { message: string; pointer: string }[],\n ) {\n super(message);\n }\n}\n\nexport class SlackManifestUpdateError extends Error {\n constructor(\n message: string,\n public errors?: { message: string; pointer: string }[],\n ) {\n super(message);\n }\n}\n\nexport class SlackManifestExportError extends Error {\n constructor(message: string) {\n super(message);\n }\n}\n","import type { Manifest } from \"../manifest/types\";\nimport { HTTPError } from \"../vercel/errors\";\nimport {\n SlackManifestCreateError,\n SlackManifestExportError,\n SlackManifestUpdateError,\n} from \"./errors\";\nimport type {\n InstallResponse,\n InstallResult,\n SlackManifestCreateResponse,\n SlackManifestExportResponse,\n SlackManifestUpdateResponse,\n} from \"./types\";\n\nexport {\n SlackManifestCreateError,\n SlackManifestExportError,\n SlackManifestUpdateError,\n} from \"./errors\";\nexport type {\n InstallResult,\n SlackManifestCreateResponse,\n SlackManifestExportResponse,\n SlackManifestUpdateResponse,\n} from \"./types\";\n\nexport async function createSlackApp({\n token,\n manifest,\n}: {\n token: string;\n manifest: Manifest;\n}): Promise<SlackManifestCreateResponse> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.create\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({ manifest: JSON.stringify(manifest) }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to create Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as SlackManifestCreateResponse;\n\n if (!data.ok) {\n throw new SlackManifestCreateError(\n data?.error ?? \"Unknown error\",\n data?.errors,\n );\n }\n\n return data;\n}\n\nexport async function updateSlackApp({\n token,\n appId,\n manifest,\n}: {\n token: string;\n appId: string;\n manifest: Manifest;\n}): Promise<SlackManifestUpdateResponse> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.update\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({\n app_id: appId,\n manifest: JSON.stringify(manifest),\n }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to update Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as SlackManifestUpdateResponse;\n\n if (!data.ok) {\n throw new SlackManifestUpdateError(\n data?.error ?? \"Unknown error\",\n data?.errors,\n );\n }\n\n return data;\n}\n\nexport async function exportSlackApp({\n token,\n appId,\n}: {\n token: string;\n appId: string;\n}): Promise<SlackManifestExportResponse> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.export\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({ app_id: appId }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to export Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as SlackManifestExportResponse;\n\n if (!data.ok) {\n throw new SlackManifestExportError(data?.error ?? \"Unknown error\");\n }\n\n return data;\n}\n\nexport async function upsertSlackApp({\n token,\n appId,\n manifest,\n}: {\n token: string;\n appId?: string;\n manifest: Manifest;\n}): Promise<\n | { isNew: true; app: SlackManifestCreateResponse }\n | { isNew: false; app: SlackManifestUpdateResponse }\n> {\n if (appId) {\n try {\n await exportSlackApp({ token, appId });\n const app = await updateSlackApp({ token, appId, manifest });\n return { isNew: false, app };\n } catch {\n // App doesn't exist or isn't accessible — fall through to create\n }\n }\n\n const app = await createSlackApp({ token, manifest });\n return { isNew: true, app };\n}\n\nexport async function deleteSlackApp({\n token,\n appId,\n}: {\n token: string;\n appId: string;\n}): Promise<void> {\n const response = await fetch(\"https://slack.com/api/apps.manifest.delete\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({ app_id: appId }),\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Failed to delete Slack app\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as { ok: boolean; error?: string };\n\n if (!data.ok) {\n throw new Error(data.error ?? \"Unknown error\");\n }\n}\n\nexport async function authTest({ token }: { token: string }): Promise<void> {\n const response = await fetch(\"https://slack.com/api/auth.test\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n });\n\n if (!response.ok) {\n throw new HTTPError(\n \"Auth test failed\",\n response.status,\n response.statusText,\n );\n }\n\n const data = (await response.json()) as { ok: boolean; error?: string };\n\n if (!data.ok) {\n throw new Error(data.error ?? \"Unknown error\");\n }\n}\n\nexport async function installApp(params: {\n serviceToken?: string;\n appId: string;\n botScopes: string[];\n outgoingDomains?: string[];\n}): Promise<InstallResult> {\n const { serviceToken, appId, botScopes, outgoingDomains } = params;\n\n if (!serviceToken) {\n return {\n status: \"missing_service_token\",\n };\n }\n\n const response = await fetch(\"https://slack.com/api/apps.developerInstall\", {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${serviceToken}`,\n \"Content-Type\": \"application/json; charset=utf-8\",\n },\n body: JSON.stringify({\n app_id: appId,\n bot_scopes: botScopes,\n outgoing_domains: outgoingDomains ?? [],\n }),\n });\n\n if (!response.ok) {\n return {\n status: \"slack_api_error\",\n error: response.statusText,\n };\n }\n\n const data = (await response.json()) as InstallResponse;\n\n if (data.error) {\n switch (data.error) {\n case \"app_approval_request_eligible\":\n return {\n status: \"app_approval_request_eligible\",\n };\n case \"app_approval_request_pending\":\n return {\n status: \"app_approval_request_pending\",\n };\n case \"app_approval_request_denied\":\n return {\n status: \"app_approval_request_denied\",\n };\n default:\n return {\n status: \"unknown_error\",\n };\n }\n }\n\n return {\n status: \"installed\",\n botToken: data.api_access_tokens?.bot,\n appLevelToken: data.api_access_tokens?.app_level,\n userToken: data.api_access_tokens?.user,\n };\n}\n","import crypto from \"node:crypto\";\nimport { HTTPError } from \"./errors\";\nimport type {\n AddEnvironmentVariablesResult,\n CreateProjectEnv,\n EnvironmentVariable,\n} from \"./types\";\n\nexport async function getProject({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<void> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"GET\",\n headers: {\n Authorization: `Bearer ${token}`,\n },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to access Vercel project\",\n response,\n );\n }\n}\n\nexport async function updateProtectionBypass({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<string> {\n const newSecret = crypto.randomBytes(16).toString(\"hex\");\n const note = \"Created by @vercel/slack-bolt\";\n\n const url = new URL(\n `https://api.vercel.com/v1/projects/${encodeURIComponent(projectId)}/protection-bypass`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n generate: {\n secret: newSecret,\n note: note,\n },\n }),\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to update protection bypass\",\n response,\n );\n }\n\n return newSecret;\n}\n\nexport async function addEnvironmentVariables({\n projectId,\n token,\n teamId,\n envs,\n upsert = true,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n envs: CreateProjectEnv | CreateProjectEnv[];\n upsert?: boolean;\n}): Promise<AddEnvironmentVariablesResult> {\n const url = new URL(\n `https://api.vercel.com/v10/projects/${encodeURIComponent(projectId)}/env`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n if (upsert) url.searchParams.set(\"upsert\", \"true\");\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify(envs),\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to create environment variables\",\n response,\n );\n }\n\n return response.json();\n}\n\nexport async function cancelDeployment({\n deploymentId,\n token,\n teamId,\n}: {\n deploymentId: string;\n token: string;\n teamId?: string;\n}): Promise<void> {\n const url = new URL(\n `https://api.vercel.com/v12/deployments/${encodeURIComponent(deploymentId)}/cancel`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"PATCH\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\"Failed to cancel deployment\", response);\n }\n}\n\nexport async function createDeployment({\n deploymentId,\n projectId,\n token,\n teamId,\n}: {\n deploymentId: string;\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<{ id: string; url: string }> {\n const url = new URL(\"https://api.vercel.com/v13/deployments\");\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n url.searchParams.set(\"forceNew\", \"1\");\n\n const response = await fetch(url, {\n method: \"POST\",\n headers: {\n Authorization: `Bearer ${token}`,\n \"Content-Type\": \"application/json\",\n },\n body: JSON.stringify({\n deploymentId,\n name: projectId,\n project: projectId,\n }),\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\"Failed to create deployment\", response);\n }\n\n const data = await response.json();\n return { id: data.id, url: data.url };\n}\n\nexport async function getActiveBranches({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<Set<string>> {\n const params = new URLSearchParams({ active: \"1\", limit: \"100\" });\n if (teamId) params.set(\"teamId\", teamId);\n\n const response = await fetch(\n `https://api.vercel.com/v5/projects/${encodeURIComponent(projectId)}/branches?${params}`,\n { headers: { Authorization: `Bearer ${token}` } },\n );\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to fetch active branches\",\n response,\n );\n }\n\n const data: { branches?: { branch: string }[] } = await response.json();\n return new Set(data.branches?.map((b) => b.branch) ?? []);\n}\n\nexport async function getEnvironmentVariables({\n projectId,\n token,\n teamId,\n}: {\n projectId: string;\n token: string;\n teamId?: string;\n}): Promise<EnvironmentVariable[]> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}/env`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to fetch environment variables\",\n response,\n );\n }\n\n const data: { envs: EnvironmentVariable[] } = await response.json();\n return data.envs ?? [];\n}\n\nexport async function getEnvironmentVariable({\n projectId,\n envId,\n token,\n teamId,\n}: {\n projectId: string;\n envId: string;\n token: string;\n teamId?: string;\n}): Promise<string | null> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}/env/${encodeURIComponent(envId)}`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to fetch environment variable\",\n response,\n );\n }\n\n const data: { value?: string } = await response.json();\n return data.value ?? null;\n}\n\nexport async function deleteEnvironmentVariable({\n projectId,\n envId,\n token,\n teamId,\n}: {\n projectId: string;\n envId: string;\n token: string;\n teamId?: string;\n}): Promise<void> {\n const url = new URL(\n `https://api.vercel.com/v9/projects/${encodeURIComponent(projectId)}/env/${encodeURIComponent(envId)}`,\n );\n if (teamId) url.searchParams.set(\"teamId\", teamId);\n\n const response = await fetch(url, {\n method: \"DELETE\",\n headers: { Authorization: `Bearer ${token}` },\n });\n\n if (!response.ok) {\n throw await HTTPError.fromResponse(\n \"Failed to delete environment variable\",\n response,\n );\n }\n}\n","const isDebug =\n process.env.VERCEL_SLACK_DEBUG === \"1\" ||\n process.env.VERCEL_SLACK_DEBUG === \"true\";\n\nexport const logger = {\n info: (...args: unknown[]) => console.log(...args),\n warn: (...args: unknown[]) => console.warn(...args),\n error: (...args: unknown[]) => console.error(...args),\n debug: (...args: unknown[]) => {\n if (isDebug) console.debug(...args);\n },\n};\n\nconst BOLD = \"\\x1b[1m\";\nconst RESET = \"\\x1b[0m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\n\nexport const log = {\n step: (msg: string) => console.log(` ${msg} ...`),\n success: (msg: string) => console.log(`${GREEN}✓${RESET} ${msg}`),\n info: (msg: string) => console.log(` ${msg}`),\n warning: (msg: string) => console.log(`${YELLOW}⚠${RESET} ${msg}`),\n};\n\nexport const startMessage = (\n version?: string,\n branch?: string,\n commit?: string,\n appId?: string,\n) => {\n const lines = [`▲ @vercel/slack-bolt ${version ?? \"\"}`];\n if (branch) lines.push(` - Branch: ${branch}`);\n if (commit) lines.push(` - Commit: ${commit.slice(0, 7)}`);\n if (appId) lines.push(` - App ID: ${appId}`);\n return `${BOLD}${lines.join(\"\\n\")}${RESET}\\n`;\n};\n","import fs from \"node:fs\";\nimport path from \"node:path\";\nimport { createNewManifest } from \"./internal/manifest\";\nimport type { Manifest } from \"./internal/manifest/types\";\nimport { installApp, upsertSlackApp } from \"./internal/slack\";\nimport type {\n SlackManifestCreateResponse,\n SlackManifestUpdateResponse,\n} from \"./internal/slack/types\";\nimport {\n addEnvironmentVariables,\n updateProtectionBypass,\n} from \"./internal/vercel\";\nimport type { CreateProjectEnv } from \"./internal/vercel/types\";\nimport { log } from \"./logger\";\n\nexport type PreviewParams = {\n automationBypassSecret?: string;\n branch: string;\n branchUrl?: string;\n commitAuthor?: string;\n commitMessage?: string;\n commitSha?: string;\n deploymentId?: string;\n deploymentUrl: string;\n manifestPath: string;\n projectId: string;\n slackAppId?: string;\n slackConfigurationToken: string;\n slackServiceToken?: string;\n teamId?: string;\n vercelApiToken: string;\n};\n\nexport type PreviewResult = {\n isNew: boolean;\n installStatus: string;\n app: SlackManifestCreateResponse | SlackManifestUpdateResponse;\n};\n\nexport const preview = async (\n params: PreviewParams,\n context?: \"cli\",\n): Promise<PreviewResult> => {\n const {\n branch,\n projectId,\n deploymentUrl,\n teamId,\n commitAuthor,\n commitMessage: commitMsg,\n commitSha,\n slackAppId,\n slackConfigurationToken,\n slackServiceToken,\n manifestPath,\n vercelApiToken,\n } = params;\n\n const cli = context === \"cli\";\n const branchUrl = params.branchUrl ?? deploymentUrl;\n let bypassSecret = params.automationBypassSecret;\n\n if (!bypassSecret) {\n if (cli) log.step(\"Generating automation bypass secret\");\n bypassSecret = await updateProtectionBypass({\n projectId,\n token: vercelApiToken,\n teamId,\n });\n if (cli) log.success(\"Automation bypass secret generated\");\n }\n\n if (cli) log.step(`Reading manifest from ${manifestPath}`);\n const rawFileManifest = fs.readFileSync(\n path.join(process.cwd(), manifestPath),\n \"utf8\",\n );\n const manifest = JSON.parse(rawFileManifest) as Manifest;\n\n const newManifest = createNewManifest({\n originalManifest: manifest,\n branchUrl,\n bypassSecret,\n branch,\n commitSha,\n commitMessage: commitMsg,\n commitAuthor,\n });\n\n // write new manifest so user-land imports of manifest.json see the updated version\n fs.writeFileSync(\n path.join(process.cwd(), manifestPath),\n JSON.stringify(newManifest, null, 2),\n \"utf8\",\n );\n if (cli) log.success(`Manifest updated for ${branchUrl}`);\n\n if (cli) log.step(\"Creating or updating Slack app\");\n const { isNew, app } = await upsertSlackApp({\n token: slackConfigurationToken,\n appId: slackAppId,\n manifest: newManifest,\n });\n\n if (isNew) {\n const credentialEnvs: CreateProjectEnv[] = [];\n if (app.app_id) {\n credentialEnvs.push({\n key: \"SLACK_APP_ID\",\n value: app.app_id,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (app.credentials?.client_id) {\n credentialEnvs.push({\n key: \"SLACK_CLIENT_ID\",\n value: app.credentials.client_id,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (app.credentials?.client_secret) {\n credentialEnvs.push({\n key: \"SLACK_CLIENT_SECRET\",\n value: app.credentials.client_secret,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (app.credentials?.signing_secret) {\n credentialEnvs.push({\n key: \"SLACK_SIGNING_SECRET\",\n value: app.credentials.signing_secret,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (credentialEnvs.length > 0) {\n await addEnvironmentVariables({\n projectId,\n token: vercelApiToken,\n teamId,\n envs: credentialEnvs,\n });\n }\n }\n\n if (cli)\n log.success(`${isNew ? \"Created\" : \"Updated\"} Slack app ${app.app_id}`);\n\n if (cli) log.step(\"Installing Slack app\");\n const { status, botToken, appLevelToken, userToken } = await installApp({\n serviceToken: slackServiceToken,\n appId: app.app_id,\n botScopes: manifest.oauth_config?.scopes?.bot ?? [],\n });\n\n if (isNew) {\n const tokenEnvs: CreateProjectEnv[] = [];\n if (botToken) {\n tokenEnvs.push({\n key: \"SLACK_BOT_TOKEN\",\n value: botToken,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (appLevelToken) {\n tokenEnvs.push({\n key: \"SLACK_APP_LEVEL_TOKEN\",\n value: appLevelToken,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (userToken) {\n tokenEnvs.push({\n key: \"SLACK_USER_TOKEN\",\n value: userToken,\n type: \"encrypted\",\n target: [\"preview\"],\n gitBranch: branch,\n comment: `Created by @vercel/slack-bolt for app ${app.app_id} on branch ${branch}`,\n });\n }\n if (tokenEnvs.length > 0) {\n await addEnvironmentVariables({\n projectId,\n token: vercelApiToken,\n teamId,\n envs: tokenEnvs,\n });\n }\n }\n\n if (cli) {\n switch (status) {\n case \"missing_service_token\":\n log.warning(\n \"SLACK_SERVICE_TOKEN is not set — app must be installed manually\",\n );\n log.info(\"https://docs.slack.dev/authentication/tokens/#service\");\n break;\n case \"installed\":\n log.success(`Installed Slack app ${app.app_id}`);\n break;\n case \"app_approval_request_eligible\":\n log.warning(\"App requires approval before it can be installed\");\n break;\n case \"app_approval_request_pending\":\n log.warning(\"App is pending approval before it can be installed\");\n break;\n case \"app_approval_request_denied\":\n log.warning(\"App approval request was denied\");\n break;\n case \"slack_api_error\":\n log.warning(\"Slack API error while installing the app\");\n break;\n case \"unknown_error\":\n log.warning(\"Unknown error while installing the app\");\n break;\n }\n console.log();\n if (app.app_id) {\n log.info(`View app: https://api.slack.com/apps/${app.app_id}`);\n }\n if (isNew && app.oauth_authorize_url) {\n log.info(`Install URL: ${app.oauth_authorize_url}`);\n }\n console.log();\n }\n\n return {\n isNew,\n installStatus: status,\n app,\n };\n};\n"]}
@@ -385,7 +385,7 @@ async function updateProtectionBypass({
385
385
  token,
386
386
  teamId
387
387
  }) {
388
- const newSecret = crypto__default.default.randomBytes(32).toString("hex");
388
+ const newSecret = crypto__default.default.randomBytes(16).toString("hex");
389
389
  const note = "Created by @vercel/slack-bolt";
390
390
  const url = new URL(
391
391
  `https://api.vercel.com/v1/projects/${encodeURIComponent(projectId)}/protection-bypass`
@@ -826,5 +826,5 @@ exports.init_logger = init_logger;
826
826
  exports.init_preview = init_preview;
827
827
  exports.init_slack = init_slack;
828
828
  exports.init_vercel = init_vercel;
829
- //# sourceMappingURL=chunk-UHIORNAT.js.map
830
- //# sourceMappingURL=chunk-UHIORNAT.js.map
829
+ //# sourceMappingURL=chunk-QGGTFP5L.js.map
830
+ //# sourceMappingURL=chunk-QGGTFP5L.js.map