@vercel/slack-bolt 1.2.3 → 1.2.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-F7XGHLWN.mjs → chunk-BTCCJT7U.mjs} +103 -14
- package/dist/chunk-BTCCJT7U.mjs.map +1 -0
- package/dist/{chunk-QGGTFP5L.js → chunk-RCI377NU.js} +103 -13
- package/dist/chunk-RCI377NU.js.map +1 -0
- package/dist/cli.js +47 -42
- package/dist/cli.js.map +1 -1
- package/dist/cli.mjs +11 -6
- 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/dist/chunk-F7XGHLWN.mjs.map +0 -1
- package/dist/chunk-QGGTFP5L.js.map +0 -1
|
@@ -567,28 +567,117 @@ var init_vercel = __esm({
|
|
|
567
567
|
});
|
|
568
568
|
|
|
569
569
|
// src/logger.ts
|
|
570
|
-
|
|
570
|
+
function isDebug() {
|
|
571
|
+
return process.env.VERCEL_SLACK_DEBUG === "1" || process.env.VERCEL_SLACK_DEBUG === "true";
|
|
572
|
+
}
|
|
573
|
+
function isSensitiveKey(key) {
|
|
574
|
+
const lower = key.toLowerCase();
|
|
575
|
+
if (SENSITIVE_BODY_KEYS.has(lower)) return true;
|
|
576
|
+
return SENSITIVE_KEY_PATTERNS.some((pattern) => lower.includes(pattern));
|
|
577
|
+
}
|
|
578
|
+
function redactValue(value) {
|
|
579
|
+
if (value.length <= 4) return "****";
|
|
580
|
+
return `****${value.slice(-4)}`;
|
|
581
|
+
}
|
|
582
|
+
function redactSensitiveFields(obj) {
|
|
583
|
+
if (Array.isArray(obj)) {
|
|
584
|
+
return obj.map((item) => redactSensitiveFields(item));
|
|
585
|
+
}
|
|
586
|
+
if (obj !== null && typeof obj === "object") {
|
|
587
|
+
const result = {};
|
|
588
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
589
|
+
if (isSensitiveKey(key) && typeof val === "string") {
|
|
590
|
+
result[key] = redactValue(val);
|
|
591
|
+
} else {
|
|
592
|
+
result[key] = redactSensitiveFields(val);
|
|
593
|
+
}
|
|
594
|
+
}
|
|
595
|
+
return result;
|
|
596
|
+
}
|
|
597
|
+
return obj;
|
|
598
|
+
}
|
|
599
|
+
function redactBody(body) {
|
|
600
|
+
try {
|
|
601
|
+
const parsed = JSON.parse(body);
|
|
602
|
+
const redacted = redactSensitiveFields(parsed);
|
|
603
|
+
return JSON.stringify(redacted);
|
|
604
|
+
} catch {
|
|
605
|
+
return `<non-JSON body, ${body.length} bytes>`;
|
|
606
|
+
}
|
|
607
|
+
}
|
|
608
|
+
function formatHeaders(headers) {
|
|
609
|
+
const entries = headers instanceof Headers ? [...headers.entries()] : Object.entries(headers ?? {});
|
|
610
|
+
const redacted = entries.map(
|
|
611
|
+
([k, v]) => REDACTED_HEADERS.has(k.toLowerCase()) ? [k, `****${v.slice(-4)}`] : [k, v]
|
|
612
|
+
);
|
|
613
|
+
return JSON.stringify(Object.fromEntries(redacted));
|
|
614
|
+
}
|
|
615
|
+
function enableFetchDebugLogging() {
|
|
616
|
+
if (globalThis.fetch.__debugPatched) return;
|
|
617
|
+
const originalFetch = globalThis.fetch;
|
|
618
|
+
const patched = async (input, init) => {
|
|
619
|
+
const method = init?.method ?? "GET";
|
|
620
|
+
const url = input instanceof Request ? input.url : input.toString();
|
|
621
|
+
const start = performance.now();
|
|
622
|
+
log.debug(`-> ${method} ${url}`);
|
|
623
|
+
log.debug(` headers: ${formatHeaders(init?.headers)}`);
|
|
624
|
+
if (typeof init?.body === "string")
|
|
625
|
+
log.debug(` body: ${redactBody(init.body)}`);
|
|
626
|
+
const response = await originalFetch(input, init);
|
|
627
|
+
const ms = (performance.now() - start).toFixed(0);
|
|
628
|
+
log.debug(`<- ${response.status} ${response.statusText} (${ms}ms)`);
|
|
629
|
+
log.debug(` headers: ${formatHeaders(response.headers)}`);
|
|
630
|
+
const clone = response.clone();
|
|
631
|
+
try {
|
|
632
|
+
const body = await clone.text();
|
|
633
|
+
if (body) log.debug(` body: ${redactBody(body)}`);
|
|
634
|
+
} catch {
|
|
635
|
+
}
|
|
636
|
+
return response;
|
|
637
|
+
};
|
|
638
|
+
patched.__debugPatched = true;
|
|
639
|
+
globalThis.fetch = patched;
|
|
640
|
+
}
|
|
641
|
+
var BOLD, RESET, DIM, GREEN, YELLOW, log, REDACTED_HEADERS, SENSITIVE_BODY_KEYS, SENSITIVE_KEY_PATTERNS, startMessage;
|
|
571
642
|
var init_logger = __esm({
|
|
572
643
|
"src/logger.ts"() {
|
|
573
|
-
isDebug = process.env.VERCEL_SLACK_DEBUG === "1" || process.env.VERCEL_SLACK_DEBUG === "true";
|
|
574
|
-
logger = {
|
|
575
|
-
info: (...args) => console.log(...args),
|
|
576
|
-
warn: (...args) => console.warn(...args),
|
|
577
|
-
error: (...args) => console.error(...args),
|
|
578
|
-
debug: (...args) => {
|
|
579
|
-
if (isDebug) console.debug(...args);
|
|
580
|
-
}
|
|
581
|
-
};
|
|
582
644
|
BOLD = "\x1B[1m";
|
|
583
645
|
RESET = "\x1B[0m";
|
|
646
|
+
DIM = "\x1B[2m";
|
|
584
647
|
GREEN = "\x1B[32m";
|
|
585
648
|
YELLOW = "\x1B[33m";
|
|
586
649
|
log = {
|
|
587
650
|
step: (msg) => console.log(` ${msg} ...`),
|
|
588
651
|
success: (msg) => console.log(`${GREEN}\u2713${RESET} ${msg}`),
|
|
589
652
|
info: (msg) => console.log(` ${msg}`),
|
|
590
|
-
warning: (msg) => console.log(`${YELLOW}\u26A0${RESET} ${msg}`)
|
|
653
|
+
warning: (msg) => console.log(`${YELLOW}\u26A0${RESET} ${msg}`),
|
|
654
|
+
error: (...args) => console.error(...args),
|
|
655
|
+
debug: (...args) => {
|
|
656
|
+
if (isDebug()) {
|
|
657
|
+
const msg = args.map((a) => typeof a === "string" ? a : String(a)).join(" ");
|
|
658
|
+
console.debug(`${DIM}${msg}${RESET}`);
|
|
659
|
+
}
|
|
660
|
+
}
|
|
591
661
|
};
|
|
662
|
+
REDACTED_HEADERS = /* @__PURE__ */ new Set(["authorization"]);
|
|
663
|
+
SENSITIVE_BODY_KEYS = /* @__PURE__ */ new Set([
|
|
664
|
+
"token",
|
|
665
|
+
"bot",
|
|
666
|
+
"app_level",
|
|
667
|
+
"user",
|
|
668
|
+
"secret",
|
|
669
|
+
"client_secret",
|
|
670
|
+
"signing_secret",
|
|
671
|
+
"verification_token",
|
|
672
|
+
"bot_token",
|
|
673
|
+
"user_token",
|
|
674
|
+
"app_level_token",
|
|
675
|
+
"value",
|
|
676
|
+
"access_token",
|
|
677
|
+
"refresh_token",
|
|
678
|
+
"password"
|
|
679
|
+
]);
|
|
680
|
+
SENSITIVE_KEY_PATTERNS = ["token", "secret", "password", "credential"];
|
|
592
681
|
startMessage = (version, branch, commit, appId) => {
|
|
593
682
|
const lines = [`\u25B2 @vercel/slack-bolt ${version ?? ""}`];
|
|
594
683
|
if (branch) lines.push(` - Branch: ${branch}`);
|
|
@@ -805,6 +894,6 @@ var init_preview = __esm({
|
|
|
805
894
|
}
|
|
806
895
|
});
|
|
807
896
|
|
|
808
|
-
export { authTest, cancelDeployment, createDeployment, deleteEnvironmentVariable, deleteSlackApp, getActiveBranches, getEnvironmentVariable, getEnvironmentVariables, getProject, init_logger, init_preview, init_slack, init_vercel, log,
|
|
809
|
-
//# sourceMappingURL=chunk-
|
|
810
|
-
//# sourceMappingURL=chunk-
|
|
897
|
+
export { authTest, cancelDeployment, createDeployment, deleteEnvironmentVariable, deleteSlackApp, enableFetchDebugLogging, getActiveBranches, getEnvironmentVariable, getEnvironmentVariables, getProject, init_logger, init_preview, init_slack, init_vercel, log, preview, startMessage };
|
|
898
|
+
//# sourceMappingURL=chunk-BTCCJT7U.mjs.map
|
|
899
|
+
//# sourceMappingURL=chunk-BTCCJT7U.mjs.map
|
|
@@ -0,0 +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-BTCCJT7U.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","function isDebug(): boolean {\n return (\n process.env.VERCEL_SLACK_DEBUG === \"1\" ||\n process.env.VERCEL_SLACK_DEBUG === \"true\"\n );\n}\n\nconst BOLD = \"\\x1b[1m\";\nconst RESET = \"\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\n\ntype PatchedFetch = typeof globalThis.fetch & { __debugPatched?: boolean };\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 error: (...args: unknown[]) => console.error(...args),\n debug: (...args: unknown[]) => {\n if (isDebug()) {\n const msg = args\n .map((a) => (typeof a === \"string\" ? a : String(a)))\n .join(\" \");\n console.debug(`${DIM}${msg}${RESET}`);\n }\n },\n};\n\nconst REDACTED_HEADERS = new Set([\"authorization\"]);\n\n/**\n * Keys whose values should be redacted when logging request/response bodies.\n * Matches are case-insensitive and checked against the lowercased key.\n */\nconst SENSITIVE_BODY_KEYS = new Set([\n \"token\",\n \"bot\",\n \"app_level\",\n \"user\",\n \"secret\",\n \"client_secret\",\n \"signing_secret\",\n \"verification_token\",\n \"bot_token\",\n \"user_token\",\n \"app_level_token\",\n \"value\",\n \"access_token\",\n \"refresh_token\",\n \"password\",\n]);\n\n/**\n * Key name fragments — if any of these appear in a key name (case-insensitive),\n * the value is redacted.\n */\nconst SENSITIVE_KEY_PATTERNS = [\"token\", \"secret\", \"password\", \"credential\"];\n\nfunction isSensitiveKey(key: string): boolean {\n const lower = key.toLowerCase();\n if (SENSITIVE_BODY_KEYS.has(lower)) return true;\n return SENSITIVE_KEY_PATTERNS.some((pattern) => lower.includes(pattern));\n}\n\nfunction redactValue(value: string): string {\n if (value.length <= 4) return \"****\";\n return `****${value.slice(-4)}`;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction redactSensitiveFields(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map((item) => redactSensitiveFields(item));\n }\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n if (isSensitiveKey(key) && typeof val === \"string\") {\n result[key] = redactValue(val);\n } else {\n result[key] = redactSensitiveFields(val);\n }\n }\n return result;\n }\n return obj;\n}\n\nfunction redactBody(body: string): string {\n try {\n const parsed = JSON.parse(body) as unknown;\n const redacted = redactSensitiveFields(parsed);\n return JSON.stringify(redacted);\n } catch {\n // Not JSON — redact entirely to be safe since we can't inspect the structure\n return `<non-JSON body, ${body.length} bytes>`;\n }\n}\n\nfunction formatHeaders(headers?: HeadersInit): string {\n const entries =\n headers instanceof Headers\n ? [...headers.entries()]\n : Object.entries(headers ?? {});\n const redacted = entries.map(([k, v]) =>\n REDACTED_HEADERS.has(k.toLowerCase()) ? [k, `****${v.slice(-4)}`] : [k, v],\n );\n return JSON.stringify(Object.fromEntries(redacted));\n}\n\nexport function enableFetchDebugLogging(): void {\n if ((globalThis.fetch as PatchedFetch).__debugPatched) return;\n\n const originalFetch = globalThis.fetch;\n const patched: PatchedFetch = async (input, init) => {\n const method = init?.method ?? \"GET\";\n const url = input instanceof Request ? input.url : input.toString();\n const start = performance.now();\n log.debug(`-> ${method} ${url}`);\n log.debug(` headers: ${formatHeaders(init?.headers)}`);\n if (typeof init?.body === \"string\")\n log.debug(` body: ${redactBody(init.body)}`);\n\n const response = await originalFetch(input, init);\n\n const ms = (performance.now() - start).toFixed(0);\n log.debug(`<- ${response.status} ${response.statusText} (${ms}ms)`);\n log.debug(` headers: ${formatHeaders(response.headers)}`);\n\n const clone = response.clone();\n try {\n const body = await clone.text();\n if (body) log.debug(` body: ${redactBody(body)}`);\n } catch {}\n\n return response;\n };\n patched.__debugPatched = true;\n globalThis.fetch = patched;\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"]}
|
|
@@ -575,28 +575,117 @@ var init_vercel = chunkQHMZVK6J_js.__esm({
|
|
|
575
575
|
});
|
|
576
576
|
|
|
577
577
|
// src/logger.ts
|
|
578
|
-
|
|
578
|
+
function isDebug() {
|
|
579
|
+
return process.env.VERCEL_SLACK_DEBUG === "1" || process.env.VERCEL_SLACK_DEBUG === "true";
|
|
580
|
+
}
|
|
581
|
+
function isSensitiveKey(key) {
|
|
582
|
+
const lower = key.toLowerCase();
|
|
583
|
+
if (SENSITIVE_BODY_KEYS.has(lower)) return true;
|
|
584
|
+
return SENSITIVE_KEY_PATTERNS.some((pattern) => lower.includes(pattern));
|
|
585
|
+
}
|
|
586
|
+
function redactValue(value) {
|
|
587
|
+
if (value.length <= 4) return "****";
|
|
588
|
+
return `****${value.slice(-4)}`;
|
|
589
|
+
}
|
|
590
|
+
function redactSensitiveFields(obj) {
|
|
591
|
+
if (Array.isArray(obj)) {
|
|
592
|
+
return obj.map((item) => redactSensitiveFields(item));
|
|
593
|
+
}
|
|
594
|
+
if (obj !== null && typeof obj === "object") {
|
|
595
|
+
const result = {};
|
|
596
|
+
for (const [key, val] of Object.entries(obj)) {
|
|
597
|
+
if (isSensitiveKey(key) && typeof val === "string") {
|
|
598
|
+
result[key] = redactValue(val);
|
|
599
|
+
} else {
|
|
600
|
+
result[key] = redactSensitiveFields(val);
|
|
601
|
+
}
|
|
602
|
+
}
|
|
603
|
+
return result;
|
|
604
|
+
}
|
|
605
|
+
return obj;
|
|
606
|
+
}
|
|
607
|
+
function redactBody(body) {
|
|
608
|
+
try {
|
|
609
|
+
const parsed = JSON.parse(body);
|
|
610
|
+
const redacted = redactSensitiveFields(parsed);
|
|
611
|
+
return JSON.stringify(redacted);
|
|
612
|
+
} catch {
|
|
613
|
+
return `<non-JSON body, ${body.length} bytes>`;
|
|
614
|
+
}
|
|
615
|
+
}
|
|
616
|
+
function formatHeaders(headers) {
|
|
617
|
+
const entries = headers instanceof Headers ? [...headers.entries()] : Object.entries(headers ?? {});
|
|
618
|
+
const redacted = entries.map(
|
|
619
|
+
([k, v]) => REDACTED_HEADERS.has(k.toLowerCase()) ? [k, `****${v.slice(-4)}`] : [k, v]
|
|
620
|
+
);
|
|
621
|
+
return JSON.stringify(Object.fromEntries(redacted));
|
|
622
|
+
}
|
|
623
|
+
function enableFetchDebugLogging() {
|
|
624
|
+
if (globalThis.fetch.__debugPatched) return;
|
|
625
|
+
const originalFetch = globalThis.fetch;
|
|
626
|
+
const patched = async (input, init) => {
|
|
627
|
+
const method = init?.method ?? "GET";
|
|
628
|
+
const url = input instanceof Request ? input.url : input.toString();
|
|
629
|
+
const start = performance.now();
|
|
630
|
+
exports.log.debug(`-> ${method} ${url}`);
|
|
631
|
+
exports.log.debug(` headers: ${formatHeaders(init?.headers)}`);
|
|
632
|
+
if (typeof init?.body === "string")
|
|
633
|
+
exports.log.debug(` body: ${redactBody(init.body)}`);
|
|
634
|
+
const response = await originalFetch(input, init);
|
|
635
|
+
const ms = (performance.now() - start).toFixed(0);
|
|
636
|
+
exports.log.debug(`<- ${response.status} ${response.statusText} (${ms}ms)`);
|
|
637
|
+
exports.log.debug(` headers: ${formatHeaders(response.headers)}`);
|
|
638
|
+
const clone = response.clone();
|
|
639
|
+
try {
|
|
640
|
+
const body = await clone.text();
|
|
641
|
+
if (body) exports.log.debug(` body: ${redactBody(body)}`);
|
|
642
|
+
} catch {
|
|
643
|
+
}
|
|
644
|
+
return response;
|
|
645
|
+
};
|
|
646
|
+
patched.__debugPatched = true;
|
|
647
|
+
globalThis.fetch = patched;
|
|
648
|
+
}
|
|
649
|
+
var BOLD, RESET, DIM, GREEN, YELLOW; exports.log = void 0; var REDACTED_HEADERS, SENSITIVE_BODY_KEYS, SENSITIVE_KEY_PATTERNS; exports.startMessage = void 0;
|
|
579
650
|
var init_logger = chunkQHMZVK6J_js.__esm({
|
|
580
651
|
"src/logger.ts"() {
|
|
581
|
-
isDebug = process.env.VERCEL_SLACK_DEBUG === "1" || process.env.VERCEL_SLACK_DEBUG === "true";
|
|
582
|
-
exports.logger = {
|
|
583
|
-
info: (...args) => console.log(...args),
|
|
584
|
-
warn: (...args) => console.warn(...args),
|
|
585
|
-
error: (...args) => console.error(...args),
|
|
586
|
-
debug: (...args) => {
|
|
587
|
-
if (isDebug) console.debug(...args);
|
|
588
|
-
}
|
|
589
|
-
};
|
|
590
652
|
BOLD = "\x1B[1m";
|
|
591
653
|
RESET = "\x1B[0m";
|
|
654
|
+
DIM = "\x1B[2m";
|
|
592
655
|
GREEN = "\x1B[32m";
|
|
593
656
|
YELLOW = "\x1B[33m";
|
|
594
657
|
exports.log = {
|
|
595
658
|
step: (msg) => console.log(` ${msg} ...`),
|
|
596
659
|
success: (msg) => console.log(`${GREEN}\u2713${RESET} ${msg}`),
|
|
597
660
|
info: (msg) => console.log(` ${msg}`),
|
|
598
|
-
warning: (msg) => console.log(`${YELLOW}\u26A0${RESET} ${msg}`)
|
|
661
|
+
warning: (msg) => console.log(`${YELLOW}\u26A0${RESET} ${msg}`),
|
|
662
|
+
error: (...args) => console.error(...args),
|
|
663
|
+
debug: (...args) => {
|
|
664
|
+
if (isDebug()) {
|
|
665
|
+
const msg = args.map((a) => typeof a === "string" ? a : String(a)).join(" ");
|
|
666
|
+
console.debug(`${DIM}${msg}${RESET}`);
|
|
667
|
+
}
|
|
668
|
+
}
|
|
599
669
|
};
|
|
670
|
+
REDACTED_HEADERS = /* @__PURE__ */ new Set(["authorization"]);
|
|
671
|
+
SENSITIVE_BODY_KEYS = /* @__PURE__ */ new Set([
|
|
672
|
+
"token",
|
|
673
|
+
"bot",
|
|
674
|
+
"app_level",
|
|
675
|
+
"user",
|
|
676
|
+
"secret",
|
|
677
|
+
"client_secret",
|
|
678
|
+
"signing_secret",
|
|
679
|
+
"verification_token",
|
|
680
|
+
"bot_token",
|
|
681
|
+
"user_token",
|
|
682
|
+
"app_level_token",
|
|
683
|
+
"value",
|
|
684
|
+
"access_token",
|
|
685
|
+
"refresh_token",
|
|
686
|
+
"password"
|
|
687
|
+
]);
|
|
688
|
+
SENSITIVE_KEY_PATTERNS = ["token", "secret", "password", "credential"];
|
|
600
689
|
exports.startMessage = (version, branch, commit, appId) => {
|
|
601
690
|
const lines = [`\u25B2 @vercel/slack-bolt ${version ?? ""}`];
|
|
602
691
|
if (branch) lines.push(` - Branch: ${branch}`);
|
|
@@ -818,6 +907,7 @@ exports.cancelDeployment = cancelDeployment;
|
|
|
818
907
|
exports.createDeployment = createDeployment;
|
|
819
908
|
exports.deleteEnvironmentVariable = deleteEnvironmentVariable;
|
|
820
909
|
exports.deleteSlackApp = deleteSlackApp;
|
|
910
|
+
exports.enableFetchDebugLogging = enableFetchDebugLogging;
|
|
821
911
|
exports.getActiveBranches = getActiveBranches;
|
|
822
912
|
exports.getEnvironmentVariable = getEnvironmentVariable;
|
|
823
913
|
exports.getEnvironmentVariables = getEnvironmentVariables;
|
|
@@ -826,5 +916,5 @@ exports.init_logger = init_logger;
|
|
|
826
916
|
exports.init_preview = init_preview;
|
|
827
917
|
exports.init_slack = init_slack;
|
|
828
918
|
exports.init_vercel = init_vercel;
|
|
829
|
-
//# sourceMappingURL=chunk-
|
|
830
|
-
//# sourceMappingURL=chunk-
|
|
919
|
+
//# sourceMappingURL=chunk-RCI377NU.js.map
|
|
920
|
+
//# sourceMappingURL=chunk-RCI377NU.js.map
|
|
@@ -0,0 +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":["__esm","init_errors","app","crypto","log","startMessage","preview","fs","path"],"mappings":"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","file":"chunk-RCI377NU.js","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","function isDebug(): boolean {\n return (\n process.env.VERCEL_SLACK_DEBUG === \"1\" ||\n process.env.VERCEL_SLACK_DEBUG === \"true\"\n );\n}\n\nconst BOLD = \"\\x1b[1m\";\nconst RESET = \"\\x1b[0m\";\nconst DIM = \"\\x1b[2m\";\nconst GREEN = \"\\x1b[32m\";\nconst YELLOW = \"\\x1b[33m\";\n\ntype PatchedFetch = typeof globalThis.fetch & { __debugPatched?: boolean };\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 error: (...args: unknown[]) => console.error(...args),\n debug: (...args: unknown[]) => {\n if (isDebug()) {\n const msg = args\n .map((a) => (typeof a === \"string\" ? a : String(a)))\n .join(\" \");\n console.debug(`${DIM}${msg}${RESET}`);\n }\n },\n};\n\nconst REDACTED_HEADERS = new Set([\"authorization\"]);\n\n/**\n * Keys whose values should be redacted when logging request/response bodies.\n * Matches are case-insensitive and checked against the lowercased key.\n */\nconst SENSITIVE_BODY_KEYS = new Set([\n \"token\",\n \"bot\",\n \"app_level\",\n \"user\",\n \"secret\",\n \"client_secret\",\n \"signing_secret\",\n \"verification_token\",\n \"bot_token\",\n \"user_token\",\n \"app_level_token\",\n \"value\",\n \"access_token\",\n \"refresh_token\",\n \"password\",\n]);\n\n/**\n * Key name fragments — if any of these appear in a key name (case-insensitive),\n * the value is redacted.\n */\nconst SENSITIVE_KEY_PATTERNS = [\"token\", \"secret\", \"password\", \"credential\"];\n\nfunction isSensitiveKey(key: string): boolean {\n const lower = key.toLowerCase();\n if (SENSITIVE_BODY_KEYS.has(lower)) return true;\n return SENSITIVE_KEY_PATTERNS.some((pattern) => lower.includes(pattern));\n}\n\nfunction redactValue(value: string): string {\n if (value.length <= 4) return \"****\";\n return `****${value.slice(-4)}`;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nfunction redactSensitiveFields(obj: any): any {\n if (Array.isArray(obj)) {\n return obj.map((item) => redactSensitiveFields(item));\n }\n if (obj !== null && typeof obj === \"object\") {\n const result: Record<string, unknown> = {};\n for (const [key, val] of Object.entries(obj)) {\n if (isSensitiveKey(key) && typeof val === \"string\") {\n result[key] = redactValue(val);\n } else {\n result[key] = redactSensitiveFields(val);\n }\n }\n return result;\n }\n return obj;\n}\n\nfunction redactBody(body: string): string {\n try {\n const parsed = JSON.parse(body) as unknown;\n const redacted = redactSensitiveFields(parsed);\n return JSON.stringify(redacted);\n } catch {\n // Not JSON — redact entirely to be safe since we can't inspect the structure\n return `<non-JSON body, ${body.length} bytes>`;\n }\n}\n\nfunction formatHeaders(headers?: HeadersInit): string {\n const entries =\n headers instanceof Headers\n ? [...headers.entries()]\n : Object.entries(headers ?? {});\n const redacted = entries.map(([k, v]) =>\n REDACTED_HEADERS.has(k.toLowerCase()) ? [k, `****${v.slice(-4)}`] : [k, v],\n );\n return JSON.stringify(Object.fromEntries(redacted));\n}\n\nexport function enableFetchDebugLogging(): void {\n if ((globalThis.fetch as PatchedFetch).__debugPatched) return;\n\n const originalFetch = globalThis.fetch;\n const patched: PatchedFetch = async (input, init) => {\n const method = init?.method ?? \"GET\";\n const url = input instanceof Request ? input.url : input.toString();\n const start = performance.now();\n log.debug(`-> ${method} ${url}`);\n log.debug(` headers: ${formatHeaders(init?.headers)}`);\n if (typeof init?.body === \"string\")\n log.debug(` body: ${redactBody(init.body)}`);\n\n const response = await originalFetch(input, init);\n\n const ms = (performance.now() - start).toFixed(0);\n log.debug(`<- ${response.status} ${response.statusText} (${ms}ms)`);\n log.debug(` headers: ${formatHeaders(response.headers)}`);\n\n const clone = response.clone();\n try {\n const body = await clone.text();\n if (body) log.debug(` body: ${redactBody(body)}`);\n } catch {}\n\n return response;\n };\n patched.__debugPatched = true;\n globalThis.fetch = patched;\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"]}
|