From 39e05d9dec134888ed69a59a471c3d35267f75c3 Mon Sep 17 00:00:00 2001 From: Mia Moir Date: Wed, 23 Oct 2024 18:13:16 +0100 Subject: [PATCH 1/2] Bump @slack/bolt version and make slackApp available globally --- app/(authenticated)/calendar/new/actions.ts | 2 +- app/(authenticated)/calendar/new/page.tsx | 2 +- components/slack/SlackChannelName.tsx | 2 +- components/slack/SlackChannelsProvider.tsx | 2 +- features/calendar/check_with_tech_actions.ts | 6 +- features/userFeedback/index.ts | 2 +- lib/slack/slackApiConnection.ts | 9 +- package.json | 2 +- server/index.ts | 3 +- yarn.lock | 711 +++++++++++++------ 10 files changed, 499 insertions(+), 242 deletions(-) diff --git a/app/(authenticated)/calendar/new/actions.ts b/app/(authenticated)/calendar/new/actions.ts index 5a876a24..151ae05a 100644 --- a/app/(authenticated)/calendar/new/actions.ts +++ b/app/(authenticated)/calendar/new/actions.ts @@ -10,7 +10,7 @@ import { getCurrentUser } from "@/lib/auth/server"; import slackApiConnection, { isSlackEnabled, } from "@/lib/slack/slackApiConnection"; -import { ConversationsInfoResponse } from "@slack/web-api/dist/response/ConversationsInfoResponse"; +import { ConversationsInfoResponse } from "@slack/web-api/dist/types/response/ConversationsInfoResponse"; import * as Calendar from "@/features/calendar"; import { revalidatePath } from "next/cache"; import { env } from "process"; diff --git a/app/(authenticated)/calendar/new/page.tsx b/app/(authenticated)/calendar/new/page.tsx index 88150223..14bb51a5 100644 --- a/app/(authenticated)/calendar/new/page.tsx +++ b/app/(authenticated)/calendar/new/page.tsx @@ -10,7 +10,7 @@ import slackApiConnection, { import { SlackChannelsProvider } from "@/components/slack/SlackChannelsProvider"; import { SlackEnabledProvider } from "@/components/slack/SlackEnabledProvider"; import { App } from "@slack/bolt"; -import { Channel } from "@slack/web-api/dist/response/ConversationsListResponse"; +import { Channel } from "@slack/web-api/dist/types/response/ConversationsListResponse"; import { env } from "@/lib/env"; import { createEvent } from "./actions"; import { PageInfo } from "@/components/PageInfo"; diff --git a/components/slack/SlackChannelName.tsx b/components/slack/SlackChannelName.tsx index cbda9f0a..1e22c312 100644 --- a/components/slack/SlackChannelName.tsx +++ b/components/slack/SlackChannelName.tsx @@ -2,7 +2,7 @@ import slackApiConnection, { isSlackEnabled, } from "@/lib/slack/slackApiConnection"; import { Text } from "@mantine/core"; -import { ConversationsInfoResponse } from "@slack/web-api/dist/response"; +import { ConversationsInfoResponse } from "@slack/web-api/dist/types/response"; export default async function SlackChannelName({ slackChannelID, diff --git a/components/slack/SlackChannelsProvider.tsx b/components/slack/SlackChannelsProvider.tsx index 3abded45..0119c3a7 100644 --- a/components/slack/SlackChannelsProvider.tsx +++ b/components/slack/SlackChannelsProvider.tsx @@ -1,7 +1,7 @@ "use client"; import invariant from "@/lib/invariant"; -import { Channel } from "@slack/web-api/dist/response/ConversationsListResponse"; +import { Channel } from "@slack/web-api/dist/types/response/ConversationsListResponse"; import { createContext, useContext } from "react"; const SlackChannelContext = createContext | null>(null); diff --git a/features/calendar/check_with_tech_actions.ts b/features/calendar/check_with_tech_actions.ts index f988a820..06c1a352 100644 --- a/features/calendar/check_with_tech_actions.ts +++ b/features/calendar/check_with_tech_actions.ts @@ -17,11 +17,11 @@ import { ButtonAction, SlackViewMiddlewareArgs, ViewSubmitAction, +} from "@slack/bolt"; +import { ContextBlock, - Block, - SectionBlock, RichTextBlock, -} from "@slack/bolt"; +} from "@slack/types/dist/block-kit/blocks"; import dayjs from "dayjs"; import { env } from "@/lib/env"; import { z } from "zod"; diff --git a/features/userFeedback/index.ts b/features/userFeedback/index.ts index a96ab117..d7059566 100644 --- a/features/userFeedback/index.ts +++ b/features/userFeedback/index.ts @@ -6,7 +6,7 @@ import invariant from "@/lib/invariant"; import slackApiConnection, { isSlackEnabled, } from "@/lib/slack/slackApiConnection"; -import { KnownBlock } from "@slack/bolt"; +import { KnownBlock } from "@slack/types/dist/block-kit/blocks"; export async function submit( type: "bug" | "feature", diff --git a/lib/slack/slackApiConnection.ts b/lib/slack/slackApiConnection.ts index 7d05296d..4af6a76c 100644 --- a/lib/slack/slackApiConnection.ts +++ b/lib/slack/slackApiConnection.ts @@ -7,12 +7,12 @@ declare global { export const isSlackEnabled = env.SLACK_ENABLED === "true"; -async function slackApiConnection() { +async function slackApiConnection(create?: boolean): Promise { if (!isSlackEnabled) { throw new Error("Slack is not enabled"); } - if (!global.slack) { - global.slack = new App({ + if (create) { + return new App({ token: env.SLACK_BOT_TOKEN, signingSecret: env.SLACK_SIGNING_SECRET, socketMode: env.SLACK_DISABLE_SOCKET_MODE !== "true", @@ -24,8 +24,7 @@ async function slackApiConnection() { }, }); } - - return global.slack; + return (globalThis as unknown as { slackApp: App }).slackApp; } export default slackApiConnection; diff --git a/package.json b/package.json index d25707af..fb9ac97a 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,7 @@ "@mux/mux-video-react": "^0.11.4", "@prisma/client": "^5.8.1", "@sentry/nextjs": "^8.28.0", - "@slack/bolt": "^3.21.4", + "@slack/bolt": "^4.0.0", "@tanstack/react-query": "^5.51.23", "@trpc/server": "^10.33.1", "@types/async": "^3.2.20", diff --git a/server/index.ts b/server/index.ts index 5ff6002d..75c71b24 100644 --- a/server/index.ts +++ b/server/index.ts @@ -29,7 +29,8 @@ app.prepare().then(async () => { let slackApp: App | undefined; if (isSlackEnabled) { - slackApp = await slackApiConnection(); + slackApp = await slackApiConnection(true); + (globalThis as unknown as { slackApp: App }).slackApp = slackApp; await setupActionHandlers(slackApp); } diff --git a/yarn.lock b/yarn.lock index e01b3325..a5ac3446 100644 --- a/yarn.lock +++ b/yarn.lock @@ -4023,38 +4023,26 @@ __metadata: languageName: node linkType: hard -"@slack/bolt@npm:^3.21.4": - version: 3.21.4 - resolution: "@slack/bolt@npm:3.21.4" +"@slack/bolt@npm:^4.0.0": + version: 4.0.0 + resolution: "@slack/bolt@npm:4.0.0" dependencies: "@slack/logger": ^4.0.0 - "@slack/oauth": ^2.6.3 - "@slack/socket-mode": ^1.3.6 + "@slack/oauth": ^3 + "@slack/socket-mode": ^2.0.2 "@slack/types": ^2.13.0 - "@slack/web-api": ^6.12.1 - "@types/express": ^4.16.1 - "@types/promise.allsettled": ^1.0.3 - "@types/tsscmp": ^1.0.0 + "@slack/web-api": ^7 + "@types/express": ^4.17.21 axios: ^1.7.4 - express: ^4.16.4 + express: ^5.0.0 path-to-regexp: ^8.1.0 - promise.allsettled: ^1.0.2 - raw-body: ^2.3.3 + raw-body: ^3 tsscmp: ^1.0.6 - checksum: 0b81d26fea596a8b191352ffe1754bb9a6a5d0133948954d75b8ae6c309a1f846430253372013660b8ab88369253bd75f9f211bcc5a407823ae6783c1191aeff - languageName: node - linkType: hard - -"@slack/logger@npm:^3.0.0": - version: 3.0.0 - resolution: "@slack/logger@npm:3.0.0" - dependencies: - "@types/node": ">=12.0.0" - checksum: 6512d0e9e4be47ea465705ab9b6e6901f36fa981da0d4a657fde649d452b567b351002049b5ee0a22569b5119bf6c2f61befd5b8022d878addb7a99c91b03389 + checksum: 1be195272e1f5ff204e57c2892daa2c0b1b8bc49cc29f8348659cce5fa8677e9dc856659ebd8d1ef02f473642f78357ca082e453a4251ef8b865e0a5985887c7 languageName: node linkType: hard -"@slack/logger@npm:^4.0.0": +"@slack/logger@npm:^4, @slack/logger@npm:^4.0.0": version: 4.0.0 resolution: "@slack/logger@npm:4.0.0" dependencies: @@ -4063,58 +4051,58 @@ __metadata: languageName: node linkType: hard -"@slack/oauth@npm:^2.6.3": - version: 2.6.3 - resolution: "@slack/oauth@npm:2.6.3" +"@slack/oauth@npm:^3": + version: 3.0.1 + resolution: "@slack/oauth@npm:3.0.1" dependencies: - "@slack/logger": ^3.0.0 - "@slack/web-api": ^6.12.1 - "@types/jsonwebtoken": ^8.3.7 - "@types/node": ">=12" - jsonwebtoken: ^9.0.0 - lodash.isstring: ^4.0.1 - checksum: 6b556da01bd2b026177b4074cd44bdeff00165fb4297ef8f350035ca79ababfff0c0993a297a46ab742bb97469c6c1c8f5790c328ecf6370290fe31014ba3c5e + "@slack/logger": ^4 + "@slack/web-api": ^7.3.4 + "@types/jsonwebtoken": ^9 + "@types/node": ">=18" + jsonwebtoken: ^9 + lodash.isstring: ^4 + checksum: a0101869a7b7028fef41d437fb55858f52ebea9f10e7eacb9dbf738f169711d29828e05683de894f1698be81c34818fe2190076a1fc66ae9dc9b1f81240eb301 languageName: node linkType: hard -"@slack/socket-mode@npm:^1.3.6": - version: 1.3.6 - resolution: "@slack/socket-mode@npm:1.3.6" +"@slack/socket-mode@npm:^2.0.2": + version: 2.0.2 + resolution: "@slack/socket-mode@npm:2.0.2" dependencies: - "@slack/logger": ^3.0.0 - "@slack/web-api": ^6.12.1 - "@types/node": ">=12.0.0" - "@types/ws": ^7.4.7 + "@slack/logger": ^4 + "@slack/web-api": ^7.3.4 + "@types/node": ">=18" + "@types/ws": ^8 eventemitter3: ^5 - finity: ^0.5.4 - ws: ^7.5.3 - checksum: a84c15a6d25a21f76258d1ccebeec1d78b0a0dac0b02ffdfcb3596e7acda5459e4b99a42207eab7e57bed7a2a1d85ac173adf5e07aa66949eac9cc9df3b43947 + ws: ^8 + checksum: 0c7d9ddb267b03682111ea6525d24491d6b12017fe893da9110d52ee071f0b81b335affb2f3871f5d78327086d4e30c4dd91582a1932195901f943630a7ddbe4 languageName: node linkType: hard -"@slack/types@npm:^2.11.0, @slack/types@npm:^2.13.0": - version: 2.13.1 - resolution: "@slack/types@npm:2.13.1" - checksum: c90c2cc9ebda1c83182317c975659df1947a1821f5e4a56986b66100b198fea802443787d1a955e1b44a739006d87b96fc4d933adfaff8567d25c3e6b7efcf54 +"@slack/types@npm:^2.13.0, @slack/types@npm:^2.9.0": + version: 2.14.0 + resolution: "@slack/types@npm:2.14.0" + checksum: fbef74d50d0de8f16125f7178bd2e664a69eeefd827b09c6f78153957278fc4400049685c756076e7dbcabd04c22730ac783bcc5d36fd588c7749d35f02c2afd languageName: node linkType: hard -"@slack/web-api@npm:^6.12.1": - version: 6.12.1 - resolution: "@slack/web-api@npm:6.12.1" +"@slack/web-api@npm:^7, @slack/web-api@npm:^7.3.4": + version: 7.6.0 + resolution: "@slack/web-api@npm:7.6.0" dependencies: - "@slack/logger": ^3.0.0 - "@slack/types": ^2.11.0 - "@types/is-stream": ^1.1.0 - "@types/node": ">=12.0.0" + "@slack/logger": ^4.0.0 + "@slack/types": ^2.9.0 + "@types/node": ">=18.0.0" + "@types/retry": 0.12.0 axios: ^1.7.4 - eventemitter3: ^3.1.0 - form-data: ^2.5.0 + eventemitter3: ^5.0.1 + form-data: ^4.0.0 is-electron: 2.2.2 - is-stream: ^1.1.0 - p-queue: ^6.6.1 - p-retry: ^4.0.0 - checksum: 29b71d7f8114bb35a601c6b9fee81ddf86d51afd36ff5fcf6c091f44255ff9c34fcc5eb9f034a4834c243d8a4e6c57a99d9c00c7480fd4bff52e3894bbab575f + is-stream: ^2 + p-queue: ^6 + p-retry: ^4 + retry: ^0.13.1 + checksum: 2910e55ef6539beac64ea774978f3e1ae7648017d550cddda2ef6acd8ceb648d904e8ed23f417cad54b7a90d12eb39dbb8731b34c78509aa46be0948fd954840 languageName: node linkType: hard @@ -5611,7 +5599,7 @@ __metadata: languageName: node linkType: hard -"@types/express@npm:^4.16.1": +"@types/express@npm:^4.17.21": version: 4.17.21 resolution: "@types/express@npm:4.17.21" dependencies: @@ -5675,15 +5663,6 @@ __metadata: languageName: node linkType: hard -"@types/is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "@types/is-stream@npm:1.1.0" - dependencies: - "@types/node": "*" - checksum: 23fcb06cd8adc0124d4c44071bd4b447c41f5e4c2eccb6166789c7fc0992b566e2e8b628a3800ff4472b686d9085adbec203925068bf72e350e085650e83adec - languageName: node - linkType: hard - "@types/istanbul-lib-coverage@npm:*, @types/istanbul-lib-coverage@npm:^2.0.0, @types/istanbul-lib-coverage@npm:^2.0.1": version: 2.0.4 resolution: "@types/istanbul-lib-coverage@npm:2.0.4" @@ -5723,12 +5702,12 @@ __metadata: languageName: node linkType: hard -"@types/jsonwebtoken@npm:^8.3.7": - version: 8.5.9 - resolution: "@types/jsonwebtoken@npm:8.5.9" +"@types/jsonwebtoken@npm:^9": + version: 9.0.7 + resolution: "@types/jsonwebtoken@npm:9.0.7" dependencies: "@types/node": "*" - checksum: 33815ab02d1371b423118316b7706d2f2ec03eeee5e1494be72da50425d2384e5e0a09ea193f7a5ab4b4f6a9c5847147305f50e965f3d927a95bdf8adb471b2a + checksum: 872b62e2a50ec399d695402ccddfeb5cd66a6c3d28511f27453b932b6b67eb82c2d0ecaa864939848b88b3a8276c2492647bf5707bc82a6ac7e420d3412b9047 languageName: node linkType: hard @@ -5823,12 +5802,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:>=12, @types/node@npm:>=12.0.0, @types/node@npm:>=18.0.0": - version: 20.9.0 - resolution: "@types/node@npm:20.9.0" +"@types/node@npm:>=18, @types/node@npm:>=18.0.0": + version: 22.7.8 + resolution: "@types/node@npm:22.7.8" dependencies: - undici-types: ~5.26.4 - checksum: bfd927da6bff8a32051fa44bb47ca32a56d2c8bc8ba0170770f181cc1fa3c0b05863c9b930f0ba8604a48d5eb0d319166601709ca53bf2deae0025d8b6c6b8a3 + undici-types: ~6.19.2 + checksum: c1dd36bd0bf82588e61f82edb29a792f21ce902f90cc5485591f9fd60cec3ea9172e044bf7b1c0849e7cf3a5a01da39516db260cb65cb0b94904010e00634a1c languageName: node linkType: hard @@ -5898,13 +5877,6 @@ __metadata: languageName: node linkType: hard -"@types/promise.allsettled@npm:^1.0.3": - version: 1.0.6 - resolution: "@types/promise.allsettled@npm:1.0.6" - checksum: 07dca8da25b49c0dc323201095552d86159483dc910dc61c345357c9c196b8498e6be4bf260cc2a9a539a725108df61b53db1d82723ed9886bb7c72fedd65f14 - languageName: node - linkType: hard - "@types/prop-types@npm:*": version: 15.7.5 resolution: "@types/prop-types@npm:15.7.5" @@ -6006,13 +5978,6 @@ __metadata: languageName: node linkType: hard -"@types/tsscmp@npm:^1.0.0": - version: 1.0.2 - resolution: "@types/tsscmp@npm:1.0.2" - checksum: c02c0bb9f14f550947fea9fa6f9f3c28e6b2d47a6d049a5450ed466fb0c8a685b6ff37d070d4c43d930a5affc9d828f5e16e35cde1e734de228ffd2df76ac2a8 - languageName: node - linkType: hard - "@types/unist@npm:^2.0.0": version: 2.0.7 resolution: "@types/unist@npm:2.0.7" @@ -6020,12 +5985,12 @@ __metadata: languageName: node linkType: hard -"@types/ws@npm:^7.4.7": - version: 7.4.7 - resolution: "@types/ws@npm:7.4.7" +"@types/ws@npm:^8": + version: 8.5.12 + resolution: "@types/ws@npm:8.5.12" dependencies: "@types/node": "*" - checksum: b4c9b8ad209620c9b21e78314ce4ff07515c0cadab9af101c1651e7bfb992d7fd933bd8b9c99d110738fd6db523ed15f82f29f50b45510288da72e964dedb1a3 + checksum: ddefb6ad1671f70ce73b38a5f47f471d4d493864fca7c51f002a86e5993d031294201c5dced6d5018fb8905ad46888d65c7f20dd54fc165910b69f42fba9a6d0 languageName: node linkType: hard @@ -6548,6 +6513,16 @@ __metadata: languageName: node linkType: hard +"accepts@npm:^2.0.0": + version: 2.0.0 + resolution: "accepts@npm:2.0.0" + dependencies: + mime-types: ^3.0.0 + negotiator: ^1.0.0 + checksum: 49fe6c050cb6f6ff4e771b4d88324fca4d3127865f2473872e818dca127d809ba3aa8fdfc7acb51dd3c5bade7311ca6b8cfff7015ea6db2f7eb9c8444d223a4f + languageName: node + linkType: hard + "accepts@npm:~1.3.4, accepts@npm:~1.3.5, accepts@npm:~1.3.8": version: 1.3.8 resolution: "accepts@npm:1.3.8" @@ -6945,6 +6920,13 @@ __metadata: languageName: node linkType: hard +"array-flatten@npm:3.0.0": + version: 3.0.0 + resolution: "array-flatten@npm:3.0.0" + checksum: ad00c51ca70cf837501fb6da823ba39bc6a86b43d0b76d840daa02fe0f8e68e94ad5bc2d0d038053118b879aaca8ea6168c32c7387a2fa5b118ad28db4f1f863 + languageName: node + linkType: hard + "array-includes@npm:^3.1.6": version: 3.1.6 resolution: "array-includes@npm:3.1.6" @@ -7002,19 +6984,6 @@ __metadata: languageName: node linkType: hard -"array.prototype.map@npm:^1.0.5": - version: 1.0.6 - resolution: "array.prototype.map@npm:1.0.6" - dependencies: - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - es-array-method-boxes-properly: ^1.0.0 - is-string: ^1.0.7 - checksum: dfba063cdfb5faba9ee32d5836dc23f3963c2bf7c7ea7d745ee0a96bacf663cbb32ab0bf17d8f65ac6e8c91a162efdea8edbc8b36aed9d17687ce482ba60d91f - languageName: node - linkType: hard - "array.prototype.tosorted@npm:^1.1.1": version: 1.1.1 resolution: "array.prototype.tosorted@npm:1.1.1" @@ -7432,6 +7401,25 @@ __metadata: languageName: node linkType: hard +"body-parser@npm:^2.0.1": + version: 2.0.1 + resolution: "body-parser@npm:2.0.1" + dependencies: + bytes: 3.1.2 + content-type: ~1.0.5 + debug: 3.1.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.5.2 + on-finished: 2.4.1 + qs: 6.13.0 + raw-body: ^3.0.0 + type-is: ~1.6.18 + unpipe: 1.0.0 + checksum: 78f2fb1a16b86c7a471aed9be3ab250f37c2b88f8b41774c9850e505ff2b41226c542dfaa3c29db3ecd96dcc18eac76bc1f94bc4f7296ede8f024cdcd5e130de + languageName: node + linkType: hard + "boolbase@npm:^1.0.0": version: 1.0.0 resolution: "boolbase@npm:1.0.0" @@ -7758,6 +7746,19 @@ __metadata: languageName: node linkType: hard +"call-bind@npm:^1.0.7": + version: 1.0.7 + resolution: "call-bind@npm:1.0.7" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + set-function-length: ^1.2.1 + checksum: 295c0c62b90dd6522e6db3b0ab1ce26bdf9e7404215bda13cfee25b626b5ff1a7761324d58d38b1ef1607fc65aca2d06e44d2e18d0dfc6c14b465b00d8660029 + languageName: node + linkType: hard + "callsites@npm:^3.0.0": version: 3.1.0 resolution: "callsites@npm:3.1.0" @@ -8094,7 +8095,7 @@ __metadata: languageName: node linkType: hard -"combined-stream@npm:^1.0.6, combined-stream@npm:^1.0.8": +"combined-stream@npm:^1.0.8": version: 1.0.8 resolution: "combined-stream@npm:1.0.8" dependencies: @@ -8232,7 +8233,16 @@ __metadata: languageName: node linkType: hard -"content-type@npm:~1.0.4": +"content-disposition@npm:^1.0.0": + version: 1.0.0 + resolution: "content-disposition@npm:1.0.0" + dependencies: + safe-buffer: 5.2.1 + checksum: b27e2579fefe0ecf78238bb652fbc750671efce8344f0c6f05235b12433e6a965adb40906df1ac1fdde23e8f9f0e58385e44640e633165420f3f47d830ae0398 + languageName: node + linkType: hard + +"content-type@npm:^1.0.5, content-type@npm:~1.0.4, content-type@npm:~1.0.5": version: 1.0.5 resolution: "content-type@npm:1.0.5" checksum: 566271e0a251642254cde0f845f9dd4f9856e52d988f4eb0d0dcffbb7a1f8ec98de7a5215fc628f3bce30fe2fb6fd2bc064b562d721658c59b544e2d34ea2766 @@ -8260,6 +8270,13 @@ __metadata: languageName: node linkType: hard +"cookie-signature@npm:^1.2.1": + version: 1.2.1 + resolution: "cookie-signature@npm:1.2.1" + checksum: bb464aacac390b5d7d8ead2d6fff7c1c3b7378c7d0250921f48923fe889688e081ab33950448929db5f24d4f9f1506589a7ee1c685de8f12a3fdb30c49667ec5 + languageName: node + linkType: hard + "cookie@npm:0.5.0": version: 0.5.0 resolution: "cookie@npm:0.5.0" @@ -8267,6 +8284,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:0.7.1": + version: 0.7.1 + resolution: "cookie@npm:0.7.1" + checksum: cec5e425549b3650eb5c3498a9ba3cde0b9cd419e3b36e4b92739d30b4d89e0b678b98c1ddc209ce7cf958cd3215671fd6ac47aec21f10c2a0cc68abd399d8a7 + languageName: node + linkType: hard + "cookie@npm:~0.4.1": version: 0.4.2 resolution: "cookie@npm:0.4.2" @@ -8513,6 +8537,15 @@ __metadata: languageName: node linkType: hard +"debug@npm:3.1.0": + version: 3.1.0 + resolution: "debug@npm:3.1.0" + dependencies: + ms: 2.0.0 + checksum: 0b52718ab957254a5b3ca07fc34543bc778f358620c206a08452251eb7fc193c3ea3505072acbf4350219c14e2d71ceb7bdaa0d3370aa630b50da790458d08b3 + languageName: node + linkType: hard + "debug@npm:4, debug@npm:4.3.4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" @@ -8525,6 +8558,18 @@ __metadata: languageName: node linkType: hard +"debug@npm:4.3.6, debug@npm:^4.3.1, debug@npm:^4.3.5": + version: 4.3.6 + resolution: "debug@npm:4.3.6" + dependencies: + ms: 2.1.2 + peerDependenciesMeta: + supports-color: + optional: true + checksum: 1630b748dea3c581295e02137a9f5cbe2c1d85fea35c1e6597a65ca2b16a6fce68cec61b299d480787ef310ba927dc8c92d3061faba0ad06c6a724672f66be7f + languageName: node + linkType: hard + "debug@npm:^3.2.7": version: 3.2.7 resolution: "debug@npm:3.2.7" @@ -8546,18 +8591,6 @@ __metadata: languageName: node linkType: hard -"debug@npm:^4.3.1, debug@npm:^4.3.5": - version: 4.3.6 - resolution: "debug@npm:4.3.6" - dependencies: - ms: 2.1.2 - peerDependenciesMeta: - supports-color: - optional: true - checksum: 1630b748dea3c581295e02137a9f5cbe2c1d85fea35c1e6597a65ca2b16a6fce68cec61b299d480787ef310ba927dc8c92d3061faba0ad06c6a724672f66be7f - languageName: node - linkType: hard - "decompress-response@npm:^6.0.0": version: 6.0.0 resolution: "decompress-response@npm:6.0.0" @@ -8663,6 +8696,17 @@ __metadata: languageName: node linkType: hard +"define-data-property@npm:^1.1.4": + version: 1.1.4 + resolution: "define-data-property@npm:1.1.4" + dependencies: + es-define-property: ^1.0.0 + es-errors: ^1.3.0 + gopd: ^1.0.1 + checksum: 8068ee6cab694d409ac25936eb861eea704b7763f7f342adbdfe337fc27c78d7ae0eff2364b2917b58c508d723c7a074326d068eef2e45c4edcd85cf94d0313b + languageName: node + linkType: hard + "define-lazy-prop@npm:^2.0.0": version: 2.0.0 resolution: "define-lazy-prop@npm:2.0.0" @@ -8759,7 +8803,7 @@ __metadata: languageName: node linkType: hard -"destroy@npm:1.2.0": +"destroy@npm:1.2.0, destroy@npm:^1.2.0": version: 1.2.0 resolution: "destroy@npm:1.2.0" checksum: 0acb300b7478a08b92d810ab229d5afe0d2f4399272045ab22affa0d99dbaf12637659411530a6fcd597a9bdac718fc94373a61a95b4651bbc7b83684a565e38 @@ -9087,6 +9131,13 @@ __metadata: languageName: node linkType: hard +"encodeurl@npm:^2.0.0, encodeurl@npm:~2.0.0": + version: 2.0.0 + resolution: "encodeurl@npm:2.0.0" + checksum: abf5cd51b78082cf8af7be6785813c33b6df2068ce5191a40ca8b1afe6a86f9230af9a9ce694a5ce4665955e5c1120871826df9c128a642e09c58d592e2807fe + languageName: node + linkType: hard + "encodeurl@npm:~1.0.2": version: 1.0.2 resolution: "encodeurl@npm:1.0.2" @@ -9308,14 +9359,23 @@ __metadata: languageName: node linkType: hard -"es-array-method-boxes-properly@npm:^1.0.0": +"es-define-property@npm:^1.0.0": version: 1.0.0 - resolution: "es-array-method-boxes-properly@npm:1.0.0" - checksum: 2537fcd1cecf187083890bc6f5236d3a26bf39237433587e5bf63392e88faae929dbba78ff0120681a3f6f81c23fe3816122982c160d63b38c95c830b633b826 + resolution: "es-define-property@npm:1.0.0" + dependencies: + get-intrinsic: ^1.2.4 + checksum: f66ece0a887b6dca71848fa71f70461357c0e4e7249696f81bad0a1f347eed7b31262af4a29f5d726dc026426f085483b6b90301855e647aa8e21936f07293c6 languageName: node linkType: hard -"es-get-iterator@npm:^1.0.2, es-get-iterator@npm:^1.1.3": +"es-errors@npm:^1.3.0": + version: 1.3.0 + resolution: "es-errors@npm:1.3.0" + checksum: ec1414527a0ccacd7f15f4a3bc66e215f04f595ba23ca75cdae0927af099b5ec865f9f4d33e9d7e86f512f252876ac77d4281a7871531a50678132429b1271b5 + languageName: node + linkType: hard + +"es-get-iterator@npm:^1.1.3": version: 1.1.3 resolution: "es-get-iterator@npm:1.1.3" dependencies: @@ -9588,7 +9648,7 @@ __metadata: languageName: node linkType: hard -"escape-html@npm:~1.0.3": +"escape-html@npm:^1.0.3, escape-html@npm:~1.0.3": version: 1.0.3 resolution: "escape-html@npm:1.0.3" checksum: 6213ca9ae00d0ab8bccb6d8d4e0a98e76237b2410302cf7df70aaa6591d509a2a37ce8998008cbecae8fc8ffaadf3fb0229535e6a145f3ce0b211d060decbb24 @@ -9966,7 +10026,7 @@ __metadata: languageName: node linkType: hard -"etag@npm:~1.8.1": +"etag@npm:^1.8.1, etag@npm:~1.8.1": version: 1.8.1 resolution: "etag@npm:1.8.1" checksum: 571aeb3dbe0f2bbd4e4fadbdb44f325fc75335cd5f6f6b6a091e6a06a9f25ed5392f0863c5442acb0646787446e816f13cbfc6edce5b07658541dff573cab1ff @@ -9980,13 +10040,6 @@ __metadata: languageName: node linkType: hard -"eventemitter3@npm:^3.1.0": - version: 3.1.2 - resolution: "eventemitter3@npm:3.1.2" - checksum: 81e4e82b8418f5cfd986d2b4a2fa5397ac4eb8134e09bcb47005545e22fdf8e9e61d5c053d34651112245aae411bdfe6d0ad5511da0400743fef5fc38bfcfbe3 - languageName: node - linkType: hard - "eventemitter3@npm:^4.0.4": version: 4.0.7 resolution: "eventemitter3@npm:4.0.7" @@ -10084,7 +10137,7 @@ __metadata: languageName: node linkType: hard -"express@npm:^4.16.4, express@npm:^4.17.3": +"express@npm:^4.17.3": version: 4.18.2 resolution: "express@npm:4.18.2" dependencies: @@ -10123,6 +10176,46 @@ __metadata: languageName: node linkType: hard +"express@npm:^5.0.0": + version: 5.0.1 + resolution: "express@npm:5.0.1" + dependencies: + accepts: ^2.0.0 + body-parser: ^2.0.1 + content-disposition: ^1.0.0 + content-type: ~1.0.4 + cookie: 0.7.1 + cookie-signature: ^1.2.1 + debug: 4.3.6 + depd: 2.0.0 + encodeurl: ~2.0.0 + escape-html: ~1.0.3 + etag: ~1.8.1 + finalhandler: ^2.0.0 + fresh: 2.0.0 + http-errors: 2.0.0 + merge-descriptors: ^2.0.0 + methods: ~1.1.2 + mime-types: ^3.0.0 + on-finished: 2.4.1 + once: 1.4.0 + parseurl: ~1.3.3 + proxy-addr: ~2.0.7 + qs: 6.13.0 + range-parser: ~1.2.1 + router: ^2.0.0 + safe-buffer: 5.2.1 + send: ^1.1.0 + serve-static: ^2.1.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: ^2.0.0 + utils-merge: 1.0.1 + vary: ~1.1.2 + checksum: d1a3e934a2e3c5d7491049dabbedf6290e942b081a76e88598f3b0870ae53d4177c116ab5056bdbb32fc3cf556d3388362b689d06b73aaba7de67c2af29fd25b + languageName: node + linkType: hard + "extend@npm:^3.0.0, extend@npm:^3.0.2": version: 3.0.2 resolution: "extend@npm:3.0.2" @@ -10319,6 +10412,21 @@ __metadata: languageName: node linkType: hard +"finalhandler@npm:^2.0.0": + version: 2.0.0 + resolution: "finalhandler@npm:2.0.0" + dependencies: + debug: 2.6.9 + encodeurl: ~1.0.2 + escape-html: ~1.0.3 + on-finished: 2.4.1 + parseurl: ~1.3.3 + statuses: 2.0.1 + unpipe: ~1.0.0 + checksum: 51403fd0b8f156aabb91040875d01e4f9f4fae8e356427dbf19d29956fc3a28c3fccfcb8bd50ea7318b390e67b8906a821a7ec9526f44de2f116fa409fed80de + languageName: node + linkType: hard + "find-cache-dir@npm:^2.0.0": version: 2.1.0 resolution: "find-cache-dir@npm:2.1.0" @@ -10390,13 +10498,6 @@ __metadata: languageName: node linkType: hard -"finity@npm:^0.5.4": - version: 0.5.4 - resolution: "finity@npm:0.5.4" - checksum: eeea74de356ba963231108c3f8e2de44b4114497389121d603f8c3e8316b8d0772ff06b731af08ef5d6ca6b0e3a0fffab452122eca48837a98a2f7e5548b6be2 - languageName: node - linkType: hard - "flat-cache@npm:^3.0.4": version: 3.0.4 resolution: "flat-cache@npm:3.0.4" @@ -10487,17 +10588,6 @@ __metadata: languageName: node linkType: hard -"form-data@npm:^2.5.0": - version: 2.5.1 - resolution: "form-data@npm:2.5.1" - dependencies: - asynckit: ^0.4.0 - combined-stream: ^1.0.6 - mime-types: ^2.1.12 - checksum: 5134ada56cc246b293a1ac7678dba6830000603a3979cf83ff7b2f21f2e3725202237cfb89e32bcb38a1d35727efbd3c3a22e65b42321e8ade8eec01ce755d08 - languageName: node - linkType: hard - "form-data@npm:^3.0.0": version: 3.0.1 resolution: "form-data@npm:3.0.1" @@ -10510,13 +10600,13 @@ __metadata: linkType: hard "form-data@npm:^4.0.0": - version: 4.0.0 - resolution: "form-data@npm:4.0.0" + version: 4.0.1 + resolution: "form-data@npm:4.0.1" dependencies: asynckit: ^0.4.0 combined-stream: ^1.0.8 mime-types: ^2.1.12 - checksum: 01135bf8675f9d5c61ff18e2e2932f719ca4de964e3be90ef4c36aacfc7b9cb2fceb5eca0b7e0190e3383fe51c5b37f4cb80b62ca06a99aaabfcfd6ac7c9328c + checksum: ccee458cd5baf234d6b57f349fe9cc5f9a2ea8fd1af5ecda501a18fd1572a6dd3bf08a49f00568afd995b6a65af34cb8dec083cf9d582c4e621836499498dd84 languageName: node linkType: hard @@ -10534,13 +10624,20 @@ __metadata: languageName: node linkType: hard -"fresh@npm:0.5.2": +"fresh@npm:0.5.2, fresh@npm:^0.5.2": version: 0.5.2 resolution: "fresh@npm:0.5.2" checksum: 13ea8b08f91e669a64e3ba3a20eb79d7ca5379a81f1ff7f4310d54e2320645503cc0c78daedc93dfb6191287295f6479544a649c64d8e41a1c0fb0c221552346 languageName: node linkType: hard +"fresh@npm:2.0.0": + version: 2.0.0 + resolution: "fresh@npm:2.0.0" + checksum: 38b9828352c6271e2a0dd8bdd985d0100dbbc4eb8b6a03286071dd6f7d96cfaacd06d7735701ad9a95870eb3f4555e67c08db1dcfe24c2e7bb87383c72fae1d2 + languageName: node + linkType: hard + "fs-constants@npm:^1.0.0": version: 1.0.0 resolution: "fs-constants@npm:1.0.0" @@ -10654,6 +10751,13 @@ __metadata: languageName: node linkType: hard +"function-bind@npm:^1.1.2": + version: 1.1.2 + resolution: "function-bind@npm:1.1.2" + checksum: 2b0ff4ce708d99715ad14a6d1f894e2a83242e4a52ccfcefaee5e40050562e5f6dafc1adbb4ce2d4ab47279a45dc736ab91ea5042d843c3c092820dfe032efb1 + languageName: node + linkType: hard + "function.prototype.name@npm:^1.1.5": version: 1.1.5 resolution: "function.prototype.name@npm:1.1.5" @@ -10773,6 +10877,19 @@ __metadata: languageName: node linkType: hard +"get-intrinsic@npm:^1.2.4": + version: 1.2.4 + resolution: "get-intrinsic@npm:1.2.4" + dependencies: + es-errors: ^1.3.0 + function-bind: ^1.1.2 + has-proto: ^1.0.1 + has-symbols: ^1.0.3 + hasown: ^2.0.0 + checksum: 414e3cdf2c203d1b9d7d33111df746a4512a1aa622770b361dadddf8ed0b5aeb26c560f49ca077e24bfafb0acb55ca908d1f709216ccba33ffc548ec8a79a951 + languageName: node + linkType: hard + "get-nonce@npm:^1.0.0": version: 1.0.1 resolution: "get-nonce@npm:1.0.1" @@ -11180,6 +11297,15 @@ __metadata: languageName: node linkType: hard +"has-property-descriptors@npm:^1.0.2": + version: 1.0.2 + resolution: "has-property-descriptors@npm:1.0.2" + dependencies: + es-define-property: ^1.0.0 + checksum: fcbb246ea2838058be39887935231c6d5788babed499d0e9d0cc5737494c48aba4fe17ba1449e0d0fbbb1e36175442faa37f9c427ae357d6ccb1d895fbcd3de3 + languageName: node + linkType: hard + "has-proto@npm:^1.0.1": version: 1.0.1 resolution: "has-proto@npm:1.0.1" @@ -11240,6 +11366,15 @@ __metadata: languageName: node linkType: hard +"hasown@npm:^2.0.0": + version: 2.0.2 + resolution: "hasown@npm:2.0.2" + dependencies: + function-bind: ^1.1.2 + checksum: e8516f776a15149ca6c6ed2ae3110c417a00b62260e222590e54aa367cbcd6ed99122020b37b7fbdf05748df57b265e70095d7bf35a47660587619b15ffb93db + languageName: node + linkType: hard + "he@npm:^1.2.0": version: 1.2.0 resolution: "he@npm:1.2.0" @@ -11355,7 +11490,7 @@ __metadata: languageName: node linkType: hard -"http-errors@npm:2.0.0": +"http-errors@npm:2.0.0, http-errors@npm:^2.0.0": version: 2.0.0 resolution: "http-errors@npm:2.0.0" dependencies: @@ -11474,7 +11609,7 @@ __metadata: "@mux/mux-video-react": ^0.11.4 "@prisma/client": ^5.8.1 "@sentry/nextjs": ^8.28.0 - "@slack/bolt": ^3.21.4 + "@slack/bolt": ^4.0.0 "@storybook/addon-essentials": ^7.0.27 "@storybook/addon-interactions": ^7.0.27 "@storybook/addon-links": ^7.0.27 @@ -11637,7 +11772,16 @@ __metadata: languageName: node linkType: hard -"iconv-lite@npm:^0.6.2": +"iconv-lite@npm:0.5.2": + version: 0.5.2 + resolution: "iconv-lite@npm:0.5.2" + dependencies: + safer-buffer: ">= 2.1.2 < 3" + checksum: aa184914b74db7a23feb98cad3e4ed22058f2aa27c5613a127327423b3230a0b934665c2aecf5dc657a58a59891c92fd1e721ed160d1b2f3c682bc26e3fe3f14 + languageName: node + linkType: hard + +"iconv-lite@npm:0.6.3, iconv-lite@npm:^0.6.2": version: 0.6.3 resolution: "iconv-lite@npm:0.6.3" dependencies: @@ -12111,6 +12255,13 @@ __metadata: languageName: node linkType: hard +"is-promise@npm:4.0.0": + version: 4.0.0 + resolution: "is-promise@npm:4.0.0" + checksum: 0b46517ad47b00b6358fd6553c83ec1f6ba9acd7ffb3d30a0bf519c5c69e7147c132430452351b8a9fc198f8dd6c4f76f8e6f5a7f100f8c77d57d9e0f4261a8a + languageName: node + linkType: hard + "is-reference@npm:1.2.1": version: 1.2.1 resolution: "is-reference@npm:1.2.1" @@ -12146,14 +12297,7 @@ __metadata: languageName: node linkType: hard -"is-stream@npm:^1.1.0": - version: 1.1.0 - resolution: "is-stream@npm:1.1.0" - checksum: 063c6bec9d5647aa6d42108d4c59723d2bd4ae42135a2d4db6eadbd49b7ea05b750fd69d279e5c7c45cf9da753ad2c00d8978be354d65aa9f6bb434969c6a2ae - languageName: node - linkType: hard - -"is-stream@npm:^2.0.0": +"is-stream@npm:^2, is-stream@npm:^2.0.0": version: 2.0.1 resolution: "is-stream@npm:2.0.1" checksum: b8e05ccdf96ac330ea83c12450304d4a591f9958c11fd17bed240af8d5ffe08aedafa4c0f4cfccd4d28dc9d4d129daca1023633d5c11601a6cbc77521f6fae66 @@ -12328,23 +12472,6 @@ __metadata: languageName: node linkType: hard -"iterate-iterator@npm:^1.0.1": - version: 1.0.2 - resolution: "iterate-iterator@npm:1.0.2" - checksum: 97b3ed4f2bebe038be57d03277879e406b2c537ceeeab7f82d4167f9a3cff872cc2cc5da3dc9920ff544ca247329d2a4d44121bb8ef8d0807a72176bdbc17c84 - languageName: node - linkType: hard - -"iterate-value@npm:^1.0.2": - version: 1.0.2 - resolution: "iterate-value@npm:1.0.2" - dependencies: - es-get-iterator: ^1.0.2 - iterate-iterator: ^1.0.1 - checksum: 446a4181657df1872e5020713206806757157db6ab375dee05eb4565b66e1244d7a99cd36ce06862261ad4bd059e66ba8192f62b5d1ff41d788c3b61953af6c3 - languageName: node - linkType: hard - "iterator.prototype@npm:^1.1.2": version: 1.1.2 resolution: "iterator.prototype@npm:1.1.2" @@ -12646,7 +12773,7 @@ __metadata: languageName: node linkType: hard -"jsonwebtoken@npm:^9.0.0": +"jsonwebtoken@npm:^9": version: 9.0.2 resolution: "jsonwebtoken@npm:9.0.2" dependencies: @@ -12966,7 +13093,7 @@ __metadata: languageName: node linkType: hard -"lodash.isstring@npm:^4.0.1": +"lodash.isstring@npm:^4, lodash.isstring@npm:^4.0.1": version: 4.0.1 resolution: "lodash.isstring@npm:4.0.1" checksum: eaac87ae9636848af08021083d796e2eea3d02e80082ab8a9955309569cb3a463ce97fd281d7dc119e402b2e7d8c54a23914b15d2fc7fff56461511dc8937ba0 @@ -13211,6 +13338,13 @@ __metadata: languageName: node linkType: hard +"media-typer@npm:^1.1.0": + version: 1.1.0 + resolution: "media-typer@npm:1.1.0" + checksum: a58dd60804df73c672942a7253ccc06815612326dc1c0827984b1a21704466d7cde351394f47649e56cf7415e6ee2e26e000e81b51b3eebb5a93540e8bf93cbd + languageName: node + linkType: hard + "memfs@npm:^3.4.1, memfs@npm:^3.4.3": version: 3.5.3 resolution: "memfs@npm:3.5.3" @@ -13236,6 +13370,13 @@ __metadata: languageName: node linkType: hard +"merge-descriptors@npm:^2.0.0": + version: 2.0.0 + resolution: "merge-descriptors@npm:2.0.0" + checksum: e383332e700a94682d0125a36c8be761142a1320fc9feeb18e6e36647c9edf064271645f5669b2c21cf352116e561914fd8aa831b651f34db15ef4038c86696a + languageName: node + linkType: hard + "merge-stream@npm:^2.0.0": version: 2.0.0 resolution: "merge-stream@npm:2.0.0" @@ -13286,7 +13427,14 @@ __metadata: languageName: node linkType: hard -"mime-types@npm:^2.1.12, mime-types@npm:^2.1.25, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": +"mime-db@npm:^1.53.0": + version: 1.53.0 + resolution: "mime-db@npm:1.53.0" + checksum: 3fd9380bdc0b085d0b56b580e4f89ca4fc3b823722310d795c248f0806b9a80afd5d8f4347f015ad943b9ecfa7cc0b71dffa0db96fa776d01a13474821a2c7fb + languageName: node + linkType: hard + +"mime-types@npm:^2.1.12, mime-types@npm:^2.1.25, mime-types@npm:^2.1.27, mime-types@npm:^2.1.31, mime-types@npm:^2.1.35, mime-types@npm:~2.1.24, mime-types@npm:~2.1.34": version: 2.1.35 resolution: "mime-types@npm:2.1.35" dependencies: @@ -13295,6 +13443,15 @@ __metadata: languageName: node linkType: hard +"mime-types@npm:^3.0.0": + version: 3.0.0 + resolution: "mime-types@npm:3.0.0" + dependencies: + mime-db: ^1.53.0 + checksum: 2d87c94ff682c61b9a5727c37ba66e199aba2d6a85465b41722ca7281629c32848601b540339d12a97d1b6ab39f94f9e63a72530dd7c22ee57ff25e1038af039 + languageName: node + linkType: hard + "mime@npm:1.6.0": version: 1.6.0 resolution: "mime@npm:1.6.0" @@ -13576,7 +13733,7 @@ __metadata: languageName: node linkType: hard -"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1": +"ms@npm:2.1.3, ms@npm:^2.0.0, ms@npm:^2.1.1, ms@npm:^2.1.3": version: 2.1.3 resolution: "ms@npm:2.1.3" checksum: aa92de608021b242401676e35cfa5aa42dd70cbdc082b916da7fb925c542173e36bce97ea3e804923fe92c0ad991434e4a38327e15a1b5b5f945d66df615ae6d @@ -13645,6 +13802,13 @@ __metadata: languageName: node linkType: hard +"negotiator@npm:^1.0.0": + version: 1.0.0 + resolution: "negotiator@npm:1.0.0" + checksum: 20ebfe79b2d2e7cf9cbc8239a72662b584f71164096e6e8896c8325055497c96f6b80cd22c258e8a2f2aa382a787795ec3ee8b37b422a302c7d4381b0d5ecfbb + languageName: node + linkType: hard + "neo-async@npm:^2.5.0, neo-async@npm:^2.6.0, neo-async@npm:^2.6.1, neo-async@npm:^2.6.2": version: 2.6.2 resolution: "neo-async@npm:2.6.2" @@ -14034,6 +14198,13 @@ __metadata: languageName: node linkType: hard +"object-inspect@npm:^1.13.1": + version: 1.13.2 + resolution: "object-inspect@npm:1.13.2" + checksum: 9f850b3c045db60e0e97746e809ee4090d6ce62195af17dd1e9438ac761394a7d8ec4f7906559aea5424eaf61e35d3e53feded2ccd5f62fcc7d9670d3c8eb353 + languageName: node + linkType: hard + "object-is@npm:^1.0.1, object-is@npm:^1.1.5": version: 1.1.5 resolution: "object-is@npm:1.1.5" @@ -14132,7 +14303,7 @@ __metadata: languageName: node linkType: hard -"on-finished@npm:2.4.1": +"on-finished@npm:2.4.1, on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" dependencies: @@ -14148,7 +14319,7 @@ __metadata: languageName: node linkType: hard -"once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": +"once@npm:1.4.0, once@npm:^1.3.0, once@npm:^1.3.1, once@npm:^1.4.0": version: 1.4.0 resolution: "once@npm:1.4.0" dependencies: @@ -14337,7 +14508,7 @@ __metadata: languageName: node linkType: hard -"p-queue@npm:^6.6.1": +"p-queue@npm:^6": version: 6.6.2 resolution: "p-queue@npm:6.6.2" dependencies: @@ -14347,7 +14518,7 @@ __metadata: languageName: node linkType: hard -"p-retry@npm:^4.0.0": +"p-retry@npm:^4": version: 4.6.2 resolution: "p-retry@npm:4.6.2" dependencies: @@ -14445,7 +14616,7 @@ __metadata: languageName: node linkType: hard -"parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": +"parseurl@npm:^1.3.3, parseurl@npm:~1.3.2, parseurl@npm:~1.3.3": version: 1.3.3 resolution: "parseurl@npm:1.3.3" checksum: 407cee8e0a3a4c5cd472559bca8b6a45b82c124e9a4703302326e9ab60fc1081442ada4e02628efef1eb16197ddc7f8822f5a91fd7d7c86b51f530aedb17dfa2 @@ -14545,10 +14716,10 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:^8.1.0": - version: 8.1.0 - resolution: "path-to-regexp@npm:8.1.0" - checksum: 982b784f8dff704c04c79dc3e26d51d2dba340e6bd513a8bdc48559a8543d730547d9d2355122166171eb509236e7524802ed643f8a77d527e12c69ffc74f97f +"path-to-regexp@npm:^8.0.0, path-to-regexp@npm:^8.1.0": + version: 8.2.0 + resolution: "path-to-regexp@npm:8.2.0" + checksum: 56e13e45962e776e9e7cd72e87a441cfe41f33fd539d097237ceb16adc922281136ca12f5a742962e33d8dda9569f630ba594de56d8b7b6e49adf31803c5e771 languageName: node linkType: hard @@ -15217,20 +15388,6 @@ __metadata: languageName: node linkType: hard -"promise.allsettled@npm:^1.0.2": - version: 1.0.7 - resolution: "promise.allsettled@npm:1.0.7" - dependencies: - array.prototype.map: ^1.0.5 - call-bind: ^1.0.2 - define-properties: ^1.2.0 - es-abstract: ^1.22.1 - get-intrinsic: ^1.2.1 - iterate-value: ^1.0.2 - checksum: 96186392286e5ab9aef1a1a725c061c8cf268b6cf141f151daa3834bb8e1680f3b159af6536ce59cf80d4a6a5ad1d8371d05759980cc6c90d58800ddb0a7c119 - languageName: node - linkType: hard - "prompts@npm:^2.4.0": version: 2.4.2 resolution: "prompts@npm:2.4.2" @@ -15369,6 +15526,15 @@ __metadata: languageName: node linkType: hard +"qs@npm:6.13.0": + version: 6.13.0 + resolution: "qs@npm:6.13.0" + dependencies: + side-channel: ^1.0.6 + checksum: e9404dc0fc2849245107108ce9ec2766cde3be1b271de0bf1021d049dc5b98d1a2901e67b431ac5509f865420a7ed80b7acb3980099fe1c118a1c5d2e1432ad8 + languageName: node + linkType: hard + "qs@npm:^6.10.0, qs@npm:^6.11.0": version: 6.11.2 resolution: "qs@npm:6.11.2" @@ -15474,15 +15640,15 @@ __metadata: languageName: node linkType: hard -"raw-body@npm:^2.3.3": - version: 2.5.2 - resolution: "raw-body@npm:2.5.2" +"raw-body@npm:^3, raw-body@npm:^3.0.0": + version: 3.0.0 + resolution: "raw-body@npm:3.0.0" dependencies: bytes: 3.1.2 http-errors: 2.0.0 - iconv-lite: 0.4.24 + iconv-lite: 0.6.3 unpipe: 1.0.0 - checksum: ba1583c8d8a48e8fbb7a873fdbb2df66ea4ff83775421bfe21ee120140949ab048200668c47d9ae3880012f6e217052690628cf679ddfbd82c9fc9358d574676 + checksum: 25b7cf7964183db322e819050d758a5abd0f22c51e9f37884ea44a9ed6855a1fb61f8caa8ec5b61d07e69f54db43dbbc08ad98ef84556696d6aa806be247af0e languageName: node linkType: hard @@ -16268,6 +16434,21 @@ __metadata: languageName: node linkType: hard +"router@npm:^2.0.0": + version: 2.0.0 + resolution: "router@npm:2.0.0" + dependencies: + array-flatten: 3.0.0 + is-promise: 4.0.0 + methods: ~1.1.2 + parseurl: ~1.3.3 + path-to-regexp: ^8.0.0 + setprototypeof: 1.2.0 + utils-merge: 1.0.1 + checksum: 810ed3a4287ae90abe91908c49cc0b1faa0eb04b161bf266e29e789c7d9718f74ca1931445d9c8fe53c08ca30614d5856c167a4b4b3bb217276a96452b02b8ab + languageName: node + linkType: hard + "run-applescript@npm:^5.0.0": version: 5.0.0 resolution: "run-applescript@npm:5.0.0" @@ -16524,6 +16705,26 @@ __metadata: languageName: node linkType: hard +"send@npm:^1.0.0, send@npm:^1.1.0": + version: 1.1.0 + resolution: "send@npm:1.1.0" + dependencies: + debug: ^4.3.5 + destroy: ^1.2.0 + encodeurl: ^2.0.0 + escape-html: ^1.0.3 + etag: ^1.8.1 + fresh: ^0.5.2 + http-errors: ^2.0.0 + mime-types: ^2.1.35 + ms: ^2.1.3 + on-finished: ^2.4.1 + range-parser: ^1.2.1 + statuses: ^2.0.1 + checksum: cb82bec244cb0e54ffaadf657dc79f55f350428c0d1f58511b9aae74ba87b07078907e462b8fefe13380f592baebd4b9e184204f3b74bd4558e7561669204b0f + languageName: node + linkType: hard + "serialize-javascript@npm:^6.0.1": version: 6.0.1 resolution: "serialize-javascript@npm:6.0.1" @@ -16558,6 +16759,18 @@ __metadata: languageName: node linkType: hard +"serve-static@npm:^2.1.0": + version: 2.1.0 + resolution: "serve-static@npm:2.1.0" + dependencies: + encodeurl: ^2.0.0 + escape-html: ^1.0.3 + parseurl: ^1.3.3 + send: ^1.0.0 + checksum: 569f5af7f2a3073a97e3217263e7f4173fafe0861d73049c13ba99f0a9bc3708db747e6657f8f736cdbcec39c3271c795f7f4ffeab0b8933201b53c7728d3ed2 + languageName: node + linkType: hard + "server-only@npm:^0.0.1": version: 0.0.1 resolution: "server-only@npm:0.0.1" @@ -16579,6 +16792,20 @@ __metadata: languageName: node linkType: hard +"set-function-length@npm:^1.2.1": + version: 1.2.2 + resolution: "set-function-length@npm:1.2.2" + dependencies: + define-data-property: ^1.1.4 + es-errors: ^1.3.0 + function-bind: ^1.1.2 + get-intrinsic: ^1.2.4 + gopd: ^1.0.1 + has-property-descriptors: ^1.0.2 + checksum: a8248bdacdf84cb0fab4637774d9fb3c7a8e6089866d04c817583ff48e14149c87044ce683d7f50759a8c50fb87c7a7e173535b06169c87ef76f5fb276dfff72 + languageName: node + linkType: hard + "set-function-name@npm:^2.0.0, set-function-name@npm:^2.0.1": version: 2.0.1 resolution: "set-function-name@npm:2.0.1" @@ -16689,6 +16916,18 @@ __metadata: languageName: node linkType: hard +"side-channel@npm:^1.0.6": + version: 1.0.6 + resolution: "side-channel@npm:1.0.6" + dependencies: + call-bind: ^1.0.7 + es-errors: ^1.3.0 + get-intrinsic: ^1.2.4 + object-inspect: ^1.13.1 + checksum: bfc1afc1827d712271453e91b7cd3878ac0efd767495fd4e594c4c2afaa7963b7b510e249572bfd54b0527e66e4a12b61b80c061389e129755f34c493aad9b97 + languageName: node + linkType: hard + "signal-exit@npm:^3.0.0, signal-exit@npm:^3.0.2, signal-exit@npm:^3.0.3, signal-exit@npm:^3.0.7": version: 3.0.7 resolution: "signal-exit@npm:3.0.7" @@ -16975,7 +17214,7 @@ __metadata: languageName: node linkType: hard -"statuses@npm:2.0.1": +"statuses@npm:2.0.1, statuses@npm:^2.0.1": version: 2.0.1 resolution: "statuses@npm:2.0.1" checksum: 18c7623fdb8f646fb213ca4051be4df7efb3484d4ab662937ca6fbef7ced9b9e12842709872eb3020cc3504b93bde88935c9f6417489627a7786f24f8031cbcb @@ -17958,6 +18197,17 @@ __metadata: languageName: node linkType: hard +"type-is@npm:^2.0.0": + version: 2.0.0 + resolution: "type-is@npm:2.0.0" + dependencies: + content-type: ^1.0.5 + media-typer: ^1.1.0 + mime-types: ^3.0.0 + checksum: 571c7daca550d5e0d9d8a71c33bde1a0c12ddee3bc77aa2f7c62c39a4f1f52ee7770d1c2eeba21c306ac3627b2cf3a1b8417bbb1af5d65829e092dcf3356038c + languageName: node + linkType: hard + "type-is@npm:~1.6.18": version: 1.6.18 resolution: "type-is@npm:1.6.18" @@ -18097,6 +18347,13 @@ __metadata: languageName: node linkType: hard +"undici-types@npm:~6.19.2": + version: 6.19.8 + resolution: "undici-types@npm:6.19.8" + checksum: de51f1b447d22571cf155dfe14ff6d12c5bdaec237c765085b439c38ca8518fc360e88c70f99469162bf2e14188a7b0bcb06e1ed2dc031042b984b0bb9544017 + languageName: node + linkType: hard + "unfetch@npm:^4.2.0": version: 4.2.0 resolution: "unfetch@npm:4.2.0" @@ -18795,18 +19052,18 @@ __metadata: languageName: node linkType: hard -"ws@npm:^7.5.3": - version: 7.5.9 - resolution: "ws@npm:7.5.9" +"ws@npm:^8": + version: 8.18.0 + resolution: "ws@npm:8.18.0" peerDependencies: bufferutil: ^4.0.1 - utf-8-validate: ^5.0.2 + utf-8-validate: ">=5.0.2" peerDependenciesMeta: bufferutil: optional: true utf-8-validate: optional: true - checksum: c3c100a181b731f40b7f2fddf004aa023f79d64f489706a28bc23ff88e87f6a64b3c6651fbec3a84a53960b75159574d7a7385709847a62ddb7ad6af76f49138 + checksum: 91d4d35bc99ff6df483bdf029b9ea4bfd7af1f16fc91231a96777a63d263e1eabf486e13a2353970efc534f9faa43bdbf9ee76525af22f4752cbc5ebda333975 languageName: node linkType: hard From d885b0040ae30c3a84de42d8dba62b1098ff0efc Mon Sep 17 00:00:00 2001 From: Mia Moir Date: Thu, 24 Oct 2024 11:30:07 +0100 Subject: [PATCH 2/2] Separate creation and fetching of the slackApp Also add invariant checks to ensure multiple apps aren't created --- .../calendar/[eventID]/actions.ts | 2 +- .../calendar/[eventID]/page.tsx | 4 +- .../calendar/[eventID]/signUpSheetActions.ts | 2 +- app/(authenticated)/calendar/new/actions.ts | 2 +- app/(authenticated)/calendar/new/page.tsx | 2 +- components/slack/SlackChannelName.tsx | 2 +- components/slack/SlackUserInfo.tsx | 2 +- features/calendar/check_with_tech.ts | 2 +- features/calendar/check_with_tech_actions.ts | 4 +- features/userFeedback/index.ts | 2 +- lib/auth/slack/index.ts | 2 +- lib/slack/slackApiConnection.ts | 49 ++++++++++++------- server/index.ts | 4 +- 13 files changed, 46 insertions(+), 33 deletions(-) diff --git a/app/(authenticated)/calendar/[eventID]/actions.ts b/app/(authenticated)/calendar/[eventID]/actions.ts index ce8653d2..e2d7d4a0 100644 --- a/app/(authenticated)/calendar/[eventID]/actions.ts +++ b/app/(authenticated)/calendar/[eventID]/actions.ts @@ -97,7 +97,7 @@ export const updateAttendeeStatus = wrapServerAction( if (status === "attending" || status === "maybe_attending") { const slackUser = me.identities.find((x) => x.provider == "slack"); if (slackUser && evt.slack_channel_id) { - const slackApp = await slackApiConnection(); + const slackApp = slackApiConnection(); const channel_info = await slackApp.client.conversations.info({ channel: evt.slack_channel_id, diff --git a/app/(authenticated)/calendar/[eventID]/page.tsx b/app/(authenticated)/calendar/[eventID]/page.tsx index dfd7ea15..f93852f6 100644 --- a/app/(authenticated)/calendar/[eventID]/page.tsx +++ b/app/(authenticated)/calendar/[eventID]/page.tsx @@ -201,9 +201,7 @@ async function SlackBanner(props: { event: EventObjectType }) { return null; } - const channelInfo = await ( - await slackApiConnection() - ).client.conversations.info({ + const channelInfo = await slackApiConnection().client.conversations.info({ channel: props.event.slack_channel_id, }); diff --git a/app/(authenticated)/calendar/[eventID]/signUpSheetActions.ts b/app/(authenticated)/calendar/[eventID]/signUpSheetActions.ts index 9e8e6893..a6021684 100644 --- a/app/(authenticated)/calendar/[eventID]/signUpSheetActions.ts +++ b/app/(authenticated)/calendar/[eventID]/signUpSheetActions.ts @@ -188,7 +188,7 @@ export const signUpToRole = wrapServerAction( if (isSlackEnabled) { const slackUser = me.identities.find((i) => i.provider === "slack"); if (slackUser && sheet.events.slack_channel_id) { - const slackApp = await slackApiConnection(); + const slackApp = slackApiConnection(); const channel_info = await slackApp.client.conversations.info({ channel: sheet.events.slack_channel_id, diff --git a/app/(authenticated)/calendar/new/actions.ts b/app/(authenticated)/calendar/new/actions.ts index 151ae05a..423840bd 100644 --- a/app/(authenticated)/calendar/new/actions.ts +++ b/app/(authenticated)/calendar/new/actions.ts @@ -26,7 +26,7 @@ export const createEvent = wrapServerAction( const me = await getCurrentUser(); let slackApp: App | null = null; if (isSlackEnabled) { - slackApp = await slackApiConnection(); + slackApp = slackApiConnection(); } const payload = schema.safeParse(data); if (!payload.success) { diff --git a/app/(authenticated)/calendar/new/page.tsx b/app/(authenticated)/calendar/new/page.tsx index 14bb51a5..466497b0 100644 --- a/app/(authenticated)/calendar/new/page.tsx +++ b/app/(authenticated)/calendar/new/page.tsx @@ -21,7 +21,7 @@ async function getSlackChannels(): Promise { let slackApp: App | null = null; if (isSlackEnabled) { - slackApp = await slackApiConnection(); + slackApp = slackApiConnection(); const slackChannels = await slackApp.client.conversations.list({ team_id: env.SLACK_TEAM_ID, types: "public_channel", diff --git a/components/slack/SlackChannelName.tsx b/components/slack/SlackChannelName.tsx index 1e22c312..8f65efd3 100644 --- a/components/slack/SlackChannelName.tsx +++ b/components/slack/SlackChannelName.tsx @@ -11,7 +11,7 @@ export default async function SlackChannelName({ }) { let eventChannelInfo: ConversationsInfoResponse | null = null; if (isSlackEnabled) { - const slackApp = await slackApiConnection(); + const slackApp = slackApiConnection(); if (slackChannelID) { eventChannelInfo = await slackApp.client.conversations.info({ channel: slackChannelID, diff --git a/components/slack/SlackUserInfo.tsx b/components/slack/SlackUserInfo.tsx index 775f2498..10e0a1fc 100644 --- a/components/slack/SlackUserInfo.tsx +++ b/components/slack/SlackUserInfo.tsx @@ -26,7 +26,7 @@ export default async function SlackUserInfo({ let slackApp: App | null = null; if (isSlackEnabled) { - slackApp = await slackApiConnection(); + slackApp = slackApiConnection(); const slack_user = await slackApp.client.users.profile.get({ user: slack_user_id, }); diff --git a/features/calendar/check_with_tech.ts b/features/calendar/check_with_tech.ts index f1295cc4..23876a58 100644 --- a/features/calendar/check_with_tech.ts +++ b/features/calendar/check_with_tech.ts @@ -22,7 +22,7 @@ export async function postCheckWithTech( memo: string, type: "check" | "help", ) { - const slack = await slackApiConnection(); + const slack = slackApiConnection(); const event = await getEvent(eventID); if (!event) { throw new Error("Event not found"); diff --git a/features/calendar/check_with_tech_actions.ts b/features/calendar/check_with_tech_actions.ts index 06c1a352..98b35449 100644 --- a/features/calendar/check_with_tech_actions.ts +++ b/features/calendar/check_with_tech_actions.ts @@ -56,7 +56,7 @@ export async function handleSlackAction(data: SlackActionMiddlewareArgs) { }, }); - const api = await slackApiConnection(); + const api = slackApiConnection(); if (!actor) { await api.client.chat.postEphemeral({ @@ -454,7 +454,7 @@ export async function _sendCWTFollowUpAndUpdateMessage( if (!requestor) { return; } - const api = await slackApiConnection(); + const api = slackApiConnection(); const responseParts = [ `Your #check-with-tech request for ${ cwt.event.name diff --git a/features/userFeedback/index.ts b/features/userFeedback/index.ts index d7059566..bb1ce8ea 100644 --- a/features/userFeedback/index.ts +++ b/features/userFeedback/index.ts @@ -30,7 +30,7 @@ export async function submit( }; } - const slack = await slackApiConnection(); + const slack = slackApiConnection(); const me = await getCurrentUser(); const slackIdentity = me.identities.find((x) => x.provider === "slack"); const blocks: KnownBlock[] = [ diff --git a/lib/auth/slack/index.ts b/lib/auth/slack/index.ts index e5b3bfc6..4ef2a922 100644 --- a/lib/auth/slack/index.ts +++ b/lib/auth/slack/index.ts @@ -27,7 +27,7 @@ export type SlackTokenJson = { export async function getSlackUserInfo(code: string) { invariant(isSlackEnabled, "Slack is not enabled"); - const slackApp = await slackApiConnection(); + const slackApp = slackApiConnection(); const tokenResponse = await slackApp.client.openid.connect.token({ client_id: env.SLACK_CLIENT_ID || "", client_secret: env.SLACK_CLIENT_SECRET || "", diff --git a/lib/slack/slackApiConnection.ts b/lib/slack/slackApiConnection.ts index 4af6a76c..e55968e6 100644 --- a/lib/slack/slackApiConnection.ts +++ b/lib/slack/slackApiConnection.ts @@ -1,5 +1,6 @@ import { App } from "@slack/bolt"; import { env } from "../env"; +import invariant from "../invariant"; declare global { var slack: App | undefined; // This must be a `var` and not a `let / const` @@ -7,23 +8,37 @@ declare global { export const isSlackEnabled = env.SLACK_ENABLED === "true"; -async function slackApiConnection(create?: boolean): Promise { - if (!isSlackEnabled) { - throw new Error("Slack is not enabled"); - } - if (create) { - return new App({ - token: env.SLACK_BOT_TOKEN, - signingSecret: env.SLACK_SIGNING_SECRET, - socketMode: env.SLACK_DISABLE_SOCKET_MODE !== "true", - port: 0, // We never want it to listen on a port - appToken: env.SLACK_APP_TOKEN, - redirectUri: `${env.PUBLIC_URL}/login/slack/callback`, - installerOptions: { - redirectUriPath: "/login/slack/callback", - }, - }); - } +function slackApiConnection(): App { + invariant( + isSlackEnabled, + "slackApiConnection was called but slack is not enabled on this instance", + ); + invariant( + (globalThis as unknown as { slackApp: App | undefined }).slackApp, + "A global slack app has not been initialised", + ); + + return (globalThis as unknown as { slackApp: App }).slackApp; +} + +export function createSlackApp(): App { + invariant( + (globalThis as unknown as { slackApp: App | undefined }).slackApp, + "createSlackApp was called but a global app already exists", + ); + + (globalThis as unknown as { slackApp: App }).slackApp = new App({ + token: env.SLACK_BOT_TOKEN, + signingSecret: env.SLACK_SIGNING_SECRET, + socketMode: env.SLACK_DISABLE_SOCKET_MODE !== "true", + port: 0, // We never want it to listen on a port + appToken: env.SLACK_APP_TOKEN, + redirectUri: `${env.PUBLIC_URL}/login/slack/callback`, + installerOptions: { + redirectUriPath: "/login/slack/callback", + }, + }); + return (globalThis as unknown as { slackApp: App }).slackApp; } diff --git a/server/index.ts b/server/index.ts index 75c71b24..01a3cb6a 100644 --- a/server/index.ts +++ b/server/index.ts @@ -3,6 +3,7 @@ import { Server } from "socket.io"; import { authenticateSocket } from "./auth"; import { env, validateEnv } from "../lib/env.js"; import slackApiConnection, { + createSlackApp, isSlackEnabled, } from "../lib/slack/slackApiConnection"; import { App } from "@slack/bolt"; @@ -29,8 +30,7 @@ app.prepare().then(async () => { let slackApp: App | undefined; if (isSlackEnabled) { - slackApp = await slackApiConnection(true); - (globalThis as unknown as { slackApp: App }).slackApp = slackApp; + slackApp = createSlackApp(); await setupActionHandlers(slackApp); }