From 52687bffc9ab0482aa8a3d8cef31c944bdfccf86 Mon Sep 17 00:00:00 2001 From: Luke Russell <31357343+lukegalbraithrussell@users.noreply.github.com> Date: Wed, 31 Jul 2024 09:44:24 -0700 Subject: [PATCH] Docs: display documentation with docusaurus --- .github/maintainers_guide.md | 25 +- .github/workflows/docs-deploy.yml | 62 + docs/.env.sample | 4 - docs/.gitignore | 12 +- docs/.markdownlint.yml | 198 - docs/.ruby-version | 4 - docs/Gemfile | 3 - docs/README.md | 126 + docs/_basic/ja_updating_pushing_modals.md | 67 - docs/_basic/updating_pushing_modals.md | 67 - docs/_config.yml | 82 - docs/_functions/creating.md | 20 - docs/_includes/analytics.html | 7 - docs/_includes/head.html | 25 - docs/_includes/header.html | 12 - docs/_includes/sidebar.html | 115 - docs/_includes/tag_manager.html | 12 - docs/_layouts/default.html | 82 - docs/_layouts/fullpage.html | 30 - docs/_layouts/tutorial.html | 36 - docs/_steps/workflow_steps_overview.md | 30 - docs/_tutorials/ja_using-typescript.md | 18 - docs/_tutorials/using-typescript.md | 23 - docs/assets/bolt-favicon.png | Bin 3376 -> 0 bytes docs/assets/style.css | 493 - docs/babel.config.js | 3 + docs/content/Changelog.md | 1289 ++ .../advanced}/authorization.md | 9 +- .../advanced}/context.md | 7 +- .../advanced/conversation-store.md} | 7 +- .../advanced/custom-routes.md} | 17 +- .../advanced/deferring-initialization.md} | 13 +- .../advanced/error-handling.md} | 26 +- .../advanced/global-middleware.md} | 9 +- .../advanced/listener-middleware.md} | 9 +- .../advanced}/logging.md | 14 +- .../advanced}/receiver.md | 15 +- .../advanced/token-rotation.md} | 8 +- .../basic/acknowledge.md} | 7 +- .../basic/action-listening.md} | 24 +- .../basic/action-respond.md} | 14 +- .../basic/authenticating-oauth.md} | 50 +- .../basic/commands.md} | 15 +- .../basic/creating-modals.md} | 13 +- .../basic/event-listening.md} | 16 +- .../basic/message-listening.md} | 16 +- .../basic/message-sending.md} | 17 +- .../basic/options.md} | 9 +- .../basic/publishing-views.md} | 11 +- .../basic/shortcuts.md} | 36 +- .../basic/socket-mode.md} | 16 +- docs/content/basic/updating-pushing-views.md | 66 + .../basic/view-submissions.md} | 16 +- .../web_api.md => content/basic/web-api.md} | 9 +- .../creating-custom-functions.md | 16 + .../defining-custom-functions.md} | 7 +- .../listening-to-custom-functions.md} | 13 +- .../responding-to-interactivity.md} | 11 +- .../deployments}/aws-lambda.md | 151 +- .../deployments}/heroku.md | 114 +- .../getting-started.md} | 133 +- docs/{_tutorials => content}/reference.md | 111 +- .../steps/adding-editing-steps.md} | 17 +- .../steps/creating-steps.md} | 19 +- .../steps/executing-steps.md} | 17 +- .../steps/saving-steps.md} | 17 +- docs/content/steps/steps.md | 29 + .../tutorial/getting-started-http.md} | 60 +- .../tutorial/hubot-migration.md} | 60 +- .../tutorial/migration-v2.md} | 28 +- .../tutorial/migration-v3.md} | 22 +- docs/docusaurus.config.js | 186 + docs/i18n/ja-jp/code.json | 289 + .../current.json | 38 + .../current/advanced/authorization.md} | 9 +- .../current/advanced/context.md} | 7 +- .../current/advanced/conversation-store.md} | 7 +- .../current/advanced/custom-routes.md} | 15 +- .../advanced/deferring-initialization.md} | 7 +- .../current/advanced/error-handling.md} | 17 +- .../current/advanced/global-middleware.md} | 7 +- .../current/advanced/listener-middleware.md} | 9 +- .../current/advanced/logging.md} | 15 +- .../current/advanced/receiver.md} | 7 +- .../current/advanced/token-rotation.md} | 9 +- .../current/basic/acknowledge.md} | 7 +- .../current/basic/action-listening.md} | 20 +- .../current/basic/action-respond.md} | 13 +- .../current/basic/authenticating-oauth.md} | 24 +- .../current/basic/commands.md} | 9 +- .../current/basic/creating-modals.md} | 14 +- .../current/basic/event-listening.md} | 16 +- .../current/basic/message-listening.md} | 15 +- .../current/basic/message-sending.md} | 17 +- .../current/basic/options.md} | 9 +- .../current/basic/publishing-views.md} | 9 +- .../current/basic/shortcuts.md} | 18 +- .../current/basic/socket-mode.md} | 18 +- .../current/basic/updating-pushing-views.md | 66 + .../current/basic/view-submissions.md} | 10 +- .../current/basic/web-api.md} | 9 +- .../creating-custom-functions.md | 16 + .../defining-custom-functions.md | 39 + .../listening-to-custom-functions.md | 25 + .../responding-to-interactivity.md | 19 + .../current/deployments/aws-lambda.md} | 130 +- .../current/deployments/heroku.md} | 82 +- .../current/getting-started.md} | 57 +- .../current/reference.md} | 76 +- .../current/steps/adding-editing-steps.md} | 9 +- .../current/steps/creating-steps.md} | 8 +- .../current/steps/executing-steps.md} | 9 +- .../current/steps/saving-steps.md} | 7 +- .../current/steps/steps.md} | 8 +- .../tutorials/getting-started-http.md} | 47 +- .../current/tutorials/hubot-migration.md} | 43 +- .../current/tutorials/migration-v2.md} | 9 +- .../current/tutorials/migration-v3.md} | 9 +- .../docusaurus-theme-classic/footer.json | 6 + .../docusaurus-theme-classic/navbar.json | 58 + docs/index.md | 7 - docs/jp.md | 8 - docs/package-lock.json | 14511 ++++++++++++++++ docs/package.json | 50 + docs/redirects.js | 103 + docs/scripts/tutorial_nav.js | 41 - docs/sidebars.js | 118 + docs/src/css/custom.css | 107 + docs/src/theme/NotFound/Content/index.js | 36 + docs/src/theme/NotFound/index.js | 19 + docs/static/.nojekyll | 0 .../img}/basic-information-page.png | Bin docs/{assets => static/img}/bolt-js-logo.svg | 0 docs/{assets => static/img}/bolt-logo.svg | 0 docs/static/img/bolt.svg | 1 + docs/{assets => static/img}/bot-token.png | Bin .../img}/event-subscriptions-page.png | Bin docs/static/img/favicon.ico | Bin 0 -> 24499 bytes .../img}/interactivity-and-shortcuts-page.png | Bin docs/{assets => static/img}/ngrok.gif | Bin docs/static/img/node-logo.svg | 1 + docs/static/img/oslo.png | Bin 0 -> 134357 bytes .../img}/request-url-config.png | Bin .../{assets => static/img}/signing-secret.png | Bin docs/static/img/slack-logo.svg | 6 + docs/static/img/slack_logo_dark.svg | 47 + 146 files changed, 18287 insertions(+), 2460 deletions(-) create mode 100644 .github/workflows/docs-deploy.yml delete mode 100644 docs/.env.sample delete mode 100644 docs/.markdownlint.yml delete mode 100644 docs/.ruby-version delete mode 100644 docs/Gemfile create mode 100644 docs/README.md delete mode 100644 docs/_basic/ja_updating_pushing_modals.md delete mode 100644 docs/_basic/updating_pushing_modals.md delete mode 100644 docs/_config.yml delete mode 100644 docs/_functions/creating.md delete mode 100644 docs/_includes/analytics.html delete mode 100644 docs/_includes/head.html delete mode 100644 docs/_includes/header.html delete mode 100644 docs/_includes/sidebar.html delete mode 100644 docs/_includes/tag_manager.html delete mode 100644 docs/_layouts/default.html delete mode 100644 docs/_layouts/fullpage.html delete mode 100644 docs/_layouts/tutorial.html delete mode 100644 docs/_steps/workflow_steps_overview.md delete mode 100644 docs/_tutorials/ja_using-typescript.md delete mode 100644 docs/_tutorials/using-typescript.md delete mode 100644 docs/assets/bolt-favicon.png delete mode 100644 docs/assets/style.css create mode 100644 docs/babel.config.js create mode 100644 docs/content/Changelog.md rename docs/{_advanced => content/advanced}/authorization.md (90%) rename docs/{_advanced => content/advanced}/context.md (93%) rename docs/{_advanced/conversation_store.md => content/advanced/conversation-store.md} (84%) rename docs/{_advanced/custom_routes.md => content/advanced/custom-routes.md} (90%) rename docs/{_advanced/deferring_initialization.md => content/advanced/deferring-initialization.md} (79%) rename docs/{_advanced/error_handling.md => content/advanced/error-handling.md} (82%) rename docs/{_advanced/middleware_global.md => content/advanced/global-middleware.md} (77%) rename docs/{_advanced/middleware_listener.md => content/advanced/listener-middleware.md} (76%) rename docs/{_advanced => content/advanced}/logging.md (88%) rename docs/{_advanced => content/advanced}/receiver.md (95%) rename docs/{_advanced/token_rotation.md => content/advanced/token-rotation.md} (77%) rename docs/{_basic/acknowledging_requests.md => content/basic/acknowledge.md} (95%) rename docs/{_basic/listening_actions.md => content/basic/action-listening.md} (66%) rename docs/{_basic/responding_actions.md => content/basic/action-respond.md} (84%) rename docs/{_basic/authenticating_oauth.md => content/basic/authenticating-oauth.md} (88%) rename docs/{_basic/listening_responding_commands.md => content/basic/commands.md} (76%) rename docs/{_basic/opening_modals.md => content/basic/creating-modals.md} (67%) rename docs/{_basic/listening_events.md => content/basic/event-listening.md} (86%) rename docs/{_basic/listening_messages.md => content/basic/message-listening.md} (81%) rename docs/{_basic/sending_messages.md => content/basic/message-sending.md} (86%) rename docs/{_basic/listening_responding_options.md => content/basic/options.md} (87%) rename docs/{_basic/publishing_views.md => content/basic/publishing-views.md} (60%) rename docs/{_basic/listening_responding_shortcuts.md => content/basic/shortcuts.md} (78%) rename docs/{_basic/socket_mode.md => content/basic/socket-mode.md} (85%) create mode 100644 docs/content/basic/updating-pushing-views.md rename docs/{_basic/listening_modals.md => content/basic/view-submissions.md} (94%) rename docs/{_basic/web_api.md => content/basic/web-api.md} (84%) create mode 100644 docs/content/custom-functions/creating-custom-functions.md rename docs/{_functions/defining.md => content/custom-functions/defining-custom-functions.md} (94%) rename docs/{_functions/listening.md => content/custom-functions/listening-to-custom-functions.md} (76%) rename docs/{_functions/responding.md => content/custom-functions/responding-to-interactivity.md} (63%) rename docs/{_deployments => content/deployments}/aws-lambda.md (60%) rename docs/{_deployments => content/deployments}/heroku.md (67%) rename docs/{_tutorials/getting_started.md => content/getting-started.md} (72%) rename docs/{_tutorials => content}/reference.md (83%) rename docs/{_steps/adding_editing_workflow_step.md => content/steps/adding-editing-steps.md} (79%) rename docs/{_steps/creating_workflow_step.md => content/steps/creating-steps.md} (65%) rename docs/{_steps/executing_workflow_steps.md => content/steps/executing-steps.md} (77%) rename docs/{_steps/saving_workflow_step.md => content/steps/saving-steps.md} (75%) create mode 100644 docs/content/steps/steps.md rename docs/{_tutorials/getting_started_http.md => content/tutorial/getting-started-http.md} (83%) rename docs/{_tutorials/hubot_migration.md => content/tutorial/hubot-migration.md} (81%) rename docs/{_tutorials/migration_v2.md => content/tutorial/migration-v2.md} (83%) rename docs/{_tutorials/migration_v3.md => content/tutorial/migration-v3.md} (87%) create mode 100644 docs/docusaurus.config.js create mode 100644 docs/i18n/ja-jp/code.json create mode 100644 docs/i18n/ja-jp/docusaurus-plugin-content-docs/current.json rename docs/{_advanced/ja_authorization.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/authorization.md} (93%) rename docs/{_advanced/ja_context.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/context.md} (97%) rename docs/{_advanced/ja_conversation_store.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/conversation-store.md} (87%) rename docs/{_advanced/ja_custom_routes.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/custom-routes.md} (92%) rename docs/{_advanced/ja_deferring_initialization.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/deferring-initialization.md} (94%) rename docs/{_advanced/ja_error_handling.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/error-handling.md} (92%) rename docs/{_advanced/ja_middleware_global.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/global-middleware.md} (92%) rename docs/{_advanced/ja_middleware_listener.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/listener-middleware.md} (93%) rename docs/{_advanced/ja_logging.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/logging.md} (89%) rename docs/{_advanced/ja_receiver.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/receiver.md} (98%) rename docs/{_advanced/ja_token_rotation.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/token-rotation.md} (73%) rename docs/{_basic/ja_acknowledging_requests.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/acknowledge.md} (96%) rename docs/{_basic/ja_listening_actions.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-listening.md} (82%) rename docs/{_basic/ja_responding_actions.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-respond.md} (86%) rename docs/{_basic/ja_authenticating_oauth.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/authenticating-oauth.md} (93%) rename docs/{_basic/ja_listening_responding_commands.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/commands.md} (91%) rename docs/{_basic/ja_opening_modals.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/creating-modals.md} (60%) rename docs/{_basic/ja_listening_events.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/event-listening.md} (88%) rename docs/{_basic/ja_listening_messages.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-listening.md} (82%) rename docs/{_basic/ja_sending_messages.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-sending.md} (85%) rename docs/{_basic/ja_listening_responding_options.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/options.md} (89%) rename docs/{_basic/ja_publishing_views.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/publishing-views.md} (60%) rename docs/{_basic/ja_listening_responding_shortcuts.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/shortcuts.md} (89%) rename docs/{_basic/ja_socket_mode.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/socket-mode.md} (87%) create mode 100644 docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/updating-pushing-views.md rename docs/{_basic/ja_listening_modals.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/view-submissions.md} (94%) rename docs/{_basic/ja_web_api.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/web-api.md} (89%) create mode 100644 docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/creating-custom-functions.md create mode 100644 docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/defining-custom-functions.md create mode 100644 docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/listening-to-custom-functions.md create mode 100644 docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/responding-to-interactivity.md rename docs/{_deployments/ja_aws-lambda.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/aws-lambda.md} (64%) rename docs/{_deployments/ja_heroku.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/heroku.md} (72%) rename docs/{_tutorials/ja_getting_started.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/getting-started.md} (83%) rename docs/{_tutorials/ja_reference.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/reference.md} (86%) rename docs/{_steps/ja_adding_editing_workflow_step.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/adding-editing-steps.md} (97%) rename docs/{_steps/ja_creating_workflow_step.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/creating-steps.md} (95%) rename docs/{_steps/ja_executing_workflow_steps.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/executing-steps.md} (96%) rename docs/{_steps/ja_saving_workflow_step.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/saving-steps.md} (96%) rename docs/{_steps/ja_workflow_steps_overview.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/steps.md} (91%) rename docs/{_tutorials/ja_getting_started_http.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/getting-started-http.md} (87%) rename docs/{_tutorials/ja_hubot_migration.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/hubot-migration.md} (88%) rename docs/{_tutorials/ja_migration_v2.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v2.md} (94%) rename docs/{_tutorials/ja_migration_v3.md => i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v3.md} (94%) create mode 100644 docs/i18n/ja-jp/docusaurus-theme-classic/footer.json create mode 100644 docs/i18n/ja-jp/docusaurus-theme-classic/navbar.json delete mode 100644 docs/index.md delete mode 100644 docs/jp.md create mode 100644 docs/package-lock.json create mode 100644 docs/package.json create mode 100644 docs/redirects.js delete mode 100644 docs/scripts/tutorial_nav.js create mode 100644 docs/sidebars.js create mode 100644 docs/src/css/custom.css create mode 100644 docs/src/theme/NotFound/Content/index.js create mode 100644 docs/src/theme/NotFound/index.js create mode 100644 docs/static/.nojekyll rename docs/{assets => static/img}/basic-information-page.png (100%) rename docs/{assets => static/img}/bolt-js-logo.svg (100%) rename docs/{assets => static/img}/bolt-logo.svg (100%) create mode 100644 docs/static/img/bolt.svg rename docs/{assets => static/img}/bot-token.png (100%) rename docs/{assets => static/img}/event-subscriptions-page.png (100%) create mode 100644 docs/static/img/favicon.ico rename docs/{assets => static/img}/interactivity-and-shortcuts-page.png (100%) rename docs/{assets => static/img}/ngrok.gif (100%) create mode 100644 docs/static/img/node-logo.svg create mode 100644 docs/static/img/oslo.png rename docs/{assets => static/img}/request-url-config.png (100%) rename docs/{assets => static/img}/signing-secret.png (100%) create mode 100644 docs/static/img/slack-logo.svg create mode 100644 docs/static/img/slack_logo_dark.svg diff --git a/.github/maintainers_guide.md b/.github/maintainers_guide.md index 8bcbe469f..d6a1b325d 100644 --- a/.github/maintainers_guide.md +++ b/.github/maintainers_guide.md @@ -19,30 +19,11 @@ Test code should be written in syntax that runs on the oldest supported Node.js A useful trick for debugging inside tests is to use the Chrome Debugging Protocol feature of Node.js to set breakpoints and interactively debug. In order to do this you must run mocha directly. This means that you should have already linted the source (`npm run lint`), manually. You then run the tests using the following command: `./node_modules/.bin/mocha test/{test-name}.js --debug-brk --inspect` (replace {test-name} with an actual test file). -### Generating Documentation +### Managing Documentation -The documentation is built using [Jekyll](https://jekyllrb.com/) and hosted with GitHub Pages. -The source files are contained in the `docs` directory. They are broken up into the `_basic`, `_advanced`, and `_tutorials` directories depending on content's nature. +See the [`/docs/README.md`](./docs/README.md) file for documentation instructions. -All documentation contains [front matter](https://jekyllrb.com/docs/front-matter/) that indicates the section's title, slug (for header), respective language, and if it's not a tutorial it contains the order it should appear within its respective section (basic or advanced). - -To build the docs locally, you must have [Ruby](https://www.ruby-lang.org/en/) installed. To easily install and manage different Ruby versions, you can use [`rbenv`](https://github.com/rbenv/rbenv). If you use macOS, you can install it via `brew install rbenv`. Hook it up to your shell by running `rbenv init` and following the instructions. Finally, install the required version for building the docs (this version is stored in the `.ruby-version` file) via `rbenv install `. - -To build the docs, navigate to the `docs` folder and run `bundle install` to install necessary gems (Ruby dependencies). Run `bundle exec jekyll serve` to start up a local server which will compile documentation source and serve its contents. - -_(zsh users)_: If you are running into issues with permissions to install ruby gems during `bundle install`, you may need to add `eval "$(rbenv init - zsh)"` to your ~/.zshrc then run `source ~/.zshrc`. - -#### Adding beta documentation -When documentation is in a beta state, it requires a new, distinct collection of docs. The process is a little nuanced, so make sure to build the documentation locally to make sure it appears how you expect. To create a new collection: -1. Add content -* Add a new folder to docs with an underscore (ex: `_steps`). -* Add documentation sections to that folder, with similar front matter to the `_advanced` and `_basic` sections. -* Add an overview section that explains the beta state of the category. This should always be `order: 1` in the front matter. - -2. Configure layout -* Update `docs`>`_config.yml` with the new collection you created under `collections` (the same as the folder name - ex: `steps`). While you're there, add the sidebar title under `t`. -* In `docs`>`_layouts`>`default.html` make a copy of the `basic` or `advanced` section, and modify the div ID and content to correspond to your beta collection. This step requires you to use variables from `_config.yml`. -* Now in `docs`>`_includes`>`sidebar.html`, create a new section after the basic and advanced sections. Again, copy the `basic` or `advanced` section to use as a template. Be careful with the variable naming—it's a little more complex than in `default.html`, and requires you to use variables from `_config.yml`. +If you're not touching the `/docs` folder, you don't need to worry about the docs setup affecting your PR. ### Releases _For beta releases, see Beta Releases section below:_ diff --git a/.github/workflows/docs-deploy.yml b/.github/workflows/docs-deploy.yml new file mode 100644 index 000000000..54523819e --- /dev/null +++ b/.github/workflows/docs-deploy.yml @@ -0,0 +1,62 @@ +name: Deploy to GitHub Pages + +on: + pull_request: + branches: + - main + paths: + - 'docs/**' + push: + branches: + - main + paths: + - 'docs/**' + workflow_dispatch: + +jobs: + build: + name: Build Docusaurus + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + - uses: actions/setup-node@v4 + with: + node-version: 20 + cache: npm + cache-dependency-path: docs/package-lock.json + + - name: Install dependencies + run: npm ci + working-directory: ./docs + + - name: Build website + run: npm run build + working-directory: ./docs + + - name: Upload Build Artifact + uses: actions/upload-pages-artifact@v3 + with: + path: ./docs/build + + deploy: + name: Deploy to GitHub Pages + if: github.event_name != 'pull_request' + needs: build + + # Grant GITHUB_TOKEN the permissions required to make a Pages deployment + permissions: + pages: write # to deploy to Pages + id-token: write # verifies deployment is from an appropriate source + + # Deploy to the github-pages environment + environment: + name: github-pages + url: ${{ steps.deployment.outputs.page_url }} + + runs-on: ubuntu-latest + steps: + - name: Deploy to GitHub Pages + id: deployment + uses: actions/deploy-pages@v4 \ No newline at end of file diff --git a/docs/.env.sample b/docs/.env.sample deleted file mode 100644 index c2e71718b..000000000 --- a/docs/.env.sample +++ /dev/null @@ -1,4 +0,0 @@ -# In order to fetch repository metadata during local development, put a GitHub Personal Access Token in the -# following variable, and make sure it has `public_repo` access. - -JEKYLL_GITHUB_TOKEN= \ No newline at end of file diff --git a/docs/.gitignore b/docs/.gitignore index c48a717ef..49ba8fa7c 100644 --- a/docs/.gitignore +++ b/docs/.gitignore @@ -1,7 +1,5 @@ -_site -Gemfile.lock -.env -.jekyll-metadata -.vscode/ -.bundle/ -vendor/ +node_modules/ +.docusaurus +.DS_Store +build/ +.stylelintrc.json \ No newline at end of file diff --git a/docs/.markdownlint.yml b/docs/.markdownlint.yml deleted file mode 100644 index 4780b8f6b..000000000 --- a/docs/.markdownlint.yml +++ /dev/null @@ -1,198 +0,0 @@ -# Default state for all rules -default: true - -# Path to configuration file to extend -extends: null - -# MD001/heading-increment/header-increment - Heading levels should only increment by one level at a time -MD001: false - -# MD002/first-heading-h1/first-header-h1 - First heading should be a top-level heading -MD002: - # Heading level - level: 1 - -# MD003/heading-style/header-style - Heading style -MD003: - # Heading style - style: "consistent" - -# MD004/ul-style - Unordered list style -MD004: - # List style - style: "consistent" - -# MD005/list-indent - Inconsistent indentation for list items at the same level -MD005: true - -# MD006/ul-start-left - Consider starting bulleted lists at the beginning of the line -MD006: true - -# MD007/ul-indent - Unordered list indentation -MD007: false - -# MD009/no-trailing-spaces - Trailing spaces -MD009: - # Spaces for line break - br_spaces: 2 - # Allow spaces for empty lines in list items - list_item_empty_lines: false - # Include unnecessary breaks - strict: false - -# MD010/no-hard-tabs - Hard tabs -MD010: - # Include code blocks - code_blocks: true - # Fenced code languages to ignore - ignore_code_languages: [] - # Number of spaces for each hard tab - spaces_per_tab: 1 - -# MD011/no-reversed-links - Reversed link syntax -MD011: true - -# MD012/no-multiple-blanks - Multiple consecutive blank lines -MD012: - # Consecutive blank lines - maximum: 1 - -# MD013/line-length - Line length -MD013: false - -# MD014/commands-show-output - Dollar signs used before commands without showing output -MD014: true - -# MD018/no-missing-space-atx - No space after hash on atx style heading -MD018: true - -# MD019/no-multiple-space-atx - Multiple spaces after hash on atx style heading -MD019: true - -# MD020/no-missing-space-closed-atx - No space inside hashes on closed atx style heading -MD020: true - -# MD021/no-multiple-space-closed-atx - Multiple spaces inside hashes on closed atx style heading -MD021: true - -# MD022/blanks-around-headings/blanks-around-headers - Headings should be surrounded by blank lines -MD022: false - -# MD023/heading-start-left/header-start-left - Headings must start at the beginning of the line -MD023: true - -# MD024/no-duplicate-heading/no-duplicate-header - Multiple headings with the same content -MD024: false - -# MD025/single-title/single-h1 - Multiple top-level headings in the same document -MD025: false - -# MD026/no-trailing-punctuation - Trailing punctuation in heading -MD026: - # Punctuation characters - punctuation: ".,;:!。,;:!" - -# MD027/no-multiple-space-blockquote - Multiple spaces after blockquote symbol -MD027: true - -# MD028/no-blanks-blockquote - Blank line inside blockquote -MD028: true - -# MD029/ol-prefix - Ordered list item prefix -MD029: false - -# MD030/list-marker-space - Spaces after list markers -MD030: false - -# MD031/blanks-around-fences - Fenced code blocks should be surrounded by blank lines -MD031: - # Include list items - list_items: true - -# MD032/blanks-around-lists - Lists should be surrounded by blank lines -MD032: true - -# MD033/no-inline-html - Inline HTML -MD033: false - -# MD034/no-bare-urls - Bare URL used -MD034: true - -# MD035/hr-style - Horizontal rule style -MD035: - # Horizontal rule style - style: "consistent" - -# MD036/no-emphasis-as-heading/no-emphasis-as-header - Emphasis used instead of a heading -MD036: false - # Punctuation characters - # punctuation: ".,;:!?。,;:!?" - -# MD037/no-space-in-emphasis - Spaces inside emphasis markers -MD037: true - -# MD038/no-space-in-code - Spaces inside code span elements -MD038: true - -# MD039/no-space-in-links - Spaces inside link text -MD039: true - -# MD040/fenced-code-language - Fenced code blocks should have a language specified -MD040: false - -# MD041/first-line-heading/first-line-h1 - First line in a file should be a top-level heading -MD041: - # Heading level - level: 1 - # RegExp for matching title in front matter - front_matter_title: "^\\s*title\\s*[:=]" - -# MD042/no-empty-links - No empty links -MD042: true - -# MD043/required-headings/required-headers - Required heading structure -MD043: false - -# MD044/proper-names - Proper names should have the correct capitalization -MD044: - # List of proper names - names: [] - # Include code blocks - code_blocks: true - # Include HTML elements - html_elements: true - -# MD045/no-alt-text - Images should have alternate text (alt text) -MD045: true - -# MD046/code-block-style - Code block style -MD046: - # Block style - style: "consistent" - -# MD047/single-trailing-newline - Files should end with a single newline character -MD047: true - -# MD048/code-fence-style - Code fence style -MD048: - # Code fence style - style: "consistent" - -# MD049/emphasis-style - Emphasis style should be consistent -MD049: - # Emphasis style should be consistent - style: "consistent" - -# MD050/strong-style - Strong style should be consistent -MD050: - # Strong style should be consistent - style: "consistent" - -# MD051/link-fragments - Link fragments should be valid -MD051: false - -# MD052/reference-links-images - Reference links and images should use a label that is defined -MD052: true - -# MD053/link-image-reference-definitions - Link and image reference definitions should be needed -MD053: true diff --git a/docs/.ruby-version b/docs/.ruby-version deleted file mode 100644 index 8b733973b..000000000 --- a/docs/.ruby-version +++ /dev/null @@ -1,4 +0,0 @@ -2.7.6 - -# This version number should track the Ruby version used in production: https://pages.github.com/versions/. -# If it is out of date, please update and send a PR with the change. diff --git a/docs/Gemfile b/docs/Gemfile deleted file mode 100644 index 2276903ba..000000000 --- a/docs/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -source 'https://rubygems.org' -gem 'github-pages', group: :jekyll_plugins -gem 'dotenv' \ No newline at end of file diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 000000000..225a37582 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,126 @@ +# slack.dev + +This website is built using [Docusaurus](https://docusaurus.io/). 'Tis cool. + +Each Bolt/SDK has its own Docusaurus website, with matching CSS and nav/footer. There is also be a Docusaurus website of just the homepage and community tools. + +``` +docs/ +├── content/ (the good stuff. md and mdx files supported) +│ ├── getting-started.md +│ └── concepts +│ └── sending-message.md +├── i18n/ja/ (the japanese translations) +│ ├──docusaurus-theme-classic/ (footer/navbar translations) +│ └──docusaurus-plugin-content-docs/ +│ └── current/ (this folder's file names need to exactly match **/content/, but japanese content) +│ ├── getting-started.md +│ └── concepts +│ └── sending-message.md +├── static/ +│ ├── css/ +│ │ └── custom.css (the css for everything!) +│ └── img/ (the pictures for the site) +│ ├── rory.png +│ └── oslo.svg +├── src/ +│ ├── pages/ (stuff that isn't docs content. This is empty for every repo but homepage) +│ └── theme (only contains the 404 page) +├── docusaurus.config.js (main config file. also where to set navbar/footer) +└── redirects.js (a redirects script because the old site used # as pages which docusaurus can't handle) +└── sidebar.js (manually set where the content docs are in the sidebar.) +``` + +A cheat-sheet: +* _I want to edit a doc._ `content/*/*.md` +* _I want to edit a Japanese doc._ `i18n/ja-jp/docusaurus-plugin-content-docs/current/*/*.md` +* _I want to change the docs sidebar._ `sidebar.js` +* _I want to change the css._ Don't use this repo, use the home repo and the changes will propagate here. +* _I want to change anything else._ `docusaurus.config.js` + +---- + +## Adding a doc + +1. Make a markdown file. Add a `# Title` or use [front matter](https://docusaurus.io/docs/next/create-doc) with `title:`. +2. Save it in `content/folder/title.md` or `content/title.md`, depending on if it's in a sidebar category. The nuance is just for internal organization. +3. There needs to be 1:1 docs content for the sidebar. Copy the folder/file and put it in the Japanese docs: `i18n/ja/docusaurus-plugin-content-docs/current/*`. Just leave it in English if you don't speak Japanese. +4. Add the doc's path to the sidebar within `docusaurus.config.js`. Where ever makes most sense for you. +5. Test the changes ↓ + +--- + +## Running locally + +You'll want to be using at least Node 20. You can update Node however you want. `nvm` is one way. + +Install `nvm` if you don't have it: + +``` +curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash +``` + +Then grab the latest version of Node. + +``` +nvm install node +``` + + +If you are running this project locally for the first time, you'll need to install the packages with the following command: + +``` +npm install +``` + +The following command starts a local development server and opens up a browser window. + +``` +npm run start +open http://localhost:3000/bolt-python/getting-started # visit a page +``` + +Edits to pages are reflected live — no restarting the server or reloading the page. (I'd say... 95% of the time, and 100% time if you're just editing a markdown file) + +Remember — you're only viewing the Bolt-JS docs right now. + +#### Running locally in Japanese + +For local runs, Docusaurus treats each language as a different instance of the website. You'll want to specify the language to run the japanese site locally: + +``` +npm run start -- --locale ja-jp +``` + +Don't worry - both languages will be built/served on deployment. + +--- + +## Deploying + +The following command generates static content into the `build` directory. + +``` +$ npm run build +``` + +Then you can test out with the following command: + +``` +npm run serve +``` + +If it looks good, make a PR request! + +### Deployment to GitHub pages + +There is a GitHub action workflow set up in each repo. + +* On PR, it tests a site build. +* On Merge, it builds the site and deploys it. Site should update in a minute or two. + +--- + +## Something's broken + +Luke goofed. Open an issue please! `:bufo-appreciates-the-insight:` \ No newline at end of file diff --git a/docs/_basic/ja_updating_pushing_modals.md b/docs/_basic/ja_updating_pushing_modals.md deleted file mode 100644 index cddbd5bc0..000000000 --- a/docs/_basic/ja_updating_pushing_modals.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: モーダルの更新と多重表示 -lang: ja-jp -slug: updating-pushing-views -order: 11 ---- - -
-モーダルでは、複数のモーダルをスタックのように積み重ねて表示できます。`views.open` という API を呼び出すと、まず親の(最初の)モーダルが表示されます。この最初の呼び出しの後、`views.update` を実行することでそのビューを書き換えることもできますし、最初に述べたように `views.push` で新しいモーダルを積み重ねて表示することもできます。 - -views.update
-モーダルの更新には、組み込みの API クライアントを使って views.update を呼び出します。この API 呼び出しには、そのモーダルを開いたときに生成された view_id と、更新後の内容を表現する blocks の配列を含む新しい view を渡します。ユーザーが既存のモーダル内の要素とインタラクションを行なった(例:ボタンを押す、メニューから選択する)ことをトリガーにビューを更新する場合、そのリクエストの bodyview_id が含まれます。 - -views.push
-モーダルのスタックに新しいモーダルを積み重ねるためには、組み込みの API クライアントを用いて views.push を呼び出します。この API 呼び出しには、有効な trigger_id と、新しく生成する ビュー部分のペイロードを渡します。`views.push` の引数は モーダルを開始するときと同様です。最初のモーダルを開いた後、その上にさらに二つまで追加のモーダルをスタックに積み重ねることができます。 - -より詳細な情報は API ドキュメントを参照してください。 -
- -```javascript -// action_id: button_abc のボタンを押すイベントをリッスン -// (そのボタンはモーダルの中にあるという想定) -app.action('button_abc', async ({ ack, body, client, logger }) => { - // ボタンを押したイベントを確認 - await ack(); - - try { - if (body.type !== 'block_actions' || !body.view) { - return; - } - const result = await client.views.update({ - // リクエストに含まれる view_id を渡す - view_id: body.view.id, - // 競合状態を防ぐために更新前の view に含まれる hash を指定 - hash: body.view.hash, - // 更新された view の値をペイロードに含む - view: { - type: 'modal', - // callback_id が view を特定するための識別子 - callback_id: 'view_1', - title: { - type: 'plain_text', - text: 'Updated modal' - }, - blocks: [ - { - type: 'section', - text: { - type: 'plain_text', - text: 'You updated the modal!' - } - }, - { - type: 'image', - image_url: 'https://media.giphy.com/media/SVZGEcYt7brkFUyU90/giphy.gif', - alt_text: 'Yay! The modal was updated' - } - ] - } - }); - logger.info(result); - } - catch (error) { - logger.error(error); - } -}); -``` diff --git a/docs/_basic/updating_pushing_modals.md b/docs/_basic/updating_pushing_modals.md deleted file mode 100644 index 7708bf550..000000000 --- a/docs/_basic/updating_pushing_modals.md +++ /dev/null @@ -1,67 +0,0 @@ ---- -title: Updating and pushing views -lang: en -slug: updating-pushing-views -order: 11 ---- - -
-Modals contain a stack of views. When you call `views.open`, you add the root view to the modal. After the initial call, you can dynamically update a view by calling `views.update`, or stack a new view on top of the root view by calling `views.push`. - -views.update
-To update a view, you can use the built-in client to call views.update with the view_id that was generated when you opened the view, and a new view including the updated blocks array. If you're updating the view when a user interacts with an element inside of an existing view, the view_id will be available in the body of the request. - -views.push
-To push a new view onto the view stack, you can use the built-in client to call views.push with a valid trigger_id a new view payload. The arguments for `views.push` is the same as opening modals. After you open a modal, you may only push two additional views onto the view stack. - -Learn more about updating and pushing views in our API documentation. -
- -```javascript -// Listen for a button invocation with action_id `button_abc` (assume it's inside of a modal) -app.action('button_abc', async ({ ack, body, client, logger }) => { - // Acknowledge the button request - await ack(); - - try { - if (body.type !== 'block_actions' || !body.view) { - return; - } - // Call views.update with the built-in client - const result = await client.views.update({ - // Pass the view_id - view_id: body.view.id, - // Pass the current hash to avoid race conditions - hash: body.view.hash, - // View payload with updated blocks - view: { - type: 'modal', - // View identifier - callback_id: 'view_1', - title: { - type: 'plain_text', - text: 'Updated modal' - }, - blocks: [ - { - type: 'section', - text: { - type: 'plain_text', - text: 'You updated the modal!' - } - }, - { - type: 'image', - image_url: 'https://media.giphy.com/media/SVZGEcYt7brkFUyU90/giphy.gif', - alt_text: 'Yay! The modal was updated' - } - ] - } - }); - logger.info(result); - } - catch (error) { - logger.error(error); - } -}); -``` diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 63d00e632..000000000 --- a/docs/_config.yml +++ /dev/null @@ -1,82 +0,0 @@ -# For technical reasons, this file is *NOT* reloaded automatically when you use -# 'bundle exec jekyll serve'. If you change this file, please restart the server process. -title: Bolt -description: >- - A framework that makes Slack app development fast and straight-forward. - With a single interface for Slack’s Web API, Events API, and interactive features, - Bolt gives you the full power of the Slack platform out of the box. -baseurl: /bolt-js -url: https://slack.dev - -collections: - basic: - output: false - advanced: - output: false - functions: - output: false - steps: - output: false - deployments: - output: true - tutorials: - output: true - permalink: /tutorials/:slug - reference: - output: true - -defaults: - - - scope: - path: "" - values: - layout: "default" - -# Translation strings used in templates - they are typically used using t[page.lang] -# so it's important to have corresponding strings for each translated language -t: - en: - basic: Basic concepts - advanced: Advanced concepts - start: Getting started - reference: Reference - functions: Custom functions - steps: Workflow steps - deployments: Deployments - contribute: Contributing - deprecated: Deprecated - beta: Beta - ja-jp: - basic: 基本的な概念 - advanced: 応用コンセプト - start: Bolt 入門ガイド - steps: ワークフローステップ - # TODO: translate these title - deployments: Deployments - reference: リファレンス - contribute: 貢献 - deprecated: 非推奨 - beta: Beta - -# Metadata -repo_name: bolt-js -github_username: SlackAPI - -code_of_conduct_url: https://slackhq.github.io/code-of-conduct -cla_url: https://cla-assistant.io/slackapi/bolt-js - -google_analytics: UA-56978219-13 -google_tag_manager: GTM-KFZ5MK7 - -# Build settings -markdown: kramdown -kramdown: - parse_block_html: true - syntax_highlighter_opts: - block: - line_numbers: true -plugins: - - jemoji - - jekyll-redirect-from - -repository: slackapi/bolt-js diff --git a/docs/_functions/creating.md b/docs/_functions/creating.md deleted file mode 100644 index 52cb2b505..000000000 --- a/docs/_functions/creating.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -title: Creating custom functions -lang: en -slug: creating-custom-functions -order: 1 ---- - -
-Custom functions allow your app to create and process workflow steps that users can add in [Workflow Builder](https://api.slack.com/workflows). - -We recommend using custom functions as a replacement for the [deprecated Workflow Steps from Apps](#steps). - -A custom function requires two components: - -* [A function definition in the app’s manifest](#defining-custom-functions) -* [A listener to handle the function execution event](#listening-to-custom-functions) - -Read more about custom functions in the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt). - -
diff --git a/docs/_includes/analytics.html b/docs/_includes/analytics.html deleted file mode 100644 index ec5f3a8a2..000000000 --- a/docs/_includes/analytics.html +++ /dev/null @@ -1,7 +0,0 @@ - - - diff --git a/docs/_includes/head.html b/docs/_includes/head.html deleted file mode 100644 index fec9861d5..000000000 --- a/docs/_includes/head.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - Slack | Bolt for JavaScript - - - - - - {% if page.lang == "ja-jp" %} - - {% endif %} - - - - - - - - - - - diff --git a/docs/_includes/header.html b/docs/_includes/header.html deleted file mode 100644 index 13ef1313f..000000000 --- a/docs/_includes/header.html +++ /dev/null @@ -1,12 +0,0 @@ -
-
- Code on GitHub - Slack Platform Home - - {% if page.lang == "ja-jp" %} - English - {% else %} - 日本語 (Japanese) - {% endif %} -
-
\ No newline at end of file diff --git a/docs/_includes/sidebar.html b/docs/_includes/sidebar.html deleted file mode 100644 index df37df835..000000000 --- a/docs/_includes/sidebar.html +++ /dev/null @@ -1,115 +0,0 @@ - diff --git a/docs/_includes/tag_manager.html b/docs/_includes/tag_manager.html deleted file mode 100644 index 9ffc5e093..000000000 --- a/docs/_includes/tag_manager.html +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - diff --git a/docs/_layouts/default.html b/docs/_layouts/default.html deleted file mode 100644 index 1b1553970..000000000 --- a/docs/_layouts/default.html +++ /dev/null @@ -1,82 +0,0 @@ ---- -sidebar_style: main ---- - - - - {% include head.html %} - - - {% include tag_manager.html %} -
-
- {% include sidebar.html %} -
- -
-
- {% include header.html %} -
- -
- {% assign basic_sections = site.basic | sort: "order" | where: "lang", page.lang %} {% for section in - basic_sections %} -
-

{{ section.title }}

- - {{ section.content | markdownify }} - -
-
- {% endfor %} -
- -
- {% assign advanced_sections = site.advanced | sort: "order" | where: "lang", page.lang %} {% for section in - advanced_sections %} -
-

{{ section.title }}

- - {{ section.content | markdownify }} - -
-
- {% endfor %} -
- -
- {% assign functions_sections = site.functions | sort: "order" | where: "lang", page.lang %} {% for section in - functions_sections %} -
-

{{ section.title }} - - {{ site.t[page.lang].beta }} - -

- {{ section.content | markdownify }} -
-
- {% endfor %} -
- -
- {% assign workflow_steps = site.steps | sort: "order" | where: "lang", page.lang %} {% for section in - workflow_steps %} -
-

- {{ section.title }} - - {{ site.t[page.lang].deprecated }} - -

- {{ section.content | markdownify }} -
-
- {% endfor %} -
- -
-
- {% include analytics.html %} - - diff --git a/docs/_layouts/fullpage.html b/docs/_layouts/fullpage.html deleted file mode 100644 index 6d1db3816..000000000 --- a/docs/_layouts/fullpage.html +++ /dev/null @@ -1,30 +0,0 @@ ---- -sidebar_style: main ---- - - - -{% include head.html %} - - - {% include tag_manager.html %} -
-
- {% include sidebar.html %} -
- -
-
- {% include header.html %} -
- -
- {{ content | markdownify }} -
-
- -
- - {% include analytics.html %} - - \ No newline at end of file diff --git a/docs/_layouts/tutorial.html b/docs/_layouts/tutorial.html deleted file mode 100644 index 90342dea0..000000000 --- a/docs/_layouts/tutorial.html +++ /dev/null @@ -1,36 +0,0 @@ ---- -sidebar_style: main ---- - - - -{% include head.html %} - - - {% include tag_manager.html %} -
-
- {% include sidebar.html %} -
- - -
-
- {% include header.html %} -
- -
-
    -
    - -
    - {{ content | markdownify }} -
    -
    - -
    - - - {% include analytics.html %} - - \ No newline at end of file diff --git a/docs/_steps/workflow_steps_overview.md b/docs/_steps/workflow_steps_overview.md deleted file mode 100644 index 42ba9bd9b..000000000 --- a/docs/_steps/workflow_steps_overview.md +++ /dev/null @@ -1,30 +0,0 @@ ---- -title: Overview of Workflow Steps for apps -lang: en -slug: steps-overview -order: 1 ---- - -
    - -**⚠️ Workflow Steps from Apps are a deprecated feature.** - -**Workflow Steps from Apps are different than, and not interchangable with, Slack automation workflows. We encourage those who are currently publishing Workflow Steps from Apps to consider the new [Slack automation features](https://api.slack.com/automation), such as [custom functions for Bolt](#functions).** - -**Please [read the Slack API changelog entry](https://api.slack.com/changelog/2023-08-workflow-steps-from-apps-step-back) for more information.** - ---- - -Workflow Steps from Apps allow your app to create and process custom workflow steps that users can add using [Workflow Builder](https://api.slack.com/workflows). - -A workflow step is made up of three distinct user events: - -- Adding or editing the step in a Workflow -- Saving or updating the step's configuration -- The end user's execution of the step - -All three events must be handled for a workflow step to function. - -Read more about Workflow Steps from Apps in the [API documentation](https://api.slack.com/legacy/workflows/steps). - -
    diff --git a/docs/_tutorials/ja_using-typescript.md b/docs/_tutorials/ja_using-typescript.md deleted file mode 100644 index f8fef4513..000000000 --- a/docs/_tutorials/ja_using-typescript.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -title: TypeScript での利用ガイド -order: 4 -slug: using-typescript -lang: ja-jp -layout: tutorial -permalink: /ja-jp/tutorial/using-typescript ---- - -# TypeScript での利用ガイド - -このプロジェクトは [TypeScript](https://www.typescriptlang.org/) を利用して開発されているため、多くの API が型に関するメタ情報を持っています🎉 Visual Studio Code や Atom をはじめとする型のメタ情報を読み込んでくれるエディタを利用していたり、あなたも TypeScript を使って開発している場合には、このより優れたドキュメンテーションによって、よりスムーズにコードを書いたり、エラーの早期発見、より楽なリファクタリングなどの恩恵を受けることができるでしょう。 - -このページでは、TypeScript を利用しているプロジェクトからこの npm パッケージを利用する方法について解説します。 - -### 最低必須バージョン {#minimum-version} - -`@slack/bolt` の最新のメジャーバージョンは TypeScript 4.1 以上での利用をサポートしています。 diff --git a/docs/_tutorials/using-typescript.md b/docs/_tutorials/using-typescript.md deleted file mode 100644 index 977b26b58..000000000 --- a/docs/_tutorials/using-typescript.md +++ /dev/null @@ -1,23 +0,0 @@ ---- -title: Using TypeScript -order: 4 -slug: using-typescript -lang: en -layout: tutorial -permalink: /tutorial/using-typescript ---- -# Using TypeScript -> ⚠️ This guide is a work-in-progress. - -See [the sample TypeScript project][1] to see a TypeScript equivalent of the [Getting Started app][2] (and a few other basic examples). - -This project is written and built using [TypeScript](https://www.typescriptlang.org/), which means many of the APIs have type information metadata 🎉. If you’re using a code editor like VSCode, Atom, or many others that know how to read that metadata, or if you’re using TypeScript in your own project, you’ll benefit from improved documentation as your write code, early detection of errors, easier refactoring, and more. - -This page helps describe how to use this package from a project that also uses TypeScript. - -### Minimum version {#minimum-version} - -The latest major version of `@slack/bolt` is supported to build against a minimum TypeScript version of v4.1. - -[1]: https://github.com/slackapi/bolt-js/tree/main/examples/getting-started-typescript -[2]: https://github.com/slackapi/bolt-js-getting-started-app \ No newline at end of file diff --git a/docs/assets/bolt-favicon.png b/docs/assets/bolt-favicon.png deleted file mode 100644 index bfe5456c172c5e76fa9b13b1e8ab0a793b6e95cf..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3376 zcmcIneKb_*AHQb2EK6y88ggmQgUDf-K&lW( z#5fHj6d{RMu<)qTk1mL$Gqhs)RG83!k(7{>L?(h7m!^SS?!QAtq8YSY;gNt^nbP~W z#B%>6DMIo?*gF!GEkX|zNkkw;7Z z!H=2c8E>RawhVz35}Ch5BAiZ??=%aJf|BFxxezQ6Yj_`$gLsZLB99UU`4@FSFqRstVVK%WMd@CA`cp91A_nO2A>8Z2sP3fW_-|v?&nD0cufE``#%;gUjm~XGcjU< zG&?XD2El0tB7W`lLoeP6!0iDDX7f8kqn+JCN|NtQu8(lo5u>APt5n z1U@aoh2VtH83Y#wJ%Rv|T_8S{&!^GpWIT=!Gb1H35rkHXKm@UW&H5I%ltTJSev{xpX^(k4bDDCxgc$w!!65~)apWQbc7nvzeb zL()IVmqQ8vF8?RrJ#d0MNbf#c}gj=CvFZWSe@Jrd%lfz6dv!2bSMZp+ zr(rz-lf`rMZ4wer{CKkI^}cIGdo~4(oqcmIsN!TpocGp7@&urVZBN~BT+h|LbC-Uy{!iM=Fy~L-tcegV zIc}C~6o$#uwJo(T1dNnOd162EtM0H~AVAW(p0d1<))CIu!qiySn7Ld^tH1f=@WJ;Y ztU2}uux)L6bH;9_&bYQx=S)5c!Hn29`GlEz_?8)TT0BP$_+0~%Sz$o(XRGx?*VhOmos;dI`t_nP?R(DMMuiT2(!NH6SGUremcC2cY3H#9KkTOkBx2>)*E@F9())J5 zy%3-c=JN6?H>TB2>{(!De>WhzVV9~Xhj@UeO78QtAY9Wvk~tLDKUQ7X8hvKX1=la& z29L+vb4)=Sc>Jfrp9PnC+L@1I4*fB2oobE?wx-|(zXYSbxS?!dSqx;~8m9EMrZxpU zELcBcyeMvU38o*oQdi6{i#{>b-VnbtzQ%YXp+~j5(Jsr(7;9cr93Y6!NxOT(RxtW< zlhI&HylVWCTP4Ovb+i4;7iK{|;zzmVi!FY?e3~Rp`0aSG)^~NqBKubLQ}J(YUUyhA zrsa!|ZC_#^?%1?y-J({o$wYnZNKwe-GxmktLa?@Zs~M;_aC*J>l2-K~mr{E`|=Mlbx& z@xWHs6&K5R`(D^KBX!nki^GpJD0;hJrLxXP4o~X)9Bqy9F7l3C)#no0Mp-2f56uoe z;q;=F6j@O8@VEzhKP3OaABFLrBSo&k1(NKb>#IPR~1Vr}eSE`Me%3KHp>eRcZ7O z16g*RU2U@{**1s%NON-A>(1f1R|Utnwrn&gi@LSM4Lh1!R8=^4IVZte&!DTf;OqPK zR$V=7H%@n zl0s~8n3f1wrJDtPjZ3{R@+{Ts`f}K9=*`?BTF_lm>h0>HTHDTQ!>!kkW+>~pm7%t$ z4%u%xHEZA&of12&J?C=TGg9P1ZTh3FMp=s|+OfsA=z9a(9~%S{QdzmTgN!mSypETJ z_PRB6S1$GKz--pxy{YA1tM=WtncuN2dn9jl*>~8kG)%AE?=tFOvEgBfWCc>aO|g&n z)^c)}ZFTseI+|ha`A7P1g76VOvaF-_YXQ}BVoa&d*sGY+gXXnQma0B?HQ4c0IO9}r z!0vztvvXcg5*2&P7o0E8a*7rhvOJI-bG5Y{l^QwW`;emT%%Ka9-hj)(*WH;c$V@ES{V%Du- z8AY70>N+;x)kp~32=N(>RbvLB1H3VedY|G^hSK`UjaOGi>(Vk96KPMe9k5{^*zC|Z zTa96#*>77hmvt&tz30_J{=DlZ`4RotlPk`G-Pfz<)wFoYRfg|WcJEqj*8RApl6BLe z->mPN%;Kw%qgPU+%IJ1`j4}E1TQ9zhx2l-Ca@!D99g%U`9~M{W910frIJnnjJ-=x9 zTAregb`B^^0cs4C-R^}?8n37ht6r{h4jhzLS$=hPukMZcQ15GMi7Y6jGvk4qn)1SC z!S&nQfEtsU?6;gBtzz_Rdz&1=H^+CJE+3y$6*QW&%K4CAtok)o%51tM{z+QlodCVW zsvByCS~*5%k2N};Qd(BE{IX#@H}kGx--htSvNWNZIf)s@eA~ncizQrjyb{<)?h96% z_gsDb`O$B7I>V8nyU5QTl;m;`o-4e?Yr%GECm(rFX#CStUir<^U4ntO`nPN{dn{O; z^|M&5yW>(vOIj!w+VSVc+<6bJR-fI%nq^Y`9vV diff --git a/docs/assets/style.css b/docs/assets/style.css deleted file mode 100644 index 9a38809d3..000000000 --- a/docs/assets/style.css +++ /dev/null @@ -1,493 +0,0 @@ -/* Color variables */ -:root { - --light-grey: #F8F8F8; - --grey: #868686; - --dark-grey: #616061; - --soft-grey: #ECECEC; - --blue: #1264A3; - --green: #00B073; - --light-blue: #B8D1E3; - --white: #FFFFFF; - --black: #1D1C1D; - --yellowish: #FF9E00; -} - -body { - background-color: var(--white); - font-family: 'Noto Sans JP', 'Slack-Lato', sans-serif; -} - -.content { - grid-area: content; -} - -/* Sidebar */ -.panel { - position: fixed; - width: 20%; - height: 100%; - overflow: auto; - top: 0; - left: 0; - background-color: var(--light-grey); -} - -.panel .sidebar-content { - width: 75%; - margin: 30px auto 20px auto; -} - -.panel .sidebar-content .logo { - padding-top: 1em; - position: relative; -} - -.panel .sidebar-content .logo .icon img { - width: 30px; - margin-right: 6px; -} - -.panel .sidebar-content .logo .name { - font-weight: 800; - font-size: 1.7em; - vertical-align: bottom; -} - -.panel .sidebar-content .logo .version { - line-height: 1em; - vertical-align: bottom; -} - -.panel .sidebar-content .logo .version a { - color: var(--dark-grey); - background-color: var(--soft-grey); - font-size: 0.5em; - font-weight: 800; - padding: 4px 10px; - border-radius: 12px; - margin-left: 10px; - -} - -.panel .sidebar-content ul.sidebar-section { - list-style: none; - list-style-position: inside; - padding-top: 0.9em; - margin: 0 0 0 -8px; - font-size: 0.80em; -} - -.panel .sidebar-content ul.sidebar-section li { - border-radius: 8px; - padding: 2px 0 2px 8px; - margin: 3px 0; - color: var(--black); -} - -.panel .sidebar-content ul.sidebar-section li:hover { - background-color: #D7D7D7; -} - -.panel .sidebar-content ul.sidebar-section li.madeby:hover { - background-color: transparent; -} - -.panel .sidebar-content a:hover { - text-decoration: none; -} - -.panel .sidebar-content ul.sidebar-section li.active { - background-color: var(--blue); - color: var(--white); -} - -.panel .sidebar-content ul.sidebar-section li.title { - font-weight: 600; -} - -.panel .sidebar-content ul.sidebar-section .label-warning { - line-height: 1em; - vertical-align: middle; - color: var(--white); - background-color: var(--dark-grey); - font-size: 0.5em; - font-weight: 800; - padding: 4px 10px; - border-radius: 12px; -} - -/* Main page */ -.header { - width: 95%; - margin: 0 auto 1em auto; - height: 5rem; - padding-top: 1.5em; -} - -.header a:hover { - text-decoration: none; -} - -.header a.language-switcher { - color: var(--grey); - font-weight: 700; - padding: 6px 14px 9px; - font-size: 15px; -} - -.header a.language-switcher:hover { - color: var(--black); -} - -.wrapper { - width: 100%; - margin: 0 auto; -} - -/* Main page content */ -.section-wrapper { - width: 90%; - margin: 0 auto 30px auto; - display: grid; - grid-gap: 25px; - grid-template-areas: - "head" - "body" - "code" - "secondary" - "divider" -} - -.tutorial-nav { - width: 20%; - position: fixed; -} - -.tutorial-nav ul { - margin-left: 3em; - padding-left: 1em; - border-width: 4px; - border-left-style: solid; - border-color: #F2F2F2; - border-image: linear-gradient( - to bottom, - #FFFFFF 0%, - #F2F2F2 6% 92%, - #FFFFFF 100% - ) 1 100%; - list-style: none; - padding-top: 1.5em; -} - -.circle { - background: #ddd; - border-radius: 50%; - height: 1em; - width: 1em; - float: left; - margin: 5px 0 0 -1.6em; -} - -.completed { - background: #58AF7F; -} - -.tutorial-nav ul li { - padding-bottom: 2.5em; -} - -.tutorial-nav a { - font-weight: 700; - font-size: 0.8em; - color: #757575; -} - -.tutorial-nav a:hover { - color: #000; - text-decoration: none; -} - -.tutorial { - width: 55%; - margin: 1em 0 0 33%; - padding-bottom: 2em; - font-size: 1em; - line-height: 1.75em; -} - -.tutorial img, .reference img { - width: 85%; - margin: 0.2em auto; - display: block; - box-shadow: 0 0 15px #DDDDDD; -} - -.tutorial blockquote, .reference blockquote { - margin: 0 0 0 1em; - padding: 0 6em 0 1.5em; - border-radius: 6px; - border-left: 6px solid #DDD; - font-size: 0.95em; -} - -.tutorial h3 { - padding-bottom: 1em; -} - -.label-warning { - line-height: 1em; - vertical-align: middle; - color: var(--white); - background-color: var(--dark-grey); - font-size: 0.45em; - font-weight: 800; - padding: 4px 10px; - border-radius: 12px; - margin-left: 10px; -} - -.reference { - width: 80%; - margin: 1em auto 3em auto; - padding-bottom: 2em; - font-size: 1em; - line-height: 1.75em; -} - -.reference h3 { - padding-top: 1em; -} - -.content .section-wrapper .language-javascript { - grid-area: code; -} - -pre { - background-color: var(--light-grey) !important; - background-image: none; - padding: 1em 1.5em; - border: 1px solid var(--soft-grey); - margin: 0; - border-radius: 1em; -} - -/* Code block with column numbers */ -pre.highlight { - line-height: 2em; - overflow-x: auto; -} - -pre.highlight code span { - padding: 0; - margin: 0; - height: 0; -} - -pre.highlight code pre { - padding: 0; - border: 0; - font-size: 0.9em; - overflow: visible; -} - -table.rouge-table, td.rouge-code, td.rouge-gutter { - padding: 0; - border: 0; - margin: 0; -} - -td.rouge-gutter { - padding-right: 1em; - user-select: none; - color: var(--dark-grey); -} -/* End Code block with column numbers */ - -.content .section-wrapper .section-content { - grid-area: body; - font-size: 1em; - line-height: 2em; -} - -.content .section-wrapper h3 { - grid-area: head; - font-size: 1.4em; - font-weight: 600; -} - -.content .section-wrapper hr { - grid-area: divider; - height: 1px; - border-top: 1px solid #DDD; - width: 100%; -} - -.content .section-wrapper .label-legacy { - line-height: 1em; - vertical-align: middle; - color: var(--white); - background-color: var(--dark-grey); - font-size: 0.5em; - font-weight: 800; - padding: 4px 10px; - border-radius: 12px; - margin-left: 10px; -} - - -a:hover { - text-decoration: underline; -} - -/* Secondary content */ -.secondary-wrapper { - width: 100%; - grid-area: secondary; - margin: 1em auto 0 auto; - font-size: 1em; - line-height: 1.75em; -} - -.secondary-wrapper .language-javascript { - width: 50%; - float: left; - margin-top: 1em; -} - -.content .section-wrapper .secondary-content { - width: 45%; - float: left; - margin-right: 5%; - margin-top: 1em; -} - -summary h4 { - display: inline; -} - -/* Responsive */ -@media (min-width: 1024px) { - .tutorial-nav ul { - margin-left: 5em; - } -} - -@media (min-width: 768px) { - .wrapper { - display: grid; - grid-template-columns: 20% 75%; - grid-template-areas: - "sidebar content" - } - - .section-wrapper { - grid-template-columns: 50% 50%; - grid-template-areas: - "head head" - "body code" - "secondary secondary" - "divider divider" - } -} - -@media (max-width: 768px) { - .panel { - display: none; - } - - .language-switcher { - display: none; - } - - .tutorial-nav { - display: none; - } - - .tutorial { - width: 85%; - margin: 1em auto; - } - - .wrapper { - display: grid; - grid-template-columns: 100%; - grid-template-areas: - "content" - } - - .section-wrapper { - grid-template-columns: 100%; - grid-template-areas: - "head" - "body" - "code" - "secondary" - "divider" - } -} - - -/* - * GitHub theme stylesheet from: http://jwarby.github.io/jekyll-pygments-themes/languages/javascript.html - */ - .highlight .hll { background-color: #ffffcc } - .highlight .c { color: #999988; } /* Comment */ - .highlight .err { color: #a61717; background-color: #e3d2d2 } /* Error */ - .highlight .k { color: #000000; font-weight: bold } /* Keyword */ - .highlight .o { color: #000000; font-weight: bold } /* Operator */ - .highlight .cm { color: #999988; } /* Comment.Multiline */ - .highlight .cp { color: #999999; font-weight: bold; } /* Comment.Preproc */ - .highlight .c1 { color: #999988; } /* Comment.Single */ - .highlight .cs { color: #999999; font-weight: bold; } /* Comment.Special */ - .highlight .gd { color: #000000; background-color: #ffdddd } /* Generic.Deleted */ - .highlight .ge { color: #000000; font-style: italic } /* Generic.Emph */ - .highlight .gr { color: #aa0000 } /* Generic.Error */ - .highlight .gh { color: #999999 } /* Generic.Heading */ - .highlight .gi { color: #000000; background-color: #ddffdd } /* Generic.Inserted */ - .highlight .go { color: #888888 } /* Generic.Output */ - .highlight .gp { color: #555555 } /* Generic.Prompt */ - .highlight .gs { font-weight: bold } /* Generic.Strong */ - .highlight .gu { color: #aaaaaa } /* Generic.Subheading */ - .highlight .gt { color: #aa0000 } /* Generic.Traceback */ - .highlight .kc { color: #000000; font-weight: bold } /* Keyword.Constant */ - .highlight .kd { color: #000000; font-weight: bold } /* Keyword.Declaration */ - .highlight .kn { color: #000000; font-weight: bold } /* Keyword.Namespace */ - .highlight .kp { color: #000000; font-weight: bold } /* Keyword.Pseudo */ - .highlight .kr { color: #000000; font-weight: bold } /* Keyword.Reserved */ - .highlight .kt { color: #445588; font-weight: bold } /* Keyword.Type */ - .highlight .m { color: #009999 } /* Literal.Number */ - .highlight .s { color: #d01040 } /* Literal.String */ - .highlight .na { color: #008080 } /* Name.Attribute */ - .highlight .nb { color: #0086B3 } /* Name.Builtin */ - .highlight .nc { color: #445588; font-weight: bold } /* Name.Class */ - .highlight .no { color: #008080 } /* Name.Constant */ - .highlight .nd { color: #3c5d5d; font-weight: bold } /* Name.Decorator */ - .highlight .ni { color: #800080 } /* Name.Entity */ - .highlight .ne { color: #990000; font-weight: bold } /* Name.Exception */ - .highlight .nf { color: #990000; font-weight: bold } /* Name.Function */ - .highlight .nl { color: #990000; font-weight: bold } /* Name.Label */ - .highlight .nn { color: #555555 } /* Name.Namespace */ - .highlight .nt { color: #000080 } /* Name.Tag */ - .highlight .nv { color: #008080 } /* Name.Variable */ - .highlight .ow { color: #000000; font-weight: bold } /* Operator.Word */ - .highlight .w { color: #bbbbbb } /* Text.Whitespace */ - .highlight .mf { color: #009999 } /* Literal.Number.Float */ - .highlight .mh { color: #009999 } /* Literal.Number.Hex */ - .highlight .mi { color: #009999 } /* Literal.Number.Integer */ - .highlight .mo { color: #009999 } /* Literal.Number.Oct */ - .highlight .sb { color: #d01040 } /* Literal.String.Backtick */ - .highlight .sc { color: #d01040 } /* Literal.String.Char */ - .highlight .sd { color: #d01040 } /* Literal.String.Doc */ - .highlight .s2 { color: #d01040 } /* Literal.String.Double */ - .highlight .se { color: #d01040 } /* Literal.String.Escape */ - .highlight .sh { color: #d01040 } /* Literal.String.Heredoc */ - .highlight .si { color: #d01040 } /* Literal.String.Interpol */ - .highlight .sx { color: #d01040 } /* Literal.String.Other */ - .highlight .sr { color: #009926 } /* Literal.String.Regex */ - .highlight .s1 { color: #d01040 } /* Literal.String.Single */ - .highlight .ss { color: #990073 } /* Literal.String.Symbol */ - .highlight .bp { color: #999999 } /* Name.Builtin.Pseudo */ - .highlight .vc { color: #008080 } /* Name.Variable.Class */ - .highlight .vg { color: #008080 } /* Name.Variable.Global */ - .highlight .vi { color: #008080 } /* Name.Variable.Instance */ - .highlight .il { color: #009999 } /* Literal.Number.Integer.Long */ diff --git a/docs/babel.config.js b/docs/babel.config.js new file mode 100644 index 000000000..e00595dae --- /dev/null +++ b/docs/babel.config.js @@ -0,0 +1,3 @@ +module.exports = { + presets: [require.resolve('@docusaurus/core/lib/babel/preset')], +}; diff --git a/docs/content/Changelog.md b/docs/content/Changelog.md new file mode 100644 index 000000000..abf558ebe --- /dev/null +++ b/docs/content/Changelog.md @@ -0,0 +1,1289 @@ +--- +hide_table_of_contents: true +--- + +# Changelog + + +# [@slack/bolt@3.19.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.19.0) - 19 Jun 2024 + +## What's Changed + +More customizations for the `AwsLambdaReceiver` have landed as well as a few touchups to typings and documented details! + +With this release, the signature verification for `AwsLambdaReceiver` can now be turned off if that's something you're interested in! Perhaps you have your own stylish way of verifying these signatures. The following can be added to your receiver to unlock this: + +```ts +const { App, AwsLambdaReceiver } = require('@slack/bolt'); + +const app = new App({ + ... + receiver: new AwsLambdaReceiver({ + signatureVerification: false, + }), +}); +``` + +Read on and browse around for more details on all of the changes included! + +### 🎁 Enhancements + +* Add flag to `AwsLambdaReceiver` to enable/disable signature verification in https://github.com/slackapi/bolt-js/pull/2107 - thanks [@noah-guillory](https://github.com/noah-guillory)! + +### 🐛 Fixes + +* Add a type predicate for `CodedError` in https://github.com/slackapi/bolt-js/pull/2110 - thanks [@filmaj](https://github.com/filmaj)! +* ButtonAction value field not required in https://github.com/slackapi/bolt-js/pull/2134 - thanks [@srajiang](https://github.com/srajiang)! +* fix(types): return void promises from the express receiver middleware parser in https://github.com/slackapi/bolt-js/pull/2141 - thanks [@zimeg](https://github.com/zimeg)! + +### 📚 Documentation + +* docs: fixed duplicative header links in reference in https://github.com/slackapi/bolt-js/pull/2120 - thanks [@lukegalbraithrussell](https://github.com/lukegalbraithrussell)! +* docs: deprecate Steps from Apps docs in https://github.com/slackapi/bolt-js/pull/2130 - thanks [@filmaj](https://github.com/filmaj)! +* docs: add JSDoc to and list out all available builtin middleware functions in the docs in https://github.com/slackapi/bolt-js/pull/2136 - thanks [@filmaj](https://github.com/filmaj)! + +### 🧰 Maintenance + +* ci(test): perform unit testing against node version 22 in https://github.com/slackapi/bolt-js/pull/2140 - thanks [@zimeg](https://github.com/zimeg)! +* chore(release): tag version @slack/bolt@3.19.0 in https://github.com/slackapi/bolt-js/pull/2142 - thanks [@zimeg](https://github.com/zimeg)! + +### 📦 Dependencies + +* Bump @types/node from 20.12.7 to 20.12.10 in https://github.com/slackapi/bolt-js/pull/2111 - thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.12.10 to 20.12.11 in https://github.com/slackapi/bolt-js/pull/2114 - thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.12.11 to 20.12.12 in https://github.com/slackapi/bolt-js/pull/2117 - thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.12.12 to 20.14.0 in https://github.com/slackapi/bolt-js/pull/2125 - thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.14.0 to 20.14.2 in https://github.com/slackapi/bolt-js/pull/2132 - thanks [@dependabot](https://github.com/dependabot)! + +## New Contributors + +* [@noah-guillory](https://github.com/noah-guillory) made their first contribution in https://github.com/slackapi/bolt-js/pull/2107 +* [@lukegalbraithrussell](https://github.com/lukegalbraithrussell) made their first contribution in https://github.com/slackapi/bolt-js/pull/2120 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.18.0...@slack/bolt@3.19.0 + +[Changes][@slack/bolt@3.19.0] + + +# [@slack/bolt@3.18.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.18.0) - 25 Apr 2024 + +## What's Changed +* Fix [#2056](https://github.com/slackapi/bolt-js/issues/2056) by adding `files` to `app_mention` event payload by [@seratch](https://github.com/seratch) in https://github.com/slackapi/bolt-js/pull/2057 +* Update acknowledging_requests.md by [@technically-tracy](https://github.com/technically-tracy) in https://github.com/slackapi/bolt-js/pull/2086 + +## New Contributors +* [@technically-tracy](https://github.com/technically-tracy) made their first contribution in https://github.com/slackapi/bolt-js/pull/2086 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.17.1...@slack/bolt@3.18.0 + +[Changes][@slack/bolt@3.18.0] + + + +# [@slack/bolt@3.17.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.17.1) - 11 Jan 2024 + +## What's Changed +* chore(3.17.1): Publish v3.17.1 by [@rafael-fecha](https://github.com/rafael-fecha), including dependency updates to address an Axios security vulnerability in https://github.com/slackapi/bolt-js/pull/2029 + +## New Contributors +* [@rafael-fecha](https://github.com/rafael-fecha) made their first contribution in https://github.com/slackapi/bolt-js/pull/2029 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.17.0...@slack/bolt@3.17.1 + +[Changes][@slack/bolt@3.17.1] + + + +# [@slack/bolt@3.17.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.17.0) - 20 Dec 2023 + +## What's Changed + +* Support for `style.code` properties on rich text elements (updates `@slack/types` to 2.11 and `@slack/web-api` to 6.11) by [@filmaj](https://github.com/filmaj) in https://github.com/slackapi/bolt-js/pull/2017 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.16.0...@slack/bolt@3.17.0 + +[Changes][@slack/bolt@3.17.0] + + + +# [@slack/bolt@3.16.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.16.0) - 01 Dec 2023 + +## What's Changed + +### Enhancements 🎁 +* Close HTTP response on unhandled request timeout - Thank you [@suhailgupta03](https://github.com/suhailgupta03) in https://github.com/slackapi/bolt-js/pull/2007 +* Prevent sending response headers if already sent in default error han… - Thanks! [@suhailgupta03](https://github.com/suhailgupta03) in https://github.com/slackapi/bolt-js/pull/2006 + +### Maintainers +* Complete every matrix test regardless of adjacent failures - Thank you [@zimeg](https://github.com/zimeg) in https://github.com/slackapi/bolt-js/pull/2004 +* Bump @types/node from 20.9.0 to 20.9.2 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/2000 +* Bump @types/node from 20.9.2 to 20.10.0 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/2003 + +## New Contributors 👋 +* [@suhailgupta03](https://github.com/suhailgupta03) made their first contribution in https://github.com/slackapi/bolt-js/pull/2006 🎉 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.15.0...@slack/bolt@3.16.0 + +[Changes][@slack/bolt@3.16.0] + + + +# [@slack/bolt@3.15.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.15.0) - 15 Nov 2023 + +## What's Changed + +This minor release includes support for the new [File Input Block Kit Element](https://api.slack.com/reference/block-kit/block-elements#file_input), which allows for users to submit files using Block Kit. It also removes all traces of vulnerable versions of the `axios` dependency. + +### Enhancements + +* Add `file_input` block element payload support in TS by [@seratch](https://github.com/seratch) in https://github.com/slackapi/bolt-js/pull/1995 +* Add `rich_text_input` block element payload support in TS by [@seratch](https://github.com/seratch) in https://github.com/slackapi/bolt-js/pull/1963 +* Allow a custom `SocketModeReceiver` to be used with Socket Mode by [@zimeg](https://github.com/zimeg) in https://github.com/slackapi/bolt-js/pull/1972 +* Include an example of using middleware with the `ExpressReceiver` by [@zimeg](https://github.com/zimeg) in https://github.com/slackapi/bolt-js/pull/1973 + +### Bug Fixes + +* fix: options constraint has wrong type definition by [@nemanjastanic](https://github.com/nemanjastanic) in https://github.com/slackapi/bolt-js/pull/1940 + +### Dependencies + +* Bump @types/node from 20.6.2 to 20.9.0 +* Upgrade axios by [@wannfq](https://github.com/wannfq) in https://github.com/slackapi/bolt-js/pull/1986 +* Update mocha and web-api dependencies by [@filmaj](https://github.com/filmaj) in https://github.com/slackapi/bolt-js/pull/1994 + +### Other + +* Remove beta documentation by [@zimeg](https://github.com/zimeg) in https://github.com/slackapi/bolt-js/pull/1961 +* Fix link in docs by [@mkly](https://github.com/mkly) in https://github.com/slackapi/bolt-js/pull/1992 + +## New Contributors +* [@nemanjastanic](https://github.com/nemanjastanic) made their first contribution in https://github.com/slackapi/bolt-js/pull/1940 +* [@wannfq](https://github.com/wannfq) made their first contribution in https://github.com/slackapi/bolt-js/pull/1986 +* [@mkly](https://github.com/mkly) made their first contribution in https://github.com/slackapi/bolt-js/pull/1992 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.14.0...@slack/bolt@3.15.0 + +[Changes][@slack/bolt@3.15.0] + + + +# [@slack/bolt@3.14.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.14.0) - 21 Sep 2023 + +## What's Changed + +### Important Notice + +Since this version, we've dropped Node 16 support as [the version is EOLed on September 11th, 2023](https://nodejs.org/en/blog/announcements/nodejs16-eol). Please upgrade to a newer Node.js version from now on. + +### Enhancements + +* Add typings for timepicker by [@YussufElarif](https://github.com/YussufElarif) in https://github.com/slackapi/bolt-js/pull/1928 +* Upload code coverage reports using the Codecov GitHub Action by [@zimeg](https://github.com/zimeg) in https://github.com/slackapi/bolt-js/pull/1937 +* Expose useful functions by [@WilliamBergamin](https://github.com/WilliamBergamin) in https://github.com/slackapi/bolt-js/pull/1955 + +### Bug Fixes + +* Update ci-build.yml - add codecov upload token by [@srajiang](https://github.com/srajiang) in https://github.com/slackapi/bolt-js/pull/1952 + +### Dependencies + +* Bump @types/node from 20.4.5 to 20.4.8 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1922 +* Bump @types/node from 20.4.8 to 20.5.0 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1923 +* Bump @types/node from 20.5.0 to 20.5.1 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1929 +* Bump @types/node from 20.5.1 to 20.5.7 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1934 +* Bump @slack/logger from 3.0.0 to 4.0.0 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1935 +* Bump @types/node from 20.5.7 to 20.5.9 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1938 +* Bump @types/node from 20.5.9 to 20.6.0 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1945 +* Bump @types/node from 20.6.0 to 20.6.2 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1951 +* Release: @slack/bolt@3.14.0 by [@WilliamBergamin](https://github.com/WilliamBergamin) in https://github.com/slackapi/bolt-js/pull/1956 + + +## New Contributors +* [@YussufElarif](https://github.com/YussufElarif) made their first contribution in https://github.com/slackapi/bolt-js/pull/1928 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.3...@slack/bolt@3.14.0 + +[Changes][@slack/bolt@3.14.0] + + + +# [@slack/bolt@3.13.3](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.13.3) - 04 Aug 2023 + +## What's Changed +* Add missing user object member to type BlockAction by [@GovernmentHack](https://github.com/GovernmentHack) in https://github.com/slackapi/bolt-js/pull/1910 +* Fix socket mode exception when using node v20 by [@WilliamBergamin](https://github.com/WilliamBergamin) in https://github.com/slackapi/bolt-js/pull/1918 + +## New Contributors +* [@GovernmentHack](https://github.com/GovernmentHack) made their first contribution in https://github.com/slackapi/bolt-js/pull/1910 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.2...@slack/bolt@3.13.3 + +[Changes][@slack/bolt@3.13.3] + + + +# [@slack/bolt@3.13.2](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.13.2) - 13 Jul 2023 + +## What's Changed + +### Enhancements + +* Expose user ID in context in https://github.com/slackapi/bolt-js/pull/1853 – thanks [@gilmatok](https://github.com/gilmatok)! +* Move node version to devDependencies in https://github.com/slackapi/bolt-js/pull/1894 – thanks [@WilliamBergamin](https://github.com/WilliamBergamin)! + +### Bug fixes + +* Fix [#1819](https://github.com/slackapi/bolt-js/issues/1819) Add metadata to response_url params in https://github.com/slackapi/bolt-js/pull/1821 – thanks [@seratch](https://github.com/seratch)! +* Simplify reaction_added/removed event's item type in https://github.com/slackapi/bolt-js/pull/1845 – thanks [@seratch](https://github.com/seratch)! +* Fix [#1512](https://github.com/slackapi/bolt-js/issues/1512) Remove say from SlackShortcutMiddlewareArgs for GlobalShortcuts in https://github.com/slackapi/bolt-js/pull/1849 – thanks [@mlauter](https://github.com/mlauter)! +* Fix [#1889](https://github.com/slackapi/bolt-js/issues/1889) Add missing user type in TeamJoinEvent in https://github.com/slackapi/bolt-js/pull/1890 – thanks [@be320](https://github.com/be320)! + +### Documentation + +* Improve the docs for better TypeScript compatibility in https://github.com/slackapi/bolt-js/pull/1844 – thanks [@seratch](https://github.com/seratch)! +* Fixes [#1477](https://github.com/slackapi/bolt-js/issues/1477) Add customPropertiesExtractor to receiver options docs in https://github.com/slackapi/bolt-js/pull/1864 – thanks [@mlauter](https://github.com/mlauter)! + +### Dependencies + +* Bump @types/node from 18.16.0 to 18.16.3 in https://github.com/slackapi/bolt-js/pull/1822 – thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 18.16.3 to 20.1.0 in https://github.com/slackapi/bolt-js/pull/1829 – thanks [@dependabot](https://github.com/dependabot)! +* Add node version 20 to NodeJS testing strategy in https://github.com/slackapi/bolt-js/pull/1830 – thanks [@srajiang](https://github.com/srajiang)! +* Bump @types/node from 20.1.0 to 20.1.4 in https://github.com/slackapi/bolt-js/pull/1837 – thanks [@dependabot](https://github.com/dependabot)! +* Bump @slack/types version to ^2.8.0 in https://github.com/slackapi/bolt-js/pull/1838 – thanks [@zimeg](https://github.com/zimeg)! +* Bump @types/node from 20.1.4 to 20.2.3 in https://github.com/slackapi/bolt-js/pull/1850 – thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.2.3 to 20.2.5 in https://github.com/slackapi/bolt-js/pull/1858 – thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.2.5 to 20.3.0 in https://github.com/slackapi/bolt-js/pull/1868 – thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.3.0 to 20.3.1 in https://github.com/slackapi/bolt-js/pull/1874 – thanks [@dependabot](https://github.com/dependabot)! +* Bump @types/node from 20.3.1 to 20.4.1 in https://github.com/slackapi/bolt-js/pull/1893 – thanks [@dependabot](https://github.com/dependabot)! + +## New Contributors +* [@mlauter](https://github.com/mlauter) made their first contribution in https://github.com/slackapi/bolt-js/pull/1849 +* [@gilmatok](https://github.com/gilmatok) made their first contribution in https://github.com/slackapi/bolt-js/pull/1853 +* [@be320](https://github.com/be320) made their first contribution in https://github.com/slackapi/bolt-js/pull/1890 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.1...@slack/bolt@3.13.2 + +[Changes][@slack/bolt@3.13.2] + + + +# [@slack/bolt@3.13.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.13.1) - 28 Apr 2023 + +### Enhancements + +* Upgrade the OAuth module to the latest in https://github.com/slackapi/bolt-js/pull/1802 – thanks [@seratch](https://github.com/seratch)! + +### Bug fixes + +* Fix [#1805](https://github.com/slackapi/bolt-js/issues/1805) Include headers in the request object of custom route handlers in https://github.com/slackapi/bolt-js/pull/1806 – thanks [@e-zim](https://github.com/e-zim)! + +### Documentation + +* Add documentation for dynamic route parameters in custom routes in https://github.com/slackapi/bolt-js/pull/1791 – thanks [@e-zim](https://github.com/e-zim)! +* Add line numbers to docs in https://github.com/slackapi/bolt-js/pull/1797 – thanks [@WilliamBergamin](https://github.com/WilliamBergamin)! + +### Dependencies + +* Bump @types/node from 18.15.11 to 18.16.0 in https://github.com/slackapi/bolt-js/pull/1810 – thanks [@dependabot](https://github.com/dependabot)! + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.0...@slack/bolt@3.13.1 + +[Changes][@slack/bolt@3.13.1] + + + +# [@slack/bolt@3.13.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.13.0) - 04 Apr 2023 + +## What's Changed + +### Enhancements + +* Fix [#1718](https://github.com/slackapi/bolt-js/issues/1718) selected_date_time is missing in ViewStateValue interface by [@seratch](https://github.com/seratch) in https://github.com/slackapi/bolt-js/pull/1719 +* Fix [#1325](https://github.com/slackapi/bolt-js/issues/1325) Added support for dynamic custom paths by [@jeffbaldwinjr](https://github.com/jeffbaldwinjr) in https://github.com/slackapi/bolt-js/pull/1785 + +### Bug fixes + +* Fix [#1758](https://github.com/slackapi/bolt-js/issues/1758) Correct type definitions for `OptionGroups` and `*Options` types by [@zimeg](https://github.com/zimeg) in https://github.com/slackapi/bolt-js/pull/1790 + +### Tests + +* Test against node 18.x by [@machisuke](https://github.com/machisuke) in https://github.com/slackapi/bolt-js/pull/1792 + +### Documentation + +* Add in update to AWS Lambda guide to make ExpressReceiver config more clear by [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1649 +* Update Heroku guides with the new low-cost Eco Dyno plan by [@mwbrooks](https://github.com/mwbrooks) in https://github.com/slackapi/bolt-js/pull/1655 +* Reword migrate beta documentation by [@srajiang](https://github.com/srajiang) in https://github.com/slackapi/bolt-js/pull/1668 +* 📝 Improve doc: remove double quotes from hash key by [@yamashush](https://github.com/yamashush) in https://github.com/slackapi/bolt-js/pull/1685 +* 📄 Update Japanese OAuth docs by [@yamashush](https://github.com/yamashush) in https://github.com/slackapi/bolt-js/pull/1697 +* Add reference to Slack documentation on `block_actions` payload shape by [@srajiang](https://github.com/srajiang) in https://github.com/slackapi/bolt-js/pull/1700 +* Update outdated documents related on AWS Lambda by [@wormwlrm](https://github.com/wormwlrm) in https://github.com/slackapi/bolt-js/pull/1704 +* [next-gen docs] Update next-gen capitalization of terms and also trim down on the getting started guide by [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1709 +* Typo in docs -> future -> beta TOS link by [@funtaps](https://github.com/funtaps) in https://github.com/slackapi/bolt-js/pull/1716 +* Fix typo in japanese docs: concepts#logging by [@sotabkw](https://github.com/sotabkw) in https://github.com/slackapi/bolt-js/pull/1787 +* Remove legacy tag by [@WilliamBergamin](https://github.com/WilliamBergamin) in https://github.com/slackapi/bolt-js/pull/1796 + +### Dependencies + +* Bump @types/node from 18.11.8 to 18.11.9 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1650 +* Bump @types/node from 18.11.9 to 18.11.10 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1670 +* Bump @types/node from 18.11.10 to 18.11.13 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1680 +* 🔼 Update actions/checkout, actions/setup-node to v3 by [@yamashush](https://github.com/yamashush) in https://github.com/slackapi/bolt-js/pull/1686 +* Bump @types/node from 18.11.13 to 18.11.17 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1689 +* Bump @types/node from 18.11.17 to 18.11.18 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1705 +* Update @slack/oauth dependency to v2.6.0 by [@srajiang](https://github.com/srajiang) in https://github.com/slackapi/bolt-js/pull/1708 +* Bump @types/node from 18.11.18 to 18.11.19 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1734 +* Bump @types/node from 18.11.19 to 18.13.0 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1738 +* Bump @types/node from 18.13.0 to 18.14.0 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1745 +* Bump @types/node from 18.14.0 to 18.14.2 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1754 +* Bump @types/node from 18.14.2 to 18.14.6 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1757 +* Fix [#1780](https://github.com/slackapi/bolt-js/issues/1780) by upgrading axios version to the latest by [@SorsOps](https://github.com/SorsOps) in https://github.com/slackapi/bolt-js/pull/1781 +* Bump @types/node from 18.14.6 to 18.15.10 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1786 +* Bump @types/node from 18.15.10 to 18.15.11 by [@dependabot](https://github.com/dependabot) in https://github.com/slackapi/bolt-js/pull/1794 + +### Chores + +* Release: @slack/bolt@3.13.0 by [@zimeg](https://github.com/zimeg) in https://github.com/slackapi/bolt-js/pull/1795 + +## New Contributors + +* [@wormwlrm](https://github.com/wormwlrm) made their first contribution in https://github.com/slackapi/bolt-js/pull/1704 +* [@funtaps](https://github.com/funtaps) made their first contribution in https://github.com/slackapi/bolt-js/pull/1716 +* [@SorsOps](https://github.com/SorsOps) made their first contribution in https://github.com/slackapi/bolt-js/pull/1781 +* [@sotabkw](https://github.com/sotabkw) made their first contribution in https://github.com/slackapi/bolt-js/pull/1787 +* [@jeffbaldwinjr](https://github.com/jeffbaldwinjr) made their first contribution in https://github.com/slackapi/bolt-js/pull/1785 +* [@machisuke](https://github.com/machisuke) made their first contribution in https://github.com/slackapi/bolt-js/pull/1792 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.2...@slack/bolt@3.13.0 + +[Changes][@slack/bolt@3.13.0] + + + +# [@slack/bolt@4.0.0-nextGen.9](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@4.0.0-nextGen.9) - 11 Nov 2022 + +## What's Changed +* Added `block_suggestions` event support for Function Interactivity, thanks [@hello-ashleyintech](https://github.com/hello-ashleyintech) [@filmaj](https://github.com/filmaj)! https://github.com/slackapi/bolt-js/pull/1645 +* Add in update to AWS Lambda guide to make ExpressReceiver config more clear, thanls [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1649 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.2...@slack/bolt@4.0.0-nextGen.9 + +[Changes][@slack/bolt@4.0.0-nextGen.9] + + + +# [@slack/bolt@3.12.2](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.12.2) - 02 Nov 2022 + +## What's Changed +* Updated maintainers guide to add more clarity by [@WilliamBergamin](https://github.com/WilliamBergamin) in https://github.com/slackapi/bolt-js/pull/1519 +* Delete unnecessary character from doc by [@koh110](https://github.com/koh110) in https://github.com/slackapi/bolt-js/pull/1545 +* Update SocketModeFunctions.ts by [@rileyeaton](https://github.com/rileyeaton) in https://github.com/slackapi/bolt-js/pull/1553 +* Delete CHANGELOG.md by [@WilliamBergamin](https://github.com/WilliamBergamin) in https://github.com/slackapi/bolt-js/pull/1556 +* Fix misspellings / typos detected by WebStorm IDE by [@seratch](https://github.com/seratch) in https://github.com/slackapi/bolt-js/pull/1557 +* Fixed trivial typo by [@akmhmgc](https://github.com/akmhmgc) in https://github.com/slackapi/bolt-js/pull/1575 +* Set @types/node to set version 18.7.15 by [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1577 +* Add next-gen beta documentation by [@stevengill](https://github.com/stevengill) in https://github.com/slackapi/bolt-js/pull/1565 +* Bump .ruby-version from 2.7.1 to 2.7.4 by [@e-zim](https://github.com/e-zim) in https://github.com/slackapi/bolt-js/pull/1594 +* Add in information about custom HTTP routes to docs by [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1601 +* Fix node types by [@srajiang](https://github.com/srajiang) in https://github.com/slackapi/bolt-js/pull/1607 +* Update getting started guide, migrate create new app guide, and rearrange nav (next gen) by [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1603 +* Spelling by [@jsoref](https://github.com/jsoref) in https://github.com/slackapi/bolt-js/pull/1610 +* Add in Hello World example across docs by [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1608 +* Fix context.team_id for view interactions in a Slack Connect channel by [@WilliamBergamin](https://github.com/WilliamBergamin) in https://github.com/slackapi/bolt-js/pull/1615 +* Add deployment guide for Heroku by [@e-zim](https://github.com/e-zim) in https://github.com/slackapi/bolt-js/pull/1617 +* Publish @slack/bolt@3.12.2 by [@hello-ashleyintech](https://github.com/hello-ashleyintech) in https://github.com/slackapi/bolt-js/pull/1646 + +## New Contributors +* [@WilliamBergamin](https://github.com/WilliamBergamin) made their first contribution in https://github.com/slackapi/bolt-js/pull/1519 +* [@rileyeaton](https://github.com/rileyeaton) made their first contribution in https://github.com/slackapi/bolt-js/pull/1553 +* [@akmhmgc](https://github.com/akmhmgc) made their first contribution in https://github.com/slackapi/bolt-js/pull/1575 +* [@jsoref](https://github.com/jsoref) made their first contribution in https://github.com/slackapi/bolt-js/pull/1610 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.1...@slack/bolt@3.12.2 + +[Changes][@slack/bolt@3.12.2] + + + +# [@slack/bolt@4.0.0-nextGen.8](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@4.0.0-nextGen.8) - 14 Oct 2022 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0-nextGen.6...@slack/bolt@4.0.0-nextGen.8 + +[Changes][@slack/bolt@4.0.0-nextGen.8] + + + +# [@slack/bolt@4.0.0-nextGen.6](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@4.0.0-nextGen.6) - 14 Sep 2022 + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.1...@slack/bolt@4.0.0-nextGen.6 + +[Changes][@slack/bolt@4.0.0-nextGen.6] + + + +# [@slack/bolt@4.0.0-nextGen.3](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@4.0.0-nextGen.3) - 09 Sep 2022 + + +**Full Changelog**: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0-nextGen.2...@slack/bolt@4.0.0-nextGen.3 + +[Changes][@slack/bolt@4.0.0-nextGen.3] + + + +# [@slack/bolt@4.0.0-nextGen.2](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@4.0.0-nextGen.2) - 08 Sep 2022 + +## What's Changed (beta) +This beta release contains feature enhancements to Bolt JS for developers participating in the Slack Platform Beta 🚀 + +### **Compatible with the Slack CLI tool** + + Create a new app from a Github sample template + ```bash + $ slack create my-app -t slack-samples/bolt-js-starter-template -b future + ``` + Run your app for local development from the CLI. We take care of installation, tokens and starting the app in development mode. + ```bash + $ slack run + ``` +### Configure your app in code +Declare a `manifest.js` or `manifest.ts` file import handly utility functions and define any recomposable units contained such as `Functions`, `Workflows` and `Triggers`. +```bash +# my-app/manifest.js + +const { Manifest } = require('@slack/bolt'); +module.exports = Manifest({ + runOnSlack: false, + name: '', + displayName: '', + description: '', + botScopes: ['chat:write'], + socketModeEnabled: true, + workflows: [TimeOffWorkflow], + features: { + appHome: { + messagesTabEnabled: true, + messagesTabReadOnlyEnabled: true, + }, + }, + settings: { + interactivity: { + is_enabled: true, + }, + org_deploy_enabled: false, + }, +}); + +``` + +### **Compose Custom Function handling logic via a `SlackFunction`**. +Write a recomposable unit of logic: + + Example: + ```javascript + const myFunc = new SlackFunction('fn_callback_id', () => {}); + ``` + Attach optional handlers for `block_action` and `view` events related to your function. + + Example: + ```js + myFunc.action('action_id', () => {}) + .view('view_callback_id', () => {}); + ``` + +## Enhancements +* Bolt-JS projects containing a valid `slack.json` file in their project root are now Slack CLI compatible by [@srajiang](https://github.com/srajiang) +* Adds CLI hook implementations `get-manifest` `start` and `get-hooks` by [@srajiang](https://github.com/srajiang) +* Exports utility types and functions intended for `manifest.js` authoring by [@srajiang](https://github.com/srajiang) [@neptunel](https://github.com/neptunel) +* Adds SlackFunction and Function Localized Interactivity handling by [@srajiang](https://github.com/srajiang) in https://github.com/slackapi/bolt-js/pull/1567 + +### Full Changelog + https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.1...@slack/bolt@4.0.0-nextGen.2 + +[Changes][@slack/bolt@4.0.0-nextGen.2] + + + +# [@slack/bolt@3.12.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.12.1) - 26 Jul 2022 + +* Fix [#1509](https://github.com/slackapi/bolt-js/issues/1509) HTTPReceiver does not immediately respond to an invalid signature request (no response instead) (via [#1528](https://github.com/slackapi/bolt-js/issues/1528) ) - thanks [@seratch](https://github.com/seratch)! [@nirvparekh](https://github.com/nirvparekh)! +* Document improvements ([#1524](https://github.com/slackapi/bolt-js/issues/1524) [#1526](https://github.com/slackapi/bolt-js/issues/1526)) - thanks [@wongjas](https://github.com/wongjas)! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/28?closed=1 + +[Changes][@slack/bolt@3.12.1] + + + +# [@slack/bolt@3.12.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.12.0) - 14 Jul 2022 + +* Fix [#1507](https://github.com/slackapi/bolt-js/issues/1507) Add type support for `message_metadata_*` event types (via [#1508](https://github.com/slackapi/bolt-js/issues/1508)) - thanks [@dannyhostetler](https://github.com/dannyhostetler)! +* Allow passing additional types for Global and Middleware Context (via [#1505](https://github.com/slackapi/bolt-js/issues/1505)) - thanks [@M1kep](https://github.com/M1kep)! +* Fix [#1510](https://github.com/slackapi/bolt-js/issues/1510): Add `isEnterpriseInstall` to Context (via [#1511](https://github.com/slackapi/bolt-js/issues/1511)) - thanks [@rockingskier](https://github.com/rockingskier)! +* Fix [#1052](https://github.com/slackapi/bolt-js/issues/1052): Request verification failed: Failed to verify authenticity: stale (via [#1503](https://github.com/slackapi/bolt-js/issues/1503)) - thanks [@srajiang](https://github.com/srajiang)! +* Fixed receiver warning typo (via [#1492](https://github.com/slackapi/bolt-js/issues/1492)) - thanks [@nick-w-nick](https://github.com/nick-w-nick)! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/21?closed=1 + +[Changes][@slack/bolt@3.12.0] + + + +# [@slack/bolt@3.11.3](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.11.3) - 17 Jun 2022 + +* Fix [#1488](https://github.com/slackapi/bolt-js/issues/1488) Incorrect types with ViewUpdateResponseAction and ViewPushResponseAction (via [#1490](https://github.com/slackapi/bolt-js/issues/1490)) - thanks [@seratch](https://github.com/seratch) [@ducminh-phan](https://github.com/ducminh-phan)! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/26?closed=1 + +[Changes][@slack/bolt@3.11.3] + + + +# [@slack/bolt@3.11.2](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.11.2) - 14 Jun 2022 + +* Bug fixes: + * Fix [#1454](https://github.com/slackapi/bolt-js/issues/1454): Missing type declarations for HomeView (via [#1455](https://github.com/slackapi/bolt-js/issues/1455)) - thanks [@seratch](https://github.com/seratch)! + * TypeScript 4.7 compiler compatibility (via [#1466](https://github.com/slackapi/bolt-js/issues/1466)) - thanks [@seratch](https://github.com/seratch)! + * Fix [#1472](https://github.com/slackapi/bolt-js/issues/1472): `say` type incorrectly inferred as never when using `pin_added` or `reaction_*` events (via [#1473](https://github.com/slackapi/bolt-js/issues/1473) and [#1476](https://github.com/slackapi/bolt-js/issues/1476)) - thanks [@seratch](https://github.com/seratch)! + * Fix an action typo in the docs (via [#1475](https://github.com/slackapi/bolt-js/issues/1475)) - thanks [@BenAlderfer](https://github.com/BenAlderfer)! + * Add more logs for error patterns in AwsLambdaReceiver (via [#1481](https://github.com/slackapi/bolt-js/issues/1481)) - thanks [@seratch](https://github.com/seratch)! + * Fix [#1478](https://github.com/slackapi/bolt-js/issues/1478): `ack()` is not accessible in global middleware in TypeScript (via [#1482](https://github.com/slackapi/bolt-js/issues/1482)) - thanks [@seratch](https://github.com/seratch)! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/25?closed=1 + +[Changes][@slack/bolt@3.11.2] + + + +# [@slack/bolt@3.11.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.11.1) - 13 May 2022 + +* New features / improvements: + * Adding support for new user-change events with types (via [#1448](https://github.com/slackapi/bolt-js/issues/1448)) - thanks [@filmaj](https://github.com/filmaj) + * Slack prints failed with the error "operation_timeout" when slack command runs and finishes successfully in AWS Lambda (via [#1435](https://github.com/slackapi/bolt-js/issues/1435) [#1452](https://github.com/slackapi/bolt-js/issues/1452)) - thanks [@nicolls1](https://github.com/nicolls1) + * Upgrade socket-mode dependency to the latest minor (via [#1441](https://github.com/slackapi/bolt-js/issues/1441) ) - thanks [@seratch](https://github.com/seratch) ! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/24?closed=1 + +[Changes][@slack/bolt@3.11.1] + + + +# [@slack/bolt@3.11.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.11.0) - 30 Mar 2022 + +### 📣 Important Announcement + +Since this version, the default behavior of the OAuth flow has been changed for better security. The changes are: +* `InstallProvider` (The underlying OAuth module) verifies not only the query string but also its corresponding browser cookie data +* The default `StateStore` (`ClearStateStore`) makes sure that the state parameter is not too old (the default lifetime is 10 minutes) + +Refer to [#1335](https://github.com/slackapi/bolt-js/issues/1335) [#1391](https://github.com/slackapi/bolt-js/issues/1391) https://github.com/slackapi/node-slack-sdk/issues/1435 https://github.com/slackapi/node-slack-sdk/pull/1436 for the context. If you encounter behavior changes described at [#1412](https://github.com/slackapi/bolt-js/issues/1412), consider either changing your app code or setting `installerOptions.legacyStateVerification: true` for now. + +### 🎁 🐛 New features / improvements: + * [#1391](https://github.com/slackapi/bolt-js/issues/1391) Fix [#1335](https://github.com/slackapi/bolt-js/issues/1335) Proper use of state parameter for the OAuth CSRF protection - Thanks [@seratch](https://github.com/seratch) + * [#1405](https://github.com/slackapi/bolt-js/issues/1405) Fix [#1404](https://github.com/slackapi/bolt-js/issues/1404) SocketModeReceiver app process exits when any of its event listeners throws an exception - Thanks [@seratch](https://github.com/seratch) + * [#1359](https://github.com/slackapi/bolt-js/issues/1359) Fix [#1358](https://github.com/slackapi/bolt-js/issues/1358) Expose common utilities for building HTTP module based receivers - Thanks [@seratch](https://github.com/seratch) + * [#1406](https://github.com/slackapi/bolt-js/issues/1406) Add more error handlers to ExpressReceiver - Thanks [@seratch](https://github.com/seratch) [@Gregoor](https://github.com/Gregoor) + * [#1392](https://github.com/slackapi/bolt-js/issues/1392) Fix [#1385](https://github.com/slackapi/bolt-js/issues/1385) Create a signature validation function that is not tied to the request - Thanks [@seratch](https://github.com/seratch) [@danerwilliams](https://github.com/danerwilliams) + * [#1393](https://github.com/slackapi/bolt-js/issues/1393) Fix [#1376](https://github.com/slackapi/bolt-js/issues/1376) CustomRoute interface should be accessible from developers - Thanks [@seratch](https://github.com/seratch) + * [#1381](https://github.com/slackapi/bolt-js/issues/1381) Fix [#1380](https://github.com/slackapi/bolt-js/issues/1380) by adding more event payload types - Thanks [@seratch](https://github.com/seratch) [@aasiddiq](https://github.com/aasiddiq) + * [#1400](https://github.com/slackapi/bolt-js/issues/1400) Fix [#1397](https://github.com/slackapi/bolt-js/issues/1397) bolt-js does not accept ssl_check requests properly - Thanks [@seratch](https://github.com/seratch) + * [#1340](https://github.com/slackapi/bolt-js/issues/1340) Fix [#1334](https://github.com/slackapi/bolt-js/issues/1334) Export `EnvelopedEvent` interface to users - Thanks [@martin-cycle](https://github.com/martin-cycle) + * [#1366](https://github.com/slackapi/bolt-js/issues/1366) Fix [#1364](https://github.com/slackapi/bolt-js/issues/1364) Update axios to latest 0.26.1 - Thanks [@seratch](https://github.com/seratch) [@msrivastav13](https://github.com/msrivastav13) + * [#1369](https://github.com/slackapi/bolt-js/issues/1369) Fix [#1368](https://github.com/slackapi/bolt-js/issues/1368) Log `httpServer.close` error only when the `server` exists - Thanks [@sbcgua](https://github.com/sbcgua) + * [#1336](https://github.com/slackapi/bolt-js/issues/1336) [#1401](https://github.com/slackapi/bolt-js/issues/1401) [#1403](https://github.com/slackapi/bolt-js/issues/1403) [#1407](https://github.com/slackapi/bolt-js/issues/1407) Improve the SDK's test assets - Thanks [@seratch](https://github.com/seratch) [@filmaj](https://github.com/filmaj) + +### 📝 Document updates: + * [#1384](https://github.com/slackapi/bolt-js/issues/1384) Deploy the App to Heroku with one click - Thanks [@MaurizioBella](https://github.com/MaurizioBella) + +Here are [all the issues / pull requests](https://github.com/slackapi/bolt-js/milestone/18?closed=1) included in the release. + +[Changes][@slack/bolt@3.11.0] + + + +# [@slack/bolt@3.10.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.10.0) - 23 Feb 2022 + + 🎁 🐛 New features / improvements: + * Added an option to `deferInitialization` of App - [#248](https://github.com/slackapi/bolt-js/issues/248) [#1303](https://github.com/slackapi/bolt-js/issues/1303) - Thanks [@seratch](https://github.com/seratch) and [@SpencerKaiser](https://github.com/SpencerKaiser) + * We're now explicitly setting content-type on `HTTPReceiver` responses to `/slack/install` route - [#1279](https://github.com/slackapi/bolt-js/issues/1279) [#1280](https://github.com/slackapi/bolt-js/issues/1280) - Thanks [@filmaj](https://github.com/filmaj) + * Reduced unnecessary error throwing in case of `tokens_authorize` / `app_uninstalled` event [#674](https://github.com/slackapi/bolt-js/issues/674) [#1328](https://github.com/slackapi/bolt-js/issues/1328), - Thanks [@seratch](https://github.com/seratch) + * Updated `SlackEvent` union type to include `ChannelIDChangedEvent` - [#1302](https://github.com/slackapi/bolt-js/issues/1302) [#1301](https://github.com/slackapi/bolt-js/issues/1301) Thanks [@pmezard](https://github.com/pmezard) and [@srajiang](https://github.com/srajiang) + * Corrected typing for `UserChangeEvent.user.updated` attribute [#1320](https://github.com/slackapi/bolt-js/issues/1320) [#1322](https://github.com/slackapi/bolt-js/issues/1322) - Thanks [@seratch](https://github.com/seratch) and [@pmezard](https://github.com/pmezard) + * Removed redundant authorize code [#1231](https://github.com/slackapi/bolt-js/issues/1231) [#1327](https://github.com/slackapi/bolt-js/issues/1327) - Thanks [@seratch](https://github.com/seratch) and [@TEMHITHORPHE](https://github.com/TEMHITHORPHE) + * Corrected some pesky quotes [#1323](https://github.com/slackapi/bolt-js/issues/1323) - Thanks [@nicolls1](https://github.com/nicolls1) + +📝 Document updates: + * New documentation for `deferInitialization` [#1304](https://github.com/slackapi/bolt-js/issues/1304), [#1308](https://github.com/slackapi/bolt-js/issues/1308) - Thanks [@filmaj](https://github.com/filmaj), [@wongjas](https://github.com/wongjas), [@seratch](https://github.com/seratch)! + * Improved clarity and content of OAuth documentation [#1329](https://github.com/slackapi/bolt-js/issues/1329) [#1315](https://github.com/slackapi/bolt-js/issues/1315) [#1318](https://github.com/slackapi/bolt-js/issues/1318) - Thanks [@srajiang](https://github.com/srajiang), [@horeaporutiu](https://github.com/horeaporutiu) + * Added a 🇯🇵 translation for `userScopes` property - [#1295](https://github.com/slackapi/bolt-js/issues/1295) - Thanks [@wongjas](https://github.com/wongjas) + * Updated `respond` argument docs to include `views` listener [#1313](https://github.com/slackapi/bolt-js/issues/1313) - Thanks [@seratch](https://github.com/seratch) + +Here are [all the issues / pull requests](https://github.com/slackapi/bolt-js/milestone/17?closed=1) included in the release. + +[Changes][@slack/bolt@3.10.0] + + + +# [@slack/bolt@3.9.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.9.0) - 20 Jan 2022 + +* New features / improvements: + * Bump `@slack/web-api` dependency to at least v6.6.0 to address a security vulnerability in `axios` (via [#1276](https://github.com/slackapi/bolt-js/issues/1276)) - thanks [@filmaj](https://github.com/filmaj)! + * Bump `@slack/oauth` dependency to at least v2.4.0 to address major bugs (via [#1273](https://github.com/slackapi/bolt-js/issues/1273)) - thanks [@seratch](https://github.com/seratch)! + * Fix [#1256](https://github.com/slackapi/bolt-js/issues/1256): `$PORT` fails to bind on Heroku (via [#1210](https://github.com/slackapi/bolt-js/issues/1210)) - thanks [@filmaj](https://github.com/filmaj)! + * Add missing `Channel*MessageEvent` types (via [#1254](https://github.com/slackapi/bolt-js/issues/1254)) - thanks [@seratch](https://github.com/seratch)! + * Fix [#190](https://github.com/slackapi/bolt-js/issues/190): Context method `updateConversation` should accept expiration time (via [#1221](https://github.com/slackapi/bolt-js/issues/1221)) - thanks [@shubhamjajoo](https://github.com/shubhamjajoo)! + * Fix [#1206](https://github.com/slackapi/bolt-js/issues/1206): custom routes incorrectly match against full URL including querystring parameters (via [#1207](https://github.com/slackapi/bolt-js/issues/1207)) - thanks [@moustacheful](https://github.com/moustacheful)! +* Document updates: + * Improve App initialization error logs and Authenticating with OAuth document (via [#1250](https://github.com/slackapi/bolt-js/issues/1250)) - thanks [@srajiang](https://github.com/srajiang)! + * Fix [#795](https://github.com/slackapi/bolt-js/issues/795): improving documentation around serverless deployments to make more accessible (via [#1254](https://github.com/slackapi/bolt-js/issues/1254)) - thanks [@filmaj](https://github.com/filmaj)! + * Update anchors in the Japanese reference page (via [#1247](https://github.com/slackapi/bolt-js/issues/1247)) - thanks [@seratch](https://github.com/seratch)! + * Fix [#1237](https://github.com/slackapi/bolt-js/issues/1237): Use correct message subtype in Listening to Events documentation (via [#1240](https://github.com/slackapi/bolt-js/issues/1240)) - thanks [@wongjas](https://github.com/wongjas)! + * Fix [#1233](https://github.com/slackapi/bolt-js/issues/1233) and [#1216](https://github.com/slackapi/bolt-js/issues/1216): Remove redundant `state` information from the Listening to Modals documentation (via [#1236](https://github.com/slackapi/bolt-js/issues/1236)) - thanks [@wongjas](https://github.com/wongjas)! + * Fix [#1241](https://github.com/slackapi/bolt-js/issues/1241): Update examples to use the `logger` instead of `console.log` (via [#1242](https://github.com/slackapi/bolt-js/issues/1242)) - thanks [@wongjas](https://github.com/wongjas)! + * Cleanup Lambda example and docs around `processBeforeResponse` (via [#1229](https://github.com/slackapi/bolt-js/issues/1229)) - thanks [@ramblingenzyme](https://github.com/ramblingenzyme)! + * Fix [#1197](https://github.com/slackapi/bolt-js/issues/1197): Japanese version of documents around `extendedErrorHandler` (via [#1227](https://github.com/slackapi/bolt-js/issues/1227)) - thanks [@wongjas](https://github.com/wongjas)! + * Add documentation for socket mode and developer mode (via [#1218](https://github.com/slackapi/bolt-js/issues/1218)) - thanks [@TheManWhoStaresAtCode](https://github.com/TheManWhoStaresAtCode)! + * Fix [#1219](https://github.com/slackapi/bolt-js/issues/1219): Japanese version of additional socket mode and developer mode documentation (via [#1226](https://github.com/slackapi/bolt-js/issues/1226)) - thanks [@wongjas](https://github.com/wongjas)! + * Fix [#1010](https://github.com/slackapi/bolt-js/issues/1010): Add documentation for `view_closed` support (via [#1214](https://github.com/slackapi/bolt-js/issues/1214)) - thanks [@TheManWhoStaresAtCode](https://github.com/TheManWhoStaresAtCode)! + * Fix [#1200](https://github.com/slackapi/bolt-js/issues/1200): Remove references to passing a port to the `start` method when using socket mode (via [#1202](https://github.com/slackapi/bolt-js/issues/1202)) - thanks [@filmaj](https://github.com/filmaj)! +* Developer / maintainer-relevant changes: + * Added a GitHub action and bot to automatically mark issues and PRs as stale after extended periods of inactivity (via [#1213](https://github.com/slackapi/bolt-js/issues/1213), [#1225](https://github.com/slackapi/bolt-js/issues/1225)) - thanks [@srajiang](https://github.com/srajiang)! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/16?closed=1 + +[Changes][@slack/bolt@3.9.0] + + + +# [@slack/bolt@3.8.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.8.1) - 03 Nov 2021 + +* New features / improvements: + * Fix [#759](https://github.com/slackapi/bolt-js/issues/759) [#1109](https://github.com/slackapi/bolt-js/issues/1109) [#1110](https://github.com/slackapi/bolt-js/issues/1110) by adding custom properties in ReceiverEvent and Context objects ([#1177](https://github.com/slackapi/bolt-js/issues/1177)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#860](https://github.com/slackapi/bolt-js/issues/860) Enable developers to customize the built-in receivers more ([#1183](https://github.com/slackapi/bolt-js/issues/1183)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#1181](https://github.com/slackapi/bolt-js/issues/1181) Add port property to installerOptions in the HTTPReceiver ([#1184](https://github.com/slackapi/bolt-js/issues/1184)) - Thanks [@seratch](https://github.com/seratch) [@M1kep](https://github.com/M1kep)! + * Add port property to installerOptions in the HTTPReceiver ([#1181](https://github.com/slackapi/bolt-js/issues/1181)) - Thanks [@srajiang](https://github.com/srajiang)! + * Add context to global error handler ([#525](https://github.com/slackapi/bolt-js/issues/525)) - Thanks [@raycharius](https://github.com/raycharius)! + * Fix [#1098](https://github.com/slackapi/bolt-js/issues/1098) next() is optional in middleware in TypeScript ([#1099](https://github.com/slackapi/bolt-js/issues/1099)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#1148](https://github.com/slackapi/bolt-js/issues/1148) - Adjust the app.message listener interface in TypeScript to compile the examples in documents ([#1185](https://github.com/slackapi/bolt-js/issues/1185)) - Thanks [@M1kep](https://github.com/M1kep)! + * BlockAction interface does not include state despite state being present in actual object ([#1141](https://github.com/slackapi/bolt-js/issues/1141) [#1144](https://github.com/slackapi/bolt-js/issues/1144)) - Thanks [@seratch](https://github.com/seratch) [@Richard-PTT](https://github.com/Richard-PTT)! + * Add more information to unhandled incoming request logging ([#1143](https://github.com/slackapi/bolt-js/issues/1143)) - Thanks [@misscoded](https://github.com/misscoded)! + * Bump axios version to 0.21.2 or higher for better security ([#1162](https://github.com/slackapi/bolt-js/issues/1162)) - Thanks [@xmariopereira](https://github.com/xmariopereira)! + * Fix the v3.8.0 publish error ([#1194](https://github.com/slackapi/bolt-js/issues/1194)) - Thanks [@brianjychan](https://github.com/brianjychan) +* Document updates: + * Japanese document updates ([#1047](https://github.com/slackapi/bolt-js/issues/1047) [#1152](https://github.com/slackapi/bolt-js/issues/1152) [#1131](https://github.com/slackapi/bolt-js/issues/1131) [#1154](https://github.com/slackapi/bolt-js/issues/1154) [#1165](https://github.com/slackapi/bolt-js/issues/1165) [#1163](https://github.com/slackapi/bolt-js/issues/1163) [#1166](https://github.com/slackapi/bolt-js/issues/1166) [#1169](https://github.com/slackapi/bolt-js/issues/1169) [#1175](https://github.com/slackapi/bolt-js/issues/1175)) - Thanks [@wongjas](https://github.com/wongjas)! + * Fix the logging example so that it is valid JS ([#1172](https://github.com/slackapi/bolt-js/issues/1172) [#1174](https://github.com/slackapi/bolt-js/issues/1174)) - Thanks [@filmaj](https://github.com/filmaj)! + * Fix documentation about state verification option ([#1168](https://github.com/slackapi/bolt-js/issues/1168)) - Thanks [@stophecom](https://github.com/stophecom)! + * Fix call in AWS handler to match example (and be correct) ([#1190](https://github.com/slackapi/bolt-js/issues/1190)) - Thanks [@sirctseb](https://github.com/sirctseb)! + * using directMention() documentation doesn't seem to be correct in docs ([#1148](https://github.com/slackapi/bolt-js/issues/1148)) - Thanks [@O-Mutt](https://github.com/O-Mutt)! + * Clarify /slack/events path requirement ([#1153](https://github.com/slackapi/bolt-js/issues/1153)) - Thanks [@mars](https://github.com/mars)! + * Update Japanese docs to apply token rotation ([#1009](https://github.com/slackapi/bolt-js/issues/1009)) changes ([#1014](https://github.com/slackapi/bolt-js/issues/1014)) - Thanks [@misscoded](https://github.com/misscoded)! + * Update slugs in document pages ([#1161](https://github.com/slackapi/bolt-js/issues/1161)) - Thanks [@srajiang](https://github.com/srajiang)! + * Japanese document updates ([#1067](https://github.com/slackapi/bolt-js/issues/1067) [#1137](https://github.com/slackapi/bolt-js/issues/1137)) - Thanks [@seratch](https://github.com/seratch)! + * Minor updates related to [#1046](https://github.com/slackapi/bolt-js/issues/1046) ([#1047](https://github.com/slackapi/bolt-js/issues/1047)) - Thanks [@seratch](https://github.com/seratch)! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/15?closed=1 + +[Changes][@slack/bolt@3.8.1] + + + +# [@slack/bolt@3.8.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.8.0) - 03 Nov 2021 + +This version had a package file issue. Please use [v3.8.1](https://github.com/slackapi/bolt-js/releases/tag/%40slack%2Fbolt%403.8.1) or newer instead. + +[Changes][@slack/bolt@3.8.0] + + + +# [@slack/bolt@3.7.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.7.0) - 27 Sep 2021 + +Loads of updates and improvements this go-around with the help of feedback from the community 🎉 Many many thanks! + +* Support for custom HTTP routes ([#834](https://github.com/slackapi/bolt-js/issues/834), [#866](https://github.com/slackapi/bolt-js/issues/866), [#1114](https://github.com/slackapi/bolt-js/issues/1114)) - Thank you [@misscoded](https://github.com/misscoded) and [@johnboxall](https://github.com/johnboxall)! +* Added a stateVerification flag to support org-wide app install from admin pages! ([#1101](https://github.com/slackapi/bolt-js/issues/1101), [#1116](https://github.com/slackapi/bolt-js/issues/1116)) - Thank you [@srajiang](https://github.com/srajiang) and [@seratch](https://github.com/seratch)! +* Migrated fully to eslint ([#1024](https://github.com/slackapi/bolt-js/issues/1024), [#842](https://github.com/slackapi/bolt-js/issues/842), [#1089](https://github.com/slackapi/bolt-js/issues/1089), [#1091](https://github.com/slackapi/bolt-js/issues/1091) ) - Dzięki [@filmaj](https://github.com/filmaj) and [@srajiang](https://github.com/srajiang) and [@seratch](https://github.com/seratch)! +* Option to use custom Express app / router via ExpressReceiver ([#1084](https://github.com/slackapi/bolt-js/issues/1084), [#868](https://github.com/slackapi/bolt-js/issues/868)) - Muito obrigado [@seratch](https://github.com/seratch)! +* Added an option to disable signature verification for use during testing ([#648](https://github.com/slackapi/bolt-js/issues/648), [#1088](https://github.com/slackapi/bolt-js/issues/1088)) - Dankeschön [@seratch](https://github.com/seratch) and [@meetmangukiya](https://github.com/meetmangukiya)! +* Enabled developers to disable and customize installation pages ([#982](https://github.com/slackapi/bolt-js/issues/982), [#1083](https://github.com/slackapi/bolt-js/issues/1083), [#977](https://github.com/slackapi/bolt-js/issues/977) , [#1079](https://github.com/slackapi/bolt-js/issues/1079)) - 谢谢 [@seratch](https://github.com/seratch)! +* Enabled using Bolt JS without passing a botId ([#874](https://github.com/slackapi/bolt-js/issues/874), [#1087](https://github.com/slackapi/bolt-js/issues/1087)) - Thanks [@misscoded](https://github.com/misscoded)! +* Custom redirect URI options are now properly being sent as part of standard install request params ([#1115](https://github.com/slackapi/bolt-js/issues/1115), [#1116](https://github.com/slackapi/bolt-js/issues/1116)) - Hvala [@srajiang](https://github.com/srajiang)! +* Improved handling for event authorization errors ([#859](https://github.com/slackapi/bolt-js/issues/859), [#364](https://github.com/slackapi/bolt-js/issues/364) [#891](https://github.com/slackapi/bolt-js/issues/891)) - Bedankt [@seratch](https://github.com/seratch), [@zachsirotto](https://github.com/zachsirotto) and [@broom9](https://github.com/broom9)! +* Better App initialization experience when SocketMode and Receiver options are both supplied ([#1068](https://github.com/slackapi/bolt-js/issues/1068), [#1077](https://github.com/slackapi/bolt-js/issues/1077)) - شكرًا [@seratch](https://github.com/seratch)! +* Improved logger initialization experience ([#1040](https://github.com/slackapi/bolt-js/issues/1040), [#1078](https://github.com/slackapi/bolt-js/issues/1078), [#1027](https://github.com/slackapi/bolt-js/issues/1027)) - Mahalo [@tamaritamari](https://github.com/tamaritamari), [@seratch](https://github.com/seratch), and [@dominics](https://github.com/dominics) +* Docs improvements and other corrections! ([#1130](https://github.com/slackapi/bolt-js/issues/1130), [#1129](https://github.com/slackapi/bolt-js/issues/1129), [#1082](https://github.com/slackapi/bolt-js/issues/1082), [#1071](https://github.com/slackapi/bolt-js/issues/1071), [#1097](https://github.com/slackapi/bolt-js/issues/1097), [#1095](https://github.com/slackapi/bolt-js/issues/1095)) - 감사합니다 [@risto24](https://github.com/risto24), [@srajiang](https://github.com/srajiang), [@seratch](https://github.com/seratch), [@stevengill](https://github.com/stevengill))! + +[Changes][@slack/bolt@3.7.0] + + + +# [@slack/bolt@3.6.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.6.0) - 19 Aug 2021 + +* Added Slack Connect Events ([#999](https://github.com/slackapi/bolt-js/issues/999), [#1008](https://github.com/slackapi/bolt-js/issues/1008)) - Thanks [@srajiang](https://github.com/srajiang) +* Made App start() account for AWSLambdaReceiver return type ([#1038](https://github.com/slackapi/bolt-js/issues/1038), [#1039](https://github.com/slackapi/bolt-js/issues/1039)) - Thanks [@seratch](https://github.com/seratch) +* Added tests for SocketModeReciver ([#750](https://github.com/slackapi/bolt-js/issues/750), [#1021](https://github.com/slackapi/bolt-js/issues/1021)) - Thanks [@filmaj](https://github.com/filmaj) +* Docs, docs, docs and example app improvements! ([#1062](https://github.com/slackapi/bolt-js/issues/1062), [#1066](https://github.com/slackapi/bolt-js/issues/1066), [#1067](https://github.com/slackapi/bolt-js/issues/1067), [#1059](https://github.com/slackapi/bolt-js/issues/1059) , [#1046](https://github.com/slackapi/bolt-js/issues/1046), [#1056](https://github.com/slackapi/bolt-js/issues/1056), [#1048](https://github.com/slackapi/bolt-js/issues/1048), [#1039](https://github.com/slackapi/bolt-js/issues/1039), [#1023](https://github.com/slackapi/bolt-js/issues/1023), [#939](https://github.com/slackapi/bolt-js/issues/939), [#1021](https://github.com/slackapi/bolt-js/issues/1021), [#1033](https://github.com/slackapi/bolt-js/issues/1033)) - Thanks [@sisisin](https://github.com/sisisin), [@hariNEzuMI928](https://github.com/hariNEzuMI928), [@RhnSharma](https://github.com/RhnSharma) and [@stevengill](https://github.com/stevengill), [@seratch](https://github.com/seratch), [@filmaj](https://github.com/filmaj), [@srajiang](https://github.com/srajiang) + + +[Changes][@slack/bolt@3.6.0] + + + +# [@slack/bolt@3.6.0-hermesBeta.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.6.0-hermesBeta.1) - 20 Aug 2021 + +* Contains bumped version of @slack/web-api for hermesBeta + +[Changes][@slack/bolt@3.6.0-hermesBeta.1] + + + +# [@slack/bolt@3.5.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.5.0) - 15 Jul 2021 + +- Added support for `FileInstallationStore` ([#941](https://github.com/slackapi/bolt-js/issues/941), [#1003](https://github.com/slackapi/bolt-js/issues/1003)) - Thanks, [@misscoded](https://github.com/misscoded)! +- Fix to existing code snippet around acknowledging events ([#997](https://github.com/slackapi/bolt-js/issues/997)) - Thanks, [@Zimboboys](https://github.com/Zimboboys)! +- Brought Socket Mode to the forefront of the Getting Started docs ([#990](https://github.com/slackapi/bolt-js/issues/990)) - Thanks, [@srajiang](https://github.com/srajiang)! +- Documentation updates and improvements ([#989](https://github.com/slackapi/bolt-js/issues/989), [#1002](https://github.com/slackapi/bolt-js/issues/1002)) - Thanks, [@srajiang](https://github.com/srajiang) and [@misscoded](https://github.com/misscoded)! + +[Changes][@slack/bolt@3.5.0] + + + +# [@slack/bolt@3.4.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.4.1) - 05 Jul 2021 + +* Updated default `axios` options to include `proxy:false` to match @slack/web-api package ([#979](https://github.com/slackapi/bolt-js/issues/979)) - thanks [@stevengill](https://github.com/stevengill) +* Fixed `AwsLambdaReceiver` failing to parse `event.body` if `isBase64Encoded` is `true` ([#971](https://github.com/slackapi/bolt-js/issues/971), [#972](https://github.com/slackapi/bolt-js/issues/972)) - thanks [@TheManWhoStaresAtCode](https://github.com/TheManWhoStaresAtCode) +* Added `edited` property to `app_mention` event payload ([#960](https://github.com/slackapi/bolt-js/issues/960), [#961](https://github.com/slackapi/bolt-js/issues/961)) - thanks [@seratch](https://github.com/seratch) and [@hi-se](https://github.com/hi-se) +* Added a new deploy-aws-lambda project to the [examples directory](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda) ([#815](https://github.com/slackapi/bolt-js/issues/815), [#940](https://github.com/slackapi/bolt-js/issues/940)) - thanks [@TheManWhoStaresAtCode](https://github.com/TheManWhoStaresAtCode) +* Use Kanji for Japanese documents ([#983](https://github.com/slackapi/bolt-js/issues/983)) - thanks [@disneyresidents](https://github.com/disneyresidents) + +[Changes][@slack/bolt@3.4.1] + + + +# [@slack/bolt@3.4.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.4.0) - 04 Jun 2021 + +Many improvements (thanks to the awesome contributors!) are included in this release :tada: + +* Key improvements / bug fixes: + * Allow command handlers to match regexes ([#846](https://github.com/slackapi/bolt-js/issues/846)) - Thanks [@itowlson](https://github.com/itowlson)! + * Fix [#947](https://github.com/slackapi/bolt-js/issues/947) Enable to use app.client with passed token for single workspace apps ([#948](https://github.com/slackapi/bolt-js/issues/948)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#935](https://github.com/slackapi/bolt-js/issues/935) enterprise_id in InstallationQuery can be invalid for Slack Connect channel events ([#949](https://github.com/slackapi/bolt-js/issues/949)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#951](https://github.com/slackapi/bolt-js/issues/951) TypeScript 4.3 typing for KnownKeys\ ([#953](https://github.com/slackapi/bolt-js/issues/953)) - Thanks [@lokshunhung](https://github.com/lokshunhung)! + * Fix [#629](https://github.com/slackapi/bolt-js/issues/629) confusing debug log by ConversationStore ([#827](https://github.com/slackapi/bolt-js/issues/827)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#496](https://github.com/slackapi/bolt-js/issues/496) Add clientOptions.logger option (and improvements to other attributes too) ([#856](https://github.com/slackapi/bolt-js/issues/856)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#757](https://github.com/slackapi/bolt-js/issues/757) Add event type name validation & channel_type filter middleware ([#857](https://github.com/slackapi/bolt-js/issues/857)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#718](https://github.com/slackapi/bolt-js/issues/718) add tokenVerificationEnabled flag to App constructor ([#863](https://github.com/slackapi/bolt-js/issues/863)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#534](https://github.com/slackapi/bolt-js/issues/534) respond support in view_submission listeners ([#889](https://github.com/slackapi/bolt-js/issues/889)) - Thanks [@seratch](https://github.com/seratch)! + * Add async support of signingSecret to ExpressReceiver ([#877](https://github.com/slackapi/bolt-js/issues/877)) - Thanks [@gmathieu](https://github.com/gmathieu)! + * AwsLambdaReveiver: Ignore casing of HTTP headers as requested by RFC ([#938](https://github.com/slackapi/bolt-js/issues/938)) - Thanks [@TheManWhoStaresAtCode](https://github.com/TheManWhoStaresAtCode)! +* Improvements / bugfixes for better TypeScript supports: + * Fix [#926](https://github.com/slackapi/bolt-js/issues/926) by adding more subtype ones to message event types ([#928](https://github.com/slackapi/bolt-js/issues/928)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#925](https://github.com/slackapi/bolt-js/issues/925) by adding optional properties to CodedError interface ([#927](https://github.com/slackapi/bolt-js/issues/927)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#897](https://github.com/slackapi/bolt-js/issues/897) Add built-in fields to Context object type ([#902](https://github.com/slackapi/bolt-js/issues/902)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#894](https://github.com/slackapi/bolt-js/issues/894) Unable to build options request objects in TypeScript ([#900](https://github.com/slackapi/bolt-js/issues/900)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#720](https://github.com/slackapi/bolt-js/issues/720) ack(options) does not compile in TypeScript ([#878](https://github.com/slackapi/bolt-js/issues/878)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#497](https://github.com/slackapi/bolt-js/issues/497) Add types of state.values on modal submission ([#879](https://github.com/slackapi/bolt-js/issues/879)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#911](https://github.com/slackapi/bolt-js/issues/911) TypeScript error when using builtin onlyViewActions middleware ([#912](https://github.com/slackapi/bolt-js/issues/912)) - Thanks [@seratch](https://github.com/seratch)! + * Add blocks / attachments to app_mention event interface ([#906](https://github.com/slackapi/bolt-js/issues/906)) - Thanks [@seratch](https://github.com/seratch)! + * Add missing message events & more type tests ([#832](https://github.com/slackapi/bolt-js/issues/832)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#956](https://github.com/slackapi/bolt-js/issues/956) Add bot_id / bot_profile to GenericMessageEvent ([#957](https://github.com/slackapi/bolt-js/issues/957)) - Thanks [@seratch](https://github.com/seratch)! + * Fix a few array field definition errors in TypeScript ([#873](https://github.com/slackapi/bolt-js/issues/873)) - Thanks [@seratch](https://github.com/seratch)! + * Make API response types more specific utilizing the types in web-api 6.2 ([#915](https://github.com/slackapi/bolt-js/issues/915)) - Thanks [@seratch](https://github.com/seratch)! + * Add is_bot_user_member to link_shared event ([#946](https://github.com/slackapi/bolt-js/issues/946)) - Thanks [@rbrishabh](https://github.com/rbrishabh)! + * Fix WorkflowStep StepUpdateArguments property types ([#830](https://github.com/slackapi/bolt-js/issues/830)) - Thanks [@k725](https://github.com/k725)! + * Add the type for plain_text_input action elements ([#706](https://github.com/slackapi/bolt-js/issues/706)) - Thanks [@br-tim-ray](https://github.com/br-tim-ray)! + * Updated ReactionRemovedEvent type ([#918](https://github.com/slackapi/bolt-js/issues/918)) - Thanks [@rr-codes](https://github.com/rr-codes)! + * Export options types and interfaces ([#872](https://github.com/slackapi/bolt-js/issues/872)) - Thanks [@trevor-gullstad](https://github.com/trevor-gullstad)! + * Add trigger_id to ViewSubmitAction interface ([#828](https://github.com/slackapi/bolt-js/issues/828)) - Thanks [@misscoded](https://github.com/misscoded)! +* Lots of documentation improvements: + * Fix a typo in Japanese documents ([#916](https://github.com/slackapi/bolt-js/issues/916)) - Thanks [@p-chan](https://github.com/p-chan)! + * Small clarification constraint reference ([#844](https://github.com/slackapi/bolt-js/issues/844)) - Thanks [@shaydewael](https://github.com/shaydewael)! + * Add TypeScript Getting Started equivalent ([#845](https://github.com/slackapi/bolt-js/issues/845)) - Thanks [@shaydewael](https://github.com/shaydewael)! + * Add JA-JP reference ([#851](https://github.com/slackapi/bolt-js/issues/851)) - Thanks [@shaydewael](https://github.com/shaydewael)! + * Update the default receiver in the reference document ([#835](https://github.com/slackapi/bolt-js/issues/835)) - Thanks [@seratch](https://github.com/seratch)! + * Update the description about processBeforeResponse in Reference document ([#836](https://github.com/slackapi/bolt-js/issues/836)) - Thanks [@seratch](https://github.com/seratch)! + * Fix [#632](https://github.com/slackapi/bolt-js/issues/632) Add Japanese version of PR [#626](https://github.com/slackapi/bolt-js/issues/626) (App Home document) ([#852](https://github.com/slackapi/bolt-js/issues/852)) - Thanks [@seratch](https://github.com/seratch)! + +Here is the list of all the issues / pull requests included in the release: https://github.com/slackapi/bolt-js/milestone/8?closed=1 + +[Changes][@slack/bolt@3.4.0] + + + +# [@slack/bolt@3.3.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.3.0) - 09 Mar 2021 + +- Add regex support to events handler ([#284](https://github.com/slackapi/bolt-js/issues/284) [#763](https://github.com/slackapi/bolt-js/issues/763)) - Thanks [@pdontha](https://github.com/pdontha)! +- Fix typo in `SocketModeReceiver` logging sentence ([#807](https://github.com/slackapi/bolt-js/issues/807)) - Thanks [@KhushrajRathod](https://github.com/KhushrajRathod)! +- Refactor built-in receivers to be a little more DRY ([#810](https://github.com/slackapi/bolt-js/issues/810)) - Thanks [@seratch](https://github.com/seratch)! +- Add built-in `AwsLambdaReceiver` ([#784](https://github.com/slackapi/bolt-js/issues/784) [#785](https://github.com/slackapi/bolt-js/issues/785)) - Thanks [@seratch](https://github.com/seratch)! +- Simplify `app.start()` for Socket Mode by allowing extra arguments to be optional ([#823](https://github.com/slackapi/bolt-js/issues/823)) - Thanks [@KhushrajRathod](https://github.com/KhushrajRathod) +- Lots of documentation improvements! + - Fix `event.user` to correctly reference user ID ([#790](https://github.com/slackapi/bolt-js/issues/790)) - Thanks [@mwbrooks](https://github.com/mwbrooks) + - Add Japanese translation for AWS Lambda Deployment Guide ([#798](https://github.com/slackapi/bolt-js/issues/798)) - Thanks [@seratch](https://github.com/seratch) [@shay](https://github.com/shay) + - Update AWS Lambda Deployment guide to use `@vendia/serverless-express` ([#799](https://github.com/slackapi/bolt-js/issues/799) [#800](https://github.com/slackapi/bolt-js/issues/800) [#804](https://github.com/slackapi/bolt-js/issues/804) [#806](https://github.com/slackapi/bolt-js/issues/806)) - Thanks [@januswel](https://github.com/januswel) [@avery100](https://github.com/avery100) [@mwbrooks](https://github.com/mwbrooks) + - Clarify that OAuth is not supported by custom receivers ([#711](https://github.com/slackapi/bolt-js/issues/711)) - Thanks [@mwbrooks](https://github.com/mwbrooks) + +[Changes][@slack/bolt@3.3.0] + + + +# [@slack/bolt@3.2.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.2.0) - 10 Feb 2021 + +* Added new `channel_id_changed` event ([#779](https://github.com/slackapi/bolt-js/issues/779), [#783](https://github.com/slackapi/bolt-js/issues/783)) - thanks [@stevengill](https://github.com/stevengill) +* Added missing properties on Message Types ([#774](https://github.com/slackapi/bolt-js/issues/774), [#782](https://github.com/slackapi/bolt-js/issues/782)) - thanks [@shaydewael](https://github.com/shaydewael), [@sunakane](https://github.com/sunakane) +* Fixed inconsistencies with OAuth docs ([#777](https://github.com/slackapi/bolt-js/issues/777)) - thanks [@misscoded](https://github.com/misscoded) +* Export Reaction interfaces ([#765](https://github.com/slackapi/bolt-js/issues/765), [#776](https://github.com/slackapi/bolt-js/issues/776)) - thanks [@KhushrajRathod](https://github.com/KhushrajRathod), [@feliperyan](https://github.com/feliperyan) + +[Changes][@slack/bolt@3.2.0] + + + +# [@slack/bolt@3.1.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.1.1) - 27 Jan 2021 + +Updated `@slack/socket-mode` dependency to use a range (`^1.0.0`) instead of a specific version - thanks [@stevengill](https://github.com/stevengill) + +[Changes][@slack/bolt@3.1.1] + + + +# [@slack/bolt@3.1.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.1.0) - 26 Jan 2021 + +* Added Four New Workflow / Workflow Step Event Interfaces ([#767](https://github.com/slackapi/bolt-js/issues/767), [#768](https://github.com/slackapi/bolt-js/issues/768)) - thanks [@misscoded](https://github.com/misscoded) +* Fixed node-slack-sdk issue [1156](https://github.com/slackapi/node-slack-sdk/issues/1156) where Socket Mode error was not bubbling up ([#764](https://github.com/slackapi/bolt-js/issues/764)) - thanks [@stevengill](https://github.com/stevengill) +* Added a localized Japanese Heroku deployment guide ([#762](https://github.com/slackapi/bolt-js/issues/762)) - thanks [@seratch](https://github.com/seratch), [@shaydewael](https://github.com/shaydewael) + +[Changes][@slack/bolt@3.1.0] + + + +# [@slack/bolt@3.0.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@3.0.0) - 13 Jan 2021 + + +## Breaking changes +- Updated minimum Nodejs version to 12.13.0, updated minimum TypeScript version to 4.1 ([#727](https://github.com/slackapi/bolt-js/issues/727), [#728](https://github.com/slackapi/bolt-js/issues/728)) - thanks [@stevengill](https://github.com/stevengill) +- Removed `orgAuthorize` option when initializing `App`. If you used this option previously, you must use `authorize` instead for both single workspace installs and [org wide app installs](https://api.slack.com/enterprise/apps). See the [migration guide](https://slack.dev/bolt-js/tutorial/migration-v3) to learn more! ([#730](https://github.com/slackapi/bolt-js/issues/730)) - thanks [@stevengill](https://github.com/stevengill) +- The built-in OAuth with [Org wide app installs](https://api.slack.com/enterprise/apps) no longer uses `InstallationStore.fetchOrgInstallation()` or `InstallationStore.storeOrgInstallation()`. If you used these previously, you must use `InstallationStore.fetchInstallation()` and `InstallationStore.storeInstallation()` instead. See the [migration guide](https://slack.dev/bolt-js/tutorial/migration-v3) to learn more! ([#730](https://github.com/slackapi/bolt-js/issues/730)) - thanks [@stevengill](https://github.com/stevengill) + +## New Features +- Bolt for JavaScript now supports Socket Mode! When initializing an `App`, use the `socketMode: true` option to choose connecting to Slack without an HTTP server (:wave: goodbye managing ngrok). In order to use Socket Mode, you must first enable it for your app’s configuration (https://api.slack.com/apps → Your App → Socket Mode). + - This is implemented using the new `SocketModeReceiver` class. This receiver allows your app to receive events from Slack over a WebSocket connection. + - To learn more about Socket Mode, checkout the release blog post and [Bolt for JavaScript docs](https://slack.dev/bolt-js/concepts#socket-mode) and [example](https://github.com/slackapi/bolt-js/tree/main/examples/socket-mode) + - Implemented in [#630](https://github.com/slackapi/bolt-js/issues/630) - thanks [@stevengill](https://github.com/stevengill), [@aoberoi](https://github.com/aoberoi), [@seratch](https://github.com/seratch), [@shaydewael](https://github.com/shaydewael), [@mwbrooks](https://github.com/mwbrooks) +- Added a new Developer Mode. When initializing an `App`, conditionally check for when you’re not in production (e.g. `process.NODE_ENV !==` `'``production``'` ) to set `developerMode:` ```true`. Developer Mode currently enables debug logging, enables SocketMode, adds a custom failure handler for OAuth, and outputs the body of every incoming request. ([#714](https://github.com/slackapi/bolt-js/issues/714), [#742](https://github.com/slackapi/bolt-js/issues/742)) - thanks [@stevengill](https://github.com/stevengill) +- `HTTPReceiver` is the new default receiver for `App`. This will allow Bolt for JavaScript apps to more easily work with other popular web frameworks (Hapi.js, Koa, etc). ([#670](https://github.com/slackapi/bolt-js/issues/670), [#753](https://github.com/slackapi/bolt-js/issues/753)) - thanks [@aoberoi](https://github.com/aoberoi) + - `ExpressReceiver` is still available to use for those of you that have usecases which aren’t covered by `HTTPReceiver`. + - This new receiver does not allow you to add custom routes, but instead allows you to access its `requestListener` property to selectively send it requests. This property follows the exact function signature as the first argument to Node’s built-in `http.createServer()`, so it’s very flexible. It will throw an `HTTPReceiverDeferredRequestError`, with a `req` and `res` property if it was not able to handle a given request. +- Added support for starting an HTTPS server with `app.start()` . This method now takes TLS options as its second parameter (after the port). The simplest example of starting an HTTP server is `app.start(3000, { key: MY_TLS_KEY, cert: MY_TLS_CERT })`. ([#234](https://github.com/slackapi/bolt-js/issues/234), [#658](https://github.com/slackapi/bolt-js/issues/658)) - thanks [@aoberoi](https://github.com/aoberoi) + +[Changes][@slack/bolt@3.0.0] + + + +# [@slack/bolt@2.7.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.7.0) - 12 Jan 2021 + +* Fix regression in `is_enterprise_install` check for slash commands ([#737](https://github.com/slackapi/bolt-js/issues/737), [#738](https://github.com/slackapi/bolt-js/issues/738)) - thanks [@mattcasey](https://github.com/mattcasey) +* Added missing properties to `AppMentionInterface` ([#735](https://github.com/slackapi/bolt-js/issues/735), [#739](https://github.com/slackapi/bolt-js/issues/739)) - thanks [@misscoded](https://github.com/misscoded), [@BenAlderfer](https://github.com/BenAlderfer) +* Add `channel` and other missing properties to all `MessageEvent` interfaces ([#736](https://github.com/slackapi/bolt-js/issues/736), [#740](https://github.com/slackapi/bolt-js/issues/740)) - thanks [@misscoded](https://github.com/misscoded), [@BenAlderfer](https://github.com/BenAlderfer) + +[Changes][@slack/bolt@2.7.0] + + + +# [@slack/bolt@2.6.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.6.0) - 05 Jan 2021 + +* Fixed security vulnerability with `axios` dependency ([#721](https://github.com/slackapi/bolt-js/issues/721), [#722](https://github.com/slackapi/bolt-js/issues/722)) - Thanks [@brendan-miller-snyk](https://github.com/brendan-miller-snyk) +* Added reference docs to [documentation site](https://slack.dev/bolt-js/reference) ([#712](https://github.com/slackapi/bolt-js/issues/712)) - Thanks [@shaydewael](https://github.com/shaydewael) +* Added [deploying to AWS Lambda guide](https://slack.dev/bolt-js/deployments/aws-lambda) ([#698](https://github.com/slackapi/bolt-js/issues/698)) - Thanks [@mwbrooks](https://github.com/mwbrooks) +* Improved types for message events and all subtypes. ([#709](https://github.com/slackapi/bolt-js/issues/709), [#311](https://github.com/slackapi/bolt-js/issues/311)) - Thanks [@aoberoi](https://github.com/aoberoi) +* Moved CI over to GitHub Actions ([#704](https://github.com/slackapi/bolt-js/issues/704)) - Thanks [@stevengill](https://github.com/stevengill) + +[Changes][@slack/bolt@2.6.0] + + + +# [@slack/bolt@2.5.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.5.0) - 01 Dec 2020 + +* Added support for [org wide app installations](https://api.slack.com/enterprise/apps). If you are using the [built-in OAuth support](https://slack.dev/bolt-js/concepts#authenticating-oauth), make sure to update your `InstallationStore` by adding `saveOrgInstall` and `fetchOrgInstall` methods. ([#521](https://github.com/slackapi/bolt-js/issues/521)) - thanks [@stevengill](https://github.com/stevengill), [@aoberoi](https://github.com/aoberoi) +* added support for `Authorizations` in event api payloads which are replacing `authed_users` and `authed_teams` ([#655](https://github.com/slackapi/bolt-js/issues/655), [#656](https://github.com/slackapi/bolt-js/issues/656)) - thanks [@stevengill](https://github.com/stevengill) +* Added [heroku deployment guide](https://slack.dev/bolt-js/deployments/heroku) ([#220](https://github.com/slackapi/bolt-js/issues/220), [#651](https://github.com/slackapi/bolt-js/issues/651)) - thanks [@mwbrooks](https://github.com/mwbrooks) +* Docs fixes ([#641](https://github.com/slackapi/bolt-js/issues/641), [#665](https://github.com/slackapi/bolt-js/issues/665), [#667](https://github.com/slackapi/bolt-js/issues/667), [#668](https://github.com/slackapi/bolt-js/issues/668), [#683](https://github.com/slackapi/bolt-js/issues/683), [#686](https://github.com/slackapi/bolt-js/issues/686), [#693](https://github.com/slackapi/bolt-js/issues/693) ) - thanks [@shaydewael](https://github.com/shaydewael), [@misscoded](https://github.com/misscoded), [@mwbrooks](https://github.com/mwbrooks), [@seratch](https://github.com/seratch), [@stevengill](https://github.com/stevengill) +* Updated hubot example to work with bolt for Javascript v2.0+ ([#676](https://github.com/slackapi/bolt-js/issues/676)) - thanks [@nicholas-a-clark](https://github.com/nicholas-a-clark) + + +[Changes][@slack/bolt@2.5.0] + + + +# [@slack/bolt@2.4.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.4.1) - 30 Sep 2020 + +* Fixes the `StepUpdateArguments` and `StepCompleteArguments` type definitions to correctly, and more precisely, describe the arguments to the `update()` and `complete()` utility arguments when building a `WorkflowStep` - Thanks [@seratch](https://github.com/seratch) ([#653](https://github.com/slackapi/bolt-js/issues/653)) + + +[Changes][@slack/bolt@2.4.1] + + + +# [@slack/bolt@2.4.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.4.0) - 30 Sep 2020 + +* The new `WorkflowStep` class gives Bolt apps the ability to offer Workflow Builder [Steps from Apps](https://api.slack.com/workflows/steps). + + Slack users can compose Workflows using steps that your app defines. Your app will create the interface for the user to add or edit their step, with the specific inputs and ouputs it needs. Later, Slack will send an event to your app when it's time to execute that step. Learn how to build using [`WorkflowStep` in the Bolt for JS docs](https://slack.dev/bolt-js/concepts#steps). + + Thanks to [@misscoded](https://github.com/misscoded), [@selfcontained](https://github.com/selfcontained), [@amarinelli](https://github.com/amarinelli), [@seratch](https://github.com/seratch) ([#607](https://github.com/slackapi/bolt-js/issues/607), [#592](https://github.com/slackapi/bolt-js/issues/592), [#593](https://github.com/slackapi/bolt-js/issues/593) ) + +* Fixes types for radio buttons and date picker to allow `selected_options` to be `null` - Thanks [@stevengill](https://github.com/stevengill) ([#622](https://github.com/slackapi/bolt-js/issues/622)) + +* Adds documentation for publishing views to the App Home Home Tab - Thanks [@shaydewael](https://github.com/shaydewael) ([#626](https://github.com/slackapi/bolt-js/issues/626)) + +* A slew of documentation updates! + * Updates docs to use `client` listener arg instead of `app.client` consistently - Thanks [@shaydewael](https://github.com/shaydewael) ([#613](https://github.com/slackapi/bolt-js/issues/613)) + * Fixes various errors found in code snippets inside docs (in English and Japanese) - Thanks [@seratch](https://github.com/seratch) ([#628](https://github.com/slackapi/bolt-js/issues/628)) + * Improves code snippet in README to be more Unicode friendly - Thanks [@seratch](https://github.com/seratch) ([#610](https://github.com/slackapi/bolt-js/issues/610)) + * Many incremental improvements to align the Bolt for JS docs with Bolt for Python docs - Thanks [@mwbrooks](https://github.com/mwbrooks) ([#631](https://github.com/slackapi/bolt-js/issues/631), [#623](https://github.com/slackapi/bolt-js/issues/623)) + * Improved and clarified language in shortcuts documentation - Thanks [@shaydewael](https://github.com/shaydewael) ([#563](https://github.com/slackapi/bolt-js/issues/563)) + * Fixes v2 Migration Guide to reflect that error handlers are async functions (in English and Japanese) - Thanks [@atl-mk](https://github.com/atl-mk) ([#599](https://github.com/slackapi/bolt-js/issues/599), [#598](https://github.com/slackapi/bolt-js/issues/598)) + * Clarifies language in "Listening and Responding to a Message" about bot channel membership (in English and Japanese) - Thanks [@misscoded](https://github.com/misscoded), [@seratch](https://github.com/seratch) ([#600](https://github.com/slackapi/bolt-js/issues/600), [#603](https://github.com/slackapi/bolt-js/issues/603)) + * Updating out of date info and removing duplicate info in the README - Thanks [@shaydewael](https://github.com/shaydewael) ([#609](https://github.com/slackapi/bolt-js/issues/609)) + * Improvements to the header: filters out prereleases from showing up in the version badge, uses the more canonical "Bolt for JS" title - Thanks [@misscoded](https://github.com/misscoded), [@shaydewael](https://github.com/shaydewael) ([#602](https://github.com/slackapi/bolt-js/issues/602), [#635](https://github.com/slackapi/bolt-js/issues/635)) + * Improves copy-pastability (yes, I just made that word up) of the OAuth example config - Thanks [@tomquirk](https://github.com/tomquirk) ([#605](https://github.com/slackapi/bolt-js/issues/605)) + * Fixes a typo in the README - Thanks [@kale](https://github.com/kale) ([#606](https://github.com/slackapi/bolt-js/issues/606)) + * Adds missing section break to Getting Started guide - Thanks [@mwbrooks](https://github.com/mwbrooks), [@seratch](https://github.com/seratch) ([#617](https://github.com/slackapi/bolt-js/issues/617), [#618](https://github.com/slackapi/bolt-js/issues/618)) + +[Changes][@slack/bolt@2.4.0] + + + +# [@slack/bolt@2.3.0-workflowStepsBeta.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.3.0-workflowStepsBeta.1) - 03 Sep 2020 + +This release includes additions to the [Workflow Steps from Apps](https://medium.com/slack-developer-blog/stickier-slack-apps-with-workflow-steps-68f24ce48311) beta. 🎉 + +- Added `WorkflowStep` class, new utility props, tests, and associated types - Thanks, [@misscoded](https://github.com/misscoded)! +- Updated docs to reflect changes - Thanks, [@misscoded](https://github.com/misscoded)! + +Install via `npm install @slack/bolt@feat-workflow-steps` + +[Changes][@slack/bolt@2.3.0-workflowStepsBeta.1] + + + +# [@slack/bolt@2.3.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.3.0) - 21 Aug 2020 + +* Added `api_app_id` to slash command payloads ([#573](https://github.com/slackapi/bolt-js/issues/573), [#574](https://github.com/slackapi/bolt-js/issues/574)) - Thanks [@stevengill](https://github.com/stevengill) +* `clientOptions` gets passed down to `@slack/oauth` ([#585](https://github.com/slackapi/bolt-js/issues/585), [#586](https://github.com/slackapi/bolt-js/issues/586)) - Thanks [@stevengill](https://github.com/stevengill) +* Added a new property to `installerOptions` named `authorizationUrl`. This can be used to change the default authorization endpoint when doing OAuth. ([#585](https://github.com/slackapi/bolt-js/issues/585), [#586](https://github.com/slackapi/bolt-js/issues/586)) - Thanks [@stevengill](https://github.com/stevengill) +* `Bolt-js` now exposes exported interfaces from `@slack/oauth` and everything exported from `@slack/types` ([#585](https://github.com/slackapi/bolt-js/issues/585), [#586](https://github.com/slackapi/bolt-js/issues/586)) - Thanks [@stevengill](https://github.com/stevengill) + +[Changes][@slack/bolt@2.3.0] + + + +# [@slack/bolt@2.2.3-workflowStepsBeta.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.2.3-workflowStepsBeta.1) - 17 Aug 2020 + +This release includes additions to the [Workflow Steps from Apps](https://medium.com/slack-developer-blog/stickier-slack-apps-with-workflow-steps-68f24ce48311) beta. 🎉 + +Add to types associated with the `workflow_step` feature, including optional `workflow_step` object on view submit/close events ([#578](https://github.com/slackapi/bolt-js/issues/578)) - Thanks, [@selfcontained](https://github.com/selfcontained)! + +Install via `npm install @slack/bolt@feat-workflow-steps` + +[Changes][@slack/bolt@2.2.3-workflowStepsBeta.1] + + + +# [@slack/bolt@2.2.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.2.0) - 21 Jul 2020 + +- Made updates for English and Japanese docs ([#417](https://github.com/slackapi/bolt-js/issues/417), [#513](https://github.com/slackapi/bolt-js/issues/513), [#515](https://github.com/slackapi/bolt-js/issues/515), [#518](https://github.com/slackapi/bolt-js/issues/518), [#522](https://github.com/slackapi/bolt-js/issues/522), [#527](https://github.com/slackapi/bolt-js/issues/527), [#535](https://github.com/slackapi/bolt-js/issues/535), [#547](https://github.com/slackapi/bolt-js/issues/547)) - Thanks, [@greggTime](https://github.com/greggTime), [@stevengill](https://github.com/stevengill), and [@seratch](https://github.com/seratch)! +- Added [`calls_rejected`](https://api.slack.com/events/call_rejected) event ([#505](https://github.com/slackapi/bolt-js/issues/505), [#506](https://github.com/slackapi/bolt-js/issues/506)) - Thanks, [@stevengill](https://github.com/stevengill)! +- Added new middleware to filter out `app_mention` events ([#499](https://github.com/slackapi/bolt-js/issues/499)) - Thanks, [@hashedhyphen](https://github.com/hashedhyphen)! +- Added text as an optional property for RespondArguments ([#512](https://github.com/slackapi/bolt-js/issues/512)) - Thanks, [@aoberoi](https://github.com/aoberoi)! +- Added `userScopes` to `AppOptions` ([#540](https://github.com/slackapi/bolt-js/issues/540)) - Thanks, [@joshmcgrath08](https://github.com/joshmcgrath08)! +- Added new interface types for `ReactionAddedEvent` ([#537](https://github.com/slackapi/bolt-js/issues/537)) - Thanks, [@dbmikus](https://github.com/dbmikus)! + +[Changes][@slack/bolt@2.2.0] + + + +# [@slack/bolt@2.1.1-workflowStepsBeta.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.1.1-workflowStepsBeta.1) - 20 Jul 2020 + +This release is for the [Workflow Steps from Apps](https://medium.com/slack-developer-blog/stickier-slack-apps-with-workflow-steps-68f24ce48311) beta. 🎉 + +- Added Workflow Steps support ([#546](https://github.com/slackapi/bolt-js/issues/546)) - Thanks, [@selfcontained](https://github.com/selfcontained)! + +Install via `npm install @slack/bolt@feat-workflow-steps` + +[Changes][@slack/bolt@2.1.1-workflowStepsBeta.1] + + + +# [@slack/bolt@1.8.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.8.1) - 06 Jul 2020 + +* added runtime deprecation notice for @slack/bolt 1.x ([#533](https://github.com/slackapi/bolt-js/issues/533)). Please upgrade to the latest version of bolt-js! - Thanks [@stevengill](https://github.com/stevengill) + + +[Changes][@slack/bolt@1.8.1] + + + +# [@slack/bolt@2.1.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.1.1) - 23 May 2020 + +* Fixed a bug with custom `ExpressReceivers` not working properly with the new OAuth changes. (https://github.com/slackapi/bolt-js/pull/503) - Thanks [@stevengill](https://github.com/stevengill) & [@marks](https://github.com/marks) + +[Changes][@slack/bolt@2.1.1] + + + +# [@slack/bolt@2.1.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.1.0) - 22 May 2020 + +* Integrated the [Slack OAuth package](https://slack.dev/node-slack-sdk/oauth) into Bolt-js. Checkout the [Bolt-js docs](https://slack.dev/bolt-js/concepts#authenticating-oauth) to learn more! ([#479](https://github.com/slackapi/bolt-js/issues/479)) - Thanks [@stevengill](https://github.com/stevengill) +* changed deprecated usage of `res.send` to `res.status(500).send()` ([#487](https://github.com/slackapi/bolt-js/issues/487)) - Thanks [@dburandt](https://github.com/dburandt) +* updates to docs ([#477](https://github.com/slackapi/bolt-js/issues/477)) - Thanks [@shaydewael](https://github.com/shaydewael) +* Added type aliases for `RadioButton` and `Checkbox` ([#471](https://github.com/slackapi/bolt-js/issues/471)) - Thanks [@yoichiro](https://github.com/yoichiro) + + + +[Changes][@slack/bolt@2.1.0] + + + +# [@slack/bolt@2.0.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.0.1) - 11 Apr 2020 + +* Fixes bug where `processBeforeResponse` option did not ensure processing was complete before HTTP response was sent ([#462](https://github.com/slackapi/bolt-js/issues/462)) - thanks [@aoberoi](https://github.com/aoberoi) +* Adds the new Bolt for JS brand assets in the documentation site and README ($468) - thanks [@shaydewael](https://github.com/shaydewael) +* Adds Bolt for JS v2 Migration Guide in Japanese ([#457](https://github.com/slackapi/bolt-js/issues/457)) - thanks [@seratch](https://github.com/seratch) +* Corrects badly formatted string in the documentation example code ([#460](https://github.com/slackapi/bolt-js/issues/460), [#461](https://github.com/slackapi/bolt-js/issues/461)) - thanks [@takayukioda](https://github.com/takayukioda) + + +[Changes][@slack/bolt@2.0.1] + + + +# [@slack/bolt@2.0.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@2.0.0) - 30 Mar 2020 + +Thanks for checking out the `2.0.0` release of Bolt for JavaScript! Firstly, a huge thank you to all of the folks who contributed to this release. A special shoutout to community contributor [@barlock](https://github.com/barlock) for the massive contributions he contributed! + +Make sure to read the [migrating to `2.0.0` guide](https://slack.dev/bolt/tutorial/migration-v2) to learn what changes are needed to upgrade your existing Bolt for JavaScript apps. + + +- Chaining middleware via promises. This allows the ability to test listeners and middlewares without artificial delays. This change also allows Bolt to run on Functions-as-a-Service platforms (such as AWS Lambda) by allowing the `processBeforeResponse` option to be used. ([#353](https://github.com/slackapi/bolt-js/issues/353), [#380](https://github.com/slackapi/bolt-js/issues/380), [#381](https://github.com/slackapi/bolt-js/issues/381), [#439](https://github.com/slackapi/bolt-js/issues/439), [#440](https://github.com/slackapi/bolt-js/issues/440), [#444](https://github.com/slackapi/bolt-js/issues/444)) - Thanks [@barlock](https://github.com/barlock), [@aoberoi](https://github.com/aoberoi), [@stevengill](https://github.com/stevengill) and [@seratch](https://github.com/seratch) +- [Message shortcuts](https://api.slack.com/interactivity/shortcuts/using#message_shortcuts) (previously referred to as message actions) now use the `shortcut()` method instead of the `action()` method. ([#428](https://github.com/slackapi/bolt-js/issues/428)) - Thanks [@stevengill](https://github.com/stevengill) +- Fix `View` type missing optional id from response ([#436](https://github.com/slackapi/bolt-js/issues/436), [#437](https://github.com/slackapi/bolt-js/issues/437)) - Thanks [@seratch](https://github.com/seratch) +- Added Migration Guide for `@slack/bolt@2.0.0` ([#442](https://github.com/slackapi/bolt-js/issues/442), [#445](https://github.com/slackapi/bolt-js/issues/445), [#449](https://github.com/slackapi/bolt-js/issues/449)) - Thanks [@stevengill](https://github.com/stevengill) +- Added `processBeforeResponse` to `App[Options]` to improve Bolt support for Function-as-a-Service platforms (like [AWS Lambda](https://aws.amazon.com/lambda/)) ([#444](https://github.com/slackapi/bolt-js/issues/444)) - Thanks [@stevengill](https://github.com/stevengill) +- Set minimum TypeScript version to 3.7.0 ([#447](https://github.com/slackapi/bolt-js/issues/447), [#452](https://github.com/slackapi/bolt-js/issues/452)) - Thanks [@aoberoi](https://github.com/aoberoi) and [@stevengill](https://github.com/stevengill) + +[Changes][@slack/bolt@2.0.0] + + + +# [@slack/bolt@1.8.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.8.0) - 18 Mar 2020 + +* Added [Global Shortcuts](https://medium.com/@SlackAPI/introducing-new-ways-to-interact-with-apps-d66e160b8ae) support with the new `.shortcut` method ([#427](https://github.com/slackapi/bolt-js/issues/427), [#430](https://github.com/slackapi/bolt-js/issues/430)) - thanks [@stevengill](https://github.com/stevengill) & [@shaydewael](https://github.com/shaydewael) +* Replaced `bolt` with `bolt for javascript` in our documentation ([#425](https://github.com/slackapi/bolt-js/issues/425)) - thanks [@shaydewael](https://github.com/shaydewael) +* Fix invalid fields in `MultiUsersSelectAction` ([#422](https://github.com/slackapi/bolt-js/issues/422), [#423](https://github.com/slackapi/bolt-js/issues/423)) - thanks [@seratch](https://github.com/seratch) + + + + +[Changes][@slack/bolt@1.8.0] + + + +# [@slack/bolt@1.7.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.7.0) - 06 Mar 2020 + +* Specified view submission response action types ([#305](https://github.com/slackapi/bolt-js/issues/305), [#404](https://github.com/slackapi/bolt-js/issues/404)) - Thanks [@aoberoi](https://github.com/aoberoi) +* Provided a better way to configure `logger` ([#405](https://github.com/slackapi/bolt-js/issues/405), [#406](https://github.com/slackapi/bolt-js/issues/406)) - Thanks [@seratch](https://github.com/seratch) +* Added checkboxes type support to action payload ([#408](https://github.com/slackapi/bolt-js/issues/408)) - Thanks [@seratch](https://github.com/seratch) +* Minor docs updates ([#398](https://github.com/slackapi/bolt-js/issues/398), [#348](https://github.com/slackapi/bolt-js/issues/348), [#410](https://github.com/slackapi/bolt-js/issues/410), [#417](https://github.com/slackapi/bolt-js/issues/417)) - Thanks [@seratch](https://github.com/seratch) & [@greggTime](https://github.com/greggTime) + + +[Changes][@slack/bolt@1.7.0] + + + +# [@slack/bolt@1.6.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.6.0) - 05 Feb 2020 + +* Added `logger` and `client` to the list of arguments sent through to listeners (such as event, message, etc.). This makes it easier for listeners to make calls to `Web API` methods while keeping the client rate-limit and queue-aware. ([#359](https://github.com/slackapi/bolt-js/issues/359), [#168](https://github.com/slackapi/bolt-js/issues/168), [#354](https://github.com/slackapi/bolt-js/issues/354)) - thanks [@seratch](https://github.com/seratch) +* Added support for the `invite_requested` event type ([#382](https://github.com/slackapi/bolt-js/issues/382), [#387](https://github.com/slackapi/bolt-js/issues/387)) thanks [@seratch](https://github.com/seratch) +* Update Bolt getting started guide for Granular Bot Permissions ([#373](https://github.com/slackapi/bolt-js/issues/373), [#378](https://github.com/slackapi/bolt-js/issues/378)) - thanks [@shaydewael](https://github.com/shaydewael) +* Respond with `401` status code instead of `500` for signature verification failures ([#324](https://github.com/slackapi/bolt-js/issues/324), [#362](https://github.com/slackapi/bolt-js/issues/362)) - thanks [@seratch](https://github.com/seratch) +* Fixed `ack` in `ExpressReceiver` firing twice. ([#327](https://github.com/slackapi/bolt-js/issues/327) [#370](https://github.com/slackapi/bolt-js/issues/370)) - thanks [@jarrodldavis](https://github.com/jarrodldavis) +* `ExpressReceiver's` `RespondFn` implementation now accepts a string ([#377](https://github.com/slackapi/bolt-js/issues/377), [#379](https://github.com/slackapi/bolt-js/issues/379)) - thanks [@seratch](https://github.com/seratch) +* Added more unit tests for built-in middleware and `ExpressReceiver` ([#357](https://github.com/slackapi/bolt-js/issues/357)) - thanks [@seratch](https://github.com/seratch) +* Minor docs updates ([#352](https://github.com/slackapi/bolt-js/issues/352), [#356](https://github.com/slackapi/bolt-js/issues/356), [#363](https://github.com/slackapi/bolt-js/issues/363), [#374](https://github.com/slackapi/bolt-js/issues/374)) - thanks [@koh110](https://github.com/koh110), [@seratch](https://github.com/seratch), [@byrondover](https://github.com/byrondover) + +[Changes][@slack/bolt@1.6.0] + + + +# [@slack/bolt@1.5.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.5.0) - 20 Dec 2019 + +* Added support for radio button types in App Home (https://github.com/slackapi/bolt/pull/299) - Thanks [@shaydewael](https://github.com/shaydewael) +* Some nice docs fixes (https://github.com/slackapi/bolt/pull/318) ([#319](https://github.com/slackapi/bolt-js/issues/319)) - Thanks [@yamashush](https://github.com/yamashush), [@shaydewael](https://github.com/shaydewael) +* Updated the dependency version of `@slack/web-api` to include support for modals ([#322](https://github.com/slackapi/bolt-js/issues/322)) and then again for granular bot permissions ([#335](https://github.com/slackapi/bolt-js/issues/335)) - Thanks [@PerStirpes](https://github.com/PerStirpes), [@seratch](https://github.com/seratch) and [@stevengill](https://github.com/stevengill) +* Added `type` as a valid constraint for app actions. (https://github.com/slackapi/bolt/pull/326) - Thanks [@selfcontained](https://github.com/selfcontained) +* Fixed some linting issues (https://github.com/slackapi/bolt/pull/339) - Thanks [@tteltrab](https://github.com/tteltrab) +* Removed `users.info` call from SingleTeamAuthorization since `auth.test` includes the `bot_id`. This allows developers to reduce scope by creating Bolt apps without a `users:read` scope. ([#347](https://github.com/slackapi/bolt-js/issues/347)) - Thanks [@pichsenmeister](https://github.com/pichsenmeister) +* For our Typescript users, we made the `channel` field in `block_actions` payload optional ([#343](https://github.com/slackapi/bolt-js/issues/343)), added support for `multi-select` actions ([#344](https://github.com/slackapi/bolt-js/issues/344)), and improved type resolution for action method ([#349](https://github.com/slackapi/bolt-js/issues/349)) - Thanks [@seratch](https://github.com/seratch) and [@stevengill](https://github.com/stevengill) + + + +[Changes][@slack/bolt@1.5.0] + + + +# [@slack/bolt@1.4.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.4.1) - 23 Oct 2019 + +* Adds updated types for the `app_home_opened` event. The event now contains a `tab` property, which can be set to `"home"` or `"messages"`. The event might also contain a `view` property. These changes are in support of [App Home Home Tabs](https://api.slack.com/surfaces/tabs). ([#292](https://github.com/slackapi/bolt-js/issues/292)) thanks [@seratch](https://github.com/seratch)! + +[Changes][@slack/bolt@1.4.1] + + + +# [@slack/bolt@1.4.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.4.0) - 09 Oct 2019 + +- Adds a much-anticipated enhancement to fire `member_joined_channel` and `member_left_channel` events for your own bot ([#236](https://github.com/slackapi/bolt-js/issues/236)) - thanks [@TK95](https://github.com/TK95) 🎉 +- Adds the ability to pass in `WebClient` options into the constructor ([#228](https://github.com/slackapi/bolt-js/issues/228) and [#278](https://github.com/slackapi/bolt-js/issues/278)) - thanks [@koh110](https://github.com/koh110) and [@aoberoi](https://github.com/aoberoi) ⚙️ +- Adds Japanese 🇯🇵documentation for Block Kit in modals ([#268](https://github.com/slackapi/bolt-js/issues/268)) - thanks [@seratch](https://github.com/seratch) +- Fixes some typos and mistranslations in the Japanese documentation ([#279](https://github.com/slackapi/bolt-js/issues/279)) - thanks [@grgr-dkrk](https://github.com/grgr-dkrk) +- Adds `view_closed` for Block Kit in modals (uses the same `view()` method) ([#276](https://github.com/slackapi/bolt-js/issues/276)) - thanks [@shanedewael](https://github.com/shanedewael) +- Removes redundant types for `please-upgrade-node` ([#253](https://github.com/slackapi/bolt-js/issues/253)) - thanks [@43081j](https://github.com/43081j) +- Adds tests to for the incoming event handler ([#269](https://github.com/slackapi/bolt-js/issues/269)) - thanks [@seratch](https://github.com/seratch) +- Updates logger + documentation to use `getLevel()` ([#270](https://github.com/slackapi/bolt-js/issues/270) and [#285](https://github.com/slackapi/bolt-js/issues/285))- thanks [@shanedewael](https://github.com/shanedewael) +- Fixes a bug with custom receiver being overwritten when `signingSecret` was passed into constructor ([#271](https://github.com/slackapi/bolt-js/issues/271)) - thanks [@shanedewael](https://github.com/shanedewael) +- Adds a maintainer guide ([#272](https://github.com/slackapi/bolt-js/issues/272)) - thanks [@shanedewael](https://github.com/shanedewael) +- Fixes a JA documentation inconsistency ([#273](https://github.com/slackapi/bolt-js/issues/273)) - thanks [@ikenami](https://github.com/ikenami) + + +[Changes][@slack/bolt@1.4.0] + + + +# [@slack/bolt@1.3.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.3.0) - 25 Sep 2019 + +- Adds new `view()` method that allows you to listen to `view_submission` events - thanks [@shanedewael](https://github.com/shanedewael) +- Adds new types and documentation for using Block Kit in modals - thanks [@shanedewael](https://github.com/shanedewael) +- Fix the Web API documentation - thanks [@PerStirpes](https://github.com/PerStirpes) + +[Changes][@slack/bolt@1.3.0] + + + +# [@slack/bolt@1.2.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.2.0) - 24 May 2019 + +* Adds support for `rawBody` in signature verification which enables serverless (GCP) deployments of Bolt (fixes [#192](https://github.com/slackapi/bolt-js/issues/192)) - thanks [@seratch](https://github.com/seratch) +* Fixes message action support (fixes [#201](https://github.com/slackapi/bolt-js/issues/201)) - thanks [@shanedewael](https://github.com/shanedewael) +* Adds improvements to `App.spec.js` - thanks [@seratch](https://github.com/seratch) + +[Changes][@slack/bolt@1.2.0] + + + +# [@slack/bolt@1.1.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.1.0) - 20 May 2019 + +* Bolt will now fail with an error on initialization when it is started using an incompatible Node version ([#174](https://github.com/slackapi/bolt-js/issues/174)) - thanks [@aoberoi](https://github.com/aoberoi) +* Bug fix: `subtype()` built-in middleware used an inverted logical condition ([#180](https://github.com/slackapi/bolt-js/issues/180)) - thanks [@shanedewael](https://github.com/shanedewael) +* Bug fix: Errors from calling `say()` utility were not handled using the global error handler ([#183](https://github.com/slackapi/bolt-js/issues/183)) - thanks [@sethlu](https://github.com/sethlu) and [@aoberoi](https://github.com/aoberoi) +* Bug fix: The `conversationContext()` default built-in middleware did not allow events without a channel context to flow through handlers ([#185](https://github.com/slackapi/bolt-js/issues/185)) - thanks [@aoberoi](https://github.com/aoberoi) +* Bug fix: The `matchMessage()` and `directMention()` built-in middleware would fail to process messages without `text`, such as Block Kit composed messages ([#182](https://github.com/slackapi/bolt-js/issues/182)) - thanks [@aoberoi](https://github.com/aoberoi) +* Tons of improvements to the Getting Started guide, and other docs ([#170](https://github.com/slackapi/bolt-js/issues/170), [#171](https://github.com/slackapi/bolt-js/issues/171), [#177](https://github.com/slackapi/bolt-js/issues/177), [#178](https://github.com/slackapi/bolt-js/issues/178), [#181](https://github.com/slackapi/bolt-js/issues/181), [#186](https://github.com/slackapi/bolt-js/issues/186), [#188](https://github.com/slackapi/bolt-js/issues/188), [#193](https://github.com/slackapi/bolt-js/issues/193), [#194](https://github.com/slackapi/bolt-js/issues/194)) - thanks [@shanedewael](https://github.com/shanedewael), [@0xflotus](https://github.com/0xflotus), and [@seratch](https://github.com/seratch). + +[Changes][@slack/bolt@1.1.0] + + + +# [@slack/bolt@1.0.1](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.0.1) - 24 Apr 2019 + +- Fix block action detection and removes `StringIndexed` from action body types ([#166](https://github.com/slackapi/bolt-js/issues/166)) - thanks [@aoberoi](https://github.com/aoberoi) +- Fail early for unknown constraints ([#167](https://github.com/slackapi/bolt-js/issues/167)) - thanks [@aoberoi](https://github.com/aoberoi) + +[Changes][@slack/bolt@1.0.1] + + + +# [Introducing Bolt - v1.0.0 (@slack/bolt@1.0.0)](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@1.0.0) - 24 Apr 2019 + +Bolt is a framework for building Slack apps, _fast_. + +[Get started](/getting-started) to build your team's next productivity enhancer, social sidekick, or just have some fun with memes. Bolt makes it a cinch listen in on the Events API, send [composed messages](https://api.slack.com/messaging), respond to [interactions in those messages](https://api.slack.com/messaging/interactivity), and more. + +Get more details in the [full documentation](https://slack.dev/bolt). + +### Where is Slapp? + +Bolt wouldn't be possible without all the amazing work from Slapp contributors and community - it evolved from the Slapp codebase. Slapp will continue to be supported on the [`v3` branch](https://github.com/slackapi/bolt/tree/v3) but we'd really like existing Slapp users to give Bolt a try. We've been mindful to make sure Slapp apps will translate over without too much pain, and will be publishing a migration guide in the future. + +[Changes][@slack/bolt@1.0.0] + + + +# [@slack/bolt@v1.0.0-alpha.0](https://github.com/slackapi/bolt-js/releases/tag/@slack/bolt@v1.0.0-alpha.0) - 24 Apr 2019 + + + +[Changes][@slack/bolt@v1.0.0-alpha.0] + + +[@slack/bolt@3.19.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.18.0...@slack/bolt@3.19.0 +[@slack/bolt@3.18.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.17.1...@slack/bolt@3.18.0 +[@slack/bolt@3.17.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.17.0...@slack/bolt@3.17.1 +[@slack/bolt@3.17.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.16.0...@slack/bolt@3.17.0 +[@slack/bolt@3.16.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.15.0...@slack/bolt@3.16.0 +[@slack/bolt@3.15.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.14.0...@slack/bolt@3.15.0 +[@slack/bolt@3.14.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.3...@slack/bolt@3.14.0 +[@slack/bolt@3.13.3]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.2...@slack/bolt@3.13.3 +[@slack/bolt@3.13.2]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.1...@slack/bolt@3.13.2 +[@slack/bolt@3.13.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.13.0...@slack/bolt@3.13.1 +[@slack/bolt@3.13.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0-nextGen.9...@slack/bolt@3.13.0 +[@slack/bolt@4.0.0-nextGen.9]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.2...@slack/bolt@4.0.0-nextGen.9 +[@slack/bolt@3.12.2]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0-nextGen.8...@slack/bolt@3.12.2 +[@slack/bolt@4.0.0-nextGen.8]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0-nextGen.6...@slack/bolt@4.0.0-nextGen.8 +[@slack/bolt@4.0.0-nextGen.6]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0-nextGen.3...@slack/bolt@4.0.0-nextGen.6 +[@slack/bolt@4.0.0-nextGen.3]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@4.0.0-nextGen.2...@slack/bolt@4.0.0-nextGen.3 +[@slack/bolt@4.0.0-nextGen.2]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.1...@slack/bolt@4.0.0-nextGen.2 +[@slack/bolt@3.12.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.12.0...@slack/bolt@3.12.1 +[@slack/bolt@3.12.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.11.3...@slack/bolt@3.12.0 +[@slack/bolt@3.11.3]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.11.2...@slack/bolt@3.11.3 +[@slack/bolt@3.11.2]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.11.1...@slack/bolt@3.11.2 +[@slack/bolt@3.11.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.11.0...@slack/bolt@3.11.1 +[@slack/bolt@3.11.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.10.0...@slack/bolt@3.11.0 +[@slack/bolt@3.10.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.9.0...@slack/bolt@3.10.0 +[@slack/bolt@3.9.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.8.1...@slack/bolt@3.9.0 +[@slack/bolt@3.8.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.8.0...@slack/bolt@3.8.1 +[@slack/bolt@3.8.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.7.0...@slack/bolt@3.8.0 +[@slack/bolt@3.7.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.6.0...@slack/bolt@3.7.0 +[@slack/bolt@3.6.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.6.0-hermesBeta.1...@slack/bolt@3.6.0 +[@slack/bolt@3.6.0-hermesBeta.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.5.0...@slack/bolt@3.6.0-hermesBeta.1 +[@slack/bolt@3.5.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.4.1...@slack/bolt@3.5.0 +[@slack/bolt@3.4.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.4.0...@slack/bolt@3.4.1 +[@slack/bolt@3.4.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.3.0...@slack/bolt@3.4.0 +[@slack/bolt@3.3.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.2.0...@slack/bolt@3.3.0 +[@slack/bolt@3.2.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.1.1...@slack/bolt@3.2.0 +[@slack/bolt@3.1.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.1.0...@slack/bolt@3.1.1 +[@slack/bolt@3.1.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@3.0.0...@slack/bolt@3.1.0 +[@slack/bolt@3.0.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.7.0...@slack/bolt@3.0.0 +[@slack/bolt@2.7.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.6.0...@slack/bolt@2.7.0 +[@slack/bolt@2.6.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.5.0...@slack/bolt@2.6.0 +[@slack/bolt@2.5.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.4.1...@slack/bolt@2.5.0 +[@slack/bolt@2.4.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.4.0...@slack/bolt@2.4.1 +[@slack/bolt@2.4.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.3.0-workflowStepsBeta.1...@slack/bolt@2.4.0 +[@slack/bolt@2.3.0-workflowStepsBeta.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.3.0...@slack/bolt@2.3.0-workflowStepsBeta.1 +[@slack/bolt@2.3.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.2.3-workflowStepsBeta.1...@slack/bolt@2.3.0 +[@slack/bolt@2.2.3-workflowStepsBeta.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.2.0...@slack/bolt@2.2.3-workflowStepsBeta.1 +[@slack/bolt@2.2.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.1.1-workflowStepsBeta.1...@slack/bolt@2.2.0 +[@slack/bolt@2.1.1-workflowStepsBeta.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.8.1...@slack/bolt@2.1.1-workflowStepsBeta.1 +[@slack/bolt@1.8.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.1.1...@slack/bolt@1.8.1 +[@slack/bolt@2.1.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.1.0...@slack/bolt@2.1.1 +[@slack/bolt@2.1.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.0.1...@slack/bolt@2.1.0 +[@slack/bolt@2.0.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@2.0.0...@slack/bolt@2.0.1 +[@slack/bolt@2.0.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.8.0...@slack/bolt@2.0.0 +[@slack/bolt@1.8.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.7.0...@slack/bolt@1.8.0 +[@slack/bolt@1.7.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.6.0...@slack/bolt@1.7.0 +[@slack/bolt@1.6.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.5.0...@slack/bolt@1.6.0 +[@slack/bolt@1.5.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.4.1...@slack/bolt@1.5.0 +[@slack/bolt@1.4.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.4.0...@slack/bolt@1.4.1 +[@slack/bolt@1.4.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.3.0...@slack/bolt@1.4.0 +[@slack/bolt@1.3.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.2.0...@slack/bolt@1.3.0 +[@slack/bolt@1.2.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.1.0...@slack/bolt@1.2.0 +[@slack/bolt@1.1.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.0.1...@slack/bolt@1.1.0 +[@slack/bolt@1.0.1]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@1.0.0...@slack/bolt@1.0.1 +[@slack/bolt@1.0.0]: https://github.com/slackapi/bolt-js/compare/@slack/bolt@v1.0.0-alpha.0...@slack/bolt@1.0.0 +[@slack/bolt@v1.0.0-alpha.0]: https://github.com/slackapi/bolt-js/tree/@slack/bolt@v1.0.0-alpha.0 + + diff --git a/docs/_advanced/authorization.md b/docs/content/advanced/authorization.md similarity index 90% rename from docs/_advanced/authorization.md rename to docs/content/advanced/authorization.md index 6f91f4357..56faea126 100644 --- a/docs/_advanced/authorization.md +++ b/docs/content/advanced/authorization.md @@ -1,21 +1,18 @@ --- title: Authorization lang: en -slug: authorization -order: 2 +slug: /concepts/authorization --- -
    Authorization is the process of deciding which Slack credentials (such as a bot token) should be available while processing a specific incoming request. -Custom apps installed on a single workspace can simply use the `token` option at the time of `App` initialization. However, when your app needs to handle several tokens, such as cases where it will be installed on multiple workspaces or needs access to more than one user token, the `authorize` option should be used instead. If you're using the [built-in OAuth support](#authenticating-oauth) authorization is handled by default, so you do not need to pass in an `authorize` option. +Custom apps installed on a single workspace can simply use the `token` option at the time of `App` initialization. However, when your app needs to handle several tokens, such as cases where it will be installed on multiple workspaces or needs access to more than one user token, the `authorize` option should be used instead. If you're using the [built-in OAuth support](/concepts/authenticating-oauth) authorization is handled by default, so you do not need to pass in an `authorize` option. The `authorize` option can be set to a function that takes an event source as its input, and should return a Promise for an object containing the authorized credentials. The source contains information about who and where the request is coming from by using properties like `teamId` (always available), `userId`, `conversationId`, and `enterpriseId`. -The authorized credentials should also have a few specific properties: `botToken`, `userToken`, `botId` (required for an app to ignore messages from itself), and `botUserId`. You can also include any other properties you'd like to make available on the [`context`](#context) object. +The authorized credentials should also have a few specific properties: `botToken`, `userToken`, `botId` (required for an app to ignore messages from itself), and `botUserId`. You can also include any other properties you'd like to make available on the [`context`](/concepts/context) object. You should always provide either one or both of the `botToken` and `userToken` properties. At least one of them is necessary to make helpers like `say()` work. If they are both given, then `botToken` will take precedence. -
    ```javascript const app = new App({ authorize: authorizeFn, signingSecret: process.env.SLACK_SIGNING_SECRET }); diff --git a/docs/_advanced/context.md b/docs/content/advanced/context.md similarity index 93% rename from docs/_advanced/context.md rename to docs/content/advanced/context.md index bf796ed4f..ab0ffc4aa 100644 --- a/docs/_advanced/context.md +++ b/docs/content/advanced/context.md @@ -1,15 +1,12 @@ --- title: Adding context lang: en -slug: context -order: 7 +slug: /concepts/context --- -
    All listeners have access to a `context` object, which can be used to enrich requests with additional information. For example, perhaps you want to add user information from a third party system or add temporary state for the next middleware in the chain. `context` is just an object, so you can add to it by setting it to a modified version of itself. -
    ```javascript async function addTimezoneContext({ payload, client, context, next }) { @@ -36,7 +33,7 @@ app.command('/request', addTimezoneContext, async ({ command, ack, client, conte const requestText = `:large_blue_circle: *New request from <@${command.user_id}>*: ${command.text}`; - // If request not inbetween 9AM and 5PM, send request tomorrow + // If request not in between 9AM and 5PM, send request tomorrow if (localHour > 17 || localHour < 9) { // Assume function exists to get local tomorrow 9AM from offset const localTomorrow = getLocalTomorrow(context.tz_offset); diff --git a/docs/_advanced/conversation_store.md b/docs/content/advanced/conversation-store.md similarity index 84% rename from docs/_advanced/conversation_store.md rename to docs/content/advanced/conversation-store.md index 2232014f3..6c67bdb25 100644 --- a/docs/_advanced/conversation_store.md +++ b/docs/content/advanced/conversation-store.md @@ -1,19 +1,16 @@ --- title: Conversation stores lang: en -slug: conversation-store -order: 4 +slug: /concepts/conversation-store --- -
    Bolt for JavaScript includes support for a store, which sets and retrieves state related to a conversation. Conversation stores have two methods: * `set()` modifies conversation state. `set()` requires a `conversationId` of type string, `value` of any type, and an optional `expiresAt` of type number. `set()` returns a `Promise`. * `get()` fetches conversation state from the store. `get()` requires a `conversationId` of type string and returns a Promise with the conversation’s state. -`conversationContext()` is a built-in [global middleware](#global-middleware) that allows conversations to be updated by other middleware. When receiving an event, middleware functions can use `context.updateConversation()` to set state and `context.conversation` to retrieve it. +`conversationContext()` is a built-in [global middleware](/concepts/global-middleware) that allows conversations to be updated by other middleware. When receiving an event, middleware functions can use `context.updateConversation()` to set state and `context.conversation` to retrieve it. The built-in conversation store simply stores conversation state in memory. While this is sufficient for some situations, if there is more than one instance of your app running, the state will not be shared among the processes so you’ll want to implement a conversation store that fetches conversation state from a database. -
    ```javascript const app = new App({ diff --git a/docs/_advanced/custom_routes.md b/docs/content/advanced/custom-routes.md similarity index 90% rename from docs/_advanced/custom_routes.md rename to docs/content/advanced/custom-routes.md index 28c47b057..d4bc7595f 100644 --- a/docs/_advanced/custom_routes.md +++ b/docs/content/advanced/custom-routes.md @@ -1,11 +1,9 @@ --- -title: Adding Custom HTTP routes +title: Adding custom HTTP routes lang: en -slug: custom-routes -order: 10 +slug: /concepts/custom-routes --- -
    As of `v3.7.0`, custom HTTP routes can be easily added by passing in an array of routes as `customRoutes` when initializing `App`. Each `CustomRoute` object must contain three properties: `path`, `method`, and `handler`. `method`, which corresponds to the HTTP verb, can be either a string or an array of strings. @@ -13,7 +11,6 @@ Each `CustomRoute` object must contain three properties: `path`, `method`, and ` Since `v3.13.0`, the default built-in receivers (`HTTPReceiver` and `SocketModeReceiver`) support dynamic route parameters like [Express.js does](https://expressjs.com/en/guide/routing.html#route-parameters). With this, you can capture positional values in the URL for use in your route's handler via `req.params`. To determine what port the custom HTTP route will be available on locally, you can specify an `installerOptions.port` property in the `App` constructor. Otherwise, it will default to port `3000`. -
    ```javascript const { App } = require('@slack/bolt'); @@ -51,14 +48,14 @@ const app = new App({ })(); ``` -
    - -

    Custom ExpressReceiver routes

    +
    + +Custom ExpressReceiver routes -
    + Adding custom HTTP routes is quite straightforward when using Bolt’s built-in ExpressReceiver. Since `v2.1.0`, `ExpressReceiver` added a `router` property, which exposes the Express [Router](http://expressjs.com/en/4x/api.html#router) on which additional routes and middleware can be added. -
    + ```javascript const { App, ExpressReceiver } = require('@slack/bolt'); diff --git a/docs/_advanced/deferring_initialization.md b/docs/content/advanced/deferring-initialization.md similarity index 79% rename from docs/_advanced/deferring_initialization.md rename to docs/content/advanced/deferring-initialization.md index 36710f00f..303eae4b9 100644 --- a/docs/_advanced/deferring_initialization.md +++ b/docs/content/advanced/deferring-initialization.md @@ -1,15 +1,16 @@ --- -title: Deferring App initialization +title: Deferring app initialization lang: en -slug: deferring-initialization -order: 8 +slug: /concepts/deferring-initialization --- -
    Bolt offers a way to defer full initialization via the `deferInitialization` option and to call the equivalent `App#init()` in your code, putting more control over asynchronous execution required for initialization into your hands as the developer. -_Note: If you call `start()` before `init()`, Bolt will raise an exception._ -
    +:::info + +If you call `start()` before `init()`, Bolt will raise an exception._ + +::: ```javascript const { App } = require('@slack/bolt'); diff --git a/docs/_advanced/error_handling.md b/docs/content/advanced/error-handling.md similarity index 82% rename from docs/_advanced/error_handling.md rename to docs/content/advanced/error-handling.md index 25b3bcb2e..4cd94eaa7 100644 --- a/docs/_advanced/error_handling.md +++ b/docs/content/advanced/error-handling.md @@ -1,12 +1,14 @@ --- title: Handling errors lang: en -slug: error-handling -order: 1 +slug: /concepts/error-handling --- -
    -*Note: Since v2, error handling has improved! View the [migration guide for V2](https://slack.dev/bolt/tutorial/migration-v2) to learn about the changes.* +:::info + +Since v2, error handling has improved! View the [migration guide for V2](/tutorial/migration-v2) to learn about the changes. + +::: If an error occurs in a listener, it’s recommended you handle it directly with a `try`/`catch`. However, there still may be cases where errors slip through the cracks. By default, these errors will be logged to the console. To handle them yourself, you can attach a global error handler to your app with the `app.error(fn)` method. @@ -17,8 +19,11 @@ You can also define more focussed and specific error handlers for a variety of e - `unhandledRequestHandler`: triggered when a request from Slack goes unacknowledged. - `unhandledRequestTimeoutMillis`: the amount of time in milliseconds to wait for request acknowledgement from the application before triggering the `unhandledRequestHandler`. Default is `3001`. -*NOTE*: It is imperative that any custom Error Handlers defined in your app respond to the underlying Slack request that led to the error, using `response.writeHead()` to set the HTTP status code of the response and `response.end()` to dispatch the response back to Slack. See the example for details. -
    +:::info + +It is imperative that any custom Error Handlers defined in your app respond to the underlying Slack request that led to the error, using `response.writeHead()` to set the HTTP status code of the response and `response.end()` to dispatch the response back to Slack. See the example for details. + +::: ```javascript import { App, HTTPReceiver } from '@slack/bolt'; @@ -57,18 +62,16 @@ app.error(async (error) => { }); ``` -
    - -

    Accessing more data in the error handler

    +
    + +Accessing more data in the error handler -
    There may be cases where you need to log additional data from a request in the global error handler. Or you may simply wish to have access to the `logger` you've passed into Bolt. Starting with version 3.8.0, when passing `extendedErrorHandler: true` to the constructor, the error handler will receive an object with `error`, `logger`, `context`, and the `body` of the request. It is recommended to check whether a property exists on the `context` or `body` objects before accessing its value, as the data available in the `body` object differs from event to event, and because errors can happen at any point in a request's lifecycle (i.e. before a certain property of `context` has been set). -
    ```javascript const { App } = require('@slack/bolt'); @@ -88,5 +91,4 @@ app.error(async ({ error, logger, context, body }) => { } }); ``` -
    diff --git a/docs/_advanced/middleware_global.md b/docs/content/advanced/global-middleware.md similarity index 77% rename from docs/_advanced/middleware_global.md rename to docs/content/advanced/global-middleware.md index 4b2f84d30..038980b04 100644 --- a/docs/_advanced/middleware_global.md +++ b/docs/content/advanced/global-middleware.md @@ -1,17 +1,14 @@ --- title: Global middleware lang: en -slug: global-middleware -order: 5 +slug: /concepts/global-middleware --- -
    -Global middleware is run for all incoming requests before any [listener middleware](#listener-middleware). You can add any number of global middleware to your app by utilizing `app.use(fn)`. The middleware function `fn` is called with the same arguments as listeners and an additional `next` function. +Global middleware is run for all incoming requests before any [listener middleware](/concepts/listener-middleware). You can add any number of global middleware to your app by utilizing `app.use(fn)`. The middleware function `fn` is called with the same arguments as listeners and an additional `next` function. -Both global and [listener middleware](#listener-middleware) must call `await next()` to pass control of the execution chain to the next middleware, or call `throw` to pass an error back up the previously-executed middleware chain. +Both global and [listener middleware](/concepts/listener-middleware) must call `await next()` to pass control of the execution chain to the next middleware, or call `throw` to pass an error back up the previously-executed middleware chain. As an example, let's say your app should only respond to users identified with a corresponding internal authentication service (an SSO provider or LDAP, for example). You may define a global middleware that looks up a user record in the authentication service and errors if the user is not found. -
    ```javascript // Authentication middleware that associates incoming request with user in Acme identity provider diff --git a/docs/_advanced/middleware_listener.md b/docs/content/advanced/listener-middleware.md similarity index 76% rename from docs/_advanced/middleware_listener.md rename to docs/content/advanced/listener-middleware.md index bae3bd205..e7945449e 100644 --- a/docs/_advanced/middleware_listener.md +++ b/docs/content/advanced/listener-middleware.md @@ -1,19 +1,16 @@ --- title: Listener middleware lang: en -slug: listener-middleware -order: 6 +slug: /concepts/listener-middleware --- -
    Listener middleware is used for logic across many listener functions (but usually not all of them). They are added as arguments before the listener function in one of the built-in methods. You can add any number of listener middleware before the listener function. -There’s a collection of [built-in listener middleware](reference#built-in-listener-middleware-functions) that you can use like `directMention` which filters out any message that doesn’t directly @-mention your bot at the start of a message. +There’s a collection of [built-in listener middleware](/reference#built-in-listener-middleware-functions) that you can use like `directMention` which filters out any message that doesn’t directly @-mention your bot at the start of a message. But of course, you can write your own middleware for more custom functionality. While writing your own middleware, your function must call `await next()` to pass control to the next middleware, or `throw` to pass an error back up the previously-executed middleware chain. -As an example, let’s say your listener should only deal with messages from humans. You can write a listener middleware that excludes any bot messages. -
    +As an example, let’s say your listener should only deal with messages from humans. You can write a listener middleware th ```javascript // Listener middleware that filters out messages with 'bot_message' subtype diff --git a/docs/_advanced/logging.md b/docs/content/advanced/logging.md similarity index 88% rename from docs/_advanced/logging.md rename to docs/content/advanced/logging.md index 00e886f96..99291332c 100644 --- a/docs/_advanced/logging.md +++ b/docs/content/advanced/logging.md @@ -1,13 +1,10 @@ --- title: Logging lang: en -slug: logging -order: 8 +slug: /concepts/logging --- -
    By default, Bolt for JavaScript will log information from your app to the console. You can customize how much logging occurs by passing a `logLevel` in the constructor. The available log levels in order of most to least logs are `DEBUG`, `INFO`, `WARN`, and `ERROR`. -
    ```javascript // Import LogLevel from the package @@ -21,12 +18,11 @@ const app = new App({ }); ``` -
    - -

    Sending log output somewhere besides the console

    +
    + +Sending log output somewhere besides the console -
    If you want to send logs to somewhere besides the console or want more control over the logger, you can implement a custom logger. A custom logger must implement specific methods (known as the `Logger` interface): | Method | Parameters | Return type | @@ -40,7 +36,6 @@ If you want to send logs to somewhere besides the console or want more control o | `error()` | `...msgs: any[]` | `void` | A very simple custom logger might ignore the name and level, and write all messages to a file. -
    ```javascript const { App } = require('@slack/bolt'); @@ -62,5 +57,4 @@ const app = new App({ }, }); ``` -
    diff --git a/docs/_advanced/receiver.md b/docs/content/advanced/receiver.md similarity index 95% rename from docs/_advanced/receiver.md rename to docs/content/advanced/receiver.md index 68aea1776..3c1dcca47 100644 --- a/docs/_advanced/receiver.md +++ b/docs/content/advanced/receiver.md @@ -1,13 +1,10 @@ --- title: Customizing a receiver lang: en -slug: receiver -order: 9 +slug: /concepts/receiver --- -
    - -#### Writing a custom receiver +## Writing a custom receiver A receiver is responsible for handling and parsing any incoming requests from Slack then sending it to the app, so that the app can add context and pass the request to your listeners. Receivers must conform to the [Receiver interface](https://github.com/slackapi/bolt-js/blob/%40slack/bolt%403.13.1/src/types/receiver.ts#L27-L31): @@ -26,11 +23,11 @@ For a more in-depth look at a receiver, [read the source code for the built-in ` --- -#### Customizing built-in receivers +## Customizing built-in receivers -The built-in `HTTPReceiver`, `ExpressReceiver`, `AwsLambdaReceiver` and `SocketModeReceiver` accept several configuration options. For a full list of options, see the [Receiver options reference](/bolt-js/reference#receiver-options). +The built-in `HTTPReceiver`, `ExpressReceiver`, `AwsLambdaReceiver` and `SocketModeReceiver` accept several configuration options. For a full list of options, see the [Receiver options reference](/reference#receiver-options). -##### Extracting custom properties +### Extracting custom properties Use the `customPropertiesExtractor` option to extract custom properties from incoming events. The event type depends on the type of receiver you are using, e.g. HTTP requests for `HTTPReceiver`s, websocket messages for `SocketModeReceiver`s. @@ -66,7 +63,7 @@ app.use(async ({ logger, context, next }) => { ``` You can find [more examples of extracting custom properties](https://github.com/slackapi/bolt-js/tree/%40slack/bolt%403.13.1/examples/custom-properties) from different types of receivers here. -
    + ```javascript import { createServer } from 'http'; diff --git a/docs/_advanced/token_rotation.md b/docs/content/advanced/token-rotation.md similarity index 77% rename from docs/_advanced/token_rotation.md rename to docs/content/advanced/token-rotation.md index da17d1e11..67fcb6f4b 100644 --- a/docs/_advanced/token_rotation.md +++ b/docs/content/advanced/token-rotation.md @@ -1,16 +1,14 @@ --- title: Token rotation lang: en -slug: token-rotation -order: 3 +slug: /concepts/token-rotation --- -
    Supported in Bolt for JavaScript as of v3.5.0, token rotation provides an extra layer of security for your access tokens and is defined by the [OAuth V2 RFC](https://datatracker.ietf.org/doc/html/rfc6749#section-10.4). Instead of an access token representing an existing installation of your Slack app indefinitely, with token rotation enabled, access tokens expire. A refresh token acts as a long-lived way to refresh your access tokens. -Bolt for JavaScript supports and will handle token rotation automatically so long as the [built-in OAuth](https://slack.dev/bolt-js/concepts#authenticating-oauth) functionality is used. +Bolt for JavaScript supports and will handle token rotation automatically so long as the [built-in OAuth](/concepts/authenticating-oauth) functionality is used. For more information about token rotation, please see the [documentation](https://api.slack.com/authentication/rotation). -
    + diff --git a/docs/_basic/acknowledging_requests.md b/docs/content/basic/acknowledge.md similarity index 95% rename from docs/_basic/acknowledging_requests.md rename to docs/content/basic/acknowledge.md index 877c2e5cc..8e36b1d47 100644 --- a/docs/_basic/acknowledging_requests.md +++ b/docs/content/basic/acknowledge.md @@ -1,15 +1,12 @@ --- title: Acknowledging requests lang: en -slug: acknowledge -order: 7 +slug: /concepts/acknowledge --- -
    Actions, commands, and options requests must **always** be acknowledged using the `ack()` function. This lets Slack know that the request was received and updates the Slack user interface accordingly. Depending on the type of request, your acknowledgement may be different. For example, when acknowledging a modal submission you will call `ack()` with validation errors if the submission contains errors, or with no parameters if the submission is valid. We recommend calling `ack()` right away before sending a new message or fetching information from your database since you only have 3 seconds to respond. -
    ```javascript // Regex to determine if this is a valid email @@ -32,4 +29,4 @@ app.view('ticket_submit', async ({ ack, view }) => { }); } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/listening_actions.md b/docs/content/basic/action-listening.md similarity index 66% rename from docs/_basic/listening_actions.md rename to docs/content/basic/action-listening.md index 9ce2112c2..e61b50c32 100644 --- a/docs/_basic/listening_actions.md +++ b/docs/content/basic/action-listening.md @@ -1,22 +1,22 @@ --- title: Listening to actions lang: en -slug: action-listening -order: 5 +slug: /concepts/action-listening --- -
    Your app can listen to user actions like button clicks, and menu selects, using the `action` method. Actions can be filtered on an `action_id` of type string or RegExp object. `action_id`s act as unique identifiers for interactive components on the Slack platform. -You’ll notice in all `action()` examples, `ack()` is used. It is required to call the `ack()` function within an action listener to acknowledge that the request was received from Slack. This is discussed in the [acknowledging requests section](#acknowledge). +You’ll notice in all `action()` examples, `ack()` is used. It is required to call the `ack()` function within an action listener to acknowledge that the request was received from Slack. This is discussed in the [acknowledging requests section](/concepts/acknowledge). -*Note: Since v2, message shortcuts (previously message actions) now use the `shortcut()` method instead of the `action()` method. View the [migration guide for V2](https://slack.dev/bolt/tutorial/migration-v2) to learn about the changes.* +:::info -Learn more about the `block_actions` payload, [here](https://api.slack.com/reference/interaction-payloads). To access the full payload of a view from within a listener, reference the `body` argument within your callback function. +Since v2, message shortcuts (previously message actions) now use the `shortcut()` method instead of the `action()` method. View the [migration guide for V2](/tutorial/migration-v2) to learn about the changes. -
    +::: + +View more information about the `block_actions` payload within the [relevant API documentation page](https://api.slack.com/reference/interaction-payloads). To access the full payload of a view from within a listener, reference the `body` argument within your callback function. ```javascript // Your listener function will be called every time an interactive component with the action_id "approve_button" is triggered @@ -26,14 +26,12 @@ app.action('approve_button', async ({ ack }) => { }); ``` -
    - -

    Listening to actions using a constraint object

    +
    + +Listening to actions using a constraint object -
    You can use a constraints object to listen to `callback_id`s, `block_id`s, and `action_id`s (or any combination of them). Constraints in the object can be of type string or RegExp object. -
    ```javascript // Your listener function will only be called when the action_id matches 'select_user' AND the block_id matches 'assign_ticket' @@ -58,4 +56,4 @@ app.action({ action_id: 'select_user', block_id: 'assign_ticket' }, }); ``` -
    +
    \ No newline at end of file diff --git a/docs/_basic/responding_actions.md b/docs/content/basic/action-respond.md similarity index 84% rename from docs/_basic/responding_actions.md rename to docs/content/basic/action-respond.md index 9368865ea..958471935 100644 --- a/docs/_basic/responding_actions.md +++ b/docs/content/basic/action-respond.md @@ -1,15 +1,12 @@ --- title: Responding to actions lang: en -slug: action-respond -order: 6 +slug: /concepts/action-respond --- -
    There are two main ways to respond to actions. The first (and most common) way is to use the `say` function. The `say` function sends a message back to the conversation where the incoming request took place. The second way to respond to actions is using `respond()`, which is a simple utility to use the `response_url` associated with an action. -
    ```javascript // Your middleware will be called every time an interactive component with the action_id “approve_button” is triggered @@ -20,14 +17,12 @@ app.action('approve_button', async ({ ack, say }) => { }); ``` -
    - -

    Using respond()

    +
    + +Using `respond()` -
    Since `respond()` is a utility for calling the `response_url`, it behaves in the same way. You can pass a JSON object with a new message payload that will be published back to the source of the original interaction with optional properties like `response_type` (which has a value of `in_channel` or `ephemeral`), `replace_original`, and `delete_original`. -
    ```javascript // Listens to actions triggered with action_id of “user_select” @@ -38,5 +33,4 @@ app.action('user_select', async ({ action, ack, respond }) => { } }); ``` -
    diff --git a/docs/_basic/authenticating_oauth.md b/docs/content/basic/authenticating-oauth.md similarity index 88% rename from docs/_basic/authenticating_oauth.md rename to docs/content/basic/authenticating-oauth.md index 769bd60c9..5726a8329 100644 --- a/docs/_basic/authenticating_oauth.md +++ b/docs/content/basic/authenticating-oauth.md @@ -1,11 +1,9 @@ --- title: Authenticating with OAuth lang: en -slug: authenticating-oauth -order: 15 +slug: /concepts/authenticating-oauth --- -
    To prepare your Slack app for distribution, you will need to enable Bolt OAuth and store installation information securely. Bolt supports OAuth and will handle the rest of the work; this includes setting up OAuth routes, state verification, and passing your app an installation object which you must store. To enable OAuth, you must provide: @@ -14,7 +12,7 @@ To enable OAuth, you must provide: --- -##### Development and Testing +## Development and Testing We've provided a default implementation of the `installationStore` `FileInstallationStore` which you can use during app development and testing. @@ -30,14 +28,23 @@ const app = new App({ installationStore: new FileInstallationStore(), }); ``` -:warning: This is **_not_** recommended for use in production - you should implement your own production store. Please see the example code to the right and [our other examples](https://github.com/slackapi/bolt-js/tree/main/examples/oauth). +:::warning + +This is **_not_** recommended for use in production - you should implement your own production store. Please see the example code to the right and [our other examples](https://github.com/slackapi/bolt-js/tree/main/examples/oauth). + +::: --- -##### Installing your App +## Installing your App * **Initiating an installation**: Bolt for JavaScript provides an **Install Path** `/slack/install` out-of-the-box. This endpoint returns a simple page with an `Add to Slack` button which initiates a direct install of your app (with a valid `state` parameter). An app hosted at _www.example.com_ would serve the install page at _www.example.com/slack/install_. - * 💡 You can skip rendering the provided default webpage and navigate users directly to Slack authorize URL by setting`installerOptions.directInstall: true` in the `App` constructor ([example](https://github.com/slackapi/bolt-js/blob/5b4d9ceb65e6bf5cf29dfa58268ea248e5466bfb/examples/oauth/app.js#L58-L64)). + +:::tip + +You can skip rendering the provided default webpage and navigate users directly to Slack authorize URL by setting`installerOptions.directInstall: true` in the `App` constructor ([example](https://github.com/slackapi/bolt-js/blob/5b4d9ceb65e6bf5cf29dfa58268ea248e5466bfb/examples/oauth/app.js#L58-L64)). + +::: * **Add to Slack**: The `Add to Slack` button initiates the OAuth process with Slack. After users have clicked Allow to grant your app permissions, Slack will call your app's **Redirect URI** (provided out-of-the-box), and prompt users to **Open Slack**. See the **Redirect URI** section below for customization options. @@ -45,14 +52,17 @@ const app = new App({ * If you need additional authorizations (user tokens) from users inside a team when your app is already installed, or have a reason to dynamically generate an install URL, manually instantiate an `ExpressReceiver`, assign the instance to a variable named `receiver`, and then call `receiver.installer.generateInstallUrl()`. Read more about `generateInstallUrl()` in the [OAuth docs](https://slack.dev/node-slack-sdk/oauth#generating-an-installation-url). -* 💡 Bolt for JavaScript does not support OAuth for [custom receivers](#receiver). If you're implementing a custom receiver, you can use our [Slack OAuth library](https://slack.dev/node-slack-sdk/oauth#slack-oauth), which is what Bolt for JavaScript uses under the hood. +:::info + +Bolt for JavaScript does not support OAuth for [custom receivers](/concepts/receiver). If you're implementing a custom receiver, you can use our [Slack OAuth library](https://slack.dev/node-slack-sdk/oauth#slack-oauth), which is what Bolt for JavaScript uses under the hood. +::: --- -##### Redirect URI +## Redirect URI Bolt for JavaScript provides a **Redirect URI Path** `/slack/oauth_redirect`. Slack uses the Redirect URI to redirect users after they complete an app's installation flow. -💡 You will need to add the full **Redirect URI** including your app domain in your Slack app configuration settings under **OAuth and Permissions**, e.g. `https://example.com/slack/oauth_redirect`. +You will need to add the full **Redirect URI** including your app domain in your Slack app configuration settings under **OAuth and Permissions**, e.g. `https://example.com/slack/oauth_redirect`. To supply your own custom **Redirect URI**, you can set `redirectUri` in the App options and `installerOptions.redirectUriPath`. You must supply both, and the path must be consistent with the full URI. @@ -71,7 +81,8 @@ const app = new App({ ``` --- -##### Installation object + +## Installation object Bolt will pass your `installationStore`'s `storeInstallation` handler an `installation`. This can be a source of confusion for developers who aren't sure what shape of object to expect. The `installation` object should resemble: ```javascript @@ -106,14 +117,13 @@ Bolt will pass your `fetchInstallation` and `deleteInstallation` handlers an `in ``` --- -##### Org-wide installation +## Org-wide installation To add support for [org-wide installations](https://api.slack.com/enterprise/apps), you will need Bolt for JavaScript version `3.0.0` or later. Make sure you have enabled org-wide installation in your app configuration settings under **Org Level Apps**. Installing an [org-wide](https://api.slack.com/enterprise/apps) app from admin pages requires additional configuration to work with Bolt. In that scenario, the recommended `state` parameter is not supplied. Bolt will try to verify `state` and stop the installation from progressing. You may disable state verification in Bolt by setting the `stateVerification` option to false. See the example setup below: - ```javascript const app = new App({ signingSecret: process.env.SLACK_SIGNING_SECRET, @@ -128,8 +138,6 @@ const app = new App({ To learn more about the OAuth installation flow with Slack, [read the API documentation](https://api.slack.com/authentication/oauth-v2). -
    - ```javascript const database = { async get(key) {}, @@ -187,12 +195,11 @@ const app = new App({ }); ``` -
    - -

    Customizing OAuth defaults

    +
    + +Customizing OAuth defaults -
    We provide several options for customizing default OAuth using the `installerOptions` object, which can be passed in during the initialization of `App`. You can override the following: - `authVersion`: Used to toggle between new Slack Apps and Classic Slack Apps @@ -203,8 +210,6 @@ We provide several options for customizing default OAuth using the `installerOpt - `stateStore`: Provide a custom state store instead of using the built in `ClearStateStore` - `userScopes`: Array of user scopes needed when the user installs the app, similar to `scopes` attribute at the parent level. -
    - ```javascript const app = new App({ signingSecret: process.env.SLACK_SIGNING_SECRET, @@ -251,5 +256,4 @@ const app = new App({ } }); ``` - -
    +
    \ No newline at end of file diff --git a/docs/_basic/listening_responding_commands.md b/docs/content/basic/commands.md similarity index 76% rename from docs/_basic/listening_responding_commands.md rename to docs/content/basic/commands.md index 590ecf9a2..c16d8ad89 100644 --- a/docs/_basic/listening_responding_commands.md +++ b/docs/content/basic/commands.md @@ -1,21 +1,22 @@ --- title: Listening and responding to commands lang: en -slug: commands -order: 9 +slug: /concepts/commands --- -
    Your app can use the `command()` method to listen to incoming slash command requests. The method requires a `commandName` of type string or RegExp. -⚠️ Note that if you use `command()` multiple times with overlapping RegExp matches, _all_ matching listeners will run. Design your regular expressions to avoid this possibility. +:::warning + +If you use `command()` multiple times with overlapping RegExp matches, _all_ matching listeners will run. Design your regular expressions to avoid this possibility. + +::: Commands must be acknowledged with `ack()` to inform Slack your app has received the request. -There are two ways to respond to slash commands. The first way is to use `say()`, which accepts a string or JSON payload. The second is `respond()` which is a utility for the `response_url`. These are explained in more depth in the [responding to actions](#action-respond) section. +There are two ways to respond to slash commands. The first way is to use `say()`, which accepts a string or JSON payload. The second is `respond()` which is a utility for the `response_url`. These are explained in more depth in the [responding to actions](/concepts/action-respond) section. When configuring commands within your app configuration, you'll continue to append `/slack/events` to your request URL. -
    ```javascript // The echo command simply echoes on command @@ -25,4 +26,4 @@ app.command('/echo', async ({ command, ack, respond }) => { await respond(`${command.text}`); }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/opening_modals.md b/docs/content/basic/creating-modals.md similarity index 67% rename from docs/_basic/opening_modals.md rename to docs/content/basic/creating-modals.md index f55fe86b2..51df237c7 100644 --- a/docs/_basic/opening_modals.md +++ b/docs/content/basic/creating-modals.md @@ -1,17 +1,14 @@ --- title: Opening modals lang: en -slug: creating-modals -order: 10 +slug: /concepts/creating-modals --- -
    -Modals are focused surfaces that allow you to collect user data and display dynamic information. You can open a modal by passing a valid trigger_id and a view payload to the built-in client's views.open method. +[Modals](https://api.slack.com/block-kit/surfaces/modals) are focused surfaces that allow you to collect user data and display dynamic information. You can open a modal by passing a valid `trigger_id` and a [view payload](https://api.slack.com/reference/block-kit/views) to the built-in client's [`views.open`](https://api.slack.com/methods/views.open) method. -Your app receives trigger_ids in payloads sent to your Request URL triggered user invocation like a slash command, button press, or interaction with a select menu. +Your app receives `trigger_id` parameters in payloads sent to your Request URL triggered user invocation like a slash command, button press, or interaction with a select menu. -Read more about modal composition in the API documentation. -
    +Read more about modal composition in the [API documentation](https://api.slack.com/surfaces/modals/using#composing_views) ```javascript // Listen for a slash command invocation @@ -75,4 +72,4 @@ app.command('/ticket', async ({ ack, body, client, logger }) => { logger.error(error); } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/listening_events.md b/docs/content/basic/event-listening.md similarity index 86% rename from docs/_basic/listening_events.md rename to docs/content/basic/event-listening.md index 4e898d3f2..b71ad2298 100644 --- a/docs/_basic/listening_events.md +++ b/docs/content/basic/event-listening.md @@ -1,15 +1,12 @@ --- title: Listening to events lang: en -slug: event-listening -order: 3 +slug: /concepts/event-listening --- -
    You can listen to [any Events API event](https://api.slack.com/events) using the `event()` method after subscribing to it in your app configuration. This allows your app to take action when something happens in Slack, like a user reacting to a message or joining a channel. The `event()` method requires an `eventType` of type string. -
    ```javascript const welcomeChannelId = 'C12345'; @@ -30,16 +27,14 @@ app.event('team_join', async ({ event, client, logger }) => { }); ``` -
    - -

    Filtering on message subtypes

    +
    + +Filtering on message subtypes -
    A `message()` listener is equivalent to `event('message')` You can filter on subtypes of events by using the built-in `subtype()` middleware. Common message subtypes like `message_changed` and `message_replied` can be found [on the message event page](https://api.slack.com/events/message#message_subtypes). -
    ```javascript // Import subtype from the package @@ -55,5 +50,4 @@ app.message(subtype('message_changed'), ({ event, logger }) => { } }); ``` - -
    +
    \ No newline at end of file diff --git a/docs/_basic/listening_messages.md b/docs/content/basic/message-listening.md similarity index 81% rename from docs/_basic/listening_messages.md rename to docs/content/basic/message-listening.md index bb4d01731..8a8b6f479 100644 --- a/docs/_basic/listening_messages.md +++ b/docs/content/basic/message-listening.md @@ -1,15 +1,12 @@ --- title: Listening to messages lang: en -slug: message-listening -order: 1 +slug: /concepts/message-listening --- -
    To listen to messages that [your app has access to receive](https://api.slack.com/messaging/retrieving#permissions), you can use the `message()` method which filters out events that aren’t of type `message`. `message()` accepts an optional `pattern` parameter of type `string` or `RegExp` object which filters out any messages that don’t match the pattern. -
    ```javascript // This will match any message that contains 👋 @@ -24,16 +21,14 @@ app.message(':wave:', async ({ message, say }) => { }); ``` -
    - -

    Using a RegExp pattern

    +
    + +Using a RegExp pattern -
    A RegExp pattern can be used instead of a string for more granular matching. All of the results of the RegExp match will be in `context.matches`. -
    ```javascript app.message(/^(hi|hello|hey).*/, async ({ context, say }) => { @@ -43,5 +38,4 @@ app.message(/^(hi|hello|hey).*/, async ({ context, say }) => { await say(`${greeting}, how are you?`); }); ``` - -
    +
    \ No newline at end of file diff --git a/docs/_basic/sending_messages.md b/docs/content/basic/message-sending.md similarity index 86% rename from docs/_basic/sending_messages.md rename to docs/content/basic/message-sending.md index c3181dfea..cbe4bc912 100644 --- a/docs/_basic/sending_messages.md +++ b/docs/content/basic/message-sending.md @@ -1,15 +1,12 @@ --- title: Sending messages lang: en -slug: message-sending -order: 2 +slug: /concepts/message-sending --- -
    Within your listener function, `say()` is available whenever there is an associated conversation (for example, a conversation where the event or action which triggered the listener occurred). `say()` accepts a string to post simple messages and JSON payloads to send more complex messages. The message payload you pass in will be sent to the associated conversation. -In the case that you'd like to send a message outside of a listener or you want to do something more advanced (like handle specific errors), you can call `chat.postMessage` [using the client attached to your Bolt instance](#web-api). -
    +In the case that you'd like to send a message outside of a listener or you want to do something more advanced (like handle specific errors), you can call `chat.postMessage` [using the client attached to your Bolt instance](/concepts/web-api). ```javascript // Listens for messages containing "knock knock" and responds with an italicized "who's there?" @@ -18,16 +15,14 @@ app.message('knock knock', async ({ message, say }) => { }); ``` -
    - -

    Sending a message with blocks

    +
    + +Sending a message with blocks -
    `say()` accepts more complex message payloads to make it easy to add functionality and structure to your messages. To explore adding rich message layouts to your app, read through [the guide on our API site](https://api.slack.com/messaging/composing/layouts) and look through templates of common app flows [in the Block Kit Builder](https://api.slack.com/tools/block-kit-builder?template=1). -
    ```javascript // Sends a section block with datepicker when someone reacts with a 📅 emoji @@ -54,4 +49,4 @@ app.event('reaction_added', async ({ event, say }) => { } }); ``` -
    +
    \ No newline at end of file diff --git a/docs/_basic/listening_responding_options.md b/docs/content/basic/options.md similarity index 87% rename from docs/_basic/listening_responding_options.md rename to docs/content/basic/options.md index 4bc1f70ec..475e554e5 100644 --- a/docs/_basic/listening_responding_options.md +++ b/docs/content/basic/options.md @@ -1,19 +1,16 @@ --- title: Listening and responding to options lang: en -slug: options -order: 14 +slug: /concepts/options --- -
    -The `options()` method listens for incoming option request payloads from Slack. [Similar to `action()`](#action-listening), +The `options()` method listens for incoming option request payloads from Slack. [Similar to `action()`](/concepts/action-listening), an `action_id` or constraints object is required. -While it's recommended to use `action_id` for `external_select` menus, dialogs do not yet support Block Kit so you'll have to +While it's recommended to use `action_id` for `external_select` menus, dialogs do not yet support Block Kit so you'll have to use the constraints object to filter on a `callback_id`. To respond to options requests, you'll need to `ack()` with valid options. Both [external select response examples](https://api.slack.com/reference/messaging/block-elements#external_select) and [dialog response examples](https://api.slack.com/legacy/dialogs#dynamic_select_elements_external) can be found on our API site. -
    ```javascript // Example of responding to an external_select options request diff --git a/docs/_basic/publishing_views.md b/docs/content/basic/publishing-views.md similarity index 60% rename from docs/_basic/publishing_views.md rename to docs/content/basic/publishing-views.md index 68118b429..74c102032 100644 --- a/docs/_basic/publishing_views.md +++ b/docs/content/basic/publishing-views.md @@ -1,15 +1,12 @@ --- title: Publishing views to App Home lang: en -slug: publishing-views -order: 13 +slug: /concepts/publishing-views --- -
    -Home tabs are customizable surfaces accessible via the sidebar and search that allow apps to display views on a per-user basis. After enabling App Home within your app configuration, home tabs can be published and updated by passing a `user_id` and view payload to the `views.publish` method. +[Home tabs](https://api.slack.com/surfaces/tabs/using) are customizable surfaces accessible via the sidebar and search that allow apps to display views on a per-user basis. After enabling App Home within your app configuration, home tabs can be published and updated by passing a `user_id` and [view payload](https://api.slack.com/reference/block-kit/views) to the [`views.publish`](https://api.slack.com/methods/views.publish) method. -You can subscribe to the `app_home_opened` event to listen for when users open your App Home. -
    +You can subscribe to the [`app_home_opened`](https://api.slack.com/events/app_home_opened) event to listen for when users open your App Home. ```javascript // Listen for users opening your App Home @@ -47,4 +44,4 @@ app.event('app_home_opened', async ({ event, client, logger }) => { logger.error(error); } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/listening_responding_shortcuts.md b/docs/content/basic/shortcuts.md similarity index 78% rename from docs/_basic/listening_responding_shortcuts.md rename to docs/content/basic/shortcuts.md index 769fbfb2d..4ff2bcf6c 100644 --- a/docs/_basic/listening_responding_shortcuts.md +++ b/docs/content/basic/shortcuts.md @@ -1,27 +1,30 @@ --- title: Listening and responding to shortcuts lang: en -slug: shortcuts -order: 8 +slug: /concepts/shortcuts --- -
    - The `shortcut()` method supports both [global shortcuts](https://api.slack.com/interactivity/shortcuts/using#global_shortcuts) and [message shortcuts](https://api.slack.com/interactivity/shortcuts/using#message_shortcuts). -Shortcuts are invokable entry points to apps. Global shortcuts are available from within search in Slack. Message shortcuts are available in the context menus of messages. Your app can use the `shortcut()` method to listen to incoming shortcut requests. The method requires a `callback_id` parameter of type `string` or `RegExp`. +Shortcuts are invocable entry points to apps. Global shortcuts are available from within search in Slack. Message shortcuts are available in the context menus of messages. Your app can use the `shortcut()` method to listen to incoming shortcut requests. The method requires a `callback_id` parameter of type `string` or `RegExp`. + +:::warning + +If you use `shortcut()` multiple times with overlapping RegExp matches, _all_ matching listeners will run. Design your regular expressions to avoid this possibility. -⚠️ Note that if you use `shortcut()` multiple times with overlapping RegExp matches, _all_ matching listeners will run. Design your regular expressions to avoid this possibility. +::: Shortcuts must be acknowledged with `ack()` to inform Slack that your app has received the request. -Shortcuts include a `trigger_id` which an app can use to [open a modal](#creating-modals) that confirms the action the user is taking. +Shortcuts include a `trigger_id` which an app can use to [open a modal](/concepts/creating-modals) that confirms the action the user is taking. When configuring shortcuts within your app configuration, you'll continue to append `/slack/events` to your request URL. -⚠️ Note that global shortcuts do **not** include a channel ID. If your app needs access to a channel ID, you may use a [`conversations_select`](https://api.slack.com/reference/block-kit/block-elements#conversation_select) element within a modal. Message shortcuts do include channel ID. +:::warning -
    +Global shortcuts do **not** include a channel ID. If your app needs access to a channel ID, you may use a [`conversations_select`](https://api.slack.com/reference/block-kit/block-elements#conversation_select) element within a modal. Message shortcuts do include channel ID. + +::: ```javascript // The open_modal shortcut opens a plain old modal @@ -73,15 +76,13 @@ app.shortcut('open_modal', async ({ shortcut, ack, client, logger }) => { }); ``` -
    - -

    Listening to shortcuts using a constraint object

    +
    + + Listening to shortcuts using a constraint object -
    - You can use a constraints object to listen to `callback_id`s, and `type`s. Constraints in the object can be of type string or RegExp object. -
    - + You can use a constraints object to listen to `callback_id` and `type` values. Constraints in the object can be of type string or RegExp object. + ```javascript // Your middleware will only be called when the callback_id matches 'open_modal' AND the type matches 'message_action' app.shortcut({ callback_id: 'open_modal', type: 'message_action' }, async ({ shortcut, ack, client, logger }) => { @@ -130,5 +131,4 @@ app.shortcut('open_modal', async ({ shortcut, ack, client, logger }) => { } }); ``` - -
    +
    \ No newline at end of file diff --git a/docs/_basic/socket_mode.md b/docs/content/basic/socket-mode.md similarity index 85% rename from docs/_basic/socket_mode.md rename to docs/content/basic/socket-mode.md index aec09d616..88b56e153 100644 --- a/docs/_basic/socket_mode.md +++ b/docs/content/basic/socket-mode.md @@ -1,15 +1,12 @@ --- title: Using Socket Mode lang: en -slug: socket-mode -order: 16 +slug: /concepts/socket-mode --- -
    [Socket Mode](https://api.slack.com/socket-mode) allows your app to connect and receive data from Slack via a WebSocket connection. To handle the connection, Bolt for JavaScript includes a `SocketModeReceiver` (in `@slack/bolt@3.0.0` and higher). Before using Socket Mode, be sure to enable it within your app configuration. To use the `SocketModeReceiver`, just pass in `socketMode:true` and `appToken:YOUR_APP_TOKEN` when initializing `App`. You can get your App Level Token in your app configuration under the **Basic Information** section. -
    ```javascript const { App } = require('@slack/bolt'); @@ -26,16 +23,13 @@ const app = new App({ })(); ``` -
    - -

    Custom SocketMode Receiver

    +
    + +Custom SocketMode Receiver -
    You can define a custom `SocketModeReceiver` by importing it from `@slack/bolt`. -
    - ```javascript const { App, SocketModeReceiver } = require('@slack/bolt'); @@ -61,4 +55,4 @@ const app = new App({ })(); ``` -
    +
    \ No newline at end of file diff --git a/docs/content/basic/updating-pushing-views.md b/docs/content/basic/updating-pushing-views.md new file mode 100644 index 000000000..485678af1 --- /dev/null +++ b/docs/content/basic/updating-pushing-views.md @@ -0,0 +1,66 @@ +--- +title: Updating and pushing views +lang: en +slug: /concepts/updating-pushing-views +--- + +Modals contain a stack of views. When you call [`views.open`](https://api.slack.com/methods/views.open), you add the root view to the modal. After the initial call, you can dynamically update a view by calling [`views.update`](https://api.slack.com/methods/views.update), or stack a new view on top of the root view by calling [`views.push`](https://api.slack.com/methods/views.push). + +**`views.update`** + +To update a view, you can use the built-in client to call `views.update` with the `view_id` that was generated when you opened the view, and a new `view` including the updated `blocks` array. If you're updating the view when a user interacts with an element inside of an existing view, the `view_id` will be available in the `body` of the request. + +**`views.push`** + +To push a new view onto the view stack, you can use the built-in client to call `views.push` with a valid `trigger_id` a new [view payload](https://api.slack.com/reference/block-kit/views). The arguments for `views.push` is the same as [opening modals](/concepts/creating-modals). After you open a modal, you may only push two additional views onto the view stack. + +Learn more about updating and pushing views in our [API documentation](https://api.slack.com/surfaces/modals/using#modifying) + +```javascript +// Listen for a button invocation with action_id `button_abc` (assume it's inside of a modal) +app.action('button_abc', async ({ ack, body, client, logger }) => { + // Acknowledge the button request + await ack(); + + try { + if (body.type !== 'block_actions' || !body.view) { + return; + } + // Call views.update with the built-in client + const result = await client.views.update({ + // Pass the view_id + view_id: body.view.id, + // Pass the current hash to avoid race conditions + hash: body.view.hash, + // View payload with updated blocks + view: { + type: 'modal', + // View identifier + callback_id: 'view_1', + title: { + type: 'plain_text', + text: 'Updated modal' + }, + blocks: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'You updated the modal!' + } + }, + { + type: 'image', + image_url: 'https://media.giphy.com/media/SVZGEcYt7brkFUyU90/giphy.gif', + alt_text: 'Yay! The modal was updated' + } + ] + } + }); + logger.info(result); + } + catch (error) { + logger.error(error); + } +}); +``` \ No newline at end of file diff --git a/docs/_basic/listening_modals.md b/docs/content/basic/view-submissions.md similarity index 94% rename from docs/_basic/listening_modals.md rename to docs/content/basic/view-submissions.md index 710e7a47f..1a51d34c3 100644 --- a/docs/_basic/listening_modals.md +++ b/docs/content/basic/view-submissions.md @@ -1,12 +1,9 @@ --- title: Listening to views lang: en -slug: view-submissions -order: 12 +slug: /concepts/view-submissions --- -
    - You may listen for user interactions with views using the `view` method. Slack will send a `view_submission` request when a user submits a view. To receive the values submitted in [view](https://api.slack.com/reference/interaction-payloads/views) input blocks, you can access the `state` object. `state` contains a `values` object that uses the `block_id` and unique `action_id` to store the input values. @@ -17,7 +14,7 @@ To listen to either a `view_submission` request or `view_closed` request, you ca --- -##### Update views on submission +## Update views on submission To update a view in response to a `view_submission` request, you may pass a `response_action` of type `update` with a newly composed `view` to display in your acknowledgement. @@ -36,12 +33,14 @@ Read more about view submissions in our [API documentation](https://api.slack.co --- -##### Handling views on close +## Handling views on close 💡 When listening for `view_closed` requests, you must pass an object containing `type: 'view_closed'` and the view `callback_id`. See below for an example of this: See the [API documentation](https://api.slack.com/surfaces/modals/using#modal_cancellations) for more information about `view_closed`. +#### Handle a `view_closed` request + ```javascript // Handle a view_closed request app.view({ callback_id: 'view_b', type: 'view_closed' }, async ({ ack, body, view, client }) => { @@ -50,7 +49,8 @@ app.view({ callback_id: 'view_b', type: 'view_closed' }, async ({ ack, body, vie // react on close request }); ``` -
    + +#### Handle a `view_submission` request ```javascript // Handle a view_submission request @@ -88,4 +88,4 @@ app.view('view_b', async ({ ack, body, view, client, logger }) => { } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/web_api.md b/docs/content/basic/web-api.md similarity index 84% rename from docs/_basic/web_api.md rename to docs/content/basic/web-api.md index 03cca9c14..2a970d32c 100644 --- a/docs/_basic/web_api.md +++ b/docs/content/basic/web-api.md @@ -1,19 +1,16 @@ --- title: Using the Web API lang: en -slug: web-api -order: 4 +slug: /concepts/web-api --- -
    -You can call [any Web API method](https://api.slack.com/methods) using the [`WebClient`](https://slack.dev/node-slack-sdk/web-api) provided to your app's listeners as `client`. This uses either the token that initialized your app or the token that is returned from the [`authorize` function](#authorization) for the incoming event. The built-in [OAuth support](#authenticating-oauth) handles the second case by default. +You can call [any Web API method](https://api.slack.com/methods) using the [`WebClient`](https://slack.dev/node-slack-sdk/web-api) provided to your app's listeners as `client`. This uses either the token that initialized your app **or** the token that is returned from the [`authorize`](/concepts/authorization) function for the incoming event. The built-in [OAuth support](/concepts/authenticating-oauth) handles the second case by default. Your Bolt app also has a top-level `app.client` which you can manually pass the `token` parameter. If the incoming request is not authorized or you're calling a method from outside of a listener, use the top-level `app.client`. Calling one of the [`WebClient`](https://slack.dev/node-slack-sdk/web-api)'s methods will return a Promise containing the response from Slack, regardless of whether you use the top-level or listener's client. Since the introduction of [org wide app installations](https://api.slack.com/enterprise/apps), [some web-api methods](https://api.slack.com/enterprise/apps/changes-apis#methods) now require `team_id` to indicate which workspace to act on. Bolt for JavaScript will attempt to infer the `team_id` based on incoming payloads and pass it along to `client`. This is handy for existing applications looking to add support for org wide installations and not spend time updating all of these web-api calls. -
    ```javascript // Unix Epoch time for September 30, 2019 11:59:59 PM @@ -32,4 +29,4 @@ app.message('wake me up', async ({ message, client, logger }) => { logger.error(error); } }); -``` +``` \ No newline at end of file diff --git a/docs/content/custom-functions/creating-custom-functions.md b/docs/content/custom-functions/creating-custom-functions.md new file mode 100644 index 000000000..b3b6ec553 --- /dev/null +++ b/docs/content/custom-functions/creating-custom-functions.md @@ -0,0 +1,16 @@ +--- +title: Creating custom functions +lang: en +slug: /concepts/creating-custom-functions +--- + +Custom functions allow your app to create and process workflow steps that users can add in Workflow Builder. + +We recommend using custom functions as a replacement for the deprecated Workflow Steps from Apps. + +A custom function requires two components: + +* [A function definition in the app’s manifest](/concepts/defining-custom-functions) +* [A listener to handle the function execution event](/concepts/listening-to-custom-functions) + +Read more about custom functions in the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt). \ No newline at end of file diff --git a/docs/_functions/defining.md b/docs/content/custom-functions/defining-custom-functions.md similarity index 94% rename from docs/_functions/defining.md rename to docs/content/custom-functions/defining-custom-functions.md index 371dfa106..cb23aee97 100644 --- a/docs/_functions/defining.md +++ b/docs/content/custom-functions/defining-custom-functions.md @@ -1,20 +1,15 @@ --- title: Defining custom functions lang: en -slug: defining-custom-functions -order: 2 +slug: /concepts/defining-custom-functions --- -
    - To make a custom function available for use in Workflow Builder, the app’s manifest must contain a function definition. A function’s definition contains information about the function, including its `callback_id`, `input_parameters`, `output_parameters`, as well as display information. To learn more about defining a function, see the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt#define-function). -
    - ```json "functions": { "sample_function": { diff --git a/docs/_functions/listening.md b/docs/content/custom-functions/listening-to-custom-functions.md similarity index 76% rename from docs/_functions/listening.md rename to docs/content/custom-functions/listening-to-custom-functions.md index f16624cbb..21274fcb9 100644 --- a/docs/_functions/listening.md +++ b/docs/content/custom-functions/listening-to-custom-functions.md @@ -1,13 +1,10 @@ --- title: Listening to custom function executions lang: en -slug: listening-to-custom-functions -order: 3 +slug: /concepts/listening-to-custom-functions --- -
    - -When your custom function is executed as a step in a workflow, your app will receive a [`function_executed`](https://api.slack.com/events/function_executed) event. The callback provided to the `function()` method will be run when this event is received. +When your custom function is executed as a step in a workflow, your app will receive a `function_executed` event. The callback provided to the `function()` method will be run when this event is received. The callback is where you can access `inputs`, make third-party API calls, or set the output values that will be available to subsequent workflow steps by mapping values to the `outputs` object. @@ -15,9 +12,6 @@ Your app can call `complete()` to indicate that the function’s execution was s To learn more about listening to custom function executions, see the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt#listener). - -
    - ```js app.function('sample_function', async ({ client, inputs, fail }) => { try { @@ -28,5 +22,4 @@ app.function('sample_function', async ({ client, inputs, fail }) => { fail({ error: `Failed to handle a function request: ${error}` }); } }); -``` - +``` \ No newline at end of file diff --git a/docs/_functions/responding.md b/docs/content/custom-functions/responding-to-interactivity.md similarity index 63% rename from docs/_functions/responding.md rename to docs/content/custom-functions/responding-to-interactivity.md index 8e7425e7b..422f41929 100644 --- a/docs/_functions/responding.md +++ b/docs/content/custom-functions/responding-to-interactivity.md @@ -1,24 +1,19 @@ --- title: Responding to interactivity lang: en -slug: responding-to-interactivity -order: 4 +slug: /concepts/responding-to-interactivity --- -
    - -Interactive elements provided to the user, via message or modal, from within the `function()` method’s callback are associated with that unique `function_executed` event. This association allows for the completion of functions at a later time, like once the user has clicked a button. +Interactive elements provided to the user from within the `function()` method’s callback are associated with that unique `function_executed` event. This association allows for the completion of functions at a later time, like once the user has clicked a button. Incoming actions that are associated with a function have the same `inputs`, `complete`, and `fail` utilities as offered by the `function()` method. To learn more about responding to interactivity, see the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt#interactivity). -
    - ```js // If associated with a function, function-specific utilities are made available app.action('approve_button', async ({ complete, fail }) => { // Signal the function has completed once the button is clicked await complete({ outputs: { message: 'Request approved 👍' } }); }); -``` +``` \ No newline at end of file diff --git a/docs/_deployments/aws-lambda.md b/docs/content/deployments/aws-lambda.md similarity index 60% rename from docs/_deployments/aws-lambda.md rename to docs/content/deployments/aws-lambda.md index 45e6fe643..0a5e0012b 100644 --- a/docs/_deployments/aws-lambda.md +++ b/docs/content/deployments/aws-lambda.md @@ -1,32 +1,33 @@ --- -title: AWS Lambda -order: 0 -slug: aws-lambda +title: Deploying to AWS Lambda lang: en -layout: tutorial -permalink: /deployments/aws-lambda --- -# Deploying to AWS Lambda -
    -This guide walks you through preparing and deploying a Slack app using [Bolt for JavaScript][bolt-js], the [Serverless Framework][serverless-framework], and [AWS Lambda][aws-lambda]. -
    +This guide walks you through preparing and deploying a Slack app using Bolt for JavaScript, the [Serverless Framework](https://serverless.com/), and [AWS Lambda](https://aws.amazon.com/lambda/). -When you’re finished, you’ll have this ⚡️[Deploying to AWS Lambda app][deploy-aws-lambda-app] to run, modify, and make your own. +When you’re finished, you’ll have this ⚡️[Deploying to AWS Lambda app](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda) to run, modify, and make your own. --- -### Set up AWS Lambda {#set-up-aws-lambda} +## Set up AWS Lambda {#set-up-aws-lambda} -[AWS Lambda][aws-lambda] is a serverless, Function-as-a-Service (FaaS) platform that allows you to run code without managing servers. In this section, we'll configure your local machine to access AWS Lambda. +[AWS Lambda](https://aws.amazon.com/lambda/) is a serverless, Function-as-a-Service (FaaS) platform that allows you to run code without managing servers. In this section, we'll configure your local machine to access AWS Lambda. -> 💡 Skip this section if you have already [configured a profile][aws-profiles] on your local machine to access AWS Lambda. +:::tip + +Skip this section if you have already [configured a profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-profiles) on your local machine to access AWS Lambda. + +::: **1. Sign up for an AWS account** -If you don't already have an account, you should [sign up for AWS][aws-sign-up] and follow the on-screen instructions. +If you don't already have an account, you should [sign up for AWS](https://aws.amazon.com/) and follow the on-screen instructions. + +:::info -> 💡 You may be asked for payment information during the sign up. Don't worry, this guide only uses the [free tier][aws-pricing]. +You may be asked for payment information during the sign up. Don't worry, this guide only uses the [free tier](https://aws.amazon.com/lambda/pricing/). + +::: **2. Create an AWS access key** @@ -34,11 +35,15 @@ Next, you'll need programmatic access to your AWS account to deploy onto Lambda. We recommend watching this short, step-by-step video to 🍿 [create an IAM user and download the access keys](https://www.youtube.com/watch?v=KngM5bfpttA). -> 💡 **Do you already have an IAM user?** Follow the official AWS guide to [create access keys for existing IAM users][aws-iam-user]. +:::tip + + **Do you already have an IAM user?** Follow the official AWS guide to [create access keys for existing IAM users](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds). + +::: **3. Install the AWS CLI** -The AWS tools are available as a Command Line Interface (CLI) and can be [installed on macOS, Windows, or Linux][aws-cli-install]. +The AWS tools are available as a Command Line Interface (CLI) and can be [installed on macOS, Windows, or Linux](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html). On macOS, you can install the AWS CLI by [downloading the latest package installer](https://awscli.amazonaws.com/AWSCLIV2.pkg). @@ -46,7 +51,7 @@ On macOS, you can install the AWS CLI by [downloading the latest package install You can use the AWS CLI to configure a profile that stores your access key pair on your local machine. This profile is used by the CLI and other tools to access AWS. -The quickest way to [configure your profile][aws-cli-configure] is to run this command and follow the prompts: +The quickest way to [configure your profile](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config) is to run this command and follow the prompts: ```zsh aws configure @@ -56,15 +61,19 @@ aws configure # Default output format [None]: json ``` -> 💡 Customize the [region][aws-cli-region] and [output format][aws-cli-output-format] best for you. +:::tip + +Customize the [region](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-region) and [output format](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-format) best for you. + +::: That wraps up configuring your local machine to access AWS. 👏 Next, let's do the same with the Serverless Framework. --- -### Set up Serverless Framework {#set-up-serverless-framework} +## Set up Serverless Framework {#set-up-serverless-framework} -The [Serverless Framework][serverless-framework] includes tools that let you easily configure, debug, and deploy your app to AWS Lambda. +The [Serverless Framework](https://serverless.com/) includes tools that let you easily configure, debug, and deploy your app to AWS Lambda. **1. Install the Serverless Framework CLI** @@ -80,9 +89,9 @@ You're now set up with the Serverless tools! Let's move on to preparing your Bol --- -### Get a Bolt Slack app {#get-a-bolt-slack-app} +## Get a Bolt Slack app {#get-a-bolt-slack-app} -If you haven't already built your own Bolt app, you can use our [Getting Started guide][getting-started-guide] or clone the template app below: +If you haven't already built your own Bolt app, you can use our [Getting Started guide](/getting-started or clone the template app below: ```shell git clone https://github.com/slackapi/bolt-js-getting-started-app.git @@ -98,7 +107,7 @@ Now that you have an app, let's prepare it for AWS Lambda and the Serverless Fra --- -### Prepare the app {#prepare-the-app} +## Prepare the app {#prepare-the-app} **1. Prepare the app for AWS Lambda** @@ -113,7 +122,7 @@ const app = new App({ }); ``` -Next, we'll customize your Bolt app's [`receiver`](https://slack.dev/bolt-js/concepts#receiver) to respond to Lambda function events. +Next, we'll customize your Bolt app's [`receiver`](/concepts/receiver) to respond to Lambda function events. Update the [source code that imports your modules](https://github.com/slackapi/bolt-js-getting-started-app/blob/4c29a21438b40f0cbca71ece0d39b356dfcf88d5/app.js#L1) in `app.js` to require Bolt's AwsLambdaReceiver: @@ -121,7 +130,11 @@ Update the [source code that imports your modules](https://github.com/slackapi/b const { App, AwsLambdaReceiver } = require('@slack/bolt'); ``` -> 💡 If implementing authentication with OAuth, you must use the [`ExpressReceiver`](https://github.com/slackapi/bolt-js/blob/main/src/receivers/ExpressReceiver.ts). Please note that when using `ExpressReceiver`, the `processBeforeResponse: true` property is required during initialization to avoid latency issues. +:::warning + +If implementing authentication with OAuth, you must use the [`ExpressReceiver`](https://github.com/slackapi/bolt-js/blob/main/src/receivers/ExpressReceiver.ts). Please note that when using `ExpressReceiver`, the `processBeforeResponse: true` property is required during initialization to avoid latency issues. + +::: Then update the [source code that initializes your Bolt app](https://github.com/slackapi/bolt-js-getting-started-app/blob/4c29a21438b40f0cbca71ece0d39b356dfcf88d5/app.js#L10-L14) to create a custom receiver using AwsLambdaReceiver: @@ -157,7 +170,7 @@ module.exports.handler = async (event, context, callback) => { } ``` -When you're done, your app should look similar to the ⚡️[Deploying to AWS Lambda app][deploy-aws-lambda-app/app.js]. +When you're done, your app should look similar to the ⚡️[Deploying to AWS Lambda app](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda/app.js). **2. Add a serverless.yml** @@ -185,8 +198,13 @@ plugins: - serverless-offline ``` -> 💡 `SLACK_SIGNING_SECRET` and `SLACK_BOT_TOKEN` must be environment variables on your local machine. -> You can [learn how to export Slack environment variables](/bolt-js/tutorial/getting-started#setting-up-your-project) in our Getting Started guide. +:::info + +`SLACK_SIGNING_SECRET` and `SLACK_BOT_TOKEN` must be environment variables on your local machine. + +You can [learn how to export Slack environment variables](/getting-started#setting-up-your-project) in our Getting Started guide. + +::: **3. Install Serverless Offline** @@ -202,7 +220,7 @@ Congratulations, you've just prepared your Bolt app for AWS Lambda and Serverles --- -### Run the app locally {#run-the-app-locally} +## Run the app locally {#run-the-app-locally} Now that your app is configured to respond to an AWS Lambda function, we'll set up your environment to run the app locally. @@ -214,7 +232,11 @@ First, use the `serverless offline` command to start your app and listen to AWS serverless offline --noPrependStageInUrl ``` -> 🏌️ Pro-tip: you can make code changes to your app in one terminal while running the above command in another terminal, and as you save code changes your app will reload automatically. +:::tip + +You can make code changes to your app in one terminal while running the above command in another terminal, and as you save code changes your app will reload automatically. + +::: Next, use ngrok to forward Slack events to your local machine: @@ -222,37 +244,46 @@ Next, use ngrok to forward Slack events to your local machine: ngrok http 3000 ``` -> 💡 [Learn how to use ngrok][getting-started-guide-setting-up-events] to create a public URL and forward requests to your local machine. +:::info + +[Learn how to use ngrok](/getting-started#setting-up-events) to create a public URL and forward requests to your local machine. + +::: **2. Update your Request URL** Next, visit your [Slack app's settings](https://api.slack.com/apps) to update your **Request URL** to use the ngrok web address. -> 💡 Your **Request URL** ends with `/slack/events`, such as `https://abc123.ngrok.io/slack/events`. +Your **Request URL** ends with `/slack/events`, such as `https://abc123.ngrok.io/slack/events`. First, select **Interactivity & Shortcuts** from the side and update the **Request URL**: -![Interactivity & Shortcuts page](../assets/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts page") +![Interactivity & Shortcuts page](/img/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts page") Second, select **Event Subscriptions** from the side and update the **Request URL**: -![Event Subscriptions page](../assets/event-subscriptions-page.png "Event Subscriptions page") +![Event Subscriptions page](/img/event-subscriptions-page.png "Event Subscriptions page") **3. Test your Slack app** -Now you can test your Slack app by inviting your app to a channel then saying “hello” (lower-case). Just like in the [Getting Started guide][getting-started-guide], your app should respond back: +Now you can test your Slack app by inviting your app to a channel then saying “hello” (lower-case). Just like in the [Getting Started guide](/getting-started, your app should respond back: > 👩‍💻 hello
    > 🤖 Hey there @Jane! If you don’t receive a response, check your **Request URL** and try again. -> 💡 **How does this work?** -> The ngrok and Serverless commands are configured on the same port (default: 3000). When a Slack event is sent to your **Request URL**, it's received on your local machine by ngrok. The request is then forwarded to Serverless Offline, which emulates an AWS Lambda function event and triggers your Bolt app's receiver. 🛫🛬 Phew, what a trip! +:::info + +**How does this work?** + +The ngrok and Serverless commands are configured on the same port (default: 3000). When a Slack event is sent to your **Request URL**, it's received on your local machine by ngrok. The request is then forwarded to Serverless Offline, which emulates an AWS Lambda function event and triggers your Bolt app's receiver. 🛫🛬 Phew, what a trip! + +::: --- -### Deploy the app {#deploy-the-app} +## Deploy the app {#deploy-the-app} In the previous section of this tutorial, you ran your app locally and tested it in a live Slack workspace. Now that you have a working app, let's deploy it! @@ -271,9 +302,7 @@ serverless deploy # ... ``` -After your app is deployed, you'll be given an **endpoint** which you'll use as your app's **Request URL**. Go ahead and copy this **endpoint** to use in the next section. - -> 💡 The **endpoint** should end in `/slack/events`. +After your app is deployed, you'll be given an **endpoint** which you'll use as your app's **Request URL**. The **endpoint** should end in `/slack/events`. Go ahead and copy this **endpoint** to use in the next section. **2. Update your Slack app's settings** @@ -282,11 +311,11 @@ With your endpoint copied, navigate to your [Slack app's configuration](https:// First, select **Interactivity & Shortcuts** from the side and update the **Request URL**: -![Interactivity & Shortcuts page](../assets/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts page") +![Interactivity & Shortcuts page](/img/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts page") Second, select **Event Subscriptions** from the side and update the **Request URL**: -![Event Subscriptions page](../assets/event-subscriptions-page.png "Event Subscriptions page") +![Event Subscriptions page](/img/event-subscriptions-page.png "Event Subscriptions page") **3. Test your Slack app** @@ -301,7 +330,7 @@ Just like the [running the app locally](#run-the-app-locally) section, open a Sl As you continue to build your Slack app, you'll need to deploy the updates. Let's get a feel for this by updating your app to respond to a "goodbye" message. -Add the following code to `app.js` ([source code on GitHub][deploy-aws-lambda-app/app.js]): +Add the following code to `app.js` ([source code on GitHub](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda/app.js)): ```javascript // Listens to incoming messages that contain "goodbye" @@ -319,33 +348,21 @@ serverless deploy When the deploy is complete, you can open a Slack channel that your app has joined and say "goodbye" (lower-case). You should see a friendly farewell from your Slack app. -> ⛳️ If you are making small changes to single functions, you can deploy only a single function using `serverless deploy function -f my-function` which is much faster. Run `serverless help deploy function` for more detailed help. +:::tip + +If you are making small changes to single functions, you can deploy only a single function using `serverless deploy function -f my-function` which is much faster. Run `serverless help deploy function` for more detailed help. + +::: --- -### Next steps {#next-steps} +## Next steps {#next-steps} -You just deployed your first ⚡️[Bolt for JavaScript app to AWS Lambda][deploy-aws-lambda-app]! 🚀 +You just deployed your first ⚡️[Bolt for JavaScript app to AWS Lambda](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda)! 🚀 Now that you've built and deployed a basic app, here are some ideas you can explore to extend, customize, and monitor it: - Brush up on [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) and the [Serverless Framework](https://www.serverless.com/framework/docs/providers/aws/guide/intro/). -- Extend your app with [Bolt's Basic Concepts](/bolt-js/concepts#basic) and [Serverless plugins](https://www.serverless.com/framework/docs/providers/aws/guide/plugins/). -- Learn about logging in [Bolt's Advanced Concepts](/bolt-js/concepts#logging) and how to [view log messages with Serverless](https://www.serverless.com/framework/docs/providers/aws/cli-reference/logs/). -- Get ready for primetime with AWS Lambda [testing](https://www.serverless.com/framework/docs/providers/aws/guide/testing/) and [deployment environments](https://www.serverless.com/framework/docs/providers/aws/guide/deploying/). - -[aws-cli-configure]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config -[aws-cli-install]: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html -[aws-cli-output-format]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-format -[aws-cli-region]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-region -[aws-iam-user]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds -[aws-lambda]: https://aws.amazon.com/lambda/ -[aws-pricing]: https://aws.amazon.com/lambda/pricing/ -[aws-profiles]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-profiles -[aws-sign-up]: https://aws.amazon.com/ -[bolt-js]: /bolt-js -[deploy-aws-lambda-app]: https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda -[deploy-aws-lambda-app/app.js]: https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda/app.js -[getting-started-guide-setting-up-events]: https://slack.dev/bolt-js/tutorial/getting-started#setting-up-events -[getting-started-guide]: /bolt-js/tutorial/getting-started -[serverless-framework]: https://serverless.com/ +- Extend your app with other Bolt capabilities and [Serverless plugins](https://www.serverless.com/framework/docs/providers/aws/guide/plugins/). +- Learn about [logging](/concepts/logging) and how to [view log messages with Serverless](https://www.serverless.com/framework/docs/providers/aws/cli-reference/logs/). +- Get ready for primetime with AWS Lambda [testing](https://www.serverless.com/framework/docs/providers/aws/guide/testing/) and [deployment environments](https://www.serverless.com/framework/docs/providers/aws/guide/deploying/). \ No newline at end of file diff --git a/docs/_deployments/heroku.md b/docs/content/deployments/heroku.md similarity index 67% rename from docs/_deployments/heroku.md rename to docs/content/deployments/heroku.md index a3b8391bb..7593fd2cc 100644 --- a/docs/_deployments/heroku.md +++ b/docs/content/deployments/heroku.md @@ -1,26 +1,26 @@ --- title: Heroku Platform -order: 0 -slug: heroku lang: en -layout: tutorial -permalink: /deployments/heroku --- + # Deploying to Heroku -> ⚠️ Using Heroku dynos to complete this tutorial counts towards your usage. [Delete your app](https://devcenter.heroku.com/articles/heroku-cli-commands#heroku-apps-destroy) as soon as you are done to control costs. +:::warning + + Using Heroku dynos to complete this tutorial counts towards your usage. [Delete your app](https://devcenter.heroku.com/articles/heroku-cli-commands#heroku-apps-destroy) as soon as you are done to control costs. + + ::: + +This guide will walk you through preparing and deploying a Slack app using Bolt for JavaScript and the [Heroku platform](https://heroku.com/). Along the way, we’ll download a Bolt Slack app, prepare it for Heroku, and deploy it. -
    -This guide will walk you through preparing and deploying a Slack app using [Bolt for JavaScript](/bolt-js) and the [Heroku platform](https://heroku.com/). Along the way, we’ll download a Bolt Slack app, prepare it for Heroku, and deploy it. -
    -When you’re finished, you’ll have this ⚡️[Deploying to Heroku app][deploy-heroku-app] to run, modify, and make your own. +When you’re finished, you’ll have this ⚡️[Deploying to Heroku app](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-heroku) to run, modify, and make your own. --- -### Get a Bolt Slack app {#get-a-bolt-slack-app} +## Get a Bolt Slack app {#get-a-bolt-slack-app} -If you haven't already built your own Bolt app, you can use our [Getting Started guide][getting-started-guide] or clone the template app below: +If you haven't already built your own Bolt app, you can use our [Getting Started guide](/getting-started) or clone the template app below: ```shell git clone https://github.com/slackapi/bolt-js-getting-started-app.git @@ -36,17 +36,21 @@ Now that you have an app, let's prepare it for Heroku. --- -### Prepare the app for Heroku {#prepare-the-app-for-heroku} +## Prepare the app for Heroku {#prepare-the-app-for-heroku} Heroku is a flexible platform that requires some configuration to host your app. In this section, we'll update your Bolt app to support Heroku. **1. Use a Git repository** -Before you can deploy your app to Heroku, you'll need a Git repository. If you aren't already using Git, you'll need to [install Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) and [create a Git repository](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository). +:::info + +Skip this step if you used `git clone` in the previous section because you already have a Git repository. -> 💡 Skip this step if you used `git clone` in the previous section because you already have a Git repository. +::: -**2. Add a Procfile** +Before you can deploy your app to Heroku, you'll need a Git repository. If you aren't already using Git, you'll need to [install Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) and [create a Git repository](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository). + +**2. Add a `Procfile`** Every Heroku app uses a special file called `Procfile` that tells Heroku how to start your app. The contents of the file will depend on whether or not you are using Socket Mode. @@ -71,11 +75,15 @@ git add Procfile git commit -m "Add Procfile" ``` -> 💡 Are you following this guide with an existing Bolt app? If so, please review the guide on [preparing a codebase for Heroku](https://devcenter.heroku.com/articles/preparing-a-codebase-for-heroku-deployment#4-listen-on-the-correct-port) to listen on the correct port. +:::info + +Are you following this guide with an existing Bolt app? If so, please review the guide on [preparing a codebase for Heroku](https://devcenter.heroku.com/articles/preparing-a-codebase-for-heroku-deployment#4-listen-on-the-correct-port) to listen on the correct port. + +::: --- -### Set up the Heroku tools {#set-up-the-heroku-tools} +## Set up the Heroku tools {#set-up-the-heroku-tools} Now we can set up the Heroku tools on your local machine. These tools will help you manage, deploy, and debug your app on Heroku's platform. @@ -93,7 +101,11 @@ Once the install is complete, we can test the Heroku CLI by displaying all of th heroku help ``` -> 💡 If the `heroku` command is not found, refresh your path by opening a new terminal session/tab. +:::tip + +If the `heroku` command is not found, refresh your path by opening a new terminal session/tab. + +::: **2. Log into the Heroku CLI** @@ -102,7 +114,11 @@ The Heroku CLI connects your local machine with your Heroku account. [Sign up fo ```shell heroku login ``` -> 💡 If you're behind a firewall, you may need to [set the proxy environment variables](https://devcenter.heroku.com/articles/using-the-cli#using-an-http-proxy) for the Heroku CLI. +:::warning + +If you're behind a firewall, you may need to [set the proxy environment variables](https://devcenter.heroku.com/articles/using-the-cli#using-an-http-proxy) for the Heroku CLI. + +::: **3. Confirm you're logged into the Heroku CLI** @@ -116,14 +132,17 @@ You should now be set up with the Heroku tools! Let's move on to the exciting st --- -### Create an app on Heroku {#create-an-app-on-heroku} +## Create an app on Heroku {#create-an-app-on-heroku} It’s time to [create a Heroku app](https://devcenter.heroku.com/articles/creating-apps) using the tools that you just installed. When you create an app, you can choose a unique name or have it randomly generated. Creating new Heroku apps will use your existing Heroku plan subscription. When getting started or deploying many small apps, we recommend starting with [Heroku's low-cost Eco Dyno plan](https://blog.heroku.com/new-low-cost-plans). -> 💡 Eligible students can apply for platform credits through the [Heroku for GitHub Student program](https://blog.heroku.com/github-student-developer-program). +:::tip + +Eligible students can apply for platform credits through the [Heroku for GitHub Student program](https://blog.heroku.com/github-student-developer-program). +::: **1. Create an app on Heroku** @@ -141,7 +160,11 @@ heroku create # https://sharp-rain-871.herokuapp.com/ | https://git.heroku.com/sharp-rain-871.git ``` -> 💡 You can [rename a Heroku app](https://devcenter.heroku.com/articles/renaming-apps) at any time, but you may change your Git remote and public web address. +:::info + +You can [rename a Heroku app](https://devcenter.heroku.com/articles/renaming-apps) at any time, but you may change your Git remote and public web address. + +::: After your app is created, you'll be given some information that we'll use in the upcoming sections. In the example above: @@ -168,13 +191,17 @@ heroku config:set SLACK_SIGNING_SECRET= heroku config:set SLACK_BOT_TOKEN=xoxb- ``` -> 💡 If you don't know where to find your credentials, please read about [exporting your signing secret and token](/bolt-js/tutorial/getting-started#tokens-and-installing-apps) in the Getting Started guide. +:::info + +If you don't know where to find your credentials, please read about [exporting your signing secret and token](/getting-started#tokens-and-installing-apps) in the Getting Started guide. + +::: Now that we have prepared your local app and created a Heroku app, the next step is to deploy it! --- -### Deploy the app {#deploy-the-app} +## Deploy the app {#deploy-the-app} To deploy the app, we're going to push your local code to Heroku, update your Slack app's settings, and say "hello" to your Heroku app. ✨ @@ -188,7 +215,11 @@ You can now deploy your app with the command: git push heroku main ``` -> 💡 Heroku deploys code that's pushed to the [master or main branches](https://devcenter.heroku.com/articles/git-branches). Pushing to other branches will not trigger a deployment. +:::info + +Heroku deploys code that's pushed to the [master or main branches](https://devcenter.heroku.com/articles/git-branches). Pushing to other branches will not trigger a deployment. + +::: Finally, we need to start a web server instance using the Heroku CLI: @@ -212,27 +243,35 @@ In our example, the web address is `https://sharp-rain-871.herokuapp.com/`. Head over to the [Slack App page](https://api.slack.com/apps) and select your app name. Next, we'll update your **Request URL** in two locations to be your web address. -> 💡 Your **Request URL** ends with `/slack/events`, such as `https://sharp-rain-871.herokuapp.com/slack/events`. +:::tip + +Your **Request URL** ends with `/slack/events`, such as `https://sharp-rain-871.herokuapp.com/slack/events`. + +::: First, select **Interactivity & Shortcuts** from the side and update the **Request URL**: -![Interactivity & Shortcuts page](../assets/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts page") +![Interactivity & Shortcuts page](/img/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts page") Second, select **Event Subscriptions** from the side and update the **Request URL**: -![Event Subscriptions page](../assets/event-subscriptions-page.png "Event Subscriptions page") +![Event Subscriptions page](/img/event-subscriptions-page.png "Event Subscriptions page") -> 💡 Heroku Eco Dyno apps sleep when inactive. 💤 If your verification fails, please try it again immediately. +:::tip + +Heroku Eco Dyno apps sleep when inactive. 💤 If your verification fails, please try it again immediately. + +::: **3. Test your Slack app** Your app is now deployed and Slack is updated, so let's try it out! -Open a Slack channel that your app has joined and say "hello" (lower-case). Just like in the [Getting Started guide](/bolt-js/tutorial/getting-started#sending-and-responding-to-actions), your app should respond back. If you don't receive a response, check your **Request URL** and try again. +Open a Slack channel that your app has joined and say "hello" (lower-case). Just like in the [Getting Started guide](/getting-started#sending-and-responding-to-actions), your app should respond back. If you don't receive a response, check your **Request URL** and try again. --- -### Deploy an update {#deploy-an-update} +## Deploy an update {#deploy-an-update} As you continue building your Slack app, you'll need to deploy updates. A common flow is to make a change, commit it, and then push it to Heroku. @@ -262,16 +301,13 @@ When the deploy is complete, you can open a Slack channel that your app has join --- -### Next steps {#next-steps} +## Next steps {#next-steps} -You just deployed your first ⚡️[Bolt for JavaScript app to Heroku][deploy-heroku-app]! 🚀 +You just deployed your first ⚡️[Bolt for JavaScript app to Heroku](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-heroku)! 🚀 Now that you've deployed a basic app, you can start exploring how to customize and monitor it. Here are some ideas of what to explore next: - Brush up on [how Heroku works](https://devcenter.heroku.com/articles/how-heroku-works) and understand the [limitations of a Heroku Eco Dyno app](https://devcenter.heroku.com/articles/eco-dyno-hours). -- Extend your app with [Bolt's Basic Concepts](/bolt-js/concepts#basic) and [Heroku's Add-ons](https://elements.heroku.com/addons). -- Learn about logging in [Bolt's Advanced Concepts](/bolt-js/concepts#logging) and how to [view log messages in Heroku](https://devcenter.heroku.com/articles/getting-started-with-nodejs#view-logs). -- Get ready for primetime with [how to scale your Heroku app](https://devcenter.heroku.com/articles/getting-started-with-nodejs#scale-the-app). - -[deploy-heroku-app]: https://github.com/slackapi/bolt-js/tree/main/examples/deploy-heroku -[getting-started-guide]: /bolt-js/tutorial/getting-started +- Extend your app with with other Bolt capabilities and and [Heroku's Add-ons](https://elements.heroku.com/addons). +- Learn about [logging](/concepts/logging) and how to [view log messages in Heroku](https://devcenter.heroku.com/articles/getting-started-with-nodejs#view-logs). +- Get ready for primetime with [how to scale your Heroku app](https://devcenter.heroku.com/articles/getting-started-with-nodejs#scale-the-app). \ No newline at end of file diff --git a/docs/_tutorials/getting_started.md b/docs/content/getting-started.md similarity index 72% rename from docs/_tutorials/getting_started.md rename to docs/content/getting-started.md index 424cef21e..be5d6f037 100644 --- a/docs/_tutorials/getting_started.md +++ b/docs/content/getting-started.md @@ -1,39 +1,34 @@ --- -title: Getting started -order: 0 -slug: getting-started -lang: en -layout: tutorial -permalink: /tutorial/getting-started -redirect_from: - - /getting-started +title: Getting started with Bolt for JavaScript +sidebar_label: Getting started --- -# Getting started with Bolt for JavaScript -
    This guide is meant to walk you through getting up and running with a Slack app using Bolt for JavaScript. Along the way, we’ll create a new Slack app, set up your local environment, and develop an app that listens and responds to messages from a Slack workspace. -
    -When you’re finished, you’ll have this ⚡️[Getting Started app](https://github.com/slackapi/bolt-js-getting-started-app) to run, modify, and make your own. +When you’re finished, you’ll have created the [Getting Started app](https://github.com/slackapi/bolt-js-getting-started-app) to run, modify, and make your own. ⚡️ --- -### Create an app {#create-an-app} +## Create an app {#create-an-app} First thing's first: before you start developing with Bolt, you'll want to [create a Slack app](https://api.slack.com/apps/new). -> 💡 We recommend using a workspace where you won't disrupt real work getting done — [you can create a new one for free](https://slack.com/get-started#create). +:::tip + +We recommend using a workspace where you won't disrupt real work getting done — [you can create a new one for free](https://slack.com/get-started#create). + +::: After you fill out an app name (_you can change it later_) and pick a workspace to install it to, hit the `Create App` button and you'll land on your app's **Basic Information** page. This page contains an overview of your app in addition to important credentials you'll need later, like the `Signing Secret` under the **App Credentials** header. -![Basic Information page](../assets/basic-information-page.png "Basic Information page") +![Basic Information page](/img//basic-information-page.png "Basic Information page") Look around, add an app icon and description, and then let's start configuring your app. 🔩 --- -### Tokens and installing apps {#tokens-and-installing-apps} +## Tokens and installing apps {#tokens-and-installing-apps} Slack apps use [OAuth to manage access to Slack's APIs](https://api.slack.com/docs/oauth). When an app is installed, you'll receive a token that the app can use to call API methods. There are three main token types available to a Slack app: user (`xoxp`), bot (`xoxb`), and app (`xapp`) tokens. @@ -51,13 +46,17 @@ We're going to use bot and app tokens for this guide. 4. Once you authorize the installation, you'll land on the **OAuth & Permissions** page and see a **Bot User OAuth Access Token**. -![OAuth Tokens](../assets/bot-token.png "Bot OAuth Token") +![OAuth Tokens](/img//bot-token.png "Bot OAuth Token") -> 💡 Treat your token like a password and [keep it safe](https://api.slack.com/docs/oauth-safety). Your app uses it to post and retrieve information from Slack workspaces. +:::tip + +Treat your token like a password and [keep it safe](https://api.slack.com/docs/oauth-safety). Your app uses it to post and retrieve information from Slack workspaces. + +::: --- -### Setting up your project {#setting-up-your-project} +## Setting up your project {#setting-up-your-project} With the initial configuration handled, it's time to set up a new Bolt project. This is where you'll write the code that handles the logic for your app. If you don’t already have a project, let’s create a new one. Create an empty directory and initialize a new project: @@ -82,7 +81,11 @@ export SLACK_SIGNING_SECRET= export SLACK_BOT_TOKEN=xoxb- ``` -> 🔒 Remember to keep your tokens and signing secret secure. At a minimum, you should avoid checking them into public version control, and access them via environment variables as we've done above. Checkout the API documentation for more on [best practices for app security](https://api.slack.com/authentication/best-practices). +:::warning + +Remember to keep your tokens and signing secret secure. At a minimum, you should avoid checking them into public version control, and access them via environment variables as we've done above. Checkout the API documentation for more on [best practices for app security](https://api.slack.com/authentication/best-practices). + +::: Now, let's create your app. Install the `@slack/bolt` package and save it to your `package.json` dependencies using the following command: @@ -120,12 +123,16 @@ Your app should let you know that it's up and running. 🎉 --- -### Setting up events {#setting-up-events} +## Setting up events {#setting-up-events} Your app behaves similarly to people on your team — it can post messages, add emoji reactions, and listen and respond to events. To listen for events happening in a Slack workspace (like when a message is posted or when a reaction is posted to a message) you'll use the [Events API to subscribe to event types](https://api.slack.com/events-api). For this guide, we are going to be using [Socket Mode](https://api.slack.com/apis/connections/socket), our recommended option for those just getting started and building something for their team. -> 💡 Socket Mode lets apps use the Events API and interactive components without exposing a public HTTP endpoint. This can be helpful during development, or if you're receiving requests from behind a firewall. HTTP is more useful for apps being deployed to hosting environments (like [AWS](/bolt-js/deployments/aws-lambda) or [Heroku](/bolt-js/deployments/heroku)), or apps intended for distribution via the Slack App Directory. To continue this setting up guide with HTTP, head over [here](/bolt-js/tutorial/getting-started-http#setting-up-events-with-http). +:::tip + +Socket Mode lets apps use the Events API and interactive components without exposing a public HTTP endpoint. This can be helpful during development, or if you're receiving requests from behind a firewall. HTTP is more useful for apps being deployed to hosting environments (like [AWS](/deployments/aws-lambda) or [Heroku](/deployments/heroku)), or apps intended for distribution via the Slack App Directory. To continue this setting up guide with HTTP, head over [here](/tutorial/getting-started-http#setting-up-events-with-http). + +::: Okay, let's enable Socket Mode: @@ -138,6 +145,7 @@ Finally, it's time to tell Slack what events we'd like to listen for. Under **Ev When an event occurs, Slack will send your app information about the event, like the user that triggered it and the channel it occurred in. Your app will process the details and can respond accordingly. Scroll down to **Subscribe to Bot Events**. There are four events related to messages: + - [`message.channels`](https://api.slack.com/events/message.channels) listens for messages in public channels that your app is added to - [`message.groups`](https://api.slack.com/events/message.groups) listens for messages in 🔒 private channels that your app is added to - [`message.im`](https://api.slack.com/events/message.im) listens for messages in your app's DMs with users @@ -164,7 +172,8 @@ const app = new App({ ``` --- -### Listening and responding to a message {#listening-and-responding-to-a-message} + +## Listening and responding to a message {#listening-and-responding-to-a-message} Your app is now ready for some logic. Let's start by using the `message()` method to attach a listener for messages. The following example listens and responds to all messages in channels/DMs where your app has been added that contain the word "hello": @@ -202,11 +211,15 @@ This is a basic example, but it gives you a place to start customizing your app --- -### Sending and responding to actions {#sending-and-responding-to-actions} +## Sending and responding to actions {#sending-and-responding-to-actions} To use features like buttons, select menus, datepickers, modals, and shortcuts, you’ll need to enable interactivity. Head over to **Interactivity & Shortcuts** in your app configuration. -> 💡 You'll notice that with Socket Mode on, basic interactivity is enabled for us by default, so no further action here is needed. If you're using HTTP, you'll need to supply a [Request URL](https://api.slack.com/apis/connections/events-api#the-events-api__subscribing-to-event-types__events-api-request-urls) for Slack to send events to. +:::tip + +You'll notice that with Socket Mode on, basic interactivity is enabled for us by default, so no further action here is needed. If you're using HTTP, you'll need to supply a [Request URL](https://api.slack.com/apis/connections/events-api#the-events-api__subscribing-to-event-types__events-api-request-urls) for Slack to send events to. + +::: When interactivity is enabled, interactions with shortcuts, modals, or interactive components (such as buttons, select menus, and datepickers) will be sent to your app as events. @@ -266,77 +279,33 @@ The value inside of `say()` is now an object that contains an array of `blocks`. You'll notice in the button `accessory` object, there is an `action_id`. This will act as a unique identifier for the button so your app can specify what action it wants to respond to. -> 💡 The [Block Kit Builder](https://app.slack.com/block-kit-builder) is a simple way to prototype your interactive messages. The builder lets you (or anyone on your team) mockup messages and generates the corresponding JSON that you can paste directly in your app. - -Now, if you restart your app and say "hello" in a channel your app is in, you'll see a message with a button. But if you click the button, nothing happens (*yet!*). - -Let's add a handler to send a followup message when someone clicks the button: +:::tip -```javascript -const { App } = require('@slack/bolt'); +The [Block Kit Builder](https://app.slack.com/block-kit-builder) is a simple way to prototype your interactive messages. The builder lets you (or anyone on your team) mockup messages and generates the corresponding JSON that you can paste directly in your app. -const app = new App({ - token: process.env.SLACK_BOT_TOKEN, - signingSecret: process.env.SLACK_SIGNING_SECRET, - socketMode: true, - appToken: process.env.SLACK_APP_TOKEN, - // Socket Mode doesn't listen on a port, but in case you want your app to respond to OAuth, - // you still need to listen on some port! - port: process.env.PORT || 3000 -}); +::: -// Listens to incoming messages that contain "hello" -app.message('hello', async ({ message, say }) => { - // say() sends a message to the channel where the event was triggered - await say({ - blocks: [ - { - "type": "section", - "text": { - "type": "mrkdwn", - "text": `Hey there <@${message.user}>!` - }, - "accessory": { - "type": "button", - "text": { - "type": "plain_text", - "text": "Click Me" - }, - "action_id": "button_click" - } - } - ], - text: `Hey there <@${message.user}>!` - }); -}); - -app.action('button_click', async ({ body, ack, say }) => { - // Acknowledge the action - await ack(); - await say(`<@${body.user.id}> clicked the button`); -}); +Now, if you restart your app and say "hello" in a channel your app is in, you'll see a message with a button. But if you click the button, nothing happens (*yet!*). -(async () => { - // Start your app - await app.start(); +Let's add a handler to send a followup message when someone clicks the button: - console.log('⚡️ Bolt app is running!'); -})(); +```js reference +https://github.com/slackapi/bolt-js-getting-started-app/blob/main/app.js ``` -You can see that we used `app.action()` to listen for the `action_id` that we named `button_click`. If you restart your app and click the button, you'll see a new message from your app that says you clicked the button. +You can see that we used `app.action()` to listen for the `action_id` that we named `sample_button`. If you restart your app and click the button, you'll see a new message from your app that says you clicked the button. --- -### Next steps {#next-steps} +## Next steps {#next-steps} You just built your first [Bolt for JavaScript app](https://github.com/slackapi/bolt-js-getting-started-app) with Socket Mode! 🎉 Now that you have a basic app up and running, you can start exploring how to make your Bolt app stand out. Here are some ideas about what to explore next: -* Read through the [Basic concepts](/bolt-js/concepts#basic) to learn about the different methods and features your Bolt app has access to. +* Read through the basic concepts pages to learn about the different methods and features your Bolt app has access to. -* Explore the different events your bot can listen to with the [`events()` method](/bolt-js/concepts#event-listening). All of the events are listed [on the API site](https://api.slack.com/events). +* Explore the different events your bot can listen to with the [`events()`](/concepts/event-listening) method. All of the events are listed [on the API site](https://api.slack.com/events). -* Bolt allows you to [call Web API methods](/bolt-js/concepts#web-api) with the client attached to your app. There are [over 220 methods](https://api.slack.com/methods) on our API site. +* Bolt allows you to [call Web API methods](/concepts/web-api) with the client attached to your app. There are [over 200 methods](https://api.slack.com/methods) on our API site. -* Learn more about the different token types [on our API site](https://api.slack.com/docs/token-types). Your app may need different tokens depending on the actions you want it to perform. For apps that do not use Socket Mode, typically only a bot (`xoxb`) token is required. For example of this, see [Getting Started with HTTP](/bolt-js/tutorial/getting-started-http). +* Learn more about the different token types [on our API site](https://api.slack.com/docs/token-types). Your app may need different tokens depending on the actions you want it to perform. For apps that do not use Socket Mode, typically only a bot (`xoxb`) token is required. For example of this, see [Getting Started with HTTP](/tutorial/getting-started-http). \ No newline at end of file diff --git a/docs/_tutorials/reference.md b/docs/content/reference.md similarity index 83% rename from docs/_tutorials/reference.md rename to docs/content/reference.md index 54fbad06e..6acd3db76 100644 --- a/docs/_tutorials/reference.md +++ b/docs/content/reference.md @@ -1,32 +1,11 @@ --- -title: Reference -order: 1 +title: Bolt for JavaScript interface and configuration reference +sidebar_label: Reference slug: reference lang: en -layout: fullpage -permalink: /reference --- -# App interface and configuration - -
    -This guide is intended to detail the Bolt interface–including listeners and their arguments, initialization options, and errors. It may be helpful to first go through the ⚡️[Getting Started guide](/bolt-js/tutorial/getting-started) to learn the basics of building Bolt for JavaScript apps. -
    - -- [App interface and configuration](#app-interface-and-configuration) - - [Listener functions](#listener-functions) - - [Methods](#methods) - - [Constraint objects](#constraint-objects) - - [Listener function arguments](#listener-function-arguments) - - [Body and payload references](#body-and-payload-references) - - [Difference from listener middleware](#difference-from-listener-middleware) - - [Built-in middleware functions](#built-in-listener-functions) - - [Built-in global middleware functions](#built-in-global-middleware-functions) - - [Built-in listener middleware functions](#built-in-listener-middleware-functions) - - [Initialization options](#initialization-options) - - [Receiver options](#receiver-options) - - [App options](#app-options) - - [Framework error types](#framework-error-types) - - [Client errors](#client-errors) + +This guide is intended to detail the Bolt interface–including listeners and their arguments, initialization options, and errors. It may be helpful to first go through the ⚡️[Getting Started guide](/getting-started) to learn the basics of building Bolt for JavaScript apps. --- @@ -37,13 +16,13 @@ Slack apps typically receive and/or respond to one to many incoming events from Below is the current list of methods that accept listener functions. These methods handle specific event types coming from Slack, and typically include an identifying parameter before the listener function. The identifying parameter (included below) narrows the events to specific interactions that your listener function is intended to handle, such as a specific `callback_id`, or a certain substring within a message. | Method | Description | -| :---: | :--- | +| :--- | :--- | | `app.event(eventType, fn);` | Listens for Events API events. The `eventType` is a `string` to identify a [specific event](https://api.slack.com/events) to handle (which must be subscribed to in your app's configuration). | -| `app.message([pattern ,] fn);` | Convenience method to listen specifically to the [`message` event](https://api.slack.com/events/message). The pattern parameter can be any substring (`string`) or `RegExp` expression, which will be used to identify the incoming message. | +| `app.message([pattern ,] fn);` | Convenience method to listen specifically to the [`message`](https://api.slack.com/events/message) event. The pattern parameter can be any substring (`string`) or `RegExp` expression, which will be used to identify the incoming message. | | `app.action(actionId, fn);` | Listens for an action event from a Block Kit element, such as a user interaction with a button, select menu, or datepicker. The `actionId` identifier is a `string` that should match the unique `action_id` included when your app sends the element to a view. Note that a view can be a message, modal, or app home. Note that action elements included in an `input` block do not trigger any events. | `app.shortcut(callbackId, fn);` | Listens for global or message shortcut invocation. The `callbackId` is a `string` or `RegExp` that must match a shortcut `callback_id` specified within your app's configuration. | `app.view(callbackId, fn);` | Listens for `view_submission` and `view_closed` events. `view_submission` events are sent when a user submits a modal that your app opened. `view_closed` events are sent when a user closes the modal rather than submits it. -| `app.step(workflowStep)` | Listen and responds to workflow step events using the callbacks passed in an instance of `WorkflowStep`. Callbacks include three callbacks: `edit`, `save`, and `execute`. More information on workflow steps can be found [in the documentation](/bolt-js/concepts#adding-editing-steps). +| `app.step(workflowStep)` | Listen and responds to workflow step events using the callbacks passed in an instance of `WorkflowStep`. Callbacks include three callbacks: `edit`, `save`, and `execute`. More information on workflow steps can be found [in the documentation](/concepts/adding-editing-steps). | `app.command(commandName, fn);` | Listens for slash command invocations. The `commandName` is a `string` that must match a slash command specified in your app's configuration. Slash command names should be prefaced with a `/` (ex: `/helpdesk`). | `app.options(actionId, fn);` | Listens for options requests (from select menus with an external data source). This isn't often used, and shouldn't be mistaken with `app.action`. The `actionId` identifier is a `string` that matches the unique `action_id` included when you app sends a [select with an external data source](https://api.slack.com/reference/block-kit/block-elements#external_select). @@ -51,7 +30,7 @@ Below is the current list of methods that accept listener functions. These metho There are a collection of constraint objects that some methods have access to. These can be used to narrow the event your listener function handles, or to handle special cases. Constraint objects can be passed in lieu of the identifiers outlined above. Below is a collection of constraint objects and the methods they can be passed to. | Method | Options | Details | -| :---: | :--- | :--- | +| :--- | :--- | :--- | | `app.action(constraints, fn)` | `block_id`, `action_id`, `callback_id`, (,`type`) | Listens for more than just the `action_id`. `block_id` is the ID for the element's parent block. `callback_id` is the ID of the view that is passed when instantiating it (only used when action elements are in modals). To specifically handle an action element in blocks or in legacy attachments, you can use `type` with the value of `block_actions` or `interactive_message` respectively. | | `app.shortcut(constraints, fn)` | `type`, `callback_id` | Allows specification of the type of shortcut. `type` must either be `shortcut` for **global shortcuts** or `message_action` for **message_shortcuts**. `callbackId` can be a `string` or `RegExp`. | | `app.view(constraints, fn)` | `type`, `callback_id` | `type` must either be `view_closed` or `view_submission`, which determines what specific event your listener function is sent. `callback_id` is the `callback_id` of the view that is sent when your app opens the modal. | @@ -61,10 +40,10 @@ There are a collection of constraint objects that some methods have access to. T Listener functions have access to a set of arguments that may change based on the method which the function is passed to. Below is an explanation of the different arguments. The below table details the different arguments and the methods they'll be accessible in. | Argument | Description | -| :---: | :--- | -| `payload` | All listeners | The unwrapped contents of the incoming event, which varies based on event. This is a subset of the information included in `body` which is detailed below. `payload` is also accessible via the alias corresponding to the method name that the listener is passed to (`message`, `event`, `action`, `shortcut`, `view`, `command`, `options`) **An easy way to understand what's in a payload is to log it**, or [use TypeScript](/bolt-js/tutorial/using-typescript). | +| :--- | :--- | +| `payload` | All listeners | The unwrapped contents of the incoming event, which varies based on event. This is a subset of the information included in `body` which is detailed below. `payload` is also accessible via the alias corresponding to the method name that the listener is passed to (`message`, `event`, `action`, `shortcut`, `view`, `command`, `options`) **An easy way to understand what's in a payload is to log it**, or [use TypeScript](/tutorial/using-typescript). | | `say` | `message`, `event`, `action` `command` | Function to send a message to the channel associated with the incoming event. This argument is only available when the listener is triggered for events that contain a channel ID (the most common being `message` events). `say` accepts simple strings (for plain-text messages) and objects (for messages containing blocks). `say` returns a promise that will resolve with a [`chat.postMessage` response](https://api.slack.com/methods/chat.postMessage). If you're using an the `action` method, or an event other than `message`, you should [ensure that the event payload contains a channel ID](https://api.slack.com/events). -| `ack` | `action`, `shortcut`, `view`, `command`, `options` | Function that **must** be called to acknowledge that an incoming event was received by your app. `ack` returns a promise that resolves when complete. Read more in [Acknowledging events](#acknowledging-events) +| `ack` | `action`, `shortcut`, `view`, `command`, `options` | Function that **must** be called to acknowledge that an incoming event was received by your app. `ack` returns a promise that resolves when complete. Read more in [Acknowledging events](/concepts/acknowledging-events) | `client` | All listeners | Web API client that uses the token associated with that event. For single-workspace installations, the token is provided to the constructor. For multi-workspace installations, the token is returned by the `authorize` function. | `respond` | `action`, `shortcut`, `view`, `command` | Function that responds to an incoming event **if** it contains a `response_url`. `respond` returns a promise that resolves with the results of responding using the `response_url`. For shortcuts, `respond` will **only** work for message shortcuts (not global shortcuts). For views, `respond` will **only** work when using `response_url_enabled: true` for [conversations list](https://api.slack.com/reference/block-kit/block-elements#conversation_select) and [channels list](https://api.slack.com/reference/block-kit/block-elements#channel_select) select menus in input blocks in modals. | `context` | All listeners | Event context. This object contains data about the event and the app, such as the `botId`. Middleware can add additional context before the event is passed to listeners. @@ -80,7 +59,7 @@ The structure of the `payload` and `body` is detailed on the API site: - `options`: [`body` and `payload`](https://api.slack.com/reference/block-kit/block-elements#external_select) ### Difference from listener middleware -Listener middleware is used to implement logic across many listener functions (though usually not all of them). Listener middleware has the same arguments as the above listener functions, with one distinction: they also have a `next()` function that **must** be called in order to pass the chain of execution. Learn more about listener middleware [in the documentation](/bolt-js/concepts#listener-middleware). +Listener middleware is used to implement logic across many listener functions (though usually not all of them). Listener middleware has the same arguments as the above listener functions, with one distinction: they also have a `next()` function that **must** be called in order to pass the chain of execution. Learn more about listener middleware [in the documentation](/concepts/listener-middleware). ## Built-in middleware functions @@ -95,7 +74,7 @@ app.message(matchMessage('hello'), async ({ message, logger }) => { }); ``` -These middleware functions are divided into two groups: [global middleware functions](concepts#global-middleware) and [listener middleware functions](concepts#listener-middleware). +These middleware functions are divided into two groups: [global middleware functions](concepts/global-middleware) and [listener middleware functions](concepts/listener-middleware). ### Built-in global middleware functions @@ -126,70 +105,78 @@ Bolt includes a collection of initialization options to customize apps. There ar `HTTPReceiver` options can be passed into the `App` constructor, just like the Bolt app options. They'll be passed to the `HTTPReceiver` instance upon initialization. | Option | Description | -| :---: | :--- | +| :--- | :--- | | `signingSecret` | A `string` from your app's configuration (under "Basic Information") which verifies that incoming events are coming from Slack | | `endpoints` | A `string` or `object` that specifies the endpoint(s) that the receiver will listen for incoming requests from Slack. Currently, the only key for the object is `key`, the value of which is the customizable endpoint (ex: `/myapp/events`). **By default, all events are sent to the `/slack/events` endpoint** | | `processBeforeResponse` | `boolean` that determines whether events should be immediately acknowledged. This is primarily useful when running apps on FaaS since listeners will terminate immediately once the request has completed. When set to `true` it will defer sending the acknowledgement until after your handlers run to prevent early termination. Defaults to `false`. | -| `clientId` | The client ID `string` from your app's configuration which is [required to configure OAuth](/bolt-js/concepts#authenticating-oauth). | -| `clientSecret` | The client secret `string` from your app's configuration which is [required to configure OAuth](/bolt-js/concepts#authenticating-oauth). | -| `stateSecret` | Recommended parameter (`string`) that's passed when [configuring OAuth](/bolt-js/concepts#authenticating-oauth) to prevent CSRF attacks | -| `installationStore` | Defines how to save, fetch and delete installation data when [configuring OAuth](/bolt-js/concepts#authenticating-oauth). Contains three methods: `fetchInstallation`, `storeInstallation` and `deleteInstallation`. The default `installationStore` is an in-memory store. | -| `scopes` | Array of scopes that your app will request [within the OAuth process](/bolt-js/concepts#authenticating-oauth). | -| `installerOptions` | Optional object that can be used to customize [the default OAuth support](/bolt-js/concepts#authenticating-oauth). Read more in the OAuth documentation. | -| `dispatchErrorHandler` | Error handler triggered if an incoming request is to an unexpected path. More details available in the [Error Handling documentation](/bolt-js/concepts#error-handling). | -| `processEventErrorHandler` | Error handler triggered if event processing threw an exception. More details available in the [Error Handling documentation](/bolt-js/concepts#error-handling). | -| `unhandledRequestHandler` | Error handler triggered when a request from Slack goes unacknowledged. More details available in the [Error Handling documentation](/bolt-js/concepts#error-handling). | -| `unhandledRequestTimeoutMillis` | How long to wait, in milliseconds, from the time a request is received to when the `unhandledRequestHandler` should be triggered. Default is `3001`. More details available in the [Error Handling documentation](/bolt-js/concepts#error-handling). | +| `clientId` | The client ID `string` from your app's configuration which is [required to configure OAuth](/concepts/authenticating-oauth). | +| `clientSecret` | The client secret `string` from your app's configuration which is [required to configure OAuth](/concepts/authenticating-oauth). | +| `stateSecret` | Recommended parameter (`string`) that's passed when [configuring OAuth](/concepts/authenticating-oauth) to prevent CSRF attacks | +| `installationStore` | Defines how to save, fetch and delete installation data when [configuring OAuth](/concepts/authenticating-oauth). Contains three methods: `fetchInstallation`, `storeInstallation` and `deleteInstallation`. The default `installationStore` is an in-memory store. | +| `scopes` | Array of scopes that your app will request [within the OAuth process](/concepts/authenticating-oauth). | +| `installerOptions` | Optional object that can be used to customize [the default OAuth support](/concepts/authenticating-oauth). Read more in the OAuth documentation. | +| `dispatchErrorHandler` | Error handler triggered if an incoming request is to an unexpected path. More details available in the [Error Handling documentation](/concepts/error-handling). | +| `processEventErrorHandler` | Error handler triggered if event processing threw an exception. More details available in the [Error Handling documentation](/concepts/error-handling). | +| `unhandledRequestHandler` | Error handler triggered when a request from Slack goes unacknowledged. More details available in the [Error Handling documentation](/concepts/error-handling). | +| `unhandledRequestTimeoutMillis` | How long to wait, in milliseconds, from the time a request is received to when the `unhandledRequestHandler` should be triggered. Default is `3001`. More details available in the [Error Handling documentation](/concepts/error-handling). | | `signatureVerification` | `boolean` that determines whether Bolt should [verify Slack's signature on incoming requests](https://api.slack.com/authentication/verifying-requests-from-slack). Defaults to `true`. | -| `customPropertiesExtractor` | Optional `function` that can extract custom properties from an incoming receiver event -- for example, extracting custom headers to propagate to other services. The function receives one argument that will have the type of the event received by your receiver (e.g. an HTTP request or websocket message) and should return an object with string keys containing your custom properties. More details available in the [Customizing a receiver documentation](/bolt-js/concepts#customizing-built-in-receivers). | +| `customPropertiesExtractor` | Optional `function` that can extract custom properties from an incoming receiver event -- for example, extracting custom headers to propagate to other services. The function receives one argument that will have the type of the event received by your receiver (e.g. an HTTP request or websocket message) and should return an object with string keys containing your custom properties. More details available in the [Customizing a receiver documentation](/concepts/receiver). | ### App options App options are passed into the `App` constructor. When the `receiver` argument is `undefined` the `App` constructor also accepts the [above `Receiver` options](#receiver-options) to initialize either a `HttpReceiver` or a `SocketModeReceiver` depending on the value of the `socketMode` argument. | Option | Description | -| :---: | :--- | -| `receiver` | An instance of `Receiver` that parses and handles incoming events. Must conform to the [`Receiver` interface](/bolt-js/concepts#receiver), which includes `init(app)`, `start()`, and `stop()`. More information about receivers is [in the documentation](/bolt-js/concepts#receiver). | +| :--- | :--- | +| `receiver` | An instance of `Receiver` that parses and handles incoming events. Must conform to the [`Receiver` interface](/concepts/receiver), which includes `init(app)`, `start()`, and `stop()`. More information about receivers is [in the documentation](/concepts/receiver). | | `agent` | Optional HTTP `Agent` used to set up proxy support. Read more about custom agents in the [Node Slack SDK documentation](https://slack.dev/node-slack-sdk/web-api#proxy-requests-with-a-custom-agent). | | `clientTls` | Optional `string` to set a custom TLS configuration for HTTP client requests. Must be one of: `"pfx"`, `"key"`, `"passphrase"`, `"cert"`, or `"ca"`. | -| `convoStore` | A store to set and retrieve state-related conversation information. `set()` sets conversation state and `get()` fetches it. By default, apps have access to an in-memory store. More information and an example can be found [in the documentation](/bolt-js/concepts#conversation-store). | +| `convoStore` | A store to set and retrieve state-related conversation information. `set()` sets conversation state and `get()` fetches it. By default, apps have access to an in-memory store. More information and an example can be found [in the documentation](/concepts/conversation-store). | | `token` | A `string` from your app's configuration (under "Settings" > "Install App") required for calling the Web API. May not be passed when using `authorize`, `orgAuthorize`, or OAuth. | | `botId` | Can only be used when `authorize` is not defined. The optional `botId` is the ID for your bot token (ex: `B12345`) which can be used to ignore messages sent by your app. If a `xoxb-` token is passed to your app, this value will automatically be retrieved by your app calling the [`auth.test` method](https://api.slack.com/methods/auth.test). | | `botUserId` | Can only be used when `authorize` is not defined. The optional `botUserId` is distinct from the `botId`, as it's the user ID associated with your bot user used to identify direct mentions. If a `xoxb-` token is passed to your app, this value will automatically be retrieved by your app calling the [`auth.test` method](https://api.slack.com/methods/auth.test). | -| `authorize` | Function for multi-team installations that determines which token is associated with the incoming event. The `authorize` function is passed source data that sometimes contains a `userId`, `conversationId`, `enterpriseId`, `teamId` and `isEnterpriseInstall` (depending which information the incoming event contains). An `authorize` function should either return a `botToken`, `botId`, and `botUserId`, or could return a `userToken`. If using [built-in OAuth support](/bolt-js/concepts#authenticating-oauth), an `authorize` function will automatically be created so you do not need to pass one in. More information about `authorization` functions can be found on | -| `logger` | Option that allows you to pass a custom logger rather than using the built-in one. Loggers must implement specific methods ([the `Logger` interface](https://github.com/slackapi/node-slack-sdk/blob/main/packages/logger/src/index.ts)), which includes `setLevel(level: LogLevel)`, `getLevel()`, `setName(name: string)`, `debug(...msgs: any[])`, `info(...msgs: any[])`, `warn(...msgs: any[])`, and `error(...msgs: any[])`. More information about logging are [in the documentation](/bolt-js/concepts#logging) | -| `logLevel` | Option to control how much or what kind of information is logged. The `LogLevel` export contains the possible levels–in order of most to least information: `DEBUG`, `INFO`, `WARN`, and `ERROR`. By default, `logLevel` is set to `INFO`. More information on logging can be found [in the documentation](/bolt-js/concepts#logging). | -| `extendedErrorHandler` | Option that accepts a `boolean` value. When set to `true`, the global error handler is passed an object with additional request context. Available from version 3.8.0, defaults to `false`. More information on advanced error handling can be found [in the documentation](/bolt-js/concepts#error-handling). | +| `authorize` | Function for multi-team installations that determines which token is associated with the incoming event. The `authorize` function is passed source data that sometimes contains a `userId`, `conversationId`, `enterpriseId`, `teamId` and `isEnterpriseInstall` (depending which information the incoming event contains). An `authorize` function should either return a `botToken`, `botId`, and `botUserId`, or could return a `userToken`. If using [built-in OAuth support](/concepts/authenticating-oauth), an `authorize` function will automatically be created so you do not need to pass one in. More information about `authorization` functions can be found on | +| `logger` | Option that allows you to pass a custom logger rather than using the built-in one. Loggers must implement specific methods ([the `Logger` interface](https://github.com/slackapi/node-slack-sdk/blob/main/packages/logger/src/index.ts)), which includes `setLevel(level: LogLevel)`, `getLevel()`, `setName(name: string)`, `debug(...msgs: any[])`, `info(...msgs: any[])`, `warn(...msgs: any[])`, and `error(...msgs: any[])`. More information about logging are [in the documentation](/concepts/logging) | +| `logLevel` | Option to control how much or what kind of information is logged. The `LogLevel` export contains the possible levels–in order of most to least information: `DEBUG`, `INFO`, `WARN`, and `ERROR`. By default, `logLevel` is set to `INFO`. More information on logging can be found [in the documentation](/concepts/logging). | +| `extendedErrorHandler` | Option that accepts a `boolean` value. When set to `true`, the global error handler is passed an object with additional request context. Available from version 3.8.0, defaults to `false`. More information on advanced error handling can be found [in the documentation](/concepts/error-handling). | | `ignoreSelf` | `boolean` to enable a middleware function that ignores any messages coming from your app. Requires a `botId`. Defaults to `true`. | | `clientOptions.slackApiUrl` | Allows setting a custom endpoint for the Slack API. Used most often for testing. | -| `socketMode` | Option that accepts a `boolean` value. When set to `true` the app is started in [Socket Mode](/bolt-js/concepts#socket-mode), i.e. it allows your app to connect and receive data from Slack via a WebSocket connection. Defaults to `false`. +| `socketMode` | Option that accepts a `boolean` value. When set to `true` the app is started in [Socket Mode](/concepts/socket-mode), i.e. it allows your app to connect and receive data from Slack via a WebSocket connection. Defaults to `false`. | `developerMode` | `boolean` to activate the developer mode. When set to `true` the `logLevel` is automatically set to `DEBUG` and `socketMode` is set to `true`. However, explicitly setting these two properties takes precedence over implicitly setting them via `developerMode`. Furthermore, a custom OAuth failure handler is provided to help debugging. Finally, the body of all incoming requests are logged and thus sensitive information like tokens might be contained in the logs. Defaults to `false`. | | `deferInitialization` | `boolean` to defer initialization of the app and places responsibility for manually calling the `async` `App#init()` method on the developer. `init()` must be called before `App#start()`. Defaults to `false`. | | `signatureVerification` | `boolean` that determines whether Bolt should [verify Slack's signature on incoming requests](https://api.slack.com/authentication/verifying-requests-from-slack). Defaults to `true`. | -> Bolt's client is an instance of `WebClient` from the [Node Slack SDK](/node-slack-sdk), so some of that documentation may be helpful as you're developing. +:::info + +Bolt's client is an instance of `WebClient` from the [Node Slack SDK](https://slack.dev/node-slack-sdk), so some of that documentation may be helpful as you're developing. + +::: ## Framework error types Bolt includes a set of error types to make errors easier to handle, with more specific contextual information. Below is a non-exhaustive list of error codes you may run into during development: | Error code | Details | -| :---: | :--- | +| :--- | :--- | | `AppInitializationError` | Invalid initialization options were passed. This could include not passing a signing secret, or passing in conflicting options (for example, you can't pass in both `token` and `authorize`). Includes an `original` property with more details. This error is only thrown during initialization (within the App's constructor). | | `AuthorizationError` | Error exclusively thrown when installation information can't be fetched or parsed. You may encounter this error when using the built-in OAuth support, or you may want to import and use this error when building your own `authorize` function. | | `ContextMissingPropertyError` | Error thrown when the `context` object is missing necessary information, such as not including `botUserId` or `botId` when `ignoreSelf` is set to `true`. The missing property is available in the `missingProperty` property. | | `ReceiverMultipleAckError` | Error thrown within Receiver when your app calls `ack()` when that request has previously been acknowledged. Currently only used in the default `HTTPReceiver`. | | `ReceiverAuthenticityError` | Error thrown when your app's request signature could not be verified. The error includes information on why it failed, such as an invalid timestamp, missing headers, or invalid signing secret. | `MultipleListenerError` | Thrown when multiple errors occur when processing multiple listeners for a single event. Includes an `originals` property with an array of the individual errors. | -| `WorkflowStepInitializationError` | Error thrown when configuration options are invalid or missing when instantiating a new `WorkflowStep` instance. This could be scenarios like not including a `callback_id`, or not including a configuration object. More information on Workflow Steps [can be found in the documentation](concepts#steps). | +| `WorkflowStepInitializationError` | Error thrown when configuration options are invalid or missing when instantiating a new `WorkflowStep` instance. This could be scenarios like not including a `callback_id`, or not including a configuration object. More information on Workflow Steps [can be found in the documentation](/concepts/steps). | | `UnknownError` | An error that was thrown inside the framework but does not have a specified error code. Contains an `original` property with more details. | -> You can read the code for error definition and construction [in errors.ts](https://github.com/slackapi/bolt-js/blob/main/src/errors.ts). +:::info + +You can find the code for error definition and construction within [errors.ts](https://github.com/slackapi/bolt-js/blob/main/src/errors.ts). + +::: ### Client errors -Bolt imports a `WebClient` to call Slack's APIs. Below is a set of errors you may encounter when making API calls with the client, though you can read more [in the web API documentation](/node-slack-sdk/web-api#handle-errors). When handling client errors, more information can be found in the body within the `data` property. +Bolt imports a `WebClient` to call Slack's APIs. Below is a set of errors you may encounter when making API calls with the client, though you can read more [in the web API documentation](https://slack.dev/node-slack-sdk/web-api#handle-errors). When handling client errors, more information can be found in the body within the `data` property. -| Error code | Details | -| :---: | :--- | +| Error code | Details | +| :--- | :--- | | `PlatformError` | Error received when calling a Slack API. Includes a `data` property. | | `RequestError` | A request could not be sent, perhaps because your network connection is not available. It has an `original` property with more details. | -| `RateLimitedError` | Your app has made too many requests too quickly. Inclues a `retryAfter` property with the number of seconds you should wait before trying to send again. The `WebClient` will handle rate limit errors by default–[you can read more in the documentation](/node-slack-sdk/web-api#rate-limits). | +| `RateLimitedError` | Your app has made too many requests too quickly. Includes a `retryAfter` property with the number of seconds you should wait before trying to send again. The `WebClient` will handle rate limit errors by default–[you can read more in the documentation](https://slack.dev/node-slack-sdk/web-api#rate-limits). | | `HTTPError` | The HTTP response contained an unfamiliar status code. The Web API only responds with `200` (including for errors), or `429` for rate limiting. | diff --git a/docs/_steps/adding_editing_workflow_step.md b/docs/content/steps/adding-editing-steps.md similarity index 79% rename from docs/_steps/adding_editing_workflow_step.md rename to docs/content/steps/adding-editing-steps.md index 711fce538..da8330d07 100644 --- a/docs/_steps/adding_editing_workflow_step.md +++ b/docs/content/steps/adding-editing-steps.md @@ -1,11 +1,18 @@ --- title: Adding or editing workflow steps lang: en -slug: adding-editing-steps -order: 3 +slug: /concepts/adding-editing-steps --- -
    +:::danger + +Workflow Steps from Apps are a deprecated feature. + +Workflow Steps from Apps are different than, and not interchangable with, Slack automation workflows. We encourage those who are currently publishing Workflow Steps from Apps to consider the new [Slack automation features](https://api.slack.com/automation), such as [custom functions for Bolt](/concepts/creating-custom-functions). + +Please [read the Slack API changelog entry](https://api.slack.com/changelog/2023-08-workflow-steps-from-apps-step-back) for more information. + +::: When a builder adds (or later edits) your step in their workflow, your app will receive a [`workflow_step_edit` event](https://api.slack.com/reference/workflows/workflow_step_edit). The `edit` callback in your `WorkflowStep` configuration will be run when this event is received. @@ -15,8 +22,6 @@ Within the `edit` callback, the `configure()` utility can be used to easily open To learn more about opening configuration modals, [read the documentation](https://api.slack.com/workflows/steps#handle_config_view). -
    - ```javascript const ws = new WorkflowStep('add_task', { edit: async ({ ack, step, configure }) => { @@ -62,4 +67,4 @@ const ws = new WorkflowStep('add_task', { save: async ({ ack, step, update }) => {}, execute: async ({ step, complete, fail }) => {}, }); -``` +``` \ No newline at end of file diff --git a/docs/_steps/creating_workflow_step.md b/docs/content/steps/creating-steps.md similarity index 65% rename from docs/_steps/creating_workflow_step.md rename to docs/content/steps/creating-steps.md index 56a2e3449..f8a6e0620 100644 --- a/docs/_steps/creating_workflow_step.md +++ b/docs/content/steps/creating-steps.md @@ -1,11 +1,18 @@ --- -title: Creating workflow steps +title: Creating workflow steps lang: en -slug: creating-steps -order: 2 +slug: /concepts/creating-steps --- -
    +:::danger + +Workflow Steps from Apps are a deprecated feature. + +Workflow Steps from Apps are different than, and not interchangable with, Slack automation workflows. We encourage those who are currently publishing Workflow Steps from Apps to consider the new [Slack automation features](https://api.slack.com/automation), such as [custom functions for Bolt](/concepts/creating-custom-functions). + +Please [read the Slack API changelog entry](https://api.slack.com/changelog/2023-08-workflow-steps-from-apps-step-back) for more information. + +::: To create a workflow step, Bolt provides the `WorkflowStep` class. @@ -15,8 +22,6 @@ The configuration object contains three properties: `edit`, `save`, and `execute After instantiating a `WorkflowStep`, you can pass it into `app.step()`. Behind the scenes, your app will listen and respond to the workflow step’s events using the callbacks provided in the configuration object. -
    - ```javascript const { App, WorkflowStep } = require('@slack/bolt'); @@ -34,4 +39,4 @@ const ws = new WorkflowStep('add_task', { }); app.step(ws); -``` +``` \ No newline at end of file diff --git a/docs/_steps/executing_workflow_steps.md b/docs/content/steps/executing-steps.md similarity index 77% rename from docs/_steps/executing_workflow_steps.md rename to docs/content/steps/executing-steps.md index ffc5b0cd0..c97f19693 100644 --- a/docs/_steps/executing_workflow_steps.md +++ b/docs/content/steps/executing-steps.md @@ -1,11 +1,18 @@ --- title: Executing workflow steps lang: en -slug: executing-steps -order: 5 +slug: /concepts/executing-steps --- -
    +:::danger + +Workflow Steps from Apps are a deprecated feature. + +Workflow Steps from Apps are different than, and not interchangable with, Slack automation workflows. We encourage those who are currently publishing Workflow Steps from Apps to consider the new [Slack automation features](https://api.slack.com/automation), such as [custom functions for Bolt](/concepts/creating-custom-functions). + +Please [read the Slack API changelog entry](https://api.slack.com/changelog/2023-08-workflow-steps-from-apps-step-back) for more information. + +::: When your workflow step is executed by an end user, your app will receive a [`workflow_step_execute` event](https://api.slack.com/events/workflow_step_execute). The `execute` callback in your `WorkflowStep` configuration will be run when this event is received. @@ -13,8 +20,6 @@ Using the `inputs` from the `save` callback, this is where you can make third-pa Within the `execute` callback, your app must either call `complete()` to indicate that the step's execution was successful, or `fail()` to indicate that the step's execution failed. -
    - ```javascript const ws = new WorkflowStep('add_task', { edit: async ({ ack, step, configure }) => {}, @@ -41,4 +46,4 @@ const ws = new WorkflowStep('add_task', { // fail({ error: { message: "Just testing step failure!" } }).then(() => { console.log('workflow step execution failure registered'); }); }, }); -``` +``` \ No newline at end of file diff --git a/docs/_steps/saving_workflow_step.md b/docs/content/steps/saving-steps.md similarity index 75% rename from docs/_steps/saving_workflow_step.md rename to docs/content/steps/saving-steps.md index d6a06ae70..8b7f0447b 100644 --- a/docs/_steps/saving_workflow_step.md +++ b/docs/content/steps/saving-steps.md @@ -1,11 +1,18 @@ --- title: Saving step configurations lang: en -slug: saving-steps -order: 4 +slug: /concepts/saving-steps --- -
    +:::danger + +Workflow Steps from Apps are a deprecated feature. + +Workflow Steps from Apps are different than, and not interchangable with, Slack automation workflows. We encourage those who are currently publishing Workflow Steps from Apps to consider the new [Slack automation features](https://api.slack.com/automation), such as [custom functions for Bolt](/concepts/creating-custom-functions). + +Please [read the Slack API changelog entry](https://api.slack.com/changelog/2023-08-workflow-steps-from-apps-step-back) for more information. + +::: After the configuration modal is opened, your app will listen for the `view_submission` event. The `save` callback in your `WorkflowStep` configuration will be run when this event is received. @@ -18,8 +25,6 @@ Within the `save` callback, the `update()` method can be used to save the builde To learn more about how to structure these parameters, [read the documentation](https://api.slack.com/reference/workflows/workflow_step). -
    - ```javascript const ws = new WorkflowStep('add_task', { edit: async ({ ack, step, configure }) => {}, @@ -52,4 +57,4 @@ const ws = new WorkflowStep('add_task', { }, execute: async ({ step, complete, fail }) => {}, }); -``` +``` \ No newline at end of file diff --git a/docs/content/steps/steps.md b/docs/content/steps/steps.md new file mode 100644 index 000000000..54aeb1962 --- /dev/null +++ b/docs/content/steps/steps.md @@ -0,0 +1,29 @@ +--- +title: Overview of Workflow Steps from Apps +lang: en +slug: /concepts/steps +--- + +:::danger + +Workflow Steps from Apps are a deprecated feature. + +Workflow Steps from Apps are different than, and not interchangable with, Slack automation workflows. We encourage those who are currently publishing Workflow Steps from Apps to consider the new [Slack automation features](https://api.slack.com/automation), such as [custom functions for Bolt](/concepts/creating-custom-functions). + +Please [read the Slack API changelog entry](https://api.slack.com/changelog/2023-08-workflow-steps-from-apps-step-back) for more information. + +::: + +--- + +Workflow Steps from Apps allow your app to create and process custom workflow steps that users can add using [Workflow Builder](https://api.slack.com/workflows). + +A workflow step is made up of three distinct user events: + +- Adding or editing the step in a Workflow +- Saving or updating the step's configuration +- The end user's execution of the step + +All three events must be handled for a workflow step to function. + +Read more about Workflow Steps from Apps in the [API documentation](https://api.slack.com/legacy/workflows/steps). \ No newline at end of file diff --git a/docs/_tutorials/getting_started_http.md b/docs/content/tutorial/getting-started-http.md similarity index 83% rename from docs/_tutorials/getting_started_http.md rename to docs/content/tutorial/getting-started-http.md index 86075a63e..8be737eb3 100644 --- a/docs/_tutorials/getting_started_http.md +++ b/docs/content/tutorial/getting-started-http.md @@ -1,19 +1,11 @@ --- -title: Getting started with HTTP -order: 5 +title: Getting started with Bolt for JavaScript and HTTP slug: getting-started-http lang: en -layout: tutorial -permalink: /tutorial/getting-started-http -redirect_from: - - /getting-started-http --- -# Getting started with Bolt for JavaScript and HTTP -
    This guide is meant to walk you through getting up and running with a Slack app using Bolt for JavaScript. Along the way, we’ll create a new Slack app, set up your local environment, and develop an app that listens and responds to messages from a Slack workspace. -
    - + When you’re finished, you’ll have this ⚡️[Getting Started app](https://github.com/slackapi/bolt-js-getting-started-app) to run, modify, and make your own. --- @@ -21,13 +13,17 @@ When you’re finished, you’ll have this ⚡️[Getting Started app](https://g ### Create an app {#create-an-app} First thing's first: before you start developing with Bolt, you'll want to [create a Slack app](https://api.slack.com/apps/new). -> 💡 We recommend using a workspace where you won't disrupt real work getting done — [you can create a new one for free](https://slack.com/get-started#create). +:::tip + +We recommend using a workspace where you won't disrupt real work getting done — [you can create a new one for free](https://slack.com/get-started#create). + +::: After you fill out an app name (_you can change it later_) and pick a workspace to install it to, hit the `Create App` button and you'll land on your app's **Basic Information** page. This page contains an overview of your app in addition to important credentials you'll need later, like the `Signing Secret` under the **App Credentials** header. -![Basic Information page](../assets/basic-information-page.png "Basic Information page") +![Basic Information page](/img/basic-information-page.png "Basic Information page") Look around, add an app icon and description, and then let's start configuring your app. 🔩 @@ -51,9 +47,13 @@ For brevity, we're going to use bot tokens for this guide. 4. Once you authorize the installation, you'll land on the **OAuth & Permissions** page and see a **Bot User OAuth Access Token**. -![OAuth Tokens](../assets/bot-token.png "Bot OAuth Token") +![OAuth Tokens](/img/bot-token.png "Bot OAuth Token") -> 💡 Treat your token like a password and [keep it safe](https://api.slack.com/docs/oauth-safety). Your app uses it to post and retrieve information from Slack workspaces. +:::tip + +Treat your token like a password and [keep it safe](https://api.slack.com/docs/oauth-safety). Your app uses it to post and retrieve information from Slack workspaces. + +::: --- @@ -73,6 +73,7 @@ You’ll be prompted with a series of questions to describe your new project (yo Before we install the Bolt for JavaScript package to your new project, let's save the **bot token** and **Signing Secret** that were generated when you configured your app. 1. **Copy your Signing Secret from the Basic Information page** and then store it in a new environment variable. The following example works on Linux and macOS; but [similar commands are available on Windows](https://superuser.com/questions/212150/how-to-set-env-variable-in-windows-cmd-line/212153#212153). + ```shell export SLACK_SIGNING_SECRET= ``` @@ -82,8 +83,11 @@ export SLACK_SIGNING_SECRET= export SLACK_BOT_TOKEN=xoxb- ``` -> 🔒 Remember to keep your token and signing secret secure. At a minimum, you should avoid checking them into public version control, and access them via environment variables as we've done above. Checkout the API documentation for more on [best practices for app security](https://api.slack.com/authentication/best-practices). +:::warning +Remember to keep your token and signing secret secure. At a minimum, you should avoid checking them into public version control, and access them via environment variables as we've done above. Checkout the API documentation for more on [best practices for app security](https://api.slack.com/authentication/best-practices). + +::: Now, let's create your app. Install the `@slack/bolt` package and save it to your `package.json` dependencies using the following command: @@ -131,7 +135,11 @@ Let's enable events for your app: 2. Add your Request URL. Slack will send HTTP POST requests corresponding to events to this [Request URL](https://api.slack.com/apis/connections/events-api#the-events-api__subscribing-to-event-types__events-api-request-urls) endpoint. Bolt uses the `/slack/events` path to listen to all incoming requests (whether shortcuts, events, or interactivity payloads). When configuring your Request URL within your app configuration, you'll append `/slack/events`, e.g. `https:///slack/events`. 💡 -> 💡 For local development, you can use a proxy service like [ngrok](https://ngrok.com/) to create a public URL and tunnel requests to your development environment. Refer to [ngrok's getting started guide](https://ngrok.com/docs#getting-started-expose) on how to create this tunnel. +:::info + +For local development, you can use a proxy service like [ngrok](https://ngrok.com/) to create a public URL and tunnel requests to your development environment. Refer to [ngrok's getting started guide](https://ngrok.com/docs#getting-started-expose) on how to create this tunnel. + +::: Finally, it's time to tell Slack what events we'd like to listen for. Under **Event Subscriptions**, toggle the switch labeled **Enable Events**. @@ -184,7 +192,11 @@ This is a basic example, but it gives you a place to start customizing your app To use features like buttons, select menus, datepickers, modals, and shortcuts, you’ll need to enable interactivity. Similar to events, you'll need to specify a Request URL for Slack to send the action (such as *user clicked a button*). Head over to **Interactivity & Shortcuts** in your app configuration. -> 💡 By default, Bolt uses the same endpoint for interactive components that it uses for events, so use the same request URL as above (in the example, it was `https://8e8ec2d7.ngrok.io/slack/events`). Press the **Save Changes** button in the lower right hand corner, and that's it. Your app is set up to handle interactivity! +:::info + +By default, Bolt uses the same endpoint for interactive components that it uses for events, so use the same request URL as above (in the example, it was `https://8e8ec2d7.ngrok.io/slack/events`). Press the **Save Changes** button in the lower right hand corner, and that's it. Your app is set up to handle interactivity! + +::: When interactivity is enabled, interactions with shortcuts, modals, or interactive components (such as buttons, select menus, and datepickers) will be sent to your app as events. @@ -239,7 +251,11 @@ The value inside of `say()` is now an object that contains an array of `blocks`. You'll notice in the button `accessory` object, there is an `action_id`. This will act as a unique identifier for the button so your app can specify what action it wants to respond to. -> 💡 The [Block Kit Builder](https://app.slack.com/block-kit-builder) is a simple way to prototype your interactive messages. The builder lets you (or anyone on your team) mockup messages and generates the corresponding JSON that you can paste directly in your app. +:::tip + +The [Block Kit Builder](https://app.slack.com/block-kit-builder) is a simple way to prototype your interactive messages. The builder lets you (or anyone on your team) mockup messages and generates the corresponding JSON that you can paste directly in your app. + +::: Now, if you restart your app and say "hello" in a channel your app is in, you'll see a message with a button. But if you click the button, nothing happens (*yet!*). @@ -301,10 +317,10 @@ You just built your first [Bolt for JavaScript app](https://github.com/slackapi/ Now that you have a basic app up and running, you can start exploring how to make your Bolt app stand out. Here are some ideas about what to explore next: -* Read through the [Basic concepts](/bolt-js/concepts#basic) to learn about the different methods and features your Bolt app has access to. +* Read through the Basic concepts to learn about the different methods and features your Bolt app has access to. -* Explore the different events your bot can listen to with the [`events()` method](/bolt-js/concepts#event-listening). All of the events are listed [on the API site](https://api.slack.com/events). +* Explore the different events your bot can listen to with the [`events()` method](/concepts/event-listening). All of the events are listed [on the API site](https://api.slack.com/events). -* Bolt allows you to [call Web API methods](/bolt-js/concepts#web-api) with the client attached to your app. There are [over 220 methods](https://api.slack.com/methods) on our API site. +* Bolt allows you to [call Web API methods](/concepts/web-api) with the client attached to your app. There are [over 200 methods](https://api.slack.com/methods) on our API site. -* Learn more about the different token types [on our API site](https://api.slack.com/docs/token-types). Your app may need different tokens depending on the actions you want it to perform. If you are using [Socket Mode](/bolt-js/tutorial/getting-started) instead of HTTP, an additional (`xapp`) token with `connections:write` scopes is required. +* Learn more about the different token types [on our API site](https://api.slack.com/docs/token-types). Your app may need different tokens depending on the actions you want it to perform. If you are using [Socket Mode](/getting-started) instead of HTTP, an additional (`xapp`) token with `connections:write` scopes is required. diff --git a/docs/_tutorials/hubot_migration.md b/docs/content/tutorial/hubot-migration.md similarity index 81% rename from docs/_tutorials/hubot_migration.md rename to docs/content/tutorial/hubot-migration.md index 27896d1ec..fd3144884 100644 --- a/docs/_tutorials/hubot_migration.md +++ b/docs/content/tutorial/hubot-migration.md @@ -1,20 +1,14 @@ --- -title: Migrating Hubot apps -order: 3 +title: Migrating apps from Hubot to Bolt for JavaScript slug: hubot-migration lang: en layout: tutorial -permalink: /tutorial/hubot-migration -redirect_from: - - /hubot-migration --- -# Migrating apps from Hubot to Bolt for JavaScript -
    Bolt was created to reduce the time and complexity it takes to build Slack apps. It provides Slack developers a single interface to build using modern features and best practices. This guide is meant to step you through the process of migrating your app from using [Hubot](https://hubot.github.com/docs/) to Bolt for JavaScript. If you already have an [app with a bot user](https://api.slack.com/bot-users#getting-started) or if you’re looking for code samples that translate Hubot code to Bolt for JavaScript code, you may find it valuable to start by reading through the [example script in the Bolt for JavaScript repository](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js). -
    + --- @@ -37,7 +31,11 @@ If you have access to an existing Slack app with a bot user, you can [jump ahead The first thing you’ll want to do is [create a Slack app](https://api.slack.com/apps/new). -> 💡We recommend using a workspace where you won’t disrupt real work getting done — you can create a new one for free. +:::tip + +We recommend using a workspace where you won’t disrupt real work getting done — you can create a new one for free. + +::: After you fill out your app’s name and pick a workspace to install it to, hit the `Create App` button and you’ll land on your app’s **Basic Information** page. @@ -53,12 +51,16 @@ To add a bot user to your new app, click **Bot Users** on the left sidebar and t ### Configure what your bot will hear {#configure-what-your-bot-will-hear} The [Events API](https://api.slack.com/bot-users#app-mentions-response) is a bot's equivalent of eyes and ears. It gives a bot a way to react to posted messages, changes to channels, and other activities that happen in Slack. -> ⚠️Before you configure your bot’s events, you’ll need a public URL. If you’ve never created a Bolt for JavaScript app or never used the Events API, it’d be helpful to go through [setting up your local Bolt project](https://slack.dev/bolt/tutorial/getting-started#setting-up-your-local-project) and [setting up events](https://slack.dev/bolt/tutorial/getting-started#setting-up-events) in the Getting Started guide. +:::info + +Before you configure your bot’s events, you’ll need a public URL. If you’ve never created a Bolt for JavaScript app or never used the Events API, it’d be helpful to go through [setting up your local Bolt project](/getting-started) and [setting up events](https://slack.dev/getting-started#setting-up-events) in the Getting Started guide. + +::: #### Listening for messages All Hubot apps can listen to messages by default, so we need to configure your bot user to do the same. -After walking through [setting up events](https://slack.dev/bolt/tutorial/getting-started#setting-up-events), your Request URL should be verified. Scroll down to **Subscribe to Bot Events**. There are four events related to messages: `message.channels` (listens for messages in public channels), `message.groups` (listens for messages in private channels), `message.im` (listens for messages in the App Home/DM space), and `message.mpim` (listens for messages in multi-person DMs). +After walking through [setting up events](/getting-started#setting-up-events), your Request URL should be verified. Scroll down to **Subscribe to Bot Events**. There are four events related to messages: `message.channels` (listens for messages in public channels), `message.groups` (listens for messages in private channels), `message.im` (listens for messages in the App Home/DM space), and `message.mpim` (listens for messages in multi-person DMs). If you only want your bot to listen to messages in channels, you can listen to `message.channels` and `message.groups`. Or if you want your bot to listen to messages from everywhere it is, choose all four message events. @@ -70,7 +72,11 @@ Your Hubot app may have responded to other events depending on what functionalit - If your app uses `react`, subscribe to the `reaction_added` event. This listens for any time a reaction is added to a message in channels your bot user is in. - If your app uses `presenceChange`, there is no corresponding event. If this event is important to your bot’s functionality, you may have to continue using Hubot or modify the app’s logic. -> 💡An added benefit to Bolt is you can listen to any [Events API event](https://api.slack.com/events). So after you’re done migrating, you can listen to more events like [when a user joins the workspace](https://api.slack.com/events/team_join) or [when a user opens a DM with your app](https://api.slack.com/events/app_home_opened). +:::info + +An added benefit to Bolt is you can listen to any [Events API event](https://api.slack.com/events). So after you’re done migrating, you can listen to more events like [when a user joins the workspace](https://api.slack.com/events/team_join) or [when a user opens a DM with your app](https://api.slack.com/events/app_home_opened). + +::: After you added events that correspond to your app’s functionality, click **Save Changes**. @@ -79,14 +85,18 @@ Bolt’s interface was designed to conform to the Slack API language as much as Bolt for JavaScript doesn’t use `res` or expose the raw request from Slack. Instead, you can use the payload body from `payload`, or common functionality like sending a message using `say()`. -> ⚙️To make it easier, we’ve created a sample script on GitHub that [showcases Hubot’s core functionality using equivalent functionality written with Bolt for JavaScript](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js). +:::info + +To make it easier, we’ve created a sample script on GitHub that [showcases Hubot’s core functionality using equivalent functionality written with Bolt for JavaScript](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js). + +::: #### Listening to patterns using `message()` Hubot scripts use `hear()` listen to messages with a matching pattern. Bolt for JavaScript instead uses `message()` and accepts a `string` or `RegExp` for the pattern. -> 👨‍💻👩‍💻Anywhere where you use `hear()` in your code, change it to use `message()` +👨‍💻👩‍💻 Anywhere where you use `hear()` in your code, change it to use `message()` -[Read more about listening to messages](https://slack.dev/bolt/concepts#message-listening). +[Read more about listening to messages](/concepts/message-listening). #### Responding with a message using `say()` and `respond()` Hubot scripts use `send()` to send a message to the same conversation and `reply()` to send a message to the same conversation with an @-mention to the user that sent the original message. @@ -95,9 +105,9 @@ Bolt for JavaScript uses `await say()` in place of `send()`, or `await respond() The arguments for Hubot’s `send()` and Bolt for JavaScript's `say()` are mostly the same, although `say()` allows you to send messages with [interactive components like buttons, select menus, and datepickers](https://api.slack.com/messaging/interactivity#interaction). -> 👨‍💻👩‍💻Anywhere where you use `send()` in your code, change it to use `await say()` +👨‍💻👩‍💻 Anywhere where you use `send()` in your code, change it to use `await say()` -[Read more about responding to messages](https://slack.dev/bolt/concepts#message-sending). +[Read more about responding to messages](/concepts/message-sending). #### `respond` and `react` @@ -105,9 +115,9 @@ In the previous section, you should have subscribed your app to the `app_mention Bolt for JavaScript uses a method called `event()` that allows you to listen to any [Events API event](https://api.slack.com/events). To change your code, you’ll just change any `respond()` to `app.event(‘app_mention’)` and any `react()` to `app.event(‘reaction_added’)`. This is detailed more [in the example script](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js). -> 👨‍💻👩‍💻Anywhere where you use `respond()` in your code, change it to use `app.event(‘app_mention’)`. Anywhere you use `react`, change it to `app.event(‘reaction_added’)`. +👨‍💻👩‍💻 Anywhere where you use `respond()` in your code, change it to use `app.event(‘app_mention’)`. Anywhere you use `react`, change it to `app.event(‘reaction_added’)`. -[Read more about listening to events](https://slack.dev/bolt/concepts#event-listening). +[Read more about listening to events](/concepts/event-listening). ### Using Web API methods with Bolt for JavaScript {#using-web-api-methods-with-bolt-for-javascript} In Hubot, you needed to import the `WebClient` package from `@slack/client`. Bolt for JavaScript imports a `WebClient` instance for you by default, and exposes it as the `client` argument available on all listeners. @@ -130,16 +140,16 @@ app.message('react', async ({ message, context, client, logger }) => { }); ``` -> 👨‍💻👩‍💻Change your Web API calls to use one the `client` argument. +👨‍💻👩‍💻 Change your Web API calls to use one the `client` argument. -[Read more about using the Web API with Bolt](https://slack.dev/bolt/concepts#web-api). +[Read more about using the Web API with Bolt](/concepts/web-api). ### Using middleware with Bolt for JavaScript {#using-middleware-with-bolt-for-javascript} Hubot has three kinds of middleware: receive (runs before any listeners are called), listener (runs for every matching listener), and response (runs for every response sent). Bolt for JavaScript only has two kinds of middleware — global and listener: -- Global middleware runs before any listener middleware is called. It’s attached to the Bolt for JavaScript app itself. [Read more about Bolt for JavaScript's global middleware](https://slack.dev/bolt/concepts#global-middleware). -- Listener middleware only runs for listener functions it’s attached to. [Read more about Bolt for JavaScript's listener middleware](https://slack.dev/bolt/concepts#listener-middleware). +- Global middleware runs before any listener middleware is called. It’s attached to the Bolt for JavaScript app itself. [Read more about Bolt for JavaScript's global middleware](/concepts/global-middleware). +- Listener middleware only runs for listener functions it’s attached to. [Read more about Bolt for JavaScript's listener middleware](/concepts/listener-middleware). In Bolt for JavaScript, both kinds of middleware must call `await next()` to pass control of execution from one middleware to the next. If your middleware encounters an error during execution, you can `throw` it and the error will be bubbled up through the previously-executed middleware chain. @@ -156,14 +166,14 @@ The default, built-in conversation store uses an in-memory store similar to Hubo If there is more than one instance of your app running, the built-in conversation store will not be shared among the processes so you’ll want to implement a conversation store that fetches conversation state from a database. -[Read more about conversation stores](https://slack.dev/bolt/concepts#conversation-store). +[Read more about conversation stores](/concepts/conversation-store). ### Next steps {#next-steps} If you’ve made it this far, it means you’ve likely converted your Hubot app into a Bolt for JavaScript app! ✨⚡ Now that you have your flashy new Bolt for JavaScript app, you can explore how to power it up: - Consider adding interactivity [like buttons and select menus](https://api.slack.com/messaging/interactivity#interaction). These weren’t supported by Hubot and will allow your app to include contextual actions when sending messages to Slack. -- Read [the documentation](/bolt-js/concepts) to explore what else is possible with Bolt for JavaScript. +- Read the rest of the documentation to explore what else is possible with Bolt for JavaScript. - Check out our [sample app](https://glitch.com/~slack-bolt) that shows you how to use events and interactive components. And if you have difficulties while developing, reach out to our developer support team to at [developers@slack.com](mailto:developers@slack.com), and if you run into a problem with the framework [open an issue on GitHub](https://github.com/slackapi/bolt-js/issues/new). diff --git a/docs/_tutorials/migration_v2.md b/docs/content/tutorial/migration-v2.md similarity index 83% rename from docs/_tutorials/migration_v2.md rename to docs/content/tutorial/migration-v2.md index a6b98a955..32b851037 100644 --- a/docs/_tutorials/migration_v2.md +++ b/docs/content/tutorial/migration-v2.md @@ -1,18 +1,16 @@ --- title: Migrating to V2 -order: 2 slug: migration-v2 -lang: en -layout: tutorial -permalink: /tutorial/migration-v2 +lang: en--- --- -# Migrating to v2.x -
    This guide will walk you through the process of updating your app from using `@slack/bolt@1.x` to `@slack/bolt@2.x`. There are a few changes you'll need to make but for most apps, these changes can be applied in 5 - 15 minutes. -*Note: Make sure to checkout our [support schedule](#slackbolt1x-support-schedule) for `@slack/bolt@1.x` if you don't plan on upgrading right away* -
    +:::info + +Make sure to checkout our [support schedule](#slackbolt1x-support-schedule) for `@slack/bolt@1.x` if you don't plan on upgrading right away* + +::: --- @@ -39,11 +37,11 @@ app.action('some-action-id', async ({action, ack, say}) => { ``` -### Error Handling {#error-handling} +### Error handling {#error-handling} The recent changes in Bolt for JavaScript V2 have improved our ability to catch errors and filter them to the global error handler. It is still recommended to manage errors in the listeners themselves instead of letting them propagate to the global handler when possible. -#### Handling Errors in Listeners with `try`/`catch` +#### Handling errors in listeners with `try`/`catch` ```javascript app.action('some-action-id', async ({action, ack, say, logger}) => { @@ -57,7 +55,7 @@ app.action('some-action-id', async ({action, ack, say, logger}) => { }) ``` -#### Handling Errors with the Global Error Handler +#### Handling errors with the global error handler ```javascript app.error(async (error) => { @@ -72,7 +70,7 @@ Other error related changes include: - If multiple errors occur when processing multiple listeners for a single event, Bolt for JavaScript will return a wrapper error with a `code` property of `ErrorCode.MultipleListenerError` and an `originals` property that contains an array of the individual errors. -### Message Shortcuts {#message-shortcuts} +### Message shortcuts {#message-shortcuts} [Message shortcuts](https://api.slack.com/interactivity/shortcuts/using#message_shortcuts) (previously referred to as message actions) now use the `shortcut()` method instead of the `action()` method. @@ -94,7 +92,7 @@ app.shortcut('message-action-callback', async ({shortcut, ack, context}) => { }) ``` -### Upgrading Middleware {#upgrading-middleware} +### Upgrading middleware {#upgrading-middleware} If you wrote a custom middleware, adjust your function to `async` and update `next()` to `await next()`. If your middleware does some post processing, instead of passing a function to `next()`, you can now run it after `await next()`. @@ -127,6 +125,6 @@ async function noBotMessages({ message, next }) { `@slack/bolt@1.x` will be deprecated on **June 30th, 2020**. We plan on continuing to implement bug fixes and will also consider back-porting new features on a case by case basis up until then. Once `@slack/bolt@1.x` has been deprecated, we will only implement **critical bug fixes** until the official end of life date and close non critical issues and pull requests. End of life is slated for **April 30th, 2021**. At this time, development will fully stop for `@slack/bolt@1.x` and all remaining open issues and pull requests will be closed. -### Minimum TypeScript Version {#minimum-typescript-version} +### Minimum TypeScript version {#minimum-typescript-version} -As outlined in our [using TypeScript guide](https://slack.dev/bolt/tutorial/using-typescript), `@slack/bolt@2.x` requires a minimum TypeScript version of 3.7. +`@slack/bolt@2.x` requires a minimum TypeScript version of 3.7. diff --git a/docs/_tutorials/migration_v3.md b/docs/content/tutorial/migration-v3.md similarity index 87% rename from docs/_tutorials/migration_v3.md rename to docs/content/tutorial/migration-v3.md index 496ad9733..73aa4c6b6 100644 --- a/docs/_tutorials/migration_v3.md +++ b/docs/content/tutorial/migration-v3.md @@ -1,22 +1,20 @@ --- title: Migrating to V3 -order: 2 slug: migration-v3 lang: en -layout: tutorial -permalink: /tutorial/migration-v3 --- -# Migrating to v3.x -
    This guide will walk you through the process of updating your app from using `@slack/bolt@2.x` to `@slack/bolt@3.x`. There are a few changes you'll need to make but for most apps, these changes can be applied in 5 - 15 minutes. -*Note: Make sure to checkout our [support schedule](#slackbolt2x-support-schedule) for `@slack/bolt@2.x` if you don't plan on upgrading right away* -
    +:::info + +Make sure to checkout our [support schedule](#slackbolt2x-support-schedule) for `@slack/bolt@2.x` if you don't plan on upgrading right away* + +::: --- -### Org Wide App Installation Changes to InstallationStore & orgAuthorize {#org-wide-app-installation-changes-to-installationstore--orgauthorize} +### Org wide app installation changes to Installation Store & orgAuthorize {#org-wide-app-installation-changes-to-installationstore--orgauthorize} In [Bolt for JavaScript 2.5.0](https://github.com/slackapi/bolt-js/releases/tag/%40slack%2Fbolt%402.5.0), we introduced support for [org wide app installations](https://api.slack.com/enterprise/apps). To add support to your applications, two new methods were introduced to the Installation Store used during OAuth, `fetchOrgInstallation` & `storeOrgInstallation`. With `@slack/bolt@3.x`, we have dropped support for these two new methods for a simpler interface and to be better aligned with Bolt for Python and Bolt for Java. See the code samples below for the recommended changes to migrate. @@ -103,16 +101,16 @@ const authorizeFn = async ({ teamId, enterpriseId, isEnterpriseInstall}) => { ### HTTP Receiver as default {#http-receiver-as-default} -In `@slack/bolt@3.x`, we have introduced a new default [`HTTPReceiver`](https://github.com/slackapi/bolt-js/issues/670) which replaces the previous default `ExpressReceiver`. This will allow Bolt for JavaScript apps to easily work with other popular web frameworks (Hapi.js, Koa, etc). `ExpressReceiver` is still being shipped with Bolt for JavaScript and `HTTPReceiver` will not provide all the same functionality. One use case that isn't supported by `HTTPReceiver` is creating custom routes (ex: create a route to do a health check). For these use cases, we recommend continuing to use `ExpressReceiver` by importing the class, and creating your own instance of it, and passing this instance into the constructor of `App`. See [our documentation on adding custom http routes](https://slack.dev/bolt-js/concepts#custom-routes) for an example. +In `@slack/bolt@3.x`, we have introduced a new default [`HTTPReceiver`](https://github.com/slackapi/bolt-js/issues/670) which replaces the previous default `ExpressReceiver`. This will allow Bolt for JavaScript apps to easily work with other popular web frameworks (Hapi.js, Koa, etc). `ExpressReceiver` is still being shipped with Bolt for JavaScript and `HTTPReceiver` will not provide all the same functionality. One use case that isn't supported by `HTTPReceiver` is creating custom routes (ex: create a route to do a health check). For these use cases, we recommend continuing to use `ExpressReceiver` by importing the class, and creating your own instance of it, and passing this instance into the constructor of `App`. See [our documentation on adding custom http routes](/concepts/custom-routes) for an example. ### @slack/bolt@2.x support schedule {#slackbolt2x-support-schedule} `@slack/bolt@2.x` will be deprecated on **January 12th, 2021**. We will only implement **critical bug fixes** until the official end of life date and close non critical issues and pull requests, which is slated for **May 31st, 2021**. At this time, development will fully stop for `@slack/bolt@2.x` and all remaining open issues and pull requests will be closed. -### Minimum Node Version {#minimum-node-version} +### Minimum Node version {#minimum-node-version} `@slack/bolt@3.x` requires a minimum Node version of `12.13.0` and minimum npm version of `6.12.0` . -### Minimum TypeScript Version {#minimum-typescript-version} +### Minimum TypeScript version {#minimum-typescript-version} -As outlined in our [using TypeScript guide](https://slack.dev/bolt/tutorial/using-typescript), `@slack/bolt@3.x` requires a minimum TypeScript version of `4.1`. +`@slack/bolt@3.x` requires a minimum TypeScript version of `4.1`. diff --git a/docs/docusaurus.config.js b/docs/docusaurus.config.js new file mode 100644 index 000000000..9452d0eea --- /dev/null +++ b/docs/docusaurus.config.js @@ -0,0 +1,186 @@ +// @ts-check +// `@type` JSDoc annotations allow editor autocompletion and type checking +// (when paired with `@ts-check`). +// There are various equivalent ways to declare your Docusaurus config. +// See: https://docusaurus.io/docs/api/docusaurus-config + +import {themes as prismThemes} from 'prism-react-renderer'; + +/** @type {import('@docusaurus/types').Config} */ +const config = { + title: 'Slack Developer Tools', + tagline: 'Official frameworks, libraries, and SDKs for Slack developers', + favicon: 'img/favicon.ico', + + url: 'https://slack.dev', + baseUrl: '/bolt-js/', + organizationName: 'slackapi', + projectName: 'bolt-js', + + onBrokenLinks: 'warn', + onBrokenAnchors: 'warn', + onBrokenMarkdownLinks: 'warn', + + i18n: { + defaultLocale: 'en', + locales: ['en','ja-jp'], + }, + + presets: [ + [ + 'classic', + /** @type {import('@docusaurus/preset-classic').Options} */ + ({ + docs: { + path: 'content', + breadcrumbs: false, + routeBasePath: '/', // Serve the docs at the site's root + sidebarPath: './sidebars.js', + editUrl: 'https://github.com/slackapi/bolt-js/tree/main/docs', + }, + blog: false, + theme: { + customCss: './src/css/custom.css', + }, + }), + ], + ], + + clientModules: [ + require.resolve('./redirects.js'), +], + + plugins: + ['docusaurus-theme-github-codeblock', + + ['@docusaurus/plugin-client-redirects', + { + redirects: [ + { + to: '/getting-started', + from: ['/tutorial/getting-started','/','/concepts', '/concepts/basic', '/concepts/advanced'], + }, + ], + }, + ], + ], + + themeConfig: + /** @type {import('@docusaurus/preset-classic').ThemeConfig} */ + ({ + colorMode: { + respectPrefersColorScheme: true, + }, + navbar: { + title: "Slack Developer Tools", + logo: { + alt: 'Slack logo', + src: 'img/slack-logo.svg', + href: 'https://slack.dev', + target : '_self' + }, + items: [ + { + type: 'dropdown', + label: 'Bolt', + position: 'left', + items: [ + { + label: 'Java', + to: 'https://slack.dev/java-slack-sdk/guides/bolt-basics', + target: '_self', + }, + { + label: 'JavaScript', + to: 'https://slack.dev/bolt-js', + target: '_self', + }, + { + label: 'Python', + to: 'https://slack.dev/bolt-python', + target: '_self', + }, + ] + }, + { + type: 'dropdown', + label: 'SDKs', + position: 'left', + items: [ + { + label: 'Java Slack SDK', + to: 'https://slack.dev/java-slack-sdk/', + target: '_self', + }, + { + label: 'Node Slack SDK', + to: 'https://slack.dev/node-slack-sdk/', + target: '_self', + }, + { + label: 'Python Slack SDK', + to: 'https://slack.dev/python-slack-sdk/', + target: '_self', + }, + { + label: 'Deno Slack SDK', + to: 'https://api.slack.com/automation/quickstart', + target: '_self', + }, + ] + }, + { + type: 'dropdown', + label: 'Community', + position: 'left', + items: [ + { + label: 'Community tools', + to: 'https://slack.dev/community-tools', + target: '_self', + }, + { + label: 'Slack Community', + to: 'https://slackcommunity.com/', + target: '_self', + }, + ] + }, + { + to: 'https://api.slack.com/docs', + label: 'API Docs', + target: '_self', + }, + { + type: 'localeDropdown', + position: 'right', + }, + { + 'aria-label': 'GitHub Repository', + 'className': 'navbar-github-link', + 'href': 'https://github.com/slackapi/bolt-js', + 'position': 'right', + target: '_self', + }, + ], + }, + footer: { + copyright: `

    Made with ♡ by Slack and pals like you

    `, + }, + prism: { + // switch to alucard when available in prism? + theme: prismThemes.github, + darkTheme: prismThemes.dracula, + }, + codeblock: { + showGithubLink: true, + githubLinkLabel: 'View on GitHub', + }, + // announcementBar: { + // id: `announcementBar`, + // content: `🎉️ Version 2.26.0 of the developer tools for the Slack automations platform is here! 🎉️ `, + // }, + }), +}; + +export default config; diff --git a/docs/i18n/ja-jp/code.json b/docs/i18n/ja-jp/code.json new file mode 100644 index 000000000..eb1a022fa --- /dev/null +++ b/docs/i18n/ja-jp/code.json @@ -0,0 +1,289 @@ +{ + "theme.NotFound.title": { + "message": "ページが見つかりません", + "description": "The title of the 404 page" + }, + "theme.NotFound.p1": { + "message": "お探しのページが見つかりませんでした", + "description": "The first paragraph of the 404 page" + }, + "theme.NotFound.p2": { + "message": "このページにリンクしているサイトの所有者にリンクが壊れていることを伝えてください", + "description": "The 2nd paragraph of the 404 page" + }, + "theme.ErrorPageContent.title": { + "message": "エラーが発生しました", + "description": "The title of the fallback page when the page crashed" + }, + "theme.BackToTopButton.buttonAriaLabel": { + "message": "先頭へ戻る", + "description": "The ARIA label for the back to top button" + }, + "theme.blog.archive.title": { + "message": "アーカイブ", + "description": "The page & hero title of the blog archive page" + }, + "theme.blog.archive.description": { + "message": "アーカイブ", + "description": "The page & hero description of the blog archive page" + }, + "theme.blog.paginator.navAriaLabel": { + "message": "ブログ記事一覧のナビゲーション", + "description": "The ARIA label for the blog pagination" + }, + "theme.blog.paginator.newerEntries": { + "message": "新しい記事", + "description": "The label used to navigate to the newer blog posts page (previous page)" + }, + "theme.blog.paginator.olderEntries": { + "message": "過去の記事", + "description": "The label used to navigate to the older blog posts page (next page)" + }, + "theme.blog.post.paginator.navAriaLabel": { + "message": "ブログ記事のナビゲーション", + "description": "The ARIA label for the blog posts pagination" + }, + "theme.blog.post.paginator.newerPost": { + "message": "新しい記事", + "description": "The blog post button label to navigate to the newer/previous post" + }, + "theme.blog.post.paginator.olderPost": { + "message": "過去の記事", + "description": "The blog post button label to navigate to the older/next post" + }, + "theme.blog.post.plurals": { + "message": "{count}件", + "description": "Pluralized label for \"{count} posts\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.blog.tagTitle": { + "message": "「{tagName}」タグの記事が{nPosts}件あります", + "description": "The title of the page for a blog tag" + }, + "theme.tags.tagsPageLink": { + "message": "全てのタグを見る", + "description": "The label of the link targeting the tag list page" + }, + "theme.colorToggle.ariaLabel": { + "message": "ダークモードを切り替える(現在は{mode})", + "description": "The ARIA label for the navbar color mode toggle" + }, + "theme.colorToggle.ariaLabel.mode.dark": { + "message": "ダークモード", + "description": "The name for the dark color mode" + }, + "theme.colorToggle.ariaLabel.mode.light": { + "message": "ライトモード", + "description": "The name for the light color mode" + }, + "theme.docs.breadcrumbs.navAriaLabel": { + "message": "パンくずリストのナビゲーション", + "description": "The ARIA label for the breadcrumbs" + }, + "theme.docs.DocCard.categoryDescription.plurals": { + "message": "{count}項目", + "description": "The default description for a category card in the generated index about how many items this category includes" + }, + "theme.docs.paginator.navAriaLabel": { + "message": "ドキュメントページ", + "description": "The ARIA label for the docs pagination" + }, + "theme.docs.paginator.previous": { + "message": "前へ", + "description": "The label used to navigate to the previous doc" + }, + "theme.docs.paginator.next": { + "message": "次へ", + "description": "The label used to navigate to the next doc" + }, + "theme.docs.tagDocListPageTitle.nDocsTagged": { + "message": "{count}記事", + "description": "Pluralized label for \"{count} docs tagged\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.tagDocListPageTitle": { + "message": "「{tagName}」タグのついた{nDocsTagged}", + "description": "The title of the page for a docs tag" + }, + "theme.docs.versionBadge.label": { + "message": "バージョン: {versionLabel}" + }, + "theme.docs.versions.unreleasedVersionLabel": { + "message": "これはリリース前のバージョン{versionLabel}の{siteTitle}のドキュメントです。", + "description": "The label used to tell the user that he's browsing an unreleased doc version" + }, + "theme.docs.versions.unmaintainedVersionLabel": { + "message": "これはバージョン{versionLabel}の{siteTitle}のドキュメントで現在はメンテナンスされていません", + "description": "The label used to tell the user that he's browsing an unmaintained doc version" + }, + "theme.docs.versions.latestVersionSuggestionLabel": { + "message": "最新のドキュメントは{latestVersionLink} ({versionLabel}) を見てください", + "description": "The label used to tell the user to check the latest version" + }, + "theme.docs.versions.latestVersionLinkLabel": { + "message": "最新バージョン", + "description": "The label used for the latest version suggestion link label" + }, + "theme.common.editThisPage": { + "message": "このページを編集", + "description": "The link label to edit the current page" + }, + "theme.lastUpdated.atDate": { + "message": "{date}に", + "description": "The words used to describe on which date a page has been last updated" + }, + "theme.lastUpdated.byUser": { + "message": "{user}が", + "description": "The words used to describe by who the page has been last updated" + }, + "theme.lastUpdated.lastUpdatedAtBy": { + "message": "{atDate}{byUser}最終更新", + "description": "The sentence used to display when a page has been last updated, and by who" + }, + "theme.common.headingLinkTitle": { + "message": "{heading} への直接リンク", + "description": "Title for link to heading" + }, + "theme.navbar.mobileVersionsDropdown.label": { + "message": "他のバージョン", + "description": "The label for the navbar versions dropdown on mobile view" + }, + "theme.tags.tagsListLabel": { + "message": "タグ:", + "description": "The label alongside a tag list" + }, + "theme.admonition.caution": { + "message": "注意", + "description": "The default label used for the Caution admonition (:::caution)" + }, + "theme.admonition.danger": { + "message": "危険", + "description": "The default label used for the Danger admonition (:::danger)" + }, + "theme.admonition.info": { + "message": "備考", + "description": "The default label used for the Info admonition (:::info)" + }, + "theme.admonition.note": { + "message": "注記", + "description": "The default label used for the Note admonition (:::note)" + }, + "theme.admonition.tip": { + "message": "ヒント", + "description": "The default label used for the Tip admonition (:::tip)" + }, + "theme.admonition.warning": { + "message": "警告", + "description": "The default label used for the Warning admonition (:::warning)" + }, + "theme.AnnouncementBar.closeButtonAriaLabel": { + "message": "閉じる", + "description": "The ARIA label for close button of announcement bar" + }, + "theme.blog.sidebar.navAriaLabel": { + "message": "最近のブログ記事のナビゲーション", + "description": "The ARIA label for recent posts in the blog sidebar" + }, + "theme.CodeBlock.copied": { + "message": "コピーしました", + "description": "The copied button label on code blocks" + }, + "theme.CodeBlock.copyButtonAriaLabel": { + "message": "クリップボードにコードをコピー", + "description": "The ARIA label for copy code blocks button" + }, + "theme.CodeBlock.copy": { + "message": "コピー", + "description": "The copy button label on code blocks" + }, + "theme.CodeBlock.wordWrapToggle": { + "message": "折り返し", + "description": "The title attribute for toggle word wrapping button of code block lines" + }, + "theme.DocSidebarItem.expandCategoryAriaLabel": { + "message": "'{label}'の目次を開く", + "description": "The ARIA label to expand the sidebar category" + }, + "theme.DocSidebarItem.collapseCategoryAriaLabel": { + "message": "'{label}'の目次を隠す", + "description": "The ARIA label to collapse the sidebar category" + }, + "theme.NavBar.navAriaLabel": { + "message": "ナビゲーション", + "description": "The ARIA label for the main navigation" + }, + "theme.navbar.mobileLanguageDropdown.label": { + "message": "他の言語", + "description": "The label for the mobile language switcher dropdown" + }, + "theme.TOCCollapsible.toggleButtonLabel": { + "message": "このページの見出し", + "description": "The label used by the button on the collapsible TOC component" + }, + "theme.blog.post.readMore": { + "message": "もっと見る", + "description": "The label used in blog post item excerpts to link to full blog posts" + }, + "theme.blog.post.readMoreLabel": { + "message": "{title}についてもっと見る", + "description": "The ARIA label for the link to full blog posts from excerpts" + }, + "theme.blog.post.readingTime.plurals": { + "message": "約{readingTime}分", + "description": "Pluralized label for \"{readingTime} min read\". Use as much plural forms (separated by \"|\") as your language support (see https://www.unicode.org/cldr/cldr-aux/charts/34/supplemental/language_plural_rules.html)" + }, + "theme.docs.breadcrumbs.home": { + "message": "ホームページ", + "description": "The ARIA label for the home page in the breadcrumbs" + }, + "theme.docs.sidebar.collapseButtonTitle": { + "message": "サイドバーを隠す", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.collapseButtonAriaLabel": { + "message": "サイドバーを隠す", + "description": "The title attribute for collapse button of doc sidebar" + }, + "theme.docs.sidebar.navAriaLabel": { + "message": "ドキュメントのサイドバー", + "description": "The ARIA label for the sidebar navigation" + }, + "theme.docs.sidebar.closeSidebarButtonAriaLabel": { + "message": "ナビゲーションバーを閉じる", + "description": "The ARIA label for close button of mobile sidebar" + }, + "theme.navbar.mobileSidebarSecondaryMenu.backButtonLabel": { + "message": "← メインメニューに戻る", + "description": "The label of the back button to return to main menu, inside the mobile navbar sidebar secondary menu (notably used to display the docs sidebar)" + }, + "theme.docs.sidebar.toggleSidebarButtonAriaLabel": { + "message": "ナビゲーションバーを開く", + "description": "The ARIA label for hamburger menu button of mobile navigation" + }, + "theme.docs.sidebar.expandButtonTitle": { + "message": "サイドバーを開く", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.docs.sidebar.expandButtonAriaLabel": { + "message": "サイドバーを開く", + "description": "The ARIA label and title attribute for expand button of doc sidebar" + }, + "theme.ErrorPageContent.tryAgain": { + "message": "もう一度試してください", + "description": "The label of the button to try again rendering when the React error boundary captures an error" + }, + "theme.common.skipToMainContent": { + "message": "メインコンテンツまでスキップ", + "description": "The skip to content label used for accessibility, allowing to rapidly navigate to main content with keyboard tab/enter navigation" + }, + "theme.tags.tagsPageTitle": { + "message": "タグ", + "description": "The title of the tag list page" + }, + "theme.unlistedContent.title": { + "message": "非公開のページ", + "description": "The unlisted content banner title" + }, + "theme.unlistedContent.message": { + "message": "このページは非公開です。 検索対象外となり、このページのリンクに直接アクセスできるユーザーのみに公開されます。", + "description": "The unlisted content banner message" + } +} diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current.json b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current.json new file mode 100644 index 000000000..c5794d3d0 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current.json @@ -0,0 +1,38 @@ +{ + "version.label": { + "message": "Next", + "description": "The label for version current" + }, + "sidebar.sidebarJSBolt.category.Basic concepts": { + "message": "基本的な概念", + "description": "The label for category Basic concepts in sidebar sidebarJSBolt" + }, + "sidebar.sidebarJSBolt.category.Advanced concepts": { + "message": "応用コンセプト", + "description": "The label for category Advanced concepts in sidebar sidebarJSBolt" + }, + "sidebar.sidebarJSBolt.category.Deployments": { + "message": "Deployments", + "description": "The label for category Deployments in sidebar sidebarJSBolt" + }, + "sidebar.sidebarJSBolt.category.Custom functions (Beta)": { + "message": "Custom functions (Beta)", + "description": "The label for category Custom functions (Beta) in sidebar sidebarJSBolt" + }, + "sidebar.sidebarJSBolt.category.Workflow steps (Deprecated)": { + "message": "ワークフローステップ 非推奨", + "description": "The label for category Workflow steps (Deprecated) in sidebar sidebarJSBolt" + }, + "sidebar.sidebarJSBolt.category.Tutorials": { + "message": "チュートリアル", + "description": "The label for category Tutorials in sidebar sidebarJSBolt" + }, + "sidebar.sidebarJSBolt.link.Code on GitHub": { + "message": "Code on GitHub", + "description": "The label for link Code on GitHub in sidebar sidebarJSBolt, linking to https://github.com/SlackAPI/bolt-js" + }, + "sidebar.sidebarJSBolt.link.Contributors Guide": { + "message": "貢献", + "description": "The label for link Contributors Guide in sidebar sidebarJSBolt, linking to https://github.com/SlackAPI/bolt-js/blob/main/.github/contributing.md" + } +} diff --git a/docs/_advanced/ja_authorization.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/authorization.md similarity index 93% rename from docs/_advanced/ja_authorization.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/authorization.md index a1c5afcd8..a54aa9bc0 100644 --- a/docs/_advanced/ja_authorization.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/authorization.md @@ -1,21 +1,18 @@ --- title: 認可(Authorization) lang: ja-jp -slug: authorization -order: 2 +slug: /concepts/authorization --- -

    認可(Authorization)は、Slack からのリクエストを処理するにあたって、どの Slack クレデンシャル (ボットトークンなど) を使用可能にするかを決定するプロセスです。 1 つだけのワークスペースにインストールされたカスタムアプリであれば `App` 初期化時に単に `token` オプションを使用するだけで OK です。一方で、複数のワークスペースにインストールされる、複数のユーザートークンを使用するといったケースのように、アプリが複数のトークンを処理しなければならない場合があります。このようなケースでは `token` の代わりに `authorize` オプションを使用する必要があります。 `authorize` オプションには、イベントソースを入力値として受け取り、許可された認可されたクレデンシャルを含むオブジェクトを Promise の値として返す関数を指定します。このイベントソースの情報には、 `teamId` (常に存在します)、 `userId`、`conversationId`、`enterpriseId` のような、リクエストが誰によって発生させられたか、どこで発生したかに関する情報が含まれます。 -許可されたクレデンシャルには、`botToken`、`userToken`、`botId` (アプリがボット自体からのメッセージを無視するために必要です)、 `botUserId` が含まれます。[`context`](#context) オブジェクトに、これ以外の他のプロパティを自由に設定することもできます。 +許可されたクレデンシャルには、`botToken`、`userToken`、`botId` (アプリがボット自体からのメッセージを無視するために必要です)、 `botUserId` が含まれます。[`context`](/concepts/context) オブジェクトに、これ以外の他のプロパティを自由に設定することもできます。 `botToken` と `userToken` は、どちらか、またはその両方を必ず設定してください。`say()` のようなユーティリティを動作させるには、どちらか一方が存在している必要があります。両方指定した場合、`say()` では `botToken` が優先されます。 -
    ```javascript const app = new App({ authorize: authorizeFn, signingSecret: process.env.SLACK_SIGNING_SECRET }); @@ -56,4 +53,4 @@ const authorizeFn = async ({ teamId, enterpriseId }) => { throw new Error('No matching authorizations'); } -``` +``` \ No newline at end of file diff --git a/docs/_advanced/ja_context.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/context.md similarity index 97% rename from docs/_advanced/ja_context.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/context.md index c828bd5ee..0fb25ef71 100644 --- a/docs/_advanced/ja_context.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/context.md @@ -1,15 +1,12 @@ --- title: context の追加 lang: ja-jp -slug: context -order: 7 +slug: /concepts/context --- -
    `context` オブジェクトは、受信リクエストに付加情報を提供するために使用されるもので、全てのリスナーがこれを使用できます。例えば、3rd party のシステムからユーザー情報を追加したり、ミドルウェアのチェインの中で次のミドルウェアが必要とする一時的な状態を追加したりといった用途に利用できます。 `context` は、ただのオブジェクトなので、いくらでも属性を追加、編集することができます。 -
    ```javascript async function addTimezoneContext({ payload, client, context, next }) { @@ -64,4 +61,4 @@ app.command('/request', addTimezoneContext, async ({ command, ack, client, conte } } }); -``` +``` \ No newline at end of file diff --git a/docs/_advanced/ja_conversation_store.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/conversation-store.md similarity index 87% rename from docs/_advanced/ja_conversation_store.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/conversation-store.md index 022f5a870..896df6839 100644 --- a/docs/_advanced/ja_conversation_store.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/conversation-store.md @@ -1,19 +1,16 @@ --- title: 会話ストア lang: ja-jp -slug: conversation-store -order: 4 +slug: /concepts/conversation-store --- -
    Bolt は、会話 (conversation) に関連する state を設定および取得する store をサポートしています。conversation store には以下の 2 つのメソッドがあります。 * `set()` は会話の state を変更します。`set()` は、文字列型の `conversationId`、任意の型の `value`、およびオプションの数値型の `expiresAt` を必要とします。`set()` は `Promise` を返します。 * `get()` は store から会話の state を取得します。`get()` は文字列型の `conversationId` を必要とし、その会話の state とともに Promise を返します。 -`conversationContext()` は、他のミドルウェアによる会話の更新を可能にする組み込みの[グローバルミドルウェア](#global-middleware)です。イベントを受け取ると、ミドルウェア関数は `context.updateConversation()` を使用して状態を設定でき、`context.conversation` を使用してその state を取得できます。 +`conversationContext()` は、他のミドルウェアによる会話の更新を可能にする組み込みの[グローバルミドルウェア](/concepts/global-middleware)です。イベントを受け取ると、ミドルウェア関数は `context.updateConversation()` を使用して状態を設定でき、`context.conversation` を使用してその state を取得できます。 組み込みの conversation store は、シンプルに会話の state をメモリーに格納します。状況によってはこれで十分ですが、アプリのインスタンスが複数実行されている場合、状態はプロセス間で共有されないため、データベースを使用して会話の state を取得する conversation store を実装することをおすすめします。 -
    ```javascript const app = new App({ diff --git a/docs/_advanced/ja_custom_routes.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/custom-routes.md similarity index 92% rename from docs/_advanced/ja_custom_routes.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/custom-routes.md index 837dac248..fbb559711 100644 --- a/docs/_advanced/ja_custom_routes.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/custom-routes.md @@ -1,11 +1,9 @@ --- title: カスタム HTTP ルートの追加 lang: ja-jp -slug: custom-routes -order: 10 +slug: /concepts/custom-routes --- -
    `v3.7.0` から `App` を初期化する際に `customRoutes` というルートの配列を渡すことでカスタムの HTTP ルートを簡単に追加できるようになりました。 各 `CustomRoute` オブジェクトには `path` 、 `method`、 `handler` という三つのプロパティが含まれていなければなりません。 HTTP メソッドに相当する `method` は文字列または文字列の配列です。 @@ -13,7 +11,6 @@ order: 10 `v3.13.0` からデフォルトの組み込みレシーバーである `HTTPReceiver` と `SocketModeReceiver` が、[Express.js](https://expressjs.com/en/guide/routing.html#route-parameters) が提供するものと同様な動的なルートパラメーターをサポートするようになりました。これによって URL 内に含まれる値を `req.params` の値として利用できるようになりました。 カスタムの HTTP ルートがローカル環境でどのポートからアクセスできるかを指定するために `App` コンストラクターに `installerOptions.port` というプロパティを渡すことができます。指定しない場合は、デフォルトの `3000` ポートとなります。 -
    ```javascript const { App } = require('@slack/bolt'); @@ -51,14 +48,12 @@ const app = new App({ })(); ``` -
    - -

    カスタム ExpressReceiver ルート

    +
    + +カスタム ExpressReceiver ルート -
    Bolt の組み込みの `ExpressReceiver` を使っているなら、カスタムの HTTP ルートを追加するのはとても簡単です。`v2.1.0` から `ExpressReceiver` には `router` というプロパティが追加されています。これは、さらにルートを追加できるように `App` 内部で保持している Express の [Router](http://expressjs.com/en/4x/api.html#router) を public にしたものです。 -
    ```javascript const { App, ExpressReceiver } = require('@slack/bolt'); @@ -94,4 +89,4 @@ receiver.router.post('/secret-page', (req, res) => { console.log('⚡️ Bolt app started'); })(); ``` -
    +
    \ No newline at end of file diff --git a/docs/_advanced/ja_deferring_initialization.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/deferring-initialization.md similarity index 94% rename from docs/_advanced/ja_deferring_initialization.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/deferring-initialization.md index 6e4f90dc2..4c4c7e397 100644 --- a/docs/_advanced/ja_deferring_initialization.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/deferring-initialization.md @@ -1,15 +1,12 @@ --- title: アプリの初期化の遅延 lang: ja -slug: deferring-initialization -order: 8 +slug: /concepts/deferring-initialization --- -
    Bolt は `deferInitialization` というオプションを使うことで、アプリの初期化処理の完了を遅延させることができます。このオプションを使う場合、あなたのコードの中で遅延された初期化処理部分に対応する `App#init()` メソッドを呼び出す必要がありますが、こうすることで初期化に必要となる非同期処理の実行をよりコントロールすることが可能となります。 _注意: `init()` メソッドを呼び出す前に `start()` メソッドを呼び出した場合、 Bolt は例外を発生させます。_ -
    ```javascript const { App } = require('@slack/bolt'); @@ -32,4 +29,4 @@ const app = new App({ process.exit(1); } })() -``` +``` \ No newline at end of file diff --git a/docs/_advanced/ja_error_handling.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/error-handling.md similarity index 92% rename from docs/_advanced/ja_error_handling.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/error-handling.md index 1b9d6cf47..090c6795d 100644 --- a/docs/_advanced/ja_error_handling.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/error-handling.md @@ -1,15 +1,12 @@ --- title: エラーの処理 lang: ja-jp -slug: error-handling -order: 1 +slug: /concepts/error-handling --- -
    -*注: Bolt 2.x からエラーハンドリングが改善されました!この変更については [2.x マイグレーションガイド](https://slack.dev/bolt/ja-jp/tutorial/migration-v2)を参照してください。* +*注: Bolt 2.x からエラーハンドリングが改善されました!この変更については [2.x マイグレーションガイド](/tutorial/migration-v2)を参照してください。* リスナーでエラーが発生した場合は `try`/`catch` を使って直接ハンドリングすることをおすすめします。しかし、それでもなおすり抜けてしまうエラーのパターンもあるでしょう。デフォルトでは、このようなエラーはコンソールにログ出力されます。ご自身でこれらをハンドリングするには、`app.error(fn)` メソッドによって、グローバルエラーハンドラーを定義してください。 -
    また、様々なエラーパターンにより特化したエラーハンドラーを `HTTPReceiver` に直接設定することができます。 @@ -19,7 +16,6 @@ order: 1 - `unhandledRequestTimeoutMillis`: リクエストが受信されてから `unhandledRequestHandler` が実行されるまでの待機時間(ミリ秒単位)。 デフォルトは `3001` です。 *注*: あなたのアプリ内に定義されたカスタムのエラーハンドラーは、エラーとなった Slack からのリクストに応答するために `response.writeHead()` を呼び出して応答の HTTP ステータスコードを設定し、かつ `response.end()` を呼び出して Slack へのレスポンスを送信する必要があります。詳細は以下の例を参考にしてください。 - ```javascript import { App, HTTPReceiver } from '@slack/bolt'; @@ -58,18 +54,17 @@ app.error(async (error) => { }); ``` -
    - -

    エラーハンドラーでのさらなるデータの参照

    +
    + +エラーハンドラーでのさらなるデータの参照 -
    グローバルエラーハンドラーの中で、リクエストからのデータをログ出力したい場合もあるでしょう。あるいは単に Bolt に設定した `logger` を利用したい場合もあるでしょう。 バージョン 3.8.0 からは、コンストラクターに `extendedErrorHandler: true` を渡すと、エラーハンドラーはリクエストの `error` 、 `logger` 、 `context` 、 `body` を含むオブジェクトを受け取ります。 `context` や `body` オブジェクト内にアクセスしたいプロパティが存在するかどうかをチェックすることをおすすめします。なぜなら `body` オブジェクト内に存在するデータはイベント毎に異なりますし、エラーはリクエストのライフサイクルの中のどんなタイミング(例えば `context` のプロパティが設定される前)でも発生しうるからです。 -
    + ```javascript const { App } = require('@slack/bolt'); diff --git a/docs/_advanced/ja_middleware_global.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/global-middleware.md similarity index 92% rename from docs/_advanced/ja_middleware_global.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/global-middleware.md index cb30dad38..1e3189e7b 100644 --- a/docs/_advanced/ja_middleware_global.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/global-middleware.md @@ -1,19 +1,16 @@ --- title: グローバルミドルウェア lang: ja-jp -slug: global-middleware -order: 5 +slug: /concepts/global-middleware --- -
    グローバルミドルウェアは、すべての受信リクエストに対して、リスナーミドルウェアより前に実行されます。`app.use(fn({payload,...,next}))` を使用すると、グローバルミドルウェアをいくつでもアプリに追加できます。 グローバルミドルウェアとリスナーミドルウェアは、いずれも、`await next()` を呼び出して実行チェーンの制御を次のミドルウェアに渡すか、`throw` を呼び出して以前に実行したミドルウェアチェーンにエラーを渡す必要があります。 たとえば、アプリが、対応する内部認証サービス (SSO プロバイダ、LDAP など) で識別されたユーザーにのみ応答する必要があるとします。この場合、グローバルミドルウェアを使用して認証サービス内のユーザーレコードを検索し、ユーザーが見つからない場合はエラーとなるように定義するのがよいでしょう。 -*注: Bolt 2.x からグローバルミドルウェアが `async` 関数をサポートしました!この変更については [2.x マイグレーションガイド](https://slack.dev/bolt/ja-jp/tutorial/migration-v2)を参照してください。* -
    +*注: Bolt 2.x からグローバルミドルウェアが `async` 関数をサポートしました!この変更については [2.x マイグレーションガイド](/tutorial/migration-v2)を参照してください。* ```javascript // Acme ID情報管理プロバイダ上のユーザからの着信リクエストと紐つけた認証ミドルウェア diff --git a/docs/_advanced/ja_middleware_listener.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/listener-middleware.md similarity index 93% rename from docs/_advanced/ja_middleware_listener.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/listener-middleware.md index fd7c158bf..96d556b6b 100644 --- a/docs/_advanced/ja_middleware_listener.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/listener-middleware.md @@ -1,11 +1,9 @@ --- title: リスナーミドルウェア lang: ja-jp -slug: listener-middleware -order: 6 +slug: /concepts/listener-middleware --- -
    リスナーミドルウェアは、多くのリスナー関数を対象(つまり、複数のリスナー関数を対象としますが、全てのリスナーに実行するわけではないものです)としたロジックの適用に使用でき、リスナーを追加する組み込みメソッドの引数リスト内で、リスナー関数より先に引数として追加されます。ここでは任意の数のリスナーミドルウェアを追加することができます。 組み込みリスナーミドルウェアはいくつか用意されており、例えば、メッセージのサブタイプをフィルタリングする `subtype()` や、メッセージのはじまりでボットに直接 @ メンションしないメッセージを除外する `directMention()` のように使用することができます。 @@ -14,8 +12,7 @@ order: 6 例として、リスナーが人(ボットではないユーザー)からのメッセージのみを扱うケースを考えてみましょう。このためには、全てのボットメッセージを除外するリスナーミドルウェアを実装します。 -*注: Bolt 2.x からミドルウェアが `async` 関数をサポートしました!この変更については [2.x マイグレーションガイド](https://slack.dev/bolt/ja-jp/tutorial/migration-v2)を参照してください。* -
    +*注: Bolt 2.x からミドルウェアが `async` 関数をサポートしました!この変更については [2.x マイグレーションガイド](/tutorial/migration-v2)を参照してください。* ```javascript // 'bot_message' サブタイプを持つメッセージをフィルタリングするリスナーミドルウェア @@ -35,4 +32,4 @@ app.message(noBotMessages, async ({ message, logger }) => logger.info( logger.info(`(MSG) User: ${message.user} Message: ${message.text}`) } )); -``` +``` \ No newline at end of file diff --git a/docs/_advanced/ja_logging.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/logging.md similarity index 89% rename from docs/_advanced/ja_logging.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/logging.md index d86b850f1..c1307d5da 100644 --- a/docs/_advanced/ja_logging.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/logging.md @@ -1,13 +1,10 @@ --- title: ログの表示 lang: ja-jp -slug: logging -order: 8 +slug: /concepts/logging --- -
    Bolt はデフォルトの設定では、標準出力のコンソールにログを出力します。どれくらいのログが出力されるかは、コンストラクターの引数の `logLevel` を指定して、カスタマイズできます。使用可能なログレベルは、頻度の高い方から順に、`DEBUG`、`INFO`、`WARN`、`ERROR` です。 -
    ```javascript // パッケージから LogLevel をインポート @@ -21,12 +18,11 @@ const app = new App({ }); ``` -
    - -

    コンソール以外へのログ出力の送信

    +
    + +コンソール以外へのログ出力の送信 -
    ログの送信先をコンソール以外に設定したり、よりロガーを細かくコントロールしたい場合は、カスタムロガーを実装します。カスタムロガーは、以下のメソッド (`Logger` インターフェイスに定義されているもの) を実装する必要があります。 | メソッド | パラメーター | 戻り値の型 | @@ -40,7 +36,6 @@ const app = new App({ | `error()` | `...msgs: any[]` | `void` | 非常に単純なカスタム logger では、名前やレベルが無視され、すべてのメッセージがファイルに書き込まれることがあります。 -
    ```javascript const { App } = require('@slack/bolt'); @@ -63,4 +58,4 @@ const app = new App({ }); ``` -
    +
    \ No newline at end of file diff --git a/docs/_advanced/ja_receiver.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/receiver.md similarity index 98% rename from docs/_advanced/ja_receiver.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/receiver.md index 2fb70c10e..62a01389b 100644 --- a/docs/_advanced/ja_receiver.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/receiver.md @@ -1,11 +1,9 @@ --- title: レシーバーのカスタマイズ lang: ja-jp -slug: receiver -order: 9 +slug: /concepts/receiver --- -
    レシーバーは、Slack からのイベントを受け付けてパースした後、それを Bolt アプリに伝える責務を担っています。Bolt アプリは、`context` 情報やリスナーへのイベントの引き渡しを行います。レシーバーの実装は `Receiver` インターフェイスに準拠している必要があります。 | メソッド | パラメーター | 戻り値の型 | @@ -21,7 +19,6 @@ order: 9 カスタムのレシーバーを使用する場合は、それを `App` のコンストラクターに渡します。ここで紹介しているコード例は、基本的なカスタムレシーバーの実装例です。 レシーバーについてより深く知りたい場合は、[組み込み `ExpressReceiver` のソースコード](https://github.com/slackapi/bolt-js/blob/master/src/ExpressReceiver.ts)を参照してください。 -
    ```javascript import { EventEmitter } from 'events'; @@ -95,4 +92,4 @@ class simpleReceiver extends EventEmitter { await this.bolt.processEvent(event); } } -``` +``` \ No newline at end of file diff --git a/docs/_advanced/ja_token_rotation.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/token-rotation.md similarity index 73% rename from docs/_advanced/ja_token_rotation.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/token-rotation.md index dda72f72c..50400309e 100644 --- a/docs/_advanced/ja_token_rotation.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/advanced/token-rotation.md @@ -1,16 +1,13 @@ --- title: トークンのローテーション lang: ja-jp -slug: token-rotation -order: 3 +slug: /concepts/token-rotation --- -
    Bolt for JavaScript [v3.5.0](https://github.com/slackapi/bolt-js/releases/tag/%40slack%2Fbolt%403.5.0) から、アクセストークンのさらなるセキュリティ強化のレイヤーであるトークンローテーションの機能に対応しています。トークンローテーションは [OAuth V2 の RFC](https://datatracker.ietf.org/doc/html/rfc6749#section-10.4) で規定されているものです。 既存の Slack アプリではアクセストークンが無期限に存在し続けるのに対して、トークンローテーションを有効にしたアプリではアクセストークンが失効するようになります。リフレッシュトークンを利用して、アクセストークンを長期間にわたって更新し続けることができます。 -[Bolt for JavaScript の組み込みの OAuth 機能](https://slack.dev/bolt-js/ja-jp/concepts#authenticating-oauth) を使用していれば、Bolt for JavaScript が自動的にトークンローテーションの処理をハンドリングします。 +[Bolt for JavaScript の組み込みの OAuth 機能](/concepts/authenticating-oauth) を使用していれば、Bolt for JavaScript が自動的にトークンローテーションの処理をハンドリングします。 -トークンローテーションに関する詳細は [API ドキュメント](https://api.slack.com/authentication/rotation)を参照してください。 -
    +トークンローテーションに関する詳細は [API ドキュメント](https://api.slack.com/authentication/rotation)を参照してください。 \ No newline at end of file diff --git a/docs/_basic/ja_acknowledging_requests.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/acknowledge.md similarity index 96% rename from docs/_basic/ja_acknowledging_requests.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/acknowledge.md index a113773dd..182887ad7 100644 --- a/docs/_basic/ja_acknowledging_requests.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/acknowledge.md @@ -1,15 +1,12 @@ --- title: リクエストの確認 lang: ja-jp -slug: acknowledge -order: 7 +slug: /concepts/acknowledge --- -
    アクション(action)、コマンド(command)、およびオプション(options)リクエストは、**必ず** `ack()` 関数を用いて確認する必要があります。これにより Slack 側にリクエストが正常に受信されたことを知らせることができ、それに応じて Slack のユーザーインターフェイスが更新されます。リクエストのタイプによっては、確認の通知方法が異なる場合があります。たとえば、モーダルの送信を確認するとき、送信内容にエラーがあればバリデーションエラーとともに `ack()` を呼び出しますが、送信内容が問題なければ、そのようなパラメータなしで `ack()` を呼び出します。 この `ack()` による応答は 3 秒以内に行う必要があります。新しいメッセージの送信や、データベースからの情報の取得などを行う前に、リクエストを受けてすぐに `ack()` を呼び出して応答を返してしまうことをおすすめします。 -
    ```javascript // Regex でメールアドレスが有効かチェック @@ -32,4 +29,4 @@ app.view('ticket_submit', async ({ ack, view }) => { }); } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/ja_listening_actions.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-listening.md similarity index 82% rename from docs/_basic/ja_listening_actions.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-listening.md index e77635347..bfe5edbe1 100644 --- a/docs/_basic/ja_listening_actions.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-listening.md @@ -1,21 +1,18 @@ --- title: アクションのリスニング lang: ja-jp -slug: action-listening -order: 5 +slug: /concepts/action-listening --- -
    Bolt アプリは `action` メソッドを用いて、ボタンのクリック、メニューの選択、メッセージショートカットなどのユーザーのアクションをリッスンすることができます。 アクションは文字列型の `action_id` または RegExp オブジェクトでフィルタリングできます。 `action_id` は、Slack プラットフォーム上のインタラクティブコンポーネントの一意の識別子として機能します。 -すべての `action()` の例で `ack()` が使用されていることに注目してください。Slack からリクエストを受信したことを確認するために、アクションリスナー内で `ack()` 関数を呼び出す必要があります。これについては、「[リクエストの確認](#acknowledge)」 セクションで説明しています。 +すべての `action()` の例で `ack()` が使用されていることに注目してください。Slack からリクエストを受信したことを確認するために、アクションリスナー内で `ack()` 関数を呼び出す必要があります。これについては、「[リクエストの確認](/concepts/acknowledge)」 セクションで説明しています。 -*注: Bolt 2.x からメッセージショートカット(以前はメッセージアクションと呼ばれていました)は `action()` ではなく `shortcut()` メソッドを使用するようになりました。この変更については [2.x マイグレーションガイド](https://slack.dev/bolt/ja-jp/tutorial/migration-v2)を参照してください。* +*注: Bolt 2.x からメッセージショートカット(以前はメッセージアクションと呼ばれていました)は `action()` ではなく `shortcut()` メソッドを使用するようになりました。この変更については [2.x マイグレーションガイド](/tutorial/migration-v2)を参照してください。* `block_actions` ペイロードの詳細については、[こちら](https://api.slack.com/reference/interaction-payloads) をご覧ください。リスナー内からビューの完全なペイロードにアクセスするには、コールバック関数内で `body` 引数を参照します。 -
    ```javascript // action_id が "approve_button" のインタラクティブコンポーネントがトリガーされる毎にミドルウェアが呼び出される @@ -25,14 +22,13 @@ app.action('approve_button', async ({ ack }) => { }); ``` -
    - -

    制約付きオブジェクトを使用したアクションのリスニング

    +
    + +制約付きオブジェクトを使用したアクションのリスニング -
    制約付きのオブジェクトを使って、 `callback_id` 、 `block_id` 、および `action_id` (またはそれらの組み合わせ) をリッスンすることができます。オブジェクト内の制約には、文字列型または RegExp オブジェクトを使用できます。 -
    + ```javascript // action_id が 'select_user' と一致し、block_id が 'assign_ticket' と一致する場合のみミドルウェアが呼び出される @@ -56,4 +52,4 @@ app.action({ action_id: 'select_user', block_id: 'assign_ticket' }, }); ``` -
    +
    \ No newline at end of file diff --git a/docs/_basic/ja_responding_actions.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-respond.md similarity index 86% rename from docs/_basic/ja_responding_actions.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-respond.md index 830f22ed1..75d1e3a6d 100644 --- a/docs/_basic/ja_responding_actions.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/action-respond.md @@ -1,15 +1,12 @@ --- title: アクションへの応答 lang: ja-jp -slug: action-respond -order: 6 +slug: /concepts/action-respond --- -
    アクションへの応答には、主に 2 つのやり方があります。1 つ目の (最も一般的な) やり方は `say` 関数の利用です。 `say` 関数は、Slack 内のリクエストが発生した会話(チャンネルや DM)へメッセージを返します。 アクションに応答する 2 つ目の方法は `respond()` です。これはアクションに紐付けられている `response_url` を用いたメッセージの送信をシンプルに行うためのユーティリティです。 -
    ```javascript // action_id が "approve_button" のインタラクティブコンポーネントがトリガーされる毎にミドルウェアが呼び出される @@ -20,14 +17,12 @@ app.action('approve_button', async ({ ack, say }) => { }); ``` -
    - -

    respond() の使用

    +
    + +`respond()` の使用 -
    `respond()` は `response_url` を呼び出すためのユーティリティであるため、それを直接使うときと同様に動作します。新しいメッセージのペイロードと、オプショナルな引数である `response_type` (値は `in_channel` または `ephemeral` )、 `replace_original` 、 `delete_original` を含む JSON オブジェクトを渡すことができます。 -
    ```javascript // "user_select" の action_id がトリガーされたアクションをリッスン diff --git a/docs/_basic/ja_authenticating_oauth.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/authenticating-oauth.md similarity index 93% rename from docs/_basic/ja_authenticating_oauth.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/authenticating-oauth.md index 88b074f4b..78d2a14fe 100644 --- a/docs/_basic/ja_authenticating_oauth.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/authenticating-oauth.md @@ -1,11 +1,9 @@ --- title: OAuth フローの実装 lang: ja-jp -slug: authenticating-oauth -order: 15 +slug: /concepts/authenticating-oauth --- -
    Slack アプリの配布を行うには Bolt による OAuth フローを実装し、インストール時に取得した情報をセキュアな方法で保存しておく必要があります。 Bolt は OAuth フローそのものに加えて OAuth のためのルーティング、 state パラメーターの検証、保存するためのインストール情報をアプリに受け渡す、などの処理をハンドリングします。 @@ -42,13 +40,13 @@ const app = new App({ * アプリがすでにインストールされていて、さらにユーザーから追加の認可情報(例:ユーザートークンの発行)な場合や、何らかの理由で動的にインストール用の URL を生成したい場合は、`ExpressReceiver` を自前でインスタンス化し、それを `receiver` という変数に代入した上で `receiver.installer.generateInstallUrl()` を呼び出してください。詳しくは [OAuth ライブラリのドキュメント](https://slack.dev/node-slack-sdk/oauth#generating-an-installation-url)の `generateInstallUrl()` を参照してください。 -* 💡 Bolt for JavaScript は [カスタムのレシーバー](#receiver)での OAuth をサポートしていません。カスタムのレシーバーで OAuth フローを実装したい場合は、私たちが提供している [OAuth ライブラリ](https://slack.dev/node-slack-sdk/oauth#slack-oauth) を使うことができます。Bolt for JavaScript の組み込みのモジュールもこれを内部的に利用しています。 +* 💡 Bolt for JavaScript は [カスタムのレシーバー](/concepts/receiver)での OAuth をサポートしていません。カスタムのレシーバーで OAuth フローを実装したい場合は、私たちが提供している [OAuth ライブラリ](https://slack.dev/node-slack-sdk/oauth#slack-oauth) を使うことができます。Bolt for JavaScript の組み込みのモジュールもこれを内部的に利用しています。 ##### Redirect URI Bolt for JavaScript は、アプリのインストールフローを完了した後の遷移先の URL である **Redirect URI** のためのパスとして `/slack/oauth_redirect` を有効にします。 -💡 アプリのドメインを含んだ **Redirect URI** (絶対 URI)を Slack アプリの設定画面の **OAuth and Permissions** セクション内で設定してください。(例 `https://example.com/slack/oauth_redirect` )。 +アプリのドメインを含んだ **Redirect URI** (絶対 URI)を Slack アプリの設定画面の **OAuth and Permissions** セクション内で設定してください。(例 `https://example.com/slack/oauth_redirect` )。 カスタムの **Redirect URI** を使う場合、 App クラスの引数 `redirectUri` と `installerOptions.redirectUriPath` にも設定してください。 両方とも設定する必要があり、また、矛盾のないフル URI である必要があります。 @@ -102,7 +100,6 @@ Bolt は `fetchInstallation` と `deleteInstallation` ハンドラーに `instal } ``` - ##### OrG 全体へのインストール [Enterprise Grid の OrG 全体へのインストール](https://api.slack.com/enterprise/apps)への対応を追加する場合、Bolt for JavaScript のバージョン 3.0.0 以上を利用してください。また Slack アプリの設定画面で **Org Level Apps** の設定が有効になっていることを確認してください。 @@ -125,8 +122,6 @@ const app = new App({ Slack の OAuth インストールフローについてのより詳細な情報は [API ドキュメント](https://api.slack.com/authentication/oauth-v2)を参照してください。 -
    - ```javascript const app = new App({ signingSecret: process.env.SLACK_SIGNING_SECRET, @@ -175,13 +170,11 @@ const app = new App({ }); ``` -
    - -

    OAuth デフォルト設定をカスタマイズ

    +
    + +OAuth デフォルト設定をカスタマイズ -
    - `installerOptions` を使って OAuth モジュールのデフォルト設定を上書きすることができます。このカスタマイズされた設定は `App` の初期化時に渡します。以下の情報を変更可能です: - `authVersion`: 新しい Slack アプリとクラシック Slack アプリの切り替えに使用 @@ -192,8 +185,6 @@ const app = new App({ - `stateStore`: 組み込みの `ClearStateStore` の代わりにカスタムのデータストアを有効にするために使用 - `userScopes`: 親の階層にある `scopes` プロパティと同様、ユーザがアプリをインストールする際に必要となるユーザスコープのリストの指定に使用 -
    - ```javascript const database = { async get(key) {}, @@ -247,5 +238,4 @@ const app = new App({ } }); ``` - -
    +
    \ No newline at end of file diff --git a/docs/_basic/ja_listening_responding_commands.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/commands.md similarity index 91% rename from docs/_basic/ja_listening_responding_commands.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/commands.md index f533bec02..5616bf65e 100644 --- a/docs/_basic/ja_listening_responding_commands.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/commands.md @@ -1,21 +1,18 @@ --- title: コマンドのリスニングと応答 lang: ja-jp -slug: commands -order: 9 +slug: /concepts/commands --- -
    スラッシュコマンドが実行されたリクエストをリッスンするには、アプリで `command()` メソッドを使用します。メソッドの使用には文字列か正規表現の `commandName` の指定が必要です。 ⚠️ 同じ対象にマッチする正規表現の `command()` を複数使用する場合、マッチする _全ての_ リスナーが実行されることに注意してください。そのような挙動を意図しない場合は、これが発生しないよう正規表現をデザインしてください。 アプリがスラッシュコマンドのリクエストを受け取ったことを `ack()` の実行によって Slack に通知する必要があります。 -スラッシュコマンドへの応答には 2 つのやり方があります。1 つ目の方法は、文字列または JSON ペイロードを受け取る `say()` で、2 つ目は `response_url` を簡単に利用するためのユーティリティである `respond()` です。これらについては、「[アクションへの応答](#action-respond)」セクションで詳しく説明しています。 +スラッシュコマンドへの応答には 2 つのやり方があります。1 つ目の方法は、文字列または JSON ペイロードを受け取る `say()` で、2 つ目は `response_url` を簡単に利用するためのユーティリティである `respond()` です。これらについては、「[アクションへの応答](/concepts/action-respond)」セクションで詳しく説明しています。 Slack アプリの管理画面でスラッシュコマンドを設定するとき、そのスラッシュコマンドの Request URL に(`https://{ドメイン}` に続いて) `/slack/events` を指定するようにしてください。 -
    ```javascript // この echo コマンドは ただ、その引数を(やまびこのように)おうむ返しする @@ -25,4 +22,4 @@ app.command('/echo', async ({ command, ack, respond }) => { await respond(`${command.text}`); }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/ja_opening_modals.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/creating-modals.md similarity index 60% rename from docs/_basic/ja_opening_modals.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/creating-modals.md index c08623a30..0964a4022 100644 --- a/docs/_basic/ja_opening_modals.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/creating-modals.md @@ -1,18 +1,14 @@ --- title: モーダルの開始 lang: ja-jp -slug: creating-modals -order: 10 +slug: /concepts/creating-modals --- -
    +[モーダル](https://api.slack.com/block-kit/surfaces/modals)は、ユーザー情報を収集したり、動的な表示を実現するためのインターフェースです。モーダルは、有効な `trigger_id` と [ビュー部分のペイロード](https://api.slack.com/reference/block-kit/views) を組み込みの API クライアントによる [`views.open`](https://api.slack.com/methods/views.open) メソッドの呼び出しに渡すことで開始することができます。 -モーダルは、ユーザー情報を収集したり、動的な表示を実現するためのインターフェースです。モーダルは、有効な trigger_idビュー部分のペイロード を組み込みの API クライアントによる views.open メソッドの呼び出しに渡すことで開始することができます。 +`trigger_id` はスラッシュコマンド、ボタンの押下、メニューの選択などによって Request URL に送信されたペイロードの項目として入手することができます。 -trigger_id はスラッシュコマンド、ボタンの押下、メニューの選択などによって Request URL に送信されたペイロードの項目として入手することができます。 - -モーダルの生成についてのより詳細な情報は API ドキュメントを参照してください。 -
    +モーダルの生成についてのより詳細な情報は [API ドキュメント](https://api.slack.com/surfaces/modals/using#composing_views)を参照してください。 ```javascript // コマンド起動をリッスン @@ -75,4 +71,4 @@ app.command('/ticket', async ({ ack, body, client, logger }) => { logger.error(error); } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/ja_listening_events.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/event-listening.md similarity index 88% rename from docs/_basic/ja_listening_events.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/event-listening.md index 1d029feeb..7dbadd081 100644 --- a/docs/_basic/ja_listening_events.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/event-listening.md @@ -1,15 +1,12 @@ --- title: イベントのリスニング lang: ja-jp -slug: event-listening -order: 3 +slug: /concepts/event-listening --- -
    [Events API イベント](https://api.slack.com/events)のリスニングは、Slack アプリの設定画面でサブスクリプション設定を行った上で `event()` メソッドを使用します。これにより、Slack で何かが発生した (例:ユーザーがメッセージにリアクションした、チャンネルに参加した) ときに Bolt アプリ側で処理を実行できます。 `event()` メソッドは、文字列型の `eventType` を指定する必要があります。 -
    ```javascript const welcomeChannelId = 'C12345'; @@ -30,16 +27,14 @@ app.event('team_join', async ({ event, client, logger }) => { }); ``` -
    - -

    メッセージのサブタイプのフィルタリング

    +
    + +メッセージのサブタイプのフィルタリング -
    `message()` リスナーは `event('message')` と等価の機能を提供します。 イベントのサブタイプをフィルタリングしたい場合、組み込みの `subtype()` ミドルウェアを使用できます。 `message_changed` や `message_replied` のような一般的なメッセージサブタイプの情報は、[メッセージイベントのドキュメント](https://api.slack.com/events/message#message_subtypes)を参照してください。 -
    ```javascript // パッケージから subtype をインポート @@ -55,5 +50,4 @@ app.message(subtype('message_changed'), ({ event, logger }) => { } }); ``` - -
    +
    \ No newline at end of file diff --git a/docs/_basic/ja_listening_messages.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-listening.md similarity index 82% rename from docs/_basic/ja_listening_messages.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-listening.md index 9b6e26ad6..254d3aea1 100644 --- a/docs/_basic/ja_listening_messages.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-listening.md @@ -1,15 +1,12 @@ --- title: メッセージ・イベントのリスニング lang: ja-jp -slug: message-listening -order: 1 +slug: /concepts/message-listening --- -
    [アプリが受信可能な](https://api.slack.com/messaging/retrieving#permissions)メッセージをリッスンするには、`message` 型でないイベントを除外する `message()` メソッドを使用します。 `message()` は、`string` 型か `RegExp` 型の、指定パターンに一致しないメッセージを除外する `pattern` パラメーター(指定は必須ではありません)を受け付けます。 -
    ```javascript // 特定の文字列、この場合 👋絵文字を含むメッセージと一致 @@ -24,16 +21,14 @@ app.message(':wave:', async ({ message, say }) => { }); ``` -
    - -

    正規表現(RegExp) パターンの使用

    +
    + +正規表現(RegExp) パターンの使用 -
    文字列の代わりに 正規表現(RegExp) パターンを使用すると、より細やかなマッチングが可能です。 RegExp の一致結果はすべて `context.matches` に保持されます。 -
    ```javascript app.message(/^(hi|hello|hey).*/, async ({ context, say }) => { @@ -44,4 +39,4 @@ app.message(/^(hi|hello|hey).*/, async ({ context, say }) => { }); ``` -
    +
    \ No newline at end of file diff --git a/docs/_basic/ja_sending_messages.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-sending.md similarity index 85% rename from docs/_basic/ja_sending_messages.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-sending.md index dd9189f13..5ccef4f28 100644 --- a/docs/_basic/ja_sending_messages.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/message-sending.md @@ -1,15 +1,12 @@ --- title: メッセージの送信 lang: ja-jp -slug: message-sending -order: 2 +slug: /concepts/message-sending --- -
    リスナー関数内では、その実行に関連付けられた会話 (例:リスナー実行のトリガーが発生したイベント・アクションが発生したチャンネル) があるとき `say()` を使用できます。 `say()` は、シンプルなメッセージを送信するための文字列か、もっと複雑なメッセージを送信するための JSON ペイロードを受け付けます。渡されたメッセージのペイロードは、関連付けられた会話へ送信されます。 -リスナー関数以外の場所でメッセージを送信したい場合や、より高度な操作 (特定のエラーの処理など) を実行したい場合は、[Bolt インスタンスにアタッチされた client を使用](#web-api)して `chat.postMessage` を呼び出します。 -
    +リスナー関数以外の場所でメッセージを送信したい場合や、より高度な操作 (特定のエラーの処理など) を実行したい場合は、[Bolt インスタンスにアタッチされた client を使用](/concepts/web-api)して `chat.postMessage` を呼び出します。 ```javascript // "knock knock" を含むメッセージをリッスンし、 "who's there?" というメッセージをイタリック体で送信 @@ -18,16 +15,14 @@ app.message('knock knock', async ({ message, say }) => { }); ``` -
    - -

    ブロックを用いたメッセージの送信

    +
    + +ブロックを用いたメッセージの送信 -
    `say()` は、より複雑なメッセージペイロードを受け付けるので、メッセージに機能やリッチな構造を与えることが容易です。 リッチなメッセージレイアウトをアプリに追加する方法については、[API サイトのガイド](https://api.slack.com/messaging/composing/layouts)を参照し、[Block Kit ビルダー](https://api.slack.com/tools/block-kit-builder?template=1)の一般的なアプリフローのテンプレートを確認してください。 -
    ```javascript // 誰かが 📅 絵文字でリアクションした時に、日付ピッカー block を送信 @@ -54,4 +49,4 @@ app.event('reaction_added', async ({ event, say }) => { } }); ``` -
    +
    \ No newline at end of file diff --git a/docs/_basic/ja_listening_responding_options.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/options.md similarity index 89% rename from docs/_basic/ja_listening_responding_options.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/options.md index fac4f45a3..430e9b4f5 100644 --- a/docs/_basic/ja_listening_responding_options.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/options.md @@ -1,17 +1,14 @@ --- title: オプションのリスニングと応答 lang: ja-jp -slug: options -order: 14 +slug: /concepts/options --- -
    -`options()` メソッドは、Slack からのオプション(セレクトメニュー内の動的な選択肢)をリクエストするペイロードをリッスンします。 [`action()` と同様](#action-listening)に、文字列型の `action_id` または制約付きオブジェクトが必要です。 +`options()` メソッドは、Slack からのオプション(セレクトメニュー内の動的な選択肢)をリクエストするペイロードをリッスンします。 [`action()` と同様](/concepts/action-listening)に、文字列型の `action_id` または制約付きオブジェクトが必要です。 `external_select` メニューには `action_id` を使用することをおすすめしますが、ダイアログはまだ Block Kit をサポートしていないため、制約オブジェクトを用いて `callback_id` でフィルタリングする必要があります。 オプションのリクエストへの応答には、適切なオプションを指定して `ack()` を実行する必要があります。API サイトに掲載されている[external_select の応答の例](https://api.slack.com/reference/messaging/block-elements#external_select)や[ダイアログ応答の例](https://api.slack.com/legacy/dialogs#dynamic_select_elements_external)を参考にしてください。 -
    ```javascript // external_select オプションリクエストに応答する例 @@ -39,4 +36,4 @@ app.options('external_action', async ({ options, ack }) => { await ack(); } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/ja_publishing_views.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/publishing-views.md similarity index 60% rename from docs/_basic/ja_publishing_views.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/publishing-views.md index d504d8584..e1f4cb852 100644 --- a/docs/_basic/ja_publishing_views.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/publishing-views.md @@ -1,15 +1,12 @@ --- title: ホームタブの更新 lang: ja-jp -slug: publishing-views -order: 13 +slug: /concepts/publishing-views --- -
    -ホームタブは、サイドバーや検索画面からアクセス可能なサーフェスエリアです。アプリはこのエリアを使ってユーザーごとのビューを表示することができます。アプリ設定ページで App Home の機能を有効にすると、`views.publish` API メソッドの呼び出しで `user_id` とビューのペイロードを指定して、ホームタブを公開・更新することができるようになります。 +[ホームタブ](https://api.slack.com/surfaces/tabs/using)は、サイドバーや検索画面からアクセス可能なサーフェスエリアです。アプリはこのエリアを使ってユーザーごとのビューを表示することができます。アプリ設定ページで App Home の機能を有効にすると、[`views.publish`](https://api.slack.com/methods/views.publish) API メソッドの呼び出しで `user_id` と[ビューのペイロード](https://api.slack.com/reference/block-kit/views)を指定して、ホームタブを公開・更新することができるようになります。 -エンドユーザーが App Home(ホームタブやアプリとの DM など)にアクセスしたことを知るために、`app_home_opened` イベントをサブスクライブすることができます。 -
    +エンドユーザーが App Home(ホームタブやアプリとの DM など)にアクセスしたことを知るために、[`app_home_opened`](https://api.slack.com/events/app_home_opened) イベントをサブスクライブすることができます。 ```javascript // ユーザーが App Home にアクセスしたことを伝えるイベントをリッスン diff --git a/docs/_basic/ja_listening_responding_shortcuts.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/shortcuts.md similarity index 89% rename from docs/_basic/ja_listening_responding_shortcuts.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/shortcuts.md index dba2ba92e..c440feb28 100644 --- a/docs/_basic/ja_listening_responding_shortcuts.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/shortcuts.md @@ -1,11 +1,9 @@ --- title: ショートカットのリスニング lang: ja-jp -slug: shortcuts -order: 8 +slug: /concepts/shortcuts --- -
    `shortcut()` メソッドは、[グローバルショートカット](https://api.slack.com/interactivity/shortcuts/using#global_shortcuts)と[メッセージショートカット](https://api.slack.com/interactivity/shortcuts/using#message_shortcuts)の両方をサポートします。 ショートカットは、テキスト入力エリアや検索バーから起動できる Slack クライアント内の UI エレメントです。グローバルショートカットは、コンポーザーメニューまたは検索メニューから呼び出すことができます。メッセージショートカットは、メッセージのコンテキストメニュー内にあります。`shortcut()` メソッドを使って、これらのショートカットのリクエストをリッスンすることができます。このメソッドには `callback_id` を文字列または正規表現のデータ型で設定します。 @@ -14,11 +12,10 @@ order: 8 グローバルショートカットのリクエストは Slack へリクエストを受信したことを知らせるために `ack()` メソッドで確認する必要があります。 -グローバルショートカットのペイロードは、ユーザーの実行アクションの確認のために[モーダルを開く](#creating-modals)などの用途に使用できる `trigger_id` を含んでいます。 +グローバルショートカットのペイロードは、ユーザーの実行アクションの確認のために[モーダルを開く](/concepts/creating-modals)などの用途に使用できる `trigger_id` を含んでいます。 ⚠️ グローバルショートカットのペイロードは **チャンネル ID は含んでいない** ことに注意してください。もしあなたのアプリがチャンネル ID を知る必要があれば、モーダル内で [`conversations_select`](https://api.slack.com/reference/block-kit/block-elements#conversation_select) エレメントを使用できます。 メッセージショートカットのペイロードはチャンネル ID を含みます。 -
    ```javascript // open_modal というグローバルショートカットはシンプルなモーダルを開く @@ -71,15 +68,14 @@ app.shortcut('open_modal', async ({ shortcut, ack, context, logger }) => { }); ``` -
    - -

    制約付きオブジェクトを使用したショートカットのリスニング

    +
    + + 制約付きオブジェクトを使用したショートカットのリスニング -
    - 制約付きオブジェクトを使って `callback_id` や `type` によるリスニングができます。オブジェクト内の制約は文字列型または RegExp オブジェクトを使用できます。 + 制約付きオブジェクトを使って `callback_id` や `type` によるリスニングができます。オブジェクト内の制約は文字列型または RegExp オブジェクトを使用できます。 -
    + ```javascript // callback_id が 'open_modal' と一致し type が 'message_action' と一致する場合のみミドルウェアが呼び出される diff --git a/docs/_basic/ja_socket_mode.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/socket-mode.md similarity index 87% rename from docs/_basic/ja_socket_mode.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/socket-mode.md index 0d904cd88..b1a0cb023 100644 --- a/docs/_basic/ja_socket_mode.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/socket-mode.md @@ -1,16 +1,12 @@ --- title: ソケットモードの使用 lang: ja-jp -slug: socket-mode -order: 16 +slug: /concepts/socket-mode --- -
    - [ソケットモード](https://api.slack.com/socket-mode) は、アプリに WebSocket での接続と、そのコネクション経由でのデータ受信を可能とします。コネクションをハンドリングするために `@slack/bolt@3.0.0` 以上では `SokcetModeReceiver` というレシーバーが提供されています。ソケットモードを使う前に、アプリの管理画面でソケットモードの機能が有効になっていることを確認しておいてください。 `SocketModeReceiver` を使う方法は `App` インスタンスの初期化時にコンストラクターに `socketMode: true` と `appToken: YOUR_APP_TOKEN` を渡すだけです。App Level Token は、アプリ管理画面の **Basic Information** セクションから取得できます。 -
    ```javascript const { App } = require('@slack/bolt'); @@ -27,17 +23,13 @@ const app = new App({ })(); ``` -
    - -

    ソケットモードレシーバーのカスタム初期化

    +
    + +ソケットモードレシーバーのカスタム初期化 -
    - 以下のように `@slack/bolt` から `SocketModeReceiver` を import して、カスタムされたインスタンスとして定義することができます。 -
    - ```javascript const { App, SocketModeReceiver } = require('@slack/bolt'); @@ -63,4 +55,4 @@ const app = new App({ })(); ``` -
    +
    \ No newline at end of file diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/updating-pushing-views.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/updating-pushing-views.md new file mode 100644 index 000000000..17c5a8c63 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/updating-pushing-views.md @@ -0,0 +1,66 @@ +--- +title: モーダルの更新と多重表示 +lang: ja-jp +slug: /concepts/updating-pushing-views +--- + +モーダルでは、複数のモーダルをスタックのように積み重ねて表示できます。[`views.open`](https://api.slack.com/methods/views.open) という API を呼び出すと、まず親の(最初の)モーダルが表示されます。この最初の呼び出しの後、[`views.update`](https://api.slack.com/methods/views.update) を実行することでそのビューを書き換えることもできますし、最初に述べたように [`views.push`](https://api.slack.com/methods/views.push) で新しいモーダルを積み重ねて表示することもできます。 + +**`views.update`** + +モーダルの更新には、組み込みの API クライアントを使って `views.update` を呼び出します。この API 呼び出しには、そのモーダルを開いたときに生成された `view_id` と、更新後の内容を表現する `blocks` の配列を含む新しい `view` を渡します。ユーザーが既存のモーダル内の要素とインタラクションを行なった(例:ボタンを押す、メニューから選択する)ことをトリガーにビューを更新する場合、そのリクエストの `body` に `view_id` が含まれます。 + +**`views.push`** + +モーダルのスタックに新しいモーダルを積み重ねるためには、組み込みの API クライアントを用いて `views.push` を呼び出します。この API 呼び出しには、有効な `trigger_id` と、新しく生成する [ビュー部分のペイロード](https://api.slack.com/reference/block-kit/views)を渡します。`views.push` の引数は モーダルを開始するときと同様です。最初のモーダルを開いた後、その上にさらに二つまで追加のモーダルをスタックに積み重ねることができます。 + +より詳細な情報は [API ドキュメント](/concepts/view-submissions)を参照してください。 + +```javascript +// action_id: button_abc のボタンを押すイベントをリッスン +// (そのボタンはモーダルの中にあるという想定) +app.action('button_abc', async ({ ack, body, client, logger }) => { + // ボタンを押したイベントを確認 + await ack(); + + try { + if (body.type !== 'block_actions' || !body.view) { + return; + } + const result = await client.views.update({ + // リクエストに含まれる view_id を渡す + view_id: body.view.id, + // 競合状態を防ぐために更新前の view に含まれる hash を指定 + hash: body.view.hash, + // 更新された view の値をペイロードに含む + view: { + type: 'modal', + // callback_id が view を特定するための識別子 + callback_id: 'view_1', + title: { + type: 'plain_text', + text: 'Updated modal' + }, + blocks: [ + { + type: 'section', + text: { + type: 'plain_text', + text: 'You updated the modal!' + } + }, + { + type: 'image', + image_url: 'https://media.giphy.com/media/SVZGEcYt7brkFUyU90/giphy.gif', + alt_text: 'Yay! The modal was updated' + } + ] + } + }); + logger.info(result); + } + catch (error) { + logger.error(error); + } +}); +``` \ No newline at end of file diff --git a/docs/_basic/ja_listening_modals.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/view-submissions.md similarity index 94% rename from docs/_basic/ja_listening_modals.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/view-submissions.md index dde60506b..f22c6cf89 100644 --- a/docs/_basic/ja_listening_modals.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/view-submissions.md @@ -1,12 +1,9 @@ --- title: モーダルでの送信のリスニング lang: ja-jp -slug: view-submissions -order: 12 +slug: /concepts/view-submissions --- -
    - `view` メソッドを使うと、ユーザーのビューとのインタラクションをリッスンすることができます。 ユーザーがモーダルからデータ送信したとき、Slack から `view_submission` のリクエストが送信されます。送信された `input` ブロックの値は `state` オブジェクトから取得できます。`state` 内には `values` というオブジェクトがあり、これは `block_id` と一意な `action_id` に紐づける形で入力値を保持しています。 @@ -32,7 +29,7 @@ app.view('modal-callback-id', async ({ ack, body }) => { ``` この例と同様に、モーダルでの送信リクエストに対して、[エラーを表示する](https://api.slack.com/surfaces/modals/using#displaying_errors) ためのオプションもあります。 -より詳細な情報は API ドキュメントを参照してください。 +より詳細な情報は [API ドキュメント](https://api.slack.com/surfaces/modals/using#handling_submissions)を参照してください。 --- @@ -50,7 +47,6 @@ app.view({ callback_id: 'view_b', type: 'view_closed' }, async ({ ack, body, vie // close リクエストについて何らかの処理 }); ``` -
    ```javascript // モーダルでのデータ送信リクエストを処理します @@ -88,4 +84,4 @@ app.view('view_b', async ({ ack, body, view, client, logger }) => { } }); -``` +``` \ No newline at end of file diff --git a/docs/_basic/ja_web_api.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/web-api.md similarity index 89% rename from docs/_basic/ja_web_api.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/web-api.md index 92ac3c532..679568570 100644 --- a/docs/_basic/ja_web_api.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/basic/web-api.md @@ -1,19 +1,16 @@ --- title: Web API の使用 lang: ja-jp -slug: web-api -order: 4 +slug: /concepts/web-api --- -
    -[Web API メソッド](https://api.slack.com/methods)を呼び出すには、リスナー関数の引数に `client` として提供されている [`WebClient`](https://slack.dev/node-slack-sdk/web-api) を使用します。このインスタンスが使用するトークンは、Bolt アプリの初期化時に指定されたもの もしくは Slack からのリクエストに対して [`authorize` 関数](#authorization)から返されたものが設定されます。組み込みの [OAuth サポート](#authenticating-oauth)は、この後者のケースをデフォルトでハンドリングします。 +[Web API メソッド](https://api.slack.com/methods)を呼び出すには、リスナー関数の引数に `client` として提供されている [`WebClient`](https://slack.dev/node-slack-sdk/web-api) を使用します。このインスタンスが使用するトークンは、Bolt アプリの初期化時に指定されたもの もしくは Slack からのリクエストに対して [`authorize` 関数](/concepts/authorization)から返されたものが設定されます。組み込みの [OAuth サポート](/concepts/authenticating-oauth)は、この後者のケースをデフォルトでハンドリングします。 Bolt アプリケーションは、トップレベルに `app.client` も持っています。このインスタンスには、トークンをメソッド呼び出しのパラメーターとして都度指定します。Slack からのリクエストが authorize されないユースケースや、リスナー関数の外で Web API を呼び出したい場合は、このトップレベルの `app.client` を使用します。 トップレベルのクライアントを使ってもリスナー関数でのクライアントを使っても、[`WebClient`](https://slack.dev/node-slack-sdk/web-api) が提供するメソッドを呼び出すと、それへの Slack からのレスポンスを含む Promise の値が返されます。 [OrG 全体へのインストール機能](https://api.slack.com/enterprise/apps)の導入により、[いくつかの Web API](https://api.slack.com/enterprise/apps/changes-apis#methods) は、動作しているワークスペースを伝えるために `team_id` パラメーターを必要とします。Bolt for JavaScript は、この `team_id` を Slack から受け取ったペイロードを元に判定し、`client` インスタンスに設定します。これは、既存のアプリケーションにとっても OrG 全体へのインストールに対応する上で有用です。既存の Web API 呼び出しの処理をアップデートする必要はありません。 -
    ```javascript // September 30, 2019 11:59:59 PM を Unix エポックタイムで表示 @@ -34,4 +31,4 @@ app.message('wake me up', async ({ message, context, logger }) => { logger.error(error); } }); -``` +``` \ No newline at end of file diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/creating-custom-functions.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/creating-custom-functions.md new file mode 100644 index 000000000..b3b6ec553 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/creating-custom-functions.md @@ -0,0 +1,16 @@ +--- +title: Creating custom functions +lang: en +slug: /concepts/creating-custom-functions +--- + +Custom functions allow your app to create and process workflow steps that users can add in Workflow Builder. + +We recommend using custom functions as a replacement for the deprecated Workflow Steps from Apps. + +A custom function requires two components: + +* [A function definition in the app’s manifest](/concepts/defining-custom-functions) +* [A listener to handle the function execution event](/concepts/listening-to-custom-functions) + +Read more about custom functions in the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt). \ No newline at end of file diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/defining-custom-functions.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/defining-custom-functions.md new file mode 100644 index 000000000..cb23aee97 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/defining-custom-functions.md @@ -0,0 +1,39 @@ +--- +title: Defining custom functions +lang: en +slug: /concepts/defining-custom-functions +--- + +To make a custom function available for use in Workflow Builder, the app’s manifest must contain a function definition. + +A function’s definition contains information about the function, including its `callback_id`, `input_parameters`, `output_parameters`, as well as display information. + +To learn more about defining a function, see the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt#define-function). + +```json +"functions": { + "sample_function": { + "title": "Sample function", + "description": "Runs sample function", + "input_parameters": { + "user_id": { + "type": "slack#/types/user_id", + "title": "User", + "description": "Message recipient", + "is_required": true, + "hint": "Select a user in the workspace", + "name": "user_id" + } + }, + "output_parameters": { + "user_id": { + "type": "slack#/types/user_id", + "title": "User", + "description": "User that completed the function", + "is_required": true, + "name": "user_id" + } + } + } +} +``` \ No newline at end of file diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/listening-to-custom-functions.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/listening-to-custom-functions.md new file mode 100644 index 000000000..21274fcb9 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/listening-to-custom-functions.md @@ -0,0 +1,25 @@ +--- +title: Listening to custom function executions +lang: en +slug: /concepts/listening-to-custom-functions +--- + +When your custom function is executed as a step in a workflow, your app will receive a `function_executed` event. The callback provided to the `function()` method will be run when this event is received. + +The callback is where you can access `inputs`, make third-party API calls, or set the output values that will be available to subsequent workflow steps by mapping values to the `outputs` object. + +Your app can call `complete()` to indicate that the function’s execution was successful, or `fail()` to signal that the function failed to complete. + +To learn more about listening to custom function executions, see the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt#listener). + +```js +app.function('sample_function', async ({ client, inputs, fail }) => { + try { + const { user_id } = inputs; + await complete({ outputs: { user_id } }); + } catch (error) { + console.error(error); + fail({ error: `Failed to handle a function request: ${error}` }); + } +}); +``` \ No newline at end of file diff --git a/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/responding-to-interactivity.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/responding-to-interactivity.md new file mode 100644 index 000000000..422f41929 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/custom-functions/responding-to-interactivity.md @@ -0,0 +1,19 @@ +--- +title: Responding to interactivity +lang: en +slug: /concepts/responding-to-interactivity +--- + +Interactive elements provided to the user from within the `function()` method’s callback are associated with that unique `function_executed` event. This association allows for the completion of functions at a later time, like once the user has clicked a button. + +Incoming actions that are associated with a function have the same `inputs`, `complete`, and `fail` utilities as offered by the `function()` method. + +To learn more about responding to interactivity, see the [Slack API documentation](https://api.slack.com/automation/functions/custom-bolt#interactivity). + +```js +// If associated with a function, function-specific utilities are made available +app.action('approve_button', async ({ complete, fail }) => { + // Signal the function has completed once the button is clicked + await complete({ outputs: { message: 'Request approved 👍' } }); +}); +``` \ No newline at end of file diff --git a/docs/_deployments/ja_aws-lambda.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/aws-lambda.md similarity index 64% rename from docs/_deployments/ja_aws-lambda.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/aws-lambda.md index 3105ce282..5c0310047 100644 --- a/docs/_deployments/ja_aws-lambda.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/aws-lambda.md @@ -1,32 +1,36 @@ --- title: AWS Lambda へのデプロイ -order: 0 -slug: aws-lambda lang: ja-jp -layout: tutorial -permalink: /ja-jp/deployments/aws-lambda --- + # AWS Lambda へのデプロイ -
    -このガイドでは、[Bolt for JavaScript][bolt-js]、[Serverless Framework][serverless-framework]、[AWS Lambda][aws-lambda] を使った Slack アプリの準備とデプロイの方法について説明します。 -
    +このガイドでは、Bolt for JavaScript、[Serverless Framework](https://serverless.com/)、[AWS Lambda](https://aws.amazon.com/lambda/) を使った Slack アプリの準備とデプロイの方法について説明します。 + -この手順を全て終わらせたら、あなたはきっと⚡️ [Deploying to AWS Lambda][deploy-aws-lambda-app] のサンプルアプリを動作させたり、それに変更を加えたり、自分のアプリを作ったりすることができるようになるでしょう。 +この手順を全て終わらせたら、あなたはきっと⚡️ [Deploying to AWS Lambda](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda) のサンプルアプリを動作させたり、それに変更を加えたり、自分のアプリを作ったりすることができるようになるでしょう。 --- ### AWS Lambda のセットアップ {#set-up-aws-lambda} -[AWS Lambda][aws-lambda] はサーバーレスの Function-as-a-Service(FaaS)プラットフォームです。AWS Lambda を利用すると、サーバーを管理することなく、コードを実行することができます。このセクションでは、ローカルマシンから AWS Lambda にアクセスするための設定を行います。 +[AWS Lambda](https://aws.amazon.com/lambda/) はサーバーレスの Function-as-a-Service(FaaS)プラットフォームです。AWS Lambda を利用すると、サーバーを管理することなく、コードを実行することができます。このセクションでは、ローカルマシンから AWS Lambda にアクセスするための設定を行います。 + +:::tip -> 💡 すでにローカルマシンから AWS Lambda へのアクセスに必要な[プロファイルの構成][aws-profiles]が済んでいる場合、このセクションはスキップできます。 +すでにローカルマシンから AWS Lambda へのアクセスに必要な[プロファイルの構成](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-profiles)が済んでいる場合、このセクションはスキップできます。 + +::: **1. AWS アカウントを作成する** -AWS アカウントをまだ持っていない場合は、[アカウントを作成][aws-sign-up]する必要があります。画面に表示される案内に沿って作成しましょう。 +AWS アカウントをまだ持っていない場合は、[アカウントを作成](https://aws.amazon.com/)する必要があります。画面に表示される案内に沿って作成しましょう。 + +:::tip + +作成手順の中で請求情報の入力を求められる場合がありますが、ご心配なく。このガイドでは[無料利用枠](https://aws.amazon.com/lambda/pricing/)のみを使用します。 -> 💡 作成手順の中で請求情報の入力を求められる場合がありますが、ご心配なく。このガイドでは[無料利用枠][aws-pricing]のみを使用します。 +::: **2. AWS のアクセスキーを作成する** @@ -34,11 +38,15 @@ Lambda へのデプロイでは、プログラムから AWS アカウントに 🍿 [IAM ユーザーを作成してアクセスキーをダウンロードする手順](https://www.youtube.com/watch?v=KngM5bfpttA)を紹介する短い動画を参考にしてみてください。 -> 💡 **すでに IAM ユーザーの作成が完了している場合は、**AWS の公式ガイドに従って [IAM ユーザーのアクセスキーを作成][aws-iam-user]してください。 +:::tip + +**すでに IAM ユーザーの作成が完了している場合は、**AWS の公式ガイドに従って [IAM ユーザーのアクセスキーを作成](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds)してください。 + +::: **3. AWS CLI をインストールする** -AWS では [macOS、Windows、Linux][aws-cli-install] にインストールして利用できるコマンドラインインターフェイス(CLI)のツールが用意されています。 +AWS では [macOS、Windows、Linux](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html) にインストールして利用できるコマンドラインインターフェイス(CLI)のツールが用意されています。 macOS では、[最新の .pkg インストーラーをダウンロード](https://awscli.amazonaws.com/AWSCLIV2.pkg)して AWS CLI をインストールできます。 @@ -46,7 +54,7 @@ macOS では、[最新の .pkg インストーラーをダウンロード](https AWS CLI を使ってプロファイルを構成します。プロファイルはローカルマシンに置かれ、アクセスキーのペアを保管します。この CLI やその他のツールは、このプロファイルを使って AWS にアクセスします。 -[プロファイルを構成][aws-cli-configure]する最も簡単な方法は、次のコマンドを実行し、プロンプトに従って入力する方法です。 +[プロファイルを構成](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config)する最も簡単な方法は、次のコマンドを実行し、プロンプトに従って入力する方法です。 ```zsh aws configure @@ -56,7 +64,11 @@ aws configure # Default output format [None]: json ``` -> 💡 [Default region name][aws-cli-region] と [Default output format][aws-cli-output-format] は最も望ましい設定でカスタマイズしてください。 +:::tip + +[Default region name](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-region) と [Default output format](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-format) は最も望ましい設定でカスタマイズしてください。 + +::: これでローカルマシンから AWS にアクセスするための設定が完了しました。👏 次は、同じように Serverless Framework も設定していきましょう。 @@ -64,7 +76,7 @@ aws configure ### Serverless Framework をセットアップする {#set-up-serverless-framework} -[Serverless Framework][serverless-framework] では、AWS Lambda 向けのアプリの設定、デバッグ、デプロイを簡単に行うためのツールが用意されています。 +[Serverless Framework](https://serverless.com/) では、AWS Lambda 向けのアプリの設定、デバッグ、デプロイを簡単に行うためのツールが用意されています。 **1. Serverless Framework CLI をインストールする** @@ -82,7 +94,7 @@ Serverless のツールのセットアップが完了しました。次に、AWS ### Bolt Slack アプリを入手する {#get-a-bolt-slack-app} -まだ Bolt アプリを自分で作成したことがない場合は、[入門ガイド][getting-started-guide]を参照してください。テンプレートのアプリをクローンするには、以下のコマンドを実行します。 +まだ Bolt アプリを自分で作成したことがない場合は、[入門ガイド](/getting-started)を参照してください。テンプレートのアプリをクローンするには、以下のコマンドを実行します。 ```shell git clone https://github.com/slackapi/bolt-js-getting-started-app.git @@ -113,7 +125,7 @@ const app = new App({ }); ``` -次に Lambda 関数のイベントに応答するよう、Bolt アプリの [`receiver`](/bolt-js/ja-jp/concepts#receiver) をカスタマイズします。 +次に Lambda 関数のイベントに応答するよう、Bolt アプリの [`receiver`](/concepts/receiver) をカスタマイズします。 `app.js` のソースコードの中で[モジュールのインポートを行う部分](https://github.com/slackapi/bolt-js-getting-started-app/blob/main/app.js#L1)を編集し、Bolt の `AwsLambdaReceiver` モジュールを require します。 @@ -121,7 +133,11 @@ const app = new App({ const { App, AwsLambdaReceiver } = require('@slack/bolt'); ``` -> 💡 OAuth フローを実装するなら、現時点では [`ExpressReceiver`](https://github.com/slackapi/bolt-js/blob/main/src/receivers/ExpressReceiver.ts) を使用する必要があります。 +:::tip + +OAuth フローを実装するなら、現時点では [`ExpressReceiver`](https://github.com/slackapi/bolt-js/blob/main/src/receivers/ExpressReceiver.ts) を使用する必要があります。 + +::: その後、[ソースコードの中で Bolt アプリの初期化を行う部分](https://github.com/slackapi/bolt-js-getting-started-app/blob/4c29a21438b40f0cbca71ece0d39b356dfcf88d5/app.js#L10-L14)を編集して、`AwsLambdaReceiver` を使ったカスタムのレシーバーを作成します。 @@ -156,7 +172,7 @@ module.exports.handler = async (event, context, callback) => { } ``` -完成したアプリのソースコードは、⚡️[deploy-aws-lambda][deploy-aws-lambda-app/app.js] のサンプルのようになります。 +完成したアプリのソースコードは、⚡️[deploy-aws-lambda](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda/app.js) のサンプルのようになります。 **2. serverless.yml を追加する** @@ -184,7 +200,11 @@ plugins: - serverless-offline ``` -> 💡 `SLACK_SIGNING_SECRET` と `SLACK_BOT_TOKEN` の環境変数は、ローカルマシンで設定しておく必要があります。[Slack の環境変数をエクスポートする方法](/bolt-js/ja-jp/tutorial/getting-started#setting-up-your-project)を入門ガイドで参照してください。 +:::tip + +`SLACK_SIGNING_SECRET` と `SLACK_BOT_TOKEN` の環境変数は、ローカルマシンで設定しておく必要があります。[Slack の環境変数をエクスポートする方法](/getting-started#setting-up-your-project)を入門ガイドで参照してください。 + +::: **3. serverless-offline モジュールをインストールする** @@ -212,7 +232,11 @@ npm install --save-dev serverless-offline serverless offline --noPrependStageInUrl ``` -> 🏌️ Pro-tip: 別のターミナルで上記のコマンドを実行しておくことで、ターミナル上でアプリのコードを変更することができます。コードの変更を保存する度、アプリは自動的にリロードされます。 +:::tip + + 別のターミナルで上記のコマンドを実行しておくことで、ターミナル上でアプリのコードを変更することができます。コードの変更を保存する度、アプリは自動的にリロードされます。 + +::: 次に、ngrok を使って Slack のイベントをローカルマシンに転送します。 @@ -220,32 +244,44 @@ serverless offline --noPrependStageInUrl ngrok http 3000 ``` -> 💡 パブリック URL の作成方法と、ローカルマシンへのリクエストの転送方法については、[ngrok の使い方][getting-started-guide-setting-up-events]を参照してください。 +:::tip + +パブリック URL の作成方法と、ローカルマシンへのリクエストの転送方法については、[ngrok の使い方](https://slack.dev/bolt-js/getting-started#setting-up-events)を参照してください。 + +::: **2. リクエスト URL を変更する** 次に、[Slack アプリの設定](https://api.slack.com/apps)を開き、**リクエスト URL** を ngrok のウェブアドレスに変更します。 -> 💡 **リクエスト URL** は `/slack/events` で終わる文字列で、例えば `https://abc123.ngrok.io/slack/events` のようになります。 +:::tip + +**リクエスト URL** は `/slack/events` で終わる文字列で、例えば `https://abc123.ngrok.io/slack/events` のようになります。 + +::: まず、サイドバーの「**Interactivity & Shortcuts**」を選択し、**リクエスト URL** を更新します。 -![「Interactivity & Shortcuts」ページ](../../assets/interactivity-and-shortcuts-page.png "「Interactivity & Shortcuts」ページ") +![「Interactivity & Shortcuts」ページ](/img/interactivity-and-shortcuts-page.png "「Interactivity & Shortcuts」ページ") 次に、サイドバーの「**Event Subscriptions**」を選択し、**リクエスト URL** を更新します。 -![「Event Subscriptions」ページ](../../assets/event-subscriptions-page.png "「Event Subscriptions」ページ") +![「Event Subscriptions」ページ](/img/event-subscriptions-page.png "「Event Subscriptions」ページ") **3. Slack アプリをテストする** -Slack アプリをテストします。今作った Bolt アプリを Slack のチャンネルに招待し、半角の小文字で「hello」と入力してみましょう。[入門ガイド][getting-started-guide]のとおり、アプリから応答があるはずです。 +Slack アプリをテストします。今作った Bolt アプリを Slack のチャンネルに招待し、半角の小文字で「hello」と入力してみましょう。[入門ガイド](/getting-started)のとおり、アプリから応答があるはずです。 > 👩‍💻 hello
    > 🤖 Hey there @Jane! 応答がない場合、**リクエスト URL** を確認してからもう一度試してみてください。 -> 💡 **動作の仕組み** : ngrok と Serverless のコマンドは同じポートを使用するように設定されています(デフォルトでは「3000」)。**リクエスト URL** に向けて送信された Slack イベントは、ローカルマシンの ngrok で受信されます。このリクエストはさらに Serverless Offline に転送されます。Serverless Offline は AWS Lambda 関数のイベントをエミュレートしていて、Bolt アプリのレシーバーをトリガーさせます。 🛫🛬 長旅ですね。 +:::tip + +**動作の仕組み** : ngrok と Serverless のコマンドは同じポートを使用するように設定されています(デフォルトでは「3000」)。**リクエスト URL** に向けて送信された Slack イベントは、ローカルマシンの ngrok で受信されます。このリクエストはさらに Serverless Offline に転送されます。Serverless Offline は AWS Lambda 関数のイベントをエミュレートしていて、Bolt アプリのレシーバーをトリガーさせます。 🛫🛬 長旅ですね。 + +::: --- @@ -270,7 +306,11 @@ serverless deploy アプリのデプロイが成功すると、**エンドポイント**が発行されます。これをアプリの**リクエスト URL** に指定します。発行された**エンドポイント**をコピーして、次のセクションで使います。 -> 💡 **エンドポイント**は、`/slack/events` で終わる文字列です。 +:::tip + +**エンドポイント**は、`/slack/events` で終わる文字列です。 + +::: **2. Slack アプリの設定を更新する** @@ -278,11 +318,11 @@ Slack からのイベントやアクションの送信先となる**リクエス まず、サイドバーの「**Interactivity & Shortcuts**」を選択し、**リクエスト URL** を更新します。 -![「Interactivity & Shortcuts」ページ](../../assets/interactivity-and-shortcuts-page.png "「Interactivity & Shortcuts」ページ") +![「Interactivity & Shortcuts」ページ](/img/interactivity-and-shortcuts-page.png "「Interactivity & Shortcuts」ページ") 次に、サイドバーの「**Event Subscriptions**」を選択し、**リクエスト URL** を更新します。 -![「Event Subscriptions」ページ](../../assets/event-subscriptions-page.png "「Event Subscriptions」ページ") +![「Event Subscriptions」ページ](/img/event-subscriptions-page.png "「Event Subscriptions」ページ") **3. Slack アプリをテストする** @@ -297,7 +337,7 @@ Slack からのイベントやアクションの送信先となる**リクエス Slack アプリの開発を継続していくなら、更新したアプリをデプロイする必要が出てくるでしょう。それをやってみるために、「goodbye」というメッセージに応答するようにアプリを変更してみましょう。 -次のコードを `app.js` に追加します([GitHub でソースコードを確認できます][deploy-aws-lambda-app/app.js])。 +次のコードを `app.js` に追加します([GitHub でソースコードを確認できます](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda/app.js))。 ```javascript // 「goodbye」というメッセージの着信をリッスンします @@ -321,27 +361,11 @@ serverless deploy ### 次のステップ {#next-steps} -⚡️[AWS Lambda を使った最初の Bolt for JavaScript アプリ][deploy-aws-lambda-app]をデプロイできました。🚀 +⚡️[AWS Lambda を使った最初の Bolt for JavaScript アプリ](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda)をデプロイできました。🚀 基本的なアプリのデプロイができましたので、次はアプリのカスタマイズやモニタリングを行う方法を調べてみましょう。 - [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) と [Serverless Framework](https://www.serverless.com/framework/docs/providers/aws/guide/intro/) の理解を深める。 -- [Bolt の基本的な概念](/bolt-js/ja-jp/concepts#basic)と [Serverless のプラグイン](https://www.serverless.com/framework/docs/providers/aws/guide/plugins/)を活用してアプリを拡張する。 -- [Bolt の応用コンセプト](/bolt-js/ja-jp/concepts#logging)でログの記録についての知識を深めたり、[Serverless でのログメッセージの表示方法](https://www.serverless.com/framework/docs/providers/aws/cli-reference/logs/)について確認したりする。 -- Serverless の [AWS Lambda のテスト環境](https://www.serverless.com/framework/docs/providers/aws/guide/testing/)や[デプロイ環境](https://www.serverless.com/framework/docs/providers/aws/guide/deploying/)を本格的に活用する。 - -[aws-cli-configure]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-config -[aws-cli-install]: https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html -[aws-cli-output-format]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-format -[aws-cli-region]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-region -[aws-iam-user]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-creds -[aws-lambda]: https://aws.amazon.com/lambda/ -[aws-pricing]: https://aws.amazon.com/lambda/pricing/ -[aws-profiles]: https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html#cli-configure-quickstart-profiles -[aws-sign-up]: https://aws.amazon.com/ -[bolt-js]: /bolt-js -[deploy-aws-lambda-app]: https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda -[deploy-aws-lambda-app/app.js]: https://github.com/slackapi/bolt-js/tree/main/examples/deploy-aws-lambda/app.js -[getting-started-guide-setting-up-events]: https://slack.dev/bolt-js/ja-jp/tutorial/getting-started#setting-up-events -[getting-started-guide]: /bolt-js/ja-jp/tutorial/getting-started -[serverless-framework]: https://serverless.com/ +- Bolt の基本的な概念と [Serverless のプラグイン](https://www.serverless.com/framework/docs/providers/aws/guide/plugins/)を活用してアプリを拡張する。 +- [Bolt の応用コンセプト](/concepts/logging)でログの記録についての知識を深めたり、[Serverless でのログメッセージの表示方法](https://www.serverless.com/framework/docs/providers/aws/cli-reference/logs/)について確認したりする。 +- Serverless の [AWS Lambda のテスト環境](https://www.serverless.com/framework/docs/providers/aws/guide/testing/)や[デプロイ環境](https://www.serverless.com/framework/docs/providers/aws/guide/deploying/)を本格的に活用する。 \ No newline at end of file diff --git a/docs/_deployments/ja_heroku.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/heroku.md similarity index 72% rename from docs/_deployments/ja_heroku.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/heroku.md index 9a0bd2c48..8eacde210 100644 --- a/docs/_deployments/ja_heroku.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/deployments/heroku.md @@ -1,24 +1,20 @@ --- title: Heroku へのデプロイ -order: 0 -slug: heroku lang: ja-jp -layout: tutorial -permalink: /ja-jp/deployments/heroku --- + # Heroku へのデプロイ -
    -このガイドでは、[Bolt for JavaScript](/bolt-js/ja-jp)と[Heroku プラットフォーム](https://heroku.com/)を使ってSlack アプリを用意して、デプロイするまでの手順を説明します。全体の流れとしては、Bolt Slack アプリをダウンロードし、Heroku 用の準備を済ませ、デプロイする流れになります。 -
    +このガイドでは、Bolt for JavaScriptと[Heroku プラットフォーム](https://heroku.com/)を使ってSlack アプリを用意して、デプロイするまでの手順を説明します。全体の流れとしては、Bolt Slack アプリをダウンロードし、Heroku 用の準備を済ませ、デプロイする流れになります。 + -この手順を全て終わらせたら、あなたはきっと️⚡️[getting-started-with-heroku][deploy-heroku-app]のサンプルアプリを動作させたり、それに変更を加えたり、自分のアプリを作ったりすることができるようになるでしょう。 +この手順を全て終わらせたら、あなたはきっと️⚡️[getting-started-with-heroku](https://github.com/slackapi/bolt-js/tree/main/examples/deploy-heroku)のサンプルアプリを動作させたり、それに変更を加えたり、自分のアプリを作ったりすることができるようになるでしょう。 --- ### Bolt Slack アプリを入手する {#get-a-bolt-slack-app} -Bolt アプリを作るのが初めてという場合は、まず[Bolt 入門ガイド][getting-started-guide]に沿って進めてみましょう。または、以下のテンプレートアプリをクローンしてもよいでしょう。 +Bolt アプリを作るのが初めてという場合は、まず[Bolt 入門ガイド](/getting-started)に沿って進めてみましょう。または、以下のテンプレートアプリをクローンしてもよいでしょう。 ```shell git clone https://github.com/slackapi/bolt-js-getting-started-app.git @@ -42,7 +38,11 @@ Heroku は、作ったアプリをホストできる柔軟性の高いプラッ Heroku にアプリをデプロイするには、まずGit リポジトリが必要です。まだGit を使ったことがない場合は、[Git をインストール](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)し、[Git リポジトリを作成](https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository)します -> 💡 前のセクションで`git clone`を使用した場合、Git リポジトリはすでに存在しますので、この手順はスキップできます +:::tip + +前のセクションで`git clone`を使用した場合、Git リポジトリはすでに存在しますので、この手順はスキップできます + +::: **2. Procfile を追加する** @@ -69,7 +69,11 @@ git add Procfile git commit -m "Add Procfile" ``` -> 💡 既存のBolt アプリを使ってこのガイドに沿って進めている場合は、[Preparing a Codebase for Heroku Deployment](https://devcenter.heroku.com/articles/preparing-a-codebase-for-heroku-deployment#4-listen-on-the-correct-port)のガイドを参考に、適切なポートをリッスンするようにしてください。 +:::tip + +既存のBolt アプリを使ってこのガイドに沿って進めている場合は、[Preparing a Codebase for Heroku Deployment](https://devcenter.heroku.com/articles/preparing-a-codebase-for-heroku-deployment#4-listen-on-the-correct-port)のガイドを参考に、適切なポートをリッスンするようにしてください。 + +::: --- @@ -91,7 +95,11 @@ brew install heroku/brew/heroku heroku help ``` -> 💡 `heroku`コマンドが見つからない場合は、パスを更新するため新しいターミナルセッションまたはターミナルタブを開いてください。 +:::tip + +`heroku`コマンドが見つからない場合は、パスを更新するため新しいターミナルセッションまたはターミナルタブを開いてください。 + +::: **2. Heroku CLI にログインする** @@ -100,7 +108,11 @@ Heroku CLI では、ローカルマシンからHeroku アカウントに接続 ```shell heroku login ``` -> 💡 ファイアウォールを使っている場合、Heroku CLI で使用される[プロキシ環境変数](https://devcenter.heroku.com/articles/using-the-cli#using-an-http-proxy)の設定が必要なことがあります。 +:::tip + +ファイアウォールを使っている場合、Heroku CLI で使用される[プロキシ環境変数](https://devcenter.heroku.com/articles/using-the-cli#using-an-http-proxy)の設定が必要なことがあります。 + +::: **3. Heroku CLI へのログインが成功したか確認する** @@ -118,8 +130,11 @@ heroku auth:whoami 先ほどインストールしたツールを使って、[Heroku アプリを作成](https://devcenter.heroku.com/articles/creating-apps)します。アプリを作成するときは、ユニークな名前を自分で指定するか、ランダムな名前を生成することができます。 +:::tip -> 💡 [Heroku アプリはあとから名前を変更することもできます](https://devcenter.heroku.com/articles/renaming-apps)が、リモートのGit アドレスとパブリックのWeb アドレスも変更になります。 +[Heroku アプリはあとから名前を変更することもできます](https://devcenter.heroku.com/articles/renaming-apps)が、リモートのGit アドレスとパブリックのWeb アドレスも変更になります。 + +::: **1. Heroku アプリを作成する** @@ -162,7 +177,11 @@ heroku config:set SLACK_SIGNING_SECRET= heroku config:set SLACK_BOT_TOKEN=xoxb- ``` -> 💡 認証情報の入手場所がわからない場合、Bolt 入門ガイドで[署名シークレットとトークンのエクスポート](/bolt-js/ja-jp/tutorial/getting-started#トークンとアプリのインストール)について参照してください。 +:::tip + +認証情報の入手場所がわからない場合、Bolt 入門ガイドで[署名シークレットとトークンのエクスポート](/getting-started)について参照してください。 + +::: ローカルでのアプリの準備と、Heroku アプリの作成が完了しました。次のステップは、デプロイです。 @@ -183,7 +202,11 @@ git push heroku main ``` Heroku でデプロイされるのは、[master またはmain ブランチ](https://devcenter.heroku.com/articles/git-branches)のコードです。それ以外のブランチにプッシュした場合、デプロイ処理はトリガーされません -> 💡 Heroku deploys code that's pushed to the [master or main branches](https://devcenter.heroku.com/articles/git-branches). Pushing to other branches will not trigger a deployment. +:::tip + +Heroku deploys code that's pushed to the [master or main branches](https://devcenter.heroku.com/articles/git-branches). Pushing to other branches will not trigger a deployment. + +::: 最後に、Heroku CLI を使ってWeb サーバーインスタンスを起動します。 @@ -207,23 +230,31 @@ heroku info [Slack アプリのページ](https://api.slack.com/apps)を開き、アプリ名を選択します。次に、リクエストURLを自分で確認したWeb アドレスに変更します。設定する場所は2 か所あります。 -> 💡 リクエストURL の末尾は`/slack/events`です。例えば`https://sharp-rain-871.herokuapp.com/slack/events`のようになります。 +:::tip + +リクエストURL の末尾は`/slack/events`です。例えば`https://sharp-rain-871.herokuapp.com/slack/events`のようになります。 + +::: つ目の場所は、サイドパネルの「**Interactivity & Shortcuts**」です。これを選択し、リクエスト**URLを**更新します。 -![Interactivity & Shortcuts page](../../assets/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts") +![Interactivity & Shortcuts page](/img/interactivity-and-shortcuts-page.png "Interactivity & Shortcuts") 2 つ目の場所は、サイドパネルの「**Event Subscriptions**」です。これを選択し、リクエスト**URLを**更新します。 -![Event Subscriptions page](../../assets/event-subscriptions-page.png "Event Subscriptions") +![Event Subscriptions page](/img/event-subscriptions-page.png "Event Subscriptions") + +:::tip -> 💡 無料プランで使用するHeroku アプリは、非アクティブな状態が続くとスリープします。💤 認証が失敗した場合、すぐに再試行してみてください。 +無料プランで使用するHeroku アプリは、非アクティブな状態が続くとスリープします。💤 認証が失敗した場合、すぐに再試行してみてください。 + +::: **3. Slack アプリをテストする** アプリのデプロイが完了し、Slack の設定変更も行いました。アプリを試してみましょう。 -アプリが参加しているSlack チャンネルを開き、半角の小文字で"hello" と書き込みます。[Bolt 入門ガイド](/bolt-js/ja-jp/tutorial/getting-started#アクションの送信と応答)のとおり、アプリから応答があるはずです。応答がない場合、リクエスト**URLを**確認し、もう一度試してください。 +アプリが参加しているSlack チャンネルを開き、半角の小文字で"hello" と書き込みます。[Bolt 入門ガイド](/getting-started)のとおり、アプリから応答があるはずです。応答がない場合、リクエスト**URLを**確認し、もう一度試してください。 --- @@ -264,9 +295,6 @@ git push heroku main 基本的なアプリのデプロイができましたので、次はアプリのカスタマイズやモニタリングを行う方法を調べてみましょう。おすすめのステップをいくつか紹介します。 - [How Heroku Works](https://devcenter.heroku.com/articles/how-heroku-works)を読んでHeroku の動作の理解を深めたり、[Heroku アプリを無料で使う場合の制限](https://devcenter.heroku.com/articles/free-dyno-hours)をチェックしたりする。 -- [Bolt の基本的な概念](/bolt-js/ja-jp/concepts#basic)を参考にしてアプリを拡張したり、[Heroku Add-ons](https://elements.heroku.com/addons)をアプリに取り入れたりする -- [Bolt の応用コンセプト](/bolt-js/ja-jp/concepts#advanced)でログの表示について学習し、[Heroku でのログメッセージの確認方法](https://devcenter.heroku.com/articles/getting-started-with-nodejs#view-logs)を把握する。 -- [Heroku アプリのスケール方法](https://devcenter.heroku.com/articles/getting-started-with-nodejs#scale-the-app)に従って、アクセスの増加に対処する。 - -[deploy-heroku-app]: https://github.com/slackapi/bolt-js/tree/main/examples/deploy-heroku -[getting-started-guide]: /bolt-js/ja-jp/tutorial/getting-started \ No newline at end of file +- Bolt の基本的な概念を参考にしてアプリを拡張したり、[Heroku Add-ons](https://elements.heroku.com/addons)をアプリに取り入れたりする +- Bolt の応用コンセプトでログの表示について学習し、[Heroku でのログメッセージの確認方法](https://devcenter.heroku.com/articles/getting-started-with-nodejs#view-logs)を把握する。 +- [Heroku アプリのスケール方法](https://devcenter.heroku.com/articles/getting-started-with-nodejs#scale-the-app)に従って、アクセスの増加に対処する。 \ No newline at end of file diff --git a/docs/_tutorials/ja_getting_started.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/getting-started.md similarity index 83% rename from docs/_tutorials/ja_getting_started.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/getting-started.md index 4b4c0ab6e..2bfc095af 100644 --- a/docs/_tutorials/ja_getting_started.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/getting-started.md @@ -1,34 +1,36 @@ --- title: Bolt 入門ガイド -order: 0 +sidebar_label: 入門ガイド slug: getting-started lang: ja-jp -layout: tutorial -permalink: /ja-jp/tutorial/getting-started -redirect_from: - - /ja-jp/getting-started - - /getting-started/ja-jp --- + # Bolt 入門ガイド -
    このガイドでは、Bolt を使用して Slack アプリを起動し実行する方法について説明します。その過程で、新しい Slack アプリを作成し、ローカル環境を設定し、Slack ワークスペースからのメッセージをリッスンして応答するアプリを開発します。 -
    -> 💡 このガイドでは[ソケットモード](https://api.slack.com/apis/connections/socket) を利用します。ソケットモードは、Slack アプリ開発をとりあえず始めてみるときやあなたのチームだけのためのアプリをつくるときにおすすめのやり方です。もしすでに HTTP をアプリのコミュニケーションプロトコルとしてするとわかっているなら、HTTP の方式に対応した同様のドキュメントである [Bolt 入門ガイド(HTTP)](/bolt-js/ja-jp/tutorial/getting-started-http) を参照してください。 +:::tip + +このガイドでは[ソケットモード](https://api.slack.com/apis/connections/socket) を利用します。ソケットモードは、Slack アプリ開発をとりあえず始めてみるときやあなたのチームだけのためのアプリをつくるときにおすすめのやり方です。もしすでに HTTP をアプリのコミュニケーションプロトコルとしてするとわかっているなら、HTTP の方式に対応した同様のドキュメントである [Bolt 入門ガイド(HTTP)](/tutorial/getting-started-http) を参照してください。 + +::: --- ### アプリを作成する {#create-an-app} 最初にやるべきこと: Bolt で開発を始める前に、 [Slack アプリを作成](https://api.slack.com/apps/new)します。 -> 💡 いつもの仕事のさまたげにならないように、別に開発用のワークスペースを使用することをおすすめします — [新しいワークスペースを無料で作成](https://slack.com/get-started#create)できます。 +:::tip + +いつもの仕事のさまたげにならないように、別に開発用のワークスペースを使用することをおすすめします — [新しいワークスペースを無料で作成](https://slack.com/get-started#create)できます。 + +::: アプリ名を入力し (後で変更可能)、インストール先のワークスペースを選択したら、`Create App` ボタンをクリックすると、アプリの **Basic Information** ページが表示されます。 このページには、後で必要になる重要な認証情報 (**App Credentials** ヘッダーの下の `Signing Secret` など) に加えて、アプリケーションの概要が表示されます。 -![Basic Information page](../../assets/basic-information-page.png "Basic Information page") +![Basic Information page](/img/basic-information-page.png "Basic Information page") ひと通り確認し、アプリのアイコンと説明を追加してから、アプリの設定 🔩 を始めましょう。 @@ -52,9 +54,13 @@ Slack アプリで使用できるトークンには、ユーザートークン 4. インストールを承認すると、**OAuth & Permissions** ページが表示され、**Bot User OAuth Access Token** を確認することができるはずです。 -![OAuth Tokens](../../assets/bot-token.png "OAuth Tokens") +![OAuth Tokens](/img/bot-token.png "OAuth Tokens") + +:::tip -> 💡 トークンは、パスワードのように大切に扱い、[安全に保管](https://api.slack.com/docs/oauth-safety)してください。アプリではそのトークンを使用して、Slack ワークスペースからの情報を投稿および取得します。 +トークンは、パスワードのように大切に扱い、[安全に保管](https://api.slack.com/docs/oauth-safety)してください。アプリではそのトークンを使用して、Slack ワークスペースからの情報を投稿および取得します。 + +::: --- @@ -126,8 +132,11 @@ node app.js Slack ワークスペースで発生するイベント(メッセージが投稿されたときや、メッセージに対するリアクションがつけられたときなど)をリッスンするには、[Events API を使って特定の種類のイベントをサブスクライブします](https://api.slack.com/events-api)。このチュートリアルでは、[ソケットモード](https://api.slack.com/apis/connections/socket)を使用します。 Socket モードは、チームのために何かを作り始めたばかりの人にお勧めのオプションです。 -> 💡 ソケットモードを使うことで、アプリが公開された HTTP エンドポイントを公開せずに Events API やインタラクティブコンポーネントを利用できるようになります。このことは、開発時やファイヤーウォールの裏からのリクエストを受ける際に便利です。HTTP での方式はホスティング環境([AWS](/bolt-js/ja-jp/deployments/aws-lambda) or [Heroku](/bolt-js/ja-jp/deployments/heroku)など)にデプロイするアプリや Slack App Directory で配布されるアプリに適しています。 HTTP での情報については[こちらのドキュメント](/bolt-js/ja-jp/tutorial/getting-started-http#setting-up-events-with-http)を参照してください。 +:::tip + +ソケットモードを使うことで、アプリが公開された HTTP エンドポイントを公開せずに Events API やインタラクティブコンポーネントを利用できるようになります。このことは、開発時やファイヤーウォールの裏からのリクエストを受ける際に便利です。HTTP での方式はホスティング環境([AWS](/deployments/aws-lambda) or [Heroku](/deployments/heroku)など)にデプロイするアプリや Slack App Directory で配布されるアプリに適しています。 HTTP での情報については[こちらのドキュメント](/tutorial/getting-started-http#setting-up-events-with-http)を参照してください。 +::: それではソケットモードを有効にします。 @@ -191,7 +200,11 @@ app.message('hello', async ({ message, say }) => { ボタン、選択メニュー、日付ピッカー、モーダルなどの機能を使用するには、インタラクティブ機能を有効にする必要があります。イベントと同様に、Slack の URL を指定してアクション ( 「ボタン・クリック」など) を送信する必要があります。 -> 💡 ソケットモードを有効にしているとき、デフォルトで基本的なインタラクティブ機能が有効になっていため、ここでは特に何もする必要はいありません。もし HTTP を使っている場合、Slack からのイベント送信先である Request URL を設定する必要があります。 +:::tip + +ソケットモードを有効にしているとき、デフォルトで基本的なインタラクティブ機能が有効になっていため、ここでは特に何もする必要はいありません。もし HTTP を使っている場合、Slack からのイベント送信先である Request URL を設定する必要があります。 + +::: インタラクティブ機能が有効化されていると、ショートカット、モーダル、インタラクティブコンポーネント (例:ボタン、選択メニュー、日付ピッカーなど) とのインタラクションがイベントとしてあなたのアプリに送信されます。 @@ -251,7 +264,11 @@ app.message('hello', async ({ message, say }) => { このボタン `accessory` オブジェクトには、`action_id` が割り当てられています。これはボタンの一意の識別子として機能するため、アプリはどのアクションに応答するかを指定できます。 -> 💡 [Block Kit ビルダー](https://app.slack.com/block-kit-builder)を使うとインタラクティブメッセージを簡単にプロトタイプすることができます。ビルダーを使用すると、ユーザー (またはそのチームメンバー) はメッセージをモックアップして、対応する JSON を生成し、それをアプリに直接貼り付けることができます。 +:::tip + +[Block Kit ビルダー](https://app.slack.com/block-kit-builder)を使うとインタラクティブメッセージを簡単にプロトタイプすることができます。ビルダーを使用すると、ユーザー (またはそのチームメンバー) はメッセージをモックアップして、対応する JSON を生成し、それをアプリに直接貼り付けることができます。 + +::: これで、アプリを再起動し、アプリが登録されているチャンネルで `hello` と入力すると、ボタン付きのメッセージが表示されます。ただしこのボタンをクリックしても、まだ何も起こりません。 @@ -318,10 +335,10 @@ app.action('button_click', async ({ body, ack, say }) => { 基本的なアプリの作成ができましたので、次回は是非もっといろいろな、 Bolt の機能を使ってアプリを作ってみましょう。下記のリンクを辿っていろいろアイデアを模索してみてください! -* [基本的な概念](/bolt-js/ja-jp/concepts#basic)をお読みください。Bolt アプリからアクセスできるさまざまなメソッドと機能について学ぶことができます。 +* 基本的な概念 をお読みください。Bolt アプリからアクセスできるさまざまなメソッドと機能について学ぶことができます。 -* ボットが[`events()` メソッド](/bolt-js/ja-jp/concepts#event-listening)でリッスンできるさまざまなイベントを確認しましょう。イベントはすべて[API サイト](https://api.slack.com/events)にリストされています。 +* ボットが[`events()` メソッド](/concepts/event-listening)でリッスンできるさまざまなイベントを確認しましょう。イベントはすべて[API サイト](https://api.slack.com/events)にリストされています。 -* Bolt を使用すると、アプリにアタッチされているクライアントで [Web API メソッドを呼び出す](/bolt-js/ja-jp/concepts#web-api)ことができます。API サイトに [220 を超えるメソッド](https://api.slack.com/methods)を用意してあります。 +* Bolt を使用すると、アプリにアタッチされているクライアントで [Web API メソッドを呼び出す](/concepts/web-api)ことができます。API サイトに [200 を超えるメソッド](https://api.slack.com/methods)を用意してあります。 -* [API サイト](https://api.slack.com/docs/token-types)では、様々なトークンタイプの詳細を確認することができます。アプリには、実行するアクションに応じて異なるトークンが必要になる場合があります。ソケットモードを使わないアプリでは、通常はボットトークン (`xoxb`) と署名シークレットが必要です。ソケットモードを使わない場合の例については、 HTTP 方式のやり方としてこのチュートリアルと対になっている [Bolt 入門ガイド(HTTP)](/bolt-js/ja-jp/tutorial/getting-started-http)を参照してください。 +* [API サイト](https://api.slack.com/docs/token-types)では、様々なトークンタイプの詳細を確認することができます。アプリには、実行するアクションに応じて異なるトークンが必要になる場合があります。ソケットモードを使わないアプリでは、通常はボットトークン (`xoxb`) と署名シークレットが必要です。ソケットモードを使わない場合の例については、 HTTP 方式のやり方としてこのチュートリアルと対になっている [Bolt 入門ガイド(HTTP)](/tutorial/getting-started-http)を参照してください。 \ No newline at end of file diff --git a/docs/_tutorials/ja_reference.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/reference.md similarity index 86% rename from docs/_tutorials/ja_reference.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/reference.md index e585caf44..482f27e53 100644 --- a/docs/_tutorials/ja_reference.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/reference.md @@ -1,16 +1,12 @@ --- title: リファレンス -order: 1 slug: reference -lang: ja-jp -layout: fullpage -permalink: /ja-jp/reference +permalink: /reference --- + # リファレンス(Appインターフェイスと設定) -
    -このガイドでは、Bolt インターフェイスのリスナー関数、リスナー関数の引数、初期化オプション、エラーについて詳しく説明します。⚡[入門ガイド](/bolt-js/ja-jp/tutorial/getting-started)をまだ完了していない場合は、先にそちらで Bolt for JavaScript アプリ開発の基本を確認しておきましょう。 -
    +このガイドでは、Bolt インターフェイスのリスナー関数、リスナー関数の引数、初期化オプション、エラーについて詳しく説明します。⚡[入門ガイド](/getting-started)をまだ完了していない場合は、先にそちらで Bolt for JavaScript アプリ開発の基本を確認しておきましょう。 - [リスナー関数](#listener-functions) - [メソッド](#methods) @@ -31,13 +27,13 @@ Slack アプリは通常、Slack からのイベント情報を受け取った 以下の表は、現在提供しているリスナー関数を渡すためのメソッドの一覧です。これらのメソッドを使って、Slack から送信された各種のイベントを処理します。各メソッドの一般的な設定は、まずイベントを判別するためのパラメーターがあり、リスナー関数がそれに続く形になっています。イベント判定のためのパラメーターとは、以下の説明にある、特定の `callback_id` やメッセージ中の部分一致の文字列を指定する部分などのことです。これにより、リスナー関数が処理するイベントを条件に合致するものだけに絞り込むことができます。 | メソッド | 説明 | -| :---: | :--- | +| :--- | :--- | | `app.event(eventType, fn);` | Events API のイベントをリッスンします。`eventType` は、処理対象の[イベント](https://api.slack.com/events)を指定するための文字列 です。この値は、Slackアプリの設定画面でサブスクライブの設定がされている必要があります。 | | `app.message([pattern ,] fn);` | [`message` イベント](https://api.slack.com/events/message)のリッスンに特化した、便利なメソッドです。`pattern` パラメーターには、部分一致させる文字列、または正規表現を指定します。これによって処理対象のメッセージを判別します。 | | `app.action(actionId, fn);` | Block Kit エレメントから送信される `action` イベントをリッスンします。このイベントにはユーザーのボタン操作、メニュー選択、日付ピッカーの操作などがあります。`actionId` は文字列型で、アプリがビュー内に含めたブロックエレメントに指定した一意の `action_id` の値と一致する必要があります。ここでいう「ビュー」とは、メッセージ、モーダル、アプリのホームタブのことを指します。アクションエレメントを `input` ブロックに配置した場合はイベントがトリガーされないことに注意してください。 | `app.shortcut(callbackId, fn);` | グローバルショートカットまたはメッセージショートカットの呼び出しをリッスンします。`callbackId` は文字列または正規表現で、アプリの設定で指定したショートカットの `callback_id` にマッチする必要があります。 | `app.view(callbackId, fn);` | `view_submission` イベントと `view_closed` イベントをリッスンします。`view_submission` イベントは、アプリが開いたモーダルでユーザーがデータ送信の操作をしたときに発生します。`view_closed` イベントは、ユーザーがデータ送信を実行せずにモーダルを閉じたときに発生します。 -| `app.step(workflowStep)` | `WorkflowStep` のインスタンスに渡されたコールバックを使用して、ワークフローステップイベントのリッスンと応答を行います。コールバックには `edit`、`save`、`execute` の 3 種類があります。ワークフローステップについて詳しくは、[ドキュメント](/bolt-js/ja-jp/concepts#adding-editing-steps)を参照してください。 +| `app.step(workflowStep)` | `WorkflowStep` のインスタンスに渡されたコールバックを使用して、ワークフローステップイベントのリッスンと応答を行います。コールバックには `edit`、`save`、`execute` の 3 種類があります。ワークフローステップについて詳しくは、[ドキュメント](/concepts/adding-editing-steps)を参照してください。 | `app.command(commandName, fn);` | Slash コマンドの呼び出しをリッスンします。`commandName` は文字列型で、アプリの設定で指定したスラッシュコマンドと一致する必要があります。スラッシュコマンドの名前では `/` を最初に配置します(例 : `/helpdesk`)。 | `app.options(actionId, fn);` | 外部データソースを使用するセレクトメニューなどから送られる選択肢読み込みのリクエストをリッスンします。使う機会は多くありませんが、`app.action` と混同しないようにしましょう。`actionId` は文字列型で、アプリがビュー内に[外部データソースを使用するセレクトメニュー](https://api.slack.com/reference/block-kit/block-elements#external_select)を含めるときに指定した`action_id` と一致する必要があります。 @@ -45,7 +41,7 @@ Slack アプリは通常、Slack からのイベント情報を受け取った 一部のメソッドでは、さまざまな制約オブジェクトを指定することができます。制約オブジェクトを使用すると、リスナー関数で扱うイベントをさらに絞り込んだり、特定のケースに対応することができます。制約オブジェクトは、上で説明した識別子の代わりとしてメソッドに渡すことができます。さまざまな制約オブジェクトとそれを渡せるメソッドを以下の表にまとめます。 | メソッド | オプション | 詳細 | -| :---: | :--- | :--- | +| :--- | :--- | :--- | | `app.action(constraints, fn)` | `block_id`, `action_id`, `callback_id`, (,`type`) | `action_id` だけでなく、他の制約指定でもリッスンします。`block_id` は、エレメントの親ブロックの ID です。`callback_id` は、ビューの初期化時に指定したビューの ID です(モーダルに配置したアクションエレメントのみで使用できます)。`type` を指定することで、blocks内のアクションのみを処理するか、あるいは `attachments` 内のアクションのみなのかを選択できます。type に `block_actions` を指定すると、blocks内のアクションエレメントのみを処理します。`interactive_message` を指定すると、旧来の `attachments` 内のインタラクティブなアクションのみを処理します。 | | `app.shortcut(constraints, fn)` | `type`, `callback_id` | 対象のショートカットの種類を指定できます。`type` に `shortcut`を指定すると**グローバルショートカット**、 `message_action`の場合は**メッセージショートカット**)となります。`callbackId` には文字列か正規表現を指定します。 | | `app.view(constraints, fn)` | `type`, `callback_id` | `type` には `view_closed` または `view_submission` のいずれかを指定します。ここで指定した種別のイベントの場合のみリスナー関数にイベントが渡されます。`callback_id` は、アプリでモーダルを開く際に設定したビューの `callback_id` です。 | @@ -55,8 +51,8 @@ Slack アプリは通常、Slack からのイベント情報を受け取った リスナー関数がアクセスできる引数は、リスナー関数が渡されるメソッドによって決まります。以下の表は、これらの引数の説明です。この表は、それぞれの引数とそれにアクセスできるメソッドの詳細をカバーします。 | 引数 | 説明 | -| :---: | :--- | -| `payload` | すべてのリスナー | 受信したイベントペイロードから装飾部分などが取り除かれた本質的な内容部分。この内容や構造はイベントの種別によって異なります。このペイロード情報は下記の `body`のサブセットです。また、`payload` には、リスナーが渡されたメソッド名と同じ名前のエイリアスを使ってアクセスすることもできます(`message`、`event`、`action`、`shortcut`、`view`、`command`、`options`)。**payload の内容を簡単に確認する方法は、それを実際にログに出力してみることです**。または、[TypeScript](/bolt-js/ja-jp/tutorial/using-typescript) を使うのもよいでしょう。 | +| :--- | :--- | +| `payload` | すべてのリスナー | 受信したイベントペイロードから装飾部分などが取り除かれた本質的な内容部分。この内容や構造はイベントの種別によって異なります。このペイロード情報は下記の `body`のサブセットです。また、`payload` には、リスナーが渡されたメソッド名と同じ名前のエイリアスを使ってアクセスすることもできます(`message`、`event`、`action`、`shortcut`、`view`、`command`、`options`)。**payload の内容を簡単に確認する方法は、それを実際にログに出力してみることです**。または、[TypeScript](/tutorial/using-typescript) を使うのもよいでしょう。 | | `say` | `message`, `event`, `action`, `command` | 受信したイベントが紐づいているチャンネルにメッセージを送信する関数。この引数が使用できるのは、リスナーをトリガーしたイベントにチャンネル ID が含まれる場合のみです(`message` イベントが最も一般的です)。`say` は、シンプルな文字列(プレーンテキストのメッセージ)またはオブジェクト(ブロックを含むメッセージ)を受け付けます。`say` は Promise を返します。この Promise は [`chat.postMessage` の応答でresolveされます](https://api.slack.com/methods/chat.postMessage)。もし`action` メソッドや、`message` 以外のイベントを使用する場合は、[イベントの payload にチャンネル ID が含まれているかを確認するようにしてください](https://api.slack.com/events)。 | `ack` | `action`, `shortcut`, `view`, `command`, `options` | アプリが受信イベントを受け取ったことを確認するために呼び出す**必要のある関数**。`ack` は応答の完了時にresolveする Promise を返します。詳しくは、[イベントの確認](#acknowledging-events)を参照してください。 | `client` | すべてのリスナー | イベントに関連づけられたトークンを使用する Web API クライアント。単一のワークスペースへのインストールでは、トークンは Appのコンストラクターに提供されます。複数のワークスペースへのインストールでは、トークンは `authorize` 関数から返されます。 @@ -76,7 +72,7 @@ Slack アプリは通常、Slack からのイベント情報を受け取った - `options` : [`body` と `payload`](https://api.slack.com/reference/block-kit/block-elements#external_select) ### リスナーミドルウェアとの違い {#difference-from-listener-middleware} -リスナーミドルウェアは、多くのリスナー関数で利用するロジックを実装したい場合に使用します(全てのリスナーでは使わないようなケースで)。リスナーミドルウェアは、上で説明したリスナー関数と同じ引数を持ちますが、唯一異なるのは `next()` 関数を持っている点です。この関数は、実行のチェインを切らないために、**必ず呼び出される必要があります**。リスナーミドルウェアについて詳しくは、[ドキュメント](/bolt-js/ja-jp/concepts#listener-middleware)を参照してください。 +リスナーミドルウェアは、多くのリスナー関数で利用するロジックを実装したい場合に使用します(全てのリスナーでは使わないようなケースで)。リスナーミドルウェアは、上で説明したリスナー関数と同じ引数を持ちますが、唯一異なるのは `next()` 関数を持っている点です。この関数は、実行のチェインを切らないために、**必ず呼び出される必要があります**。リスナーミドルウェアについて詳しくは、[ドキュメント](/concepts/listener-middleware)を参照してください。 ## 初期化オプション {#initialization-options} Bolt には、アプリをカスタマイズするためのさまざまな初期化オプションが用意されています。主なオプションには、Bolt アプリのオプションとレシーバーのオプションの 2 種類があります。レシーバーのオプションは、アプリで使用するレシーバーによって異なります。デフォルトの `HTTPReceiver` では以下のレシーバーオプションが利用できます(カスタムのレシーバーを使わない限りはこれらが利用できます)。 @@ -85,70 +81,70 @@ Bolt には、アプリをカスタマイズするためのさまざまな初期 `HTTPReceiver` オプションは、Bolt App オプションと同様に、`App` のコンストラクターに渡すことができます。渡したオプションは、初期化の際に `HTTPReceiver` のインスタンスに渡されます。 | オプション | 説明 | -| :---: | :--- | +| :--- | :--- | | `signingSecret` | アプリの設定の「Basic Information」から取得した 文字列。受信イベントが Slack から送信されたものであることを検証するために使用されます。 | | `endpoints` | レシーバーが Slack からの受信リクエストをリッスンするエンドポイントを指定する文字列または `オブジェクト`。現在、オブジェクトに指定できるキーはラベルとしての任意の文字列のみで、値にはカスタムのエンドポイントを指定します(例 : `/myapp/events`)。**デフォルトでは `/slack/events` というエンドポイントにすべてのイベントが送信されます。** | | `processBeforeResponse` | イベントに対して即座に確認の応答を返すかどうかを指定する真偽値。リクエストへの応答が完了するとリスナーはただちに終了してしまうため、FaaS プラットフォームでアプリを実行する場合に有用な設定です。 `true` に設定すると早期終了を防ぐためにハンドラーが実行されるまで応答を返すのを遅らせます。デフォルトは `false` です。 | -| `clientId` | アプリの設定で指定した、クライアントの ID を示す文字列。[OAuth の設定を行うために必要です](/bolt-js/ja-jp/concepts#authenticating-oauth)。 | -| `clientSecret` | アプリの設定で指定した、クライアントのシークレットキーを示す 文字列。[OAuth の設定を行うために必要です](/bolt-js/ja-jp/concepts#authenticating-oauth)。 | -| `stateSecret` | CSRF 攻撃を防ぐために [OAuth の設定時](/bolt-js/ja-jp/concepts#authenticating-oauth)に渡すことができる、推奨のパラメーター(文字列)。 | -| `installationStore` | [OAuth の設定時](/bolt-js/ja-jp/concepts#authenticating-oauth)に、インストールデータの保存・取得・削除の手段を定義します。`fetchInstallation` 、`storeInstallation`、`deleteInstallation` という 3 つのメソッドが含まれます。デフォルトの `installationStore` はインメモリストアです。 | -| `scopes` | アプリが [OAuth のプロセスの中で](/bolt-js/ja-jp/concepts#authenticating-oauth)アクセス許可を求めるスコープのリスト。 | -| `installerOptions` | [デフォルトの OAuth サポート](/bolt-js/ja-jp/concepts#authenticating-oauth)をカスタマイズする場合に指定するオブジェクト(必須ではない)。詳しくは、OAuth のドキュメントを参照してください。 | -| `dispatchErrorHandler` | 受信リクエストが想定しないパスへのリクエストを受信したときに実行されるエラーハンドラー。 詳細は[エラー処理のドキュメント](/bolt-js/ja-jp/concepts#error-handling)を参照してください。 | -| `processEventErrorHandler` | イベントの処理中に例外がスローされたときに実行されるエラーハンドラー。 詳細は[ドキュメント](/bolt-js/ja-jp/concepts#error-handling)を参照してください。| -| `unhandledRequestHandler` | Slack からのリクエストが Bolt アプリによって確認(`ack()`)されなかったときに実行されるエラーハンドラー。 詳細は[ドキュメント](/bolt-js/ja-jp/concepts#error-handling)を参照してください。 | -| `unhandledRequestTimeoutMillis` | リクエストが受信されてから `unhandledRequestHandler` が実行されるまでの待機時間(ミリ秒単位)。 デフォルトは `3001` です。 詳細は[ドキュメント](/bolt-js/ja-jp/concepts#error-handling)を参照してください。 | +| `clientId` | アプリの設定で指定した、クライアントの ID を示す文字列。[OAuth の設定を行うために必要です](/concepts/authenticating-oauth)。 | +| `clientSecret` | アプリの設定で指定した、クライアントのシークレットキーを示す 文字列。[OAuth の設定を行うために必要です](/concepts/authenticating-oauth)。 | +| `stateSecret` | CSRF 攻撃を防ぐために [OAuth の設定時](/concepts/authenticating-oauth)に渡すことができる、推奨のパラメーター(文字列)。 | +| `installationStore` | [OAuth の設定時](/concepts/authenticating-oauth)に、インストールデータの保存・取得・削除の手段を定義します。`fetchInstallation` 、`storeInstallation`、`deleteInstallation` という 3 つのメソッドが含まれます。デフォルトの `installationStore` はインメモリストアです。 | +| `scopes` | アプリが [OAuth のプロセスの中で](/concepts/authenticating-oauth)アクセス許可を求めるスコープのリスト。 | +| `installerOptions` | [デフォルトの OAuth サポート](/concepts/authenticating-oauth)をカスタマイズする場合に指定するオブジェクト(必須ではない)。詳しくは、OAuth のドキュメントを参照してください。 | +| `dispatchErrorHandler` | 受信リクエストが想定しないパスへのリクエストを受信したときに実行されるエラーハンドラー。 詳細は[エラー処理のドキュメント](/concepts/error-handling)を参照してください。 | +| `processEventErrorHandler` | イベントの処理中に例外がスローされたときに実行されるエラーハンドラー。 詳細は[ドキュメント](/concepts/error-handling)を参照してください。| +| `unhandledRequestHandler` | Slack からのリクエストが Bolt アプリによって確認(`ack()`)されなかったときに実行されるエラーハンドラー。 詳細は[ドキュメント](/concepts/error-handling)を参照してください。 | +| `unhandledRequestTimeoutMillis` | リクエストが受信されてから `unhandledRequestHandler` が実行されるまでの待機時間(ミリ秒単位)。 デフォルトは `3001` です。 詳細は[ドキュメント](/concepts/error-handling)を参照してください。 | | `signatureVerification` | Bolt が Slack からの受信リクエストの署名を検証するかどうかを指定する真偽値。 デフォルトは `true` です。 | ### App オプション {#app-options} -App オプションは、`App` のコンストラクターに渡します。`receiver` 引数が設定されない場合 `App` コンストラクターは上記の[ `receiver` オプション](#レシーバーオプション)を受け取り、それを用いて `socketMode` の値に応じて `HttpReceiver` または `SocketModeReceiver` を初期化します。 +App オプションは、`App` のコンストラクターに渡します。`receiver` 引数が設定されない場合 `App` コンストラクターは上記の[ `receiver` オプション](#receiver-options)を受け取り、それを用いて `socketMode` の値に応じて `HttpReceiver` または `SocketModeReceiver` を初期化します。 | オプション | 説明 | -| :---: | :--- | -| `receiver` | `Receiver` のインスタンス。受信イベントのパースとその処理を行います。[`Receiver` インターフェイス](/bolt-js/ja-jp/concepts#receiver)に準拠して、`init(app)`、`start()`、`stop()`を持つ必要があります。receiver について詳しくは、[ドキュメント](/bolt-js/ja-jp/concepts#receiver)を参照してください。 | +| :--- | :--- | +| `receiver` | `Receiver` のインスタンス。受信イベントのパースとその処理を行います。[`Receiver` インターフェイス](/concepts/receiver)に準拠して、`init(app)`、`start()`、`stop()`を持つ必要があります。receiver について詳しくは、[ドキュメント](/concepts/receiver)を参照してください。 | | `agent` | オプションの HTTP `エージェント`。プロキシのサポートを設定する場合に使用します。カスタムの agent について詳しくは、[Node Slack SDK のドキュメント](https://slack.dev/node-slack-sdk/web-api#proxy-requests-with-a-custom-agent)を参照してください。 | | `clientTls` | 設定必須ではない文字列。HTTP クライアントリクエストにカスタムの TLS を設定する場合に指定します。`"pfx"`、`"key"`、`"passphrase"`、`"cert"`、`"ca"` のいずれかを指定します。 | -| `convoStore` | ステートに関連する会話のデータを設定・取得するためのデータストア実装。`set()` で会話のステートを設定し、`get()` で取得します。デフォルトでは、アプリはインメモリのストアを利用できます。詳細とサンプルについては、[ドキュメント](/bolt-js/ja-jp/concepts#conversation-store)を参照してください。 | +| `convoStore` | ステートに関連する会話のデータを設定・取得するためのデータストア実装。`set()` で会話のステートを設定し、`get()` で取得します。デフォルトでは、アプリはインメモリのストアを利用できます。詳細とサンプルについては、[ドキュメント](/concepts/conversation-store)を参照してください。 | | `token` | アプリの設定(「Settings」>「Install App」)で指定した 文字列。Web API の呼び出しに必要です。`authorize`、`orgAuthorize`やOAuth 設定を使用する場合には指定しないでください。 | | `botId` | `authorize` が定義されていない場合に限り指定できる、設定必須ではない`botId`(例 :`B12345`)。ボットトークンの ID で、アプリ自身によって送信されたメッセージを無視するために使用されます。`xoxb` トークンがアプリに渡されている場合、アプリは [`auth.test` メソッド](https://api.slack.com/methods/auth.test)を呼び出して、この値を自動的に取得します。 | | `botUserId` | `authorize` が定義されていない場合に限り指定できる、設定必須ではない`botUserId`。`botId` とは異なり、ボットユーザーに関連づけられたユーザー ID を指します。ダイレクトメンションを識別するために使用します。`xoxb` トークンがアプリに渡されている場合、アプリは [`auth.test` メソッド](https://api.slack.com/methods/auth.test)を呼び出して、この値を自動的に取得します。 | -| `authorize` | 複数のチームでのインストールをサポートする場合に使用する関数。どのトークンが受信イベントに関連づけられているかを判断するのに使用します。`authorize` 関数に渡される元データには、場合によって `userId`、`conversationId`、`enterpriseId`、`teamId`、`isEnterpriseInstall` が含まれます(受信イベントによって異なります)。`authorize` 関数は、`botToken`、`botId`、`botUserId`、または `userToken`を返します。[ビルトインの OAuth サポート](/bolt-js/ja-jp/concepts#authenticating-oauth)を使用する場合、`authorize` 関数は自動的に作成されるため、自分で渡す必要はありません。`authorize` 関数について詳しくは、こちらを参照してください。 | -| `logger` | ビルトインのロガーの代わりにカスタムのロガーを渡すためのオプション。ロガーには特定のメソッドが実装されている必要があります。これには [`Logger` インターフェイス](https://github.com/slackapi/node-slack-sdk/blob/main/packages/logger/src/index.ts)で定義されている `setLevel(level:LogLevel)`、`getLevel()`、`setName(name: string)`、`debug(...msgs: any\[])`、`info(...msgs: any\[])`、`warn(...msgs: any\[])`、`error(...msgs: any\[])` があります。ログ出力の詳細については、[ドキュメント](/bolt-js/ja-jp/concepts#logging)を参照してください。 | -| `logLevel` | 出力するログのレベルを指定するオプション。`LogLevel` の出力に含まれる情報のレベルには、重要度の低い順から高い順に `DEBUG`、`INFO`、`WARN`、`ERROR` があります。デフォルトの `logLevel` は `INFO` に設定されています。ログ出力の詳細については、[ドキュメント](/bolt-js/ja-jp/concepts#logging)を参照してください。 | -| `extendedErrorHandler` | 真偽値を指定するオプションで、 `true` に設定するとさらなるリクエストのコンテキスト情報を含んだオブジェクトがグローバルエラーハンドラーに渡されます。 バージョン 3.8.0 から利用することができます。 デフォルトは `false` です。 より高度なエラーの処理に関する詳細は [API ドキュメント](/bolt-js/ja-jp/concepts#error-handling)を参照してください。 | +| `authorize` | 複数のチームでのインストールをサポートする場合に使用する関数。どのトークンが受信イベントに関連づけられているかを判断するのに使用します。`authorize` 関数に渡される元データには、場合によって `userId`、`conversationId`、`enterpriseId`、`teamId`、`isEnterpriseInstall` が含まれます(受信イベントによって異なります)。`authorize` 関数は、`botToken`、`botId`、`botUserId`、または `userToken`を返します。[ビルトインの OAuth サポート](/concepts/authenticating-oauth)を使用する場合、`authorize` 関数は自動的に作成されるため、自分で渡す必要はありません。`authorize` 関数について詳しくは、こちらを参照してください。 | +| `logger` | ビルトインのロガーの代わりにカスタムのロガーを渡すためのオプション。ロガーには特定のメソッドが実装されている必要があります。これには [`Logger` インターフェイス](https://github.com/slackapi/node-slack-sdk/blob/main/packages/logger/src/index.ts)で定義されている `setLevel(level:LogLevel)`、`getLevel()`、`setName(name: string)`、`debug(...msgs: any\[])`、`info(...msgs: any\[])`、`warn(...msgs: any\[])`、`error(...msgs: any\[])` があります。ログ出力の詳細については、[ドキュメント](/concepts/logging)を参照してください。 | +| `logLevel` | 出力するログのレベルを指定するオプション。`LogLevel` の出力に含まれる情報のレベルには、重要度の低い順から高い順に `DEBUG`、`INFO`、`WARN`、`ERROR` があります。デフォルトの `logLevel` は `INFO` に設定されています。ログ出力の詳細については、[ドキュメント](/concepts/logging)を参照してください。 | +| `extendedErrorHandler` | 真偽値を指定するオプションで、 `true` に設定するとさらなるリクエストのコンテキスト情報を含んだオブジェクトがグローバルエラーハンドラーに渡されます。 バージョン 3.8.0 から利用することができます。 デフォルトは `false` です。 より高度なエラーの処理に関する詳細は [API ドキュメント](/concepts/error-handling)を参照してください。 | | `ignoreSelf` | アプリ自身から発信されたメッセージをミドルウェアの関数で無視するかどうかを指定する真偽値。`botId` が必要です。デフォルトは `true` です。 | | `clientOptions.slackApiUrl` | Slack Web API で使用するエンドポイントをカスタマイズできます。これが使用されるのはほとんどがテスト用途です。 | -| `socketMode` | 真偽値を指定するオプションで、`true` に設定するとアプリは[ソケットモード](/bolt-js/ja-jp/concepts#socket-mode)で起動します。ソケットモードは WebSocket のコネクションを通して Slack からのデータを受信する機能です。デフォルトは `false` です。 +| `socketMode` | 真偽値を指定するオプションで、`true` に設定するとアプリは[ソケットモード](/concepts/socket-mode)で起動します。ソケットモードは WebSocket のコネクションを通して Slack からのデータを受信する機能です。デフォルトは `false` です。 | `developerMode` | デベロッパーモードを有効にする真偽値です。 `true` に設定したとき、`logLevel` は `DEBUG`、 `socketMode` は `true` に自動的に設定されます。しかし、 これらの二つのプロパティを明示的に設定した場合、それらの設定が `developerMode` による設定よりも優先されます。さらに、デバッグをしやすくするためのカスタムの OAuth エラーハンドラーも提供されます。また、全ての Slack からのリクエストのボディがログ出力されるため、トークンのようなセンシティブな情報がログに含まれる可能性があります。デフォルトは `false` です。| | `deferInitialization` | アプリの初期化を遅延させる真偽値です。有効にすると非同期の `App#init()` メソッドを手動で呼び出す必要があります。 また `init()` メソッドは `App#start()` を実行する前に呼び出さなければなりません。 デフォルトは `false` です。 | | `signatureVerification` | Boltが着信リクエストでSlackの署名を検証する必要があるかどうかを決定するブール値。 デフォルトは`true`です。 | -> Bolt のclientは [Node Slack SDK](/node-slack-sdk) の `WebClient` のインスタンスです。そのため、Node Slack SDK のドキュメントも合わせて参照すると、開発時の理解に役立つでしょう。 +> Bolt のclientは [Node Slack SDK](https://slack.dev/node-slack-sdk) の `WebClient` のインスタンスです。そのため、Node Slack SDK のドキュメントも合わせて参照すると、開発時の理解に役立つでしょう。 ## フレームワークのエラー {#framework-error-types} Bolt では、さまざまなエラーが定義されています。これらにはより具体的なコンテキスト情報が含まるため、エラーのハンドリングが行いやすくなるでしょう。以下は、すべてのエラーコードを網羅しているわけではありませんが、開発中に目にすると思われるものを取り上げたエラーコードの一覧です。 | エラーコード | 詳細 | -| :---: | :--- | +| :--- | :--- | | `AppInitializationError` | 無効な初期化オプションが渡されたことを示します。原因として、署名シークレットが渡されていないことや、競合するオプションが指定されたことなどが考えられます(例 : `token` と `authorize` の両方を同時に指定することはできない)。`original` プロパティで詳細を確認できます。このエラーがスローされるのは、アプリのコンストラクターで行われる初期化時のみです。 | | `AuthorizationError` | インストール情報が取得できなかった、またはパースできなかったときにのみスローされるエラーです。このエラーは、ビルトインの OAuth サポートを使用しているときに発生する可能性があります。また、独自の `authorize` 関数を作成するときに、このエラーをインポートして使用することができます。 | | `ContextMissingPropertyError` | `context` オブジェクトに必要な情報が不足しているときにスローされるエラーです(例 : `ignoreSelf` を `true` に設定したのに `botUserId` または `botId` が含まれていない)。不足しているプロパティは、`missingProperty` プロパティで確認できます。 | | `ReceiverMultipleAckError` | Receiver 内で、すでに確認が済んでいるリクエストに対してアプリがさらに `ack()` を呼んだ場合にスローされるエラーです。現在、デフォルトの `HTTPReceiver` でのみ使用されます。 | | `ReceiverAuthenticityError` | アプリのリクエストの署名が検証できないときにスローされるエラーです。このエラーには、失敗した理由を示す情報が含まれます(例 : タイムスタンプが有効でない、ヘッダーに抜けがある、署名シークレットが有効でない)。 | `MultipleListenerError` | 単一のイベントに対して複数のリスナーでの処理中に複数のエラーが発生した場合にスローされるエラーです。個々のエラーを配列に収めた `originals` プロパティを持ちます。 | -| `WorkflowStepInitializationError` | 新しい `WorkflowStep` をインスタンス化する際に、設定オプションが無効な場合、または不足している場合にスローされるエラーです。原因として、`callback_id` が指定されていない、または設定オブジェクトが指定されていないことが考えられます。ワークフローステップについて詳しくは、[ドキュメント](/concepts#steps)を参照してください。 | +| `WorkflowStepInitializationError` | 新しい `WorkflowStep` をインスタンス化する際に、設定オプションが無効な場合、または不足している場合にスローされるエラーです。原因として、`callback_id` が指定されていない、または設定オブジェクトが指定されていないことが考えられます。ワークフローステップについて詳しくは、[ドキュメント](/concepts/creating-steps)を参照してください。 | | `UnknownError` | フレームワーク内でスローされる、特定のエラーコードを持たないエラーです。`original` プロパティで詳細を確認できます。 | > [errors.ts](https://github.com/slackapi/bolt-js/blob/main/src/errors.ts) のコードで、エラー定義の部分とコンストラクターの部分を読み、参考にしてみてください。 ### クライアント側のエラー {#client-errors} -Bolt では、Slack API の呼び出しのため `WebClient` をインポートしています。クライアントで API 呼び出しを行う際に目にすると思われるエラーを以下に示します。より詳しい内容は、[Web API のドキュメント](/node-slack-sdk/web-api#handle-errors)を参照してください。クライアントのエラーをハンドリングする際、`data` プロパティの `body` で詳しい情報を確認できます。 +Bolt では、Slack API の呼び出しのため `WebClient` をインポートしています。クライアントで API 呼び出しを行う際に目にすると思われるエラーを以下に示します。より詳しい内容は、[Web API のドキュメント](https://slack.dev/node-slack-sdk/web-api#handle-errors)を参照してください。クライアントのエラーをハンドリングする際、`data` プロパティの `body` で詳しい情報を確認できます。 | エラーコード | 詳細 | -| :---: | :--- | +| :--- | :--- | | `PlatformError` | Slack API の呼び出し中に何らかの異常が発生したことを示すエラー。`data` プロパティを持ちます。 | | `RequestError` | リクエストが送信できなかったことを示すエラー。ネットワーク接続が利用できないことなどが原因として考えられます。`original` プロパティで詳細を確認できます。 | -| `RateLimitedError` | 短時間で送信したリクエストが多すぎることを示すエラー。`retryAfter` プロパティで、再送信まで待機する必要のある秒数を確認できます。`WebClient` は、デフォルトでレート制限エラーのハンドリングを行います。[詳しくはドキュメントを参照してください](/node-slack-sdk/web-api#rate-limits)。 | -| `HTTPError` | HTTP レスポンスに通常は想定されないステータスコードが設定されていたことを示すエラー。Web API が返す HTTP ステータスコードは、通常 `200`(エラー時を含む)または `429`(レート制限時)のみです。 | +| `RateLimitedError` | 短時間で送信したリクエストが多すぎることを示すエラー。`retryAfter` プロパティで、再送信まで待機する必要のある秒数を確認できます。`WebClient` は、デフォルトでレート制限エラーのハンドリングを行います。[詳しくはドキュメントを参照してください](https://slack.dev/node-slack-sdk/web-api#rate-limits)。 | +| `HTTPError` | HTTP レスポンスに通常は想定されないステータスコードが設定されていたことを示すエラー。Web API が返す HTTP ステータスコードは、通常 `200`(エラー時を含む)または `429`(レート制限時)のみです。 | \ No newline at end of file diff --git a/docs/_steps/ja_adding_editing_workflow_step.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/adding-editing-steps.md similarity index 97% rename from docs/_steps/ja_adding_editing_workflow_step.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/adding-editing-steps.md index b52b46d2c..376aedaee 100644 --- a/docs/_steps/ja_adding_editing_workflow_step.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/adding-editing-steps.md @@ -1,12 +1,9 @@ --- title: ステップの追加・編集 lang: ja-jp -slug: adding-editing-steps -order: 3 +slug: /concepts/adding-editing-steps --- -
    - ワークフローの作成者が、アプリが提供するステップをワークフローに追加(またはその設定を変更)するタイミングで、アプリは [`workflow_step_edit`](https://api.slack.com/reference/workflows/workflow_step_edit) というイベントを受信します。このイベントの受信時に `WorkflowStep` 設定オブジェクト内の `edit` コールバック関数が実行されます。 このとき、ワークフロー作成・変更のどちらの場合でも、アプリは[ワークフローステップ設定のためのモーダル](https://api.slack.com/reference/workflows/configuration-view)を応答する必要があります。このモーダルは、ワークフローステップに固有の設定である必要があり、通常のモーダルにはない制約があります。最もわかりやすいものとしては、`title​`、`submit​`、`close` プロパティを設定することができません。また、デフォルトの設定では、この設定モーダルの `callback_id` はワークフローステップのものと同じものが使用されます。 @@ -15,8 +12,6 @@ order: 3 設定モーダルを開く処理に関するさらなる詳細は、[ドキュメント](https://api.slack.com/workflows/steps#handle_config_view)を参考にしてください。 -
    - ```javascript const ws = new WorkflowStep('add_task', { edit: async ({ ack, step, configure }) => { @@ -62,4 +57,4 @@ const ws = new WorkflowStep('add_task', { save: async ({ ack, step, update }) => {}, execute: async ({ step, complete, fail }) => {}, }); -``` +``` \ No newline at end of file diff --git a/docs/_steps/ja_creating_workflow_step.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/creating-steps.md similarity index 95% rename from docs/_steps/ja_creating_workflow_step.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/creating-steps.md index 6b6bb2542..600504501 100644 --- a/docs/_steps/ja_creating_workflow_step.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/creating-steps.md @@ -1,12 +1,9 @@ --- title: ステップの定義 lang: ja-jp -slug: creating-steps -order: 2 +slug: /concepts/creating-steps --- -
    - ワークフローステップを作るための手段として Bolt は `WorkflowStep` というクラスを提供しています。 新しい `WorkflowStep` インスタンスの生成には、そのステップの `callback_id` と設定オブジェクトを渡します。 @@ -15,7 +12,6 @@ order: 2 `WorkflowStep` インスタンスを生成したら、それを `app.step()` メソッドに渡します。これによって、Bolt アプリは対象のワークフローステップのイベントをリッスンしたり、設定オブジェクトが提供するコールバック関数を使ってイベントに応答したりすることができるようになります。  -
    ```javascript const { App, WorkflowStep } = require('@slack/bolt'); @@ -34,4 +30,4 @@ const ws = new WorkflowStep('add_task', { }); app.step(ws); -``` +``` \ No newline at end of file diff --git a/docs/_steps/ja_executing_workflow_steps.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/executing-steps.md similarity index 96% rename from docs/_steps/ja_executing_workflow_steps.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/executing-steps.md index 87c5d1acb..2bd6660bd 100644 --- a/docs/_steps/ja_executing_workflow_steps.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/executing-steps.md @@ -1,20 +1,15 @@ --- title: ステップの実行 lang: ja-jp -slug: executing-steps -order: 5 +slug: /concepts/executing-steps --- -
    - ワークフローの利用者によって、アプリが提供するカスタムのワークフローステップが実行されるとき、アプリは[`workflow_step_execute`](https://api.slack.com/events/workflow_step_execute) というイベントを受信します。このイベントの受信時に `WorkflowStep` 設定オブジェクト内の `execute` コールバック関数が実行されます。 `save` コールバック関数で予め規定された `inputs` の情報を使って、ここでの処理は、サードパーティの API を呼び出したり、データベースに情報を保存したり、そのユーザーのホームタブを更新したり、`outputs` オブジェクトを構築することで後続のワークフローステップが利用できる情報を設定したりします。 `execute` コールバック関数内では、ステップの実行が成功であることを Slack 側に伝える `complete()` 関数、失敗であることを伝える `fail()` 関数のいずれかを呼び出す必要があります。 -
    - ```javascript const ws = new WorkflowStep('add_task', { edit: async ({ ack, step, configure }) => {}, @@ -39,4 +34,4 @@ const ws = new WorkflowStep('add_task', { // fail({ error: { message: "Just testing step failure!" } }).then(() => { console.log('workflow step execution failure registered'); }); }, }); -``` +``` \ No newline at end of file diff --git a/docs/_steps/ja_saving_workflow_step.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/saving-steps.md similarity index 96% rename from docs/_steps/ja_saving_workflow_step.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/saving-steps.md index 1ea8a1c95..7eda9c243 100644 --- a/docs/_steps/ja_saving_workflow_step.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/saving-steps.md @@ -1,12 +1,9 @@ --- title: ステップの設定の保存 lang: ja-jp -slug: saving-steps -order: 4 +slug: /concepts/saving-steps --- -
    - ワークフローステップの設定モーダルが開いたら、アプリはワークフロー作成者がモーダルを送信するイベントである `view_submission` イベントを待ち受けます。このイベントを受信すると `WorkflowStep` 設定オブジェクト内の `save` コールバック関数が実行されます。 `save` コールバック関数の中では、以下の引数を渡してステップの設定を保存するための `update()` 関数を利用できます。 @@ -18,8 +15,6 @@ order: 4 これら引数をどのように構成するかの詳細は、[ドキュメント](https://api.slack.com/reference/workflows/workflow_step)を参考にしてください。 -
    - ```javascript const ws = new WorkflowStep('add_task', { edit: async ({ ack, step, configure }) => {}, diff --git a/docs/_steps/ja_workflow_steps_overview.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/steps.md similarity index 91% rename from docs/_steps/ja_workflow_steps_overview.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/steps.md index cd2cf8121..405219353 100644 --- a/docs/_steps/ja_workflow_steps_overview.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/steps/steps.md @@ -1,11 +1,9 @@ --- title: ワークフローステップの概要 lang: ja-jp -slug: steps-overview -order: 1 +slug: /concepts/steps --- -
    (アプリによる)ワークフローステップ(Workflow Steps from Apps) は、[ワークフロービルダー](https://api.slack.com/workflows)におけるワークフローに組み込み可能なカスタムのワークフローステップを任意の Slack アプリが提供することを可能とします。 ワークフローステップは、三つの異なるユーザーイベントから構成されます: @@ -16,6 +14,4 @@ order: 1 ワークフローステップを機能させるためには、これら三つのイベント全てを適切にハンドリングする必要があります。 -ワークフローステップのさらなる詳細については [API ドキュメント](https://api.slack.com/workflows/steps)を参考にしてください。 - -
    +ワークフローステップのさらなる詳細については [API ドキュメント](https://api.slack.com/workflows/steps)を参考にしてください。 \ No newline at end of file diff --git a/docs/_tutorials/ja_getting_started_http.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/getting-started-http.md similarity index 87% rename from docs/_tutorials/ja_getting_started_http.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/getting-started-http.md index c8858dc66..6b4dfa8d3 100644 --- a/docs/_tutorials/ja_getting_started_http.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/getting-started-http.md @@ -1,18 +1,12 @@ --- title: Bolt 入門ガイド (HTTP) -order: 5 slug: getting-started-http lang: ja-jp -layout: tutorial -permalink: /ja-jp/tutorial/getting-started-http -redirect_from: - - /ja-jp/getting-started-http --- + # Bolt 入門ガイド (HTTP) -
    このガイドでは、Bolt を使用して Slack アプリを起動し実行する方法について説明します。その過程で、新しい Slack アプリを作成し、ローカル環境を設定し、Slack ワークスペースからのメッセージをリッスンして応答するアプリを開発します。 -
    このガイドが終わったら、あなたはこの⚡️[Getting Started app](https://github.com/slackapi/bolt-js-getting-started-app)を実行したり、修正したり、自分で作ったりすることができます。 @@ -21,13 +15,17 @@ redirect_from: ### アプリを作成する {#create-an-app} 最初にやるべきこと: Bolt で開発を始める前に、 [Slack アプリを作成](https://api.slack.com/apps/new)します。 -> 💡 いつもの仕事のさまたげにならないように、別に開発用のワークスペースを使用することをおすすめします — [新しいワークスペースを無料で作成](https://slack.com/get-started#create)できます。 +:::tip + +いつもの仕事のさまたげにならないように、別に開発用のワークスペースを使用することをおすすめします — [新しいワークスペースを無料で作成](https://slack.com/get-started#create)できます。 + +::: アプリ名を入力し (後で変更可能)、インストール先のワークスペースを選択したら、`Create App` ボタンをクリックすると、アプリの **Basic Information** ページが表示されます。 このページには、後で必要になる重要な認証情報 (**App Credentials** ヘッダーの下の `Signing Secret` など) に加えて、アプリケーションの概要が表示されます。 -![Basic Information page](../../assets/basic-information-page.png "Basic Information page") +![Basic Information page](/img/basic-information-page.png "Basic Information page") ひと通り確認し、アプリのアイコンと説明を追加してから、アプリの設定 🔩 を始めましょう。 @@ -51,9 +49,13 @@ Slack アプリで使用できるトークンには、ユーザートークン 4. インストールを承認すると、**OAuth & Permissions** ページが表示され、**Bot User OAuth Access Token** を確認することができるはずです。 -![OAuth Tokens](../../assets/bot-token.png "OAuth Tokens") +![OAuth Tokens](/img/bot-token.png "OAuth Tokens") + +:::tip + +トークンは、パスワードのように大切に扱い、[安全に保管](https://api.slack.com/docs/oauth-safety)してください。アプリではそのトークンを使用して、Slack ワークスペースからの情報を投稿および取得します。 -> 💡 トークンは、パスワードのように大切に扱い、[安全に保管](https://api.slack.com/docs/oauth-safety)してください。アプリではそのトークンを使用して、Slack ワークスペースからの情報を投稿および取得します。 +::: --- @@ -122,7 +124,6 @@ node app.js Slack ワークスペースで発生するイベント (メッセージが投稿されたときや、メッセージに対するリアクションが投稿されたときなど) をリッスンするには、[Events API を使用してイベントタイプに登録](https://api.slack.com/events-api)します。 - アプリのイベントを有効にしましょう。 1. アプリのイベントを有効にするには、まずアプリ設定ページに戻ります ([アプリ管理ページ](https://api.slack.com/apps)でアプリをクリックします)。左側のサイドバーにある **Event Subscription** をクリックします。**Enable Events** のスイッチをオンにします。 @@ -187,9 +188,13 @@ app.message('hello', async ({ message, say }) => { アプリ設定ページに戻り、左側の **Interactivity & Shortcuts** をクリックします。**Request URL** ボックスがもう 1 つあることがわかります。 -> 💡 デフォルトでは、Bolt はイベントに使用しているのと同じエンドポイントをインタラクティブコンポーネントに使用するように設定されているため、上記と同じリクエスト URL (この例では `https://8e8ec2d7.ngrok.io/slack/events`) を使用します。右下隅にある **Save Changes** ボタンを押してください。これでアプリのインタラクティブなコンポーネントを利用する設定が有効になりました! +:::tip + +デフォルトでは、Bolt はイベントに使用しているのと同じエンドポイントをインタラクティブコンポーネントに使用するように設定されているため、上記と同じリクエスト URL (この例では `https://8e8ec2d7.ngrok.io/slack/events`) を使用します。右下隅にある **Save Changes** ボタンを押してください。これでアプリのインタラクティブなコンポーネントを利用する設定が有効になりました! + +::: -![Configuring a Request URL](../../assets/request-url-config.png "Configuring a Request URL") +![Configuring a Request URL](/img/request-url-config.png "Configuring a Request URL") インタラクティブ機能を有効にすると、ショートカット、モーダル、インタラクティブコンポーネント(ボタン、セレクトメニュー、データピッカーなど)とのやり取りがイベントとしてアプリに送信されます。 @@ -244,7 +249,11 @@ app.message('hello', async ({ message, say }) => { このボタン `accessory` オブジェクトには、`action_id` が割り当てられています。これはボタンの一意の識別子として機能するため、アプリはどのアクションに応答するかを指定できます。 -> 💡 [Block Kit ビルダー](https://app.slack.com/block-kit-builder)を使うとインタラクティブメッセージを簡単にプロトタイプすることができます。ビルダーを使用すると、ユーザー (またはそのチームメンバー) はメッセージをモックアップして、対応する JSON を生成し、それをアプリに直接貼り付けることができます。 +:::tip + +[Block Kit ビルダー](https://app.slack.com/block-kit-builder)を使うとインタラクティブメッセージを簡単にプロトタイプすることができます。ビルダーを使用すると、ユーザー (またはそのチームメンバー) はメッセージをモックアップして、対応する JSON を生成し、それをアプリに直接貼り付けることができます。 + +::: これで、アプリを再起動し、アプリが登録されているチャンネルで `hello` と入力すると、ボタン付きのメッセージが表示されます。ただしこのボタンをクリックしても、まだ何も起こりません。 @@ -306,10 +315,10 @@ app.action('button_click', async ({ body, ack, say }) => { 基本的なアプリの作成ができましたので、次回は是非もっといろいろな、 Bolt の機能を使ってアプリを作ってみましょう。下記のリンクを辿っていろいろアイデアを模索してみてください! -* [基本的な概念](/bolt-js/ja-jp/concepts#basic)をお読みください。Bolt アプリからアクセスできるさまざまなメソッドと機能について学ぶことができます。 +* 基本的な概念 をお読みください。Bolt アプリからアクセスできるさまざまなメソッドと機能について学ぶことができます。 -* ボットが[`events()` メソッド](/bolt-js/ja-jp/concepts#event-listening)でリッスンできるさまざまなイベントを確認しましょう。イベントはすべて[API サイト](https://api.slack.com/events)にリストされています。 +* ボットが[`events()` メソッド](/concepts/event-listening)でリッスンできるさまざまなイベントを確認しましょう。イベントはすべて[API サイト](https://api.slack.com/events)にリストされています。 -* Bolt を使用すると、アプリにアタッチされているクライアントで [Web API メソッドを呼び出す](/bolt-js/ja-jp/concepts#web-api)ことができます。API サイトに [220 を超えるメソッド](https://api.slack.com/methods)を用意してあります。 +* Bolt を使用すると、アプリにアタッチされているクライアントで [Web API メソッドを呼び出す](/concepts/web-api)ことができます。API サイトに [200 を超えるメソッド](https://api.slack.com/methods)を用意してあります。 -* 異なるトークンの種類については、[APIサイト](https://api.slack.com/docs/token-types)を参照してください。アプリケーションが実行したいアクションに応じて、異なるトークンが必要になる場合があります。HTTPではなく[Socket Mode](/bolt-js/ja-jp/tutorial/getting-started)を使用している場合は、`connections:write`スコープを持つ追加の(`xapp`)トークンが必要です。 +* 異なるトークンの種類については、[APIサイト](https://api.slack.com/docs/token-types)を参照してください。アプリケーションが実行したいアクションに応じて、異なるトークンが必要になる場合があります。HTTPではなく[Socket Mode](/getting-started)を使用している場合は、`connections:write`スコープを持つ追加の(`xapp`)トークンが必要です。 \ No newline at end of file diff --git a/docs/_tutorials/ja_hubot_migration.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/hubot-migration.md similarity index 88% rename from docs/_tutorials/ja_hubot_migration.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/hubot-migration.md index 6f70c816e..30d5173db 100644 --- a/docs/_tutorials/ja_hubot_migration.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/hubot-migration.md @@ -1,21 +1,14 @@ --- title: Hubot から Bolt に移行する方法 -order: 3 slug: hubot-migration lang: ja-jp -layout: tutorial -permalink: /ja-jp/tutorial/hubot-migration -redirect_from: - - /ja-jp/hubot-migration --- # Hubot のアプリを Bolt に移行する方法 -
    Bolt は、Slack アプリを構築する時間と手間を減らすために作成されたフレームワークで、Slack 開発者のみなさんに最新機能とベストプラクティスを使用してアプリを構築できる単一のインターフェイスを提供します。このガイドでは、[Hubot で作成されたアプリを Bolt アプリに](https://hubot.github.com/docs/)移行するプロセスを順を追って説明します。 すでに [ボットユーザーがいるアプリ](https://api.slack.com/bot-users#getting-started) を持っている方、または Hubot コードを Bolt コードに変換するコードサンプルをお探しの方は、はじめに[Bolt リポジトリのサンプルスクリプト](https://github.com/slackapi/bolt-js/blob/master/examples/hubot-example/script.js) を読むとよいでしょう。 -
    - + --- ### まずはじめに {#setting-the-stage} @@ -36,7 +29,11 @@ Bolt アプリを作成する前に考慮に入れた方がよい違いがほか #### Slack アプリを作成する まず最初に、Slack アプリを作成します。 -> 💡ここでは普段の仕事の支障にならないように、開発専用のワークスペースを使用することをおすすめします — [新しいワークスペースの作成はここから](https://api.slack.com/apps/new)。 +:::tip + +ここでは普段の仕事の支障にならないように、開発専用のワークスペースを使用することをおすすめします — [新しいワークスペースの作成はここから](https://api.slack.com/apps/new)。 + +::: アプリ名を入力し、インストール先のワークスペースを選択したら、`Create App` ボタンをクリックします。そうすると、アプリの **Basic Information** ページが表示されます。 @@ -52,12 +49,12 @@ Slack では、Hubot アプリはユーザーとの対話型のボットユー ### ボットの設定 {#configure-what-your-bot-will-hear} [Events API](https://api.slack.com/bot-users#app-mentions-response) は、ボットの目と耳に相当します。これによりボットは、投稿されたメッセージ、チャンネルの変更、Slack で発生するその他のアクティビティに反応することができます。 -> ⚠️ボットのイベントを設定する前に、パブリック URL が必要です。Bolt アプリを作成したことがない場合、または Events API を使用したことがない場合は、『Getting Started ガイド』の [ローカル Bolt プロジェクトの設定](https://slack.dev/bolt/ja-jp/tutorial/getting-started#setting-up-your-local-project) と [イベントの設定](https://slack.dev/bolt/ja-jp/tutorial/getting-started#setting-up-events) を参考にしてください。 +> ⚠️ボットのイベントを設定する前に、パブリック URL が必要です。Bolt アプリを作成したことがない場合、または Events API を使用したことがない場合は、『Getting Started ガイド』の [ローカル Bolt プロジェクトの設定](/getting-started) と [イベントの設定](/getting-started#setting-up-events) を参考にしてください。 #### メッセージのリスニング すべての Hubot アプリは、デフォルトでメッセージをリッスンできるので、ボットユーザーがそうするように設定する必要があります。 -[イベントの設定](https://slack.dev/bolt/ja-jp/tutorial/getting-started#setting-up-events) を行ってから、リクエスト URL を入力、そして検証されたことを確認したら、**Subscribe to Bot Events** にスクロールダウンします。メッセージに関連する次の 4 つのイベントがあります `message channel` (パブリックチャンネルのメッセージをリッスン)、`message group` (プライベートチャンネルのメッセージをリッスン)、`message.im` (アプリのホーム/DM スペースのメッセージをリッスン)、`message.mpim` (マルチパーソン DM のメッセージをリッスン)。 +[イベントの設定](/getting-started#setting-up-events) を行ってから、リクエスト URL を入力、そして検証されたことを確認したら、**Subscribe to Bot Events** にスクロールダウンします。メッセージに関連する次の 4 つのイベントがあります `message channel` (パブリックチャンネルのメッセージをリッスン)、`message group` (プライベートチャンネルのメッセージをリッスン)、`message.im` (アプリのホーム/DM スペースのメッセージをリッスン)、`message.mpim` (マルチパーソン DM のメッセージをリッスン)。 ボットがチャンネルのメッセージをリッスンするだけでよい場合は、`message.channels` と`message.groups` をリッスンできます。または、ボットがすべての場所のメッセージをリッスンするようにするには、4 つのメッセージイベントすべてを選択します。 @@ -69,7 +66,11 @@ Slack では、Hubot アプリはユーザーとの対話型のボットユー - アプリで `react` が使用されている場合、`reaction_added` イベントをサブスクライブします。これにより、ボットユーザーがいるチャンネルのメッセージにリアクションが追加される時をリッスンします。 - アプリで `presenceChange` が使用されている場合、対応するイベントはありません。このイベントがあなたのボットの機能上重要な場合は、Hubot の使用を継続するか、アプリのロジックを変更する必要があるかもしれません。 -> 💡Bolt に追加された利点として、どの [Events API イベント](https://api.slack.com/events) でもリッスンできることが挙げられます。移行が完了すれば、[ユーザーがワークスペースに参加したとき](https://api.slack.com/events/team_join) や [ユーザーがアプリで DM を開いたとき](https://api.slack.com/events/app_home_opened) など、より多くのイベントをリッスンできます。 +:::tip + +Bolt に追加された利点として、どの [Events API イベント](https://api.slack.com/events) でもリッスンできることが挙げられます。移行が完了すれば、[ユーザーがワークスペースに参加したとき](https://api.slack.com/events/team_join) や [ユーザーがアプリで DM を開いたとき](https://api.slack.com/events/app_home_opened) など、より多くのイベントをリッスンできます。 + +::: アプリの機能に対応するイベントを追加 し終えたら、**Save Changes** をクリックします。 @@ -85,7 +86,7 @@ Hubot スクリプトは、`hear()` を使用して、一致するパターン > 👨‍💻👩‍💻コードで `hear()` を使用している箇所はすべて、`message()` を使用するように変更してください。 -[メッセージのリスニングについてもっと詳しく読む](https://slack.dev/bolt/ja-jp/concepts#message-listening). +[メッセージのリスニングについてもっと詳しく読む](/concepts/message-listening). #### `say()` および `respond()` を使用したメッセージで応答する Hubot スクリプトは、`send()` を使用してメッセージを同じ会話に送信し、`reply()` を使用して、元のメッセージを送信したユーザー宛の@メンションを付けて、メッセージを同じ会話上に送信します。 @@ -96,7 +97,7 @@ Hubot の `send()` と Bolt の `say()` はほとんど同じですが、`say()` > 👨‍💻👩‍💻コードで `send()` が使用されている箇所はすべて `say()` に変更してください -[メッセージへの応答についてもっと詳しく読む](https://slack.dev/bolt/ja-jp/concepts#message-sending). +[メッセージへの応答についてもっと詳しく読む](/concepts/message-sending). #### `respond` と `react` 前のセクションで、Hubot スクリプトで `respond()` が使用されている場合は `app_mention` イベントを、`react()` が使用されている場合は `reaction_added` をサブスクライブするようにアプリを設定しました。 @@ -105,7 +106,7 @@ Bolt は、`event()` と呼ばれるメソッドを使用して、任意の [Eve > 👨‍💻👩‍💻コードで `respond()` が使用されている箇所はすべて、app.event ('app_mention') を使用するように変更してください。`react` が使用されている箇所はすべて `app.event('reaction_added')` に変更してください。 -[イベントのリッスンについてもっと詳しく読む](https://slack.dev/bolt/ja-jp/concepts#event-listening). +[イベントのリッスンについてもっと詳しく読む](/concepts/event-listening). ### Bolt で Web API メソッドを使用する {#using-web-api-methods-with-bolt-for-javascript} Hubot では、`@slack/client` から `WebClient` パッケージをインポートする必要がありました。Bolt では、`app.client` からアクセスできる `WebClient` インスタンスがデフォルトでインポートされます。 @@ -130,14 +131,14 @@ app.message('react', async ({ message, context, logger }) => { > 👨‍💻👩‍💻`app.client` で組み込みのクライアントを使用するように、Web API 呼び出しを変更してください。 -[Bolt での Web API の使用についてもっと詳しく読む。](https://slack.dev/bolt/ja-jp/concepts#web-api) +[Bolt での Web API の使用についてもっと詳しく読む。](/concepts/web-api) ### Bolt でのミドルウェアの使用 {#using-middleware-with-bolt-for-javascript} Hubot には、受信 (リスナーが呼び出される前に実行される)、リスナー (一致するすべてのリスナーに対して実行される)、応答 (送信されるすべての応答に対して実行される) という 3 種類のミドルウェアがあります。 Bolt には、グローバルとリスナーという 2 種類のミドルウェアしかありません。 -- グローバルミドルウェアは、リスナーミドルウェアが呼び出される前に実行されます。Bolt アプリ自体に付属しています。[Bolt のグローバルミドルウェアについてもっと詳しく読む。](https://slack.dev/bolt/ja-jp/concepts#global-middleware). -- リスナーミドルウェアは、付属するリスナー関数に対してのみ実行されます。[Bolt のリスナーミドルウェアについてもっと詳しく読む。](https://slack.dev/bolt/ja-jp/concepts#listener-middleware) +- グローバルミドルウェアは、リスナーミドルウェアが呼び出される前に実行されます。Bolt アプリ自体に付属しています。[Bolt のグローバルミドルウェアについてもっと詳しく読む。](/concepts/global-middleware). +- リスナーミドルウェアは、付属するリスナー関数に対してのみ実行されます。[Bolt のリスナーミドルウェアについてもっと詳しく読む。](/concepts/listener-middleware) Bolt では、グローバルとリスナーというミドルウェアはいずれも、`await next()` を呼び出して実行の制御を次のミドルウェアに渡す必要があります。ミドルウェアが実行中にエラーを検出した場合、`Error` を `next()` に渡すことができ、エラーはその前に実行されたミドルウェアチェーンにバブルアップされます。 @@ -154,14 +155,14 @@ Hubot には、brain と呼ばれるメモリ内ストレージがあります アプリのインスタンスが複数実行されている場合、組み込みの conversation store はプロセス間で共有されないため、データベースから conversation の状態を取得する conversation store を実装することをおすすめします。 -[会話ストアについてもっと詳しく読む](https://slack.dev/bolt/ja-jp/concepts#conversation-store). +[会話ストアについてもっと詳しく読む](/concepts/conversation-store). ### 次のステップ {#next-steps} ここまで来れば、きっと Hubot アプリを Bolt アプリに変換できているはずです!✨⚡ 新しくなってよりクールになった Bolt アプリを、さらにパワーアップしていくこともできます。 - [ボタンやメニュー選択](https://api.slack.com/messaging/interactivity#interaction) などの双方向のインタラクションを追加することを検討してください。これらの機能は、Hubot ではサポートされていませんでしたが、アプリが Slack にメッセージを送信するときにコンテキストアクションを含めることができるようになります。 -- こちらの [ドキュメント](/bolt-js/ja-jp/concepts) を読んで、Bolt でほかに何ができるか探してみてください。 +- こちらの ドキュメント を読んで、Bolt でほかに何ができるか探してみてください。 - イベントやインタラクティブコンポーネントの使用方法を示す [サンプルアプリ](https://glitch.com/~slack-bolt) をチェックしてみてください。 -開発中に問題が発生した場合は、Slack の開発者サポートチーム[developers@slack.com](mailto:developers@slack.com)までお問合せください。フレームワークで問題が発生した場合は、[Githubで issues を開いてください](https://github.com/slackapi/bolt-js/issues/new)。 +開発中に問題が発生した場合は、Slack の開発者サポートチーム[developers@slack.com](mailto:developers@slack.com)までお問合せください。フレームワークで問題が発生した場合は、[Githubで issues を開いてください](https://github.com/slackapi/bolt-js/issues/new)。 \ No newline at end of file diff --git a/docs/_tutorials/ja_migration_v2.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v2.md similarity index 94% rename from docs/_tutorials/ja_migration_v2.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v2.md index 244bba8bc..ec65f0020 100644 --- a/docs/_tutorials/ja_migration_v2.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v2.md @@ -1,18 +1,14 @@ --- title: 2.x マイグレーションガイド -order: 2 slug: migration-v2 lang: ja-jp -layout: tutorial -permalink: /ja-jp/tutorial/migration-v2 --- + # 2.x マイグレーションガイド -
    このガイドは Bolt 1.x を利用しているアプリを 2.x にアップグレードするための手順について説明します。いくつかの変更が必要とはなりますが、ほとんどのアプリの場合で、おそらく対応に必要な時間は 5 〜 15 分程度です。 *注: もしすぐにアップグレードをしない場合は、[Bolt 1.x に関するサポートスケジュール](#bolt-1x-%E3%81%AE%E3%82%B5%E3%83%9D%E3%83%BC%E3%83%88%E3%82%B9%E3%82%B1%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB)をご確認ください* -
    --- @@ -38,7 +34,6 @@ app.action('some-action-id', async ({action, ack, say}) => { }) ``` - ### エラーハンドリング {#error-handling} Bolt for JavaScript 2.x では、より多くのユースケースで、必要に応じてエラーをキャッチし、グローバルエラーハンドラーにそれを送るかを制御できるよう改善されました。これまでと同様、グローバルエラーハンドラーに全て任せるよりは、可能な限り、リスナー関数の内部でエラーに対処することをおすすめします。 @@ -127,4 +122,4 @@ async function noBotMessages({message, next }) { ### TypeScript の最低必須バージョン {#minimum-typescript-version} -[TypeScript 利用ガイド]({{ site.url | append: site.baseurl }}/ja-jp/tutorial/using-typescript) でも説明していますが、`@slack/bolt@2.x` は TypeScirpt 3.7 以上が必須バージョンです。 +TypeScript 利用ガイド でも説明していますが、`@slack/bolt@2.x` は TypeScript 3.7 以上が必須バージョンです。 \ No newline at end of file diff --git a/docs/_tutorials/ja_migration_v3.md b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v3.md similarity index 94% rename from docs/_tutorials/ja_migration_v3.md rename to docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v3.md index 2a678accc..2cea018cc 100644 --- a/docs/_tutorials/ja_migration_v3.md +++ b/docs/i18n/ja-jp/docusaurus-plugin-content-docs/current/tutorials/migration-v3.md @@ -1,18 +1,13 @@ --- title: 3.x マイグレーションガイド -order: 2 slug: migration-v3 lang: ja-jp -layout: tutorial -permalink: /ja-jp/tutorial/migration-v3 --- # 3.x マイグレーションガイド -
    このガイドは Bolt 2.x を利用しているアプリを 3.x にアップグレードするための手順について説明します。いくつかの変更が必要とはなりますが、ほとんどのアプリの場合で、おそらく対応に必要な時間は 5 〜 15 分程度です。 *注: もしすぐにアップグレードをしない場合は、[Bolt 2.x に関するサポートスケジュール](#slackbolt2x-support-schedule)をご確認ください* -
    --- @@ -100,7 +95,7 @@ const authorizeFn = async ({ teamId, enterpriseId, isEnterpriseInstall}) => { ### デフォルトのレシーバーを HTTPReceiver に変更 {#http-receiver-as-default} -3.x から新しい [`HTTPReceiver`](https://github.com/slackapi/bolt-js/issues/670) というレシーバーを導入し、デフォルトのレシーバー実装を、これまでの `ExpressReceiver` からこのレシーバーに変更します。この変更は、Bolt for JavaScript を Express.js 以外の人気のある Web フレームワーク(Hapi.js や Koa など)とともに動作させることを容易にします。`ExpressReceiver` は引き続き Bolt for JavaScript のリリースに含まれます。また、`HTTPReceiver` は `ExpressReceiver` が提供する全ての機能を提供するわけではありません。例えば、一つのユースケースとしては、`HTTPReceiver` ではカスタムの HTTP ルート(例: ヘルスチェックのための URL を追加する)を追加する機能はサポートされていません。このようなユースケースに対応するためには、引き続き `ExpressReceiver` を利用することを推奨します。その場合はクラスを import して、インスタンス化したものを `App` のコンストラクタに渡してください。詳細は[カスタム HTTP ルートの追加](https://slack.dev/bolt-js/ja-jp/concepts#custom-routes)を参考にしてください。 +3.x から新しい [`HTTPReceiver`](https://github.com/slackapi/bolt-js/issues/670) というレシーバーを導入し、デフォルトのレシーバー実装を、これまでの `ExpressReceiver` からこのレシーバーに変更します。この変更は、Bolt for JavaScript を Express.js 以外の人気のある Web フレームワーク(Hapi.js や Koa など)とともに動作させることを容易にします。`ExpressReceiver` は引き続き Bolt for JavaScript のリリースに含まれます。また、`HTTPReceiver` は `ExpressReceiver` が提供する全ての機能を提供するわけではありません。例えば、一つのユースケースとしては、`HTTPReceiver` ではカスタムの HTTP ルート(例: ヘルスチェックのための URL を追加する)を追加する機能はサポートされていません。このようなユースケースに対応するためには、引き続き `ExpressReceiver` を利用することを推奨します。その場合はクラスを import して、インスタンス化したものを `App` のコンストラクタに渡してください。詳細は[カスタム HTTP ルートの追加](/concepts/custom-routes)を参考にしてください。 ### Bolt 2.x のサポートスケジュール {#slackbolt2x-support-schedule} @@ -112,4 +107,4 @@ const authorizeFn = async ({ teamId, enterpriseId, isEnterpriseInstall}) => { ### TypeScript の最低必須バージョン {#minimum-typescript-version} -[TypeScript 利用ガイド]({{ site.url | append: site.baseurl }}/ja-jp/tutorial/using-typescript) でも説明していますが、`@slack/bolt@3.x` は TypeScirpt 4.1 以上が必須バージョンです。 +TypeScript 利用ガイド でも説明していますが、`@slack/bolt@3.x` は TypeScript 4.1 以上が必須バージョンです。 \ No newline at end of file diff --git a/docs/i18n/ja-jp/docusaurus-theme-classic/footer.json b/docs/i18n/ja-jp/docusaurus-theme-classic/footer.json new file mode 100644 index 000000000..5a2d1bc10 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-theme-classic/footer.json @@ -0,0 +1,6 @@ +{ + "copyright": { + "message": "

    Made with ♡ by Slack and friends

    ", + "description": "The footer copyright" + } +} diff --git a/docs/i18n/ja-jp/docusaurus-theme-classic/navbar.json b/docs/i18n/ja-jp/docusaurus-theme-classic/navbar.json new file mode 100644 index 000000000..d9ffa7ec8 --- /dev/null +++ b/docs/i18n/ja-jp/docusaurus-theme-classic/navbar.json @@ -0,0 +1,58 @@ +{ + "title": { + "message": "Slack Developer Tools", + "description": "The title in the navbar" + }, + "item.label.SDKs": { + "message": "SDKs", + "description": "Navbar item with label SDKs" + }, + "item.label.Java": { + "message": "Java", + "description": "Navbar item with label Java" + }, + "item.label.JavaScript": { + "message": "JavaScript", + "description": "Navbar item with label JavaScript" + }, + "item.label.Python": { + "message": "Python", + "description": "Navbar item with label Python" + }, + "item.label.Community": { + "message": "Community", + "description": "Navbar item with label Community" + }, + "item.label.Bolt": { + "message": "Bolt", + "description": "Navbar item with label Bolt" + }, + "item.label.API Docs": { + "message": "API Docs", + "description": "Navbar item with label API Docs" + }, + "item.label.Java Slack SDK": { + "message": "Java Slack SDK", + "description": "Navbar item with label Java Slack SDK" + }, + "item.label.Node Slack SDK": { + "message": "Node Slack SDK", + "description": "Navbar item with label Node Slack SDK" + }, + "item.label.Python Slack SDK": { + "message": "Python Slack SDK", + "description": "Navbar item with label Python Slack SDK" + }, + "item.label.Deno Slack SDK": { + "message": "Deno Slack SDK", + "description": "Navbar item with label Deno Slack SDK" + }, + "item.label.Community tools": { + "message": "Community tools", + "description": "Navbar item with label Community tools" + }, + "item.label.Slack Community": { + "message": "Slack Community", + "description": "Navbar item with label Slack Community" + } +} diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 7694fecc9..000000000 --- a/docs/index.md +++ /dev/null @@ -1,7 +0,0 @@ ---- -permalink: /concepts -redirect_from: - - / -layout: default -lang: en ---- diff --git a/docs/jp.md b/docs/jp.md deleted file mode 100644 index 387668f76..000000000 --- a/docs/jp.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -permalink: ja-jp/concepts -redirect_from: - - /jp - - /ja-jp -layout: default -lang: ja-jp ---- diff --git a/docs/package-lock.json b/docs/package-lock.json new file mode 100644 index 000000000..343d0077f --- /dev/null +++ b/docs/package-lock.json @@ -0,0 +1,14511 @@ +{ + "name": "website", + "version": "2024.8.01", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "website", + "version": "2024.8.01", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-client-redirects": "^3.4.0", + "@docusaurus/preset-classic": "3.4.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "css-minimizer-webpack-plugin": "^4.1.0", + "docusaurus-theme-github-codeblock": "^2.0.2", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "tablesort": "^5.3.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/types": "3.4.0", + "stylelint": "^16.7.0", + "stylelint-config-standard": "^36.0.1" + }, + "engines": { + "node": ">=20.0" + } + }, + "node_modules/@algolia/autocomplete-core": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-plugin-algolia-insights": "1.9.3", + "@algolia/autocomplete-shared": "1.9.3" + } + }, + "node_modules/@algolia/autocomplete-plugin-algolia-insights": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "search-insights": ">= 1 < 3" + } + }, + "node_modules/@algolia/autocomplete-preset-algolia": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-shared": "1.9.3" + }, + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/autocomplete-shared": { + "version": "1.9.3", + "license": "MIT", + "peerDependencies": { + "@algolia/client-search": ">= 4.9.1 < 6", + "algoliasearch": ">= 4.9.1 < 6" + } + }, + "node_modules/@algolia/cache-browser-local-storage": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/cache-common": { + "version": "4.24.0", + "license": "MIT" + }, + "node_modules/@algolia/cache-in-memory": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0" + } + }, + "node_modules/@algolia/client-account": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-analytics": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-common": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-personalization": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/client-search": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/client-common": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/events": { + "version": "4.0.1", + "license": "MIT" + }, + "node_modules/@algolia/logger-common": { + "version": "4.24.0", + "license": "MIT" + }, + "node_modules/@algolia/logger-console": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/logger-common": "4.24.0" + } + }, + "node_modules/@algolia/recommend": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/@algolia/requester-browser-xhr": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/requester-common": { + "version": "4.24.0", + "license": "MIT" + }, + "node_modules/@algolia/requester-node-http": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@algolia/transporter": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-common": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/requester-common": "4.24.0" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "license": "Apache-2.0", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/compat-data": { + "version": "7.24.9", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/core": { + "version": "7.24.9", + "license": "MIT", + "dependencies": { + "@ampproject/remapping": "^2.2.0", + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.9", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-module-transforms": "^7.24.9", + "@babel/helpers": "^7.24.8", + "@babel/parser": "^7.24.8", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.9", + "convert-source-map": "^2.0.0", + "debug": "^4.1.0", + "gensync": "^1.0.0-beta.2", + "json5": "^2.2.3", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/babel" + } + }, + "node_modules/@babel/core/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/generator": { + "version": "7.24.10", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.9", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", + "jsesc": "^2.5.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-annotate-as-pure": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-builder-binary-assignment-operator-visitor": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "browserslist": "^4.23.1", + "lru-cache": "^5.1.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-compilation-targets/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-class-features-plugin": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.8", + "@babel/helper-optimise-call-expression": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-class-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "regexpu-core": "^5.3.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-create-regexp-features-plugin/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/helper-define-polyfill-provider": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.22.6", + "@babel/helper-plugin-utils": "^7.22.5", + "debug": "^4.1.1", + "lodash.debounce": "^4.0.8", + "resolve": "^1.14.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/helper-environment-visitor": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-function-name": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-hoist-variables": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-member-expression-to-functions": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.8", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-imports": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-module-transforms": { + "version": "7.24.9", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-simple-access": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-optimise-call-expression": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-plugin-utils": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-remap-async-to-generator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-wrap-function": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-replace-supers": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-member-expression-to-functions": "^7.24.7", + "@babel/helper-optimise-call-expression": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/helper-simple-access": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-skip-transparent-expression-wrappers": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-split-export-declaration": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-option": { + "version": "7.24.8", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-wrap-function": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-function-name": "^7.24.7", + "@babel/template": "^7.24.7", + "@babel/traverse": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helpers": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/template": "^7.24.7", + "@babel/types": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight/node_modules/ansi-styles": { + "version": "3.2.1", + "license": "MIT", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/chalk": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/color-convert": { + "version": "1.9.3", + "license": "MIT", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/@babel/highlight/node_modules/color-name": { + "version": "1.1.3", + "license": "MIT" + }, + "node_modules/@babel/highlight/node_modules/escape-string-regexp": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/@babel/highlight/node_modules/has-flag": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/highlight/node_modules/supports-color": { + "version": "5.5.0", + "license": "MIT", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/@babel/parser": { + "version": "7.24.8", + "license": "MIT", + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-firefox-class-in-computed-class-key": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.13.0" + } + }, + "node_modules/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-proposal-private-property-in-object": { + "version": "7.21.0-placeholder-for-preset-env.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-async-generators": { + "version": "7.8.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-properties": { + "version": "7.12.13", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.12.13" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-class-static-block": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-dynamic-import": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-export-namespace-from": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.3" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-assertions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-attributes": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-import-meta": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-json-strings": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-jsx": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-logical-assignment-operators": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-numeric-separator": { + "version": "7.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.10.4" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-object-rest-spread": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-catch-binding": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-optional-chaining": { + "version": "7.8.3", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.8.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-private-property-in-object": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-top-level-await": { + "version": "7.14.5", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-typescript": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-syntax-unicode-sets-regex": { + "version": "7.18.6", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.18.6", + "@babel/helper-plugin-utils": "^7.18.6" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-arrow-functions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-generator-functions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7", + "@babel/plugin-syntax-async-generators": "^7.8.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-async-to-generator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-remap-async-to-generator": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoped-functions": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-block-scoping": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-properties": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-class-static-block": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-class-static-block": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0" + } + }, + "node_modules/@babel/plugin-transform-classes": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-replace-supers": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-computed-properties": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/template": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-destructuring": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dotall-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-duplicate-keys": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-dynamic-import": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-dynamic-import": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-exponentiation-operator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-builder-binary-assignment-operator-visitor": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-export-namespace-from": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-for-of": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-function-name": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-json-strings": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-json-strings": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-logical-assignment-operators": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-member-expression-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-amd": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-commonjs": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-simple-access": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-systemjs": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-identifier": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-modules-umd": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-transforms": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-named-capturing-groups-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/plugin-transform-new-target": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-numeric-separator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-numeric-separator": "^7.10.4" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-rest-spread": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-compilation-targets": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-transform-parameters": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-object-super": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-replace-supers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-catch-binding": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-optional-chaining": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7", + "@babel/plugin-syntax-optional-chaining": "^7.8.3" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-parameters": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-methods": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-private-property-in-object": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-property-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-constant-elements": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-display-name": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-jsx-development": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/plugin-transform-react-jsx": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-react-pure-annotations": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-regenerator": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "regenerator-transform": "^0.15.2" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-reserved-words": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.1", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-runtime/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/plugin-transform-shorthand-properties": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-spread": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-skip-transparent-expression-wrappers": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-sticky-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-template-literals": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typeof-symbol": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.8" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-typescript": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/helper-annotate-as-pure": "^7.24.7", + "@babel/helper-create-class-features-plugin": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/plugin-syntax-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-escapes": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-property-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/plugin-transform-unicode-sets-regex": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-create-regexp-features-plugin": "^7.24.7", + "@babel/helper-plugin-utils": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0" + } + }, + "node_modules/@babel/preset-env": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.24.8", + "@babel/helper-compilation-targets": "^7.24.8", + "@babel/helper-plugin-utils": "^7.24.8", + "@babel/helper-validator-option": "^7.24.8", + "@babel/plugin-bugfix-firefox-class-in-computed-class-key": "^7.24.7", + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression": "^7.24.7", + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining": "^7.24.7", + "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly": "^7.24.7", + "@babel/plugin-proposal-private-property-in-object": "7.21.0-placeholder-for-preset-env.2", + "@babel/plugin-syntax-async-generators": "^7.8.4", + "@babel/plugin-syntax-class-properties": "^7.12.13", + "@babel/plugin-syntax-class-static-block": "^7.14.5", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-syntax-export-namespace-from": "^7.8.3", + "@babel/plugin-syntax-import-assertions": "^7.24.7", + "@babel/plugin-syntax-import-attributes": "^7.24.7", + "@babel/plugin-syntax-import-meta": "^7.10.4", + "@babel/plugin-syntax-json-strings": "^7.8.3", + "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", + "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", + "@babel/plugin-syntax-numeric-separator": "^7.10.4", + "@babel/plugin-syntax-object-rest-spread": "^7.8.3", + "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", + "@babel/plugin-syntax-optional-chaining": "^7.8.3", + "@babel/plugin-syntax-private-property-in-object": "^7.14.5", + "@babel/plugin-syntax-top-level-await": "^7.14.5", + "@babel/plugin-syntax-unicode-sets-regex": "^7.18.6", + "@babel/plugin-transform-arrow-functions": "^7.24.7", + "@babel/plugin-transform-async-generator-functions": "^7.24.7", + "@babel/plugin-transform-async-to-generator": "^7.24.7", + "@babel/plugin-transform-block-scoped-functions": "^7.24.7", + "@babel/plugin-transform-block-scoping": "^7.24.7", + "@babel/plugin-transform-class-properties": "^7.24.7", + "@babel/plugin-transform-class-static-block": "^7.24.7", + "@babel/plugin-transform-classes": "^7.24.8", + "@babel/plugin-transform-computed-properties": "^7.24.7", + "@babel/plugin-transform-destructuring": "^7.24.8", + "@babel/plugin-transform-dotall-regex": "^7.24.7", + "@babel/plugin-transform-duplicate-keys": "^7.24.7", + "@babel/plugin-transform-dynamic-import": "^7.24.7", + "@babel/plugin-transform-exponentiation-operator": "^7.24.7", + "@babel/plugin-transform-export-namespace-from": "^7.24.7", + "@babel/plugin-transform-for-of": "^7.24.7", + "@babel/plugin-transform-function-name": "^7.24.7", + "@babel/plugin-transform-json-strings": "^7.24.7", + "@babel/plugin-transform-literals": "^7.24.7", + "@babel/plugin-transform-logical-assignment-operators": "^7.24.7", + "@babel/plugin-transform-member-expression-literals": "^7.24.7", + "@babel/plugin-transform-modules-amd": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.8", + "@babel/plugin-transform-modules-systemjs": "^7.24.7", + "@babel/plugin-transform-modules-umd": "^7.24.7", + "@babel/plugin-transform-named-capturing-groups-regex": "^7.24.7", + "@babel/plugin-transform-new-target": "^7.24.7", + "@babel/plugin-transform-nullish-coalescing-operator": "^7.24.7", + "@babel/plugin-transform-numeric-separator": "^7.24.7", + "@babel/plugin-transform-object-rest-spread": "^7.24.7", + "@babel/plugin-transform-object-super": "^7.24.7", + "@babel/plugin-transform-optional-catch-binding": "^7.24.7", + "@babel/plugin-transform-optional-chaining": "^7.24.8", + "@babel/plugin-transform-parameters": "^7.24.7", + "@babel/plugin-transform-private-methods": "^7.24.7", + "@babel/plugin-transform-private-property-in-object": "^7.24.7", + "@babel/plugin-transform-property-literals": "^7.24.7", + "@babel/plugin-transform-regenerator": "^7.24.7", + "@babel/plugin-transform-reserved-words": "^7.24.7", + "@babel/plugin-transform-shorthand-properties": "^7.24.7", + "@babel/plugin-transform-spread": "^7.24.7", + "@babel/plugin-transform-sticky-regex": "^7.24.7", + "@babel/plugin-transform-template-literals": "^7.24.7", + "@babel/plugin-transform-typeof-symbol": "^7.24.8", + "@babel/plugin-transform-unicode-escapes": "^7.24.7", + "@babel/plugin-transform-unicode-property-regex": "^7.24.7", + "@babel/plugin-transform-unicode-regex": "^7.24.7", + "@babel/plugin-transform-unicode-sets-regex": "^7.24.7", + "@babel/preset-modules": "0.1.6-no-external-plugins", + "babel-plugin-polyfill-corejs2": "^0.4.10", + "babel-plugin-polyfill-corejs3": "^0.10.4", + "babel-plugin-polyfill-regenerator": "^0.6.1", + "core-js-compat": "^3.37.1", + "semver": "^6.3.1" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-env/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/@babel/preset-modules": { + "version": "0.1.6-no-external-plugins", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.0.0", + "@babel/types": "^7.4.4", + "esutils": "^2.0.2" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/@babel/preset-react": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-transform-react-display-name": "^7.24.7", + "@babel/plugin-transform-react-jsx": "^7.24.7", + "@babel/plugin-transform-react-jsx-development": "^7.24.7", + "@babel/plugin-transform-react-pure-annotations": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/preset-typescript": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/helper-plugin-utils": "^7.24.7", + "@babel/helper-validator-option": "^7.24.7", + "@babel/plugin-syntax-jsx": "^7.24.7", + "@babel/plugin-transform-modules-commonjs": "^7.24.7", + "@babel/plugin-transform-typescript": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@babel/regjsgen": { + "version": "0.8.0", + "license": "MIT" + }, + "node_modules/@babel/runtime": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/runtime-corejs3": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "core-js-pure": "^3.30.2", + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/template": { + "version": "7.24.7", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/parser": "^7.24.7", + "@babel/types": "^7.24.7" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/traverse": { + "version": "7.24.8", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.24.7", + "@babel/generator": "^7.24.8", + "@babel/helper-environment-visitor": "^7.24.7", + "@babel/helper-function-name": "^7.24.7", + "@babel/helper-hoist-variables": "^7.24.7", + "@babel/helper-split-export-declaration": "^7.24.7", + "@babel/parser": "^7.24.8", + "@babel/types": "^7.24.8", + "debug": "^4.3.1", + "globals": "^11.1.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.24.9", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.24.8", + "@babel/helper-validator-identifier": "^7.24.7", + "to-fast-properties": "^2.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@colors/colors": { + "version": "1.5.0", + "license": "MIT", + "optional": true, + "engines": { + "node": ">=0.1.90" + } + }, + "node_modules/@csstools/css-parser-algorithms": { + "version": "2.7.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-tokenizer": "^2.4.1" + } + }, + "node_modules/@csstools/css-tokenizer": { + "version": "2.4.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + } + }, + "node_modules/@csstools/media-query-list-parser": { + "version": "2.1.13", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1" + } + }, + "node_modules/@csstools/selector-specificity": { + "version": "3.1.1", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/csstools" + }, + { + "type": "opencollective", + "url": "https://opencollective.com/csstools" + } + ], + "license": "MIT-0", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss-selector-parser": "^6.0.13" + } + }, + "node_modules/@discoveryjs/json-ext": { + "version": "0.5.7", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/@docsearch/css": { + "version": "3.6.1", + "license": "MIT" + }, + "node_modules/@docsearch/react": { + "version": "3.6.1", + "license": "MIT", + "dependencies": { + "@algolia/autocomplete-core": "1.9.3", + "@algolia/autocomplete-preset-algolia": "1.9.3", + "@docsearch/css": "3.6.1", + "algoliasearch": "^4.19.1" + }, + "peerDependencies": { + "@types/react": ">= 16.8.0 < 19.0.0", + "react": ">= 16.8.0 < 19.0.0", + "react-dom": ">= 16.8.0 < 19.0.0", + "search-insights": ">= 1 < 3" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + }, + "react": { + "optional": true + }, + "react-dom": { + "optional": true + }, + "search-insights": { + "optional": true + } + } + }, + "node_modules/@docusaurus/core": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.23.3", + "@babel/generator": "^7.23.3", + "@babel/plugin-syntax-dynamic-import": "^7.8.3", + "@babel/plugin-transform-runtime": "^7.22.9", + "@babel/preset-env": "^7.22.9", + "@babel/preset-react": "^7.22.5", + "@babel/preset-typescript": "^7.22.5", + "@babel/runtime": "^7.22.6", + "@babel/runtime-corejs3": "^7.22.6", + "@babel/traverse": "^7.22.8", + "@docusaurus/cssnano-preset": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "autoprefixer": "^10.4.14", + "babel-loader": "^9.1.3", + "babel-plugin-dynamic-import-node": "^2.3.3", + "boxen": "^6.2.1", + "chalk": "^4.1.2", + "chokidar": "^3.5.3", + "clean-css": "^5.3.2", + "cli-table3": "^0.6.3", + "combine-promises": "^1.1.0", + "commander": "^5.1.0", + "copy-webpack-plugin": "^11.0.0", + "core-js": "^3.31.1", + "css-loader": "^6.8.1", + "css-minimizer-webpack-plugin": "^5.0.1", + "cssnano": "^6.1.2", + "del": "^6.1.1", + "detect-port": "^1.5.1", + "escape-html": "^1.0.3", + "eta": "^2.2.0", + "eval": "^0.1.8", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "html-minifier-terser": "^7.2.0", + "html-tags": "^3.3.1", + "html-webpack-plugin": "^5.5.3", + "leven": "^3.1.0", + "lodash": "^4.17.21", + "mini-css-extract-plugin": "^2.7.6", + "p-map": "^4.0.0", + "postcss": "^8.4.26", + "postcss-loader": "^7.3.3", + "prompts": "^2.4.2", + "react-dev-utils": "^12.0.1", + "react-helmet-async": "^1.3.0", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0", + "react-loadable-ssr-addon-v5-slorber": "^1.0.1", + "react-router": "^5.3.4", + "react-router-config": "^5.1.1", + "react-router-dom": "^5.3.4", + "rtl-detect": "^1.0.4", + "semver": "^7.5.4", + "serve-handler": "^6.1.5", + "shelljs": "^0.8.5", + "terser-webpack-plugin": "^5.3.9", + "tslib": "^2.6.0", + "update-notifier": "^6.0.2", + "url-loader": "^4.1.1", + "webpack": "^5.88.1", + "webpack-bundle-analyzer": "^4.9.0", + "webpack-dev-server": "^4.15.1", + "webpack-merge": "^5.9.0", + "webpackbar": "^5.0.2" + }, + "bin": { + "docusaurus": "bin/docusaurus.mjs" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/core/node_modules/css-minimizer-webpack-plugin": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.18", + "cssnano": "^6.0.1", + "jest-worker": "^29.4.3", + "postcss": "^8.4.24", + "schema-utils": "^4.0.1", + "serialize-javascript": "^6.0.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/@docusaurus/cssnano-preset": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "cssnano-preset-advanced": "^6.1.2", + "postcss": "^8.4.38", + "postcss-sort-media-queries": "^5.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/logger": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.2", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/mdx-loader": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@mdx-js/mdx": "^3.0.0", + "@slorber/remark-comment": "^1.0.0", + "escape-html": "^1.0.3", + "estree-util-value-to-estree": "^3.0.1", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "image-size": "^1.0.2", + "mdast-util-mdx": "^3.0.0", + "mdast-util-to-string": "^4.0.0", + "rehype-raw": "^7.0.0", + "remark-directive": "^3.0.0", + "remark-emoji": "^4.0.0", + "remark-frontmatter": "^5.0.0", + "remark-gfm": "^4.0.0", + "stringify-object": "^3.3.0", + "tslib": "^2.6.0", + "unified": "^11.0.3", + "unist-util-visit": "^5.0.0", + "url-loader": "^4.1.1", + "vfile": "^6.0.1", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/module-type-aliases": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "3.4.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "@types/react-router-dom": "*", + "react-helmet-async": "*", + "react-loadable": "npm:@docusaurus/react-loadable@6.0.0" + }, + "peerDependencies": { + "react": "*", + "react-dom": "*" + } + }, + "node_modules/@docusaurus/plugin-client-redirects": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-blog": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "cheerio": "^1.0.0-rc.12", + "feed": "^4.2.2", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "reading-time": "^1.5.0", + "srcset": "^4.0.0", + "tslib": "^2.6.0", + "unist-util-visit": "^5.0.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-docs": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@types/react-router-config": "^5.0.7", + "combine-promises": "^1.1.0", + "fs-extra": "^11.1.1", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-content-pages": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "fs-extra": "^11.1.1", + "tslib": "^2.6.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-debug": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "fs-extra": "^11.1.1", + "react-json-view-lite": "^1.2.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-analytics": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-gtag": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@types/gtag.js": "^0.0.12", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-google-tag-manager": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/plugin-sitemap": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "fs-extra": "^11.1.1", + "sitemap": "^7.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/preset-classic": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/plugin-debug": "3.4.0", + "@docusaurus/plugin-google-analytics": "3.4.0", + "@docusaurus/plugin-google-gtag": "3.4.0", + "@docusaurus/plugin-google-tag-manager": "3.4.0", + "@docusaurus/plugin-sitemap": "3.4.0", + "@docusaurus/theme-classic": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-search-algolia": "3.4.0", + "@docusaurus/types": "3.4.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-classic": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-translations": "3.4.0", + "@docusaurus/types": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "copy-text-to-clipboard": "^3.2.0", + "infima": "0.2.0-alpha.43", + "lodash": "^4.17.21", + "nprogress": "^0.2.0", + "postcss": "^8.4.26", + "prism-react-renderer": "^2.3.0", + "prismjs": "^1.29.0", + "react-router-dom": "^5.3.4", + "rtlcss": "^4.1.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-common": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/mdx-loader": "3.4.0", + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/plugin-content-blog": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/plugin-content-pages": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router-config": "*", + "clsx": "^2.0.0", + "parse-numeric-range": "^1.3.0", + "prism-react-renderer": "^2.3.0", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-search-algolia": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docsearch/react": "^3.5.2", + "@docusaurus/core": "3.4.0", + "@docusaurus/logger": "3.4.0", + "@docusaurus/plugin-content-docs": "3.4.0", + "@docusaurus/theme-common": "3.4.0", + "@docusaurus/theme-translations": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-validation": "3.4.0", + "algoliasearch": "^4.18.0", + "algoliasearch-helper": "^3.13.3", + "clsx": "^2.0.0", + "eta": "^2.2.0", + "fs-extra": "^11.1.1", + "lodash": "^4.17.21", + "tslib": "^2.6.0", + "utility-types": "^3.10.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/theme-translations": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "fs-extra": "^11.1.1", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@docusaurus/types": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@mdx-js/mdx": "^3.0.0", + "@types/history": "^4.7.11", + "@types/react": "*", + "commander": "^5.1.0", + "joi": "^17.9.2", + "react-helmet-async": "^1.3.0", + "utility-types": "^3.10.0", + "webpack": "^5.88.1", + "webpack-merge": "^5.9.0" + }, + "peerDependencies": { + "react": "^18.0.0", + "react-dom": "^18.0.0" + } + }, + "node_modules/@docusaurus/utils": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "@svgr/webpack": "^8.1.0", + "escape-string-regexp": "^4.0.0", + "file-loader": "^6.2.0", + "fs-extra": "^11.1.1", + "github-slugger": "^1.5.0", + "globby": "^11.1.0", + "gray-matter": "^4.0.3", + "jiti": "^1.20.0", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "micromatch": "^4.0.5", + "prompts": "^2.4.2", + "resolve-pathname": "^3.0.0", + "shelljs": "^0.8.5", + "tslib": "^2.6.0", + "url-loader": "^4.1.1", + "utility-types": "^3.10.0", + "webpack": "^5.88.1" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-common": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "@docusaurus/types": "*" + }, + "peerDependenciesMeta": { + "@docusaurus/types": { + "optional": true + } + } + }, + "node_modules/@docusaurus/utils-validation": { + "version": "3.4.0", + "license": "MIT", + "dependencies": { + "@docusaurus/logger": "3.4.0", + "@docusaurus/utils": "3.4.0", + "@docusaurus/utils-common": "3.4.0", + "fs-extra": "^11.2.0", + "joi": "^17.9.2", + "js-yaml": "^4.1.0", + "lodash": "^4.17.21", + "tslib": "^2.6.0" + }, + "engines": { + "node": ">=18.0" + } + }, + "node_modules/@dual-bundle/import-meta-resolve": { + "version": "4.1.0", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "license": "BSD-3-Clause" + }, + "node_modules/@hapi/topo": { + "version": "5.1.0", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@jest/schemas": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@sinclair/typebox": "^0.27.8" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jest/types": { + "version": "29.6.3", + "license": "MIT", + "dependencies": { + "@jest/schemas": "^29.6.3", + "@types/istanbul-lib-coverage": "^2.0.0", + "@types/istanbul-reports": "^3.0.0", + "@types/node": "*", + "@types/yargs": "^17.0.8", + "chalk": "^4.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "license": "MIT", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/source-map": { + "version": "0.3.6", + "license": "MIT", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "license": "MIT", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@leichtgewicht/ip-codec": { + "version": "2.0.5", + "license": "MIT" + }, + "node_modules/@mdx-js/mdx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdx": "^2.0.0", + "collapse-white-space": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-build-jsx": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-util-to-js": "^2.0.0", + "estree-walker": "^3.0.0", + "hast-util-to-estree": "^3.0.0", + "hast-util-to-jsx-runtime": "^2.0.0", + "markdown-extensions": "^2.0.0", + "periscopic": "^3.0.0", + "remark-mdx": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-rehype": "^11.0.0", + "source-map": "^0.7.0", + "unified": "^11.0.0", + "unist-util-position-from-estree": "^2.0.0", + "unist-util-stringify-position": "^4.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/@mdx-js/react": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/mdx": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + }, + "peerDependencies": { + "@types/react": ">=16", + "react": ">=16" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pnpm/config.env-replace": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "graceful-fs": "4.2.10" + }, + "engines": { + "node": ">=12.22.0" + } + }, + "node_modules/@pnpm/network.ca-file/node_modules/graceful-fs": { + "version": "4.2.10", + "license": "ISC" + }, + "node_modules/@pnpm/npm-conf": { + "version": "2.2.2", + "license": "MIT", + "dependencies": { + "@pnpm/config.env-replace": "^1.1.0", + "@pnpm/network.ca-file": "^1.0.1", + "config-chain": "^1.1.11" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "license": "MIT" + }, + "node_modules/@sideway/address": { + "version": "4.1.5", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.0.0" + } + }, + "node_modules/@sideway/formula": { + "version": "3.0.1", + "license": "BSD-3-Clause" + }, + "node_modules/@sideway/pinpoint": { + "version": "2.0.0", + "license": "BSD-3-Clause" + }, + "node_modules/@sinclair/typebox": { + "version": "0.27.8", + "license": "MIT" + }, + "node_modules/@sindresorhus/is": { + "version": "4.6.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/@slorber/remark-comment": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^1.0.0", + "micromark-util-character": "^1.1.0", + "micromark-util-symbol": "^1.0.1" + } + }, + "node_modules/@svgr/babel-plugin-add-jsx-attribute": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-attribute": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-remove-jsx-empty-expression": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-replace-jsx-attribute-value": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-dynamic-title": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-svg-em-dimensions": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-react-native-svg": { + "version": "8.1.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-plugin-transform-svg-component": { + "version": "8.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/babel-preset": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@svgr/babel-plugin-add-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-attribute": "8.0.0", + "@svgr/babel-plugin-remove-jsx-empty-expression": "8.0.0", + "@svgr/babel-plugin-replace-jsx-attribute-value": "8.0.0", + "@svgr/babel-plugin-svg-dynamic-title": "8.0.0", + "@svgr/babel-plugin-svg-em-dimensions": "8.0.0", + "@svgr/babel-plugin-transform-react-native-svg": "8.1.0", + "@svgr/babel-plugin-transform-svg-component": "8.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@babel/core": "^7.0.0-0" + } + }, + "node_modules/@svgr/core": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "camelcase": "^6.2.0", + "cosmiconfig": "^8.1.3", + "snake-case": "^3.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/hast-util-to-babel-ast": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.21.3", + "entities": "^4.4.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@svgr/plugin-jsx": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@svgr/babel-preset": "8.1.0", + "@svgr/hast-util-to-babel-ast": "8.0.0", + "svg-parser": "^2.0.4" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/plugin-svgo": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.1.3", + "deepmerge": "^4.3.1", + "svgo": "^3.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + }, + "peerDependencies": { + "@svgr/core": "*" + } + }, + "node_modules/@svgr/webpack": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "@babel/core": "^7.21.3", + "@babel/plugin-transform-react-constant-elements": "^7.21.3", + "@babel/preset-env": "^7.20.2", + "@babel/preset-react": "^7.18.6", + "@babel/preset-typescript": "^7.21.0", + "@svgr/core": "8.1.0", + "@svgr/plugin-jsx": "8.1.0", + "@svgr/plugin-svgo": "8.1.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/gregberge" + } + }, + "node_modules/@szmarczak/http-timer": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "defer-to-connect": "^2.0.1" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/@trysound/sax": { + "version": "0.2.0", + "license": "ISC", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/@types/acorn": { + "version": "4.0.6", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/body-parser": { + "version": "1.19.5", + "license": "MIT", + "dependencies": { + "@types/connect": "*", + "@types/node": "*" + } + }, + "node_modules/@types/bonjour": { + "version": "3.5.13", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect": { + "version": "3.4.38", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/connect-history-api-fallback": { + "version": "1.5.4", + "license": "MIT", + "dependencies": { + "@types/express-serve-static-core": "*", + "@types/node": "*" + } + }, + "node_modules/@types/debug": { + "version": "4.1.12", + "license": "MIT", + "dependencies": { + "@types/ms": "*" + } + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "license": "MIT", + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/eslint-scope": { + "version": "3.7.7", + "license": "MIT", + "dependencies": { + "@types/eslint": "*", + "@types/estree": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/@types/estree-jsx": { + "version": "1.0.5", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/@types/express": { + "version": "4.17.21", + "license": "MIT", + "dependencies": { + "@types/body-parser": "*", + "@types/express-serve-static-core": "^4.17.33", + "@types/qs": "*", + "@types/serve-static": "*" + } + }, + "node_modules/@types/express-serve-static-core": { + "version": "4.19.5", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "@types/qs": "*", + "@types/range-parser": "*", + "@types/send": "*" + } + }, + "node_modules/@types/gtag.js": { + "version": "0.0.12", + "license": "MIT" + }, + "node_modules/@types/hast": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/history": { + "version": "4.7.11", + "license": "MIT" + }, + "node_modules/@types/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT" + }, + "node_modules/@types/http-cache-semantics": { + "version": "4.0.4", + "license": "MIT" + }, + "node_modules/@types/http-errors": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/@types/http-proxy": { + "version": "1.17.14", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/istanbul-lib-coverage": { + "version": "2.0.6", + "license": "MIT" + }, + "node_modules/@types/istanbul-lib-report": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-coverage": "*" + } + }, + "node_modules/@types/istanbul-reports": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "@types/istanbul-lib-report": "*" + } + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "license": "MIT" + }, + "node_modules/@types/mdast": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "@types/unist": "*" + } + }, + "node_modules/@types/mdx": { + "version": "2.0.13", + "license": "MIT" + }, + "node_modules/@types/mime": { + "version": "1.3.5", + "license": "MIT" + }, + "node_modules/@types/ms": { + "version": "0.7.34", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.14.11", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/node-forge": { + "version": "1.3.11", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "license": "MIT" + }, + "node_modules/@types/prismjs": { + "version": "1.26.4", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "license": "MIT" + }, + "node_modules/@types/qs": { + "version": "6.9.15", + "license": "MIT" + }, + "node_modules/@types/range-parser": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-router": { + "version": "5.1.20", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*" + } + }, + "node_modules/@types/react-router-config": { + "version": "5.0.11", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "^5.1.0" + } + }, + "node_modules/@types/react-router-dom": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "@types/history": "^4.7.11", + "@types/react": "*", + "@types/react-router": "*" + } + }, + "node_modules/@types/retry": { + "version": "0.12.0", + "license": "MIT" + }, + "node_modules/@types/sax": { + "version": "1.2.7", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/send": { + "version": "0.17.4", + "license": "MIT", + "dependencies": { + "@types/mime": "^1", + "@types/node": "*" + } + }, + "node_modules/@types/serve-index": { + "version": "1.9.4", + "license": "MIT", + "dependencies": { + "@types/express": "*" + } + }, + "node_modules/@types/serve-static": { + "version": "1.15.7", + "license": "MIT", + "dependencies": { + "@types/http-errors": "*", + "@types/node": "*", + "@types/send": "*" + } + }, + "node_modules/@types/sockjs": { + "version": "0.3.36", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/unist": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/@types/ws": { + "version": "8.5.11", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/@types/yargs": { + "version": "17.0.32", + "license": "MIT", + "dependencies": { + "@types/yargs-parser": "*" + } + }, + "node_modules/@types/yargs-parser": { + "version": "21.0.3", + "license": "MIT" + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/@webassemblyjs/ast": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/helper-numbers": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6" + } + }, + "node_modules/@webassemblyjs/floating-point-hex-parser": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-api-error": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-buffer": { + "version": "1.12.1", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-numbers": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@webassemblyjs/floating-point-hex-parser": "1.11.6", + "@webassemblyjs/helper-api-error": "1.11.6", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/helper-wasm-bytecode": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/helper-wasm-section": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/wasm-gen": "1.12.1" + } + }, + "node_modules/@webassemblyjs/ieee754": { + "version": "1.11.6", + "license": "MIT", + "dependencies": { + "@xtuc/ieee754": "^1.2.0" + } + }, + "node_modules/@webassemblyjs/leb128": { + "version": "1.11.6", + "license": "Apache-2.0", + "dependencies": { + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@webassemblyjs/utf8": { + "version": "1.11.6", + "license": "MIT" + }, + "node_modules/@webassemblyjs/wasm-edit": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/helper-wasm-section": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-opt": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1", + "@webassemblyjs/wast-printer": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-gen": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wasm-opt": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-buffer": "1.12.1", + "@webassemblyjs/wasm-gen": "1.12.1", + "@webassemblyjs/wasm-parser": "1.12.1" + } + }, + "node_modules/@webassemblyjs/wasm-parser": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@webassemblyjs/helper-api-error": "1.11.6", + "@webassemblyjs/helper-wasm-bytecode": "1.11.6", + "@webassemblyjs/ieee754": "1.11.6", + "@webassemblyjs/leb128": "1.11.6", + "@webassemblyjs/utf8": "1.11.6" + } + }, + "node_modules/@webassemblyjs/wast-printer": { + "version": "1.12.1", + "license": "MIT", + "dependencies": { + "@webassemblyjs/ast": "1.12.1", + "@xtuc/long": "4.2.2" + } + }, + "node_modules/@xtuc/ieee754": { + "version": "1.2.0", + "license": "BSD-3-Clause" + }, + "node_modules/@xtuc/long": { + "version": "4.2.2", + "license": "Apache-2.0" + }, + "node_modules/accepts": { + "version": "1.3.8", + "license": "MIT", + "dependencies": { + "mime-types": "~2.1.34", + "negotiator": "0.6.3" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/accepts/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/acorn": { + "version": "8.12.1", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-import-attributes": { + "version": "1.9.5", + "license": "MIT", + "peerDependencies": { + "acorn": "^8" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "license": "MIT", + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/acorn-walk": { + "version": "8.3.3", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.0" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/address": { + "version": "1.2.2", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/aggregate-error": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "clean-stack": "^2.0.0", + "indent-string": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ajv": { + "version": "8.17.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "fast-uri": "^3.0.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ajv-formats": { + "version": "2.1.1", + "license": "MIT", + "dependencies": { + "ajv": "^8.0.0" + }, + "peerDependencies": { + "ajv": "^8.0.0" + }, + "peerDependenciesMeta": { + "ajv": { + "optional": true + } + } + }, + "node_modules/ajv-keywords": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3" + }, + "peerDependencies": { + "ajv": "^8.8.2" + } + }, + "node_modules/algoliasearch": { + "version": "4.24.0", + "license": "MIT", + "dependencies": { + "@algolia/cache-browser-local-storage": "4.24.0", + "@algolia/cache-common": "4.24.0", + "@algolia/cache-in-memory": "4.24.0", + "@algolia/client-account": "4.24.0", + "@algolia/client-analytics": "4.24.0", + "@algolia/client-common": "4.24.0", + "@algolia/client-personalization": "4.24.0", + "@algolia/client-search": "4.24.0", + "@algolia/logger-common": "4.24.0", + "@algolia/logger-console": "4.24.0", + "@algolia/recommend": "4.24.0", + "@algolia/requester-browser-xhr": "4.24.0", + "@algolia/requester-common": "4.24.0", + "@algolia/requester-node-http": "4.24.0", + "@algolia/transporter": "4.24.0" + } + }, + "node_modules/algoliasearch-helper": { + "version": "3.22.3", + "license": "MIT", + "dependencies": { + "@algolia/events": "^4.0.1" + }, + "peerDependencies": { + "algoliasearch": ">= 3.1 < 6" + } + }, + "node_modules/ansi-align": { + "version": "3.0.1", + "license": "ISC", + "dependencies": { + "string-width": "^4.1.0" + } + }, + "node_modules/ansi-align/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/ansi-align/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-html-community": { + "version": "0.0.8", + "engines": [ + "node >= 0.8.0" + ], + "license": "Apache-2.0", + "bin": { + "ansi-html": "bin/ansi-html" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "license": "MIT", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "license": "MIT" + }, + "node_modules/argparse": { + "version": "2.0.1", + "license": "Python-2.0" + }, + "node_modules/array-flatten": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/array-union": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astral-regex": { + "version": "2.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/astring": { + "version": "1.8.6", + "license": "MIT", + "bin": { + "astring": "bin/astring" + } + }, + "node_modules/at-least-node": { + "version": "1.0.0", + "license": "ISC", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/babel-loader": { + "version": "9.1.3", + "license": "MIT", + "dependencies": { + "find-cache-dir": "^4.0.0", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "peerDependencies": { + "@babel/core": "^7.12.0", + "webpack": ">=5" + } + }, + "node_modules/babel-plugin-dynamic-import-node": { + "version": "2.3.3", + "license": "MIT", + "dependencies": { + "object.assign": "^4.1.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2": { + "version": "0.4.11", + "license": "MIT", + "dependencies": { + "@babel/compat-data": "^7.22.6", + "@babel/helper-define-polyfill-provider": "^0.6.2", + "semver": "^6.3.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-corejs2/node_modules/semver": { + "version": "6.3.1", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/babel-plugin-polyfill-corejs3": { + "version": "0.10.4", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.1", + "core-js-compat": "^3.36.1" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/babel-plugin-polyfill-regenerator": { + "version": "0.6.2", + "license": "MIT", + "dependencies": { + "@babel/helper-define-polyfill-provider": "^0.6.2" + }, + "peerDependencies": { + "@babel/core": "^7.4.0 || ^8.0.0-0 <8.0.0" + } + }, + "node_modules/bail": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/batch": { + "version": "0.6.1", + "license": "MIT" + }, + "node_modules/big.js": { + "version": "5.2.2", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/body-parser": { + "version": "1.20.2", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/bonjour-service": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.3", + "multicast-dns": "^7.2.5" + } + }, + "node_modules/boolbase": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/boxen": { + "version": "6.2.1", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^6.2.0", + "chalk": "^4.1.2", + "cli-boxes": "^3.0.0", + "string-width": "^5.0.1", + "type-fest": "^2.5.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.0.1" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.2", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "caniuse-lite": "^1.0.30001640", + "electron-to-chromium": "^1.4.820", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.1.0" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-from": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/bytes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/cacheable-lookup": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + } + }, + "node_modules/cacheable-request": { + "version": "10.2.14", + "license": "MIT", + "dependencies": { + "@types/http-cache-semantics": "^4.0.2", + "get-stream": "^6.0.1", + "http-cache-semantics": "^4.1.1", + "keyv": "^4.5.3", + "mimic-response": "^4.0.0", + "normalize-url": "^8.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + } + }, + "node_modules/call-bind": { + "version": "1.0.7", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "6.3.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/caniuse-api": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.0.0", + "caniuse-lite": "^1.0.0", + "lodash.memoize": "^4.1.2", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001642", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "CC-BY-4.0" + }, + "node_modules/ccount": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/char-regex": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/character-entities": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-html4": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-entities-legacy": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/character-reference-invalid": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/cheerio": { + "version": "1.0.0-rc.12", + "license": "MIT", + "dependencies": { + "cheerio-select": "^2.1.0", + "dom-serializer": "^2.0.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "htmlparser2": "^8.0.1", + "parse5": "^7.0.0", + "parse5-htmlparser2-tree-adapter": "^7.0.0" + }, + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/cheeriojs/cheerio?sponsor=1" + } + }, + "node_modules/cheerio-select": { + "version": "2.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-select": "^5.1.0", + "css-what": "^6.1.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chrome-trace-event": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "node": ">=6.0" + } + }, + "node_modules/ci-info": { + "version": "3.9.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/sibiraj-s" + } + ], + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/clean-css": { + "version": "5.3.3", + "license": "MIT", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 10.0" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-stack": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/cli-boxes": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-table3": { + "version": "0.6.5", + "license": "MIT", + "dependencies": { + "string-width": "^4.2.0" + }, + "engines": { + "node": "10.* || >= 12.*" + }, + "optionalDependencies": { + "@colors/colors": "1.5.0" + } + }, + "node_modules/cli-table3/node_modules/emoji-regex": { + "version": "8.0.0", + "license": "MIT" + }, + "node_modules/cli-table3/node_modules/string-width": { + "version": "4.2.3", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/clone-deep": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "is-plain-object": "^2.0.4", + "kind-of": "^6.0.2", + "shallow-clone": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/collapse-white-space": { + "version": "2.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "license": "MIT" + }, + "node_modules/colord": { + "version": "2.9.3", + "license": "MIT" + }, + "node_modules/colorette": { + "version": "2.0.20", + "license": "MIT" + }, + "node_modules/combine-promises": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/comma-separated-tokens": { + "version": "2.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/commander": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">= 6" + } + }, + "node_modules/common-path-prefix": { + "version": "3.0.0", + "license": "ISC" + }, + "node_modules/compressible": { + "version": "2.0.18", + "license": "MIT", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compressible/node_modules/mime-db": { + "version": "1.53.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/compression/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/config-chain": { + "version": "1.1.13", + "license": "MIT", + "dependencies": { + "ini": "^1.3.4", + "proto-list": "~1.2.1" + } + }, + "node_modules/configstore": { + "version": "6.0.0", + "license": "BSD-2-Clause", + "dependencies": { + "dot-prop": "^6.0.1", + "graceful-fs": "^4.2.6", + "unique-string": "^3.0.0", + "write-file-atomic": "^3.0.3", + "xdg-basedir": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/yeoman/configstore?sponsor=1" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/consola": { + "version": "2.15.3", + "license": "MIT" + }, + "node_modules/content-disposition": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/content-type": { + "version": "1.0.5", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/convert-source-map": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/cookie": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "license": "MIT" + }, + "node_modules/copy-text-to-clipboard": { + "version": "3.2.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "fast-glob": "^3.2.11", + "glob-parent": "^6.0.1", + "globby": "^13.1.1", + "normalize-path": "^3.0.0", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/glob-parent": { + "version": "6.0.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/copy-webpack-plugin/node_modules/globby": { + "version": "13.2.2", + "license": "MIT", + "dependencies": { + "dir-glob": "^3.0.1", + "fast-glob": "^3.3.0", + "ignore": "^5.2.4", + "merge2": "^1.4.1", + "slash": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/copy-webpack-plugin/node_modules/slash": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/core-js": { + "version": "3.37.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-compat": { + "version": "3.37.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-js-pure": { + "version": "3.37.1", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/core-util-is": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "8.3.6", + "license": "MIT", + "dependencies": { + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0", + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crypto-random-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "type-fest": "^1.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/crypto-random-string/node_modules/type-fest": { + "version": "1.4.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-declaration-sorter": { + "version": "7.2.0", + "license": "ISC", + "engines": { + "node": "^14 || ^16 || >=18" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-functions-list": { + "version": "3.2.2", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12 || >=16" + } + }, + "node_modules/css-loader": { + "version": "6.11.0", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.1.0", + "postcss": "^8.4.33", + "postcss-modules-extract-imports": "^3.1.0", + "postcss-modules-local-by-default": "^4.0.5", + "postcss-modules-scope": "^3.2.0", + "postcss-modules-values": "^4.0.0", + "postcss-value-parser": "^4.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "cssnano": "^5.1.8", + "jest-worker": "^29.1.2", + "postcss": "^8.4.17", + "schema-utils": "^4.0.0", + "serialize-javascript": "^6.0.0", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + }, + "peerDependenciesMeta": { + "@parcel/css": { + "optional": true + }, + "@swc/css": { + "optional": true + }, + "clean-css": { + "optional": true + }, + "csso": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "lightningcss": { + "optional": true + } + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/css-declaration-sorter": { + "version": "6.4.1", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.0.9" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/css-tree": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.14", + "source-map": "^0.6.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/cssnano": { + "version": "5.1.15", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^5.2.14", + "lilconfig": "^2.0.3", + "yaml": "^1.10.2" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/cssnano-preset-default": { + "version": "5.2.14", + "license": "MIT", + "dependencies": { + "css-declaration-sorter": "^6.3.1", + "cssnano-utils": "^3.1.0", + "postcss-calc": "^8.2.3", + "postcss-colormin": "^5.3.1", + "postcss-convert-values": "^5.1.3", + "postcss-discard-comments": "^5.1.2", + "postcss-discard-duplicates": "^5.1.0", + "postcss-discard-empty": "^5.1.1", + "postcss-discard-overridden": "^5.1.0", + "postcss-merge-longhand": "^5.1.7", + "postcss-merge-rules": "^5.1.4", + "postcss-minify-font-values": "^5.1.0", + "postcss-minify-gradients": "^5.1.1", + "postcss-minify-params": "^5.1.4", + "postcss-minify-selectors": "^5.2.1", + "postcss-normalize-charset": "^5.1.0", + "postcss-normalize-display-values": "^5.1.0", + "postcss-normalize-positions": "^5.1.1", + "postcss-normalize-repeat-style": "^5.1.1", + "postcss-normalize-string": "^5.1.0", + "postcss-normalize-timing-functions": "^5.1.0", + "postcss-normalize-unicode": "^5.1.1", + "postcss-normalize-url": "^5.1.0", + "postcss-normalize-whitespace": "^5.1.1", + "postcss-ordered-values": "^5.1.3", + "postcss-reduce-initial": "^5.1.2", + "postcss-reduce-transforms": "^5.1.0", + "postcss-svgo": "^5.1.0", + "postcss-unique-selectors": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/cssnano-utils": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/csso": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "css-tree": "^1.1.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/lilconfig": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/mdn-data": { + "version": "2.0.14", + "license": "CC0-1.0" + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/normalize-url": { + "version": "6.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-calc": { + "version": "8.2.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.9", + "postcss-value-parser": "^4.2.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-colormin": { + "version": "5.3.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "colord": "^2.9.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-convert-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-discard-comments": { + "version": "5.1.2", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-discard-duplicates": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-discard-empty": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-discard-overridden": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-merge-longhand": { + "version": "5.1.7", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^5.1.1" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-merge-rules": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^3.1.0", + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-minify-font-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-minify-gradients": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "colord": "^2.9.1", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-minify-params": { + "version": "5.1.4", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-minify-selectors": { + "version": "5.2.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-charset": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-display-values": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-positions": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-repeat-style": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-string": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-timing-functions": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-unicode": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-url": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "normalize-url": "^6.0.1", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-normalize-whitespace": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-ordered-values": { + "version": "5.1.3", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^3.1.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-reduce-initial": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-reduce-transforms": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-svgo": { + "version": "5.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^2.7.0" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/postcss-unique-selectors": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.5" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/stylehacks": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.21.4", + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >=14.0" + }, + "peerDependencies": { + "postcss": "^8.2.15" + } + }, + "node_modules/css-minimizer-webpack-plugin/node_modules/svgo": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^4.1.3", + "css-tree": "^1.1.3", + "csso": "^4.2.0", + "picocolors": "^1.0.0", + "stable": "^0.1.8" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/css-select": { + "version": "5.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.1.0", + "domhandler": "^5.0.2", + "domutils": "^3.0.1", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/css-what": { + "version": "6.1.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">= 6" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "license": "MIT", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/cssnano": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "cssnano-preset-default": "^6.1.2", + "lilconfig": "^3.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/cssnano" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-advanced": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "autoprefixer": "^10.4.19", + "browserslist": "^4.23.0", + "cssnano-preset-default": "^6.1.2", + "postcss-discard-unused": "^6.0.5", + "postcss-merge-idents": "^6.0.3", + "postcss-reduce-idents": "^6.0.3", + "postcss-zindex": "^6.0.2" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-preset-default": { + "version": "6.1.2", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "css-declaration-sorter": "^7.2.0", + "cssnano-utils": "^4.0.2", + "postcss-calc": "^9.0.1", + "postcss-colormin": "^6.1.0", + "postcss-convert-values": "^6.1.0", + "postcss-discard-comments": "^6.0.2", + "postcss-discard-duplicates": "^6.0.3", + "postcss-discard-empty": "^6.0.3", + "postcss-discard-overridden": "^6.0.2", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", + "postcss-minify-gradients": "^6.0.3", + "postcss-minify-params": "^6.1.0", + "postcss-minify-selectors": "^6.0.4", + "postcss-normalize-charset": "^6.0.2", + "postcss-normalize-display-values": "^6.0.2", + "postcss-normalize-positions": "^6.0.2", + "postcss-normalize-repeat-style": "^6.0.2", + "postcss-normalize-string": "^6.0.2", + "postcss-normalize-timing-functions": "^6.0.2", + "postcss-normalize-unicode": "^6.1.0", + "postcss-normalize-url": "^6.0.2", + "postcss-normalize-whitespace": "^6.0.2", + "postcss-ordered-values": "^6.0.2", + "postcss-reduce-initial": "^6.1.0", + "postcss-reduce-transforms": "^6.0.2", + "postcss-svgo": "^6.0.3", + "postcss-unique-selectors": "^6.0.4" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/cssnano-utils": { + "version": "4.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/csso": { + "version": "5.0.5", + "license": "MIT", + "dependencies": { + "css-tree": "~2.2.0" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/css-tree": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "mdn-data": "2.0.28", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0", + "npm": ">=7.0.0" + } + }, + "node_modules/csso/node_modules/mdn-data": { + "version": "2.0.28", + "license": "CC0-1.0" + }, + "node_modules/csstype": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/debounce": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.3.5", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decode-named-character-reference": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "character-entities": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/decompress-response": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "mimic-response": "^3.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/decompress-response/node_modules/mimic-response": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/deep-extend": { + "version": "0.6.0", + "license": "MIT", + "engines": { + "node": ">=4.0.0" + } + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/default-gateway": { + "version": "6.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "execa": "^5.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/defer-to-connect": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/define-data-property": { + "version": "1.1.4", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0", + "es-errors": "^1.3.0", + "gopd": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/define-properties": { + "version": "1.2.1", + "license": "MIT", + "dependencies": { + "define-data-property": "^1.0.1", + "has-property-descriptors": "^1.0.0", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/del": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "globby": "^11.0.1", + "graceful-fs": "^4.2.4", + "is-glob": "^4.0.1", + "is-path-cwd": "^2.2.0", + "is-path-inside": "^3.0.2", + "p-map": "^4.0.0", + "rimraf": "^3.0.2", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/destroy": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/detect-node": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/detect-port": { + "version": "1.6.1", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "4" + }, + "bin": { + "detect": "bin/detect-port.js", + "detect-port": "bin/detect-port.js" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/detect-port-alt": { + "version": "1.1.6", + "license": "MIT", + "dependencies": { + "address": "^1.0.1", + "debug": "^2.6.0" + }, + "bin": { + "detect": "bin/detect-port", + "detect-port": "bin/detect-port" + }, + "engines": { + "node": ">= 4.2.1" + } + }, + "node_modules/detect-port-alt/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/detect-port-alt/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/devlop": { + "version": "1.1.0", + "license": "MIT", + "dependencies": { + "dequal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dns-packet": { + "version": "5.6.1", + "license": "MIT", + "dependencies": { + "@leichtgewicht/ip-codec": "^2.0.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/docusaurus-theme-github-codeblock": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "@docusaurus/types": "^3.0.0" + } + }, + "node_modules/dom-converter": { + "version": "0.2.0", + "license": "MIT", + "dependencies": { + "utila": "~0.4" + } + }, + "node_modules/dom-serializer": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.2", + "entities": "^4.2.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/domelementtype": { + "version": "2.3.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "BSD-2-Clause" + }, + "node_modules/domhandler": { + "version": "5.0.3", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.3.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/domutils": { + "version": "3.1.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^2.0.0", + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/dot-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/dot-prop": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/dot-prop/node_modules/is-obj": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/duplexer": { + "version": "0.1.2", + "license": "MIT" + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/ee-first": { + "version": "1.1.1", + "license": "MIT" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.829", + "license": "ISC" + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "license": "MIT" + }, + "node_modules/emojilib": { + "version": "2.4.0", + "license": "MIT" + }, + "node_modules/emojis-list": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/emoticon": { + "version": "4.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/enhanced-resolve": { + "version": "5.17.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.4", + "tapable": "^2.2.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/entities": { + "version": "4.5.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.2.4" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-module-lexer": { + "version": "1.5.4", + "license": "MIT" + }, + "node_modules/escalade": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-goat": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint-scope": { + "version": "5.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^4.1.1" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esrecurse/node_modules/estraverse": { + "version": "5.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-util-attach-comments": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-build-jsx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "estree-walker": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-is-identifier-name": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-to-js": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "astring": "^1.8.0", + "source-map": "^0.7.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-util-value-to-estree": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/estree-util-visit": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/eta": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6.0.0" + }, + "funding": { + "url": "https://github.com/eta-dev/eta?sponsor=1" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eval": { + "version": "0.1.8", + "dependencies": { + "@types/node": "*", + "require-like": ">= 0.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "license": "MIT" + }, + "node_modules/events": { + "version": "3.3.0", + "license": "MIT", + "engines": { + "node": ">=0.8.x" + } + }, + "node_modules/execa": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^6.0.0", + "human-signals": "^2.1.0", + "is-stream": "^2.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^4.0.1", + "onetime": "^5.1.2", + "signal-exit": "^3.0.3", + "strip-final-newline": "^2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/express": { + "version": "4.19.2", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/content-disposition": { + "version": "0.5.4", + "license": "MIT", + "dependencies": { + "safe-buffer": "5.2.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "license": "MIT" + }, + "node_modules/express/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/extend": { + "version": "3.0.2", + "license": "MIT" + }, + "node_modules/extend-shallow": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-extendable": "^0.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "license": "MIT" + }, + "node_modules/fast-uri": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/fast-url-parser": { + "version": "1.1.3", + "license": "MIT", + "dependencies": { + "punycode": "^1.3.2" + } + }, + "node_modules/fastest-levenshtein": { + "version": "1.0.16", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 4.9.1" + } + }, + "node_modules/fastq": { + "version": "1.17.1", + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fault": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "format": "^0.2.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/faye-websocket": { + "version": "0.11.4", + "license": "Apache-2.0", + "dependencies": { + "websocket-driver": ">=0.5.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/feed": { + "version": "4.2.2", + "license": "MIT", + "dependencies": { + "xml-js": "^1.6.11" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/file-entry-cache": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flat-cache": "^5.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/file-loader": { + "version": "6.2.0", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/file-loader/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/file-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/file-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/file-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/filesize": { + "version": "8.0.7", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.2.0", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/find-cache-dir": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "common-path-prefix": "^3.0.0", + "pkg-dir": "^7.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/find-up": { + "version": "6.3.0", + "license": "MIT", + "dependencies": { + "locate-path": "^7.1.0", + "path-exists": "^5.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat": { + "version": "5.0.2", + "license": "BSD-3-Clause", + "bin": { + "flat": "cli.js" + } + }, + "node_modules/flat-cache": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "flatted": "^3.3.1", + "keyv": "^4.5.4" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "dev": true, + "license": "ISC" + }, + "node_modules/follow-redirects": { + "version": "1.15.6", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin": { + "version": "6.5.3", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.8.3", + "@types/json-schema": "^7.0.5", + "chalk": "^4.1.0", + "chokidar": "^3.4.2", + "cosmiconfig": "^6.0.0", + "deepmerge": "^4.2.2", + "fs-extra": "^9.0.0", + "glob": "^7.1.6", + "memfs": "^3.1.2", + "minimatch": "^3.0.4", + "schema-utils": "2.7.0", + "semver": "^7.3.2", + "tapable": "^1.0.0" + }, + "engines": { + "node": ">=10", + "yarn": ">=1.0.0" + }, + "peerDependencies": { + "eslint": ">= 6", + "typescript": ">= 2.7", + "vue-template-compiler": "*", + "webpack": ">= 4" + }, + "peerDependenciesMeta": { + "eslint": { + "optional": true + }, + "vue-template-compiler": { + "optional": true + } + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/cosmiconfig": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.1.0", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.7.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/fs-extra": { + "version": "9.1.0", + "license": "MIT", + "dependencies": { + "at-least-node": "^1.0.0", + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/schema-utils": { + "version": "2.7.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.4", + "ajv": "^6.12.2", + "ajv-keywords": "^3.4.1" + }, + "engines": { + "node": ">= 8.9.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/fork-ts-checker-webpack-plugin/node_modules/tapable": { + "version": "1.1.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/form-data-encoder": { + "version": "2.1.4", + "license": "MIT", + "engines": { + "node": ">= 14.17" + } + }, + "node_modules/format": { + "version": "0.2.2", + "engines": { + "node": ">=0.4.x" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "license": "MIT", + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fs-monkey": { + "version": "1.0.6", + "license": "Unlicense" + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "license": "ISC" + }, + "node_modules/fsevents": { + "version": "2.3.3", + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/gensync": { + "version": "1.0.0-beta.2", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/get-intrinsic": { + "version": "1.2.4", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-own-enumerable-property-symbols": { + "version": "3.0.2", + "license": "ISC" + }, + "node_modules/get-stream": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/github-slugger": { + "version": "1.5.0", + "license": "ISC" + }, + "node_modules/glob": { + "version": "7.2.3", + "license": "ISC", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/glob-to-regexp": { + "version": "0.4.1", + "license": "BSD-2-Clause" + }, + "node_modules/global-dirs": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ini": "2.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-dirs/node_modules/ini": { + "version": "2.0.0", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/global-modules": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "global-prefix": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "ini": "^1.3.5", + "kind-of": "^6.0.2", + "which": "^1.3.1" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/global-prefix/node_modules/which": { + "version": "1.3.1", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "which": "bin/which" + } + }, + "node_modules/globals": { + "version": "11.12.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/globby": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globjoin": { + "version": "0.1.4", + "dev": true, + "license": "MIT" + }, + "node_modules/gopd": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "get-intrinsic": "^1.1.3" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/got": { + "version": "12.6.1", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^5.2.0", + "@szmarczak/http-timer": "^5.0.1", + "cacheable-lookup": "^7.0.0", + "cacheable-request": "^10.2.8", + "decompress-response": "^6.0.0", + "form-data-encoder": "^2.1.2", + "get-stream": "^6.0.1", + "http2-wrapper": "^2.1.10", + "lowercase-keys": "^3.0.0", + "p-cancelable": "^3.0.0", + "responselike": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/got?sponsor=1" + } + }, + "node_modules/got/node_modules/@sindresorhus/is": { + "version": "5.6.0", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sindresorhus/is?sponsor=1" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "license": "ISC" + }, + "node_modules/gray-matter": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "js-yaml": "^3.13.1", + "kind-of": "^6.0.2", + "section-matter": "^1.0.0", + "strip-bom-string": "^1.0.0" + }, + "engines": { + "node": ">=6.0" + } + }, + "node_modules/gray-matter/node_modules/argparse": { + "version": "1.0.10", + "license": "MIT", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/gray-matter/node_modules/js-yaml": { + "version": "3.14.1", + "license": "MIT", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/gzip-size": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "duplexer": "^0.1.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/handle-thing": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-property-descriptors": { + "version": "1.0.2", + "license": "MIT", + "dependencies": { + "es-define-property": "^1.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-proto": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.0.3", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-yarn": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hast-util-from-parse5": { + "version": "8.0.1", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "hastscript": "^8.0.0", + "property-information": "^6.0.0", + "vfile": "^6.0.0", + "vfile-location": "^5.0.0", + "web-namespaces": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-parse-selector": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-raw": { + "version": "9.0.4", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "@ungap/structured-clone": "^1.0.0", + "hast-util-from-parse5": "^8.0.0", + "hast-util-to-parse5": "^8.0.0", + "html-void-elements": "^3.0.0", + "mdast-util-to-hast": "^13.0.0", + "parse5": "^7.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-estree": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-attach-comments": "^3.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^0.4.0", + "unist-util-position": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/unist": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "hast-util-whitespace": "^3.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "style-to-object": "^1.0.0", + "unist-util-position": "^5.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/inline-style-parser": { + "version": "0.2.3", + "license": "MIT" + }, + "node_modules/hast-util-to-jsx-runtime/node_modules/style-to-object": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.2.3" + } + }, + "node_modules/hast-util-to-parse5": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "devlop": "^1.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0", + "web-namespaces": "^2.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hast-util-whitespace": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/hastscript": { + "version": "8.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "comma-separated-tokens": "^2.0.0", + "hast-util-parse-selector": "^4.0.0", + "property-information": "^6.0.0", + "space-separated-tokens": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/he": { + "version": "1.2.0", + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/history": { + "version": "4.10.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2", + "loose-envify": "^1.2.0", + "resolve-pathname": "^3.0.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0", + "value-equal": "^1.0.1" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/hpack.js": { + "version": "2.1.6", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.1", + "obuf": "^1.0.0", + "readable-stream": "^2.0.1", + "wbuf": "^1.1.0" + } + }, + "node_modules/hpack.js/node_modules/isarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/readable-stream": { + "version": "2.3.8", + "license": "MIT", + "dependencies": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "node_modules/hpack.js/node_modules/safe-buffer": { + "version": "5.1.2", + "license": "MIT" + }, + "node_modules/hpack.js/node_modules/string_decoder": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.1.0" + } + }, + "node_modules/html-entities": { + "version": "2.5.2", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/mdevils" + }, + { + "type": "patreon", + "url": "https://patreon.com/mdevils" + } + ], + "license": "MIT" + }, + "node_modules/html-escaper": { + "version": "2.0.2", + "license": "MIT" + }, + "node_modules/html-minifier-terser": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "~5.3.2", + "commander": "^10.0.0", + "entities": "^4.4.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.15.1" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": "^14.13.1 || >=16.0.0" + } + }, + "node_modules/html-minifier-terser/node_modules/commander": { + "version": "10.0.1", + "license": "MIT", + "engines": { + "node": ">=14" + } + }, + "node_modules/html-tags": { + "version": "3.3.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/html-void-elements": { + "version": "3.0.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/html-webpack-plugin": { + "version": "5.6.0", + "license": "MIT", + "dependencies": { + "@types/html-minifier-terser": "^6.0.0", + "html-minifier-terser": "^6.0.2", + "lodash": "^4.17.21", + "pretty-error": "^4.0.0", + "tapable": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/html-webpack-plugin" + }, + "peerDependencies": { + "@rspack/core": "0.x || 1.x", + "webpack": "^5.20.0" + }, + "peerDependenciesMeta": { + "@rspack/core": { + "optional": true + }, + "webpack": { + "optional": true + } + } + }, + "node_modules/html-webpack-plugin/node_modules/commander": { + "version": "8.3.0", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, + "node_modules/html-webpack-plugin/node_modules/html-minifier-terser": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "camel-case": "^4.1.2", + "clean-css": "^5.2.2", + "commander": "^8.3.0", + "he": "^1.2.0", + "param-case": "^3.0.4", + "relateurl": "^0.2.7", + "terser": "^5.10.0" + }, + "bin": { + "html-minifier-terser": "cli.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "8.0.2", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.3.0", + "domhandler": "^5.0.3", + "domutils": "^3.0.1", + "entities": "^4.4.0" + } + }, + "node_modules/http-cache-semantics": { + "version": "4.1.1", + "license": "BSD-2-Clause" + }, + "node_modules/http-deceiver": { + "version": "1.2.7", + "license": "MIT" + }, + "node_modules/http-errors": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/http-parser-js": { + "version": "0.5.8", + "license": "MIT" + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "license": "MIT", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-middleware": { + "version": "2.0.6", + "license": "MIT", + "dependencies": { + "@types/http-proxy": "^1.17.8", + "http-proxy": "^1.18.1", + "is-glob": "^4.0.1", + "is-plain-obj": "^3.0.0", + "micromatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "@types/express": "^4.17.13" + }, + "peerDependenciesMeta": { + "@types/express": { + "optional": true + } + } + }, + "node_modules/http-proxy-middleware/node_modules/is-plain-obj": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/http2-wrapper": { + "version": "2.2.1", + "license": "MIT", + "dependencies": { + "quick-lru": "^5.1.1", + "resolve-alpn": "^1.2.0" + }, + "engines": { + "node": ">=10.19.0" + } + }, + "node_modules/human-signals": { + "version": "2.1.0", + "license": "Apache-2.0", + "engines": { + "node": ">=10.17.0" + } + }, + "node_modules/iconv-lite": { + "version": "0.4.24", + "license": "MIT", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/icss-utils": { + "version": "5.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/image-size": { + "version": "1.1.1", + "license": "MIT", + "dependencies": { + "queue": "6.0.2" + }, + "bin": { + "image-size": "bin/image-size.js" + }, + "engines": { + "node": ">=16.x" + } + }, + "node_modules/immer": { + "version": "9.0.21", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/immer" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-lazy": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "license": "MIT", + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/indent-string": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/infima": { + "version": "0.2.0-alpha.43", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "license": "ISC", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "license": "ISC" + }, + "node_modules/ini": { + "version": "1.3.8", + "license": "ISC" + }, + "node_modules/inline-style-parser": { + "version": "0.1.1", + "license": "MIT" + }, + "node_modules/interpret": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/invariant": { + "version": "2.2.4", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/ipaddr.js": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/is-alphabetical": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-alphanumerical": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "is-alphabetical": "^2.0.0", + "is-decimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-ci": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "ci-info": "^3.2.0" + }, + "bin": { + "is-ci": "bin.js" + } + }, + "node_modules/is-core-module": { + "version": "2.15.0", + "license": "MIT", + "dependencies": { + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-decimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extendable": { + "version": "0.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-hexadecimal": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/is-installed-globally": { + "version": "0.4.0", + "license": "MIT", + "dependencies": { + "global-dirs": "^3.0.0", + "is-path-inside": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-npm": { + "version": "6.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-obj": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-path-cwd": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-plain-obj": { + "version": "4.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-plain-object": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "isobject": "^3.0.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "license": "MIT", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/is-regexp": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-root": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/is-stream": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-typedarray": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "license": "MIT", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-yarn-global": { + "version": "0.4.1", + "license": "MIT", + "engines": { + "node": ">=12" + } + }, + "node_modules/isarray": { + "version": "0.0.1", + "license": "MIT" + }, + "node_modules/isexe": { + "version": "2.0.0", + "license": "ISC" + }, + "node_modules/isobject": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/jest-util": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@jest/types": "^29.6.3", + "@types/node": "*", + "chalk": "^4.0.0", + "ci-info": "^3.2.0", + "graceful-fs": "^4.2.9", + "picomatch": "^2.2.3" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker": { + "version": "29.7.0", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "jest-util": "^29.7.0", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": "^14.15.0 || ^16.10.0 || >=18.0.0" + } + }, + "node_modules/jest-worker/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/jiti": { + "version": "1.21.6", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/joi": { + "version": "17.13.3", + "license": "BSD-3-Clause", + "dependencies": { + "@hapi/hoek": "^9.3.0", + "@hapi/topo": "^5.1.0", + "@sideway/address": "^4.1.5", + "@sideway/formula": "^3.0.1", + "@sideway/pinpoint": "^2.0.0" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsesc": { + "version": "2.5.2", + "license": "MIT", + "bin": { + "jsesc": "bin/jsesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "license": "MIT" + }, + "node_modules/json-schema-traverse": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/json5": { + "version": "2.2.3", + "license": "MIT", + "bin": { + "json5": "lib/cli.js" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/keyv": { + "version": "4.5.4", + "license": "MIT", + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kind-of": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/kleur": { + "version": "3.0.3", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.34.0", + "dev": true, + "license": "MIT" + }, + "node_modules/latest-version": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "package-json": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/launch-editor": { + "version": "2.8.0", + "license": "MIT", + "dependencies": { + "picocolors": "^1.0.0", + "shell-quote": "^1.8.1" + } + }, + "node_modules/leven": { + "version": "3.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/lilconfig": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "license": "MIT" + }, + "node_modules/loader-runner": { + "version": "4.3.0", + "license": "MIT", + "engines": { + "node": ">=6.11.5" + } + }, + "node_modules/loader-utils": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "big.js": "^5.2.2", + "emojis-list": "^3.0.0", + "json5": "^2.1.2" + }, + "engines": { + "node": ">=8.9.0" + } + }, + "node_modules/locate-path": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "license": "MIT" + }, + "node_modules/lodash.debounce": { + "version": "4.0.8", + "license": "MIT" + }, + "node_modules/lodash.memoize": { + "version": "4.1.2", + "license": "MIT" + }, + "node_modules/lodash.truncate": { + "version": "4.4.2", + "dev": true, + "license": "MIT" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "license": "MIT" + }, + "node_modules/longest-streak": { + "version": "3.1.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/lowercase-keys": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lru-cache": { + "version": "5.1.1", + "license": "ISC", + "dependencies": { + "yallist": "^3.0.2" + } + }, + "node_modules/markdown-extensions": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/markdown-table": { + "version": "3.0.3", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mathml-tag-names": { + "version": "2.1.3", + "dev": true, + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/mdast-util-directive": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "escape-string-regexp": "^5.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-find-and-replace/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-from-markdown": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark": "^4.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-decode-string": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-from-markdown/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-frontmatter": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "escape-string-regexp": "^5.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-frontmatter/node_modules/escape-string-regexp": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mdast-util-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-gfm-autolink-literal": "^2.0.0", + "mdast-util-gfm-footnote": "^2.0.0", + "mdast-util-gfm-strikethrough": "^2.0.0", + "mdast-util-gfm-table": "^2.0.0", + "mdast-util-gfm-task-list-item": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "ccount": "^2.0.0", + "devlop": "^1.0.0", + "mdast-util-find-and-replace": "^3.0.0", + "micromark-util-character": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/mdast-util-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/mdast-util-gfm-footnote": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-strikethrough": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-table": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "markdown-table": "^3.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-gfm-task-list-item": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-mdx-expression": "^2.0.0", + "mdast-util-mdx-jsx": "^3.0.0", + "mdast-util-mdxjs-esm": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-expression": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdx-jsx": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "ccount": "^2.0.0", + "devlop": "^1.1.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0", + "parse-entities": "^4.0.0", + "stringify-entities": "^4.0.0", + "unist-util-remove-position": "^5.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-mdxjs-esm": { + "version": "2.0.1", + "license": "MIT", + "dependencies": { + "@types/estree-jsx": "^1.0.0", + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "devlop": "^1.0.0", + "mdast-util-from-markdown": "^2.0.0", + "mdast-util-to-markdown": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-phrasing": { + "version": "4.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-hast": { + "version": "13.2.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "@ungap/structured-clone": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "trim-lines": "^3.0.0", + "unist-util-position": "^5.0.0", + "unist-util-visit": "^5.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-markdown": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "@types/unist": "^3.0.0", + "longest-streak": "^3.0.0", + "mdast-util-phrasing": "^4.0.0", + "mdast-util-to-string": "^4.0.0", + "micromark-util-decode-string": "^2.0.0", + "unist-util-visit": "^5.0.0", + "zwitch": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdast-util-to-string": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "license": "CC0-1.0" + }, + "node_modules/media-typer": { + "version": "0.3.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/memfs": { + "version": "3.5.3", + "license": "Unlicense", + "dependencies": { + "fs-monkey": "^1.0.4" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/meow": { + "version": "13.2.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/merge2": { + "version": "1.4.1", + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/methods": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/micromark": { + "version": "4.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/debug": "^4.0.0", + "debug": "^4.0.0", + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-destination": "^2.0.0", + "micromark-factory-label": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-title": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-html-tag-name": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-subtokenize": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-core-commonmark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-directive": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-factory-whitespace": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "parse-entities": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-directive/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-frontmatter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "fault": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-frontmatter/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "micromark-extension-gfm-autolink-literal": "^2.0.0", + "micromark-extension-gfm-footnote": "^2.0.0", + "micromark-extension-gfm-strikethrough": "^2.0.0", + "micromark-extension-gfm-table": "^2.0.0", + "micromark-extension-gfm-tagfilter": "^2.0.0", + "micromark-extension-gfm-task-list-item": "^2.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-autolink-literal/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-footnote": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-normalize-identifier": "^2.0.0", + "micromark-util-sanitize-uri": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-footnote/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-strikethrough": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-classify-character": "^2.0.0", + "micromark-util-resolve-all": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-strikethrough/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-table": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-table/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-gfm-tagfilter": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-gfm-task-list-item/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-expression": { + "version": "3.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-jsx": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "estree-util-is-identifier-name": "^3.0.0", + "micromark-factory-mdx-expression": "^2.0.0", + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdx-jsx/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-extension-mdx-md": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "acorn": "^8.0.0", + "acorn-jsx": "^5.0.0", + "micromark-extension-mdx-expression": "^3.0.0", + "micromark-extension-mdx-jsx": "^3.0.0", + "micromark-extension-mdx-md": "^2.0.0", + "micromark-extension-mdxjs-esm": "^3.0.0", + "micromark-util-combine-extensions": "^2.0.0", + "micromark-util-types": "^2.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-core-commonmark": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-extension-mdxjs-esm/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-destination": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-destination/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-label": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-label/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-mdx-expression": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "devlop": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-events-to-acorn": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unist-util-position-from-estree": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-mdx-expression/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-space": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-factory-space/node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-title": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-title/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-factory-whitespace": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-factory-space": "^2.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-factory-whitespace/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-character": { + "version": "1.2.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^1.0.0", + "micromark-util-types": "^1.0.0" + } + }, + "node_modules/micromark-util-character/node_modules/micromark-util-types": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-chunked": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-chunked/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-classify-character": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-classify-character/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-combine-extensions": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-chunked": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-numeric-character-reference/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-decode-string": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "decode-named-character-reference": "^1.0.0", + "micromark-util-character": "^2.0.0", + "micromark-util-decode-numeric-character-reference": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-decode-string/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-encode": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-events-to-acorn": { + "version": "2.0.2", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "@types/acorn": "^4.0.0", + "@types/estree": "^1.0.0", + "@types/unist": "^3.0.0", + "devlop": "^1.0.0", + "estree-util-visit": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0", + "vfile-message": "^4.0.0" + } + }, + "node_modules/micromark-util-events-to-acorn/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-html-tag-name": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-normalize-identifier": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-normalize-identifier/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-resolve-all": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-encode": "^2.0.0", + "micromark-util-symbol": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-sanitize-uri/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-subtokenize": { + "version": "2.0.1", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "devlop": "^1.0.0", + "micromark-util-chunked": "^2.0.0", + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark-util-subtokenize/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-symbol": { + "version": "1.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark-util-types": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromark/node_modules/micromark-factory-space": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-character": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-character": { + "version": "2.1.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT", + "dependencies": { + "micromark-util-symbol": "^2.0.0", + "micromark-util-types": "^2.0.0" + } + }, + "node_modules/micromark/node_modules/micromark-util-symbol": { + "version": "2.0.0", + "funding": [ + { + "type": "GitHub Sponsors", + "url": "https://github.com/sponsors/unifiedjs" + }, + { + "type": "OpenCollective", + "url": "https://opencollective.com/unified" + } + ], + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.7", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "1.6.0", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/mime-db": { + "version": "1.33.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.18", + "license": "MIT", + "dependencies": { + "mime-db": "~1.33.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mimic-fn": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/mimic-response": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mini-css-extract-plugin": { + "version": "2.9.0", + "license": "MIT", + "dependencies": { + "schema-utils": "^4.0.0", + "tapable": "^2.2.1" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.0.0" + } + }, + "node_modules/minimalistic-assert": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/minimatch": { + "version": "3.1.2", + "license": "ISC", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/multicast-dns": { + "version": "7.2.5", + "license": "MIT", + "dependencies": { + "dns-packet": "^5.2.2", + "thunky": "^1.0.2" + }, + "bin": { + "multicast-dns": "cli.js" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/negotiator": { + "version": "0.6.3", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/neo-async": { + "version": "2.6.2", + "license": "MIT" + }, + "node_modules/no-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/node-emoji": { + "version": "2.1.3", + "license": "MIT", + "dependencies": { + "@sindresorhus/is": "^4.6.0", + "char-regex": "^1.0.2", + "emojilib": "^2.4.0", + "skin-tone": "^2.0.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/node-forge": { + "version": "1.3.1", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/node-releases": { + "version": "2.0.17", + "license": "MIT" + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-url": { + "version": "8.0.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "path-key": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/nprogress": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/nth-check": { + "version": "2.1.1", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0" + }, + "funding": { + "url": "https://github.com/fb55/nth-check?sponsor=1" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-inspect": { + "version": "1.13.2", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/object-keys": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/object.assign": { + "version": "4.1.5", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.5", + "define-properties": "^1.2.1", + "has-symbols": "^1.0.3", + "object-keys": "^1.1.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/obuf": { + "version": "1.1.2", + "license": "MIT" + }, + "node_modules/on-finished": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/open": { + "version": "8.4.2", + "license": "MIT", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/opener": { + "version": "1.5.2", + "license": "(WTFPL OR MIT)", + "bin": { + "opener": "bin/opener-bin.js" + } + }, + "node_modules/p-cancelable": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=12.20" + } + }, + "node_modules/p-limit": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-map": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "aggregate-error": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-retry": { + "version": "4.6.2", + "license": "MIT", + "dependencies": { + "@types/retry": "0.12.0", + "retry": "^0.13.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/package-json": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "got": "^12.1.0", + "registry-auth-token": "^5.0.1", + "registry-url": "^6.0.0", + "semver": "^7.3.7" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/param-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-entities": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^2.0.0", + "character-entities": "^2.0.0", + "character-entities-legacy": "^3.0.0", + "character-reference-invalid": "^2.0.0", + "decode-named-character-reference": "^1.0.0", + "is-alphanumerical": "^2.0.0", + "is-decimal": "^2.0.0", + "is-hexadecimal": "^2.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/parse-entities/node_modules/@types/unist": { + "version": "2.0.10", + "license": "MIT" + }, + "node_modules/parse-json": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parse-numeric-range": { + "version": "1.3.0", + "license": "ISC" + }, + "node_modules/parse5": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "entities": "^4.4.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parse5-htmlparser2-tree-adapter": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "domhandler": "^5.0.2", + "parse5": "^7.0.0" + }, + "funding": { + "url": "https://github.com/inikulin/parse5?sponsor=1" + } + }, + "node_modules/parseurl": { + "version": "1.3.3", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "license": "MIT", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "5.0.0", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-is-inside": { + "version": "1.0.2", + "license": "(WTFPL OR MIT)" + }, + "node_modules/path-key": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "license": "MIT" + }, + "node_modules/path-to-regexp": { + "version": "1.8.0", + "license": "MIT", + "dependencies": { + "isarray": "0.0.1" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.1", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-dir": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "find-up": "^6.3.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "find-up": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/pkg-up/node_modules/find-up": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/locate-path": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^3.0.0", + "path-exists": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/p-limit": { + "version": "2.3.0", + "license": "MIT", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pkg-up/node_modules/p-locate": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/pkg-up/node_modules/path-exists": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss": { + "version": "8.4.39", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.1", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-calc": { + "version": "9.0.1", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.11", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.2.2" + } + }, + "node_modules/postcss-colormin": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "colord": "^2.9.3", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-convert-values": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-comments": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-duplicates": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-empty": { + "version": "6.0.3", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-overridden": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-discard-unused": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-loader": { + "version": "7.3.4", + "license": "MIT", + "dependencies": { + "cosmiconfig": "^8.3.5", + "jiti": "^1.20.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">= 14.15.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "postcss": "^7.0.0 || ^8.0.1", + "webpack": "^5.0.0" + } + }, + "node_modules/postcss-merge-idents": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-longhand": { + "version": "6.0.5", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "stylehacks": "^6.1.1" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-merge-rules": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0", + "cssnano-utils": "^4.0.2", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-font-values": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-gradients": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "colord": "^2.9.3", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-params": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-minify-selectors": { + "version": "6.0.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-modules-extract-imports": { + "version": "3.1.0", + "license": "ISC", + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-local-by-default": { + "version": "4.0.5", + "license": "MIT", + "dependencies": { + "icss-utils": "^5.0.0", + "postcss-selector-parser": "^6.0.2", + "postcss-value-parser": "^4.1.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-scope": { + "version": "3.2.0", + "license": "ISC", + "dependencies": { + "postcss-selector-parser": "^6.0.4" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-modules-values": { + "version": "4.0.0", + "license": "ISC", + "dependencies": { + "icss-utils": "^5.0.0" + }, + "engines": { + "node": "^10 || ^12 || >= 14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/postcss-normalize-charset": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-display-values": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-positions": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-repeat-style": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-string": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-timing-functions": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-unicode": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-url": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-normalize-whitespace": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-ordered-values": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "cssnano-utils": "^4.0.2", + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-idents": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-initial": { + "version": "6.1.0", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-api": "^3.0.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-reduce-transforms": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-resolve-nested-selector": { + "version": "0.1.1", + "dev": true, + "license": "MIT" + }, + "node_modules/postcss-safe-parser": { + "version": "7.0.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-safe-parser" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-sort-media-queries": { + "version": "5.2.0", + "license": "MIT", + "dependencies": { + "sort-css-media-queries": "2.2.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.4.23" + } + }, + "node_modules/postcss-svgo": { + "version": "6.0.3", + "license": "MIT", + "dependencies": { + "postcss-value-parser": "^4.2.0", + "svgo": "^3.2.0" + }, + "engines": { + "node": "^14 || ^16 || >= 18" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-unique-selectors": { + "version": "6.0.4", + "license": "MIT", + "dependencies": { + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "license": "MIT" + }, + "node_modules/postcss-zindex": { + "version": "6.0.2", + "license": "MIT", + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/pretty-error": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "lodash": "^4.17.20", + "renderkid": "^3.0.0" + } + }, + "node_modules/pretty-time": { + "version": "1.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/prism-react-renderer": { + "version": "2.3.1", + "license": "MIT", + "dependencies": { + "@types/prismjs": "^1.26.0", + "clsx": "^2.0.0" + }, + "peerDependencies": { + "react": ">=16.0.0" + } + }, + "node_modules/prismjs": { + "version": "1.29.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/process-nextick-args": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/prompts": { + "version": "2.4.2", + "license": "MIT", + "dependencies": { + "kleur": "^3.0.3", + "sisteransi": "^1.0.5" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/prop-types": { + "version": "15.8.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, + "node_modules/property-information": { + "version": "6.5.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/proto-list": { + "version": "1.2.4", + "license": "ISC" + }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/proxy-addr/node_modules/ipaddr.js": { + "version": "1.9.1", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/punycode": { + "version": "1.4.1", + "license": "MIT" + }, + "node_modules/pupa": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "escape-goat": "^4.0.0" + }, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/qs": { + "version": "6.11.0", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/queue": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "inherits": "~2.0.3" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/quick-lru": { + "version": "5.1.1", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/randombytes": { + "version": "2.1.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "^5.1.0" + } + }, + "node_modules/range-parser": { + "version": "1.2.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.5.2", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/rc": { + "version": "1.2.8", + "license": "(BSD-2-Clause OR MIT OR Apache-2.0)", + "dependencies": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + }, + "bin": { + "rc": "cli.js" + } + }, + "node_modules/rc/node_modules/strip-json-comments": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-dev-utils": { + "version": "12.0.1", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.16.0", + "address": "^1.1.2", + "browserslist": "^4.18.1", + "chalk": "^4.1.2", + "cross-spawn": "^7.0.3", + "detect-port-alt": "^1.1.6", + "escape-string-regexp": "^4.0.0", + "filesize": "^8.0.6", + "find-up": "^5.0.0", + "fork-ts-checker-webpack-plugin": "^6.5.0", + "global-modules": "^2.0.0", + "globby": "^11.0.4", + "gzip-size": "^6.0.0", + "immer": "^9.0.7", + "is-root": "^2.1.0", + "loader-utils": "^3.2.0", + "open": "^8.4.0", + "pkg-up": "^3.1.0", + "prompts": "^2.4.2", + "react-error-overlay": "^6.0.11", + "recursive-readdir": "^2.2.2", + "shell-quote": "^1.7.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/react-dev-utils/node_modules/find-up": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/loader-utils": { + "version": "3.3.1", + "license": "MIT", + "engines": { + "node": ">= 12.13.0" + } + }, + "node_modules/react-dev-utils/node_modules/locate-path": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-limit": { + "version": "3.1.0", + "license": "MIT", + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/p-locate": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dev-utils/node_modules/path-exists": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/react-dev-utils/node_modules/yocto-queue": { + "version": "0.1.0", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-error-overlay": { + "version": "6.0.11", + "license": "MIT" + }, + "node_modules/react-fast-compare": { + "version": "3.2.2", + "license": "MIT" + }, + "node_modules/react-helmet-async": { + "version": "1.3.0", + "license": "Apache-2.0", + "dependencies": { + "@babel/runtime": "^7.12.5", + "invariant": "^2.2.4", + "prop-types": "^15.7.2", + "react-fast-compare": "^3.2.0", + "shallowequal": "^1.1.0" + }, + "peerDependencies": { + "react": "^16.6.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.6.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-is": { + "version": "16.13.1", + "license": "MIT" + }, + "node_modules/react-json-view-lite": { + "version": "1.4.0", + "license": "MIT", + "engines": { + "node": ">=14" + }, + "peerDependencies": { + "react": "^16.13.1 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-loadable": { + "name": "@docusaurus/react-loadable", + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/react": "*" + }, + "peerDependencies": { + "react": "*" + } + }, + "node_modules/react-loadable-ssr-addon-v5-slorber": { + "version": "1.0.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.10.3" + }, + "engines": { + "node": ">=10.13.0" + }, + "peerDependencies": { + "react-loadable": "*", + "webpack": ">=4.41.1 || 5.x" + } + }, + "node_modules/react-router": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "hoist-non-react-statics": "^3.1.0", + "loose-envify": "^1.3.1", + "path-to-regexp": "^1.7.0", + "prop-types": "^15.6.2", + "react-is": "^16.6.0", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/react-router-config": { + "version": "5.1.1", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.1.2" + }, + "peerDependencies": { + "react": ">=15", + "react-router": ">=5" + } + }, + "node_modules/react-router-dom": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.13", + "history": "^4.9.0", + "loose-envify": "^1.3.1", + "prop-types": "^15.6.2", + "react-router": "5.3.4", + "tiny-invariant": "^1.0.2", + "tiny-warning": "^1.0.0" + }, + "peerDependencies": { + "react": ">=15" + } + }, + "node_modules/readable-stream": { + "version": "3.6.2", + "license": "MIT", + "dependencies": { + "inherits": "^2.0.3", + "string_decoder": "^1.1.1", + "util-deprecate": "^1.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/reading-time": { + "version": "1.5.0", + "license": "MIT" + }, + "node_modules/rechoir": { + "version": "0.6.2", + "dependencies": { + "resolve": "^1.1.6" + }, + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/recursive-readdir": { + "version": "2.2.3", + "license": "MIT", + "dependencies": { + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/regenerate": { + "version": "1.4.2", + "license": "MIT" + }, + "node_modules/regenerate-unicode-properties": { + "version": "10.1.1", + "license": "MIT", + "dependencies": { + "regenerate": "^1.4.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "license": "MIT" + }, + "node_modules/regenerator-transform": { + "version": "0.15.2", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.4" + } + }, + "node_modules/regexpu-core": { + "version": "5.3.2", + "license": "MIT", + "dependencies": { + "@babel/regjsgen": "^0.8.0", + "regenerate": "^1.4.2", + "regenerate-unicode-properties": "^10.1.0", + "regjsparser": "^0.9.1", + "unicode-match-property-ecmascript": "^2.0.0", + "unicode-match-property-value-ecmascript": "^2.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/registry-auth-token": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "@pnpm/npm-conf": "^2.1.0" + }, + "engines": { + "node": ">=14" + } + }, + "node_modules/registry-url": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "rc": "1.2.8" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/regjsparser": { + "version": "0.9.1", + "license": "BSD-2-Clause", + "dependencies": { + "jsesc": "~0.5.0" + }, + "bin": { + "regjsparser": "bin/parser" + } + }, + "node_modules/regjsparser/node_modules/jsesc": { + "version": "0.5.0", + "bin": { + "jsesc": "bin/jsesc" + } + }, + "node_modules/rehype-raw": { + "version": "7.0.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "hast-util-raw": "^9.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/relateurl": { + "version": "0.2.7", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, + "node_modules/remark-directive": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-directive": "^3.0.0", + "micromark-extension-directive": "^3.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-emoji": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.2", + "emoticon": "^4.0.1", + "mdast-util-find-and-replace": "^3.0.1", + "node-emoji": "^2.1.0", + "unified": "^11.0.4" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/remark-frontmatter": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-frontmatter": "^2.0.0", + "micromark-extension-frontmatter": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-gfm": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-gfm": "^3.0.0", + "micromark-extension-gfm": "^3.0.0", + "remark-parse": "^11.0.0", + "remark-stringify": "^11.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-mdx": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "mdast-util-mdx": "^3.0.0", + "micromark-extension-mdxjs": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-parse": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-from-markdown": "^2.0.0", + "micromark-util-types": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-rehype": { + "version": "11.1.0", + "license": "MIT", + "dependencies": { + "@types/hast": "^3.0.0", + "@types/mdast": "^4.0.0", + "mdast-util-to-hast": "^13.0.0", + "unified": "^11.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/remark-stringify": { + "version": "11.0.0", + "license": "MIT", + "dependencies": { + "@types/mdast": "^4.0.0", + "mdast-util-to-markdown": "^2.0.0", + "unified": "^11.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/renderkid": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "css-select": "^4.1.3", + "dom-converter": "^0.2.0", + "htmlparser2": "^6.1.0", + "lodash": "^4.17.21", + "strip-ansi": "^6.0.1" + } + }, + "node_modules/renderkid/node_modules/css-select": { + "version": "4.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "boolbase": "^1.0.0", + "css-what": "^6.0.1", + "domhandler": "^4.3.1", + "domutils": "^2.8.0", + "nth-check": "^2.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/fb55" + } + }, + "node_modules/renderkid/node_modules/dom-serializer": { + "version": "1.4.1", + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + }, + "funding": { + "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domhandler": { + "version": "4.3.1", + "license": "BSD-2-Clause", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + }, + "funding": { + "url": "https://github.com/fb55/domhandler?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/domutils": { + "version": "2.8.0", + "license": "BSD-2-Clause", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + }, + "funding": { + "url": "https://github.com/fb55/domutils?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/entities": { + "version": "2.2.0", + "license": "BSD-2-Clause", + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/renderkid/node_modules/htmlparser2": { + "version": "6.1.0", + "funding": [ + "https://github.com/fb55/htmlparser2?sponsor=1", + { + "type": "github", + "url": "https://github.com/sponsors/fb55" + } + ], + "license": "MIT", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/require-from-string": { + "version": "2.0.2", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-like": { + "version": "0.1.2", + "engines": { + "node": "*" + } + }, + "node_modules/requires-port": { + "version": "1.0.0", + "license": "MIT" + }, + "node_modules/resolve": { + "version": "1.22.8", + "license": "MIT", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-alpn": { + "version": "1.2.1", + "license": "MIT" + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pathname": { + "version": "3.0.0", + "license": "MIT" + }, + "node_modules/responselike": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "lowercase-keys": "^3.0.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/retry": { + "version": "0.13.1", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "license": "ISC", + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rtl-detect": { + "version": "1.1.2", + "license": "BSD-3-Clause" + }, + "node_modules/rtlcss": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "escalade": "^3.1.1", + "picocolors": "^1.0.0", + "postcss": "^8.4.21", + "strip-json-comments": "^3.1.1" + }, + "bin": { + "rtlcss": "bin/rtlcss.js" + }, + "engines": { + "node": ">=12.0.0" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/safe-buffer": { + "version": "5.2.1", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "license": "MIT" + }, + "node_modules/sax": { + "version": "1.4.1", + "license": "ISC" + }, + "node_modules/scheduler": { + "version": "0.23.2", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, + "node_modules/schema-utils": { + "version": "4.2.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.9", + "ajv": "^8.9.0", + "ajv-formats": "^2.1.1", + "ajv-keywords": "^5.1.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/search-insights": { + "version": "2.15.0", + "license": "MIT", + "peer": true + }, + "node_modules/section-matter": { + "version": "1.0.0", + "license": "MIT", + "dependencies": { + "extend-shallow": "^2.0.1", + "kind-of": "^6.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/select-hose": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/selfsigned": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "@types/node-forge": "^1.3.0", + "node-forge": "^1" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "7.6.3", + "license": "ISC", + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver-diff": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "semver": "^7.3.5" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/send": { + "version": "0.18.0", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "2.4.1", + "range-parser": "~1.2.1", + "statuses": "2.0.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "license": "MIT" + }, + "node_modules/send/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serialize-javascript": { + "version": "6.0.2", + "license": "BSD-3-Clause", + "dependencies": { + "randombytes": "^2.1.0" + } + }, + "node_modules/serve-handler": { + "version": "6.1.5", + "license": "MIT", + "dependencies": { + "bytes": "3.0.0", + "content-disposition": "0.5.2", + "fast-url-parser": "1.1.3", + "mime-types": "2.1.18", + "minimatch": "3.1.2", + "path-is-inside": "1.0.2", + "path-to-regexp": "2.2.1", + "range-parser": "1.2.0" + } + }, + "node_modules/serve-handler/node_modules/path-to-regexp": { + "version": "2.2.1", + "license": "MIT" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "license": "MIT", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "license": "MIT" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "license": "ISC" + }, + "node_modules/serve-index/node_modules/statuses": { + "version": "1.5.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-static": { + "version": "1.15.0", + "license": "MIT", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.18.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/set-function-length": { + "version": "1.2.2", + "license": "MIT", + "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" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "license": "ISC" + }, + "node_modules/shallow-clone": { + "version": "3.0.1", + "license": "MIT", + "dependencies": { + "kind-of": "^6.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shallowequal": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/shell-quote": { + "version": "1.8.1", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/shelljs": { + "version": "0.8.5", + "license": "BSD-3-Clause", + "dependencies": { + "glob": "^7.0.0", + "interpret": "^1.0.0", + "rechoir": "^0.6.2" + }, + "bin": { + "shjs": "bin/shjs" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/side-channel": { + "version": "1.0.6", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.4", + "object-inspect": "^1.13.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/signal-exit": { + "version": "3.0.7", + "license": "ISC" + }, + "node_modules/sirv": { + "version": "2.0.4", + "license": "MIT", + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/sisteransi": { + "version": "1.0.5", + "license": "MIT" + }, + "node_modules/sitemap": { + "version": "7.1.2", + "license": "MIT", + "dependencies": { + "@types/node": "^17.0.5", + "@types/sax": "^1.2.1", + "arg": "^5.0.0", + "sax": "^1.2.4" + }, + "bin": { + "sitemap": "dist/cli.js" + }, + "engines": { + "node": ">=12.0.0", + "npm": ">=5.6.0" + } + }, + "node_modules/sitemap/node_modules/@types/node": { + "version": "17.0.45", + "license": "MIT" + }, + "node_modules/skin-tone": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-emoji-modifier-base": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/slice-ansi": { + "version": "4.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "astral-regex": "^2.0.0", + "is-fullwidth-code-point": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/slice-ansi?sponsor=1" + } + }, + "node_modules/snake-case": { + "version": "3.0.4", + "license": "MIT", + "dependencies": { + "dot-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/sockjs": { + "version": "0.3.24", + "license": "MIT", + "dependencies": { + "faye-websocket": "^0.11.3", + "uuid": "^8.3.2", + "websocket-driver": "^0.7.4" + } + }, + "node_modules/sort-css-media-queries": { + "version": "2.2.0", + "license": "MIT", + "engines": { + "node": ">= 6.3.0" + } + }, + "node_modules/source-map": { + "version": "0.7.4", + "license": "BSD-3-Clause", + "engines": { + "node": ">= 8" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-support": { + "version": "0.5.21", + "license": "MIT", + "dependencies": { + "buffer-from": "^1.0.0", + "source-map": "^0.6.0" + } + }, + "node_modules/source-map-support/node_modules/source-map": { + "version": "0.6.1", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/space-separated-tokens": { + "version": "2.0.2", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/spdy": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "handle-thing": "^2.0.0", + "http-deceiver": "^1.2.7", + "select-hose": "^2.0.0", + "spdy-transport": "^3.0.0" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/spdy-transport": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "debug": "^4.1.0", + "detect-node": "^2.0.4", + "hpack.js": "^2.1.6", + "obuf": "^1.1.2", + "readable-stream": "^3.0.6", + "wbuf": "^1.7.3" + } + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "license": "BSD-3-Clause" + }, + "node_modules/srcset": { + "version": "4.0.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/stable": { + "version": "0.1.8", + "license": "MIT" + }, + "node_modules/statuses": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/std-env": { + "version": "3.7.0", + "license": "MIT" + }, + "node_modules/string_decoder": { + "version": "1.3.0", + "license": "MIT", + "dependencies": { + "safe-buffer": "~5.2.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "license": "MIT", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stringify-entities": { + "version": "4.0.4", + "license": "MIT", + "dependencies": { + "character-entities-html4": "^2.0.0", + "character-entities-legacy": "^3.0.0" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/stringify-object": { + "version": "3.3.0", + "license": "BSD-2-Clause", + "dependencies": { + "get-own-enumerable-property-symbols": "^3.0.0", + "is-obj": "^1.0.1", + "is-regexp": "^1.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-bom-string": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-final-newline": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/style-to-object": { + "version": "0.4.4", + "license": "MIT", + "dependencies": { + "inline-style-parser": "0.1.1" + } + }, + "node_modules/stylehacks": { + "version": "6.1.1", + "license": "MIT", + "dependencies": { + "browserslist": "^4.23.0", + "postcss-selector-parser": "^6.0.16" + }, + "engines": { + "node": "^14 || ^16 || >=18.0" + }, + "peerDependencies": { + "postcss": "^8.4.31" + } + }, + "node_modules/stylelint": { + "version": "16.7.0", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "@csstools/css-parser-algorithms": "^2.7.1", + "@csstools/css-tokenizer": "^2.4.1", + "@csstools/media-query-list-parser": "^2.1.13", + "@csstools/selector-specificity": "^3.1.1", + "@dual-bundle/import-meta-resolve": "^4.1.0", + "balanced-match": "^2.0.0", + "colord": "^2.9.3", + "cosmiconfig": "^9.0.0", + "css-functions-list": "^3.2.2", + "css-tree": "^2.3.1", + "debug": "^4.3.5", + "fast-glob": "^3.3.2", + "fastest-levenshtein": "^1.0.16", + "file-entry-cache": "^9.0.0", + "global-modules": "^2.0.0", + "globby": "^11.1.0", + "globjoin": "^0.1.4", + "html-tags": "^3.3.1", + "ignore": "^5.3.1", + "imurmurhash": "^0.1.4", + "is-plain-object": "^5.0.0", + "known-css-properties": "^0.34.0", + "mathml-tag-names": "^2.1.3", + "meow": "^13.2.0", + "micromatch": "^4.0.7", + "normalize-path": "^3.0.0", + "picocolors": "^1.0.1", + "postcss": "^8.4.39", + "postcss-resolve-nested-selector": "^0.1.1", + "postcss-safe-parser": "^7.0.0", + "postcss-selector-parser": "^6.1.0", + "postcss-value-parser": "^4.2.0", + "resolve-from": "^5.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^7.1.0", + "supports-hyperlinks": "^3.0.0", + "svg-tags": "^1.0.0", + "table": "^6.8.2", + "write-file-atomic": "^5.0.1" + }, + "bin": { + "stylelint": "bin/stylelint.mjs" + }, + "engines": { + "node": ">=18.12.0" + } + }, + "node_modules/stylelint-config-recommended": { + "version": "14.0.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint-config-standard": { + "version": "36.0.1", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/stylelint" + }, + { + "type": "github", + "url": "https://github.com/sponsors/stylelint" + } + ], + "license": "MIT", + "dependencies": { + "stylelint-config-recommended": "^14.0.1" + }, + "engines": { + "node": ">=18.12.0" + }, + "peerDependencies": { + "stylelint": "^16.1.0" + } + }, + "node_modules/stylelint/node_modules/balanced-match": { + "version": "2.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/cosmiconfig": { + "version": "9.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/stylelint/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/stylelint/node_modules/is-plain-object": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/stylelint/node_modules/resolve-from": { + "version": "5.0.0", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/signal-exit": { + "version": "4.1.0", + "dev": true, + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/stylelint/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/string-width/node_modules/strip-ansi": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/stylelint/node_modules/strip-ansi": { + "version": "7.1.0", + "dev": true, + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/strip-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/stylelint/node_modules/write-file-atomic": { + "version": "5.0.1", + "dev": true, + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-hyperlinks": { + "version": "3.0.0", + "dev": true, + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0", + "supports-color": "^7.0.0" + }, + "engines": { + "node": ">=14.18" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svg-parser": { + "version": "2.0.4", + "license": "MIT" + }, + "node_modules/svg-tags": { + "version": "1.0.0", + "dev": true + }, + "node_modules/svgo": { + "version": "3.3.2", + "license": "MIT", + "dependencies": { + "@trysound/sax": "0.2.0", + "commander": "^7.2.0", + "css-select": "^5.1.0", + "css-tree": "^2.3.1", + "css-what": "^6.1.0", + "csso": "^5.0.5", + "picocolors": "^1.0.0" + }, + "bin": { + "svgo": "bin/svgo" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/svgo" + } + }, + "node_modules/svgo/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/table": { + "version": "6.8.2", + "dev": true, + "license": "BSD-3-Clause", + "dependencies": { + "ajv": "^8.0.1", + "lodash.truncate": "^4.4.2", + "slice-ansi": "^4.0.0", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/table/node_modules/emoji-regex": { + "version": "8.0.0", + "dev": true, + "license": "MIT" + }, + "node_modules/table/node_modules/string-width": { + "version": "4.2.3", + "dev": true, + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/tablesort": { + "version": "5.3.0", + "license": "MIT" + }, + "node_modules/tapable": { + "version": "2.2.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/terser": { + "version": "5.31.3", + "license": "BSD-2-Clause", + "dependencies": { + "@jridgewell/source-map": "^0.3.3", + "acorn": "^8.8.2", + "commander": "^2.20.0", + "source-map-support": "~0.5.20" + }, + "bin": { + "terser": "bin/terser" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/terser-webpack-plugin": { + "version": "5.3.10", + "license": "MIT", + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.20", + "jest-worker": "^27.4.5", + "schema-utils": "^3.1.1", + "serialize-javascript": "^6.0.1", + "terser": "^5.26.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^5.1.0" + }, + "peerDependenciesMeta": { + "@swc/core": { + "optional": true + }, + "esbuild": { + "optional": true + }, + "uglify-js": { + "optional": true + } + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/terser-webpack-plugin/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/terser-webpack-plugin/node_modules/jest-worker": { + "version": "27.5.1", + "license": "MIT", + "dependencies": { + "@types/node": "*", + "merge-stream": "^2.0.0", + "supports-color": "^8.0.0" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/terser-webpack-plugin/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/terser-webpack-plugin/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/terser-webpack-plugin/node_modules/supports-color": { + "version": "8.1.1", + "license": "MIT", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/supports-color?sponsor=1" + } + }, + "node_modules/terser/node_modules/commander": { + "version": "2.20.3", + "license": "MIT" + }, + "node_modules/text-table": { + "version": "0.2.0", + "license": "MIT" + }, + "node_modules/thunky": { + "version": "1.1.0", + "license": "MIT" + }, + "node_modules/tiny-invariant": { + "version": "1.3.3", + "license": "MIT" + }, + "node_modules/tiny-warning": { + "version": "1.0.3", + "license": "MIT" + }, + "node_modules/to-fast-properties": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/trim-lines": { + "version": "3.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/trough": { + "version": "2.2.0", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "license": "0BSD" + }, + "node_modules/type-fest": { + "version": "2.19.0", + "license": "(MIT OR CC0-1.0)", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/type-is": { + "version": "1.6.18", + "license": "MIT", + "dependencies": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/type-is/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/typedarray-to-buffer": { + "version": "3.1.5", + "license": "MIT", + "dependencies": { + "is-typedarray": "^1.0.0" + } + }, + "node_modules/typescript": { + "version": "5.5.3", + "license": "Apache-2.0", + "peer": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/undici-types": { + "version": "5.26.5", + "license": "MIT" + }, + "node_modules/unicode-canonical-property-names-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-emoji-modifier-base": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-ecmascript": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "unicode-canonical-property-names-ecmascript": "^2.0.0", + "unicode-property-aliases-ecmascript": "^2.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-match-property-value-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unicode-property-aliases-ecmascript": { + "version": "2.1.0", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/unified": { + "version": "11.0.5", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "bail": "^2.0.0", + "devlop": "^1.0.0", + "extend": "^3.0.0", + "is-plain-obj": "^4.0.0", + "trough": "^2.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unique-string": { + "version": "3.0.0", + "license": "MIT", + "dependencies": { + "crypto-random-string": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/unist-util-is": { + "version": "6.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-position-from-estree": { + "version": "2.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-remove-position": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-visit": "^5.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-stringify-position": { + "version": "4.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit": { + "version": "5.0.0", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0", + "unist-util-visit-parents": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/unist-util-visit-parents": { + "version": "6.0.1", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-is": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.1.0", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.1" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/update-notifier": { + "version": "6.0.2", + "license": "BSD-2-Clause", + "dependencies": { + "boxen": "^7.0.0", + "chalk": "^5.0.1", + "configstore": "^6.0.0", + "has-yarn": "^3.0.0", + "import-lazy": "^4.0.0", + "is-ci": "^3.0.1", + "is-installed-globally": "^0.4.0", + "is-npm": "^6.0.0", + "is-yarn-global": "^0.4.0", + "latest-version": "^7.0.0", + "pupa": "^3.1.0", + "semver": "^7.3.7", + "semver-diff": "^4.0.0", + "xdg-basedir": "^5.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/yeoman/update-notifier?sponsor=1" + } + }, + "node_modules/update-notifier/node_modules/boxen": { + "version": "7.1.1", + "license": "MIT", + "dependencies": { + "ansi-align": "^3.0.1", + "camelcase": "^7.0.1", + "chalk": "^5.2.0", + "cli-boxes": "^3.0.0", + "string-width": "^5.1.2", + "type-fest": "^2.13.0", + "widest-line": "^4.0.1", + "wrap-ansi": "^8.1.0" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/camelcase": { + "version": "7.0.1", + "license": "MIT", + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/update-notifier/node_modules/chalk": { + "version": "5.3.0", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "license": "BSD-2-Clause", + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/uri-js/node_modules/punycode": { + "version": "2.3.1", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/url-loader": { + "version": "4.1.1", + "license": "MIT", + "dependencies": { + "loader-utils": "^2.0.0", + "mime-types": "^2.1.27", + "schema-utils": "^3.0.0" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "file-loader": "*", + "webpack": "^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "file-loader": { + "optional": true + } + } + }, + "node_modules/url-loader/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/url-loader/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/url-loader/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/url-loader/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/url-loader/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "license": "MIT" + }, + "node_modules/utila": { + "version": "0.4.0", + "license": "MIT" + }, + "node_modules/utility-types": { + "version": "3.11.0", + "license": "MIT", + "engines": { + "node": ">= 4" + } + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/uuid": { + "version": "8.3.2", + "license": "MIT", + "bin": { + "uuid": "dist/bin/uuid" + } + }, + "node_modules/value-equal": { + "version": "1.0.1", + "license": "MIT" + }, + "node_modules/vary": { + "version": "1.1.2", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/vfile": { + "version": "6.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0", + "vfile-message": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-location": { + "version": "5.0.3", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "vfile": "^6.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/vfile-message": { + "version": "4.0.2", + "license": "MIT", + "dependencies": { + "@types/unist": "^3.0.0", + "unist-util-stringify-position": "^4.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/unified" + } + }, + "node_modules/watchpack": { + "version": "2.4.1", + "license": "MIT", + "dependencies": { + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.1.2" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/wbuf": { + "version": "1.7.3", + "license": "MIT", + "dependencies": { + "minimalistic-assert": "^1.0.0" + } + }, + "node_modules/web-namespaces": { + "version": "2.0.1", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/webpack": { + "version": "5.93.0", + "license": "MIT", + "dependencies": { + "@types/eslint-scope": "^3.7.3", + "@types/estree": "^1.0.5", + "@webassemblyjs/ast": "^1.12.1", + "@webassemblyjs/wasm-edit": "^1.12.1", + "@webassemblyjs/wasm-parser": "^1.12.1", + "acorn": "^8.7.1", + "acorn-import-attributes": "^1.9.5", + "browserslist": "^4.21.10", + "chrome-trace-event": "^1.0.2", + "enhanced-resolve": "^5.17.0", + "es-module-lexer": "^1.2.1", + "eslint-scope": "5.1.1", + "events": "^3.2.0", + "glob-to-regexp": "^0.4.1", + "graceful-fs": "^4.2.11", + "json-parse-even-better-errors": "^2.3.1", + "loader-runner": "^4.2.0", + "mime-types": "^2.1.27", + "neo-async": "^2.6.2", + "schema-utils": "^3.2.0", + "tapable": "^2.1.1", + "terser-webpack-plugin": "^5.3.10", + "watchpack": "^2.4.1", + "webpack-sources": "^3.2.3" + }, + "bin": { + "webpack": "bin/webpack.js" + }, + "engines": { + "node": ">=10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependenciesMeta": { + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-bundle-analyzer": { + "version": "4.10.2", + "license": "MIT", + "dependencies": { + "@discoveryjs/json-ext": "0.5.7", + "acorn": "^8.0.4", + "acorn-walk": "^8.0.0", + "commander": "^7.2.0", + "debounce": "^1.2.1", + "escape-string-regexp": "^4.0.0", + "gzip-size": "^6.0.0", + "html-escaper": "^2.0.2", + "opener": "^1.5.2", + "picocolors": "^1.0.0", + "sirv": "^2.0.3", + "ws": "^7.3.1" + }, + "bin": { + "webpack-bundle-analyzer": "lib/bin/analyzer.js" + }, + "engines": { + "node": ">= 10.13.0" + } + }, + "node_modules/webpack-bundle-analyzer/node_modules/commander": { + "version": "7.2.0", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/webpack-dev-middleware": { + "version": "5.3.4", + "license": "MIT", + "dependencies": { + "colorette": "^2.0.10", + "memfs": "^3.4.3", + "mime-types": "^2.1.31", + "range-parser": "^1.2.1", + "schema-utils": "^4.0.0" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.0.0 || ^5.0.0" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-middleware/node_modules/range-parser": { + "version": "1.2.1", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack-dev-server": { + "version": "4.15.2", + "license": "MIT", + "dependencies": { + "@types/bonjour": "^3.5.9", + "@types/connect-history-api-fallback": "^1.3.5", + "@types/express": "^4.17.13", + "@types/serve-index": "^1.9.1", + "@types/serve-static": "^1.13.10", + "@types/sockjs": "^0.3.33", + "@types/ws": "^8.5.5", + "ansi-html-community": "^0.0.8", + "bonjour-service": "^1.0.11", + "chokidar": "^3.5.3", + "colorette": "^2.0.10", + "compression": "^1.7.4", + "connect-history-api-fallback": "^2.0.0", + "default-gateway": "^6.0.3", + "express": "^4.17.3", + "graceful-fs": "^4.2.6", + "html-entities": "^2.3.2", + "http-proxy-middleware": "^2.0.3", + "ipaddr.js": "^2.0.1", + "launch-editor": "^2.6.0", + "open": "^8.0.9", + "p-retry": "^4.5.0", + "rimraf": "^3.0.2", + "schema-utils": "^4.0.0", + "selfsigned": "^2.1.1", + "serve-index": "^1.9.1", + "sockjs": "^0.3.24", + "spdy": "^4.0.2", + "webpack-dev-middleware": "^5.3.4", + "ws": "^8.13.0" + }, + "bin": { + "webpack-dev-server": "bin/webpack-dev-server.js" + }, + "engines": { + "node": ">= 12.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + }, + "peerDependencies": { + "webpack": "^4.37.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "webpack": { + "optional": true + }, + "webpack-cli": { + "optional": true + } + } + }, + "node_modules/webpack-dev-server/node_modules/ws": { + "version": "8.18.0", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/webpack-merge": { + "version": "5.10.0", + "license": "MIT", + "dependencies": { + "clone-deep": "^4.0.1", + "flat": "^5.0.2", + "wildcard": "^2.0.0" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/webpack-sources": { + "version": "3.2.3", + "license": "MIT", + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webpack/node_modules/ajv": { + "version": "6.12.6", + "license": "MIT", + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/webpack/node_modules/ajv-keywords": { + "version": "3.5.2", + "license": "MIT", + "peerDependencies": { + "ajv": "^6.9.1" + } + }, + "node_modules/webpack/node_modules/json-schema-traverse": { + "version": "0.4.1", + "license": "MIT" + }, + "node_modules/webpack/node_modules/mime-db": { + "version": "1.52.0", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/mime-types": { + "version": "2.1.35", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/webpack/node_modules/schema-utils": { + "version": "3.3.0", + "license": "MIT", + "dependencies": { + "@types/json-schema": "^7.0.8", + "ajv": "^6.12.5", + "ajv-keywords": "^3.5.2" + }, + "engines": { + "node": ">= 10.13.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/webpack" + } + }, + "node_modules/webpackbar": { + "version": "5.0.2", + "license": "MIT", + "dependencies": { + "chalk": "^4.1.0", + "consola": "^2.15.3", + "pretty-time": "^1.1.0", + "std-env": "^3.0.1" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "webpack": "3 || 4 || 5" + } + }, + "node_modules/websocket-driver": { + "version": "0.7.4", + "license": "Apache-2.0", + "dependencies": { + "http-parser-js": ">=0.5.1", + "safe-buffer": ">=5.1.0", + "websocket-extensions": ">=0.1.1" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/websocket-extensions": { + "version": "0.1.4", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/which": { + "version": "2.0.2", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/widest-line": { + "version": "4.0.1", + "license": "MIT", + "dependencies": { + "string-width": "^5.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/wildcard": { + "version": "2.0.1", + "license": "MIT" + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "license": "MIT", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "license": "MIT", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "license": "ISC" + }, + "node_modules/write-file-atomic": { + "version": "3.0.3", + "license": "ISC", + "dependencies": { + "imurmurhash": "^0.1.4", + "is-typedarray": "^1.0.0", + "signal-exit": "^3.0.2", + "typedarray-to-buffer": "^3.1.5" + } + }, + "node_modules/ws": { + "version": "7.5.10", + "license": "MIT", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xdg-basedir": { + "version": "5.1.0", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/xml-js": { + "version": "1.6.11", + "license": "MIT", + "dependencies": { + "sax": "^1.2.4" + }, + "bin": { + "xml-js": "bin/cli.js" + } + }, + "node_modules/yallist": { + "version": "3.1.1", + "license": "ISC" + }, + "node_modules/yaml": { + "version": "1.10.2", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, + "node_modules/yocto-queue": { + "version": "1.1.1", + "license": "MIT", + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/zwitch": { + "version": "2.0.4", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + } + } +} diff --git a/docs/package.json b/docs/package.json new file mode 100644 index 000000000..10d8c05d8 --- /dev/null +++ b/docs/package.json @@ -0,0 +1,50 @@ +{ + "name": "website", + "version": "2024.8.01", + "private": true, + "scripts": { + "docusaurus": "docusaurus", + "start": "docusaurus start", + "build": "docusaurus build", + "swizzle": "docusaurus swizzle", + "deploy": "docusaurus deploy", + "clear": "docusaurus clear", + "serve": "docusaurus serve", + "write-translations": "docusaurus write-translations", + "write-heading-ids": "docusaurus write-heading-ids" + }, + "dependencies": { + "@docusaurus/core": "3.4.0", + "@docusaurus/plugin-client-redirects": "^3.4.0", + "@docusaurus/preset-classic": "3.4.0", + "@mdx-js/react": "^3.0.0", + "clsx": "^2.0.0", + "css-minimizer-webpack-plugin": "^4.1.0", + "docusaurus-theme-github-codeblock": "^2.0.2", + "prism-react-renderer": "^2.3.0", + "react": "^18.0.0", + "react-dom": "^18.0.0", + "tablesort": "^5.3.0" + }, + "devDependencies": { + "@docusaurus/module-type-aliases": "3.4.0", + "@docusaurus/types": "3.4.0", + "stylelint": "^16.7.0", + "stylelint-config-standard": "^36.0.1" + }, + "browserslist": { + "production": [ + ">0.5%", + "not dead", + "not op_mini all" + ], + "development": [ + "last 3 chrome version", + "last 3 firefox version", + "last 5 safari version" + ] + }, + "engines": { + "node": ">=20.0" + } +} diff --git a/docs/redirects.js b/docs/redirects.js new file mode 100644 index 000000000..ef193a515 --- /dev/null +++ b/docs/redirects.js @@ -0,0 +1,103 @@ +import ExecutionEnvironment from '@docusaurus/ExecutionEnvironment'; + +if (ExecutionEnvironment.canUseDOM) { +(function() { + // List of specific URLs to handle + const urlsToHandle = [ + '/bolt-js/concepts#basic', + '/bolt-js/concepts#advanced', + '/bolt-js/concepts#message-listening', + '/bolt-js/concepts#message-sending', + '/bolt-js/concepts#event-listening', + '/bolt-js/concepts#web-api', + '/bolt-js/concepts#action-listening', + '/bolt-js/concepts#action-respond', + '/bolt-js/concepts#acknowledge', + '/bolt-js/concepts#shortcuts', + '/bolt-js/concepts#commands', + '/bolt-js/concepts#creating-modals', + '/bolt-js/concepts#updating-pushing-views', + '/bolt-js/concepts#view-submissions', + '/bolt-js/concepts#publishing-views', + '/bolt-js/concepts#options', + '/bolt-js/concepts#authenticating-oauth', + '/bolt-js/concepts#socket-mode', + '/bolt-js/concepts#error-handling', + '/bolt-js/concepts#authorization', + '/bolt-js/concepts#token-rotation', + '/bolt-js/concepts#conversation-store', + '/bolt-js/concepts#global-middleware', + '/bolt-js/concepts#listener-middleware', + '/bolt-js/concepts#context', + '/bolt-js/concepts#deferring-initialization', + '/bolt-js/concepts#logging', + '/bolt-js/concepts#custom-routes', + '/bolt-js/concepts#receiver', + '/bolt-js/concepts#creating-custom-functions', + '/bolt-js/concepts#defining-custom-functions', + '/bolt-js/concepts#listening-to-custom-functions', + '/bolt-js/concepts#responding-to-interactivity', + '/bolt-js/concepts#steps', + '/bolt-js/concepts#creating-steps', + '/bolt-js/concepts#adding-editing-steps', + '/bolt-js/concepts#saving-steps', + '/bolt-js/concepts#executing-steps', + '/bolt-js/ja-jp/concepts#message-listening', + '/bolt-js/ja-jp/concepts#message-sending', + '/bolt-js/ja-jp/concepts#event-listening', + '/bolt-js/ja-jp/concepts#web-api', + '/bolt-js/ja-jp/concepts#action-listening', + '/bolt-js/ja-jp/concepts#action-respond', + '/bolt-js/ja-jp/concepts#acknowledge', + '/bolt-js/ja-jp/concepts#shortcuts', + '/bolt-js/ja-jp/concepts#commands', + '/bolt-js/ja-jp/concepts#creating-modals', + '/bolt-js/ja-jp/concepts#updating-pushing-views', + '/bolt-js/ja-jp/concepts#view-submissions', + '/bolt-js/ja-jp/concepts#publishing-views', + '/bolt-js/ja-jp/concepts#options', + '/bolt-js/ja-jp/concepts#authenticating-oauth', + '/bolt-js/ja-jp/concepts#socket-mode', + '/bolt-js/ja-jp/concepts#error-handling', + '/bolt-js/ja-jp/concepts#authorization', + '/bolt-js/ja-jp/concepts#token-rotation', + '/bolt-js/ja-jp/concepts#conversation-store', + '/bolt-js/ja-jp/concepts#global-middleware', + '/bolt-js/ja-jp/concepts#listener-middleware', + '/bolt-js/ja-jp/concepts#context', + '/bolt-js/ja-jp/concepts#deferring-initialization', + '/bolt-js/ja-jp/concepts#logging', + '/bolt-js/ja-jp/concepts#custom-routes', + '/bolt-js/ja-jp/concepts#receiver', + '/bolt-js/ja-jp/concepts#creating-custom-functions', + '/bolt-js/ja-jp/concepts#defining-custom-functions', + '/bolt-js/ja-jp/concepts#listening-to-custom-functions', + '/bolt-js/ja-jp/concepts#responding-to-interactivity', + '/bolt-js/ja-jp/concepts#steps', + '/bolt-js/ja-jp/concepts#creating-steps', + '/bolt-js/ja-jp/concepts#adding-editing-steps', + '/bolt-js/ja-jp/concepts#saving-steps', + '/bolt-js/ja-jp/concepts#executing-steps', + ]; + + // Get the current path and hash + const currentPath = window.location.pathname; + const currentHash = window.location.hash; + + // If there is a hash fragment + if (currentHash && currentHash.includes('#')) { + // Create the full URL with hash replaced by '/' + const newPath = currentPath + currentHash.replace('#', '/'); + + // Loop through the list of URLs to handle + for (const url of urlsToHandle) { + // Check if the current path matches the URL to handle + if (currentPath === url.split('#')[0] && window.location.hash === `#${url.split('#')[1]}`) { + // Redirect to the new path + window.location.replace(newPath); + return; // Exit after the first match + } + } + } +})(); +} diff --git a/docs/scripts/tutorial_nav.js b/docs/scripts/tutorial_nav.js deleted file mode 100644 index 3883bc2cc..000000000 --- a/docs/scripts/tutorial_nav.js +++ /dev/null @@ -1,41 +0,0 @@ -var navTag = 'h3'; - -window.addEventListener('DOMContentLoaded', (event) => { - var sections = document.querySelectorAll(navTag); - var navParent = document.querySelector('.tutorial-nav-list'); - - function createNavElement(title, href) { - var navElement = document.createElement('li'); - - var navCircle = document.createElement('div'); - navCircle.setAttribute('class', 'circle ' + href); - - var navAnchor = document.createElement('a'); - navAnchor.setAttribute('href', '#' + href); - navAnchor.innerText = title; - - navElement.appendChild(navCircle); - navElement.appendChild(navAnchor); - - return navElement; - } - - sections.forEach(function(navHeader) { - var newElement = createNavElement(navHeader.innerText, navHeader.id); - navParent.appendChild(newElement); - }) -}); - -window.addEventListener('scroll', (event) => { - var sections = document.querySelectorAll(navTag); - - sections.forEach(function(navHeader) { - var navElement = document.querySelector('.' + navHeader.id); - - if (window.scrollY >= (navHeader.getBoundingClientRect().top + window.pageYOffset - 5)) { - navElement.setAttribute('class', 'circle completed ' + navHeader.id); - } else { - navElement.setAttribute('class', 'circle ' + navHeader.id); - } - }) -}); \ No newline at end of file diff --git a/docs/sidebars.js b/docs/sidebars.js new file mode 100644 index 000000000..de2b5b64b --- /dev/null +++ b/docs/sidebars.js @@ -0,0 +1,118 @@ +/** + The sidebars can be generated from the filesystem, or explicitly defined here. + Create as many sidebars as you want. + */ + +// @ts-check + +/** @type {import('@docusaurus/plugin-content-docs').SidebarsConfig} */ +const sidebars = { + // By default, Docusaurus generates a sidebar from the docs folder structure + // tutorialSidebar: [{type: 'autogenerated', dirName: '.'}], + + // But you can create a sidebar manually + sidebarJSBolt: [ + { + type: 'html', + value: '

    Bolt for JavaScript

    ', // The HTML to be rendered + defaultStyle: true, // Use the default menu item styling + }, + 'getting-started', + { + type: 'category', + label: 'Basic concepts', + items: [ + 'basic/message-listening', + 'basic/message-sending', + 'basic/event-listening', + 'basic/web-api', + 'basic/action-listening', + 'basic/action-respond', + 'basic/acknowledge', + 'basic/shortcuts', + 'basic/commands', + 'basic/creating-modals', + 'basic/updating-pushing-views', + 'basic/view-submissions', + 'basic/publishing-views', + 'basic/options', + 'basic/authenticating-oauth', + 'basic/socket-mode' + ], + }, + { + type: 'category', + label: 'Advanced concepts', + items: [ + 'advanced/error-handling', + 'advanced/authorization', + 'advanced/token-rotation', + 'advanced/conversation-store', + 'advanced/global-middleware', + 'advanced/listener-middleware', + 'advanced/context', + 'advanced/deferring-initialization', + 'advanced/logging', + 'advanced/custom-routes', + 'advanced/receiver', + ], + }, + { + type: 'category', + label: 'Deployments', + items: [ + 'deployments/aws-lambda', + 'deployments/heroku' + ], + }, + { + type: 'category', + label: 'Custom functions (Beta)', + items: [ + 'custom-functions/creating-custom-functions', + 'custom-functions/defining-custom-functions', + 'custom-functions/listening-to-custom-functions', + 'custom-functions/responding-to-interactivity', + ], + }, + { + type: 'category', + label: 'Workflow steps (Deprecated)', + items: [ + 'steps/steps', + 'steps/creating-steps', + 'steps/adding-editing-steps', + 'steps/saving-steps', + 'steps/executing-steps', + ], + }, + {type: 'html', value: '
    '}, + { + type: 'category', + label: 'Tutorials', + items: [ + 'tutorial/getting-started-http', + 'tutorial/hubot-migration', + 'tutorial/migration-v2', + 'tutorial/migration-v3' + ], + }, + {type: 'html', value: '
    '}, + 'reference', + {type: 'html', value: '
    '}, + 'Changelog', + { + type: 'link', + label: 'Code on GitHub', + href: 'https://github.com/SlackAPI/bolt-js', + }, + { + type: 'link', + label: 'Contributors Guide', + href: 'https://github.com/SlackAPI/bolt-js/blob/main/.github/contributing.md', + }, + + ], +}; + +export default sidebars; diff --git a/docs/src/css/custom.css b/docs/src/css/custom.css new file mode 100644 index 000000000..8ceae3ccb --- /dev/null +++ b/docs/src/css/custom.css @@ -0,0 +1,107 @@ +/** + * Any CSS included here will be global. The classic template + * bundles Infima by default. Infima is a CSS framework designed to + * work well for content-centric websites. + */ + +:root { + /* set hex colors here pls */ + --aubergine: #4a154b; + + /* aubergine-active is used in light mode. + use something like #853c8c if you use as a link vs black text ( 3:1 contr) */ + --aubergine-active: #7c3085; + + /* aubergine-light is used in dark mode. #b681b5 is another one. i just made both up */ + --aubergine-light: #ce70cc; + + /* horchata is that beige color we use a lot */ + --horchata: #f4ede4; + + /* slack-blue is 36C5F0. used for dark-mode links */ + --slack-link: #36c5f0; + --slack-blue: #36c5f0; + /* slack marketing color for links 1264A3. used for light-mode links */ + --slack-dark-blue: #1264a3; + + --grey: #868686; + --white: #FFFFFF; +} + +/* resets striped tables that hurt me eyes */ +table tr:nth-child(even) { + background-color: inherit; +} + +p a { + text-decoration: underline; +} + +.markdown a { + color: var(--slack-link); + text-decoration: underline; +} + +/* adjusting for light and dark modes */ +[data-theme="light"] { + --ifm-color-primary: var(--aubergine-active); + --ifm-footer-background-color: var(--horchata); + --slack-link: var(--slack-dark-blue) +} + +[data-theme="dark"] { + --ifm-color-primary: var(--aubergine-light); + --ifm-navbar-background-color: var(--aubergine); + --ifm-footer-background-color: var(--aubergine); + --slack-link: var(--slack-blue) +} + +html[data-theme="dark"] { + --docusaurus-highlighted-code-line-bg: rgb(0 0 0 / 30%); +} + +/* bolding Toc for contrast */ +.table-of-contents__link--active { + font-weight: bold; +} + +/* only uncomment for home page -- colors white space on v tall screens */ +/* .main-wrapper { + background: var(--horchata); +} */ + +/* announcement bar up top */ +div[class^="announcementBar_"] { + font-size: 20px; + height: 50px; + background: var(--horchata); +} + +/* navbar */ + +.navbar-github-link { + width: 32px; + height: 32px; + padding: 6px; + margin-right: 6px; + margin-left: 6px; + border-radius: 50%; + transition: background var(--ifm-transition-fast); +} + +.navbar-github-link:hover { + background: var(--ifm-color-emphasis-200); +} + +.navbar-github-link::before { + content: ""; + height: 100%; + display: block; + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} + +html[data-theme="dark"] .navbar-github-link::before { + background: url("data:image/svg+xml,%3Csvg viewBox='0 0 24 24' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='white' d='M12 .297c-6.63 0-12 5.373-12 12 0 5.303 3.438 9.8 8.205 11.385.6.113.82-.258.82-.577 0-.285-.01-1.04-.015-2.04-3.338.724-4.042-1.61-4.042-1.61C4.422 18.07 3.633 17.7 3.633 17.7c-1.087-.744.084-.729.084-.729 1.205.084 1.838 1.236 1.838 1.236 1.07 1.835 2.809 1.305 3.495.998.108-.776.417-1.305.76-1.605-2.665-.3-5.466-1.332-5.466-5.93 0-1.31.465-2.38 1.235-3.22-.135-.303-.54-1.523.105-3.176 0 0 1.005-.322 3.3 1.23.96-.267 1.98-.399 3-.405 1.02.006 2.04.138 3 .405 2.28-1.552 3.285-1.23 3.285-1.23.645 1.653.24 2.873.12 3.176.765.84 1.23 1.91 1.23 3.22 0 4.61-2.805 5.625-5.475 5.92.42.36.81 1.096.81 2.22 0 1.606-.015 2.896-.015 3.286 0 .315.21.69.825.57C20.565 22.092 24 17.592 24 12.297c0-6.627-5.373-12-12-12'/%3E%3C/svg%3E") + no-repeat; +} diff --git a/docs/src/theme/NotFound/Content/index.js b/docs/src/theme/NotFound/Content/index.js new file mode 100644 index 000000000..c122bc039 --- /dev/null +++ b/docs/src/theme/NotFound/Content/index.js @@ -0,0 +1,36 @@ +import React from 'react'; +import clsx from 'clsx'; +import Translate from '@docusaurus/Translate'; +import Heading from '@theme/Heading'; +export default function NotFoundContent({className}) { + return ( +
    +
    +
    + + + Oh no! There's nothing here. + + +

    + + If we've led you astray, please let us know. We'll do our best to get things in order. + + +

    +

    + + For now, we suggest heading back to the beginning to get your bearings. May your next journey have clear skies to guide you true. + +

    +
    +
    +
    + ); +} diff --git a/docs/src/theme/NotFound/index.js b/docs/src/theme/NotFound/index.js new file mode 100644 index 000000000..3b551f9e4 --- /dev/null +++ b/docs/src/theme/NotFound/index.js @@ -0,0 +1,19 @@ +import React from 'react'; +import {translate} from '@docusaurus/Translate'; +import {PageMetadata} from '@docusaurus/theme-common'; +import Layout from '@theme/Layout'; +import NotFoundContent from '@theme/NotFound/Content'; +export default function Index() { + const title = translate({ + id: 'theme.NotFound.title', + message: 'Page Not Found', + }); + return ( + <> + + + + + + ); +} diff --git a/docs/static/.nojekyll b/docs/static/.nojekyll new file mode 100644 index 000000000..e69de29bb diff --git a/docs/assets/basic-information-page.png b/docs/static/img/basic-information-page.png similarity index 100% rename from docs/assets/basic-information-page.png rename to docs/static/img/basic-information-page.png diff --git a/docs/assets/bolt-js-logo.svg b/docs/static/img/bolt-js-logo.svg similarity index 100% rename from docs/assets/bolt-js-logo.svg rename to docs/static/img/bolt-js-logo.svg diff --git a/docs/assets/bolt-logo.svg b/docs/static/img/bolt-logo.svg similarity index 100% rename from docs/assets/bolt-logo.svg rename to docs/static/img/bolt-logo.svg diff --git a/docs/static/img/bolt.svg b/docs/static/img/bolt.svg new file mode 100644 index 000000000..62de99395 --- /dev/null +++ b/docs/static/img/bolt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/assets/bot-token.png b/docs/static/img/bot-token.png similarity index 100% rename from docs/assets/bot-token.png rename to docs/static/img/bot-token.png diff --git a/docs/assets/event-subscriptions-page.png b/docs/static/img/event-subscriptions-page.png similarity index 100% rename from docs/assets/event-subscriptions-page.png rename to docs/static/img/event-subscriptions-page.png diff --git a/docs/static/img/favicon.ico b/docs/static/img/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..e6e9a4aa71ffae29bbfaeacc2bb431272df45cc3 GIT binary patch literal 24499 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 literal 0 HcmV?d00001 diff --git a/docs/assets/interactivity-and-shortcuts-page.png b/docs/static/img/interactivity-and-shortcuts-page.png similarity index 100% rename from docs/assets/interactivity-and-shortcuts-page.png rename to docs/static/img/interactivity-and-shortcuts-page.png diff --git a/docs/assets/ngrok.gif b/docs/static/img/ngrok.gif similarity index 100% rename from docs/assets/ngrok.gif rename to docs/static/img/ngrok.gif diff --git a/docs/static/img/node-logo.svg b/docs/static/img/node-logo.svg new file mode 100644 index 000000000..0481f9f80 --- /dev/null +++ b/docs/static/img/node-logo.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/docs/static/img/oslo.png b/docs/static/img/oslo.png new file mode 100644 index 0000000000000000000000000000000000000000..337df5a1b21b9010d96aeb50b61ba0b4e925199f GIT binary patch literal 134357 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
    u_w-VYK)YwtwHkoV~+aJ@hXgKD)U8B2X&mxm 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℘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 literal 0 HcmV?d00001 diff --git a/docs/assets/request-url-config.png b/docs/static/img/request-url-config.png similarity index 100% rename from docs/assets/request-url-config.png rename to docs/static/img/request-url-config.png diff --git a/docs/assets/signing-secret.png b/docs/static/img/signing-secret.png similarity index 100% rename from docs/assets/signing-secret.png rename to docs/static/img/signing-secret.png diff --git a/docs/static/img/slack-logo.svg b/docs/static/img/slack-logo.svg new file mode 100644 index 000000000..fb55f7245 --- /dev/null +++ b/docs/static/img/slack-logo.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/docs/static/img/slack_logo_dark.svg b/docs/static/img/slack_logo_dark.svg new file mode 100644 index 000000000..464e9513c --- /dev/null +++ b/docs/static/img/slack_logo_dark.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +