{"id":16696926,"url":"https://github.com/seratch/slack-bolt-extensions","last_synced_at":"2025-10-18T20:28:34.003Z","repository":{"id":41078583,"uuid":"457710587","full_name":"seratch/slack-bolt-extensions","owner":"seratch","description":"Collection of bolt-js InstallationStore/Receiver implementations + Next.js support module","archived":false,"fork":false,"pushed_at":"2024-08-13T05:50:24.000Z","size":1704,"stargazers_count":35,"open_issues_count":3,"forks_count":6,"subscribers_count":5,"default_branch":"main","last_synced_at":"2025-02-05T20:21:34.187Z","etag":null,"topics":["bolt","nodejs","slack","slackapi","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/seratch.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-02-10T09:22:40.000Z","updated_at":"2024-12-23T06:48:56.000Z","dependencies_parsed_at":"2024-01-17T12:33:43.049Z","dependency_job_id":"ab37f8cd-f928-43a6-a80b-e41fd782ce42","html_url":"https://github.com/seratch/slack-bolt-extensions","commit_stats":{"total_commits":90,"total_committers":2,"mean_commits":45.0,"dds":"0.011111111111111072","last_synced_commit":"aa63e3fd29c65841a93b1180cf3fbfe396c695d9"},"previous_names":[],"tags_count":13,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fslack-bolt-extensions","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fslack-bolt-extensions/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fslack-bolt-extensions/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/seratch%2Fslack-bolt-extensions/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/seratch","download_url":"https://codeload.github.com/seratch/slack-bolt-extensions/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238618233,"owners_count":19501998,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bolt","nodejs","slack","slackapi","typescript"],"created_at":"2024-10-12T17:45:18.064Z","updated_at":"2025-10-18T20:28:28.964Z","avatar_url":"https://github.com/seratch.png","language":"TypeScript","readme":"## ⚡ Bolt for JavaScript Extensions\n\n[![npm version](https://badge.fury.io/js/@seratch_%2Fbolt-prisma.svg)](https://badge.fury.io/js/@seratch_%2Fbolt-prisma) [![lerna](https://img.shields.io/badge/maintained%20with-lerna-cc00ff.svg)](https://lerna.js.org/)\n\nThis project aims to provide the following enhancement on top of bolt-js.\n\n* bolt-js `Receiver` implementations built with widely used web frameworks\n* bolt-js `InstallationStore` implementations for widely used database libraries, databases, and cloud services\n* [`bolt-http-runner`](https://github.com/seratch/slack-bolt-extensions/tree/main/packages/bolt-http-runner), which enables developers to run bolt-js code in [Next.js](https://github.com/seratch/slack-bolt-extensions/tree/main/nextjs-example)/[Nuxt.js](https://github.com/seratch/slack-bolt-extensions/tree/main/nestjs-example) apps (or whatever you want to use bolt-js along with)\n\n### Receiver\n\nAt this moment, we support the following web frameworks. To learn how to use these `Receiver` in your bolt-js apps, check `src/tests/bolt-example.ts`. You can run the app by `npm run bolt` in each package directory.\n\n* [@seratch_/bolt-koa](packages/bolt-koa) for [Koa](https://koajs.com/)\n* [@seratch_/bolt-fastify](packages/bolt-fastify) for [Fastify](https://www.fastify.io/)\n\nFor instance, if you go with Prisma, your Bolt app code will look like the one below:\n\n```typescript\nimport Router from '@koa/router';\nimport Koa from 'koa';\nimport { App, FileInstallationStore, LogLevel } from '@slack/bolt';\nimport { KoaReceiver } from '@seratch_/bolt-koa';\n\nconst koa = new Koa();\nconst router = new Router();\n\nconst receiver = new KoaReceiver({\n  signingSecret: process.env.SLACK_SIGNING_SECRET!,\n  clientId: process.env.SLACK_CLIENT_ID,\n  clientSecret: process.env.SLACK_CLIENT_SECRET,\n  scopes: ['commands', 'chat:write', 'app_mentions:read'],\n  installationStore: new FileInstallationStore(),\n  koa,\n  router,\n});\n\nconst app = new App({\n  logLevel: LogLevel.DEBUG,\n  receiver,\n});\n\napp.event('app_mention', async ({ event, say }) =\u003e {\n  await say({\n    text: `\u003c@${event.user}\u003e Hi there :wave:`,\n    blocks: [\n      {\n        type: 'section',\n        text: {\n          type: 'mrkdwn',\n          text: `\u003c@${event.user}\u003e Hi there :wave:`,\n        },\n      },\n    ],\n  });\n});\n\n(async () =\u003e {\n  await app.start();\n  console.log('⚡️ Bolt app is running!');\n})();\n```\n\nIf you go with any of other packages, just replacing the `Receiver` part works for you.\n\n### InstallationStore\n\nAt this moment, we support the following database libraries. To learn how to use these `InstallationStore` in your bolt-js apps, check `src/tests/bolt-example.ts`. You can run the app by `npm run bolt` in each package directory.\n\n* [@seratch_/bolt-prisma](packages/bolt-prisma) for [Prisma](https://www.prisma.io/) (RDB / MongoDB)\n* [@seratch_/bolt-mongoose](packages/bolt-mongoose) for [Mongoose](https://mongoosejs.com/) (MongoDB)\n* [@seratch_/bolt-sequelize](packages/bolt-sequelize) for [Sequelize](https://sequelize.org/) (RDB)\n* [@seratch_/bolt-typeorm](packages/bolt-typeorm) for [TypeORM](https://typeorm.io/) (RDB / MongoDB)\n* @seratch_/bolt-amazon-s3 (_coming soon!_)\n* @seratch_/bolt-aws-dynamodb (_coming soon!_)\n\nFor instance, if you go with Prisma, your Bolt app code will look like the one below:\n\n```typescript\nimport { App } from '@slack/bolt';\nimport { PrismaClient } from '@prisma/client';\nimport { PrismaInstallationStore } from '@seratch_/bolt-prisma';\n\nconst prismaClient = new PrismaClient({\n  log: [\n    {\n      emit: 'stdout',\n      level: 'query',\n    },\n  ],\n});\nconst installationStore = new PrismaInstallationStore({\n  // The name `slackAppInstallation` can be different\n  // if you use a different name in your Prisma schema\n  prismaTable: prismaClient.slackAppInstallation,\n  clientId: process.env.SLACK_CLIENT_ID,\n});\nconst app = new App({\n  signingSecret: process.env.SLACK_SIGNING_SECRET,\n  clientId: process.env.SLACK_CLIENT_ID,\n  clientSecret: process.env.SLACK_CLIENT_SECRET,\n  stateSecret: process.env.SLACK_STATE_SECRET,\n  scopes: ['commands', 'chat:write', 'app_mentions:read'],\n  installationStore,\n});\n\napp.event('app_mention', async ({ event, say }) =\u003e {\n  await say({\n    text: `\u003c@${event.user}\u003e Hi there :wave:`,\n    blocks: [\n      {\n        type: 'section',\n        text: {\n          type: 'mrkdwn',\n          text: `\u003c@${event.user}\u003e Hi there :wave:`,\n        },\n      },\n    ],\n  });\n});\n\n(async () =\u003e {\n  await app.start();\n  console.log('⚡️ Bolt app is running!');\n})();\n```\n\nIf you go with any of other packages, just replacing the `installationStore` part works for you.\n\n#### Features\n\nAll the packages guarantee they work with great consideration for the following points:\n\n* InstallationStore in any of these packages returns the latest bot token plus the latest user token (only when it exists) for a query (enterprise_id / team_id / user_id / is_enterprise_install).\n* Org-wide installations are also properly supported. All the packages have a unit test named `src/tests/org-wide-installation.spec.ts` to cover the scenarios.\n* `historicalDataEnabled: boolean` option is supported in all the packages. If the options is set to true, the InstallationStore stores all the histories of installations. If the value is false, it maintains only the latest data by updating them. For deletion in the case of token revocation and uninstallations, all the associated data must be deleted regardless of the mode.\n* The callbacks `onFetchInstallation`, `onStoreInstallation`, and `onDeleteInstallation` are supported in all the packages. These callbacks enable developers to customize the data to be stored in a database (e.g., encrypting token values in database rows), append custom properties to the database row, and do extra logging for better system monitoring.\n* `InstallationStore#close(): Promise\u003cvoid\u003e` method is supported in all the packages. This method is supposed to be used for safely disconnecting from a database and cleaning up the remaining resources.\n\n### Open source license\n\nAll the packages in this repository are published in the npm package registry under the MIT open-source license.\n\n### Maintainers Guide\n\n#### Run all the unit tests\n\nYou can run all the unit tests ysung lerna command:\n\n```bash\ngit clone git@github.com:seratch/slack-bolt-extensions.git\ncd slack-bolt-extensions/\nnpm i\nnpx lerna bootstrap\nnpx lerna run test\n```\n\nWhen you work on a specific project, head to the package directory and use `npm` commands here:\n\n```bash\ncd slack-bolt-extensions/\nnpm i\nnpx lerna bootstrap\ncd packages/bolt-prisma/\nnpm test\ncode . # Open the project in Visual Studio Code\n```\n\n#### Publish the packages\n\nFor publishing the packages, we always use `lerna publish` command.\n\n```bash\nnpx lerna bootstrap\nnpx lerna publish\n# Follow the interactive steps with lerna\n```\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseratch%2Fslack-bolt-extensions","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fseratch%2Fslack-bolt-extensions","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fseratch%2Fslack-bolt-extensions/lists"}