@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 +234 -0
- package/dist/{chunk-XGRIXFBJ.mjs → chunk-F7XGHLWN.mjs} +3 -3
- package/dist/{chunk-XGRIXFBJ.mjs.map → chunk-F7XGHLWN.mjs.map} +1 -1
- package/dist/{chunk-UHIORNAT.js → chunk-QGGTFP5L.js} +3 -3
- package/dist/{chunk-UHIORNAT.js.map → chunk-QGGTFP5L.js.map} +1 -1
- package/dist/cli.js +41 -41
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +2 -2
- package/dist/cli.mjs.map +1 -1
- package/dist/preview.js +3 -3
- package/dist/preview.mjs +2 -2
- package/package.json +1 -1
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(
|
|
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-
|
|
810
|
-
//# sourceMappingURL=chunk-
|
|
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(
|
|
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-
|
|
830
|
-
//# sourceMappingURL=chunk-
|
|
829
|
+
//# sourceMappingURL=chunk-QGGTFP5L.js.map
|
|
830
|
+
//# sourceMappingURL=chunk-QGGTFP5L.js.map
|